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

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

3天内不再提示

对于FC或FB中的临时变量使用

机器人及PLC自动化应用 来源:机器人及PLC自动化应用 作者:机器人及PLC自动化 2022-11-07 16:50 次阅读

很多初学者容易将 FC 及FB 相混淆,认为 FB 仅仅是比 FC 多了一个背景数据块,这种认识是非常危险的。在 STEP7 的关于 FC 的描述是这样的:

FC 是一个没有存储空间的逻辑块。FC 的临时变量存储在本地数据堆栈中,这些数据在 FC 执行完毕后将会丢失。为了永久的保存数据,FC 可以使用共享数据块。

由于 FC 没有自己的存储空间,所以必须指定实参给它的参数(这就是为什么 FC 的输入输出管脚必须填写参数的原因)。FC 的临时变量(位于本地数据堆栈中)是无法指定初始值的(由于本地数据堆栈是由系统自动动态使用的)。为了更形象的说明这一点,我们来看下面的例子,此例子对 L 堆栈在程序调用时的分配进行了详细的讲解:

L 堆栈永远以地址“0”开始。在 L 堆栈中,会为每个 FC 提供一定地址空间,作为存放每个块所拥有的固有数据或局部数据。当某个块终止时,那么它的空间随之也被重新释放出来。指针总是指向当前打开块的第一个字节。

运行等级 L 堆栈中的字节数 指针
调用OB1(带有 20 个字节的系统固有数据和局部数据的 10 个附加字节) 30 0
调用 FC1(带有 30 个字节的局部数据)
30 个字节 (OB1) + 30 个字节 (FC1)
60 30
调用 FC20(带有 20 个字节的局部数据)
60 个字节 (OB1 + FC1) +20 个字节 FC10
80 60
调用 FC21(带有 20 个字节的局部数据)
60 个字节 (OB1 + FC1) +20 个字节 FC11
80 60
调用 FC2(带有 50 个字节的局部数据)
30 个字节 (OB1) +50 个字节 (FC2)
80 30
调用 FC30(带有 10 个字节的局部数据)
80 个字节 (OB1 + FC2) +10 个字节 FC20
90 80

由上面的例子可以看出:对于FC20 曾经使用过的系统中 L 堆栈 60-80 区间(FC20 中地址范围为 LB0-LB19)在 FC20 调用结束后,被提供给 FC21 使用(FC21 中地址范围同样为 LB0-LB19)。 对于 FC 的临时变量认识不清晰,用户在对临时变量的使用当中,也经常会出现一些错误,下面将使用一个例子非常直观地说明上面的问题

程序原目的:

在 OB1 在程序中调用FC20 后立即调用 FC21

FC20 中将 20 赋值给临时变量 FC20_TEMP1,将 21 赋值给临时变量 FC20_TEMP2FC21 中将 FC21_TEMP1,FC21_TEMP2 相加

程序分析:我们发现 FC20 中的临时变量曾经出现的数值(20,21)被 FC21 中的临时变量FC21_TEMP1, FC21_TEMP2 得到了,如果直接使用这两个临时变量进行加法操作,可以得到结果 41。对于编程人员来说,临时变量必须要在所在程序段中赋值,而后使用。用户对此例中的 FC21_TEMP1, FC21_TEMP2 必须先做清零处理,否则其在使用前即可能拥有数值。

016556ba-5e77-11ed-a3b6-dac502259ad0.png

结论:对于 FC 或 FB 中的临时变量,不要希望将本次调用的数值可以存储在里面以供下次程序调用使用,因为这些临时变量所使用的 L 堆栈空间在 FC 或 FB 调用结束就释放给系统了,其它后续程序可以任意使用。所以下列用法都是错误的:

将临时变量用于上升/下降沿指令

将临时变量用于自保持逻辑

临时变量未在所在程序段中赋值,直接使用

审核编辑:郭婷

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

    关注

    13

    文章

    4202

    浏览量

    85533
  • 堆栈
    +关注

    关注

    0

    文章

    182

    浏览量

    19710

原文标题:FC 中临时变量的使用:

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

收藏 人收藏

    评论

    相关推荐

    Linux环境变量配置方法

    Linux上环境变量配置分为设置永久变量临时变量两种。环境变量设置方法同时要考虑环境Shell类型,不同类型的SHELL设置
    的头像 发表于 10-23 13:39 84次阅读

    光纤跳线fc-lc干嘛用的

    Connector)连接器,能够在FC接口设备和LC接口设备之间进行灵活连接。以下是关于光纤跳线FC-LC的详细用途: 一、设备互连 在数据中心局域网,经常需要将使用LC连接器的
    的头像 发表于 10-11 10:25 238次阅读

    CC2340R5有没有变量可以代替直接使用地址0x400043FC,该如何使用?

    我现在需要SYS0_DEVICED内存中高位数据,目前在内存对应的是0x400043FC。 SYS0_DEVICED会一直是0x400043FC吗? 有没有变量可以代替直接使用地址
    发表于 05-30 08:21

    如何调整S7-1500S7-GRAPH FB的保持性属性

    FB 块属性“优化的块访问”默认勾选并且显示灰色无法操作,如图 2 所示。对于需要从CPU停止时所处步号继续运行的应用场合,必须设置保持性属性为“保持”。
    发表于 04-03 09:17 548次阅读
    如何调整S7-1500<b class='flag-5'>中</b>S7-GRAPH <b class='flag-5'>FB</b>的保持性属性

    西门子博途:SCLFB模块的结构

    模块FB是用于控制执行器和单元的功能模块执行某一功能的其他FB的块。 VASS库不可用的块必须由系统供应商与负责的标准化电气工程部门协商创建。
    发表于 01-18 10:38 1251次阅读
    西门子博途:SCL<b class='flag-5'>中</b><b class='flag-5'>FB</b>模块的结构

    SCLFB模块的结构

    模块FB是用于控制执行器和单元的功能模块执行某一功能的其他FB的块。
    的头像 发表于 01-17 09:22 640次阅读
    SCL<b class='flag-5'>中</b><b class='flag-5'>FB</b>模块的结构

    自动控制系统的操纵变量指什么

    自动控制系统的操纵变量指的是在系统由控制器控制的可调节参数,用于调节改变被控对象的输出状态。操纵
    的头像 发表于 01-15 11:29 4440次阅读

    C语言:指针内存是如何存放变量

    在程序定义一个变量,那么在程序编译的过程,系统会根据你定义变量的类型来分配「相应尺寸」的内存空间。那么如果要使用这个变量,只需要用
    发表于 01-08 10:14 395次阅读

    stm32变量能存进flash

    当涉及到将变量存储在Flash时,我们通常指的是将变量存储在STM32微控制器的闪存器件。在STM32芯片中,闪存用于存储程序代码和只读数据,但
    的头像 发表于 12-28 15:33 2006次阅读

    西门子博途:调用FB(实例化)

    与功能块(FC)相比,功能块(FB)具有存储器。这意味着功能块被分配了一个本地数据块,即所谓的实例数据块。当调用FB时,还必须指定实例DB的编号,并且此DB会自动打开。
    的头像 发表于 12-25 11:04 2744次阅读
    西门子博途:调用<b class='flag-5'>FB</b>(实例化)

    KUKA系统变量$err说明

    变量可用于评估相对于提前运行的当前执行程序。例如,该变量可用于评估程序的错误,以便能够使用适当的故障服务功能对其进行响应。
    的头像 发表于 12-18 15:41 706次阅读

    javascript的变量可以包含

    JavaScript是一种强大的编程语言,广泛应用于网页开发和动态网页交互。作为一种灵活的语言,JavaScript允许开发人员声明和操作各种类型的变量。在JavaScript变量可以包含
    的头像 发表于 12-03 11:34 660次阅读

    python变量命名规则

    的规则和约定。本文将详尽、详实、细致地探讨Python变量的命名规则,帮助读者了解如何正确命名变量并在编程遵循最佳实践。 一、变量命名规则的重要性 合适的
    的头像 发表于 11-23 15:44 1151次阅读

    for循环里的变量是局部变量

    对于一个普通for循环而言,循环变量是局部变量。在大多数编程语言中,循环变量只在循环内部的作用域中可见。换句话说,循环变量的声明和赋值仅在循
    的头像 发表于 11-23 14:50 2360次阅读

    什么是FB功能块?为什么要使用FB功能块?如何制作一个FB功能块?

      FB功能块是一种封装了特定逻辑功能的模块。它类似于一个子程序函数,但是它有自己的内部变量和接口。FB功能块可以被多次调用,并且每次调用都会创建一个新的实例。
    的头像 发表于 11-09 16:13 3583次阅读
    什么是<b class='flag-5'>FB</b>功能块?为什么要使用<b class='flag-5'>FB</b>功能块?如何制作一个<b class='flag-5'>FB</b>功能块?