Протокол на обмен с кaсов aпaрaт Zeka в режим на програмиране и отчитане
Софтуер за откриване и разпознаване на устройства произведени от ТРЕМОЛ
ECRHelper - Програма за програмиране и отчитане на ЕКАФП ZEKA
Режимът е предназначен за програмиране на имена и параметри на артикулите, заглавните редове, имена и цени на подгрупите, имена на операторите. Софтуерът разработен от Тремол ООД, който покрива цялата функционалност на този протокол се нарича ECR Helper.
В този режим инициатор на комуникацията е PC, а кaсовия aпaрaт (КА) приема данните, проверявайки ги за тяхната коректност. При коректни данни КА "връща" положителна квитанция ACK, и обратно при некоректни данни, отрицателна NACK.Протокола позволява следните възможности:
- Програмиране на заглавни редове (клише)
- Програмиране на имена на оператори
- Програмиране на имена и цени на подгрупи
- Програмиране на имена и параметри на артикули
- Програмиране на *BMP файл (графично лого)
- Отчитане на артикули
- Отчитане на департаменти
- Дневен Х отчет
ECR Helper има също така възможност да бъде ползван автоматизирано от вашите софтуерни продукти за качване на информация и получаване на отчети! Натисни за повече информация.
Описание на протокола
Бележка: Формата на протокола съответсва на касовия протокол Zeka в режим фискален принтер.
Параметри на връзката:
Baud rate 9600 bps, 8 bits, no parity
Формат на съобщенията:
<маркер><номер на КА><команда><информация><crc><LF>
Описанието на отделните полета, обозначени между знаците < и > е показано в таблицата:
| Поле | Брой байта | Стойност |
| маркер | 1 | Маркер - старт на съобщението – 0x02 за Zeka S02,S03, за всички останали 0xАА (виж описанието на команда 'V') |
| номер на КА | 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 |
Последователност на комуникацията:
| PC | Отговор (ЕКАФП) |
| Команда „START" | |
| Потвърждение ACK | |
| Команда „ПРОГРАМИРАНЕ" | |
| Потвърждение ACK | |
| Команда „ПРОГРАМИРАНЕ" | |
| Потвърждение ACK | |
| ........................ | |
| Потвърждение ACK | |
| Команда „STOP" | |
| Потвърждение ACK |
Списък на командите от PC:
| Команда | Значение |
| а | START |
| w | Програмиране на ред от клише |
| o | Програмиране на име на оператор |
| r | Програмиране на артикул |
| y | Програмиране на подгрупа |
| G | Дневен отчет в текстов формат |
| f | Отчет на артикули |
| F | Отчет по департаменти |
| V | Версия протокол |
| z | STOP |
Описание на команди от предавани от компютъра към касовия апарат
Команда "start":
<a>
Полета:
| a | 1 байт команда - 'a' |
Отговор от KA: квитанция (ACK или NACK)
Бележки: Тази команда трябва да предшества всички останали команди.
Команда програмиране на ред от клише: 'w'
<w><номер на ред><'0'><съдържание на реда>
Полета:
| w | 1 байт команда - 'w' |
| номер на ред | 1 байт номер на реда ASCII число '1' .. '6' |
| х | 1 байт без значение, може '0' |
| съдържание на реда | 18 .. 38 ASCII символа в зависимост от модела |
Отговор от KA: квитанция (ACK или NACK)
Команда програмиране на име на оператор: 'о'
<o><номер на оператор><име>
Полета:
| o | 1 байт команда - 'o' |
| номер на оператор | 1 байт номер на оператор - ASCII число '1' .. '9' |
| име | до 20 байта ASCII име на оператора, броя зависи от модела |
Отговор от KA: квитанция (ACK или NACK)
Команда програмиране на артикул: 'r'
<r><номер на артикул><име><баркод><цена><десетична точка><количество>
<данъчна група><подгрупа><8 запазени символа><номер на плащане>
Полета:
| r | 1 байт команда - '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><номер на подгрупа><име><цена><десетична точка><данъчна група>
Полета:
| y | 1 байт команда - '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><графични данни>
Полета:
| R | 1 байт команда - '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>
Полета:
| f | 1 байт команда - '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>
Полета:
| z | 1 байт команда - 'z' |
Отговор от KA: квитанция (ACK или NACK)
Изчисляване на контролна сума (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 и неговия сериен номер.
Команда 'V' - получаване информация за версията на протокола, софтуера и държавата
<V>
Полета:
| V | 1 байт команда - 'V' |
Отговор от КА: квитанция ACK + съобщение с данни. Формата на информационната част на съобщението е следния:
<V><протокол><държава><запазено><версия>
| Поле | Брой байта | Стойност |
| V | 1 | 1 байт 'V' |
| протокол | 2 | 2 байта номер на протокол във формат ASCII цифри примерно '3' и '2' = 32 |
| държава | 1 | 1 байт държава ('B' за България) |
| запазено | 1 | 1 байт запазен за бъдеща употреба |
| версия | 30 | 30 байта текстово представяне на версията на вътрешния софтуер (фърмуера) |
Версии на протокола:
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 | 24 | 18 | 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' дневен Х и операторски отчет | няма | не | не | не | не | да | да | да | да |
| Маркер | 0xAA | 0xAA | 0xAA | 0xAA | 0x02 | 0x02 | 0x02 | 0x02 | |
| Модел Каса | ZekaM02 | Zeka02 | ZekaS02 | ZekaS03 | Zeka02E | ZekaM03E | ZekaS02E | ZekaS03E | |
Бележки:
- Ако желаете съдържанието на дадено поле (примерно баркода на артикул) да остане непроменено, е необходимо като данни да изпратите същият брой " (двойни кавички). Това гарантира, че данните в това поле ще останат непроменени. Двойни кавички не могат да бъдат използвани за полета, който еднозначно определят параметър на командата (примерно номер на артикул в команда 'r' или номер на подгрупа в команда 'y'), защото ако този параметър е неизвестен KA не може да определи за кой номер се отнася командата.
- Всички текстове и имена на кирилица са с MIK encoding (ДОС кирилица). Т.е. 'А' = 0x80 ... 'Я' = 0x9F. За всички каси със стартов маркер 0xAA е необходимо малките букви кирилица да се преобразуват в големи. За Zeka S03, такова преобразуване не е необходимо.
<последна редакция 29.11.2007 г.>
