Биржевые курсы
00.00
00.00

Протокол обмена

Протокол обмена с приборами ОАО «Практик-НЦ» и ЗАО «Эксис»  
В этом разделе Вы можете найти информацию о протоколе обмена с приборами производства ОАО «Практик-НЦ» и ЗАО «Эксис». 

Внимание! Разработана новая библиотека обмена EksisExchange.dll. Поддержка старой прекращена. Ссылка на старую оставлена ради примеров использования. Документация внутри архивов. В архиве версии для x86 и x64 систем. 


Описание протокола обмена RS-232

Протокол обмена строится по принципу ведущий – ведомый в полудуплексном режиме. Прибор всегда является ведомым устройством. Ведущее устройство (компьютер, блок индикации или пр.) формирует команду – запрос, а прибор – ответ. Время ожидания ответа не более 300 мс. Обмен осуществляется 10-ти битными словами, каждое из которых состоит из: 1 старт – бит, 1 стоп – бит, 8 информационных бит. Восемь информационных бит слова составляют символ. Скорость обмена варьируется от 1200 до 115200 бит/с в зависимости от прибора. Для обмена используются ASCII символы: $,!, 0...9, A...F, I, R, <0D>. Форматы запросов и ответов стандартизованы и приведены ниже. Принцип обмена строится на чтение параметров по определенным адресам в измерительном устройстве. Команды записи и настройки устройств нами не предоставляются. 

Формат запроса:  {$}[Addr][Cmd]([DataAddr])([DataLen])([Data])[ch]<0D> 

Формат ответа:  {!}[Addr][Cmd]([Data])[ch]<0D> {?}[Addr][Cmd][ch]<0D> 

Условные обозначения: 

В скобках {} указазаны передаваемые символы в явном виде, в скобках <> указаны коды передаваемых символов, в скобках [] — условные обозначения параметров, в скобках () указаны параметры, которые присутствуют в зависимости от команды запроса. 

$ — зарезервированный символ начала посылки ведущего устройства; 

! — зарезервированный символ начала посылки ведомого устройства в случае верного выполнения команды; 

? — зарезервированный символ начала посылки ведомого устройства в случае ошибки выполнения команды; 

[Addr] — адрес устройства (4 символа), четырехразрядное шестнадцатеричное число, каждая цифра которого передается текстовым ASCII – символом, все приборы помимо основного адреса задаваемого пользователем имеют служебный — FFFF; 

[Cmd] — команда, 2 символа; 

[DataAddr] — адрес данных (4 символа), четырехразрядное шестнадцатеричное число, каждая цифра которого передается текстовым ASCII – символом; 

[DataLen] — длина данных (2 символа), двухразрядное шестнадцатеричное число, каждая цифра которого передается текстовым ASCII – символом; 

[Data] — данные, каждый байт передаётся 2-мя символами; 

[ch] — контрольная сумма (2 символа), двухразрядное шестнадцатеричное число, каждая цифра которого передается текстовым ASCII – символом. Контрольная сумма вычисляется сложением по модулю 256 всех предыдущих кодов ASCII – символов посылки; 

<0Dh> — зарезервированный символ окончания посылки (1 байт), имеющий шестнадцатеричный код 0Dh. Для ведущего и ведомого устройств символы конца посылки совпадают. 

Описание формата данных: 

Unsigned char — целое беззнаковое число, 1 байт, согласно ANSI Unsigned short char. Передается с помощью двух текстовых ASCII – символов. Байт числа разбивается на два нибла, каждый из которых передается шестнадцатеричной цифрой в кодировке текстовых ASCII – символов. Первым передается старший нибл. Порядок передачи байт обратный. Например, число 40h (64) передается ASCII - символами в следующем порядке: 4, 0; 

Unsigned int — целое беззнаковое число, 2 байта, согласно ANSI Unsigned short int. Передается с помощью четырех текстовых ASCII – символов. Каждый байт числа разбивается на два нибла, каждый из которых передается шестнадцатеричной цифрой в кодировке текстовых ASCII – символов. Первым передается старший нибл. Порядок передачи байт обратный. Например, число 1234h (4660) передается ASCII - символами в следующем порядке: 3, 4, 1, 2; 

Float — число с плавающей запятой, 4 байта, согласно ANSI Float. Передается с помощью восьми текстовых ASCII – символов. Каждый байт числа разбивается на два нибла, каждый из которых передается шестнадцатеричной цифрой в кодировке текстовых ASCII – символов. Первым передается старший нибл. Порядок передачи байт обратный. Например, число 1.23 (3F9D70A4h) передается ASCII - символами в следующем порядке: A, 4, 7, 0, 9, D, 3, F.


Примеры: 

Чтение температуры (Float) из ИВТМ-7Н 

Запрос: $ 0001 RR 0000 04 AD 0D [Addr] = 0001, [Cmd] = RR, [DataAddr] = 0000, [DataLen] = 04, [ch] = AD. 

Ответ: ! 0001 RR 0000 A041 B2 0D [Addr] = 0001, [Cmd] = RR, [Data] = 41 А0 00 00 (20,0 гр. Ц.), [ch] = B2. 


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

Измерители определяются операционной системой как HID-устройство. Обмен ведется по каналу Control Transfers посредством Feature Reports блоками до 128 байт со скоростью до 64000 байт в секунду. Точный размер передаваемого блока (заголовок + данные + контрольная сумма) устройство передаёт в своихHID device capabilities (HidP_GetCaps).
Данные передаются в неизменном бинарном виде. Логически обмен данными построен схожим с обменом по RS-232 способом: чтение и запись данных производится по определенным адресам в измерительном устройстве, а каждая модификация измерителя имеет свою карту адресов по которым осуществляется обмен, попытки доступа к адресам вне данной карты воспринимаются как ошибочные и соответствующим образом сигнализируются в ответах.

Формат запроса: [Addr][Cmd]([DataLen])([Data])[CheckSum]
Формат ответа: [Result]([DataLen])([Data])[CheckSum] - успех, либо <0xFF>[Cmd][CheckSum] - ошибка

Условные обозначения:

В скобках <> указаны коды передаваемых символов, в скобках [] — условные обозначения параметров, в скобках () указаны параметры, которые присутствуют в зависимости от команды запроса.
[Result] — результат выполнения запроса, 1 байт:
0x00 — команда выполнена успешно;
0xFE — устройство не готово, повторите запрос позже;
0xFF — ошибки выполнения команды;
[Addr] — адрес данных, 4 байта;
[Cmd] — команда, 1 байт;
[DataLen] — длина данных, 1 байт;
[Data] — двоичные данные;
[CheckSum] — контрольная сумма (1 байт), вычисляется сложением по модулю 256 всех байт пакета (начальное значение контрольной суммы 0xFF);

Для правильной отправки Feature Report требуется установка размера буфера в соответствии с HID device capabilities.

Команды и примеры построения запросов по USB:

Команды чтения (байт):
0х80 — команда чтения данных из ОЗУ (как правило для текущих значений измерений);
0х82 — команда чтения данных из ПЗУ настройки  (как правило для настроек прибора);
0х81 — команда чтения данных из ПЗУ статистики;

Команды записи (два символа):
0х00 — команда записи данных в ОЗУ;
0х02 — команда записи данных в ПЗУ настройки;
0х01 — команда записи данных в ПЗУ статистики;

Пример чтения влажности (данные в формате Float) из ИВТМ-7 Р-03-Д
Запрос:  00000000 80 04 83
[Addr] = адрес читаемой памяти (0x00000000);
[Cmd] = команда (0x80);
[DataLen] = количество читаемых байт (0x04);
[CheckSum] = контрольная сумма всей посылки (0xFF + 0x00 + 0x00 + 0x00 + 0x00 +  0x80 + 0x04 mod 0x100 = 0x83 )
Ответ: 00 04 0000A041 E0
[Result] = 0x00 (признак успешного выполнения команды);
[DataLen] = количество байт данных в ответе (4);

[Data] = 41 А0 00 00 (0x41A00000 = 20,0 %)
[CheckSum] = контрольная сумма данных (0xFF + 0x04 + 0x00 + 0x00 + 0xA0 + 0x41 = 0xE0).

Команда получения идентификационной строки устройства: 0x8F. Пример:
Запрос: 00000000 8F 00 8E
[Addr] = адрес читаемой памяти (0x00000000);
[Cmd] = команда (0x8F);
[DataLen] = количество читаемых байт (0x00);
[CheckSum] = контрольная сумма всей посылки (0xFF + 0x00 + 0x00 + 0x00 + 0x00 +  0x8F + 0x04 mod 0x100 = 0x8E )

Ответ: 00 34 C84254CC2D37D02D30332072322E3131203130303834353633205649443D33343132205049443D313030332045414C3D30303031 28

[Result] = 0x00 (признак успешного выполнения команды);
[DataLen] = количество байт данных в ответе (52);

[Data] = C842...31 ("ИBTМ-7Р-03 r2.11 10084563 VID=3412 PID=1003 EAL=0001")

Технологический номер в разных приборах может находится на разных позициях, но всегда имеет 8 цифр.

[CheckSum] = 0x28