一、Modbus协议简介
Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。
传统Modbus 是一个请求/应答协议,由于485为单工,1个服务器为主,多个客户机为从,从设备只能应答。
Modbus消息桢包括RTU、ASCII、TCP。RTU、ASCII消息桢用于异步串行传输通信。TCP消息桢应用于网络传输通信(本文暂不考虑)。
ASCII模式:消息以冒号字符(:对应ASCII码3aH)开始,以回车换行符(CR,LF对应ASCII码0dH,0aH)结束。其它域可以使用的传输字符是十六进制的0…9,a…f。(H表示16进制hex)
RTU模式:以RTU模式在Modbus总线上进行通讯时,信息中的每8位字节分成2个4位16进制的字符,每个信息必须连续传输。
例:写出设备地址0x02、功能代码0x01、数据0x13的ASCII模式和RTU模式通用消息帧:
RTU:0x02 0x01 0x13 0x_crc___(CRC结尾)
ASCII:0x3a 0x30 0x32 0x30 0x31 0x31 0x33 0x_lrc_ 0x0d 0x0a(回车换行符结尾)
注:Modbus RTU由于没有起始和结束字符,故需要再传输时填充大于3.5个字符的数据以此来隔开报文。
ASCII和RTU没有优劣,只是应用场景不同:
二、Modbus RTU命令
开关量:开关量只有两种状态,0、1,包括开入量和开出量,反映的是状态。(某个电灯的开关,对应MODBUS线圈中一位)
模拟量:模拟量是连续的量,数字量是不连续的。反映的是电量测量数值(如电流、电压)(电灯当前电流测量值,对应MODBUS中的寄存器)
1.读写线圈(开关量控制及状态返回)
- 功能码01
下图为一个典型的Modbus主从控制电路,PC为Master,MCU为Slave。 MCU通过线圈继电器来控制外部电路中的开关,同时通过光耦原件监测灯泡附近的电势,并实现与外部电路的相互隔离。
PC发送01命令时MCU根据线圈的状态对主机回复。
PC发送05命令时MCU通过控制线圈中的电流大小,从而控制外部电路中的开关开闭。
PC发送02命令时MCU通过读取光耦原件返回的电信号,从而对主机进行输入状态的回复。
2.读写寄存器(数值给定设置及测量结果返回):对电灯设定电灯功率,接收当前电灯实际功率。
- 功能码03/04(03是读保持寄存器,04是读输入寄存器)
- 功能码10
10用于写多个寄存器。
Modbus功能码表完全版如下: