抖音粉丝群1
『7x24小时有问必答』

关于这些指令的区别以及如何使用,很多人看了帮助手册还是一头雾水,本文结合相对简单的modbus tcp驱动来帮助大家解开诸多疑问。



1.GetTagXXX/GetTagXXXWait


新建一个Modbus Tcp驱动,读取从站(Modbus Slave软件)数个寄存器。


640.jpg


在画面中添加一按钮,点击按钮执行如下vbs脚本:读取r2变量值
Sub OnLButtonDown(ByVal Item, ByVal Flags, ByVal x, ByVal y)                     
Dim r2
Set r2 = HMIRuntime.Tags("r2")

r2.Read
End Sub

vbs中tag.read相当于C中Gettagxxx。运行画面,按下按钮执行 r2.Read,r2变量包含定义的触发周期被注册,驱动将按请求周期(1s=触发周期的一半)读取r2变量(发送报文03 00 01 00 01),并更新数据库r2变量值及质量代码(QualityCode)等实时数据,方法会等待并返回r2变量的值。


640.jpg


以后再次按下按钮,因为r2变量已经被注册,则直接用数据库中(tag image)r2变量的当前值返回。


640.jpg


修改脚本:r2.Read替换为r2.Read(1),vbs中tag.read(1)相当于C中GettagxxxWait。运行画面,按下按钮执行 r2.Read(1),驱动将直接读取r2变量(发送报文03 00 01 00 01),并更新数据库r2变量值及质量代码等实时数据,方法会等待并返回r2变量的值。以后再次按下按钮,将重复上述过程。


640.jpg


综上所述,由非周期的随机事件触发的读取(如按钮按下),如果变量未在服务中注册,建议使用GettagxxxWait指令;如果变量已经在服务中注册,那么建议使用Gettagxxx指令直接从数据库读取变量值(所以快于GettagxxxWait指令);对于所有周期性触发的读取,建议使用Gettagxxx指令。


注意:对于已注册的变量,如果新的请求周期快于原来周期,那么原来周期将被新周期替换。


2.读取从站不存在的变量地址


在画面中添加一按钮,点击按钮执行如下vbs脚本:读取r1、r2、r3变量值(当然也可以使用对象HMIRuntime.Tags.CreateTagSet创建批量请求,tag.value取值。这个在tag.read(1)读取中更有用,可以控制读取多个变量只需向AS发送一个请求,相当于C脚本的GetTagMultiWait)
Sub OnLButtonDown(ByVal Item, ByVal Flags, ByVal x, ByVal y)

Dim r1
Set r1 = HMIRuntime.Tags("r1")
Dim r2
Set r2 = HMIRuntime.Tags("r2")
Dim r3
Set r3 = HMIRuntime.Tags("r3")

r1.Read
r2.Read
r3.Read

End Sub


运行画面,按下按钮执行 r1.Read,r1变量包含定义的触发周期被注册,驱动将按周期读取r1变量(发送报文03 00 00 00 01),并更新数据库r2变量值及质量代码等实时数据,方法会等待并返回r2变量的值。然后执行 r2.Read,r2变量包含定义的触发周期被注册,驱动将按周期读取r2变量(发送报文03 00 01 00 01),并更新数据库r2变量值及质量代码等实时数据,方法会等待并返回r2变量的值。再执行 r3.Read,r3变量包含定义的触发周期被注册,驱动将按周期读取r3变量(发送报文03 00 02 00 01),并更新数据库r3变量值及质量代码等实时数据,方法会等待并返回r3变量的值。


640.jpg


但接下来,驱动并未重复发送一开始的三个报文,而是优化组合成了从起始地址3x400001(r1变量地址)请求3个连续寄存器的报文03 00 00 00 03。


640.jpg


接下来,修改下modbus slave,只配置400001与400002两个寄存器。


640.jpg


关闭画面(这时此画面注册的变量读取将被注销),再运行画面,执行上面的脚本。r1变量包含定义的触发周期被注册,驱动将按周期读取r1变量(发送报文03 00 00 00 01),并更新数据库r2变量值及质量代码等实时数据,方法会等待并返回r2变量的值。然后执行 r2.Read,r2变量包含定义的触发周期被注册,驱动将按周期读取r2变量(发送报文03 00 01 00 01),并更新数据库r2变量值及质量代码等实时数据,方法会等待并返回r2变量的值。


再执行 r3.Read,r3变量包含定义的触发周期被注册,驱动将按周期读取r3变量(发送报文03 00 02 00 01),由于读取的寄存器不存在,从站返回报文03 FF 83 02。驱动收到此报文后再次发送了报文03 00 02 00 01,同样从站返回报文03 FF 83 02。无法更新数据库r2变量当前值,质量代码更新为0x04 - bad - configuration error (value not accepted),方法会等待并返回r2变量的值。


640.jpg


接下来,驱动发送从起始地址3x400001(r1变量地址)请求3个连续寄存器的报文03 00 00 00 03。由于其中读取的寄存器3x400003不存在,从站返回报文03 FF 83 02。驱动收到此报文后再次发送了报文03 00 00 00 03,同样从站返回报文03 FF 83 02。无法更新数据库r2变量当前值。然后驱动会重复此过程,周期发送报文03 00 00 00 01、03 00 01 00 01、03 00 02 00 01、03 00 00 00 03,包含了很多无用的报文。



大家知道,对于每一个通讯驱动它的带宽是有限的,为了提高系统性能,优化项目中通讯是必须的。不然会造成如数据刷新慢,下发数据不成功等问题。所以,至少有一点要避免:访问AS中不存在的变量地址。


3.SetTagXXX/SetTagXXXWait


SetTagXXX/SetTagXXXWait的使用相对比较简单,选择哪一种主要根据具体应用来。


使用SetTagXXX函数(Asynchronous writing 异步写入),待写入的值会传送到变量管理,然后立即返回,并继续执行脚本。 至于这个值什么时候实际写入AS并不关心。


对于周期触发的写入,建议使用SetTagXXX。


但如果必须确保实际写入AS之后,才能继续执行脚本,那么就使用SetTagXXXWait(Synchronous writing同步写入)。如果没这些要求,一般都使用SetTagXXX,系统能得到更快的响应速度。



在C脚本中批量写入可使用SetTagMultiWait,但并没有对应的SetTagMulti。


就写到这,如果有什么问题可留言。



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码