Особенности использования Универсального протокола

+7 (383) 358-68-69; semico@mail.ru |  Контакты  |  Прайс-лист

Главная / Оборудование для АЗС / Техническая информация

Обмен данными с контроллерами управления (КУ) ТРК регламентирован так называемым "Универсальным протоколом..." (СКБ ВТ "Искра", 1999 г). Действующая версия 1.72 которого приведена на сайте.

К сожалению, при строгом соблюдении "Универсального протокола" (УП) устройство или программа будут неработоспособны. На этой странице показано, как реально в рамках данного протокола осуществляется управление КУ ТРК от контрольно-кассовой машины (ККМ) или от компьютера из программы автоматизированного рабочего места (АРМ) оператора АЗС.



1. Основные физические параметры протокола обмена данными

1.1. В "Универсальном протоколе" информация о физических параметрах исчерпывается следующими данными:

Пункт 2 УП. Протокол используется для организации полудуплексной двунаправленной асинхронной связи по интерфейсу RS232 с физическими параметрами:
скорость передачи - 2400, 4800, 9600 бит/с;
- 1 стартовый бит;
- 8 битов данных;
- 1 стоповый бит;
- без контроля четности;
- 3 линии (TxD, RxD, GND).

1.2. К сожалению, разработчики протокола не учли того, что интерфейс RS-232C регламентирует обмен только между двумя устройствами и не предназначен для работы в сетевом режиме. Таким образом, если полностью выполнять требования УП, то по одному последовательному порту ККМ или компьютеру возможна связь только с одним КУ ТРК. И для работы с восемью ТРК компютер или касса должны иметь как минимум восемь COM-портов.

Реально, конечно, это не так. Производители КУ ТРК и ККМ пошли несколькими возможными путями. Большая часть использует физический сетевой протокол типа "токовая петля" с логическим интерфейсом RS-232C. Такое подключение требует использования дополнительных согласующих устройств, устанавливаемых между портом и контроллером.

КУ ТРК серии ПИЛОТ используют техническое решение, позволяющее подключать к одному последовательному порту до нескольких десятков единиц оборудования без использования дополнительных устройств сопряжения. Это достигается переводом неактивных КУ ТРК в состояние с высоким выходным сопротивлением.

1.3. Следует быть внимательным при подключении оборудования. Использование стандартных для RS-232C разъемов серии DB-9 еще не гарантирует, что все контакты разъема задействованы по назначению или не используются. Необходимость в ряде случаев применения перемычек для замыкания штатных сигналов DTR-DSR и RTS-CTS интерфейса RS-232C усугубляет ситуацию. Это, в частности, приводит к наличию различных кабелей связи и переходников для подключения КУ ТРК к ККМ и различным устройствам сопряжения.

В КУ ТРК серии ПИЛОТ установлен разъем DB-9F. Контакт 2 - RxD, 3 - TxD, 5-GND. Остальные контакты разъема не используются и не подключены. Для связи с компьютером контакты 2 всех КУ ТРК объединяются и подключаются к контакту 3 разъема компьютера. Контакты 3 всех КУ ТРК объединяются и подключаются к контакту 2 разъема компьютера. Контакты 5 всех КУ ТРК и подключаются к контакту 5 разъема компьютера. Необходимость наличия перемычек между контактами 4-6 и 7-8 разъема компьютера зависит от программного обеспечения. Схема кабеля для связи КУ ТРК серии ПИЛОТ с компьютером приведена на рисунке 1.

Кабель связи с компьютером

Рис. 1. Схема кабеля связи

1.4. Допущение трех различных скоростей обмена привело к необходимости их выбора и настройки как в ККМ, так и в КУ ТРК. Это усложнило работу с обоими типами оборудования и периодически приводит к ошибкам из-за неправильной настройки.

Реально в ККМ и КУ ТРК используется скорость обмена 9600 бит/с. В большинстве оборудования эта скорость установлена по умолчанию и некоторые типы ККМ и контроллеров управления не допускают ее изменения. Во всяком случае все распространенные типы оборудования данную скорость обмена поддерживают.

В некоторых КУ ТРК возможна установка и более высоких скоростей - до 115200 бит/с. Это позволяет программе проводить опрос состояния ТРК с меньшим периодом. Но с увеличением скорости уменьшается помехозащищенность. Поэтому для КУ ТРК ПИЛОТ-11.2 скорость обмена ограничена 19200 бит/с, для остальных КУ ТРК серии - 9600 бит/с. Даже скорости 9600 бит/с достаточно для опроса четырех ТРК по пять раз в секунду.

1.5. Временные параметры обмена.

В самом протоколе временные параметры обмена никак не регламентированы. Это приводит к сбоям при обмене между различными типами оборудования.

Для КУ ТРК серии Пилот временные параметры обмена следующие:
- время задержки между байтами в пакете не более 10 мс;
- время задержки между запросом и ответом от 1 до 50 мс;
- время между двумя последовательными запросами не менее 50 мс.

Для контроллеров других производителей указанные параметры могут отличаться от приведенных.



2. Формат сообщений протокола обмена данными

2.1. К п. 3 УП.

Формат сообщений предусматривает обмен символами из приведенного ниже набора. При этом для представления шестнадцатиричных чисел в полях "TRK_No" и "Status" используются прописные символы 'A'...'F', но не строчные ('a'...'f'). Появление в полях "Price" и "Volume"любых символов, кроме '0'...'9', в некоторых случаях может привести к сбоям в работе КУ ТРК.

Везде, где в таблице указан тип поля ASCII - в КУ ТРК передается десятичное (в полях Price и Volume) или шестнадцатиричное (в остальных полях) число, записанное символами ASCII. Записанные символами ASCII числа должны занимать все отведенное поле и при необходимости дополняются слева символами '0' (30h). Соответствия кодов ASCII числам приведены в таблице.

Код ASCII Соответствующее числовое значение Запись числового значания в программах
в десятичном виде в шестнадцатиричном виде (HEX) на Си на ассемблере
SOH1111
STX2222
ETX3333
'0'48300x3030h
'1'49310x3131h
'2'50320x3232h
'3'51330x3333h
'4'52340x3434h
'5'53350x3535h
'6'54360x3636h
'7'55370x3737h
'8'56380x3838h
'9'57390x3939h
'A'65410x4141h
'B'66420x4242h
'C'67430x4343h
'D'68440x4444h
'E'69450x4545h
'F'70460x4646h

Далее для отличия шестнадцатиричных чисел от десятичных применяется строчная h, добавленная в конце шестнадцатиричного числа.

К примеру, для передачи цены 12 руб/литр в поле "Price" следует записать строку "001200". При этом в порт должна быть передана последовательность байт: 30h, 30h, 31h, 32h, 30h, 30h.

Примечание. Применяемый в УП способ генерирования контрольной суммы CRC не позволяет рассчитывать на получение символа из данной таблицы. Но, если символы в остальных полях корректны, это будет символ от 30h до 4Fh.

2.2. К п. 3.1 УП.

Некоторые вопросы обычно вызывает поле команды TRK_No. В таблице указаны допустимые значения от "00" до "7F". В принципе, это позволяло бы управлять 127 шт. ТРК (с учетом специфического применения кода "00"), но это число для АЗС явно избыточно.

Реально в КУ ТРК используются следующие номера:

TRK_No Соответствующий номер ТРК Передаваемые байты Примечание
"00" все подключенные 30h, 30h Используется только для передачи команды "Общий останов". Команду исполняют все получившие ее КУ ТРК, независимо от установленного номера. Ответ не выдается.
"01"130h, 31h 
"02"230h, 32h 
"03"330h, 33h 
"04"430h, 34h 
"05"530h, 35h 
"06"630h, 36h 
"07"730h, 37h 
"08"830h, 38h 
"09"930h, 39h 
"0A"1030h, 65h 
"0B"1130h, 66h 
"0C"1230h, 67h 
"0D"1330h, 68h 
"0E"1430h, 69h 
"0F"1530h, 70h 
"10"1631h, 30h 

При желании управлять из АРМ более чем 16 ТРК следует использовать несколько последовательных портов.

2.3. К п. 3.1.1 УП.

Перечень команд управления не включает команд с кодами 32h и 38h. Эти команды существовали в младших версиях протокола, но были исключены из него.

Команда 32h "Возврат" фактически дублировала команду 37h "Сброс". Была исключена за ненадобностью.

Команда 38h "Запрос параметров" позволяла считывать параметры ТРК, переданные в КУ ТРК командой 33h "Установка". Была убрана из-за неоднозначности. Поскольку поле Status, в котором передаются параметры ТРК, пересекается с полями "Error" и "Code", в которых возвращаются ошибки обмена и состояние ТРК. Критерия отличия, например, правильно считанных параметров "0305" от ошибки контрольной суммы предусмотрено не было.

Впрочем, в некоторых моделях КУ ТРК ПИЛОТ данная команда все же реализована для удобства работы с параметрами ТРК, но ее использование в программах АРМ не рекомендуется.

2.4. К п. 3.1.1 УП.

Перечень команд, реализованных в некоторых контроллерах, шире, чем это указано в "Универсальном протоколе". Например, в КУ ТРК ПИЛОТ используется команда с кодом 54h "Расширенный тест", позволяющая получить более детальную информацию о состоянии ТРК чем это предусматривает команда протокола 34h "Тест". В программах АРМ команда 54h может использоваться вместо 34h при организации циклического опроса состояния ТРК.

В КУ ТРК ПИЛОТ есть и другие дополнительные команды, например команда 55h "Запрос версии" позволяет получить информацию о модели КУ ТРК, версии ПО и запрограммированных DIP-переключателями настройках. Команда с кодом 56h "Запрос номера дозы" позволяет устранить недостаток протокола, связанный с отсутствием возможности контроля при нарушениях обмена во время загрузки или сброса дозы.

При приеме неизвестной команды контроллеры ПИЛОТ выдают код ошибки "02" - "Недопустимая команда ТРК". Некоторые другие контроллеры при приеме команды не включенной в "универсальный протокол" могут отреагировать неадекватно, хотя должны выдать ответ "недопустимая команда" или проигнорировать ее. Какие-либо проблемы при приеме команд 54h, 55h, 56h различными другими контроллерами не наблюдались. Хотя вообще о командах с не включенными в протокол версии 1.72 кодами, например командах 32h и 38h, этого сказать нельзя.

2.5. К п. 3.2.1 УП.

В перечне кодов ошибок протокола присутствует код "01" - "Недопустимый номер ТРК". Реально данный код ошибки для действующей версии протокола не существует, поскольку нет КУ ТРК, который мог бы его передать. В младших версиях протокола поле номера состояло из двух полей MC_No и TRK_No то есть отдельно из номеров КУ ТРК и собственно номера ТРК под его управлением. В таком случае контроллер с запрошенным номером MC_No мог сообщить, что у него нет ТРК с номером TRK_No кодом ошибки "01".

2.6. К пп. 3.2.1 и 6 УП.

В разделе "Обработка ошибок протокола" в "универсальном протоколе" не приведены действия, которые следует предпринять. В нем приведены только коды ошибок, выдаваемые на индикатор ККМ SAMSUNG.

Реально же программе АРМ следует предпринять следующие действия:

Код ошибки Описание состояние по "Универсальному протоколу" Действия
при отладке при работе с программой
"00" "Нет ошибок" Ошибок нет Ошибок нет
"01" "Недопустимый номер ТРК" Проанализировать источник возникновения ошибки - данный код возникать не должен. Повторить запрос КУ ТРК, при повторении ошибки выдать соответствующее сообщение или "Нет связи".
"02" "Недопустимая команда ТРК при данном состоянии ТРК" Проанализировать алгоритм работы программы. Передавать команды при нахождении КУ ТРК в состоянии, когда он не может их принять (например команду "Пуск" в состоянии "Сброс - дозы нет") не следует. Если программа сама не предусматривает исключение посылки команд, приводящих к указанной ошибке, выдать сообщение оператору - неправильная последовательность действий.
"03" "Неправильная контрольная сумма" Повторить передачу команды в КУ ТРК. Если ошибка повторяется, проанализировать источник возникновения ошибки. Возможно, неверно формируется команда или подсчитывается контрольная сумма. Повторить запрос КУ ТРК, при повторении ошибки выдать соответствующее сообщение или "Нет связи"
"04"..."FF" Не регламентированы Проанализировать источник возникновения ошибки - данный код возникать не должен. Появление подобных кодов возможно при использовании команд не регламентированных "универсальным протоколом", например 38h "Запрос параметров". Повторить запрос КУ ТРК, при повторении ошибки выдать соответствующее сообщение или "Нет связи"

2.7. В "универсальном протоколе" протоколе отсутствует возможность сигнализировать о том, что контроллер временно не может выполнить поданную команду. Это значительно упростило бы взаимодействие в системе компьютер-контроллер в некоторых ситуациях. Например, при останове в процессе отпуска (колонка ведь не останавливается мгновенно - необходима пауза для досчета импульсов) или при нахождении КУ ТРК в служебных и справочных режимах работы.

В настоящее время при нахождении в служебных и справочных режимах работы в КУ ТРК ПИЛОТ-22 и ПИЛОТ-41 выдается код ошибки "02" - "Недопустимая команда ТРК". Код состояния ввести было бы логичнее, но это следовало сразу регламентировать в "универсальном протоколе". Сейчас некоторые ККМ, наткнувшись на неизвестный код состояния, могут просто зависнуть.

2.8. К п. 3.2.2 УП.

Перечень кодов состояния КУ ТРК с одной стороны избыточен, поскольку включает неиспользуемые коды, с другой стороны недостаточен, поскольку не включает реально встречающихся состояний.

Реально в КУ ТРК не используется код состояния "02" - "Остаток дозы". В программе АРМ данный код на всякий случай можно обрабатывать так же, как код "04" - "Останов".

Отсутствует код состояния "КУ ТРК временно не доступен", о чем было сказано в п. 2.7. Вместо данного состояния в необходимых случаях КУ ТРК ПИЛОТ вырабатывает код ошибки "02".

В перечне есть только один код состояния относящийся к отпуску "до полного бака": "07" - "До полного бака останов". Это является причиной того, что режим "до полного бака" командами "универсального протокола" на практике не реализуется. Это же является причиной излишнего усложнения диаграммы состояний КУ ТРК.

При штатном отпуске топлива могут возникать следующие цепочки состояний. При отпуске заказанной дозы топлива полностью:
"Сброс (дозы нет)" - "Готовность" - "Пуск" - "Сброс (дозы нет)"
При останове отпуска и возврате остатка:
"Сброс (дозы нет)" - "Готовность" - "Пуск" - "Останов" - "Сброс (дозы нет)"
При отпуске до полного бака возникает цепочка состояний:
"Сброс (дозы нет)" - "Готовность" - "Пуск" - "До полного бака останов" - "Сброс (дозы нет)"

Противоречие заключается в наличии состояний "Готовность" и "Пуск", которые с точки зрения ККМ или АРМ не отличаются при обычном отпуске и при отпуске "До полного бака". Для корректной работы требуются отсутствующие в протоколе коды "Готовность к отпуску ДПБ" и "Пуск ДПБ", а также более четкая регламентация действий. Это будет рассмотрено детально при описании команды 39h "До полного бака" (см. п. 4.2).

В программах АРМ режимы "До полного бака" следует реализовывать только при помощи команды 31h "Доза". Это дает большую гибкость и позволяет исключить неопределенные ситуации. Команду 39h "До полного бака" использовать не следует.

Если АРМ не использует команду 39h "До полного бака", то при обнаружении контроллера ТРК в состоянии "07 - до полного бака останов" АРМ следует оформить чек на принятую командой 34h "Тест" цену и количество топлива, и подать команду 37h "Сброс". КУ ТРК должен перейти в состояние "05" - "Сброс (дозы нет)". Причины возникновения данного состояния КУ ТРК в этом случае значения не имеют.

При обнаружении контроллера ТРК в нерегламентированных состояниях "00" и "08"..."FF" программе АРМ следует подать команду 37h "Сброс". Если КУ ТРК не перейдет в состояние "05" - "Сброс (дозы нет)", то вывести необходимое сообщение.

КУ ТРК ПИЛОТ во всех режимах используют только коды состояний "01", "03"..."07".

2.9. К п. 3.3 УП.

Подсчет контрольной суммы сообщения также иногда вызывает ряд вопросов, хотя описан в "универсальном протоколе" достаточно определенно.

Операция XOR то есть "исключающее ИЛИ" или "сумма по модулю 2" производится последовательно над всеми байтами команды, за исключением самого первого, т.е. SOH. Сама операция производится над двумя байтами побитно в соответствии с таблицей:

Бит первого байтаБит второго байтаБит результата
000
011
101
110

Предположим, что нужная последовательность байтов для передачи сформирована в буфере buf. Байт SOH находится в buf[0]. Контрольная сумма CRC формируется в buf[22]. Для вычисления контрольной суммы на языке Си нужно выполнить цикл:

buf[22]=0; for (i=1; i<22; i++) buf[22]^=buf[i];



3. Основные операции в системе "ККМ - контроллер ТРК" и соответствующие им последовательности обмена сообщениями

3.1. К п. 4 УП.

Приведенная в "Универсальном протоколе" схема состояний выполнена некорректно и мало способствует пониманию переходов между возможными состояниями КУ ТРК.

Более наглядно можно представить переходы между состояниями контроллера, если отдельно рассматривать режимы обычного отпуска, отпуска до полного бака и аварии. На схемах пп. 3.2, 3.3 не указаны аварийные состояния, рассмотренные подробно в п. 5.

3.2. К п. 4 УП.

Схема состояний для обычного отпуска топлива приведена на рисунке 2. Схема отражает работу КУ ТРК серии ПИЛОТ. Контроллеры других производителей работают в целом аналогично.

Схема состояний для обычного отпуска топлива

Рис. 2. Схема состояний КУ ТРК при обычном отпуске

Примечания:
1. Кнопка - нажатие оператором кнопки "Пуск" или "Стоп" на КУ ТРК; нажатие кнопки "Пуск/Стоп" на ТРК; изменение состояния датчика положения раздаточного крана.
2. Сч. имп. - поступление счетного импульса от ТРК на вход контроллера. Поступление счетного импульса при состоянии отличном от "03" - "Пуск" вызывает аварию (см. п. 5).
3. Доза X и Y приведена в условных величинах, кратных цене счетного импульса.
4. Часть допустимых команд не указана. Команда 34h "Тест" выполняется при любом состоянии ТРК и не изменяет его. Команда 33h "Установка" выполняется только при состоянии "05" - "Сброс (дозы нет)". Команда "Общий останов" принимается только в состоянии "03 - Пуск", в других состояниях игнорируется. Другие не указанные на схеме команды приводят к возникновению ошибки "02 - Неправильная команда ТРК при данном состоянии ТРК".

3.3. К п. 4 УП.

Схема состояний для отпуска топлива до полного бака приведена на рисунке 3. Данная схема состояний соответствует КУ ТРК серии ПИЛОТ. По команде 39h "До полного бака" в контроллер вводится доза от 990 до 999 литров, в зависимости от модели и установленной цены счетного импульса. Доза на контроллере в процессе отпуска всегда уменьшается.

Схема состояний КУ ТРК при отпуске до полного бака

Рис. 3. Схема состояний КУ ТРК при отпуске до полного бака

Примечания:
1. Кнопка - нажатие оператором кнопки "Пуск" или "Стоп" на КУ ТРК; нажатие кнопки "Пуск/Стоп" на ТРК; изменение состояния датчика положения раздаточного крана.
2. Сч. имп. - поступление счетного импульса от ТРК на вход контроллера. Поступление счетного импульса при состоянии отличном от "03" - "Пуск" вызывает аварию (см. п. 5).
3. Доза X и Y приведена в условных величинах, кратных цене счетного импульса.
4. Часть допустимых команд не указана. Команда 34h "Тест" выполняется при любом состоянии ТРК и не изменяет его. Команда 33h "Установка" выполняется только при состоянии "05" - "Сброс (дозы нет)". Команда "Общий останов" принимается только в состоянии "03 - Пуск", в других состояниях игнорируется. Другие не указанные на схеме команды приводят к возникновению ошибки "02 - Неправильная команда ТРК при данном состоянии ТРК"

В "Универсальном протоколе" процедура отпуска "до полного бака" не регламентирована. Другие контроллеры управления могут функционировать иначе, переходя в состояние "Готовность, доза 0" и производя отсчет импульсов в сторону увеличения дозы. В таком случае возникает неоднозначность направления счета импульсов в различных режимах, возможна также ошибка возврата нулевой дозы.

Для исключения неоднозначности в программе АРМ нежелательно использовать команду 39h "До полного бака". Программа АРМ должна управлять отпуском "до полного бака" самостоятельно. Это позволяет также устанавливать лимит отпускаемой дозы в зависимости от принятой от клиента залоговой суммы, что невозможно при использовании команд "универсального протокола".

Если использование команды 39h "До полного бака" представляется необходимым, в АРМ сразу после выдачи этой команды следует устанавливать соответствующий признак для данной ТРК. Признак сбрасывается после считывания дозы и подачи команды 37h "Сброс" из состояния "07 - до полного бака останов". Подмена контроллеров без учета нахождения в состоянии "до полного бака" приводит к рассогласованию состояний в АРМ и КУ ТРК, и может вызвать сбои в работе.

3.4. К п. 4.1 УП.

Команда 34h "Тест" выполняет опрос состояния ТРК. Команда может подаваться при нахождении КУ ТРК в любом состоянии. Состояние КУ ТРК при этом не изменяется.

В "Универсальном протоколе" каждый обмен сообщениями начинается с проверки состояния ТРК этой командой. Так работают ККМ SAMSUNG и некоторые другие. Для программы АРМ более оптимален другой способ, который применяется в ККМ АМС-100 с блоком УС-01.

В программе АРМ должен быть организован циклический опрос состояния подключенных ТРК командами 34h "Тест" Для КУ ТРК ПИЛОТ можно использовать команду 54h "Расширенный тест". Для КУ ТРК ПИЛОТ-11.2 с версии 1.6 можно также использовать команду 56h "Запрос номера дозы". Состояние ТРК сохраняется в специальной структуре в программе АРМ. Состояние структуры сразу после запуска программы должно быть "Нет ТРК".

Перед передачей управляющей команды (т.е. любой, кроме 34h "Тест") состояние ТРК считывается из этой структуры. В зависимости от текущего состояния ТРК принимается решение о передаче команды. Для передачи управляющей команды цикл опроса прерывается. Передается управляющая команда. После получения ответа (кроме команды "Общий останов") цикл опроса возобновляется.

Принципиальной разницы между циклическим опросом и опросом перед передачей команды нет. Попытка передачи в контроллер неверной команды в любом случае вызовет ошибку.

3.5. К п. 4.2 УП.

В "Универсальном протоколе" не регламентирована работа с КУ ТРК при различной цене счетного импульса. В поле "Volume" команды 31h "Доза" сама доза передается в миллилитрах. А колонки бывают с дискретностью 1 литр и даже 5 или 10 литров. В протоколе подразумевается, что настройка ККМ или АРМ выполнена корректно и передача в контроллер дозы, дискретность которой не соответствует допустимой, не производится. Способов определить цену счетного импульса колонки, установленную на КУ ТРК, в рамках "Универсального протокола" также не предусмотрено.

На самом деле все происходит следующим образом. При передаче из АРМ или ККМ в КУ ТРК команды 31h "Доза" в поле "Volume" передается доза налива, которая задается АРМ или ККМ. Если КУ ТРК работает с дискретностью, не позволяющей принять дозу полностью, она округляется в меньшую сторону до ближайшего значения, которое может быть обработано с установленной дискретностью. Округленное значение возвращается в поле "Volume" ответа КУ ТРК. КУ ТРК переходит в состояние "01" - "Готовность к пуску" с округленной дозой. Большинство КУ ТРК, в том числе ПИЛОТы, работают именно таким образом.

Если АРМ или ККМ принимает ответ с дозой налива, не соответствующей поданной, она должна сделать возврат на сумму, соответствующую исходной дозе и перевести КУ ТРК в состояние "05" - "Сброс (Дозы нет)" командой 37h "Сброс". Или предпринять любые другие действия на свое усмотрение, например, сообщить оператору о возникшей ситуации соответствующим кодом ошибки.

3.6. К п. 4.2 УП.

Команда 31h "Доза" производит загрузку дозы в КУ ТРК. Загрузка дозы возможна только при нахождении КУ ТРК в состоянии "05" - "Сброс (дозы нет)". В "Универсальном протоколе" предполагается, что после проверки ТРК командой 34h "Тест" и оформления чека состояние ТРК не изменяется и доза обязательно передается в КУ ТРК. На практике, это предположение является главным источником проблем при написании программ ККМ и АРМ.

Разумеется, перед оформлением чека следует проверить, что требуемая ТРК находится в состоянии "05" - "Сброс (дозы нет)". Если это не так, оформление чека вообще не производится и проблем не возникает.

Предположим, что чек успешно оформлен, но состояние ТРК за это время уже изменилось. Реально возможны следующие ситуации: питание КУ ТРК было отключено до, после или во время передачи команды 31h "Доза"; обмен был нарушен вследствие помех или отсутствии контакта в кабеле связи; вследствие подмены контроллеров возникло какое-либо другое состояние КУ ТРК.

При нарушении обмена из-за отключения кабеля или питания КУ ТРК может находиться в двух состояниях. Если он не успел принять команду 31h "Доза" и обработать ее, то он остается в состоянии "Сброс (дозы нет)". Если контроллер успел принять дозу, но программа АРМ не приняла ответ, КУ ТРК переходит в состояние "01" - "Готовность", но программа этого не знает. Если контроллер находится в любом состоянии, кроме "05" - "Сброс (дозы нет)", то будет возвращена ошибка "02 - Неправильная команда ТРК при данном состоянии ТРК". При сбоях обмена может также возникнуть ошибка "03 - Неправильная контрольная сумма".

В любом случае, если корректный ответ от КУ ТРК на команду 31h "Доза" не принят, АРМ должна перейти в особое состояние "Доза X в КУ ТРК не передана". Во внутреннюю структуру, отражающую состояние ТРК записывается соответствующий признак. Аналогичного состояния КУ ТРК на схеме состояний нет по очевидным причинам. При этом ввод других доз для данной ТРК в АРМ должен быть блокирован до момента выхода из данного особого состояния.

При этом программа АРМ продолжает непрерывный опрос ТРК. Выход АРМ из состояния "Доза в КУ ТРК не передана" возможен следующим образом. Программа при опросе должна обнаружить соответствующий КУ ТРК в состоянии "Готовность, доза X", "Останов, доза Y" или "Сброс (дозы нет)". В первом случае программа АРМ может оформить возврат на дозу X и передать в КУ ТРК команду 37h "Сброс" или продолжить отпуск командой 35h "Пуск". Во втором случае АРМ может оформить возврат на дозу Y и передать в КУ ТРК команду 37h "Сброс" или продолжить отпуск командой 35h "Пуск". В третьем случае оформление возвратного чека не производится. Во всех случаях после этого признак "Доза в КУ ТРК не передана" сбрасывается. В остальных случаях признак не сбрасывается. Сам признак должен сохраняться в энергонезависимой памяти (например в файле на диске) и восстанавливаться при перезагрузке АРМ.

Альтернативным вариантом реакции на нахождение контроллера в состоянии "05" - "Сброс (дозы нет)" является повторная передача в КУ ТРК команды 31h "Доза" с дозой X. Но это может привести к двойному отпуску дозы недобросовестным оператором. Если доза повторно не передается, двойной отпуск исключен, но возможна потеря дозы при сбоях обмена. Что предпочтительнее - должен решать разработчик программы АРМ. Хотя при нормальном монтаже на АЗС и применении блоков бесперебойного питания для компьютера сбои при обмене явление крайне редкое.

Наиболее правильным вариантом, если не использовать дополнительных команд протокола, вероятно, является следующий. Если программа обнаруживает состояние "05" - "Сброс (дозы нет)" при первом же опросе ТРК после установления признака "Доза в КУ ТРК не передана" или в течении некоторого непродолжительного времени, то она считает, что произошел сбой и передает дозу повторно. Если лимит времени истек, программа считает, что контроллер мог быть заменен намеренно и повторной передачи дозы не происходит. Можно также допустить настройку реакции программы администратором АРМ.

Таким образом, избежать возможности двойного (многократного) отпуска дозы или, как альтернативный вариант, потери информации об оплаченной дозе в рамках "Универсального протокола" в принципе невозможно. Хотя для этого достаточно было ввести в каждую команду (или только в команду 31h "Доза" в не используемом поле Status) номер команды, аналогичный номеру чека в ККМ. При этом контроллер должен сохранять при отключении питания и выдавать по запросу последний номер команды. Даже использования одного символа ASCII в поле Status было бы достаточно для исключения повторного отпуска или потери дозы при сбоях обмена.

В контроллерах управления ПИЛОТ-11.2, предназначенных для работы в составе систем управления, эта проблема устранена путем использования дополнительной команды "Запрос номера дозы". Пример использования команды при разработке системы управления рассмотрен в отдельной статье: "Использование команды Запрос номера дозы".

3.7. К п. 4.3 УП.

Аналогичная п. 3.6 ситуация возникает при возврате дозы, если происходит сбой после печати чека во время передачи команды 37h "Сброс".

Если корректный ответ на команду "Сброс" от КУ ТРК не приходит, АРМ должна перейти в особое состояние "КУ ТРК доза X не сброшена". Оно также записывается во внутреннюю структуру и сохраняется в энергонезависимой памяти. После чего опрос КУ ТРК продолжается до обнаружения КУ ТРК в состояниях "01 - Готовность к отпуску доза X", "04 - Останов доза X", "04 - Останов доза Y (где Y<X)" и "05 - Сброс (дозы нет)".

В первых двух случаях передается команда 37h "Сброс". Во втором случае (доза Y) АРМ может игнорировать такой КУ ТРК, что чревато зависанием дозы, может сбросить его, что может привести к неучтенному отпуску топлива, а может потребовать оформления чека на сумму соответствующую дозе (X-Y), что является наиболее корректным действием. При обнаружении КУ ТРК в состоянии "05 - Сброс(дозы нет)" программа считает, что выполнение операции успешно завершено. Во всех перечисленных случаях признак состояния "КУ ТРК не сброшен" сбрасывается. В других случаях признак состояния не сбрасывается.

3.8. К п. 4.4 УП.

При нахождении в состоянии "03 - Пуск" команда 35h "Пуск" не должна вызывать ошибки "02" - "Неправильная команда ТРК при данном состоянии ТРК", как это требуется "Универсальным протоколом". Данная команда принимается, но не изменяет состояние КУ ТРК.

3.9. К п. 4.5 УП.

Аналогично п. 3.8 при нахождении в состояниях "01 - Готовность", "04 - Останов", "05 - Сброс (дозы нет)" и "07 - До полного бака останов" команда 36h "Останов" не должна вызывать ошибки "02" - "Неправильная команда ТРК при данном состоянии ТРК", как это требуется "Универсальным протоколом". Данная команда принимается, но не изменяет состояние КУ ТРК. Возникновение ошибки "02" в состоянии "04 - Останов" особенно нежелательно, потому что команда 36h используется чаще всего для останова ТРК при разливе топлива. В такой ситуации вполне естественной реакцией оператора является неоднократная подача команды.

3.10. К п. 4.6 УП.

Команда 37h "Сброс" не всегда должна переводить КУ ТРК в состояние "05 - Сброс (дозы нет)". Иначе при выходе из аварийных ситуаций может быть потеряна информация о недоотпущенной дозе. Подробно об использовании команды 37h "Сброс" для выхода из аварийных ситуаций см. п. 5.

3.11. К п. 4.7 УП.

Команда 37h "Общий останов" стоит несколько обособленно. Следует обратить внимание на то, что ее код совпадает с кодом команды 37h "Сброс". Это произошло потому, что в протоколе некоторое время существовала команда "Общий сброс". Потом ее функции изменились, но код команды остался. Кроме того, в команде используется специфический номер ТРК "00".

Команда используется для экстренной (аварийной) остановки всех ТРК одновременно. Для АРМ желательно иметь возможность передать команду "Общий останов" из любого экрана программы.

Эта команда принимается всеми КУ ТРК, независимо от установленного сетевого номера. Команда переводит КУ ТРК из состояния "03 - Пуск" в состояние "04 - Останов" или "07 - До полного бака останов". Ответ контроллерами не выдается, это следует учесть при обработке команды в программе. Хотя применяется команда редко, поэтому можно не предусматривать отдельный обработчик, а выйти по тайм-ауту.



4. Дополнительные операции в системе "ККМ - контроллер ТРК" и соответствующие им последовательности обмена сообщениями

4.1. К п. 5.1 УП.

Команда 33h "Установка" выполняет передачу так называемых "Параметров ТРК" в контроллер управления. Команда выполняется только при нахождении КУ ТРК в состоянии "05 - Сброс (дозы нет)". Ее использование в программах АРМ не требуется.

Из распространенных контроллеров только КУ ТРК ПИЛОТ применяют параметры ТРК. Реальная поддержка этих параметров имеется только в ККМ SAMSUNG. При помощи параметров ТРК в ПИЛОТах программируются дополнительные номера отделов, для ряда моделей также скорость обмена по порту и другие параметры. Дополнительные номера отделов нужны для ККМ, которые не умеют работать по одному отделу с несколькими ценами. Подробно о параметрах ТРК написано на других страницах сайта.

4.2. К п. 5.2 УП.

О нежелательности использования в программах АРМ команды 39h "До полного бака" уже было сказано ранее. В разных КУ ТРК отпуск до полного бака реализован различным образом. Единственно правильного варианта нет, поскольку в "Универсальном протоколе" не регламентированны основные параметры режима: вводимая доза, направление счета и т.п. Самый разумный вариант - не использовать данную команду вообще, тем более что без нее в ККМ и АРМ вполне можно обойтись.

Реализация этого режима работы в КУ ТРК ПИЛОТ показана на рис. 3 (см. п. 3.3). В качестве начальной дозы режима до полного бака в КУ ТРК ПИЛОТ используется значение максимально возможной дозы отпуска. После передачи команды 39h "До полного бака", в КУ ТРК серии ПИЛОТ возникнет состояние "01 - Готовность" с дозой 990, 995 или 999 литров. В других КУ ТРК возникает состояние "01 - Готовность" с дозой 0 литров, это несколько другой подход к реализации режима "до полного бака". Если программа АРМ использует команду 39h "До полного бака", она должна учитывать все возможные варианты.

Рассмотрим, откуда берется в контроллерах ПИЛОТ состояние готовности к отпуску с максимально возможной дозой при отпуске до полного бака. Для этого вернемся к "Универсальному протоколу":

Пункт 5.2.3 УП: "В случае, если код состояния ТРК (поле Code) равен '05' ("Сброс (Дозы нет)"), ККМ выдает команду "До полного бака" с номером загружаемой ТРК в поле TRK_No, ценой в поле Price и загружаемой дозой '000000' в поле Volume."

Пункт 5.2.4 УП: "Контроллер ТРК переводит ТРК в состояние "Готовность к пуску" ('01') и возвращает ответ "До полного бака" с номером загруженной ТРК в поле TRK_No, загруженной ценой в поле Price, кодами ошибки/состояния в поле Status и загруженной дозой в поле Volume".

В протоколе не указано, что такое "загруженная доза в поле Volume". Должна это быть доза '000000' или что-либо иное. В самом протоколе в таблице написано "vvvvvv" (в более ранних версиях "FFFFFF").

Логично предположить, что ККМ хочет получить лимит - максимально возможное количество топлива, которое может быть отпущено. Таким образом режим реализован в КУ ТРК ПИЛОТ, при этом в основном сохранена совместимость с режимом обычного отпуска, что видно из схем состояний (см. рис. 2 и 3).

Была также вероятность, что версия 1.72 не окончательная, и впоследствии можно будет в поле "Volume" передавать лимит в соответствии с залоговой суммой, полученной от клиента. А значение "000000" оставить для работы без залога и без лимита.

Кроме этого, для корректной работы достаточно было полностью разделить режимы обычного отпуска и отпуска до полного бака. Сейчас они разделены почти полностью и связаны общими состояниями "01 - Готовность" и "03 - Пуск". Естественно, наиболее грамотным решением было бы наличие соответствующих состояний "Готовность к отпуску до полного бака" и "Пуск до полного бака", что исключило бы возможные коллизии.

Наличие общего состояния "01 - Готовность" в различных режимах предполагает, что и ККМ, и контроллер помнит, как - по какой ветке алгоритма - они вошли в это состояние. Естественно, при этом устройства не могут быть заменены при нахождении в этом состоянии, иначе собьется память о предшествующих режимах.

Рассмотрим, почему общее состояние "Готовность" в различных режимах вызывает проблемы. Если допустить, что после передачи команды "до полного бака" возникает состояние "готовность - доза 0", то есть состояние "01 - Готовность к пуску" с дозой "000000" в поле Volume, возникнет проблема, связанная с неоднозначностью этого состояния. В протоколе оно явно не документировано.

Зато о возникновении "Ошибки возврата 0 литров" прямо указано в протоколе и некоторые ККМ работают именно таким образом:

Пункт 4.3 УП. "Возврат дозы из ТРК":
Пункт 4.3.1 УП. ККМ выполняет операцию "Опрос состояния ТРК".
Пункт 4.3.2 УП. В случае, если остаток дозы в ТРК нулевой или код состояния ТРК (поле Code) не равен "Готовность к пуску" ('01'), "Остаток дозы" ('02'), "До полного бака останов" ('07') или "Останов" ('04'), ККМ генерирует ошибку "Ошибка возврата 0 литров" или "Недопустимый статус ТРК".

Иными словами, при введении состояния "Готовность - доза 0" могут происходить ошибки, например "Ошибка возврата 0 литров" и т.п. И выйти из этого состояния в рамках "Универсального протокола", следуя ему буквально, не получится.

Конечно, можно было вообще не вводить команду "до полного бака", а использовать команду 31h "Доза" со значением "000000" в поле Volume. Соответственно документировав "01 - Готовность - доза 0" и т.п. Но это нужно было сразу сделать в протоколе.

Следующий момент. Если команда 36h "Останов" поступает в КУ ТРК ПИЛОТ сразу после команды 35h "Пуск" в состоянии отпуска до полного бака и контроллер не успевает принять ни одного счетного импульса (такое может быть на ТРК с литровой дозировкой), контроллер переходит в состояние "05 - Сброс (дозы нет)".

Если вместо состояния "05 - Сброс (дозы нет)" выходить в состояние "07 - До полного бака останов" с дозой 0 возникнут проблемы того же плана, что и с состоянием "01 - Готовность, доза 0". Поэтому некоторые контроллеры самопроизвольно переходят из состояния "07 - До полного бака останов - доза 0" в состояние "05 - Сброс (дозы нет)" через несколько секунд.



5. Аварийные ситуации

5.1. Типичной аварийной ситуацией на АЗС является перелив. Контроллер управления ТРК переходит в состояние "06" - "Авария" если на его вход от ТРК поступает счетный импульс в любом состоянии, кроме "03 - Пуск".

Обработка аварийных ситуаций не регламентируется "Универсальным протоколом". Сложившийся de facto стандарт предусматривает следующую последовательность операций.

В момент возникновения импульса КУ ТРК переходит из состояния "05 - Сброс (дозы нет)", "01 - Готовность к пуску", "04 - Останов" или "07- До полного бака останов" в состояние "06 - Авария". При этом по команде ККМ 34h "Тест" в поле Volume ответа передается перелитая доза, в поле Status/Code - код состояния "Авария".

Для дальнейшего рассмотрения предполагается, что причина возникновения аварии устранена, например ТРК отключена и КУ ТРК отсоединен от ТРК. Это предположение сделано только для упрощения и никак не влияет на алгоритм в целом. Чуть ниже рассмотрен случай, когда причина не устранена.

АРМ или ККМ, проанализировав ответ КУ ТРК должны передать команду 37h "Сброс". При этом в ответе в поле Volume будет перелитая доза, а КУ ТРК переходит в состояние "05 - Сброс (дозы нет)" "01 - Готовность к пуску", "04 - Останов" или "07 - До полного бака останов" соответственно, с дозой, зафиксированной к моменту возникновения аварии.

АРМ или ККМ в этой ситуации могут по своему усмотрению проигнорировать перелитую дозу, запомнить для последующего оформления чека или сразу пробить чек на перелив.

После этого все возвращается на исходные. КУ ТРК находится в состоянии "05 - Сброс (дозы нет)", "01 - Готовность к пуску", "04 - Останов" или "07 - До полного бака останов" и программа может считать оставшуюся дозу. Соответственно программа может начать или продолжить отпуск командой 35h "Пуск" (кроме состояния "До полного бака останов") или оформить чек и передать команду 37h "Сброс". Все эти операции регламентированы версией 1.72 "Универсального протокола".

Точно так же обрабатывается ситуация, когда причина возникновения ошибки не устранена.

После возвращения контроллера в состояние состоянии "05 - Сброс (дозы нет)", "01 - Готовность к пуску", "04 - Останов" или "07 - До полного бака останов" повторно возникнет "Авария" и вся последовательность действий повторится. Очевидно, что ни один счетный импульс в этой ситуации не может пройти без передачи информации в АРМ или ККМ.

Таким образом, "Универсальный протокол" нуждается в следующих дополнениях:

  • Вывод перелитой дозы в поле Volume при установленном состоянии "Авария" в поле Status/Code.
  • Возврат в состояние "Готовность к пуску", "Останов" или "До полного бака останов" с установленной к моменту возникновения аварии дозой по команде 37h "Сброс" при состоянии "Авария" (при условии, что состояние аварии возникло при нахождении в этих состояниях).
  • Возврат командой 37h "Сброс" в состояние "Сброс (дозы нет)", если авария возникла из этого состояния.

Именно так обрабатывается состояние аварии в большинстве контроллеров, в том числе в КУ ТРК ПИЛОТ.

5.2. Отсутствие счетных импульсов при включенном моторе ТРК распознается большинством КУ ТРК как аварийная ситуация. Это может наблюдаться, например, при обрыве в цепи счетных импульсов. КУ ТРК по истечении определенного времени обычно отключают мотор ТРК.

"Универсальный протокол" не предусматривает распознавание данной аварии. Программа АРМ может определить ее возникновение самостоятельно, анализируя состояние КУ ТРК и дозу. Отсутствие изменения дозы в течение определенного времени при нахождении КУ ТРК в состоянии "03 - Пуск" свидетельствует о возможном возникновении аварийной ситуации данного типа. Для прекращения отпуска топлива следует передать команду 36h "Останов". Хотя большинство КУ ТРК, в том числе КУ ТРК ПИЛОТ, определяют данный тип аварии, и сами прекращают отпуск топлива.



 

На этой странице показаны особенности использования "Универсального протокола...". Некоторые замечания о проектировании программ АРМ и пример организации обмена с КУ ТРК приведены на других страницах сайта.


НПП "СЕМИКО" (383) 271-01-25 (многоканальный)