Показать сообщение отдельно
Старый 20.06.2016, 12:30   #1
Arsie
Сотрудник Segnetics
 
Аватара для Arsie
 
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 112
Благодарил(а): 15 раз(а)
Поблагодарили: 660 раз(а) в 604 сообщениях
По умолчанию Форматы передачи "длинных" регистров MODBUS

Поводом написания данной статьи послужил тот факт, что в протоколе modbus отсутствуют такие типы данных, как 32-хразрядное целое и 32-хразрядное число с плавающей точкой.

Стандарт modbus определяет только передачу битов и 16-разрядных регистров. Поэтому производители различных устройств передают другие типы данных так, как кажется удобным именно этому производителю.

Нам было удобно сделать так:

FLOAT и LONG побайтно передаются в порядке 3-4-1-2, т.е. число LONG, равное 08403020h передаётся как 30h.20h.08h.40h

Tx: [8] 01 04 A0 08 00 02 D2 09

Rx: [9] 01 04 04 30 20 08 40 F3 7E

------------------

INT передаются в обычном для modbus виде. Т.е. 0064h передаётся как 00h.64h

Tx: [8] 01 04 A0 8B 00 01 63 E0

Rx: [7] 01 04 02 00 64 B8 DB

------------------

То же самое касается статусов и койлов - всё как и должно быть в modbus.

------------------

Для облегчения взаимопонимания со сторонними устройствами нами были написаны следующие алгоритмы по "перевороту байтов":

Выделение старшего слова и младшего слова (HIGH и LOW) из переменной типа LONG: http://forum.segnetics.com/showthread.php?t=736

Переворот байтов внутри FLOAT: http://forum.segnetics.com/showthread.php?t=461


__________________
Программа делает то что написал программист, а не то что он хотел.

Добро всегда побеждает зло. Кто победил - тот и добрый.
Arsie вне форума   Ответить с цитированием