天星标准Modbus协议驱动揭秘(二)
在工业自动化发展的进程中,Modbus成为了工业控制系统中的一种通用协议。由于该协议的简单且通用,得到众多仪表厂商的支持,成为仪表及智能终端的一项工业标准,在工业监控系统中得到广泛的应用。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以进行通信。它的开放性、可扩充性和标准化使不同厂商生产的控制设备可以简单可靠地连成工业网络,进行系统的集中监控,从而成为最流行的协议之一。同样,天星组态软件也提供支持上位机和下位设备进行Modbus通信的驱动程序,使用户可以方便地使用装有天星软件的上位机和下位的设备进行通信。
1、Modbus 设备选择
进入天星设备列表PLC大类中的标准Modbus协议,可以看到我们有5种Modbus设备,分别是Modbus RTU(十进制地址)、Modbus RTU(十六进制地址)、Modbus ASCII(十进制地址)、Modbus ASCII(十六进制地址)以及Modbus TCP/IP(十进制地址)。
首先,Modbus的三种通信方式:Modbus RTU、Modbus ASCII以及Modbus TCP/IP天星都全面支持,用户可以根据设备的通讯说明进行相应的选择。
其次,Modbus设备十进制和十六进制的区分除了方便一部分用户的同时,在设备选择的方面也给另一部分的用户造成困扰,针对这个问题我会给大家两点解释,第一:同样的一个设备,如果用十进制地址的Modbus驱动能连接得上的话,用十六进制地址的Modbus驱动肯定也没问题,确定这点之后,我们提前预想周全的贴心功能就不会在选择设备时给您造成困扰了。第二:Modbus协议已经成为工业控制系统中的一种通用协议,很多仪表厂商都采用Modbus协议与上位机进行通信,有些厂商协议的说明文档中,采用十进制的寄存器地址说明,如表1所示。
而有些厂商采用十六进制的寄存器地址说明,如表2所示。为避免用户在连接变量时再去做繁琐的十进制和十六进制的转化工作,我们将Modbus RTU以及Modbus ASCII分别做成用十进制的寄存器地址连接变量的驱动和用十六进制的寄存器地址连接变量的驱动。举个例子(假定表1表2中列出的寄存器支持03号功能码),对于表1这样的协议说明方式,我们可以选择十进制的Modbus驱动,用4x10这个寄存器连接环境温度这个参数;而对于表2这样的协议说明方式,我们可以选择十六进制的Modbus驱动,用4 x 000A这个寄存器连接环境温度参数。
表一
表二
2.寄存器连接
要正确连接一个寄存器,有三个关键信息要从协议说明文档中获得:第一是该寄存器支持的功能码,第二是该寄存器的地址,第三是该寄存器的数据类型。
1)功能码
天星是根据Modbus协议中的功能码来区别寄存器名称,具体信息如表3所述:
表三
在厂商所提供的协议说明文档中,都会注明寄存器所支持的功能码,用户可以根据上述表格对天星里的寄存器进行选择。例如:支持03H功能码的就选择4x,支持01H功能码的就选择0x。
2)寄存器地址
寄存器地址在协议说明文档中都会比较直观的列出,参看表1、表2,每个具体的参数都会对应一个寄存器地址,连接寄存器时只要将地址号连接在相应的寄存器名后面即可。
3)数据类型
位寄存器的连接方式比较单一,如图1所示。变量类型为I/O离散,数据类型为BIT,根据功能码选择寄存器名,并加上寄存器地址就可以正确连接该位寄存器。
图一
模拟量寄存器的连接方式就比较多样化,如表4所示(下面对于寄存器名和寄存器地址暂不进行说明)。
表四
表五
主电机电压:变量类型选择I/O整数,数据类型选择LONG(有符号32位整数);
主电机电流:变量类型选择I/O实数,数据类型选择FLOAT(我们的浮点数格式符合IEEE754标准);
环境温度:变量类型选择I/O整数,数据类型选择UINT(无符号16位整数);
T1:变量类型选择I/O整数,数据类型选择INT(有符号16为整数);
T2:变量类型选择I/O整数,数据类型选择BCD(16位BCD码);
T3:变量类型选择I/O实数,数据类型为UINT或者INT,由于传送数据是实际值的100倍,所以在定义变量时需要做一个线性变换,如图2所示,使最大值[IO]为最大值的100倍,最小值[IO]是最小值的100倍,并在转换选项中选择线性转换就可以在工程中直接显示实际值;
图二
STATUS:变量类型选择I/O整数,数据类型选择UINT,需要在工程中对STATUS中的某个位进行显示和设置时,要使用世纪星中的Bit(Tagname,BitNo)和BitSet(“Tagname”,BitNo,Discrete_Value)这两个函数,具体的使用方式可以参考天星中的函数说明。
今天给大家介绍了如何选择Modbus设备以及如何连接寄存器,对于标准的Modbus协议来说,掌握这些已经可以从设备中读出一个正确的数据,但有些厂家的Modbus协议在字节顺序以及功能码的使用方面和标准Modbus协议,是有一些小的出入,针对这种情况,我们的Modbus驱动也做了相应的调整,通过设置初始化字解决这个问题,其具体的设置方式我将会在下一篇介绍给大家,感谢您的关注!