menu
  • ENGLISH
  • Новини
  • Статии
  • Проекти
  • Изтегляне
  • Относно
  • Дарение
  • последна редакция на: 2017-11-18

    Общо описание на протокол за комуникация с фискално устройство, производство на Датекс ООД

      

    Ще опиша по-долу две модификации на протокол за комуникация с някои от най-широко разпространените модели фискални устройства, производство на Датекс ООД. Ако не сте запознати с понятията, свързани с този протокол, то добре е да хвърлите по един поглед на линковете, свързани с терминологията и то преди да Ви заболи главата. Ако вече сте експерт в темата или сте достатъчно запознат с терминологията по-долу - спокойно можете да прескочите тази част и да продължите нататък. Целта ми в тази част е да помогна на тези, които тепърва навлизат в темата.

     

    Терминология

    В този раздел засягам използваната от мен терминология.

    • Значението на  бит и байт;
    • Бройни системи:
      • Ще наричам за по-кратко десетичната бройна система DEC;
      • Ще наричам за по-кратко шестнайсеттичната бройна система HEX;
    • Описание на основните типове, които използвам и споменавам в статиите - можете да намерите тук;
      • Като пример - променливата от тип Word е цяло положително число и може да има стойности в интервала [0..65535];
    • Статия поясняваща накратко - какво разбирам под асинхронна и синхронна комуникация, можете да намерите тук;
    • Статия поясняваща накратко - какво разбирам под пакетирано и непакетирано съобщение, можете да намерите тук;
    • Фискалното устройство ще го наричам за по-кратко ФУ или Slave;
    • Компютъра (по-точно софтуера, който изпраща съобщенията до ФУ) ще го наричамe Host;
    • Транспортен протокол:
      • Под серийна комуникация между Host и Slave ще разбирамe свързаност по RS-232 или по USB;
      • Под БТ (BT) комуникация между Host и Slave ще разбирамe свързаност по Bluetooth;
      • Под TCP/IP комуникация между Host и Slave ще разбирамe свързаност по TCP/IP;
    • Специфични, еднобайтови съобщения:
      • Когато говорим, че Slave е изпратил на/към Host, байт NAK ще разбираме байт със стойност 15H (HEX);
      • Когато говорим, че Slave е изпратил на/към Host, байт SYN ще разбираме байт със стойност 16H (HEX);

     

    Синхронен протокол

    Протокола за комуникация с фискалните устройства на Датекс ООД е синхронен.

    • Имаме синхронизация в реда на започване, изпращане и получаване на съобщенията;
    • Имаме синхронизация по време;
    • Имаме снхронизация във формат и размер на съобщенията;

     

    Синхронизация в реда на започване, изпращане и получаване на съобщенията

    Фискалното устройство (Slave) не може да инициира комуникация. Тя се стартира задължително и винаги от програмата, която се намира на съответния компютър (Host). Ако получавате някаква информация от страна на фискалното устройство по комуникационния канал без да сте я инициирали – това обикновено е признак за дефектирало устройство или за неизчистен буфер.

    • Host  инициира комуникация, като изпраща пакетирано съобщение, съдържащо команда към Slave;
    • В зависимост от текущото си състояние Slave извършва или не исканата операция, след което задължително отговаря с пакетирано съобщение (или в някои случаи с единичен байт);
    • Host трябва да изчаква отговора от Slave преди да изпрати друго съобщение, освен ако не изминало времето за таймаут (вж. синхронизацията по време);

     

    Синхронизация по време

    • На всяка от командите идващи от Host - Slave трябва да отговори не по-късно от 60ms (при това или с пакетирано съобщение или със строго определен еднобайтов код);
    • Host има 500ms timeout за получаване на отговор от Slave;
    • Ако за 500ms не се получи никакъв отговор, Host трябва да предаде съобщението отново и при това със същия пореден номер и същата команда;
    • След два неуспешни опита, Host трябва да индицира, че или няма връзка с Slave или че има хардуерен проблем в устройството;
    • Timeout от 500ms се използва в случай, че става дума за комуникация по RS-232или USB. Ако транспортния протокол е друг (например TCP/IP) - трябва да предвидите по-голям период от време в зависимост от качеството на трасето;

    Поддръжка на нормално забавяне на отговора от страна на Slave

    В случай, че командата е такава, че Slave ще се забави с отговора си, то Slave започва да изпраща по канала байт SYN на всеки 60ms. Така Slave казва на Host, че е зает в момента, но е напълно изправен и функциониращ. Казва му да изчака още малко.

     

    Синхронизация по формат на съобщенията

     

    • Всички команди и  отговори между Host и Slave (освен описаните по-горе едно-байтови съобщения), са пакетирани в строго определен и предварително известен формат;
    • “Случайност” се допуска единствено в областта за логически данни, но мястото където се намират тези данни в пакета, както и максималния им размер са строго определени;
    • Форматите на пакетираното съобщение от Slave към Host и обратно са строго определени, но “различни”, тъй като в отговора от страна на Slave се съдържа и допълнителна информация за статуса на устройството. Дори и ако устройството няма какво да изпрати, като логически данни към Host (т.е.в областта за данни няма нищо), то въпреки това отговаря, за да може програмата (Host) да научи от статус байтовете състоянието на устройството и да провери дали няма някакъв проблем (например, че е свършила хартията);
    • В случай на проблем или шум по трасето на комуникация - напълно възможно е Slave да получи команда с грешна контролна сума (чексума). В този случай Slave отговаря с един байт NAK. С него той казва, че Host трябва да повтори съобщението си без да променя нещо в него - просто да го изпрати отново.

     

     

    Модификации на протокола

    Описаните по-долу две модификации, могат грубо да се разделят на "стар протокол" и "нов протокол". Така наречения "стар протокол", възниква по време, когато най-масовата операционна система е DOS и съществува заради нуждата от съвместимост със стари, но "живи" продукти. При втората модификация, която можем да наричаме за по-кратко "нов протокол" имаме някои съществени подобрения:

    • заделя се по-голям интервал на допустимите команди (т.е. предвижда се появата в бъдещето на нови, неописани към момента команди);
    • дава се възможността за прехвърляне на по-голям обем данни в рамките на една команда;
    • елементи на стандартизация на командите, като резултат от опита на разработчиците на софтуер и на натрупаните изисквания от страна на различни разработчици на софтуер:
      • код на грешка, като първи параметър в отговора на устройството - с общо значение за всички модели, разработени по този протокол;
      • стандартизиране на сепараторите в областта за данни;
      • заделяне на повече статус байтове в отговора от страна на Slave;

    И двата протокола са валидни и еднакво популярни, поради което ще опиша и двете модификации. Разликите са посочени в различен цвят. Стойностите са в HEX.

    • 01 (Start) - Стартиращ байт.
      • Дължина: 1 байт;
      • Стойност: 01H;
    • LEN - Дължина на съобщението. Това са броя байтове от стартиращия байт <01> (но без него) до терминатора на данни <05> (включително), плюс фиксирано отместване от 20H.
      • Стар протокол:
        • Дължина: 1 байт;
        • Стойности: от 20H до FFH;
      • Нов протокол:
        • Дължина: 2 байта (word), кодирани в 4 байта;
        • Стойности: Тъй като в този протокол възможните стойности са в интервала [0..65535] (DEC), програмата Ви трябва да попълва необходимата стойност в променлива от тип word. Всяка цифра от тези два байта се предава, като към нея се прибави 30H, в резултат на което в пакетираното съобщение за това поле ще участват четири байта. Причината за това кодиране е свързана с вътрешната реализация на проткола във фискалните устройства и не от значение. 
          • Пример: променлива със стойност 1AE3H в пакетираното съобщение се представя като четири байта със стойности съответно 31H,3AH,3EH,33H.
    • SEQ - Пореден номер на пакетираното съобщение. 
      • Slave записва същия пореден номер в отговора си;
      • Ако Slave получи съобщение със стайност на <SEQ>, същата като при последното получено от него съобщение, то той не извършва действие, а повтаря последното изпратено от него съобщение;
      • Стар протокол:
        • Стойности: от 20H до 7FH;
        • Дължина: 1 byte;
      • Нов протокол:
        • Стойности: от 20H до FFH;
        • Дължина: 1 байт;
    • CMD - Номер на командата.
      • Ако Slave получи несъществуващ или невалиден код, той отговаря с пакетирано съобщение с нулева дължина на полето за данни и вдига в единица статус бита за невалиден код на командата;
      • Когато отговаря на дадено съобщение - Slave записва същия номер <CMD> в отговора си;
      • Горната граница на стойността на допустимите команди зависи от конкретното устройство;
        • Стар протокол:
          • Дължина: 1 байт.
          • Стойности: от 20H до 7FH;
        • Нов протокол:
          • Дължина: 2 байта (word), кодирани в 4 байта;
          • Стойности: Тъй като в този протокол възможните стойности са в интервала [0..65535] (DEC), програмата Ви трябва да попълва необходимата стойност в променлива от тип word. Всяка цифра от тези два байта се предава, като към нея се прибави 30H, в резултат на което в пакетираното съобщение за това поле ще участват четири байта. Причината за това кодиране е свързана с вътрешната реализация на проткола във фискалните устройства и не от значение. 
            • Пример: променлива със стойност 1AE3H в пакетираното съобщение се представя като четири байта със стойности съответно 31H,3AH,3EH,33H.
            • Забележка: Списъка с конкретните, позволени и валидни стойности на командите за дадено фискално устройство трябва да се взема от документацията на всяко конкретно устройство. Това, че дадена стойност е възможна - не означава, че се използва или че е позволена. 
    • Data - Логически данни.
      • Форматът и дължината на областта за данни зависи от конкретната команда;
      • Ако командата не изисква изпращане на данни към Slave или съответно, ако в отговора към Host няма данни, то дължината на това поле е нула;
      • Ако при команда от Host към Slave има синтактична грешка в данните, то Slave отговаря с пакетирано съобщение с нулева дължина на полето за данни и вдига в единица статус бита за синтактична грешка;
      • Дължина (от Host към Slave): 0 - 213 байта;
      • Дължина (от Slave към Host): 0 - 218 байта;
      • Стойности: 09H, 0AH и стойностите в интервала от 20H до FFH;
    • 04 (Separator) - Сепаратор. В пакетираното съобщение от Host към Slave - това е байта, който служи за маркер, отделящ логическите данни от данните за статуса на Slave (статус байтовете).
      • Дължина: 1 байт;
      • Стойност: 04H;
    • STATUS - Полето за данни, съдържащо информация за текущото състояние на фискалното устройство. В статиите от тук нататък ще наричам байтовете от това поле: "Статус байтове";
      • Значението на всеки бит от всеки статус байт, трябва да се вземе от документацията на съответното устройство;
      • Състоянието на даден бит отговаря логически на някакво състояние на устройството. В статиите от тук нататък - ще наричам всеки такъв бит - "статус бит", а когато става дума за състоянието на даден статус ще имаме предвид стойността на съответния статус бит;
      • За съжаление е възможно позицията на даден статус да се мени при различните устройства или дори дадения статус да отсъства поради хардуерни специфики;
      • Като цяло статус битовете могат да бъдат разделени на следните групи и подгрупи:
        • такива, на които може да не се обръща внимание:
          • даден статус бит може да бъде запазен за вътрешна употреба (в зависимост от случая - може да бъде винаги със стойност 0 или 1);
          • даден статус бит може да бъде запазен за бъдеща употреба (в зависимост от случая - може да бъде винаги със стойност 0 или 1);
        • такива, на които задължително трябва да обръщате внимание:
          • Информативни статус битове - носят информация за логическо или физическо състояние на устройството. Някои операции не са позволени в дадени ситуации и поради това е добре да ги следите. Например: 
            • Ако принтера не е фискализиран - явно не може да издава фискални бележки;
            • Ако принтера няма хартия - не може да печата, каквито и да било документи;
          • Статус битове за грешка - носят обща информация за грешката, която е възникнала. Например: непозволена команда, синтактична грешка и т.н. Понякога (в стария протокол) единствения начин програмата да вземе правилно решение за разрешаване на ситуацията е да сглоби информацията от всички налични статуси в отговора от страна на Slave;
      • Стар протокол:
        • Дължина: 6 байта;
        • Стойности за всеки от байтовете: от 80H до FFH;
      • Нов протокол:
        • Дължина: 8 байта;
        • Стойности за всеки от байтовете: от 80H до FFH
    • 05 (Data terminator) - Сепаратор.
      • В пакетираното съобщение от Host към Slave - това е байта, който служи за маркер, отделящ логическите данни от останалата част на пакетираното съобщение.
      • В пакетираното съобщение от Slave към  Host - това е байта, който служи за маркер, отделящ статус данните от останалата част на пакетираното съобщение.
      • Дължина: 1 байт;
      • Стойност: 05H;
    • BCC - Контролна сума (чексума). Сумата включва стойностите от <01> без него до <05> включително. Тъй като в този протокол възможните стойности са в интервала [0..65535] (DEC), програмата Ви трябва да попълва необходимата стойност в променлива от тип word. Всяка цифра от тези два байта се предава, като към нея се прибави 30H, в резултат на което в пакетираното съобщение за това поле ще участват четири байта. Причината за това кодиране е свързана с вътрешната реализация на проткола във фискалните устройства и не от значение. 
      • Пример: променлива със стойност 1AE3H в пакетираното съобщение се представя като четири байта със стойности съответно 31H,3AH,3EH,33H.
      • Дължина: 2 байта (word), кодирани в 4 байта;
      • Стойности: от 30H до 3FH.
    • 03 (Terminator) - Байт, маркиращ края на пакетираното съобщение. 
      • Дължина: 1 byte.
      • Стойност: 03H.

     


    Ако смятате, че нещо в тази статия е некоректно, непълно или недостатъчно - моля пишете ми, за да коригирам статията.