Статус обработки чека показывает значение близкое к 100%. Но, предположительно, функция WaitingStatus драйвера не отрабатывает необходимых действий в коде при нажатии ФЦ-ВВ
Код
StartWaiting(1)
while (WaitingStatus() == 1)
{
}
StopWaiting()
Начнем с того, что Basil так и не ответил на мой вопрос и я, к сожалению, не знаю разрешилась ли его проблема. Но у него, скорее всего была проблема с оборудованием, а у Вас еще непонятно .
Опишите немного подробнее что именно происходит (и как часто это происходит), т.е. меня интересует пошаговая последовательность действий оператора и реакции на эти действия ККМ и Вашей программы. И еще уточните: Вы вызываете функции библиотеки из консольного приложения или приложения с GUI.
По работе: 1 год эксплуатации все было хорошо, никто никого не "вешал". В этом году касса "вылетает" раз в 2-3 недели. Приходится отдавать в ремонт.
И соответственно главная проблема. Компьютер продолжает работать, программа "ждет". Касса не отрабатывает... Если проблема не решается, то объясните пожалуйста, логику работы: от нажатия "ФЦ-ВВ" до получения статуса завершеняи операции (WaitingStatus() == 0).
После вызова StartWaiting в библиотеке запускается таймер, который раз в 250 мс проверяет статус ККМ. Поскольку библиотека создавалась на Delphi и используется стандартный класс TTimer, то работает все следующим образом. Компилятор Delphi создает невидимое окно с именем "TPUtilWindow", через каждые 250 мс таймер посылает для окна сообщение, которое сначала попадает в очередь сообщений главного окна приложения и только затем переадресуется "TPUtilWindow". Если библиотека вызывается из консольного приложения, то очередь сообщений Windows не обрабатывается, и в этом случае необходимо самостоятельно организовывать перехват сообщений для скрытого окна таймера и пересылать полученное сообщение оконной функции. При получении сообщения вызывается обработчик события, в котором реализована проверка статуса ККМ. Если на ККМ выставлен признак запроса чека, то библиотека начинает передавать ККМ всю необходимую информацию. В процессе передачи данных периодически вызывается callback функция прогресса подготовки чека (разумеется, если она определена в Вашей программе). По завершению передачи данных библиотека ожидает завершения вывода чека (периодически опрашивая ККМ). Если вывод чека был успешно завершен или в процессе вывода чека произошла какая-либо ошибка (например, обрыв бумаги), то в вызывается соответствующая callback функция (опять же при условии, что она определена). Далее, в зависимости от того, с каким параметром была вызвана функция StartWaiting опрос будет либо остановлен (WaitingStatus сбросится в 0), либо не не будет остановлен (WaitingStatus останется в 1). Вот такая логика.
Правильно ли я понимаю, что в течение года все работало нормально, а затем началась, описываемая Вами проблема, учитывая то, что свою программу Вы при этом не изменяли? Т.е. проблема началась "на ровном месте" - все работало и в какой-то момент вдруг начались проблемы?
Да программа не менялась. "Ровность" места не гарантирую. Много в этом всяких составляющих: "железо", ОС, пользователи, которые все этим пользуются.
"По завершению передачи данных библиотека ожидает завершения вывода чека (периодически опрашивая ККМ)" - в данном случае драйвер посылает запрос и получает ответ или касса постоянно шлет статус?
Еще вопрос: в обработчике OnCheckPrepare(Progress: Integer) логика задания значений Progress (как во времени вычисляется значение)?
Тим писал(а):
"По завершению передачи данных библиотека ожидает завершения вывода чека (периодически опрашивая ККМ)" - в данном случае драйвер посылает запрос и получает ответ или касса постоянно шлет статус?
Касса абсолютно пассивна, она только выставляет признаки событий внутри себя, но ничего сама в канал не посылает. Поэтому для определения возникновения какого-либо события на ККМ библиотека сама обращается к ККМ.
Цитата
Тим писал(а):
Еще вопрос: в обработчике OnCheckPrepare(Progress: Integer) логика задания значений Progress (как во времени вычисляется значение)?
В зависимости от числа передаваемых строк заголовка и подвала, числа покупок и т.д. рассчитывается шаг увеличения прогресса и по завершению очередной логической операции (например передаче кассе информации об очередной покупке) вызывается callback функция в которую передается увеличенное на расчитанную величину значение прогресса.