Modbus通信协议

1. 什么是Modbus?

  1. Modsbu是一种串行通信协议是Modicon公司 于1979年为使用可编程控制器(PLC)通信而发表的一个通信协议。
  2. 属于公开的协议 无版权要求。
  3. Modbus协议可以在串口(RS232 RS485)、以太网(TCP)上面去跑,它是一个应用层协议。
  4. Modbus协议的架构是 主从通信Master/Slave
  5. Modbus是工业通信的协议标准,不限品牌、PLC、变频器、伺服、传感器、运动控制器等等。
  6. Modbus模式
    • ModbusRtu采用紧促的二进制通信,CRC校验,使用的是最多的协议,通信效率高,必须要实现的
    • ModbusAscii 采用可读的Ascii码进行通信,LRC算法校验,虽然有些产品支持这个协议,但不是必须要实现的
    • ModbusTCP 采用以太网TCP进行二次封装,去掉了数据校验部分,它是可靠的连接。

2. Mobus数据区

  1. Coil:1个二进制位,ON或OFF,主要用来表示数字量的输出位或者内部的bit位,有效范围是1-9999或者1-65535
  2. InputStatus:1个二进制位,ON或OFF,主要用来表示数字量的输入位,有效范围是10001-19999或者100001-165535
  3. InputRegister:16位的寄存器,可读,主要用来做输入寄存器(PLC的模拟量输入的映射),有效范围是30001-39999或者300001-365535。
  4. HoldingRegister:16位的寄存器,可读可写,主要用来做内部寄存器或者说输出寄存器的映射,有效范围是40001-49999或者400001-465535。

其中0xxxx,10001、30001、40001,没有物理地址的意义。协议地址是从0开始。

3. 大端小端

比如存数据 0x1234内存存储顺序(从小到大)
内存地址 0x00 0x01
大端存储 0x12 0x34 高字节保存在低地址
小端存储 0x34 0x12 高字节保存在高地址
主要和CPU的架构有关 比如x86架构一般是小端模式 当然也可以通过程序去转换

C#小端模式
Modbus报文数据区采用大端模式

4. ModbusRtu组成

ADU 组成应用数据单元 地址+功能码+数据+校验
PDU 组成协议数据单位 功能码+数据
RS232和RS485为主 ADU=256字节 =地址(1个字节)+功能码数据(253个字节)+CRC(2个字节)

5. 功能码

5.1 01功能码 读线圈

发送ADU 站地址+01+起始地址(高8位低8位)+线圈数量(高8位低8位)+CRC校验(低8位高8位)
响应ADU 站地址+01+字节数+内容+CRC校验(低8位高8位)
返回内容字节数=线圈数量除以8 ,如果不能整除有余数则字节数量再加1,没有用到的位用0补齐。
异常ADU 站地址+0x81+异常码
后面用H来表示高8位
后面用L来表示低8位
一般一次性可以读2000个开关量状态,但是实际的数量要根据从站的限制来设定。

5.2 02功能码 读输入

发送ADU 站地址+02+起始地址(高8位低8位)+输入数量(高8位低8位)+CRC校验(低8位高8位)
响应ADU 站地址+02+字节数N+内容+CRC校验(低8位高8位)
返回内容字节数=输入数量除以8 ,如果不能整除有余数则字节数量再加1,没有用到的位用0补齐。
一般一次性可以读2000个开关量状态,但是实际的数量要根据从站的限制来设定。
异常ADU 站地址+0x82+异常码+CRC校验(低8位高8位)

5.3 03功能码 读保持寄存器

发送ADU 站地址+03+起始地址(高8位低8位)+读取字的数量(高8位低8位)+CRC校验(低8位高8位)
响应ADU 站地址+03+读取字节数 内容(高8位低8位)…+CRC校验(低8位高8位)
读取数量 一般情况下是支持125个字,但是实际的数量要根据从站的限制来设定。
异常ADU 站地址+0x83+异常码+CRC校验(低8位高8位)

5.4 04功能码 读输入寄存器

发送ADU 站地址+04+起始地址(高8位低8位)+读取字的数量(高8位低8位)+CRC校验(低8位高8位)
响应ADU 站地址+04+读取字节数 内容(高8位低8位)…+CRC校验(低8位高8位)
读取数量 一般情况下是支持125个字,但是实际的数量要根据从站的限制来设定。
异常ADU 站地址+0x84+异常码+CRC校验(低8位高8位)

5.5 05功能码 写线圈状态

发送ADU 站地址+05+线圈地址(高8位低8位)+线圈状态(高8位 低8位)+CRC校验(低8位高8位)
接收ADU 站地址+05+线圈地址(高8位低8位)+线圈状态(高8位 低8位)+CRC校验(低8位高8位)
异常ADU 站地址+0x85+异常码+CRC校验(低8位高8位)

5.6 06功能码 写保持寄存器

发送ADU 站地址+06+寄存器地址(高8位低8位)+寄存器值(高8位 低8位)+CRC校验(低8位高8位)
接收ADU 站地址+06+寄存器地址(高8位低8位)+寄存器值(高8位 低8位)+CRC校验(低8位高8位)
异常ADU 站地址+0x86+异常码+CRC校验(低8位高8位)

5.7 (0x0f)功能码 写从起始地址开始的连续线圈状态

发送ADU 站地址+0xf+起始线圈地址(高8位低8位)+线圈的数量(高8位 低8位)+线圈的字节数N+内容+CRC校验(低8位高8位)
接收ADU 站地址+0xf+起始线圈地址(高8位低8位)+线圈的数量(高8位 低8位)+CRC校验(低8位高8位)
异常ADU 站地址+0x8f+异常码+CRC校验(低8位高8位)
线圈的字节数N=线圈的数量/8 如果不能整除有余数则字节数量再加1,没有用到的位用0补齐

5.8 (0x10)功能码 写从起始地址开始的连续保持寄存器

发送ADU 站地址+0x10+起始寄存器地址(高8位低8位)+寄存器的数量(高8位 低8位)+寄存器的字节数N+内容+CRC校验(低8位高8位)
接收ADU 站地址+0x10+起始寄存器地址(高8位低8位)+寄存器的数量(高8位 低8位)+CRC校验(低8位高8位)
异常ADU 站地址+0x90+异常码+CRC校验(低8位高8位)

© 版权声明
THE END
点赞1 分享
和此文作者聊聊 抢沙发

    暂无评论内容