作者 | 主题 |
---|---|
pkh2006 奇侠 经验值:6179 发帖数:881 精华帖: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判断解析正确与否 第三步,调用验证, |