2020-12-06 labview用I/O Server连接modbus(填坑)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2020-12-06 labview用I/O Server连接modbus(填坑)相关的知识,希望对你有一定的参考价值。

参考技术A modbus是一种比较通用的协议,用来做数据采集很方便,也很便宜,至少比NI的板卡便宜两个量级,但是配置较为复杂,同时采集速率并不高。对于1s左右采样间隔的数据来说,modbus是一种非常合适的方式。

labview使用modbus有很多种方法,其中最方便地第一种就是用共享变量引擎(Shared Variable Engine, SVE)来读写modbus的寄存器(类似模拟IO)和线圈(数字IO)。其他方法比较繁琐,因此这里只研究了这种labview使用I/O Server访问modbus的方式,其它的比如采用VISA的modbus串口/TCP VI进行读写的方式以及采用OPC服务器进行读写的方式在这里就不研究了。

这里采用的win10 64bit中文版系统,Labview 2018(和谐版),同时安装了分布式控制系统(Distributed Control System, DSC),这样就可以使用modbus I/O Server了,根据官网资料,除了labview,必须还要安装DSC或者RT模块,才能使用modbus,其中最好是安装DSC模块。

这里的系统架构如下图所示,Labview负责逻辑和前端展示,与PLC的modbus协议进行交互是通过I/O Server完成的。I/O Server其实是NI 的共享变量引擎SVE的一种插件。所以在运行的时候需要安装和启动SVE。

这个SVE一般在windows里面是以服务形式安装的,安装的服务名为NITaggerService,安装位置是在C:\Program Files (x86)\National Instruments\Shared\Tagger。如果是SVE的一些问题,可以查看这个服务是否启动。但是坑爹的NI没有说log文件在哪儿,有时候查错很麻烦。

安装了DSC之后,就可以启用modbus I/O Server了,对于中文Win10系统装labview 2018而言,坑的地方在于你按照官网教程走完是不行的,会出现modbus变量无法读取的问题,并且显示链接已经断开。如果你手动启动SVE服务(即:NITaggerService),当时是可以启动的,然后你用NI分布式系统管理器(NI distributed system manager)查看变量会不成功,再看服务已经停止了,但是由于没有log文件,所以我们也不知道它什么时候停止的。

后来发现一个方法可以修正这个问题:在NI分布式系统管理器中重新编辑一次I/O Server(参考下土),再在“操作”菜单下点击“启动本地共享变量引擎”,所有的值就正常了。 

modbus在I/O Server中的的地址设置比较诡异,是按照[数据解释类型][功能码地址头][PLC格式的起始地址].[位]来区分的。

比如SD400002,其中数据解释类型是SD,表示有符号的双字整数(Signed DWord Integer),双字意味着这是个32位的整数,需要两个寄存器,功能码地址头是4,表示功能码是3,即modbus的保持寄存器(Holding Register)字段,后面的PLC格式的起始地址是5位的00002,也就是从第2个寄存器开始,连续取2个寄存器(即00002和00003),组合成有符号的双字整数。

至于组合的过程涉及到大小端(Endianness)的问题,大小端涉及到byte order和word order的问题,一个word就是一个寄存器(16位),一个byte是8位,当一个寄存器中的两个byte组合并解释为变量的具体取值的时候,可以选择把哪个byte放到前面,哪个byte放到后面,这就是byte order,大部分情况下,byte order是大端在前(big endianness),而word order则是在两个寄存器储存的两个16位的字(word),如何组成32位的数据,不同的厂商会有不同的约定,这个就差异比较大了,需要查看手册。

NI的modbus I/O Server中,word order可以在高级选项中设置,但是byte order是没有地方可以设置的。

此外,NI还有一个比较坑爹的地方是它的modbus tcp连接不支持502以外的端口。也就是一个IP地址最多只能对应一个modbus,虽然可以靠Unit ID来进行区分,但是实际使用中也可能存在用不同端口区分设备的情况。

1.[How LabVIEW Uses I/O Servers]( https://www.ni.com/zh-cn/innovations/white-papers/12/how-labview-uses-i-o-servers.html )

2. [Connect LabVIEW to Any PLC Using OPC](https://knowledge.ni.com/KnowledgeArticleDetails?id=kA03q000000x0MPCAY&l=zh-CN)

labview如何读取txt中的一系列浮点数,并转为二进制输出到端口?

如图现有这样一组的数据(4列n行)存放在txt文档里,求问labview中如何调用读取这些数据,形成四维数组,然后将数据转换成同格式的二进制形式输出呢,坐等大佬解答,感激不尽

先将文本文件中的逗号替换成英文半角格式的(对应十六进制ASCII码为2C),显示如下:

存放数据的txt文件

在LabVIEW中调用读取电子表格的函数,分隔符用正确的逗号符:

程序框图

运行即可在前面板得到正确的显示输出。

前面板

参考技术A 读取TXT,labview很简单在”文件I/O”里找到”配置文件VI”,就可以读出来。追问

恩恩,读取这一步已经解决了,就是后面的将数据取出来形成四维数组,再转换数据为二进制输出不会

追答

我看了下,你可以用”匹配模式”匹配间隔符号,在插入数组,或者保存TXT的时候用表字符方式保存也可以,小数浮点好像不可以直接转二进制。

参考技术B 二进制,十六机制转十进制比较容易,直接int(‘7a’,16)就可以了,但是注意这里是单字节,也就是8位的。
十进制也可以转十六机制和二进制,使用ord() hex() 方法便可,注意也是单字节的转换,多字节的则不适用,需要重新进行程序的 编写,比如说双字节的十六进制转换为十进制,可以先进行单字节的转换,然后256*高字节的十进制+低字节的十进制。
(注:有一些封装好的库可以方案进行多字节的转换,但是其基本原理还是需要知道的)追问

您好,有模块连接的图吗?而且好像
您说的是MATLAB的实现方法吧?

以上是关于2020-12-06 labview用I/O Server连接modbus(填坑)的主要内容,如果未能解决你的问题,请参考以下文章

labview怎么用串口发命令

如何将labview tcp/ip接收到的平化字符串数据还原

labview如何进行串口通讯

labview 中调用WebBrowser, postdata这里的数据要怎么处理, 求指教

LABVIEW如何实现数组多次条件判断,并且替换数组中的值

LabVIEW串口通信