modbus通讯协议执行标准(ModBus通讯协议及应用)
modbus通讯协议执行标准(ModBus通讯协议及应用)③ 00 00 :寄存器起始地址① 01:ID② 03:功能码 帧定界 :MODBUS RTU方式下,每两个字符之间发送或者接收的时间间隔不能超过1.5倍 字符传输时间。如果两个字符时间间隔超过了3.5倍的字符传输时间,规约就认为一帧数据已经接收,新的一帧数据传输开始;(1).RTU模式-消息帧举例:×发送指令:01 03 00 00 00 02 C4 0B
1、Modbus协议介绍ModBus协议规约
Modbus是由Modicon(现为施耐德电气公司的一个品牌)在1979年发明的,是全球第一个真正用于工业现场的总线协议。
Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。
ModBus网络只有一个主机,所有通信都由他发出。网络可支持247个之多的远程从数控制器,但实际所支持的从机数要由所用通信设备决定。采用这个系统,各PC可以和中心主机交换信息而不影响各PC执行本身的控制任务。
2、ModBus传输方式帧定界 :MODBUS RTU方式下,每两个字符之间发送或者接收的时间间隔不能超过1.5倍 字符传输时间。如果两个字符时间间隔超过了3.5倍的字符传输时间,规约就认为一帧数据已经接收,新的一帧数据传输开始;
(1).RTU模式-消息帧举例:
×发送指令:01 03 00 00 00 02 C4 0B
① 01:ID② 03:功能码
③ 00 00 :寄存器起始地址
④ 00 02 :读取寄存器的长度
⑤ C4 0B:16 CRC校验,低位在前,高位在后;
×回复数据:01 03 04 26 8F 41 DD 30 99
① 01:ID
② 03:功能码
③ 04:数据长度
④ 26 8F 41 DD:41dd268f数据为27.64 数据类型浮点型(Floating Point)
⑤ 30 99:16 CRC校验,低位在前,高位在后
(2).ASCII模式
帧定界“:”帧起始 “CR LF” 帧结束,ASCII方式用两个ASCII字符表示一个8位数据,比如16进制的3A用字符“3”和字符“A”表示。
ASCII模式---消息帧举例
发送指令:
3A 30 31 30 33 30 30 30 34 30 31 06 0D OA
转化成十六进制就是“:0103000401 06”,“ : ”表示起始位,01是分机地址,03是功能命令,0004寄存器起始地址;01寄存器长度,
06是LRC校验
回复数据:3A 30 31 30 33 30 32 30 31 46 34 30 35 0D 0A
转化成十六进制就是 ":01030201 F405" ," : "表示起始位,01是分机地址,03是功能命令, 02是数据字节数,01F4就是500这个数据,05是LRC校验。
(3). MODBUS TCP
Modbus数据在TCP/IP以太网上传输,支持Ethernet II和802.3两种帧格式,Modbus TCP数据帧包含报文头、功能代码和数据3部分,MBAP报文头(MBAP、Modbus Application Protocol、Modbus应用协议)分4个域,共7个字节,如图所示:
由于使用以太网TCP/IP数据链路层的校验机制而保证了数据的完整性,MODBUS TCP 报文中不再带有数据校验”CHECKSUM”,原有报文中的“ADDRESS”也被“UNIT ID”替代而加在MODBUS应用协议报文头中。
MODBUS TCP-消息帧举例
发送命令:19 B2 00 00 00 06 06 03 00 27 00 02
上面是modbus客户端发出的报文内容,为modbus tcp/ip协议格式,其前面的六个字节为头字节( header handle);
19 B2 00 00 00 06
19 B2 两个字节是Client发出的检验信息,Sever端只是需要将这两个字节的内容copy以后再放到response的报文的相应位子就可以了
00 00 两个字节是表示tcp/ip 的协议的modbus的协议;
00 06 两个字节表示的是header handle后面还有多长的字节,即表示的是该字节以后的字节长度(lengch) 可以看到在00 06后面还有 “06 03 00 27 00 02”六个字节,所以这两个字节表示的就是6;
PDU:“06 03 00 27 00 02”
06 一个字节表示slave address;
03 为Fuction code ;
00 27 表示Client request的寄存器地址;
00 02 表示request 寄存器的长度;(寄存器个数)
3、Modbus协议应用我们目前所支持的功能码非常有限,主要包括:
功能码 |
名称 |
备注 |
01 |
READ COIL STATUS |
读线圈寄存器 |
02 |
READ INPUT STATUS |
读状态寄存器 |
03 |
READ HOLDING REGISTERS |
都保持寄存器 |
04 |
READ INPUT REGISTERS |
读输入寄存器 |
05 |
FORCE SINGLE COIL |
写单个线圈寄存器 |
06 |
PRESET SINGLE REGISTER |
写单个保持寄存器 |
15 |
FORCE MULTIPLE COILS |
写多个线圈寄存器 |
16 |
FORCE MULTIPLE REGISTERS |
写多个保持寄存器 |
举例一:读取寄存器状态
功能码: 01
数据起始地址:00001~00008
数据长度:不大于08 (因为只有8个输出继电器)
说明:读取输出继电器的状态。
数据说明:
地址 |
描述 |
说明 |
00001 |
第1个输出继电器 |
=1吸合 =0断开 |
00002 |
第2个输出继电器 |
=1吸合 =0断开 |
00003 |
第3个输出继电器 |
=1吸合 =0断开 |
00004 |
第4个输出继电器 |
=1吸合 =0断开 |
00005 |
第5个输出继电器 |
=1吸合 =0断开 |
00006 |
第6个输出继电器 |
=1吸合 =0断开 |
00007 |
第7个输出继电器 |
=1吸合 =0断开 |
00008 |
第8个输出继电器 |
=1吸合 =0断开 |
Modbus请求:01 01 00 00 00 08 3D CC
Modbus响应:01 01 08 00 00 00 00 00 00 00 00 34 1D
4、ModBus使用工具1.Modscan—主要用来模拟主设备发送指令
2.Modsim----模拟从设备回复数据
3.串口调试工具