关于问题 ID 217835 —– ANY指针的传送

我的疑问就是如何把外部的UDT Phase 全部传送到 #T_pointerEP 里面的?然后再用SFC20进行块传送???
首先从SFC20看,是从#T_pointerEP到#Temp_EP的;#T_pointerEP 对应的是#EP_Module 而#EP_Module  对应的是P#DB730.DBX200.0 估计这个也是UDT Phase 数据类型;你可以找到这个DB块看看;
其他程序只是用的 "#Temp_EP.xxxxx" 逻辑比较编程的的FBD指令:就是去外部的数据在程序里进行比较计算的,这也是可以的;
首先,要知道这些复杂的数据类型是用指针的形式在PLC进行传递,至于是用PIONTER还是用ANY,我也比较头疼;这里就默认是用ANY的吧;既然用到了ANY指针就要理解ANY指针的使用,ANY数据内部的定义,你的程序块里定义了一个IN_OUT数据#EP_Module ,在调用块时这个#EP_Module 对应的是P#DB730.DBX200.0应该是一个UDT Phase数据;
然后,程序里,如下:
      L     P##EP_Module                // Any datapointer for EP
      LAR1  
      L     D [AR1,P#0.0]
      T     LD     0            //  注意这个  
      L     D [AR1,P#4.0]
      T     LD     4       
      L     W [AR1,P#8.0]
      T     LW     8      
这段程序就是将#EP_Module  对应的外部的 UDT Phase的信息传给   #T_pointerEP,因为在临时变量里这个ANY数据是从L0.0开始的,这个数据就对应上了;
建议你看下如下链接的资料中关于ANY的部分
S7-300和S7-400寻址:
https://support.industry.siemens.com/cs/document/79632832/s7-300%E5%92%8Cs7-400%E5%AF%BB%E5%9D%80?dti=0&lc=zh-CN   
//**********************************************************************
  L     P##EP_Module               
      LAR1  
      L     D [AR1,P#0.0]
      T     LD     0            
      L     D [AR1,P#4.0]
      T     LD     4       
      L     W [AR1,P#8.0]
      T     LW     8 
……………………………………………………………………………………………………………………………..
对比较ANY指针数据类型的结构,我的疑问始终是:不能理解如何使用上面的几条语句就把整个UDT Phase 几十个甚至上百个Byte 的数据传送进去 ?
要实现传送DB块内的数据段,必须要有B#16#84, DB块的号码,数据区的长度等等,这些好像都看不出在哪里?帮忙分析分析,谢谢!

最佳答案

1.我的疑问始终是:不能理解如何使用上面的几条语句就把整个UDT Phase 几十个甚至上百个Byte 的数据传送进去 :
你的疑问在于,要理解ANY是指针,指针就是地址的地址,ANY指针包含了数据类型,数据的长度和具体的地址等,PLC就是根据具体指针数据提供的信息,读取这个指针对应的地址的数据,那就可以很多了;
2.要实现传送DB块内的数据段,必须要有B#16#84, DB块的号码,数据区的长度等等,这些好像都看不出在哪里:P#DB730.DBX200.0 就包含了很多信息了,DB号有了,起始的地址也有了,长度没有,可能是自定义数据原因吧,至少在调用的时候不报警,应该就满足了要求,相当于自动检测吧。
      L     P##EP_Module       //IN_OUT数据对应的是 "PPMT IDB ep".epPPMT02Tank       
      LAR1  
      L     D [AR1,P#0.0]
      T     LD     0            
      L     D [AR1,P#4.0]
      T     LD     4       
      L     W [AR1,P#8.0]
      T     LW     8                   
以上程序直接将外部对应的ANY指针的信息复制了,#T_pointerEP的地址是L0.0开始的,共10个字节,看到了吗,T  LD0  T  LD 4  T   LW8   
"PPMT IDB ep"这个DB块里是不是有一个名称为epPPMT02Tank的UDT Phase数据呢,

总结:整个过程呢,就是复制一个UDT Phase结构的数据到一个块里的临时变量#Temp_EP里,然后在做数据的比较计算等,为了复制这个复杂的数据结构利用了ANY指针,#EP_Module作为这个块的输入变量,是ANY指针的数据结构,但是这个变量不能直接使用,因此又定义了一个#T_pointerEP,这个变量的数据是ANY指针,然后就是将#EP_Module对应的ANY指针数据复制给了#T_pointerEP,最后在SFC20上调用;

提问者对于答案的评价:
"PPMT IDB ep"这个DB块里是有一个名称为epPPMT02Tank的UDT Phase数据。

总结:整个过程呢,就是复制一个UDT Phase结构的数据到一个块里的临时变量#Temp_EP里,然后在做数据的比较计算等,为了复制这个复杂的数据结构利用了ANY指针,#EP_Module作为这个块的输入变量,是ANY指针的数据结构,但是这个变量不能直接使用,因此又定义了一个#T_pointerEP,这个变量的数据是ANY指针,然后就是将#EP_Module对应的ANY指针数据复制给了#T_pointerEP,最后在SFC20上调用;

//******************************************************************************************
虽然没有彻底分析出数据长度如何传送到指针内,但是仍然很感谢您的解答。
经过测试这种编程方式可以传送整个自定义的UDT数据段。若您后续知道更详细的细节,望您不吝赐教,谢谢。

最佳答案作者回复:
好的,,QQ,283595951

原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc345629.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2021年7月4日 下午10:43
下一篇 2021年7月4日

相关推荐

发表回复

登录后才能评论