modbus协议与串口服务器功能测试
Modbus协议
Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。
Modbus协议目前存在用于串口、以太网以及其他支持互联网协议的网络的版本。
对于串行连接,存在两个变种,它们在数值数据表示不同和协议细节上略有不同。Modbus RTU是一种紧凑的,采用二进制表示数据的方式,Modbus ASCII是一种人类可读的,冗长的表示方式。这两个变种都使用串行通信(serial communication)方式。RTU格式后续的命令/数据带有循环冗余校验的校验和,而ASCII格式采用纵向冗余校验的校验和。被配置为RTU变种的节点不会和设置为ASCII变种的节点通信,反之亦然。
对于通过TCP/IP(例如以太网)的连接,存在多个Modbus/TCP变种,这种方式不需要校验和计算。
对于所有的这三种通信协议在数据模型和功能调用上都是相同的,只有封装方式是不同的。
Modbus RTU 模式
Modbus-RTU模式是指当控制器设为在Modbus网络上以RTU(远程终端模式)模式通信,在消息中的每个8Bit包含两个4Bit的十六进制字符。
使用RTU模式注意下面两点:
1、信息帧发送至少要以3.5个字符时间的停顿间隔开始。在最后一个字符传输字符之后,一个至少3.5个字符时间的停顿标定了信息帧的结束。一个新的信息帧可在此停顿之后开始。如果一个新消息在小于3.5个字符时间内接着前个消息开始,接受的设备将认为它是前一信息帧的延续,这将导致CRC码的值出错。
2、整个信息帧必须作为一连续的流传输。如果在帧完成之前有超过1.5字符时间的停顿时间,接受设备将刷新不完整的信息帧并认为存在丢包现象。
通讯数据(信息帧)格式:
数据格式 | 地址码 | 功能码 | 数据区 | 错误校验 |
---|---|---|---|---|
数据长度 | 1字节 | 1字节 | N字节 | 16位CRC码(冗余循环码) |
当通讯命令由发送设备(主机)发送至接收设备(从机)时,符合相应地址码的从机接收通讯命令,并根据功能码及相关要求读取信息,如果CRC校验无误,则执行相应的任务,然后把执行结果(数据)返送给主机。返回的信息中包括地址码、功能码、执行后的数据以及CRC校验码。如果CRC校验出错就不返回任何信息。
Modbus ASCII 模式
ASCII模式与TCP模式,只是语法上的不同,没有本质上的区别。
ASCII(American Standard Code for Information Interchange)的中文翻译是美国信息互换标准代码,它基于拉丁字母的一套电脑编码系统。主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。
ASCII第一次以规范标准的型态发表是在1967年,最后一次更新则是在1986年,至今为止共定义了128个字符,这是标准的ASCII。
其构成说明如下:0~ 31及127是控制字符或通信专用字符;32~ 126是字符,其中48~ 57为0~ 9十个阿拉伯数字,65~ 90为25个大写英文字母,97~122号为26个小写英文字母,其余位一些标点符号。
在标准ASCII中,其最高位(b7)用作奇偶校验位。ASCII码主要用于计算机领域,在国内工业控制中很少采用ASCII码作为标准,所以Modus ASCII在国内的工业控制领域运用很少。
在ASCII传输模式下,消息帧以英文冒号“:”(3A)开始,以回车(0D)和换行(0A)结束,允许传输的字符集为十六进制的0~ 9和A~F。网络中的从设备监视传输通路上是否有英文冒号“:”,如果有的话,就对消息帧进行解码。查看消息中的地址是否与自己的地址相同,如果相同的话,就接收其中数据;如果不同的话就不予理会。其消息帧格式如下:
开始 | 地址 | 功能码 | 数据数量 | 数据 | LRC | 结束 |
---|---|---|---|---|---|---|
1字符 : | 2字符 | 2字符 | 2字节 | n字符 | 2字符 | 2字符 |
在ASCII模式下,每个8位的字节被拆分成两个ASCII字符进行发送,比如十六进制0xAF(1010 1111),会被分解成ASCII字符“A”(0100 0001)和”F”(0100 0110)进行发送,其发送量显然比RTU增加一倍。ACII模式的好处是允许两个字符之间间隔的时间长达1s而不引发通信故障,该模式采用纵向冗余校验(LRC)。
综上所述,同一条命令用Modbus RTU和Modbus ASCII方式表现出来,虽然在命令长度上有很大区别(ASCII为RTU的两倍),但表达的意思是完全一样的。
对于一条RTU协议的命令可以简单的通过以下的步骤转化为ASCII协议的命令:
-
把命令的CRC校验去掉,并且计算出LRC校验取代。
-
把生成的命令串的每一个字节转化成对应的两个字节的ASCII码,比如0x03转化成0x30,0x33(0的ASCII码和3的ASCII码)。
-
在命令的开头加上起始标记“:”,它的ASCII码为0x3A。
-
在命令的尾部加上结束标记CR,LF(0xD,0xA),此处的CR,LF表示回车和换行的ASCII码。
Modbus TCP/IP 模式
TCP/IP协议已成为信息行业的事实标准,世界上93%的网络都使用TCP/IP协议(在网络层使用IP协议,在传输层使用TCP协议),只要在应用层使用Modbus 协议,就构成了完整的工业以太网。
TCP/IP协议并不完全符合OSI的七层参考模型,OSI(Open System Interconnect)是传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务。该模型的目的是使各种硬件在相同的层次上相互通信。
- 物理层(Physical Layer)主要是处理机械的、电气的和过程的接口,以及物理层下的物理传输介质等。
- 数据链路层(Data Link Layer)的任务是加强物理层的功能,使其对网络层显示为一条无错的线路。
- 网络层(Network Layer)确定分组从源端到目的端的路由选择。路由可以选用网络中固定的静态路由表,也可以在每一次会话时决定,还可以根据当前的网络负载状况,灵活地为每一个分组分别决定。
- 传输层(Transport Layer)从会话层接收数据,并传输给网络层,同时确保到达目的端的各段信息正确无误,而且使会话层不受硬件变化的影响。通常,会话层每请求建立一个传输连接,传输层就会为其创建一个独立的网络连接。但如果传输连接需要一个较高的吞吐量,传输层也可以为其创建多个网络连接,让数据在这些网络连接上分流,以提高吞吐量。而另一方面,如果创建或维持一个独立的网络连接不合算,传输层也可将几个传输连接复用到同一个网络连接上,以降低费用。除了多路复用,传输层还需要解决跨网络连接的建立和拆除,并具有流量控制机制。
- 会话层(Session Layer)允许不同机器上的用户之间建立会话关系,既可以进行类似传输层的普通数据传输,也可以被用于远程登录到分时系统或在两台机器间传递文件。
- 表示层(Presentation Layer)用于完成一些特定的功能,这些功能由于经常被请求,因此人们希望有通用的解决办法,而不是由每个用户各自实现。
- 应用层(Application Layer)中包含了大量人们普遍需要的协议。不同的文件系统有不同的文件命名原则和不同的文本行表示方法等,不同的系统之间传输文件还有各种不兼容问题,这些都将由应用层来处理。此外,应用层还有虚拟终端、电子邮件和新闻组等各种通用和专用的功能。
Modbus TCP/IP与Modbus RTU不同之处就是7个字节的报文头(RTU中的从机地址作为单元标识符进入报文头),数据部分的语法完全和RTU一样。
数据链路层的CRC校验与传输层的校验和已经对应用层报文进行了校验,因此RTU中原有的CRC校验取消。
Modbus TCP/IP的协议结构如下所示:
事务处理标识符(2字节):MODBUS请求和响应传输过程中序列号,此字段应答报文与请求报文保持一致。
协议标识符(2字节):0表示modbus,1表示UNI-TE协议,一般默认为0x0000,此字段应答报文与请求报文保持一致。
长度(2字节):用来表示接下来的数据长度(包含单元标识符及数据域),单位为字节。
单元标识符(1字节):用以标识在串行线或网络上的远程服务端的地址,通常情况下意义不大,被IP地址取代。但当TCP与RTU之间进行协议转换时,该数据就是RTU中的地址码。
注意:
- 在Modbus TCP/IP中,服务器是从机,而客户端是主机。
- 除非设备作为modbus网关服务器挂接多个RTU设备时,数值为01-FF,否则一般为00。
- 事务处理标识符一般默认为0x0000
示例:
将Modbus RTU改写成Modbus TCP/IP形式。
Modbus RTU:01 03 01 8E 00 04 25 DE
Modbus TCP/IP:00 00 00 00 00 06 01 03 01 8E 00 04
两者含义是一样的,就是从地址码为01的模块的0x018E寄存器地址开始读4个寄存器。
串口服务器
简介
本次使用的是某公司的NCOM系列串口服务器,能够将 1-16 路标准的 RS232 或 RS485 串口信号转 换成 TCP/IP 网络信号,实现 RS232/485 串口与 TCP/IP 网络接口之间数据的双向透明传 输;除具备常规串口服务器功能外,还具备 Modbus 网关的功能,将 ModbusTCP 与 ModbusRTU/ModbusASCII 协议之间进行转换,使用户的 Modbus 串口设备能够立即具备 TCP/IP 网络接口功能,连接网络进行数据通信,极大的扩展串口设备的通信距离。
串口服务器的背靠背应用,主要用于串口设备的网络扩展,让现有的串口设备通过互联网 连接起来,从而解决串口设备通讯距离短的问题,也大大降低传统 RS232/485 串行总线设备 布线的难度。此应用一般是利用现有网络进行连接,节省了施工和维护成本,且不受地域限制。 可广泛应用于楼宇自控、 工业自动化、 测量仪表及环境动力监控系统、 信息家电和 LED 信 息显示设备等领域。
测试
-
连接设备,接通电源;
-
修改电脑IP,使其和串口服务器的IP 地址为同一网段;
-
设置参数;
打开串口服务器的设置网址(此处为192.168.1.5),输入密码,进入设置界面:
也可以通过设备厂商配套的配置软件设置相关参数: -
功能测试
通过配套的集成调试工具,设置相关参数,点击连接,在发送区输入信息,点击发送,若设置无误即可正常通讯。数据帧格式参考上文。
也可通过配套的Modbus Poll软件。
打开软件,点击第四个set up,点击Read/Write Definition:
之后点击第三个connection,点击Connection Setup:
设置无误后,显示正常连接数据:
功能测试完成。
参考文档:
Modbus通讯协议(一)——概述
Modbus通讯协议(二)——RTU
Modbus通讯协议之三——ASCII
Modbus通讯协议之四——TCP/IP