「原创经验」昆仑通态触摸屏读取S7-1200的ASCII字符串时的问题

字符串是西门子PLC和昆仑通态触摸屏的基本变量类型之一,有着重要的作用。但是,在昆仑通态与S7-1200的通讯配置里,却没有这个数据类型(KEPWARE、西门子触摸屏里都有这种数据类型)。网上也无法找到相关资料,于是自己琢磨,没有快捷的方法,应该有笨的方法,字符串无非就是一串字节而已。另外,昆仑通态里有ASCII值转字符串的函数(!I2Ascii(s)),可以通过编程来获得字符串。

基本思路:在S7-1200里,字符串的第一个和第二个字节都是字符串的长度值,从第3个字节开始就是实际的字符ASCII值。在触摸屏里设置一个开关量(也是整型变量)对应长度字节,另外,再设置一组开关量对应自己需要读取的字符值。在策略里定时读取这些值,用循环来将数字转换成字符,再组合成一个完整的字符串。

想清楚了,就动手,代码就几行,但是,就是无法获得字符串。妖怪了,于是,舍弃循环,更换函数,更换函数参数的数据类型都不行。最后决定,先转几个字符看看。由于,昆仑通态触摸屏没有PLC那样的调试功能,因此,只能这几个字符的原始值、转换结果等内容做在一个测试画面上进行查看。发现这几个字符一切正常,组合成字符串也是正常。自认为找到原因了,再次用循环读取剩下的字符,并将结果放置在正式画面里。结果,只有前面这几个字符是正常的,且重新上电后,这几个字符也不正常。进测试画面后,发现这几个字符正常,回到正式画面后,发现这几个字符也出现了。这个问题,困惑了很久,不停地改代码,测试,都没有发现问题。

真的过了好久,突然想,其他字符到底是怎么回事呢?于是在测试画面再增加监控几个字符,发现这几个字符也正常了。突然明白了,

问题出现在通讯变量的更新机制上:在西门子触摸屏里配置变量时,可以选择是显示时再更新,还是后台持续更新。但是,昆仑通态并没有给这个选择,却默认为显示时再更新。这样,当我将变量做到测试画面,并进入测试画面后,这些变量开始更新,于是就能得到这些变量的值,其他没有做出来的变量还是没有更新。同样的原因,刚上电时,如果不进入测试画面,那几个变量不更新,后台的策略也读不到值,因此,也不能获得字符串。

想明白了这个机制后,于是就将这些通道变量做在需要看字符串的画面里(想办法藏起来即可),这样,进入这个画面后,变量开始更新,果然能得到正确的字符串了。

这是个笨办法,昆仑通态的报警变量肯定是持续更新的,因此,应该还是有办法的,找机会咨询一下售后再告诉大家结果。

昆仑通态内部的函数做的还是强壮的,比如上边这个!I2Ascii(s),可以接受所有的数值型的变量(整型、浮点),因此,根本找不到数值类型转换的函数(它内部会自动转换的)。

2019年1月13日


说明:

1、本文是实践经验,非严格论文,与相关产品和理论可能不完全相符。

2、如需控制、三电相关帮助,交流,请关注本人,并加入技术讨论QQ群:877456127,那里有很多热心同行。


分享到:


相關文章: