技术论坛

 看了“关于使用数组的弊端如何解决”帖子后,我的一个想法,欢迎大家指点

返回主题列表
作者 主题
pkh2006
奇侠

经验值:6128
发帖数:878
精华帖:11
楼主    2023-04-13 11:33:04
主题:看了“关于使用数组的弊端如何解决”帖子后,我的一个想法,欢迎大家指点 精华帖 

昨天浏览论坛时,发现这么一个帖子,其实在热线上也偶尔遇到,之前只是简单的说一下这个没有办法,一般都是数组。

帖子链接:https://www.ad.siemens.com.cn/club/bbs/post_1816154_66_0_9.html#anch

我最近准备V18新功能时,发现有个新功能就是ResolveSymbols,这个通过将符号名解析的方式,转为Byte数组,对于SCL甚至还可以通过指令MoveToResolvedSymbol直接转为目标变量,这种方式可以一定程度的解决上述问题,当然就是麻烦些,需要先解析(初始解析一次就好,解析是异步指令),然后读取,使用变量完成后再写入。此外就是目前这个版本不支持解析整个结构,只能解析基本数据类型,对于复杂数据类型的例如UDT这种无法直接解析,只能拆开解析,这会极大的增加工作量,也会增加很多的工作存储器的使用(每个解析变量使用一个WString[254],也就是0.5kB),所以对于简单的,我们可以这样使用,复杂的如果想使用还是再等等未来版本更新。

不过这个倒是给了我一个思路,既然它这个可以解析为Byte数组,那我们能不能把我们需要的UDT转为Byte数组处理呢?答案是肯定的,我们有序列化和反序列化啊,我们就可以利用这两个指令来回转换就可以实现我们的功能,那说干就干。

第一步,建设备使用的UDT,非常简单。

第二步,建基于该UDT的一系列变量组成的UDT,名称随意,数量随意。

第三步,编写基于初始UDT的程序,也就是我们最终要如何处理这个UDT,这里就是,一个移位,一个自加,实际根据工艺编写。

第四步,就是编外围的循环程序了

首先是接口区的定义,这里程序简单,就直接FC了。

下面是程序部分,虽然不如直接数组间接寻址简单,但也算是可以实现需要的功能。

第五步,调用验证,这里只截取部分数据


——————————————————分割线—————————————————————————

最后再介绍一下我们的新指令用法,以SCL为例,因为LAD还需要序列化反序列化转换比较麻烦,这里就不介绍了。

第一步,DB中建以下变量

前四个是我们要处理的数据,名称随意,数据类型基本数据类型,考虑到我们要实现相同功能,所以一般也都是一样数据类型,当然不一样的话后期处理需要Variant。

nameList是名称的数组,一般下标是0开始,元素类型是WString,值就是上面数据的名称,注意数据块没有引号。

referenceList是引用的数组,和nameList相同的下标,元素类型是ResolvedSymbol,注意这是固件版本V3.0才开始有的数据类型,这个功能也是V3.0才能实现。

第二步,编写循环程序

首先是接口区

然后是程序部分,这里简化了判断,实际还需要从referenceList判断解析正确与否

第三步,调用验证,




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