1、概论
Modbus是一种串行通信协议,由于其协议简单易用,且没有版权要求,目前已经成为工业领域通信协议的实时标准。ModBus协议是又施耐德电气的前身Modicon公司在1979年提出的。Modbus目前有两个主要版本 ModBus串口,MODBUS TCP/IP。ModBus 串口又有两个变种:Modbus RTU是一种紧凑的,采用二进制表示数据的方式,Modbus ASCII是一种人类可读的,冗长的表示方式。还有一种扩展协议MODBUS PLUS(Modbus+或者MB+),不过此协议是Modicon专有的一种高速令牌传递网络,和Modbus不同,它需要一个专门的协处理器来处理类似HDLC的高速令牌旋转。下图说明ModBus协议规范和现有协议的关系从图可以看出,Modbus是基于现有OSI 网络模型上的应用协议。
Modbus 协议和 ISO/OSI 模型 具体情况
2、ModBus的应用场景
ModBus协议可以解决工厂不同种类设备的数据采集问题,使得我们可以通过采集的数据随时监控工厂的运行情况。MODBUS 协议允许在各种网络体系结构内进行简单通信,它的常见体系结构图如下。
HMI代表人机界面,PLC是工厂常用的采集设备,工厂中的各类PLC,I/O数据接口,驱动器设备可以通过各类Modbus协议采集它的数据,并且不同Modbus协议网络之间还可以通过网关进行数据交换。
3、Modbus协议内容介绍
3.1 Modbus 网络形式和协议
在介绍Modbus网络之前首先介绍一下Modbus网络上传输的是什么?和其他协议类似,Modbus协议最基本的通信单位是帧,整个Modbus帧又被称之为应用数据单元(ADU),ADU中又包含了协议数据单元(PDU)用于传真正需要传输的数据。
Modbus协议是一个主/从架构的协议。在同一个Modbus网络中同一时刻只有一个节点是主(master)节点,其他使用Modbus协议参与通信的节点是从(slave)节点,从节点的最大编号为247。每一个slave设备都有一个唯一的地址。在串行和MB+网络中,通讯总是由主节点发起(在以太网上,任何一个设备都能发送一个Modbus命令,但是通常也只有一个主节点设备启动指令),子节点在没有收到主节点请求时不会发送数据。各个子节点之间不会直接相互通信。
在同一个时刻,主节点只会发起一个Modbus事务处理。什么是事务处理呢?其实就是一次网络上完整的应答通讯。主要包含两种形式,1 单播模式 , 2 广播模式
所谓单播模式就是主节点给某个指定的节点发送消息(通过ADU中的地址域指定),从节点收到并处理完请求后,从节点向主节点返回一个应答报文,在这种模式下,一个Modbus事务包含两个报文,一个来自主节点的请求,一个来自子节点的应答
所谓广播模式,是主节点向所有的子节点发送请求,当主节点发送的请求报文的地址域值为0时,代表广播请求,所有的从节点都需要接受处理,但不需要向主节点返回报文。
其实在物理层所有设备都会收到所有的请求,但地址域不为0时,从机判断当前为单播模式,只有地址域和自身地址号相同的从机才会响应请求,当地址域为0时,从机判断为广播消息,所有的从机都会执行指令,所有收到指令的设备都会运行,只不过不回应指令。
客户机(主机)和服务器(从机)通信时会出现两种情况,一种是正常,一种是异常。
其中事务处理正常时示意图如下,客户机(主机)向服务器(从机)发送请求,在功能码中填充功能码代号,说明服务器需要执行的动作,在数据码区填充具体的要求,比如读寄存器的地址和数量,通信正常时服务器会在返回的通信帧的功能码区中填充一个操作码,该操作码和功能码的值一样,在通讯帧的数据区填充返回的采样数据。
当出现事务处理异常时,示意图如下,服务器会在返回的通讯帧的功能码中填充一个差错码,该差错码 = 功能码 + 0x80,即将功能码的最高位置1代表出现错误。并在后面的数据段中填充错误码,用来指示本次通信的错误具体内容。
错误检测域是针对通讯链路是否可靠的检测域,通过CRC(循环冗余校验码)等错误校验方式校验通信过程中是否发生了差错。
4、帧详解
Modbus协议的三种形式通讯的帧略有不同,具体如下
MBAP是一个通用的报文头,依赖于可靠的网络层,各域的典型长度如下(以串行链路为例)
各功能域介绍:
4.1、地址域
第一部分是8位是地址域,用于给从机编号,而主机是没有地址的,从机的地址必须是唯一的。Modbus 地址域使用1个字节,寻址空间有 256 个不同地址,但合法的地址是0 – 247。
主节点通过将子节点的地址放到报文的地址域对子节点寻址。当子节点返回应答时, 它将自己的地址放到应答报文的地址域以让主节点知道哪个子节点在回答
4.2、功能码
第二部分8位是功能码,功能码指明服务器要执行的动作。
主机通过在PDU中指定不同的功能码,通知从机(服务器)执行不同的动作, 功能码分为三类:
A、公共功能码:这是Modbus协议组织定义的功能码,被大家一致认可,普通情况下不会改变。
B、用户定义功能码: 有两个用户定义功能码的定义范围,十进制 65 至 72 和十进制 100 至 110,可以用户自行定义使用。
C、保留功能码:这是一些公司对一些历史产品使用的功能码,对公共来说是无效的。
公共功能码的定义如下:
访问形式有单比特访问和16比特访问还有文件记录访问, 这里的线圈可以理解为开关量 0,1
4.3、数据区
介绍数据区之前,先介绍一下Mobbus协议的数据模型,Modbus可访问的数据存储在四个区块或地址范围的其中一个: 线圈状态、离散量输入、保持寄存器和输入寄存器。这里的区块是概念性的定义,在物理层面它们可能作为独立的内存地址存在于给定的系统中,但也可能重叠,这个完全由设备自己管理。
每个区块定义可以包含65,536个元素的地址空间。在PDU的定义中,Modbus定义了每个数据元素的地址,范围从0到65,535。但是我们的物理设备如寄存器、线圈通常从1开始编号从1到n,其中n的最大值为65,536。也就是说,线圈11位于地址10的线圈状态区块中,而保持寄存器34位于从机被定义为保持寄存器的内存部分中的地址33。 实际使用时设备不会直接描述数据在某某号寄存器中,如电压量在第13号保存寄存器中,而是会描述为电压量在地址40001(或者4001,400001等),其中4XXX、4XXXX和4XXXXX的区别取决于设备使用的地址空间。 如果所有65,536个寄存器都在使用中,应该使用4XXXXX符号,因为其允许范围为400,001~465,536。4开头是因为实际使用时地址编码的前缀通常反映数据的类型,一般如下定义数据类型和前缀关系。
4.4、错误检验域
该域是串行链路对报文内容执行 "冗余校验" 的计算结果。根据不同的传输模式 (RTU or ASCII)使用两种不同的计算方法。
4.5、报文示例
请求读离散量输出 20-38 的实例
将输出 27-20 的状态表示为十六进制字节值 CD,或二进制 1100 1101。输出 27 是这个字节的MSB,输出 20 是 LSB。按照惯例,将一个字节内的比特表示为 MSB 位于左侧,LSB 位于右侧。第一字节的输出从左至右为 27 至 20。下一个字节的输出从左到右为 35 至 28。当串行发射比特时,从 LSB 向 MSB 传输: 20 . . .27、28 . . . 35 等等。在最后的数据字节中,将输出状态 38-36 表示为十六进制字节值 05,或二进制 0000 0101。输出38 是左侧第六个比特位置,输出 36 是这个字节的 LSB。用零填充五个剩余高位比特。如果返回的输出数量不是八的倍数,将用零填充最后数据字节中的剩余比特。设备内部流程如下
4.6 异常代码
5、关于传输
串行传输模式有两种:RTU模式和ASCII模式
Modbus 串行链路 上所有设备的传输模式和串口参数必须相同。所有设备必须实现RTU模式,ASCII模式是选择项,只有配置成相同模式的设备才可以相互正常通信。在其他网络上(如MAP,Modbus Plus)Modbus消息被转换为与串行传输无关的帧。Modbus 使用“大端模式”(big-Endian) 表示地址和数据项。当发送多个字节时,首先发送最高有效位。这是字节层面的,在串口线路中传送每个字节时bit传送模式为,LSB先发送,MSB后发送。
RTU 传输模式
当控制器以RTU模式通信时,消息中每个8bit字节包含两个4bit十六进制字符。这种方式的有点是:在相同波特率下,可以比ASCII方式传送更多数据
相应的串口设置要求
- 1 起始位
- 8 数据位, 首先发送最低有效位
- 1 位作为奇偶校验
- 1 停止位
每个字符或字节均由此顺序发送(从左到右):最低有效位 (LSB) . . . 最高有效位 (MSB)
ASCII 传输模式
当 Modbus 串行链路的设备被配置为使用 ASCII (American Standard Code for Information
Interchange) 模式通信时, 报文中的每个 8 位子节以两个 ASCII 字符发送。当通信链路或者设备
无法符合 RTU 模式的定时管理时使用该模式。
注 : 由于一个子节需要两个字符,此模式比 RTU 效率低。
例 : 子节 0X5B 会被编码为两个字符 : 0x35 和 0x42 ( ASCII 编码 0x35 ="5", 0x42 ="B" )。
相应的串口设置
- 1 起始位
- 7 数据位, 首先发送最低有效位
- 1 位作为奇偶校验
- 1 停止位
和RTU模式一样每个字符或字节均由此顺序发送(从左到右):最低有效位 (LSB) . . . 最高有效位 (MSB)
(ASCII 十六进制 3A )起始,以‘回车-换换行’ (CR LF) 对(ASCII 十六进制 0D 和 0A)结束。
6、Modbus仿真器 Modbus Poll 和Modbus Slave介绍
Modbus Poll 是Witte Software公司开发的的Modbus主机仿真器,用于测试和调试Modbus从设备。软件支持ModbusRTU、ASCII、TCP/IP协议。支持多设备监控,可以同时监视多个从设备/数据域。支持图形化监控报文信息,循环报文发送,寄存器数值独立增长。可以图形化设定从设备ID,功能,地址,大小和轮询间隔。提供数据的多种格式方式,比如浮点、双精度、长整型(可以字节序列交换) ,并支持Excel导出。
软件下载:
打开软件之后主界面如下,出现红色No connection说明此时没有连接任何从设备。上面一行字代表当前通讯状态统计,Tx 代表发送帧数,Err代表错误帧,ID表示从站的ID号,F代表功能码,SR代表轮询周期,右下角显示IP地址和端口号。
点击Connection->Connect… 弹出注册码输入框,可以输入注册码,没有的话点击Regster later可以试用30天
输入完注册码后,弹出Connection配置
支持5种连接形式
1 串行: 通过串行线路。RS232或RS485。可以使用USB串行转换器。
2 TCP/IP:如果要与TCP/IP网络通信,选择TCP/IP。在这种情况下,从站ID与TCP/IP中使用的单元ID相同。 端口号默认为502。如果连接失败,则尝试是否可以在命令提示符下ping设备。如果ping命令失败,轮询也将失败。
3 UDP/IP: 如果要与UDP/IP网络通信,请选择UDP/IP。这与TCP/IP相同,但改用连接较少的UDP协议。
通过TCP/IP的RTU/ASCII: 这是通过TCP/IP网络而不是串行线路发送的RTU或ASCII消息。 通过UDP/IP的RTU/ASCII: 这是通过UDP/IP网络而不是串行线路发送的RTU或ASCII消息。 连接类型3-5不是http://www.modbus.org指定的标准,是为了一些特殊情况下的应用。
连接成功connection时界面如下(需要使用从站仿真器或者真实设备)
串口连接配置:
选择串口后可以配置串口信息
串口配置一般默认就好,除非有特殊的要求,Mode处可以选择RTU和 ASCII类型。右侧可以设置响应超时时间,和轮训间隔。对于轮训间隔,一般设置为20ms,如果将此值设置为小于20毫秒,则不能保证响应和新请求之间的3.5个字符的时间间隔。这是因为Windows进程调度为每10到20毫秒切换一次任务。 如果在串行RS485网络中轮询多个从站,则不应将该值设置为低于20ms。这是为了确保3.5个字符的时间间隔。 在TCP/IP网络中,小于20毫秒是可以的。
点击高级Advanced…可以看到高级设置,这里一般不用去管这里稍微介绍一下
RTS切换 :RTS切换指定如果字节可用于传输,则RTS线将为高。发送所有缓冲的字节后,RTS线将变为低电平。 如果你的232/485转换器带自动方向切换功能,则可以使用它来切换方向。 尽量,应避免使用RTS控制的RS232/RS485转换器。在非实时操作系统(例如Windows和Linux)下,很难确定关闭变送器的确切时间。如果关闭它,字符可能仍位于FIFO或UART的发送寄存器中,尚未发送出去,这会导致数据丢失,但如果关闭时间太晚,则从站的消息将被破坏,主站将无法识别该消息。
DSR :DSR指定是否监视DSR(数据集就绪)信号以进行输出流控制。如果此成员为TRUE并且DSR关闭,则输出将被挂起,直到再次发送DSR。
CTS :CTS指定是否监视CTS(清除发送)信号以进行输出流控制。如果启用此复选框且CTS已关闭,则输出将暂停,直到再次发送CTS。
DTR:DTR指定在打开端口时是启用还是禁用DTR。
删除回显 如果你用的设备或RS232/RS485转换器会回显刚刚发送的字符,则启用该功能自动删除回显。
TCP/IP连接协议配置
和串口配置类似,只是多了服务器(从机)IP配置,端口号,网络连接超时设置,还可以切换IPv4和IPv6网络协议。
参数设置
点击Setup->Read/Write Definiton…可以对监视窗口监视的内容进行设置
点击之后可以设置从站地址,选择功能码,如03是读保持寄存器值,Address处填写寄存器地址,这里要注意右侧有地址寻址方法 40011->10,Quantity填写要读的寄存器数目
View 部分用于设置显示的行数,Cell中的地址显示等信息。Modbus的功能码定义如下
常见的功能码和地址对应表
设置假名,你可以直接双击alias列对应的单元格填写一些方便记忆的名字
选择Setup->Excel Log …可以设置Excel log,以方便数据处理
选择Setup->Log … 可以设置Log的存储细节,存储速率,分割符,错误记录形式等。
测试功能:
Modbus poll 提供方便的测试辅助功能在Function菜单下,可以直接选择相应的功能发送命令给从机
Modbus Poll还提供了文本发送调试工能,点击Functions->Test Center…进入测试中心,编辑完了命令之后可以直接点击Send发送。
显示设置。
默认情况下Modbus Poll以Signed形式显示数据,这可以根据需要需要 点击Display菜单可以根据需要修改每个单元格的显示格式
选择Communication…可以看到通信帧信息
Modbus poll还提供了一个实时绘图页面来帮助用户观察数据接收情况,一般情况下不需要,调试时直接观察通信帧一般就够了。
Modbus Slave 介绍
Mobus Slave能够模拟从站(服务器),用来辅助主站开发调试。打开Modbus Slave可以看到主界面
图中ID为站号,F为响应主机的功能码
在和主机进行连接之前先对连接进行设置点击Connection->Connection Setup,这里我选择了TCP/IP协议,串口协议类似
对从机进行配置点击 Slave Definition…,设置好了点击OK
然后对仿真界面进行一些设置,可以在Alias列填写容易识别的名字,双击右侧单元格会弹出寄存器编辑窗口,可以填写你需要的值,勾选Auto increment可以另每个单元自动增长
配置好了Slave仿真器后,可以点击connection,然后利用主机连接,开始仿真调试
如果需要串口协议调试可以使用虚拟串口工具
软件下载地址
参考文章:VSPD虚拟串口工具——从此告别硬件串口调试
7、Modbus 仿真器 Mod_Rssim 介绍
如果只是一般调试看看有没有数据,并且觉得Modbus Poll使用麻烦的话可以考虑Mod_RSsim。 Mod_RSsim是一款轻量级的Modbus从机模拟器,它可以模拟ModBusTCP和ModBusRTU的从机,能够同时模拟254个被控站,软件使用简单方便,可以满足一般的主机调试。
官方网站:www.adroit.co.z 下载地址
主程序窗口
打开程序之后,仿真即直接开始,此时可以有主机连接仿真器。软件主界面如下,非常轻量级,大部分功能都可以直接在界面上操作
基本设置
首先选择协议类型,在Prot下拉窗口可以选择协议类型
点击串口标志,可以设置端口号和站号
左下角绿色数字标志代表站号
地址模式
地址支持Hex模式和Dec模式,可以通过Address类型选择,如下,由于通常我们使用4001,40001等地址来表述数据地址,因此一般可以选择Dec十进制模式,地址右侧+0,+1,+2代表偏移量,偏移单位由Fmt设置。
数据类型选择
Modbus有四种数据模型,软件中可以通过I/O下拉窗口选择
选择不同的数据类型之后,Address中的地址会跟着变化。
数据长度和修改
点击Fmt下拉窗口可以选择寄存的的类型,类型有图示几种,一般我们选用16bit寄存器类型,即word16。
数据手动设置,双击寄存器地址,可以填写需要的数值。
Mod_RSsim有个很好用的功能是模拟数据自动增长,这样很方便在主机侧观察数据动态变化,(这里不能设置单个寄存器自动增长如果需要该功能可以使用 Modbus Poll),点击下面红色的小人
弹出如下窗口
可以选择BYTES增长,WORDS增长不同类型,在Inrement 上可以填写每次的增量,比如按+1增长,还可以选择增长的时间间隔。在界面的下半截还可以对站点状态进行设置。
高级设置
点击高级设置图标
在弹出的窗口我们可以对数据寄存器数目,PDU最大长度等参数进行设置。