MODBUS协议在世纪星中的应用
本文作者:北京世纪长秋科技有限公司 曾慧
引言
随着工业自动化的发展,MODBUS成为了工业控制系统中的一种通用协议。由于该协议的简单且通用,得到了众多仪表厂商的支持,成为仪表及智能终端的一项工业标准,在工业监控系统中得到了广泛的应用。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以进行通信。它的开放性、可扩充性和标准化使不同厂商生产的控制设备可以简单可靠地连成工业网络,进行系统的集中监控,从而成为最流行的协议之一。同样,世纪星组态软件也提供了支持上位机和下位设备进行MODBUS通信的驱动程序,使用户可以方便使用装有世纪星软件的上位机和下位的设备进行通信。
MODBUS通信协议
MODBUS协议是莫迪康公司1978年发明的一种用于电子控制器进行控制和通信的协议。此协议支持传统的RS232、RS422、RS485标准和以太网设备。不同厂商生产的符合MODBUS协议的控制设备可以连成工业网络,进行集中监控。MODBUS协议采用主从(master-slave)技术,是一种问答方式的通信协议。每次通信均由主机发出数据请求信息,从机接收到正确消息后就可以发送数据到主机以响应请求;主机也可以直接发信息修改从机的数据,实现双向读写。
MODBUS协议支持两种数据传送模式,即ASCII码和MODBUS-RTU。
(1) MODBUS-RTU
表1 主机询问数据帧报文
从机地址 功能码 数据起始地址 数据量 冗余校验 |
Slave Func Start Start Num Num CRC CRC Add Code Add H Add L H L -16H |
表2 从机回答数据帧报文
从机地址 功能码 字节量 数据 冗余校验 |
Slave Func Byte Data …Data CRC CRC Add Code Count Byte1 Byte n -16H |
(2) ASCII码
表3 主机询问数据帧报文
起始符 从机地址 功能码 数据起始地址 数据量 冗余校验 结束符 |
start Slave Func Start Start Num Num LRC LRC Stop character Add Code Add H Add L H L -16H |
表4 从机回答数据帧报文
起始符 从机地址 功能码 字节量 数据 冗余校验 结束符 |
start Slave Func Byte Data …Data LRC LRC Stop character Add Code Count Byte1 Byte n -16H |
MODBUS在世纪星中的应用
在世纪星中,除了支持MODBUS-RTU和ASCII码两种数据传送模式外,还支持MODBUS TCP/IP 传送方式。事实上,MODBUS TCP/IP的命令格式和MODBUS-RUT是很相似的,MODBUS TCP/IP只是缺少两个字节的CRC校验。在MODBUS协议中,是根据不同的功能码来完成不同的读写功能的,世纪星中支持的功能码及其功能如表5所示:
表5 世纪星所支持的功能码
功能码 寄存器名 功能 |
01H 0x 读取线圈状态 02H 1x 读取输入状态 03H 4x 读取一个或多个保持寄存器 04H 3x 读取一个或多个输入寄存器 05H 0x 强置一个逻辑线圈的通断状态 06H 4x 预置一个寄存器(数据类型为UINT/INT/BCD) 10H 4x 预置两个寄存器(数据类型为LONG/FLOAT) |
在硬件设备中,数据存储在寄存器内,每个存储数据的寄存器对应一个寄存器地址,上位机就是根据这些地址组织命令去读写寄存器里的数据。一个两个字节的整型数据存储在一个寄存器地址中,一个四字节的整型或浮点型数据则要存储在连续的两个寄存器地址中,通常都是高地址存放数据的高字,低地址存放数据的低字。
由于很多用MODBUS协议的仪表厂家都在以自己的方式来说明仪表上的参数以及它对应的寄存器地址,所以一部分厂家是以十六进制来标记寄存器地址,而另一部分厂家用十进制。为了使用户在工程里建立变量时方便的和仪表上的寄存器连接,世纪星分别在MODBUS-RTU和ASCII码两种通信方式下,支持十六进制通道号和十进制通道号两种变量连接方式,因此,就免去了用户做很多的十六进制和十进制之间转换的工作。
在设备的说明书中,一般会指定寄存器地址,数据类型,该地址的寄存器支持的功能码等要素,以MODBUS-RTU 十六进制的驱动为例,如果寄存器地址为0005H,数据类型为两个字节的整形,支持03H功能码读数据,则对应到世纪星软件中需要连接的变量为4x0005,变量类型为I/O整数,数据类型可以分为有符号的INT或无符号的UINT 或者BCD码,在进行通信时,世纪星发送的以及设备返回的命令如下表所示:
主机发送:
从机地址 功能码 数据起始地址 数据量 冗余校验 |
01 03 00 05 00 01 94 0B |
从机地址 功能码 字节量 数据 冗余校验 |
01 03 02 00 |
由设备返回的命令,可以知道设备返回了两个字节的有效数据(00 1A),则寄存器地址为0005H里的数据为001AH=26。
如果寄存器地址为0009H,数据类型为两个字节的整型,支持06H功能码写数据,则对应到世纪星软件中需要连接的变量为4x0009,变量类型为I/O整数,数据类型可以为有符号的INT或无符号的UINT 或者BCD码,在通信时,世纪星发送的以及设备返回的命令如下表所示(写入数据258=0102H):
主机发送:
从机地址 功能码 数据起始地址 写入数据 冗余校验 |
01 06 00 09 01 02 D9 99 |
从机返回:
从机地址 功能码 数据起始地址 写入数据 冗余校验 |
01 06 00 09 01 02 D9 99 |
经过发送上表中的命令,0102H便成功写入到寄存器地址为0009H号的寄存器中。
如果寄存器地址为0010H,数据类型为四个字节的整型或浮点型,支持10H功能码写数据,则对应到世纪星软件中需要连接的变量为4x0010,变量类型为I/O实数,数据类型可以为有整型的LONG或浮点型的FLOAT,在通信时,世纪星发送的以及设备返回的命令如下表所示(写入数据258=0102H):
主机发送:
从机地址 功能码 起始地址 寄存器个数 字节个数 写入数据 冗余校验 |
01 10 00 10 00 02 04 01 02 00 00 DA AC |
从机地址 功能码 数据起始地址 写入字节个数 冗余校验 |
01 10 00 10 00 |
经过发送上表中的命令,0102H便成功写入到寄存器地址为0010H号的寄存器中,0000H成功写入了寄存器地址为0011H号的寄存器中。
上述内容就是在世纪星中根据设备说明书连接保持寄存器的变量连接方式,以及通信的过程,其它的例如输入寄存器,输入线圈等都和保持寄存器是类似的,通过特定的功能码对特定地址的寄存器进行读写操作,这里就不一一介绍了。
小结
在平时用户使用世纪星和支持MODBUS协议的仪表进行通信的过程中,我们和客户也有很多的交流,在多数情况下,世纪星都能很正常的和仪表进行通信,但现在还是避免不了的一种情况是,有些用户的仪表支持的并不是标准的MODBUS协议。MODBUS是一种通用的协议,但就细节来说,很多厂家还是各有各的用法,这使我们认识到了我们的MODBUS通信还是缺少一些灵活性,而我们一定会针对这种情况做一些改进工作,力求更多的使用MODBUS协议的客户能够方便使用我们的软件和仪表高效可靠的通信。客户的满意,永远是我们努力追求的目标。
(完)转载请注明出处