Modbus协议
概述
Modbus是全球第一个真正用于工业现场的总线协议。Modbus网络是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。其系统结构既包括硬件、亦包括软件。它可应用于各种数据采集和过程监控。 现在Modbus支持串行链路和以太网链路两种硬件形式,从协议上说有Modbus RTU、Modbus ASCII、Modbus TCP。现在用的最多的就是基于串行链路的Modbus RTU和基于以太网的Modbus TCP两种。在国标中规定,在串行链路上,Modbus RTU协议是默认项,而Modbus ASCII为可选项。
Modbus协议说明
包字节顺序都是按照高位在前,低位在后(大端模式) Unit 1Byte设备码,1byte功能码,N数据, RTU 2byteCRC(小端) 网络 6Byte包头
网络6Byte包头 2byte包计数(小端),2byte协议(置0),2byte数据段长度
Unit 1byte设备码,1-255范围 1byte功能码,
功能码 | 描述 |
---|---|
1 | 读取01,DO |
2 | 读取02,DI |
3 | 读取03,AO |
4 | 读取04,AI |
5 | 写入单个01,DO |
6 | 写入单个03,AO |
15 | 写入多个01,DO |
16 | 写入多个03,AO |
N数据可归类为读取,单次写,多次写 1.读取时发送请求包unit结构:
设备码 | 功能码 | 起始地址 | 寄存器(2byte)个数M |
---|---|---|---|
1byte | 1byte | 2byte | 2byte |
正常回复
设备码 | 功能码 | 数据段字节个数N | 数据段字节 |
---|---|---|---|
1byte | 1byte | 1byte | N个byte |
1,2数据表时存在 (M 7)/8 = N 3,4数据表时存在M*2=N
异常回复
设备码 | 功能码F | 错误码E |
---|---|---|
1byte | 1byte(F | 0x80) |
E错误码情况 01 所请求的数据表不存在 02 读溢出(起始地址 长度找不到)
- 单个写
设备码 | 功能码 | 起始地址 | 目标寄存器的设置值 |
---|---|---|---|
1byte | 1byte | 2byte | 2byte |
回复帧
设备码 | 功能码 | 起始地址 | 目标寄存器的设置值 |
---|---|---|---|
1byte | 1byte | 2byte | 2byte |
异常回复(同上异常回复)
3.多个写
设备码 | 功能码 | 起始地址 | 寄存器个数n | 数据byte长度 | 数据byte |
---|---|---|---|---|---|
1byte | 1byte | 2byte | 2byte | 1byte | Nbyte |
其中,当寄存器个数为n时,对应的数据长度的byte长度为: 当为1,2表时,所占用字节数为: (n 7)/8 当为3,4表时,所占字节数为: n*2
正常回复
设备码 | 功能码 | 起始地址 | 寄存器个数n |
---|---|---|---|
1byte | 1byte | 2byte | 2byte |
异常回复(同上异常回复)
网络Modbus TCP 6byte包头 ModbusUnit
包计数(小端) | 协议 | Unit部分的字节数 | Modbus-unit部分 |
---|---|---|---|
2byte | 2byte协议(置0) | Nbyte | Nbyte |
数据转换 float 3.14 mem 0xF5C3 0x4048 mem C3 F5 48 40
大端数据 大端传输 transfer 40 48 F5 C3 convert 1 C3 F5 48 40
小端数据 传输 C3 F5 48 40
大端swap 传输 48 40 C3 F5 uint8[] convert 1 0x4048 0xF5C3 uint16[] 0xF5C3 0x4048 C3 F5 48 40 UINT8[]
小端swap 传输 F5 C3 40 48 convert1 48 40 c3 f5 0x4048 0xf5c3 0xf5c3 0x4048
libmodbus中文手册详解
https://blog.csdn.net/qq_23670601/article/details/82155378
Libmodbus Manual Page
https://libmodbus.org/docs/v3.1.4/
工业控制系统安全之——Modbus学习笔记
https://cloud.tencent.com/developer/article/1045841 Modbus协议中涉及到DI、DO、AI、DO四张表
控制数据四种型式:
- DI:DigitalInput(数字输入,离散输入),一个地址一个数据位,用户只能读取它的状态,不能修改。以一个 bit表示 On/Off,用来记录控制信号的状态输入,例如:开关,接触点,马达运转,超限switch…等等。于PLC上被称为Input relay、input coil等。
- DO:DigitalOutput(数字输出,线圈输出),一个地址一个数据位,用户可以置位、复位,可以回读状态。以一个 bit表示 On/Off,用来输出控制信号,以激活或停止马达,警铃,灯光…等等。于PLC上被称为Output relay、Output coil等。
- AI:Analog Input(模拟输入,输入寄存器),一个地址16位数据,用户只能读,不能修改,,以16 bits integer表示一个数值,用来记录控制信号的数值输入,例如:温度、流量、料量、速度、转速、文件板开度、液位、重量…等等。于PLC上被称为Input register。
- AO:AnalogOutput(模拟输出,保持寄存器),一个地址16位数据,用户可以写,也可以回读,以16 bits integer表示一个数值,用来输出控制信号的数值,例如:温度、流量、速度、转速、文件板开度、饲料量…等等设定值。于PLC上被称为Output register、Holding register。
Modbus-TCP和Modbus-RTU的区别:http://www.szyuanhao.com/news/573.html
Modbus rtu和Modbus tcp两个协议的本质都是MODBUS协议,都是靠MODBUS寄存器地址来交换数据;但所用的硬件接口不一样,Modbus RTU一般采用串口RS232C或RS485/422,而Modbus TCP一般采用以太网口。现在市场上有很多协议转换器,可以轻松的将这些不同的协议相互转换 如:Intesisbox可以把modbus rtu转换成Modbus tcp 实际上Modbus协议包括ASCII、RTU、TCP。 标准的Modicon控制器使用RS232C实现串行的Modbus。Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和就答的方式,数据通讯采用Maser/Slave方式。Modbus的TCP协议规定了消息、数据的结构、命令和应答的方式,数据通讯采用Server/Client的方式。
Modbus协议需要对数据进行校验,串行协议中除有奇偶校验外,ASCII模式采用LRC校验,RTU模式采用16位CRC校验. ModbusTCP模式没有额外规定校验,因为TCP协议是一个面向连接的可靠协议。
TCP和RTU协议非常类似,只要把RTU协议的两个字节的校验码去掉,然后在RTU协议的开始加上5个0和一个6并通过TCP/IP网络协议发送出去即可。