1 前言
MODBUS是一项应用层报文传输协议,是一个请求/应答协议,提供功能码规定的服务,用于在通过不同类型的总线或网络连接的设备之间的客户机/服务器通信。
本文介绍如何使用格西烽火通信测试软件编写测试项目,进行调试和测试Modbus TCP/IP通信节点。
2 通信协议
2.1 术语
MODBUS通信协议
MODBUS是OSI 模型第7层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。
2.2 通信接口
支持以太网接口,支持多点连接,支持TCP/IP协议,保留502端口访问Modbus。
2.3 数据链路层
MODBUS TCP/IP协议是一个主-从协议。子节点之间从不会互相通信。主节点在同一时刻可以发起多个Modbus事务处理。MODBUS TCP/IP 的通信系统可以包括不同类型的设备:
1)连接至TCP/IP网络的MODBUS TCP/IP 客户机和服务器设备;
2)互连设备,例如:在TCP/IP 网络和串行链路子网之间互连的网桥、路由器或网关,联接,该子网允许将MODBUS 串行链路客户机和服务器终端设备连接起来。
MODBUS TCP/IP 通信结构
2.3.1 帧格式
Modbus应用协议定义了简单的独立于其下面通信层的协议数据单元(PDU-Protocol Data Unit)。
在不同总线或网络的Modbus协议映射在协议数据单元之外引入了一些附加的域。发起Modbus事务处理的客户端构造Modbus PDU,然后添加附加的域以构造适当的通信PDU。
TCP/IP网络上的MODBUS应用数据单元。
在TCP/IP 上使用一种专用报文头识别MODBUS 应用数据单元。将这种报文头称为MBAP 报文头(MODBUS 协议报文头)。MBAP 报文头包括下列域:
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 协议项编制
根据协议帧格式,为了方便控制和显示,把协议项的数据固定拆分为事务处理标识符、协议标识符、长度、单元标识符、功能码5个部分,动态增减的部分是数据域,可以根据具体命令进行进一步拆分。
下面以“(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校验码。