西门子PLC怎么使用块来构建程序

2019年1月13日23:38:38 发表评论 147 阅读

通过设计 FB 和 FC 执行通用任务,可创建模块化代码块。 然后可通过由其它代码块调用这些可重复使用的模块来构建程序。 调用块将设备特定的参数传递给被调用块。

当一个代码块调用另一个代码块时,CPU 会执行被调用块中的程序代码。 执行完被调用块后,CPU 会继续执行调用块。 继续执行该块调用之后的指令。

A 调用块

B 被调用(或中断)块

① 程序执行

② 用于触发其它块执行的指令或事件

③ 程序执行

④ 块结束(返回到调用块)

 

可嵌套块调用以实现更加模块化的结构。 在以下示例中,嵌套深度为3:程序循环 OB加3层对代码块的调用。

① 循环开始

② 嵌套深度

 

 

 

组织块 (OB)

组织块为程序提供结构。 它们充当操作系统和用户程序之间的接口。 OB 是由事件驱动的。 事件(如诊断中断或时间间隔)会使 CPU 执行 OB。某些 OB 预定义了起始事件和行为。

程序循环 OB 包含用户主程序。 用户程序中可包含多个程序循环 OB。 RUN 模式期间,程序循环 OB 以最低优先级等级执行,可被其它事件类型中断。 启动 OB 不会中断程序循环 OB,因为 CPU 在进入 RUN 模式之前将先执行启动 OB。

完成程序循环 OB 的处理后,CPU 会立即重新执行程序循环 OB。 该循环处理是用于可编程逻辑控制器的“正常”处理类型。 对于许多应用来说,整个用户程序位于一个程序循环 OB 中。

可创建其它 OB 以执行特定的功能,如用于处理中断和错误或用于以特定的时间间隔执行特定程序代码。 这些 OB 会中断程序循环 OB 的执行。

使用“添加新块”(Add new block) 对话框在用户程序中创建新的 OB。

 

总是由事件驱动中断处理。 发生此类事件时,CPU 会中断用户程序的执行并 调用已组态用于处理该事 件的 OB。 完成中断 OB 的执行后,CPU 会在中断点继续执行用户 程序。

CPU 按优先级确定处理中断事件的顺序。 可为多个中断事件分配相同的优先级。

创建附加 OB

可为用户程序,甚至为程序循环和启动OB事件创建多个 OB。使用“添加新块”(Add new block) 对话框创建OB并为OB输入名称。

如果为用户程序创建了多个程序循环 OB,则 CPU 会按数字顺序从具有最小编号(例如 OB 1)的程序循环 OB 开始执行每个程序循环 OB。 例如: 当第一个程序循环 OB(例如 OB 1)完成后,CPU 将执行下一个编号更高的程序循环 OB。

组态 OB 的属性

可对 OB 的属性进行修改。例如,可组态 OB 编号或编程语言。

说明
请注意,您可将局部过程映像编号分配给对应于 PIP0、PIP1、PIP2、PIP3 或 PIP4 的 OB。 如果您为局部过程映像编号输入编号,则 CPU 将创建该过程映像分区。

功能 (FC)

功能 (FC) 是通常用于对一组输入值执行特定运算的代码块。 FC 将此运算结果存储在存储器位置。 例如,可使用 FC 执行标准运算和可重复使用的运算(例如数学计算)或者执行工艺功能(如使用位逻辑运 算执行独立的控制)。 FC 也可以在程序中的不同位置多次调用。 此重复使用简化了对经常重复发生的任务的编程。

FC不具有相关的背景数据块 (DB)。 对于用于计算该运算的临时数据,FC 采用了局部数据堆栈。 不保存临时数据。 要长期存储数据,可将输出值赋给全局存储器位置,如 M 存储器或全局 DB。

功能块 (FB)

功能块 (FB) 是使用背景数据块保存其参数和静态数据的代码块。 FB 具有位于数据块 (DB) 或“背景”DB 中的变量存储器。 背景 DB 提供与 FB 的实例(或调用)关联的一块存储区并在 FB 完成后存储数据。 可将不同的背景 DB 与 FB 的不同调用进行关联。 通过背景 DB 可使用一个通用 FB 控制多个设备。 通过使一个代码块对 FB 和背景 DB 进行调用,来构建程序。 然后,CPU 执行该 FB 中的程序代码,并将块参数和静态局部数据存储在背景 DB 中。 FB 执行完成后,CPU 会返回到调用该 FB 的代码块中。 背景 DB 保留该 FB 实例的值。 随后在同一扫描周期或其它扫描周期中调用该功能块时可使用这些值。

可重复使用的代码块和关联的存储区

用户通常使用 FB 控制在一个扫描周期内未完成其运行的任务或设备的运行。 要存储运行参数以便从一个扫描快速访问到下一个扫描,用户程序中的每一个 FB 都具有一个或多个背景 DB。 调用 FB 时,也需要指定包含块参数以及用于该调用或 FB “实例”的静态局部数据的背景 DB。 FB 完成执行后,背景 DB 将保留这些值。

通过设计用于通用控制任务的 FB,可对多个设备重复使用 FB,方法是:为 FB的不同调用选择不同的背景 DB。FB将 Input、Output 和 InOut 以及静态参数存储在背景数据块中。 您还可以在 RUN 模式下修改和下载函数块接口

在背景数据块中分配起始值

背景数据块存储每个参数的默认值和起始值。 起始值提供在执行 FB 时使用的值。 然后可在用户程序执行期间修改起始值。FB 接口还提供一个“默认值”(Default value) 列,使您能够在编写程序代码时为参数分配新的起始值。 然后将 FB 中的这个默认值传给关联背景数据块中的起始值。 如果不在 FB 接口中为参数分配新的起始值,则将背景数据块中的默认值复制到起始值。

使用带多个 DB 的单个FB

下图显示了三次调用同一个 FB 的 OB,方法是针对每次调用使用一个不同的数据块。 该结构使一个通用 FB 可以控制多个相似的设备(如电机),方法是在每次调用时为各设备分配不同的背景数据 块。 每个背景 DB 存储单个设备的数据(如速度、加速时间和总运行时间)。

在此实例中,FB 22 控制三个独立的设备,其中 DB 201用于存储第一个设备的运行数据,DB 202 用于存储第二个设备的运行数据,DB 203用于存储第三个设备的运行数据。

数据块 (DB)

在用户程序中创建数据块 (DB) 以存储代码块的数据。 用户程序中的所有程序块都可访问全局 DB 中的数据,而背景 DB 仅存储特定功能块 (FB) 的数据。

相关代码块执行完成后,DB 中存储的数据不会被删除。 有两种类型的 DB:

  • 全局DB存储程序中代码块的数据。 任何 OB、FB 或 FC 都可访问全局 DB中的数据。
  • 背景DB存储特定 FB 的数据。 背景 DB 中数据的结构反映了 FB 的参数(InputOutput 和 InOut)和静态数据。 (FB 的临时存储器不存储在背景 DB 中。)

说明

尽管背景 DB 反映特定 FB 的数据,然而任何代码块都可访问背景 DB 中的数据。

您还可以在 RUN 模式下修改和下载数据块。

只读数据块

可将 DB 组态为只读:

  1.  在项目浏览器中右键单击相应DB,然后在右键快捷菜单中选择“属性”(Properties)。
  2. 在“属性”(Properties)对话框中选择“特性”(Attributes)。
  3. 选择“在设备中写保护数据块”(Data block write-protected in thedevice)选项并单击“确定”(OK)。

已优化的数据块和标准数据块

您还可以将数据块组态为标准或已优化。 标准 DB 与 STEP 7 Classic 编程工具以及经典的 S7-300 和 S7-400 CPU 兼容。 可优化访问的数据块无固定的定义结构。 数据元素在声明中仅包含一个符号名,在块中没有固定地址。 CPU 会将元素自动存储到块的可用存储区中,以免在存储器中留下间隙。 这样一来,便可最优化地利用存储器容量。

要设置对数据块的优化访问,请按以下步骤操作:

  1. 在 STEP 7项目树中展开程序块文件夹。
  2. 右键单击数据块并从上下文菜单中选择“属性”(Properties)。
  3.  为属性选择“优化块访问”(Optimized blockaccess)。

请注意,默认情况下会为新数据块选中优化块访问。 如果取消选择“优化块访问”(Optimized block access),则块将采用标准访问。

函数块及其背景数据块的块访问类型

请确保以下情况:如果函数块的设置是“Optimized blockaccess”(优化的块访问),则该函数块的背景数据块的设置也应该是“Optimized block access”(优化的块访问)。 同样,如果没有为该函数块选择“Optimized block access”(优化的块访问),从而该函数属于标准访问类型,则应确保背景数据块也为标准类 型,而不是优化的块访问类型。

如果没有兼容的块访问类型,那么在函数块执行期间从人机界面对该函数块的 InOut参数值所做的更改可能会丢失。

创建可重复使用的代码块

使用项目浏览器中“程序块 ”(Program blocks) 下的“添加新块”(Add new block) 对话框创建OB、FB、FC 和全局DB。 创建代码块时,需要为块 选择编程语言。 无需为
DB选择语言,因为它仅用于 存储数据。选中“添加新对象并打开”( Add new and open) 复选框(默认),在项目 视图中打开代码块。

可存储想要在库中重复使用的对象。 每个项目都有一个与之相连的项目库。 除项目库外,您还可以创建可在多个项目中使用的任意数量的全局库。 由于库彼此兼容,因此可以复制库要素并将其从一个库移动到另一个库。

库可用于创建块的模板:首先将块粘贴到项目库中,随后在其中进一步开发块。 最后,将块从项目库复制到全局库。 可将全局库共享给正在使用项目的其他同事。 他们可使用块并根据需要进一步调整块以满足各自的需求。

向块传递参数

函数块 (FB) 和函数 (FC) 有三种不同接口类型:

  • IN
  • IN/OUT
  • OUT

函数块和函数通过 IN 和 IN/OUT 接口类型接收参数。 块对这些数据进行处理,此后,通过 IN/OUT 和 OUT 接口类型将返回值传回调用者。

用户程序采用以下两种方法中的某一种传递参数。

传值

用户程序以“传值”(call-by-value) 方式将参数传递给某个函数时,用户程序会将实际参数值复制给块的 IN 接口类型的输入参数。 该操作期间,被复制值要求使用额外存储空间。

当用户程序调用该块时,会复制这些值。

传引用

用户程序以“传引用”(call-by-reference) 方式向某个函数传递参数时,用户程序将引用IN/OUT 接口类型的实参地址,不进行值复制操作。 该操作过程不需要额外的存储空间。

说明

通常情况下,针对结构变量使用 IN/OUT 接口类型(例如,ARRAY、STRUCT 和STRING),避免不必要地增大所需的数据存储器。

块优化和参数传递

对于简单数据类型(例如,INT、DINT 和 REAL 型),用户程序可以以“传值”方式传递函数块的参数。 传递复杂数据类型(例如,STRUCT、ARRAY 和 STRING)时,可以采用“传引用”方式。

用户程序传递的函数块参数通常在和该函数块相关的背景数据块 (DB) 中:

  • 通过将参数复制给背景数据块,或者,复制位于背景数据中参数,用户程序可以以“传 值”方式传递简单数据类型(例如,INT、DINT 和REAL)的参数。
  • 用户程序将复杂数据类型(例如,STRUCT、ARRAY和STRING)复制到用于 IN 和OUT 参数类型的背景数据块中,或者,复制位于该背景数据块中的复杂数据类型。
  • 对于IN/OUT接口类型,用户程序以“传引用”方式传递复杂数据类型。

数据块可以创建成“优化的”或“标准的”(未优化)数据块。 优化型数据块的体积小于非优化型数据块。 优化型数据块和非优化型数据块中的数据元素顺序不一样。

可以创建用来处理优化或非优化数据的函数块和函数。 可以选择复选框“优化块访问” (Optimized block access),将其作为块的属性。 默认情况下,用户程序会优化程序块;程序块期望传递给该块的数据采用优化格式。

用户向某个函数传递复杂参数(例如,STRUCT 结构的参数)时,系统会检查包含该结构的数据块的优化设置和程序块的优化设置。 如果你同时优化该数据块和该函数,用户程序将以“传引用”方式传递该结构 (STRUCT)。 如果选择了不优化该数据块和该函数,也采用“传引用”方式传递该结构。

但是,如果函数和数据块采用不同优化设置(即,优化了一个块且没有优化另一个块), 则必须将 STRUCT 转换成函数所期望的格式。 例如,如果选择了不优化该数据块但优化该函数,则数据块中的 STRUCT 须转换成优化格式后才能被该函数进行处理。 该转换过程由系统完成,其方法是:先制作该 STRUCT 的一个“副本”,接着,将它转换成该函数所期望的优化格式。

总而言之,当用户程序将某个复杂数据类型(例如,STRUCT)作为 IN/OUT

参数传递给某个函数时,该函数希望用户程序以“传引用”方式传递 STRUCT。

  • 对于含该结构的数据块和该函数,如果都选择了优化或者不优化,用户程序将以“传引 用”方式传递数据。
  • 如果对数据块和函数没有配置相同的优化设置(优化其中一个且不优化另一个),系 统必须先制作STRUCT的一个副本,再将其传递给函数。 由于系统必须制作该结构的副本,因此,该操作可以高效地将“传引用”转换成“传值”。

优化设置对用户程序的影响作用

如果 HMI 或中断组织块更改了结构中的元素,参数复制将可能导致用户程序出现问题。 例如,某个函数有一个 IN/OUT 参数(正常情况下以“传引用”方式传递),但是,数据块和该函数采用了不同的设置,则:

  1. 用户程序准备调用该函数时,系统必须制作该结构的一个“副本”,以将该数据的格式转换成与该函数相匹配的格式。
  2. 用户程序采用该结构的该“副本”的引用调用该函数。
  3. 该函数运行期间出现了一个中断组织块,且该中断组织块更改了原结构中的某个值。
  4.  该函数运行完毕。由于该结构是一个IN/OUT

参数,因此,系统将该值以原来的格式复制回原结构。

采用制作结构副本的方式进行格式转换的后果:该中断组织块改写过的数据将被丢失。 对于采用 HMI 写入的值,情况也同样如此。 HMI 也可能中断用户程序的执行,并以和中断组织块相同的方式写入某个值。

解决该问题的方法有很多种:

  • 最好的方法是:需要使用复杂数据类型(例如,STRUCT)时,对程序块和数据块采 用相匹配的优化设置。 这种方法可以保证用户程序总是以“传引用”方式进行参数传递。
  • 另一种方法是使中断组织块或HMI不直接修改该结构中的元素。 让组织块或 HMI修改另一个变量,此后,用户在用户程序的某个特定位置将该变量复制到该结构中。

 

weinxin
plc入门知识问答
每一个PLC工程师都应该关注的微信公众账号,只需输入您的问题,就会有答案

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: