Протокол на обмен с кaсов aпaрaт Zeka в режим на програмиране и отчитане

Софтуер за откриване и разпознаване на устройства произведени от ТРЕМОЛ

ECRHelper - Програма за програмиране и отчитане на ЕКАФП ZEKA

Режимът е предназначен за програмиране на имена и параметри на артикулите, заглавните редове, имена и цени на подгрупите, имена на операторите. Софтуерът разработен от Тремол ООД, който покрива цялата функционалност на този протокол се нарича ECR Helper.

В този режим инициатор на комуникацията е PC, а кaсовия aпaрaт (КА) приема данните, проверявайки ги за тяхната коректност. При коректни данни КА "връща" положителна квитанция ACK, и обратно при некоректни данни, отрицателна NACK.

Протокола позволява следните възможности:

  1. Програмиране на заглавни редове (клише)
  2. Програмиране на имена на оператори
  3. Програмиране на имена и цени на подгрупи
  4. Програмиране на имена и параметри на артикули
  5. Програмиране на *BMP файл (графично лого)
  6. Отчитане на артикули
  7. Отчитане на департаменти
  8. Дневен Х отчет

ECR Helper има също така възможност да бъде ползван автоматизирано от вашите софтуерни продукти за качване на информация и получаване на отчети! Натисни за повече информация.

Описание на протокола

Бележка: Формата на протокола съответсва на касовия протокол Zeka в режим фискален принтер.

Параметри на връзката:

Baud rate 9600 bps, 8 bits, no parity 

Формат на съобщенията:

<маркер><номер на КА><команда><информация><crc><LF>

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

 ПолеБрой байтаСтойност 
 маркер1Маркер - старт на съобщението – 0x02 за Zeka S02,S03, за всички останали 0xАА (виж описанието на команда 'V')
номер на КА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

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

 PCОтговор (ЕКАФП)
 Команда „START" 
  Потвърждение ACK
 Команда „ПРОГРАМИРАНЕ" 
  Потвърждение ACK
 Команда „ПРОГРАМИРАНЕ" 
  Потвърждение ACK
 ........................ 
  Потвърждение ACK
 Команда „STOP" 
  Потвърждение ACK

Списък на командите от PC: 

Команда Значение 
а START
w Програмиране на ред от клише
o Програмиране на име на оператор
r Програмиране на артикул
y Програмиране на подгрупа
 G Дневен отчет в текстов формат
 f Отчет на артикули
 F Отчет по департаменти
 V Версия протокол
z STOP

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

Команда "start":

 <a>

Полета:

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

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

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

Команда програмиране на ред от клише: 'w'

 <w><номер на ред><'0'><съдържание на реда>

Полета:

w1 байт команда - 'w'
номер на ред
1 байт номер на реда ASCII число '1' .. '6'
х
1 байт без значение, може '0'
съдържание на реда18 .. 38 ASCII символа в зависимост от модела

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

Команда програмиране на име на оператор: 'о'

<o><номер на оператор><име>

Полета:

o1 байт команда - 'o'
номер на оператор
1 байт номер на оператор - ASCII число '1' .. '9'
имедо 20 байта ASCII име на  оператора, броя зависи от модела

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

Команда програмиране на артикул: 'r'

<r><номер на артикул><име><баркод><цена><десетична точка><количество>
<данъчна група><подгрупа><8 запазени символа><номер на плащане>

Полета:

r1 байт команда - 'r'
номер на артикул 4 байтово ASCII число примерно "1234" или "0003"
име12-18 байта (в зависимост от модела) име на артикула или """""""", ако не се програмира
баркод12 байта ASCII цифри или """""""""""", ако не се програмира
цена8 байта цена (без десетичната точка) ASCII формат или """""""" , ако не се програмира
десетична точка
1 байт позиция на десетичната точка - ASCII номер '0' или '2'
'0' = без десетична точка, сумата = ХХХХХХХХ
'2' = с десетична точка, сумата = ХХХХХХ.ХХ
количество9 ASCII цифри ХХХХХХХХХ, съответстващи на наличното количество ХХХХХХ.ХХХ (или """"""""" ако не се програмира.)
данъчна група1 байт данъчна група - '0' .. '4' или " ако не се програмира
'0'  - без ДДС
'1' .. '4' - A,B,C,D
подгрупа1 байт номер на подгрупа към която принадлежи
артикула. ASCII номер '0' до '9' или " ако не се програмира

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

Команда програмиране на подгрупа: 'y'

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

Полета:

y1 байт команда - 'y'
номер на подгрупа 1 байт номер на подгрупа. ASCII номер '0' до '9'
име12-18 байта име на подгрупата или """""""", ако не се програмира
цена8 байта цена (без десетичната точка) ASCII формат или """""""" , ако не се програмира
десетична точка
1 байт позиция на десетичната точка - ASCII номер '0' или '2'
'0' = без десетична точка, сумата = ХХХХХХХХ
'2' = с десетична точка, сумата = ХХХХХХ.ХХ
данъчна група1 байт данъчна група - '0' .. '4' или " ако не се програмира
'0'  - без ДДС
'1' .. '4' - A,B,C,D

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

Команда програмиране на графично лого: 'R'

<R><графични данни>

Полета:

R1 байт команда - 'R'
графични данни Графични данни във формат .BMP и с размер 2302 байта или 3902 байта в зависимост от модела. Използва се BMP файл с размер 224x80 или 384x80 пиксела, 2 цвята (1 bpp).

Забележка: Преди команда 'R' не е необходимо да се изпълняват команди Start и Stop

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


Дневен Х и операторски отчет в текстов формат на касова бележка: 'G'
<G>

Полета:

G
1 байт команда - 'G'

Забележка: Преди команда 'G' не е необходимо да се изпълняват команди Start и Stop

Отговор от KA: данни в текстов ASCII формат дублиращи дневния отчет на касовия апарат. 

Отчет на артикулите: 'f'

<f>

Полета:

f1 байт команда - 'f'

 

Отговор от KA: 

 <номер><;><име><;><баркод><;><цена с вкл д.т.><;><данъчна група><;><подгрупа><;><плащане><;><натрупана сума><;><продадено количество> 

Забележка: всяко значещо поле е отделено с разделител ';'

Полета:

номер на артикул 4 байтово ASCII число примерно "1234" или "0003"
име12-18 байта (в зависимост от модела) име на артикула 
баркод12 байта ASCII цифри
цена9 байта цена с включена десетична точка в ASCII формат от вида хххххх.хх
данъчна група1 байт данъчна група - '0' .. '4' или " ако не се програмира
'0'  - без ДДС
'1' .. '4' - A,B,C,D
подгрупа1 байт номер на подгрупа към която принадлежи
артикула. ASCII номер '0' до '9' или " ако не се програмира
 плащане 1 байт номер плащане, винаги е '0'
натрупана сума
11 байта натрупана сума от продажбите с включена десетична точка в ASCII формат от вида хххххх.хх
продадено количество11 ASCII цифри  съответстващи на продаденото количество

 

Отчет на департаментите: 'F'

<F>

Полета:

F
1 байт команда - 'F'

 

Отговор от KA: 

 <номер><;><име><;><баркод><;><цена с вкл д.т.><;><данъчна група><;><подгрупа><;><плащане><;><натрупана сума><;><продадено количество> 

Забележка: всяко значещо поле е отделено с разделител ';'

Полета:

номер на подгрупа1 байт ASCII число
име12-18 байта (в зависимост от модела) име на департамента
баркод12 байта ASCII цифри
цена9 байта цена с включена десетична точка в ASCII формат от вида хххххх.хх
данъчна група1 байт данъчна група - '0' .. '4' или " ако не се програмира
'0'  - без ДДС
'1' .. '4' - A,B,C,D
 плащане 1 байт номер плащане, винаги е '0'
натрупана сума
11 байта натрупана сума от продажбите с включена десетична точка в ASCII формат от вида хххххх.хх
продадено количество11 ASCII цифри, съответстващи на продаденото количество

 

 

Команда Stop : 'z'  :  Край на комуникация.
 <z>

Полета:

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

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

 


 Изчисляване на контролна сума (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 и неговия сериен номер.


Команда 'V' - получаване информация за версията на протокола, софтуера и държавата

<V>

Полета:

V1 байт команда - 'V'

Отговор от КА: квитанция ACK + съобщение с данни. Формата на информационната част на съобщението е следния:

<V><протокол><държава><запазено><версия>
ПолеБрой байтаСтойност 
V11 байт 'V'
протокол22 байта номер на протокол във формат ASCII цифри примерно '3' и '2' = 32
държава1 1 байт държава ('B' за България)
запазено1

1 байт запазен за бъдеща употреба

версия 3030 байта текстово представяне на версията на вътрешния софтуер (фърмуера)

Версии на протокола:

V14B – Zeka M03, маркер 0xAA
V15B – Zeka M02, Zeka 02, маркер 0xAA
V30B – Zeka S02, маркер 0x02
V32B – Zeka S03, маркер 0x02

За различните версии на протокола има различни дължини на полетата. Респективно ако желаете да не променяте дадено поле трябва да запишете такъв брай " (двойни кавички в него).

Команда

Аргумент

Брой байтове

 V14B

V15B

V30B

V32B

V19B V24B V33B V34B

w'

Ред от клише

Съдържание на реда

24

18

18

38

 18 2418  38

‘o'

име на оператор

име

12

12

12

20

 12 12 12 20

‘r'

артикул

име

18

12

12

18

 18 18 18 18

Не се използва

0

1

1

0

 0 0 0 0

y'

подгрупа

име

18

12

12

18

 18 18 18 18

‘R'

лого

*.BMP file

3902

2302

2302

3902

 2302 3902 2302 3902

‘G'

дневен Х и операторски отчет  

няма

не
не
ненедададада
 Маркер0xAA0xAA 0xAA 0xAA 0x020x02 0x020x02
 Модел Каса
 ZekaM02

Zeka02
ZekaM02

ZekaS02
ZekaS03

Zeka02E
ZekaM02E

 ZekaM03E ZekaS02EZekaS03E

Бележки:

  • Ако желаете съдържанието на дадено поле (примерно баркода на артикул) да остане непроменено, е необходимо като данни да изпратите същият брой " (двойни кавички). Това гарантира, че данните в това поле ще останат непроменени. Двойни кавички не могат да бъдат използвани за полета, който еднозначно определят параметър на командата (примерно номер на артикул в команда 'r' или номер на подгрупа в команда 'y'), защото ако този параметър е неизвестен KA не може да определи за кой номер се отнася командата.
  • Всички текстове и имена на кирилица са с MIK encoding (ДОС кирилица). Т.е. 'А' = 0x80 ... 'Я' = 0x9F. За всички каси със стартов маркер 0xAA е необходимо малките букви кирилица да се преобразуват в големи. За Zeka S03, такова преобразуване не е необходимо.

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