电工学习网

 找回密码
 立即注册
查看: 1500|回复: 0
打印 上一主题 下一主题

ANY和Variant的使用案例

[复制链接]
跳转到指定楼层
楼主
发表于 2020-8-17 12:32:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.应用的基本信息
   基本应用信息描述(您所经历过的现场规模,例如硬件和网络配置、CPU的类型、版本以及个数等。您在项目的职责,例如项目负责人、主要或者辅助设计、编程调试者。)
    目的:S7-300中ANY到S7-1500后,用Variant进行替代;这里我分别写出了ANY和Variant的使用。
2.问题描述
     升级替代过程中出现的问题或者功能对比(描述移植或者使用S7-1500更新替代功能过程中的问题情况或者功能对比,语言简要、故障要点突出,现象表达清楚,为了清晰描述问题的原因,需要配图。)
    1、对于参数类型ANY的使用 :
                ANY和Variant的使用案例
     2、可以按照如下方式对ANY的10个字节进行解析。

                ANY和Variant的使用案例
       2、例如:利用它做一个可以输入任意长度数据然后求和,如下图。因为这里我多次判断了输入的数据类型,所以整个程序较长。早些年写的。

                  ANY和Variant的使用案例
       因为图片导致文件的大小超过了1M,所以只好将程序复制过来;

//********判断输入的数据类型*******//
      L     P##P_ADD
      LAR1
//对ANY进行解析
      L     B [AR1,P#1.0]
      T     #P_IN.P_1

      L     W [AR1,P#2.0]               //数据长度
      T     #P_IN.P_23

      L     W [AR1,P#4.0]
      T     #P_IN.P_45

      L     D [AR1,P#6.0]
      T     #P_IN.P_6789
      LAR1
      L     0
      T     #SUM_DR.DINTS
      T     #SUM_DR.REALS
      OPN   DB [#P_IN.P_45]

      L     #P_IN.P_1
      JL    INTC                        //不满足以下所有跳转条件时,跳转
      JU    INTC                        //当累加器1的低字节=0时跳转;空指针
      JU    INTC                        //当累加器1的低字节=1时跳转;BOOL

      JU    INTB                        //当累加器1的低字节=2时跳转;BYTE
      JU    INTC                        //当累加器1的低字节=3时跳转;CHAR

      JU    INTW                        //当累加器1的低字节=4时跳转;WORD
      JU    INTW                        //当累加器1的低字节=5时跳转;INT

      JU    INTD                        //当累加器1的低字节=6时跳转;DWORD
      JU    INTD                        //当累加器1的低字节=7时跳转;DINT
      JU    INTR                        //当累加器1的低字节=8时跳转;REAL

      JU    INTC                        //当累加器1的低字节=9时跳转;DATE

      JU    INTC                        //当累加器1的低字节=10时跳转;TIME_OF_DAY
      JU    INTC                        //当累加器1的低字节=11时跳转;TIME

      JU    INTC                        //当累加器1的低字节=12时跳转;S5TIME


INTC: JU    COMI                        //跳出JL指令
//********若为BYTE求和***********//

INTB: L     #P_IN.P_23
FOR1: T     #FOR

      L     #SUM_DR.DINTS
      L     B [AR1,P#0.0]
      +I   
      T     #SUM_DR.DINTS

      +AR1  P#1.0

      L     #FOR
      LOOP  FOR1

      JU    COMI
//********若为INT求和***********//

INTW: L     #P_IN.P_23
FOR2: T     #FOR

      L     #SUM_DR.DINTS
      L     W [AR1,P#0.0]
      ITD  
      +D   
      T     #SUM_DR.DINTS

      +AR1  P#2.0

      L     #FOR
      LOOP  FOR2

      JU    COMI
//********若为DINT求和***********//
INTD: L     #P_IN.P_23
FOR3: T     #FOR

      L     #SUM_DR.DINTS
      L     D [AR1,P#0.0]
      +D   
      T     #SUM_DR.DINTS

      +AR1  P#4.0

      L     #FOR
      LOOP  FOR3

      JU    COMI

//********若为REAL求和***********//
INTR: L     #P_IN.P_23
FOR4: T     #FOR

      L     #SUM_DR.REALS
      L     D [AR1,P#0.0]
      +R   
      T     #SUM_DR.REALS

      +AR1  P#4.0

      L     #FOR
      LOOP  FOR4


      JU    COMI


//***************判断OUT接口中外部的数据类型************//
COMI: L     P##SUM
      LAR2

      L     B [AR2,P#1.0]
      T     #P_OUT.P_1

      L     W [AR2,P#2.0]               //数据长度
      T     #P_OUT.P_23

      L     W [AR2,P#4.0]
      T     #P_OUT.P_45


      L     D [AR2,P#6.0]
      T     #P_OUT.P_6789
      LAR2


      OPN   DB [#P_OUT.P_45]

      L     #P_OUT.P_1
      JL    OUTC                        //不满足以下所有跳转条件时,跳转
      JU    OUTC                        //当累加器1的低字节=0时跳转;空指针
      JU    OUTC                        //当累加器1的低字节=1时跳转;BOOL

      JU    OUTB                        //当累加器1的低字节=2时跳转;BYTE
      JU    OUTC                        //当累加器1的低字节=3时跳转;CHAR

      JU    OUTW                        //当累加器1的低字节=4时跳转;WORD
      JU    OUTW                        //当累加器1的低字节=5时跳转;INT

      JU    OUTD                        //当累加器1的低字节=6时跳转;DWORD
      JU    OUTD                        //当累加器1的低字节=7时跳转;DINT
      JU    OUTR                        //当累加器1的低字节=8时跳转;REAL

      JU    OUTC                        //当累加器1的低字节=9时跳转;DATE

      JU    OUTC                        //当累加器1的低字节=10时跳转;TIME_OF_DAY
      JU    OUTC                        //当累加器1的低字节=11时跳转;TIME

      JU    OUTC                        //当累加器1的低字节=12时跳转;S5TIME

OUTC: JU    COMO


//*************根据外部接口的数据类型选择输出**************//
OUTB: L     #SUM_DR.DINTS               //若外部填的字节
      T     B [AR2,P#0.0]
      JU    COMO

OUTW: L     #SUM_DR.DINTS               //若外部填的INT
      T     W [AR2,P#0.0]
      JU    COMO

OUTD: L     #SUM_DR.DINTS               //若外部填的DINT
      T     D [AR2,P#0.0]
      JU    COMO

OUTR: L     #SUM_DR.REALS               //若外部填的浮点数
      T     D [AR2,P#0.0]
      JU    COMO
//*************将块的ENO置位1**************//
COMO: SET  
      SAVE

3.问题的分解和解决
3.1 故障或问题分析(根据故障或问题,进行分析,从而提出潜在的一些解决方案用于解决该问题)
      1、在S7-1500中REF和Variant.直接上图。这里只介绍了它的使用。
                ANY和Variant的使用案例
3.2故障或问题处理(根据分析各种导致问题的可能性,逐步排查和测试,描述您解决此问题的操作步骤、想法,最终确认原因,排查和测试过程有条理,思路清晰)

      移植问题示例:
     1、总的来说S7-1500还是方便不少,而且SCL显然也比STL简单方便。
4.经验总结
4.1遗留的问题(问题排查后,是否对解决问题的方式仍然有些疑问或者不理解的地方)
     1、一般使用这些数据都只是在做相同或者相似的功能。即做库。
     2、如果已经知道了具体要操作的数据类型,一般来说还是结构和UDT更加方便
4.2改进方法(解决问题后,根据后期的理解,可以提出更好的解决方式或建议)
    1、S7-1200也能用REF就好了。
    2、无
4.3 对S7-1500新功能或者更新替代的方式和方法的一些看法和建议(例如是否节省时间、功能是否友好,维护和编程更易于管理等)
       1、S7-1500的软元件单元不是并行扫描??
来源:西门子工业技术论坛

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

电工学习网 ( )

GMT+8, 2024-9-2 00:04

Powered by © 2011-2022 www.shop-samurai.com 版权所有 免责声明 不良信息举报

技术驱动未来! 电工学习网—专业电工基础知识电工技术学习网站。

栏目导航: 工控家园 | 三菱plc | 西门子plc | 欧姆龙plc | plc视频教程

快速回复 返回顶部 返回列表