蒋智昊的博客

Modbus

Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。

 

一、Modbus RTU

RTU协议中的指令由地址码(一个字节),功能码(一个字节),起始地址(两个字节),数据(N个字节),校验码(两个字节)五个部分组成。数据由数据长度(两个字节,表示的是寄存器个数,假定为M)和数据正文(M乘以2个字节)组成。

读保持型寄存器(功能码03)

Tx(发送):01 03 00 00 00 0A C5 CD
从站地址(01)+ 功能码(03)+ 起始地址(00 00)+ 寄存器数量(00 0A)+ CRC(C5 CD)
Rx(接收):01 03 14 00 37 00 2C 00 21 00 0A 00 00 00 00 00 00 00 00 00 00 00 00 7C CC
从站地址(01)+ 功能码(03)+ 字节数量(14)+ 字节状态(00 37 00 2C 00 21 00 0A 00 00 00 00 00 00 00 00 00 00 00 00)+ CRC(7C CC)

字节数量 14(16进制)相当于 20(10进制)

二、Modbus TCP

Tx(发送):00 00 00 00 00 06 01 03 00 00 00 04

byte[0] byte[1] :消息号

byte[2] byte[3] :modbus标识

byte[4] byte[5] :表示排在byte[5]后面所有字节的个数,也就是总长度。

byte[6] :站号

byte[7] :功能码

byte[8] byte[9]:起始地址

byte[10] byte[11] :指定想读取的数据长度,比如我们就想读取地址0的一个数据,这里就写 00 01,如果我们想读取地址0-999共计一个数据的长度,就写 03 E8。


Rx(接收):03 1A 00 00 00 05 01 03 02 00 16

byte[0] byte[1] :消息号

byte[2] byte[3] : modbus标识

byte[4] byte[5] :表示排在byte[5]后面所有字节的个数,也就是总长度。

byte[6] : 站号

byte[7] :功能码

byte[8] :指示byte[8]后面跟随的字节个数。

byte[9] byte[10] :真实的数据

三、Modbus的功能码

1、C#基于NModbus读取long大端小端ABCD的特殊处理

2、Linux arm libmodbus 交叉编译

发表回复

您的电子邮箱地址不会被公开。