Обсуждение:Modbus

Материал из Wiren Board

Нестандартная адресация

В документации на некоторые, особенно старые, устройства адреса элементов (регистров) указываются в формате, не соответствующем стандарту. В этом формате тип элемента кодируется первой цифрой адреса, а адресация начинается не с нуля.
Например, регистр хранения с адресом 0 может записываться как 40001 или 400001, а Coil с адресом 0 как 000001.

Вообще-то стандартная – это как раз начиная с единицы (а не с нуля) – читайте стр.7 спецификации https://modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf

4.4 MODBUS Addressing model 
The MODBUS application protocol defines precisely PDU addressing rules. 
In a MODBUS PDU each data is addressed from 0 to 65535. 
It also defines clearly a MODBUS data model composed of 4 blocks that comprises several elements numbered from 1 to n.   
In the MODBUS data Model each element within a data block is numbered from 1 to n. 
Afterwards the MODBUS data model has to be bound to the device application (IEC-61131 object, or other application model).  
The pre-mapping between the MODBUS data model and the device application is totally vendor device specific. 

Так же этот факт получил отражение в рис.8 на стр.8 – мне эта «кривость» стандарта тоже не нравится, но это ещё не повод подменивать понятия и называть чёрное белым ¯\_(ツ)_/¯ SiMM (обсуждение) 16:04, 10 ноября 2023 (MSK)

Адреса регистров

Адресные пространства регистров, также называемые таблицами или блоками, могут быть различны для всех четырёх типов регистров. Это значит, что значения регистров с одинаковым адресом, но разным типом, в общем случае разные.

Это называется «модель данных с раздельными блоками» (см. рис. 6 на стр.6 спецификации https://modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf ), в отличии от «модели данных с одним блоком» (см. рис.7 на стр. 7). SiMM (обсуждение) 16:42, 10 ноября 2023 (MSK)

Структуры данных Modbus

В Modbus принято кодировать адреса и данные в формате big-endian, то есть в формате, когда байты следуют, начиная со старшего: например, при передаче шестнадцатеричного числа 0x1234 сначала устройством будет принят байт 0x12, а затем — 0x34. Для передачи данных другого типа, например, чисел с плавающей запятой (float), текстовых строк, даты и времени суток и т.п. производитель может выбрать свой собственный способ кодирования — для расшифровки получаемых данных важно ознакомится со спецификацией производителя устройства.

Кмк, не мешало бы акцентировать внимание на том, что иной выбор производителя (например, формат Intel вместо Motorola) не соответствует спецификации – см. стр.5 https://modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf :

4.2 Data Encoding 
• MODBUS uses a ‘big-Endian’ representation for addresses and data items. This means that when a numerical quantity larger than a single byte is transmitted, the most significant byte is sent first. So for example 
Register size value 
16 - bits 0x1234 the first byte sent is 0x12 then 0x34 
☞ Note: For more details, see RFC 791, Internet Protocol, Sep 81 DARPA.

Самое смешное при этом – CRC этому стандарту не соответствует и передаётся младшим байтом вперёд (см., например, рис.12 на стр.13 спецификации https://modbus.org/docs/Modbus_over_serial_line_V1_02.pdf ). SiMM (обсуждение) 16:23, 10 ноября 2023 (MSK)