你有没有想过,为什么在西门子PLC编程中以前要写那么复杂的指针解析代码?为什么后来S7-1500换成了 Variant?新的Reference又是怎么弥补Variant的一些坑的?今天我就带你看明白其中的逻辑。
>>>立即发帖,说说你过去弥补过的Variant一些坑!

虽然你可能不知道Pointer 和Any 的数据类型,但你可能已经使用过它了。Pointer、Any都是用于程序块的接口,例如INPUT 、OUTPUT、静态变量等,也称为参数类型。例如通信程序块中的通信地址区,P#DB1.DBX100.0 WORD 100, 这个就是Any类型。Pointer、Any绝大部分都是用于编写程序块的,这也是程序标准化的雏形。


(第一个是ANY,第二个也是,红色方框的是POINTER)
P#DB1.DBX100.0就是为Pointer类型, 与Any相比没有数据类型和长度,所以Any类型的数据结构中是包含Pointer类型的。

大家想一想,自己编写一个FC1,使用输入接口类型是Any, 别人调用赋值可以是DB区,也可以是M区,I区,还有数据类型和长度,这些都是可变的,自己怎么知道这些信息然后进行判断呢?就靠上面展示的10个字节,总共80位,所以也称为80位的指针,对应关系看下图。

另外这个ANY类型变量没有开始地址,也没有偏移地址,S7-300/400变量最大空间只有4个字节,那怎么能读出10个字节的内容呢?下面在FC1中编写的这段程序就是用于拆解这10个字节的。

开始时装载ANY类型变量的首地址到地址寄存器中,然后偏移一个字节,得出数据类型,偏移4个字节,看看Any是不是使用了DB块,最后得出开始地址后,就可以进行地址区的迭代了。总之大部分工程师被迷惑在拆解的过程中。

如果还想在S7-1500中使用,在接口区就直接拆分了,也不需要编程了,更加方便了。
S7-1500中使用符号地址寻址,所以Pointer、ANY类型就不能使用了,通信块的地址区都使用Variant替代Any了。
我们再想一想,如果Variant是输入输出类型,先使用Variant_get指令读出一组赋值的实参,例如是一个UDT,进行计算,然后修改当前值,最后再使用Variant_put指令写回去,会有问题吗?(画面三秒倒计时等待)会有问题的。如果在写之前赋值的实参发生了变化,那么再写回去,实参的值就会被覆盖,会有风险的。你说我一个编写程序块的人,我怎么知道使用者是怎么调用的呢?后来又推出了参考,解决了这样的问题。
>>>立即发帖,说说你过去弥补过的Variant一些坑!
有问题,欢迎在评论区留言,下期你想讨论什么内容呢?可以评论区告诉我们!在论坛,你值得!
往期回顾:
【每周热议】第24期 | 设备“抽风”问题解决方法!99%工控人踩过的坑
【每周热议】第23期 | AFb 自动化框架封神!谁用谁香?? 告别无效加班,PLC 开发直接提速
【每周热议】第22期 | 【PLC编程大比拼】起保停VS置位复位,哪个更好用?