Касов протокол Zeka за обмен на данни в режим Фискален Принтер
Драйвери за режим "Фискален принтер" на ZEKA
Сървър за изпращане на данни в режим фискален принтер към ZEKA
Софтуер за откриване и разпознаване на устройства произведени от ТРЕМОЛ
Общо описание
Режима представлява комуникация с персонален компютър, при която продажбите се инициират от страна на компютъра и се извършват от касовия апарат. Една бележка се изпраща като отделна комуникационна сесия. Касовия апарат (КА) запазва своите функции в отчетните режими, като единствено в режим регистрация (продажби), изисква инициатива от страна на компютъра вместо работа на оператор. Вътрешната база данни на КА не се използва в този режим. Всички данни се получават от компютъра (име цена и т.н.). За да работят касовите апарати в режим Фискален принтер е необходимо в режим "програмиране" да е указан режима (П11=1, П10=1). За касовите апарати модел S03 само П10=1.
Протокола е интегриран и във Фискалните Принтери Zeka - FP, FP01, FP03, като може да се използва едновременно и със стандартния протокол на Фискален Принтер. Това дава една по-голяма гъвкавост и възможност за отпечатване на бележки на една сесия, като едновременно се следи и състоянието на принтера, извличат се отчети и други.
Описание на протокола
Параметри на връзката:
Baud rate 9600 bps, 8 bits, no parity
Формат на съобщенията:
<маркер><номер на КА><команда><информация><crc><LF>
Описанието на отделните полета, обозначени между знаците < и > е показано в таблицата:
| Поле | Брой байта | Стойност |
| маркер | 1 | Старт на съобщението – 0x02 за Zeka S03, за всички останали 0xАА |
| номер на КА | 6 | ASCII ('nnnnnn') сериен номер на касовия апарат |
| команда | 1 | 'a'..'z' команда |
| информация | ? | променлива дължина символи в обхвата 0x20 .. 0x9F |
| crc | 2 | XOR на всички байтове (включително маркера). Резултата е байт от вида 0xHL, който се преобразува като 0x3H, 0x3L. За повече информация виж приложението в края на това протоколно описание |
| LF | 1 | Край на съобщението - винаги - 0x0A |
Формат на квитанциите:
<тип><номер на КА><crc><LF>
Описанието на отделните полета, обозначени между знаците < и > е показано в таблицата:
| Поле | Брой байта | Стойност |
| тип | 1 | Тип на квитанция – 0x06 = ACK (положителна), 0x15 = NACK (отрицателна) |
| номер на КА | 6 | ASCII ('nnnnnn') сериен номер на касовия апарат |
| crc | 2 | XOR на всички байтове (включително маркера). Резултата е байт от вида 0xHL, който се преобразува като 0x3H, 0x3L. За повече информация виж приложението в края на това протоколно описание |
| LF | 1 | Край на съобщението - винаги - 0x0A |
Последователност на комуникацията:
| Компютър: | Касов апарат: |
| Съобщение с команда "start" -> | |
| <-квитанция ACK | |
| съобщение с команда "транзакция" -> | |
| <-квитанция ACK | |
| съобщение с команда "транзакция" -> | |
| <-квитанция ACK | |
| ....... | |
| <-квитанция ACK | |
| съобщение с команда "q" - плащане-> | |
| <-квитанция ACK | |
| съобщение с команда "TOTAL" -> | |
| <-квитанция ACK | |
| съобщение с команда "end" -> | |
| <-квитанция ACK | |
| <-съобщение с команда "Номер на чек" | |
| квитанция ACK -> |
Активна страна в комуникациите е компютъра. Времето за изчакване на "квитанция ACK" трябва да е около 2 секунди. Комуникацията е транзакционна. Т.е. касовия апарат започва печат след получаване на команда "end" и изпращане на команда "Номер на чек". Ако по някаква причинина комуникацията пропадне (невалидна команда или входни данни, аварийно прекратяване на комуникацията и др.), КА не отпечатва и не натрупва нищо. Гаранция за успешно получена информация са квитанциите ACK и команда "Номер на чек", след което КА ще разпечата бележката. Касовия апарат печата заглавната част и края на бележката съгласно българското законодателство и не е необходимо тези текстове да бъдат изпращани.
Описание на команди предавани от компютъра към касовия апарат
Команда "start":
<a>
Полета:
| a | 1 байт команда - 'a' |
Отговор от KA: квитанция (ACK или NACK)
Бележки: Тази команда трябва да предшества всички останали команди.
Команда "параметри" ( не задължителна ) - Само за 'Е' модели. ( Zeka 02-E, Zeka M02-E ... )
<d><тип>
Полета:
| d | 1 байт команда - 'd' |
| тип | 1 байт тип на командата ASCII номер '0' до '9': |
Отговор от KA: квитанция (ACK или NACK)
Бележки: Тази команда трябва да e първа команда след команда "start".
Команда "свободен текст":
<t><текст>
Полета:
| t | 1 байт команда - 't' |
| текст | 22 байта текст за отпечатване |
Отговор от KA: квитанция (ACK или NACK)
Команда "свободен текст с голяма дължина":
<Т><текст>
Полета:
| Т | 1 байт команда - 'Т' |
| текст | 34 байта текст за отпечатване |
Ако касовия апарат поддържа по-малък брой символи, излишните се отрязват.
Отговор от KA: квитанция (ACK или NACK)
Kоманда "продажба-сума":
<s><сума><десетична точка><данъчна група><подгрупа><група>
Полета:
| s | 1 байт команда - 's' |
| сума | 8 байта сума (без десетичната точка) ASCII формат |
| десетична точка | 1 байт позиция на десетичната точка - ASCII номер '0' или '2' '0' = без десетична точка, сумата = ХХХХХХХХ '2' = с десетична точка, сумата = ХХХХХХ.ХХ |
| данъчна група | 1 байт данъчна група - ASCII номер '0' до '7' '0' - група A '1' - група Б '2' - група В '3' - група Г '4' - група Д '5' - група Е '6' - група Ж '7' - група З |
| подгрупа | 1 байт номер на подгрупа към която принадлежи продажбата. ASCII номер '0' до '9' |
| група | 1 байт номер на група към която принадлежи продажбата. ASCII номер '0' до '9' |
Отговор от KA: квитанция (ACK или NACK)
Команда "продажба-артикул" :
<p><име><сума><десетична точка><количество><данъчна група><подгрупа><група>
Полета:
| p | 1 байт команда - 'p' |
| име | 24 ASCII символа, включващи цифри, знаци главни латински и кирилски букви, от които ще се разпечат първите 16 (!) на един ред на касовата бележка, като описание на артикула. |
| сума | 8 байта сума (без десетичната точка) ASCII формат |
| десетична точка | 1 байт позиция на десетичната точка - ASCII номер '0' или '2' '0' = без десетична точка, сумата = ХХХХХХХХ '2' = с десетична точка, сумата = ХХХХХХ.ХХ |
| количество | 9 ASCII цифри ХХХХХХХХХ, съответстващи на продаденото количество ХХХХХХ.ХХХ |
| данъчна група | 1 байт данъчна група - ASCII номер '0' до '7' '0' - група A '1' - група Б '2' - група В '3' - група Г '4' - група Д '5' - група Е '6' - група Ж '7' - група З |
| подгрупа | 1 байт номер на подгрупа към която принадлежи продажбата. ASCII номер '0' до '9' |
| група | 1 байт номер на група към която принадлежи продажбата. ASCII номер '0' до '9' |
Отговор от KA: квитанция (ACK или NACK)
Команда "отстъпка/надбавка":
<m><+/-><сума><десетична точка><данъчна група>
Полета:
| m | 1 байт команда - 'm' |
| +/- | 1 байт тип на командата - '+' = надбавка, '-' = отстъпка |
| сума | 8 байта сума (без десетичната точка) ASCII формат |
| десетична точка | 1 байт позиция на десетичната точка - ASCII номер '0' или '2' '0' = без десетична точка, сумата = ХХХХХХХХ '2' = с десетична точка, сумата = ХХХХХХ.ХХ |
| данъчна група | 1 байт данъчна група - ASCII номер '0' до '7' '0' - група A '1' - група Б '2' - група В '3' - група Г '4' - група Д '5' - група Е '6' - група Ж '7' - група З |
Отговор от KA: квитанция (ACK или NACK)
Команда "плащане" - Само за 'Е' модели. ( Zeka 02-E, Zeka M02-E ... ):
<Q><номер><име><сума><десетична точка><параметър ресто>
Полета:
| Q | 1 байт команда - 'Q' |
| номер | 1 ASCII цифра номер на плащане от '0' до '3' в съответствие с отчетите на касовия апарат. '4' ЕВРО плащане. |
| име | 10 ASCII символа име на плащане от които се вземат само първите 6 (примерно "В БРОЙ ") |
| сума | 8 байта сума (без десетичната точка) ASCII формат |
| десетична точка | 1 байт позиция на десетичната точка - ASCII номер '0' или '2' '0' = без десетична точка, сумата = ХХХХХХХХ '2' = с десетична точка, сумата = ХХХХХХ.ХХ |
| параметър ресто | 1 байт за плащане с или без ресто. Важи за всички плащания с изключение на '0' - В БРОЙ |
Отговор от KA: квитанция (ACK или NACK)
Команда "плащане":
<q><курс><номер><име>
Полета:
| q | 1 байт команда - 'q' |
| курс | 9 байта ASCII цифри. Трябва да са "000001000". |
| номер | 1 ASCII цифра номер на плащане от '0' до '4' в съответствие с отчетите на касовия апарат. |
| име | 6 ASCII символа име на плащане (примерно "В БРОЙ") |
Отговор от KA: квитанция (ACK или NACK)
Бележки: Командата е задължителна, независимо дали е необходима.
Подобни случаи са: при платена сметка с команда 'Q'; Въведени или Изведени суми; Служебни бонове
За плащане в брой номерът на плащане трябва да е '0' името "В БРОЙ"
Команда "въведени / изведени служебни суми":
<Ι><знак><сума><десетична точка><име><номер плащане>
Полета:
| I | 1 байт команда - 'I' |
| знак | 1 символ със стойности ‘+‘ за въведени и ‘-’ за изведени |
| сума | 8 байта сума (без десетичната точка) ASCII формат |
| десетична точка | 1 байт позиция на десетичната точка - ASCII номер '0' или '2' '0' = без десетична точка, сумата = ХХХХХХХХ '2' = с десетична точка, сумата = ХХХХХХ.ХХ |
| име | 6 ASCII символа име на плащане (примерно "В БРОЙ") |
| номер | 1 ASCII цифра номер на плащане от '0' до '4' в съответствие с отчетите на касовия апарат. |
Отговор от KA: квитанция (ACK или NACK)
Команда "end":
<z>
Полета:
| z | 1 байт команда - 'z' |
Отговор от KA: квитанция (ACK или NACK)
Бележки: Тази команда трябва да e последната команда на компютъра към KA
Описание на команди предавани от касовия апарат към компютъра
Команда "номер на чек":
<c><номер на чек>
Полета:
| c | 1 байт команда - 'c' |
| номер на чек | 5 ASCII цифри - номер на издадения от касата чек. Примерно "01234" |
Отговор от компютъра към КА: квитанция ACK
Изчисляване на контролна сума (CRC)
Стъпки за изчисляване на контролната сума:
- Започвайки от 0 се пресмята изключващо ИЛИ (XOR) на всички байтове в съобщението (резултата се пази в байтова променлива).
- Към съобщението се добавя първия байт от контролната сума който се състои от старшите 4 бита на резултата от точка 1 върху които е извършена операция ИЛИ (OR) с 30h
- Към съобщението се добавя втория байт от контролната сума който се състои от младшите 4 бита на резултата от точка 1 върху които е извършена операция ИЛИ (OR) с 30h
- Към съобщението се добавя маркер за край 0Ah (LF)
Пример на C/C++:
// AddCRC: Adds CRC & END marker to a command
void AddCRC(unsigned char* cmd, unsigned int len)
{
unsigned int i;
unsigned char xor = 0;
for (i = 0; i < len; i++)
xor ^= cmd[i];
cmd[i++] = (xor >> 4) | 0x30; // Calculate HIGH byte of CRC
cmd[i++] = (xor & 0x0F) | 0x30; // Calculate LOW byte of CRC
cmd[i++] = 0x0A; // Add end marker
cmd[i] = 0; // Add zero to make it zero terminated
}
Допълнителни (помощни) команди:
Команда '?' - получаване информация за серийния номер
<0xАА><'?'><crc><LF>
Описанието на отделните полета, обозначени между знаците < и > е показано в таблицата:
| Поле | Брой байта | Стойност |
| маркер | 1 | Старт на съобщението – 0x02 за Zeka S03, за всички останали 0xАА |
| команда | 1 | '?' |
| crc | 2 | XOR на всички байтове (включително маркера). Резултата е байт от вида 0xHL, който се преобразува като 0x3H, 0x3L. За повече информация виж приложението в края на това протоколно описание |
| LF | 1 | Край на съобщението - винаги - 0x0A |
Тези пет байта се изпращат за да се открие наличие на комуникационен протокол Zeka, както и да се открие серийния номер на устройството с което се комуникира.
Забележете че формата се различава от стандартния формат на съобщенията по това, че липсва номер на КА.
Отговор от КА:
| Поле | Брой байта | Стойност |
| тип | 1 | Тип на квитанция – 0x0E = RETRY |
| номер на КА | 6 | ASCII ('nnnnnn') сериен номер на касовия апарат |
| crc | 2 | XOR на всички байтове (включително маркера). Резултата е байт от вида 0xHL, който се преобразува като 0x3H, 0x3L. За повече информация виж приложението в края на това протоколно описание |
| LF | 1 | Край на съобщението - винаги - 0x0A |
По този начин приложния софтуер открива наличието на касов апарат Zeka и неговия сериен номер.
Бележки:
- Продажбата може да се опише като продажба-артикул, при което cе изпращат име, цена и количество, а КА изчислява сумата, разпечатва и натрупва във вътрешните си регистри и фискална памет. При тази ситуация е възможно да се загуби точност в случай, че цената е с повече от два знака след десетичната точка. В такъв случай е по-добре да се използва команда "свободен текст" с описание на име, цена по количество (произволен брой редове), като КА ще печата по 16 символа на команда, което е различно от 18 символа - ширина на лентата, а сумата се изпраща с команда продажба-сума и това е което KA ще натрупа във вътрешните си регистри и фискална памет.
- За издаване на служебен бон е необходимо да използвате само следните команди - start, свободен текст, плащане и end.
- Всички текстове и имена на кирилица са с MIK encoding (ДОС кирилица). Т.е. 'А' = 0x80 ... 'Я' = 0x9F. За всички каси със стартов маркер 0xAA е необходимо малките букви кирилица да се преобразуват в големи. За Zeka S03 и всички модели Zeka FP, такова преобразуване не е необходимо.
<последна редакция 04.12.2007 г.>
