0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Variant类型的变量指令说明

机器人及PLC自动化应用 来源:机器人及PLC自动化应用 作者:机器人及PLC自动化 2022-03-30 15:13 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

TIA V13SP1 开始,S7-1200 V4.0开始,支持以下处理Variant类型的变量的指令,如图1-2所示。

图1 LAD中Variant类型的变量比较操作指令

图2 SCL中Variant类型的变量比较操作指令

注:EQ_TypeOfDB、NE_TypeOfDB、TypeOfDB指令参见DB_ANY。

EQ_Type、NE_Type、TypeOf

表1 LAD指令详情

SCL指令:TypeOf(操作数),操作数是FC/FB的Input/Output/InOut/Temp中定义为Variant类型的参数,该语句输出是数据类型,在程序中只能用在IF与CASE进行比较。

用法1:IF指令,操作数对应的实参的类型与一个变量类型的比较,例如:

IF (TypeOf(操作数1) = 变量类型(例如Byte))

。..

END_IF;

用法2:IF指令,两个操作数对应的实参的类型比较,例如:

IF (TypeOf(操作数1) = TypeOf(操作数2))

。..

END_IF;

用法3:CASE OF指令,操作数对应的实参的类型与多个变量类型的比较,例如:

CASE (TypeOf(操作数)) OF

Byte:

。..

Int:

。..

ELSE

。..

END_CASE;

使用举例:

编写FC,检查输入Variant变量类型,Byte则输出True,其它则输出False,如图3-6所示。

图3 FC6参数定义

图4 程序详情

SCL的版本程序,如图5所示。

图5 SCL版本的程序

OB1多次调用该FC6,可以看到结果,“DB16”.Static_1是Byte类型,“DB16”.Static_3不是Byte类型。

图6 OB1多次调用FC6

EQ_ElemType、NE_ElemType、TypeOfElements

表2 LAD指令说明

SCL指令:TypeOfElements(操作数),操作数是FC/FB的Input/Output/InOut/Temp中定义为Variant类型的参数,该语句输出是数据类型,在程序中只能用在IF与CASE进行比较。

比较之前,通常先使用IS_ARRAY检查操作数对应的实参是否是数组类型。

用法1:IF指令,操作数对应的实参为数组类型,对该数组元素的类型与一个变量类型的比较,例如:

IF (TypeOfElements(操作数1) = 变量类型(例如Byte))

。..

END_IF;

用法2:IF指令,两个操作数对应的实参均为数组类型的类型,比较它们数组元素的类型,例如:

IF (TypeOfElements(操作数1) = TypeOfElements(操作数2))

。..

END_IF;

用法3:CASE OF指令,操作数对应的实参为数组类型,对该数组元素的类型与多个变量类型的比较,例如:

CASE (TypeOfElements(操作数)) OF

Byte:

。..

Int:

。..

ELSE

。..

END_CASE;

注意

1.如果上述三种用法操作数不是数组类型,但是数据类型和比较对象的数据类型相同,也会当做该数据类型的数组进行处理,相当于执行的TypeOf指令。

2.用法2,也可以是这样的:

IF (TypeOfElements(操作数1) = TypeOf(操作数2))

。..

END_IF;

或者

IF (TypeOf(操作数1) = TypeOfElements(操作数2))

。..

END_IF;

即一边是数组,一边不是数组的比较。

使用举例:

编写FC,检查输入Variant变量类型,数组元素如果是Byte则输出1为True,输出2为False,数组元素如果是Int则输出1为False,输出2为True,其余情况输出1为False,输出2为False,如图7-10所示。

图7 FC7参数定义

图8 程序详情

SCL的版本程序,如图9所示。

图9 SCL版本的程序

OB1多次调用该FC7,可以看到结果,“DB17”.Static_1是Byte数组,“DB17”.Static_4是Int数组,“DB17”.Static_7不是以上两种类型。

图10 OB1多次调用FC7

IS_NULL、NOT_NULL

表3 LAD指令说明

对于SCL,虽然没有相对应指令,但是可以在IF指令中,将Variant变量与NULL比较

IF (操作数 = NULL)

。..

END_IF;

理论上来说,对于每个参数出现了Variant的FC/FB,都应该检查该Variant变量是否指向了空指针,此处的空指针不一定是形参填写NULL,也有可能填写没有初始化的Temp中的Variant。

对于最新的S7-1200 V4.2版本,只有一种情况可以初始化Temp中的Variant,就是指令DB_ANY_TO_VARIANT(参见DB_ANY),同时运行没有错误,否则Temp中的Variant就相当于NULL。

使用举例:

程序架构:OB1调用FC9,FC9调用FC8,FC8中检查3个输入是否是NULL,是则输出True,不是则输出False,FC9的3个Temp变量作为FC8的3个输入,Temp_1是不赋值的Int变量,Temp_2和Temp_3是通过DB_ANY_TO_VARIANT初始化的Variant变量,其中为Temp_2初始化的DB1是不满足DB_ANY_TO_VARIANT条件的DB块,为Temp_3初始化的DB19是不满足DB_ANY_TO_VARIANT条件的DB块,最终将FC8的3个输出关联FC9的3个输出至OB1中显示,如图11-13所示。

图11 FC8程序详情

图12 FC9程序详情

OB1调用FC9

图13 OB1调用FC9

从图13中可知,不满足DB_ANY_TO_VARIANT条件的DB1初始化的Temp_2相当于NULL,其余两个都可以视作有明确指向。

IS_ARRAY

表4 LAD指令说明

SCL指令:

IS_ARRAY(操作数),操作数是FC/FB的Input/Output/InOut/Temp中定义为Variant类型的参数,当操作数对应的实参为数组或者P#指针格式,IS_ARRAY(操作数) 为True,否则IS_ARRAY(操作数) 为False。

使用方法:

IF IS_ARRAY(操作数) THEN

。..

END_IF;

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 指令
    +关注

    关注

    1

    文章

    617

    浏览量

    37300
  • 数据类型
    +关注

    关注

    0

    文章

    237

    浏览量

    14108

原文标题:S7-1200 比较操作 - 变量 指令说明

文章出处:【微信号:gh_a8b121171b08,微信公众号:机器人及PLC自动化应用】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C语言自动类型转换

    是通过定义类型转换运算来实现的。其一般形式为: (数据类型) (表达式) 其作用是把表达式的运算结果强制转换成类型说明符所表示的类型
    发表于 11-25 08:04

    什么是‍‍volatile

    volatile是一个类型修饰符(type specifier)。 volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。 volatile变量
    发表于 11-25 06:36

    C语言强制类型转换

    强制类型转换是通过定义类型转换运算来实现的。其一般形式为: (数据类型) (表达式) 其作用是把表达式的运算结果强制转换成类型说明符所表
    发表于 11-24 06:32

    常用变量的介绍

    寄存器变量,一般较短的变量类型适合定义为寄存器变量,如short、char等; auto:c语言变量缺省存储
    发表于 11-21 07:05

    关于协处理器自定义指令的实现

    是RISC-V的r型指令,协处理只能定义成r型,其他指令格式如下所示: 而0x7b表示的是哪一种custom,一种可以定义出4种类型,每种定义格式为: Custom-0 ———7‘b0001011
    发表于 10-31 06:36

    对浮点指令扩展中一些问题的解决与分享

    一、 在e203_exu_decode中,发现变量leg1_ops用于标识各种类型的运算指令,而我们由于没有加上浮点指令,所以在浮点进入后,此处变量
    发表于 10-24 11:47

    蜂鸟自定义指令软件讲解和内联汇编(一)

    变量不仅作为输出,而且作为输入。 (2)蜂鸟定义的汇编指令 此协处理器模块为计算3行3列的矩阵值,首先加载矩阵每行的首个元素的地址,连续加载三次进行计算。lbuf为读内存中的数据加载到缓存中;sbuf
    发表于 10-24 10:51

    利用蜂鸟内核实现指令的仿真模拟

    介绍一下RISC-V的指令架构,在RSIC-V中主要有以下6种指令格式: 因此,我们在对于一条指令进行分析时,我们首先要知道其的指令类型
    发表于 10-24 08:52

    利用蜂鸟内核来实现指令的仿真模拟

    介绍一下RISC-V的指令架构,在RSIC-V中主要有以下6种指令格式: 因此,我们在对于一条指令进行分析时,我们首先要知道其的指令类型
    发表于 10-24 08:17

    对浮点指令扩展中部分问题的解决与分享

    leg1_ops用于标识各种类型的运算指令,而我们由于没有加上浮点指令,所以在浮点进入后,此处变量leg1_ops为0,导致后续指令执行出错
    发表于 10-24 08:14

    Vector向量指令集简介(一)

    RV32V将数据寄存器和长度与向量寄存器关联而不是指令操作码。程序在执行V指令之前会用数据类型和数据宽度来标记向量寄存器,因为每个V指令通常有8个整数版本和三个浮点版本。 这个编
    发表于 10-23 08:28

    PLC中Static和Temp变量的区别

    大家好,收到粉丝投稿,让博主讲下Static变量和Temp变量的区别,新入行的兄弟可能会对这两个概念不太能理解。
    的头像 发表于 09-24 14:51 922次阅读
    PLC中Static和Temp<b class='flag-5'>变量</b>的区别

    Ansible Playbook中的变量使用技巧

    在inventory中定义的连接变量(比如ansible_ssh_user);优先级第二。
    的头像 发表于 04-15 10:26 675次阅读

    RISC-V基础指令详解

    RISC-V中定义了六种指令类型,其中包括 R型指令 : 用于寄存器与寄存器之间算数运算的指令 I型指令 : 用于寄存器和立即数算术运算和读
    发表于 12-29 18:47

    三菱PLC常用指令说明

    PLC常用的指令说明,这些指令是构建PLC程序的基础。 1. 基本逻辑指令 1.1 LD(Load) 功能 :将输入信号加载到累加器(AC)或辅助继电器(M)中。 格式 :LD X0
    的头像 发表于 12-26 18:04 9262次阅读