1 前言
MODBUS是一项应用层报文传输协议,是一个请求/应答协议,提供功能码规定的服务,用于在通过不同类型的总线或网络连接的设备之间的客户机/服务器通信。Modbus 串行链路系统可以使用异步串行链路(EIA/TIA-232-E、EIA-422、EIA/TIA-485-A等)进行通信。
本文介绍如何使用格西烽火通信测试软件编写测试项目,进行调试和测试Modbus通信节点。
2 通信协议
2.1 术语
MODBUS通信协议
MODBUS是OSI 模型第7层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。
2.2 通信接口
支持EIA/TIA-232-E、EIA-422、EIA/TIA-485-A等串行接口,支持多点连接,要求9600bps,推荐19200bps,选择实现1200bps,2400bps,4800bp等其他速率。
2.3 数据链路层
Modbus串行链路协议是一个主-从协议。在同一时刻,只有一个主节点连接于总线,一个或多个子节点连接于同一个串行总线。Modbus通信总是由主节点发起。子节点在没有收到来自主节点的请求时,从不会发送数据。子节点之间从不会互相通信。主节点在同一时刻只会发起一个Modbus事务处理。
主节点以两种模式对子节点发出Modbus请求。
单播模式:主节点以特定地址访问某个子节点,子节点接到并处理完请求后,子节点向主节点返回一个报文(一个应答)。在这种模式,一个Modbus事务处理包含 2 个报文,一个来自主节点的请求,一个来自子节点的应答。
广播模式:主节点向所有的子节点发送请求。对于主节点广播的请求没有应答返回。广播请求一般用于写命令。所有设备必须接受广播模式的写功能。地址0是专门用于表示广播数据的。
2.3.1 帧格式
Modbus应用协议定义了简单的独立于其下面通信层的协议数据单元(PDU-Protocol Data Unit)。
在不同总线或网络的Modbus协议映射在协议数据单元之外引入了一些附加的域。发起Modbus事务处理的客户端构造Modbus PDU,然后添加附加的域以构造适当的通信PDU。
2.3.2 传输模式
Modbus串行链路有两种串行传输模式被定义:RTU模式和ASCII模式。
它定义了报文域的位内容在线路上串行的传送,确定了信息如何打包为报文和解码。
Modbus 串行链路上所有设备的传输模式 (和串行口参数) 必须相同。所有设备必须必须实现RTU模式,默认设置必须为RTU模式,ASCII传输模式是选项。
RTU模式
当设备使用RTU(Remote Terminal Unit)模式在Modbus串行链路通信,报文中每个8位字节含有两个4位十六进制字符。这种模式的主要优点是较高的数据密度,在相同的波特率下比ASCII模式有更高的吞吐率。每个报文必须以连续的字符流传送。
RTU 模式每个字节(11位)的格式为:1个起始位,8个数据位,1个奇偶校验位,1个停止位。偶校验是要求的,其它模式(奇校验,无校验)也可以使用。默认校验模式模式必须为偶校验。使用无校验要求2个停止位。
RTU报文帧
ASCII模式
当Modbus串行链路的设备被配置为使用ASCII(American Standard Code for Information Interchange) 模式通信时,报文中的每个8位字节以两个ASCII字符发送。当通信链路或者设备无法符合RTU模式的定时管理时使用该模式。
例如:字节0x5B会被编码为两个字符,0x35和0x42(ASCII编码0x35 ="5",0x42 ="B")。
ASCII模式每个字节(10位)的格式为:1个起始位,7个数据位,1个奇偶校验位,1个停止位。偶校验是要求的,其它模式(奇校验,无校验)也可以使用。默认校验模式模式必须为偶校验。使用无校验要求2个停止位。
ASCII报文帧
2.4 应用层
MODBUS有三类功能码。它们是:
公共功能码:是较好地被定义的功能码,保证是唯一的,MODBUS组织可改变的,公开证明的,具有可用的一致性测试,MB IETF RFC 中证明的,包含已被定义的公共指配功能码和未来使用的未指配保留供功能码。
用户定义功能码:有两个用户定义功能码的定义范围,即65至72和100至110,用户没有 MODBUS 组织的任何批准就可以选择和实现一个功能码,不能保证被选功能码的使用是唯一的。
保留功能码:一些公司对传统产品通常使用的功能码,并且对公共使用是无效的功能码。
公共功能码定义如下表所示。
2.4.1 功能码描述
下面以“01 (0x01)读线圈”为例描述功能码,详细的描述请参考Modbus协议。
在一个远程设备中,使用该功能码读取线圈的1至2000连续状态。请求PDU详细说明了起始地址,即指定的第一个线圈地址和线圈编号。从零开始寻址线圈,因此寻址线圈1-16为0-15。根据数据域的每个比特将响应报文中的线圈分成为一个线圈。指示状态为1=ON 和0=OFF。第一个数据字节的LSB(最低有效位)包括在询问中寻址的输出。其它线圈依次类推,一直到这个字节的高位端为止,并在后续字节中从低位到高位的顺序。如果返回的输出数量不是八的倍数,将用零填充最后数据字节中的剩余比特(一直到字节的高位端)。字节数量域说明了数据的完整字节数。
请求PDU
正确响应PDU
错误响应PDU
这是一个请求读离散量输出20-38的实例。
3 测试项目编制
3.1 基本协议编制
3.1.1 协议项分类
利用格西调试精灵软件的协议激励的功能,把通信规约按照树形结构分类组织,使得管理上更加有条理,查找也更加方便。
根据Modbus通信协议功能码进行协议编辑。
3.1.2 协议项编制
根据协议帧格式,为了方便控制和显示,把协议项的数据固定拆分为节点地址、功能码和校验码3个部分,动态增减的部分是数据域,可以根据具体命令进行进一步拆分。
下面以“(0x01)读线圈”命令为例说明协议项编制方法。
主站请求帧
从站正常应答帧
从站异常应答帧
3.1.3 公共协议库
通过对基本协议项的编写、测试和验证,建立一个由基本协议项组成的公共协议库。
3.2 测试用例编制
测试用例(Test Case)是为某个特殊目标而编制的一组测试输入、执行条件以及预期结果,以便测试某个程序路径或核实是否满足某个特定需求。通信协议测试属于黑盒测试,可以采用黑盒测试常用的等价类划分法、边界值分析法、错误推测法、因果图法等基本方法来设计测试用例。
测试方案设计完成后,格西调试精灵软件能够利用编制完成的公共协议库,采用搭积木的方式,通过复制和粘贴命令即可非常快捷的创建测试用例。测试用例的组织方式通常是根据测试方案的设计层次采用树形结构分类组织。
4 测试方法
4.1 测试系统构成
4.2 单项测试与整体测试
格西调试精灵软件支持单项测试和整体测试,一次测试一个测试项或者整个测试集。执行的方法是选中需要测试的测试项或者测试集,然后执行激励命令即可。
下面以执行“(0x01)读线圈”测试项为例说明。
协议数据解析界面
4.3 单次测试与循环测试
格西调试精灵软件支持单次测试和循环测试,能很好满足各种调试测试和性能测试的需求。执行的方法是选中需要测试的测试项或者测试集,然后执行激励或循环激励命令即可。
4.4 脚本控制测试
格西调试精灵软件支持协议脚本,能够使用C#、VB、Jscript三种语言控制测试流程,设置和管理通信参数和协议帧数据,调用插件扩展测试功能。
协议脚本能够调用基于Microsoft .NET Framework的托管代码组件扩展测试功能,使用插件非常方便,只要把编译好的组件拷贝到Plugins目录中,就可以直接在脚本的函数中调用插件所提供的公共服务。
例如,使用脚本动态计算LRC校验码。
示例下载