Касов протокол 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АА
номер на КА6ASCII ('nnnnnn') сериен номер на касовия апарат
команда1'a'..'z' команда
информация?променлива дължина символи в обхвата 0x20 .. 0x9F
crc2 XOR на всички байтове (включително маркера). Резултата е байт от вида 0xHL, който се преобразува като 0x3H, 0x3L. За повече информация виж приложението в края на това протоколно описание
LF1 Край на съобщението - винаги - 0x0A 

Формат на квитанциите:

<тип><номер на КА><crc><LF>

Описанието на отделните полета, обозначени между знаците < и > е показано в таблицата:

 ПолеБрой байтаСтойност 
тип1Тип на квитанция – 0x06 = ACK (положителна), 0x15 = NACK (отрицателна)
номер на КА6ASCII ('nnnnnn') сериен номер на касовия апарат
crc2 XOR на всички байтове (включително маркера). Резултата е байт от вида 0xHL, който се преобразува като 0x3H, 0x3L. За повече информация виж приложението в края на това протоколно описание
LF1

Край на съобщението - винаги - 0x0A

Последователност на комуникацията:

Компютър:Касов апарат:
Съобщение с команда "start" -> 
 <-квитанция ACK
съобщение с команда "транзакция" -> 
 <-квитанция ACK
съобщение с команда "транзакция" -> 
 <-квитанция ACK
....... 
 <-квитанция ACK
съобщение с команда "q"  - плащане-> 
 <-квитанция ACK
съобщение с команда "TOTAL" -> 
 <-квитанция ACK
съобщение с команда "end" -> 
 <-квитанция ACK
 <-съобщение с команда "Номер на чек"
квитанция ACK -> 

Активна страна в комуникациите е компютъра. Времето за изчакване на "квитанция ACK" трябва да е около 2 секунди. Комуникацията е транзакционна. Т.е. касовия апарат започва печат след получаване на команда "end" и изпращане на команда "Номер на чек". Ако по някаква причинина комуникацията пропадне (невалидна команда или входни данни, аварийно прекратяване на комуникацията и др.), КА не отпечатва и не натрупва нищо. Гаранция за успешно получена информация са квитанциите ACK и команда "Номер на чек", след което КА ще разпечата бележката. Касовия апарат печата заглавната част и края на бележката съгласно българското законодателство и не е необходимо тези текстове да бъдат изпращани.

Описание на команди предавани от компютъра към касовия апарат

Команда "start":

 <a>

Полета:

a1 байт команда - 'a'

Отговор от KA: квитанция (ACK или NACK)

Бележки: Тази команда трябва да предшества всички останали команди.

Команда "параметри" ( не задължителна ) - Само за 'Е' модели. ( Zeka 02-E, Zeka M02-E ... )

 <d><тип>

Полета:

 d1 байт команда - 'd'
тип

1 байт тип на командата ASCII номер '0' до '9':
'0' - печат бон-фактура с ДДС
'1' - печат бон-фактура с ДДС + печат дубликат
'2' - печат дубликат на бона ( без фактура, без ДДС)
'3' - печат на ДДС в бона (не е фактура)
'4' - печат на ДДС (не е фактура) + печат дубликат
'5' - печат на бона както е настроен в касата
'6' - подробна касова бележка с ДДС в бона
'7' - подробна касова бележка с ДДС в бона + печат дубликат
'8' - подробна касова бележка без ДДС в бона
'9' - подробна касова бележка без ДДС в бона + печат дубликат

Отговор от KA: квитанция (ACK или NACK)

Бележки: Тази команда трябва да e първа команда след команда "start".

Команда "свободен текст":

 <t><текст>

Полета:

 t1 байт команда - 't'
текст
22 байта текст за отпечатване


Отговор от KA: квитанция (ACK или NACK)

Команда "свободен текст с голяма дължина":

 <Т><текст>

Полета:

 Т1 байт команда - 'Т'
текст
34 байта текст за отпечатване

Ако касовия апарат поддържа по-малък брой символи, излишните се отрязват.  

Отговор от KA: квитанция (ACK или NACK)

 

Kоманда "продажба-сума":

<s><сума><десетична точка><данъчна група><подгрупа><група>

Полета:

 s1 байт команда - '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><име><сума><десетична точка><количество><данъчна група><подгрупа><група>

Полета:

p1 байт команда - '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><+/-><сума><десетична точка><данъчна група>

Полета:

 m1 байт команда - '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>

Полета:

z1 байт команда - 'z'

Отговор от KA: квитанция (ACK или NACK)

Бележки: Тази команда трябва да e последната команда на компютъра към KA


Описание на команди предавани от касовия апарат към компютъра

Команда "номер на чек":

<c><номер на чек>

Полета:

c
1 байт команда - 'c'
номер на чек
5 ASCII цифри - номер на издадения от касата чек. Примерно "01234"

Отговор от компютъра към КА: квитанция ACK

 


Изчисляване на контролна сума (CRC)

Стъпки за изчисляване на контролната сума:

  1. Започвайки от 0 се пресмята  изключващо ИЛИ (XOR) на всички байтове в съобщението (резултата се пази в байтова променлива).
  2. Към съобщението се добавя първия байт от контролната сума който се състои от старшите 4 бита на резултата от точка 1 върху които е извършена операция ИЛИ (OR) с 30h
  3. Към съобщението се добавя втория байт от контролната сума който се състои от младшите 4 бита на резултата от точка 1 върху които е извършена операция ИЛИ (OR) с 30h
  4. Към съобщението се добавя маркер за край 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'?'
crc2 XOR на всички байтове (включително маркера). Резултата е байт от вида 0xHL, който се преобразува като 0x3H, 0x3L. За повече информация виж приложението в края на това протоколно описание
LF1 Край на съобщението - винаги - 0x0A 

Тези пет байта се изпращат за да се открие наличие на комуникационен протокол Zeka, както и да се открие серийния номер на устройството с което се комуникира.

Забележете че формата се различава от стандартния формат на съобщенията по това, че липсва номер на КА.

Отговор от КА:

 ПолеБрой байтаСтойност 
тип1Тип на квитанция – 0x0E = RETRY
номер на КА6ASCII ('nnnnnn') сериен номер на касовия апарат
crc2 XOR на всички байтове (включително маркера). Резултата е байт от вида 0xHL, който се преобразува като 0x3H, 0x3L. За повече информация виж приложението в края на това протоколно описание
LF1

Край на съобщението - винаги - 0x0A

По този начин приложния софтуер открива наличието на касов апарат Zeka и неговия сериен номер.


Бележки:

  • Продажбата може да се опише като продажба-артикул, при което cе изпращат име, цена и количество, а КА изчислява сумата, разпечатва и натрупва във вътрешните си регистри и фискална памет. При тази ситуация е възможно да се загуби точност в случай, че цената е с повече от два знака след десетичната точка. В такъв случай е по-добре да се използва команда "свободен текст" с описание на име, цена по количество (произволен брой редове), като КА ще печата по 16 символа на команда, което е различно от 18 символа - ширина на лентата, а сумата се изпраща с команда продажба-сума и това е което KA ще натрупа във вътрешните си регистри и фискална памет.
  • За издаване на служебен бон е необходимо да използвате само следните команди - start, свободен текст, плащане и end.
  • Всички текстове и имена на кирилица са с MIK encoding (ДОС кирилица). Т.е. 'А' = 0x80 ... 'Я' = 0x9F. За всички каси със стартов маркер 0xAA е необходимо малките букви кирилица да се преобразуват в големи. За Zeka S03 и всички модели Zeka FP, такова преобразуване не е необходимо.

<последна редакция 04.12.2007 г.>