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]( >
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)