1011 【万泉河】优化编程第二弹:MODBUS通讯字符串

已锁定

万泉河

  • 帖子

    10904
  • 精华

    132
  • 被关注

    1012

论坛等级:至圣

注册时间:2003-06-06

钻石 钻石 如何晋级?

1011 【万泉河】优化编程第二弹:MODBUS通讯字符串

2203

3

2024-10-13 17:03:21

1011 【万泉河】优化编程第二弹:MODBUS通讯字符串

 

我很欣慰, 又发表了一篇标志性意义的雄文《0923 【万泉河】换个视角看TIA PORTAL 数据块的优化和非优化》

 

掀起了主张PORTAL编程中全面使用优化方法的潮流。 请大家记住这个时间,2024年国庆节前, 然后过些年后,大家看一下当时的行业现状,再回过头看看我今天提出的这一主张又提前了多少年。

 

就有人不乏醋意的评论道:遥遥领先,又自以为是的遥遥领先了!我说,嗯,谢谢大家给面子,谢谢行业的其他大神都松弛懈怠不进步,或者有了成果后也不总结为观点发布, 总之又被我一不小心占了先机。而至于领先多少, 还是取决于同行的捧场, 如果对方永远不进步,即便到退休也不到这个层级,那就又是一辈子了。

 

然后只有跟在后面叮错别字, 指望着发现一个错别字,就可以对文章所有观点全盘否定,然后就试图实现把我拉回到和你们一样的一事无成,没有成果,没有自己观点的平庸,然后就以为自己赢了。 这也可以,我会不断的留一些破绽的,满足一些人的欲望。

 

文章发表后, 有人在后面表达支持,虽然不多,足够了。再多还显示不出那么先进性,我还没那么高兴呢!

 


后来为了补充验证,又发了一篇《0929 【万泉河】TIA PORTAL 优化模式的S7通讯实现》,主要讲解了在优化模式下, 通讯用到的variant类型的数据,可以用复杂数据类型的符号寻址绑定实参,也仍然可以正常运行。

 

其实还有一个相似但更为复杂一点的问题,比如有人提问如何用MODBUS通讯传递字符内容?

 

所以在前一篇做的TCP全双工通讯功能上做个演示实现。

 

实验思路很简单,2个通讯任务,首先将字符串STR1的内容通过MODBUS传送给MODSIM模拟器的数据区,然后再运行第2个任务把同一批数据读回到PLC中字符串STR2中。那么只要STR1中预设了内容, 通讯成功后,STR2中会得到与STR1同样的内容。

 

 

使用前一篇文章实现的FB块,调用直接将STR1绑定到BUFF管脚,惊奇地发现可以直接成功:


MODSIM中显示的数据:



这些字符显然就是预设字符”YANTAI”所对应的ASCII码,比如有2个A,所以里面有2个41

 

然而这与我以前的认知是不符的,检查发现,原来是因为调用的FB的类型不知何时不经意被设置为了非优化。 所以本质上STR1和STR2数据区是非优化数据。

 

而在将FB改为优化之后,再次下载运行,显示为:

 


报错误16#818B。


正确的通讯的数据区需要是byte数组,数据区中增加了2个数组:


并在2次任务的前后分别增加了数据格式序列化和反序列化的转换:




则可以顺利实现数据的转换和通讯。

 

总结:

Serialize序列化和Deserialize这一对函数是优化函数,非必须用非优化数据对接,而且它们就是我们用来处理数据优化数据类型的。 把复杂数据序列化成一个数组,然后用于通讯,这在计算机编程中也经常遇到。 相当于C语言编程中的RAWDATA。 而且我相信,如果通讯的对接方是电脑, 那么对方也应该用RAWDATA来对接的。

(回顾一下PORTAL中哪一个版本开始具备了这一对函数的?那就是PORTAL全面支持了全优化编程的起点)

 

在顺利完成字符串的通讯传递之后,我们自然而然地会想到还可以用来传送中文字符。 很简单, 只需要把字符串类型改为WSTRING即可。 只要通讯双方使用的同一种字符编码方式,那么字符内容就可以正确显示。 而我们实验用的本机,自然也不会有错误。

 

然而,这里需要喊一个大大的

 

我这里用的是PORTAL V16,为了中文这部分测试,我曾经一度把S7-1200CPU干崩溃了!报错误:



然后再不管是恢复出厂, 升级固件,CPU都不能正常,把我郁闷到真以为CPU坏掉了。

 

只不过后来又用V19升级了固件, 再后来又回到V16,下载正常的程序, 才正常了。 而这段对中文字符的序列化,我不敢搞了。

 

不过,我猜, 这应该只是V16中的BUG, 有可能在更高的版本比如V19中,已经解决了。 但我不敢试了。

 

有勇敢者可以试一下。

 

代码即:

#POS := 0;

#RET:=Serialize(SRC_VARIABLE := #WSTR1, DEST_ARRAY => #ARR1, POS := #POS);

 

这篇文章做的例子仍然会发布到烟台方法知识星球,星球居民可以同步下载实验学习验证。

 

 


1011 【万泉河】优化编程第二弹:MODBUS通讯字符串 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-1200系列

共有15228条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
X 图片
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。