1.概述
可配置Modbus网关可以预先配置Modbus RTU端的设备的地址、功能码和寄存器列表,并存储到网关内部。网关会自动采集这些配置的RTU设备的数据,然后映射到连续的Modbus TCP寄存器地址,从而允许Modbus TCP端一次性读取所有的设备的不同寄存器的数据。它的这种地址映射功能是对普通的Modbus RTU转Modbus TCP的Modbus网关的补充。
卓岚ZLAN5143、ZLAN7144、ZLAN7146、ZLAN5207M、ZLAN5407M等都支持可配置Modbus网关功能。其中ZLAN5143需要固件版本1.579及以上版本,配合ZLVircom5.15及以上版本来使用。7144需要固件版本1.491及以上版本。卓岚可配置Modbus网关简称为“ZLMB网关”。
可配置Modbus网关具有如下的优点:
1.指令合并:可以将分散的不同的站地址、寄存器映射到同一片寄存器。这样Modbus TCP端可以用一条指令采集所有数据,而不是分为几条指令分别去采集,实现了Modbus TCP端的传输效率。
2.预先采集:虽然之前的“存储型Modbus”可以自动采集一些数据,但是自动采集是在Modbus TCP端查询第一条指令开始的,所以第一条指令本身的返回数据还是需要等待串口的信息的返回。而可配置Modbus网关的自动采集是从网关上电就开始,第一条指令仍然可以快速应答。
多主机支持:可以支持多台Modbus TCP客户端连接上读取网关数据。
4.支持写指令:目前对于重新映射过的寄存器地址,Modbus TCP端不仅可以使用重新映射的地址读到数据,而且可以向这个重新映射的地址使用05和06指令写入数据。
5.支持任意长度读取:ZLVircom配置工具会显示RTU端的寄存器地址和TCP端的寄存器地址的映射关系。Modbus TCP端不仅可以整片读取寄存器和单个读取寄存器,而且可以任意长度来读取合法地址和长度的寄存器内容。
6.支持离线提示:当某个RTU设备从RS485总线上离线后,从Modbus TCP这端查询到的数据将全部变为0,提示设备的离线。
7.支持丢失重发:由于RS485总线容易存在干扰,假如第一次查询指令没有应答,则网关会再发送一条指令,并等待超时时间,如果确认第二次也没有应答才认为设备离线。通过ZLVircom可以设置第一次发送的时间和第二次超时应答时间。
8.支持大量设备和寄存器:目前支持100条RTU查询指令和500个寄存器数量,同时被访问。
2.简单例子
2.1.RTU采集要求
这里以ZLAN5143为例来介绍,首先确认固件版本为1.579及以上版本, ZLVircom为5.15及以上版本。
假设ZLAN5143的RS485下面接了2个Modbus RTU设备,需要采集的信息如下:
记录编号 | 从站地址 | 功能码 | 寄存器地址 | 长度 |
1 | 1 | 3 | 2 | 4 |
2 | 2 | 1 | 5 | 9 |
3 | 3 | 3 | 2 | 4 |
现在需要ZLVircom进行配置,实现可以配置Modbus网关。
2.2.ZLVircom配置
运行ZLVircom,进入设备管理点击搜索设备选择一个需要配置的设备点击编辑设备点击下面“固件和配置”按钮,弹出如下对话框:
图 1进入ZLMB配置方法
这里选择“网页目录下载”,并且点击“…”,选择一个之前新建的空目录,用于存放配置信息。然后点击“ZLMB网关”按钮,弹出如下对话框:
图 2可配置Modbus网关设置列表
点击“添加”按钮可以逐条添加表1的RTU指令。这里需要注意的是网关会将Modbus TCP这端的寄存器地址从0开始自动按顺序增加。所以为了让同一个功能码的指令可以一次性分到同一个区域,应该将相同功能码的指令连续添加。也就是将表1的记录编号1和记录编号3放在一次,而编号2放在最后。添加的3个图如下:
图 3表1的编号1 RTU指令的配置
对于编号1的RTU指令的配置对话框解释如下:
1.记录编号:这个是系统根据添加的顺序自动增加编号,不可修改。不一定和表1一致。
2.从站地址:该RTU指令的RTU端从站地址。
3.Modbus功能码:该RTU指令的功能码。
4.寄存器起始地址:RTU端指令的寄存器开始地址。
5.寄存器长度:RTU端指令的寄存器查询长度。
6.串口轮询间隔:这个间隔是网关正常发送查询指令后等待应答返回的时间。也是轮询的速度。所有RTU指令的这个参数是一样的,如果不一样取最大者。
7.超时应答时间:这个时间是在正常发送查询指令接收不到应答时,立刻发送第二条查询时的等待应答返回时间。所有RTU指令的这个参数是一样的,如果不一样取最大者。
8.支持06或者05写指令:勾选这个选项将可以支持Modbus TCP端对RTU设备的数据的改写。若不需要改写则不要勾选,因为勾选,会额外增加内存和计算量开销。
9.Modbus TCP寄存器地址:这个地址是系统自动按照顺序计算的,Modbus TCP端只要按照这个起始地址读取即可得到这条RTU指令获得的数据。这个参数是地址映射的关键信息。
确定后,再次点击“添加”,添加表1编号3的指令:
图 4表1的编号3 RTU指令的配置
这里看到Modbus TCP寄存器地址自动增加到4。说明两条指令合并的寄存器从0~7,整个寄存器范围都可以一次性读取。
添加表1编号2的指令:
图 5表1的编号2 RTU指令的配置
这里系统自动分配的Modbus TCP地址为01指令的128地址(十进制)。最后列出的表格是:
图 6 RTU和Modbus TCP寄存器映射关系表
这个表格列出了RTU和Modbus TCP寄存器映射关系。也清楚的展示了,如果用户需要获得RTU端的某个设备的数据需要用什么功能码的什么寄存器地址去读取数据。
例如需要读取从站地址2功能码1、寄存器地址5、长度9的数据可以使用Modbus TCP指令的任意从站地址、功能码1、寄存器地址128、长度9来读取。 最后点击“保存并返回”来保存设计,如果点击“不保存返回”则放弃设计。同时可以通过选择某一行点击“编辑”进行编辑,点击“删除”删除某个RTU指令。
点击“保存并返回”后回到“卓岚网页/程序下载工具”界面。在这个界面点击“下载按钮”。下载完毕后弹出“传输完毕…”按钮,然后点击确定,设备将会自动重启,并加载这个配置。
2.3.数据测试
现在使用串口模拟这个RTU设备,并进行测试,RTU端模拟参数如下图。
图 7 模拟表1的3个RTU设备
然后将ZLAN5143连接到这个计算机串口。假如设备的IP为192.168.0.200,端口4196,Modbus TCP软件连接上这个IP和端口后读取如下的数据。根据映射关系表,应该读取0~7这8个寄存器,功能码为03;应该读取128到136这9个bit性寄存器,功能码为01。
图 8 Modbus读取网关数据
如图所示,可配置Modbus网关实现了站地址1、站地址3这两个RTU Modbus的数据合并,将其合并到寄存器0~7整片区域,实现指令合并功能。 使用SockeDlgTest连接上192.168.0.200的4196端口发送12 34 00 00 00 06 01 03 00 00 00 00指令,立即返回数据。
图 9 预采集效果
如图所示返回时间大约为18ms。这个反应时间比“存储型”Modbus的第一次应答时间要快速很多。 打开多个Modbus TCP客户端可以同时对网关进行数据采集。说明可以支持多主机功能。 在Modbus TCP端修改某个寄存器的值,则在RTU端的数据就被修改,同时也会反馈到Modbus TCP端。这说明发送的05/06单线圈修改和单寄存器修改指令写是支持的。
修改任意长度的寄存器长度读取,例如修改为从01地址开始的06个长度的寄存器内容,同样可以正常读取到Modbus TCP软件中。说明支持任意长度的数据读取。 将Modbus RTU软件关闭或者关闭串口。则Modbus TCP软件中的数据全部变为0,可见可以通过数据全部变为0来反映一个仪表的离线还是在线。 关闭Modbus RTU软件,使用ZLComDebug打开COM口接收数据,可以看到当一条指令没有应答时会重发一次。说明网关具有数据重发功能。
图 10 数据重发功能
2.4.设置离线默认值
图 11 设置离线默认值
设置离线默认值功能,可以可以让设备离线的时候采集到一个特殊的值,例如65535(也就是有符号的-1)。因为之前的默认值为0,有些设备的0是一个可能出现的值,无法区分是离线还是有效数据。
这个离线只要求高字节和低字节一样,即可以设置:v*256+v,其中v≤255且v>=0。 只有第一条记录的设置值是有效的,其它记录仿造第一条记录的参数。这里只看第一条记录的参数还包括:串口轮询间隔、超时应答时间、支持06或者05写指令。
3.其它注意事项
1.某些bit型数据无法合并,如下图,01/02指令的第一个指令的数据长度为9,不是16的倍数。所以无法通过从128开始的地址读取19个来一起读取所有数据。而是应该按照软件给出的128地址读9个,144地址读10个,分别读取。
图 12 Bit数据的连续
2.Modbus TCP的站地址无所谓,一般用01即可。
3.如果发现无法支持05/06指令,请确认设计的时候是否已经勾选05/06支持选项。
4.注意02功能的寄存器是无法被修改的。
5.注意Modbus网关的“转化协议”部分不要选择“Modbus TCP转RTU”,请选择“无”协议。
6.现在可以支持多寄存器写入的15/16指令。但是不要跨区域写入。例如原来的地址为2个寄存器是一起排列的,如果试图跨区域一次写入超过2个寄存器将会出错。
原文连接:可配置Modbus网关嵌入式设备联网解决方案——上海卓岚