PLC 编程基础知识EN/ENO机制

通常在西门子PLC编程调试过程中,忽略了ENO的作用,其实使用使能输出 ENO,可检测和处理某些运行系统错误。后续指令的执行取决于该使能输出的信号状态。使用 EN/ENO 机制可避免程序崩溃。块状态将以布尔型变量的形式进行传递。

EN/ENO 机制可用于以下两个方面:

LAD 和 FBD 支持 EN/ENO 机制,可调用程序代码中的简单指令和高级指令。

使用 EN/ENO 机制时,可对以下指令调用进行影响,并使用指令“RET:返回”定制到程序块外的跳转。同时,还可为程序块的使能输出 ENO 赋值(0 或 1)。该特性通常用于 LAD 和 FBD 程序块。在 SCL 程序块中,也可使用该功能,无需再使用指令“RET”对 SCL 程序块的使能输出 ENO 进行影响。

在程序段边界处,该使能输出的信号状态将重复性地置位为“1”。例如,在 LAD 程序块中,可通过以下方式识别:即使上一个程序段中最后一个指令的使能输出 ENO 返回信号状态“0”,左侧母线也始终提供电流。

指令“RET:返回”(LAD/FBD) 的功能

逻辑运算结果为 0 时,不执行该指令而执行下一个程序段。

逻辑运算结果为 1 时,将执行该指令并返回调用程序块。

ENO 块的信号状态可通过以下四个选项确定:

编程与 I/O 访问错误

EN/ENO 机制无法编程和 I/O 访问错误。为此,可通过 OB 进行全局错误处理或使用“GET_ERROR”、“GET_ERR_ID”指令进行本地错误处理或(仅 S7-1200/1500)。如果指令成功执行无任何错误,则可评估相关的使能输出 ENO。


LAD 中的 EN/ENO 机制

对于 LAD/FBD 程序块,EN/ENO 机制只能与各指令处所激活的使能输出 ENO 一起使用。

指令中的 EN/ENO 机制

通过使能输入 EN,指令将根据具体条件执行。仅当使能输入 EN 的信号状态为“1”时,才执行该指令。

通过使能输出 ENO,可查询指令中的运行时错误并进行相应响应:

程序块调用与 EN/ENO 机制

通过使能输入 EN 和使能输出 ENO,可调用所有的程序块。这适用于所有调用程序块,而无需考虑所使用的编程语言。即,调用 STL 或 SCL 程序块时即使没有默认或预组态的 EN/ENO 机制,LAD 或 FBD 的程序块调用仍可使用 EN/ENO 机制。

根据具体情况,可使用使能输入 EN 调用程序块。仅当使能输入 EN 处的信号状态为“1”时,才执行该程序块。

通过使能输出 ENO,可查询该程序块的错误状态:

在 LAD 和 FBD 中启用和禁用 EN/ENO 机制

在 LAD 和 FBD 中,某些指令具有使能输出 ENO,因此使用 EN/ENO 机制。这样,可以查询指令中的运行时错误,并对错误做出反应。为了提高 CPU 的性能,可在默认设置中禁用 EN/ENO 机制。这意味着无法使用 ENO 值对指令中的运行时错误做出反应。但可在需要时,重新启用 EN/ENO 机制。

为了生成 ENO,可以为每条指令分别启用 EN/ENO 机制。如果对一条指令启用了 EN/ENO 机制,则后续在程序中添加其它指令时也会启用 EN/ENO 机制。如果不希望指令启用 ENO 评估,则可以随时再次禁用 EN/ENO 机制。之后添加到程序中的其它指令则不会插入 EN/ENO 机制。

如果启用使能输出 ENO,则运行时错误将不会导致 CPU 切换到 STOP 模式。

激活 EN/ENO 机制

按以下操作来激活指令的 EN/ENO 机制:

  1. 在程序中,右键单击待激活 EN/ENO 机制的指令。
  2. 在快捷菜单中,选择“生成 ENO”(Generate ENO) 命令。
  3. 将再次生成指令的 ENO 值。如果激活使能输出,则随后将插入其它指令。

禁用 EN/ENO 机制

按以下操作来禁用指令的 EN/ENO 机制:

  1. 在程序中,右键单击待禁用 EN/ENO 机制的指令。
  2. 在快捷菜单中,选择“不生成 ENO”(Do not generate ENO) 命令。
  3. 将不再生成指令的 ENO 值。如果未激活使能输出,随后也将插入其它指令。

影响 LAD/FBD 程序块的 ENO 块

说明

使用指令“RET:返回”,可跳出一个程序块,并影响 ENO 块的信号状态。

操作步骤

要影响 ENO 块的信号状态,请按以下步骤操作:

  1. 启用某个指令(如,加指令“ADD”)的 EN/ENO 机制。
  2. 对编程指令“RET:返回”进行取反,使能输出 ENO 处的信号状态将为 FALSE。

结果

发生错误时(如,结果发生溢出),使能输出 ENO 处将首先返回信号状态“0”。取反后,信号状态“0”将变为信号状态“1”。即,RLO 为 1 并执行“RET”指令,返回值 FALSE。该程序块的 ENO 块因此为 FALSE,并在上一个程序块调用完成后从该程序块返回到下一个指令处。该过程可在任何程序段(如,包含多个数学函数等)中编程。

但无需编程跳转,跳出该程序块。在一个程序段中,如果单个指令的使能输出 ENO 信号状态为“0”,则可确定不执行后续指令。因而,ENO 块将不受影响。

说明

ENO 块的影响

只能通过跳出该程序块,对 ENO 块的信号状态进行影响。

即使程序块中最后一个程序段内最后一个指令的使能输出 ENO 的信号状态为“0”,该 ENO 块也不受影响。

使用 EN/ENO 机制的指令示例

以下示例说明了使用 EN/ENO 电路和 RET 线圈 (Ret False) 的“Add”指令:

位于常开触点“TagEnable”后方的使能输入 EN 包含有前导逻辑运算的结果:

使能输出 ENO 的影响示例

在以下示例中,说明了启用和禁用 ENO 使能输出时各指令的应用方式:

如果使用 SUB 指令激活使能输出 ENO,则所有后续指令也将激活使能输出 ENO。如果在执行 SUB 指令时发生运算错误,ADD 指令将不执行。

在第二个分支中,DIV 指令将禁用 ENO 使能输出。即使在执行过程中发生运行时错误,MUL 指令仍将正常运行。

通过 EN/ENO 机制调用程序块的示例

下图中举例说明了如何通过 EN/ENO 回路调用程序块:

如果操作数“TagEnable”的信号状态为“1”,则执行该程序块:

FBD 中的 EN-/ENO 机制

使用 EN/ENO 机制的指令示例

以下示例说明了使用 EN/ENO 电路和 RET 线圈 (Ret False) 的“Add”指令:

位于常开触点“TagEnable”后方的使能输入 EN 包含有前导逻辑运算的结果:

使能输出 ENO 的影响示例

在以下示例中,说明了启用和禁用 ENO 使能输出时各指令的应用方式:

如果使用 SUB 指令激活使能输出 ENO,则所有后续指令也将激活使能输出 ENO。如果在执行 SUB 指令时发生运算错误,ADD 指令将不执行。

DIV 指令可禁用 ENO 使能输出。即使在执行过程中发生运行时错误,MUL 指令仍将正常运行。

通过 EN/ENO 机制调用程序块的示例

下图中举例说明了如何通过 EN/ENO 回路调用程序块:

如果操作数“TagEnable”的信号状态为“1”,则执行该程序块:

STL 中的 EN/ENO 机制

指令中的 EN/ENO 机制

EN/ENO 机制不适用于单个指令。该机制与语言特定的指令序列相对应,并使用状态字(BR 位)。

程序块调用与 EN/ENO 机制

从 STL 程序块调用的程序块不提供 EN 和 ENO 参数。无论创建程序块时采用何种编程语言,都可通过状态字的 BR 位将错误语句传送到 STL 程序块中。

通过关联状态字的 BR 位 和逻辑运算结果 (RLO),即可对被调用程序块的错误状态进行评估。被调用的程序块开始执行时,RLO 的信号状态即为“1”。如果在程序块执行后未将 RLO 显式地设置为“0”,则其信号状态将保持为“1”。要将错误语句传送回调用程序块,则需将 的信号状态显式地复位为“0”。并通过指令“SAVE:将 RLO 保存在 BR 位中“和”JNB:若 RLO = 0 则跳转,并保存 RLO”,对错误语句进行置位。

在 STL 中,可对 BR 位进行错误分析。在编程语言 LAD、FBD 和 SCL 中,可根据 BR 位生成使能输出 ENO。

如果状态字中 BR 位的值为“0”,则表示在 STL 程序块调用过程中发生了错误(调用程序块是一个 STL 程序块)。

CPU 中指令的执行

BR 位

返回值

整数的符号

存在错误

0

小于“0”

负数(符号位为“1”)

无错误

1

大于或等于“0”

正数(符号位为“0”)

通过 EN/ENO 机制执行程序序列的示例

下文中举例说明了如何使用 EN/ENO 机制执行数值相加的程序段:

STL

说明

A "TagEnable"

// 查询操作数“TagEnable”的信号状态是否为“1”,并与当前的 RLO 进行 AND 运算。

JNB MyLABEL

// 评估使能输入 EN

// 如果 RLO =“0”,则跳转至跳转标签“MyLABEL”处,并将当前的 RLO 保存到 BR 位中。不执行以下操作。

// 如果 RLO =“1”,则执行以下操作。

L "Tag_Input_1"

// 加载加法运算中的第一个值。

L "Tag_Input_2"

// 加载加法运算的第二个值。

+I

// 添加值

T "Tag_Result"

// 将合计值传送给操作数“Tag_Result”。

AN OV

// 查询是否发生溢出。

SAVE

// 将 RLO 的信号状态传送到 BR 位。

CLR

/// 将 RLO 复位为“0”,并结束逻辑序列。

MyLABEL:A BR

// 跳转标签“MyLABEL”

// 查询 BR 位。

= "Tag_Output"

// 将 RLO 的信号状态分配给操作数“Tag_Output”。


查询操作数“TagEnable”将确定前导逻辑运算 (RLO) 的结果。指令“JNB:若 RLO = 0 则跳转,并保存 RLO”将 RLO 的值保存在 BR 位中。另外,该指令还将对 RLO 的值进行评估,并根据其信号状态指向以下操作:

通过 EN/ENO 机制调用程序块的示例

下图中举例说明了如何通过 EN/ENO 回路调用程序块:

STL

说明

A "TagEnable"

// 查询操作数“TagEnable”的信号状态是否为“1”,并与当前的 RLO 进行 AND 运算。

JNB MyLABEL

// 评估使能输入 EN

// 如果 RLO =“0”,则跳转至跳转标签“MyLABEL”处,并将当前的 RLO 保存到 BR 位中。不执行以下操作。

// 如果 RLO =“1”,则执行以下操作。

CALL "Block name", "Block name_DB"

// 调用程序块。

MyLABEL:A BR

// 跳转标签“MyLABEL”

// 查询 BR 位并在 AND 运算后与 RLO 进行运算。

= "Tag_Output"

// 将 RLO 的信号状态分配给操作数“Tag_Output”。

SCL 中的 EN/ENO 机制

SCL 中的 EN/ENO 机制概述

在 SCL 程序段中,可以通过赋值来改变 ENO。为此,请写入“ENO:=TRUE”或“ENO:=FALSE”,或使用 BOOL 数据类型的变量。当激活“自动置位 ENO”(Set ENO automatically) 块属性时,编译器会添加程序代码来计算 ENO,类似于编程语言 LAD 和 FBD。添加的程序代码会增加运行时间,因此默认情况下禁用“自动置位 ENO”(Set ENO automatically) 属性。

更多信息,请参见:“在 SCL 中启用和禁用“自动置位 ENO”(Set ENO automatically) 属性”

在 SCL 程序段中,无法为 FC 的 EN 参数赋值。但是可以在条件语句中调用 FC,这意味着需要将其置于“IF”指令中。这意味着块调用不会执行,也不会改变 ENO。此行为与编程语言 LAD 和 FBD 中的行为不同

在 SCL 中启用和禁用“自动置位 ENO”(Set ENO automatically) 属性

说明

当“自动置位 ENO”(Set ENO automatically) 属性设置为“TRUE”时,被调用块的 ENO 值将被转发到调用块的 ENO 值。

在块属性中启用 ENO 机制

可按照以下步骤,启用块属性中的“自动置位 ENO”(Set ENO automatically) 属性。

  1. 在项目浏览器中,打开“程序块”(Program blocks) 文件夹。
  2. 右键单击待显示属性的 SCL 块。
  3. 在快捷菜单中,选择“属性”(Properties) 命令。
  4. 该块的属性对话框随即打开。
  5. 在区域导航中,单击“属性”(Attributes) 组。
  6. 激活属性“自动置位 ENO”(Set ENO automatically)。
  7. 单击“确定”(OK) 进行确认。

结果:仅针对所选块启用“自动置位 ENO”(Set ENO automatically) 属性。

针对所有新程序块,将“自动置位 ENO”(Set ENO automatically) 属性设置为“TRUE”

可按照以下步骤,启用程序属性中的“自动置位 ENO”(Set ENO automatically) 属性。

  1. 在“选项”(Options) 菜单中,选择“设置”(Settings) 命令。
  2. 在工作区中,“设置”(Settings) 窗口随即显示。
  3. 在区域导航中,选择“PLC 编程”(PLC programming) 组。
  4. 选择“SCL(结构化控制语言)”(SCL (Structured Control Language)) 组。
  5. 激活属性“自动置位 ENO”(Set ENO automatically)。

结果:针对所有新程序块,启用“自动置位 ENO”(Set ENO automatically) 属性。

SCL 指令中使用使能输出 ENO

说明

要运行诸如数学函数等每个 SCL 指令,都必须查询使能输出 ENO。

操作步骤要查询使能输出 ENO,请按以下步骤操作:

  1. 激活 EN/ENO 机制。
  2. SCL 指令执行后,查询使能输出 ENO(如,#MyOutputBool := ENO;)
  3. 如果发生错误(如,结果溢出),则使能输出 ENO 将返回信号状态“0”。基于该信号状态时,指令可继续执行。例如,编程指令“RETURN”、故障显示或替换值。
  4. 执行下一个指令之前,先将使能输出 ENO 的信号状态复位为“1”(如,ENO :=1;)。
  5. 发生下一处错误时,该信号状态因此可复位为“0”。否则,使能输出 ENO 的信号状态将保持为“0”。

说明

跳转到一个 SCL 块中时,使能输出 ENO 的信号状态将自动置位为“1”。

影响 SCL 块的“ENO”

说明

SCL 程序块中 ENO 的最后一个赋值即此块的 ENO。另外,也可退出此程序块,并同时使用“RETURN”指令为此块的 ENO 赋值“TRUE”或“FALSE”。

操作步骤

可按照以下步骤影响此块的 ENO 的信号状态:

  1. 激活 ENO 机制。
  2. 然后编程:
  3. IF #n := 0 THEN
  4. RETURN FALSE;
  5. END_IF;

结果

当本地变量“#n”为“0”时,系统会返回到调用块。在这种情况下,块的 ENO 值为“FALSE”。

但无需对 RETURN 进行编程。SCL 编译器将当前 ENO 值转发到块的 ENO 值。这意味着,ENO 的最后一个赋值将来自块的 ENO。

ENO 的设置示例

以下示例显示了一个 SCL 块,用于在执行除法运算前检查除数是否为 0。此时,ENO 的值将设置为“FALSE”,同时不执行后续的除法运算。调用块可评估被调用块的 ENO 并确定是否继续执行此程序。

IF #Divisor = 0 THEN

ENO:=false;

RETURN;

END_IF;

#Quotient:=Dividend/Divisor;

通过 ENO 评估程序块调用的示例

以下示例显示了程序块 (A) 的调用过程,还程序块用于处理被调用块 (B) 的 ENO。

"BlockName_DB"( ENO => ENO );

IF ENO = false THEN

RETURN;

END_IF;

调用并处理程序块 (A)。被调用的程序块 (B) 反映了其 ENO 在此过程中的值。被调用的块 (B) 的 ENO 值将复制到调用块 (A) 的 ENO 中。随后将此 ENO 用于“IF”指令中。

被调用块 (B) 返回信号状态“ENO=FALSE”时,调用块 (A) 将不继续处理并返回信号状态“ENO=FALSE”。

GRAPH 中的 EN/ENO 机制

指令中的 EN/ENO 机制

这些指令的使能输出 ENO 无法访问。即,用户无法影响 GRAPH 函数块中使能输出 ENO 的状态。但通过诸如数学函数或 LAD/FBD 指令进行转换后,可在程序状态中显示使能输出 ENO。

程序块调用与 EN/ENO 机制

根据具体情况,可使用使能输入 EN 调用程序块。仅当使能输入 EN 处的信号状态为“1”时,才执行该程序块。

通过使能输出 ENO,可查询该程序块的错误状态:

在 GRAPH 中激活和禁用 EN/ENO 机制

说明

在进行程序状态测试过程中,将显示使能输出 ENO 的状态。如果操作成功,则值为 TRUE;操作失败,值为 FALSE。

有关使能输出 ENO 的状态显示方式,可在 GRAPH 程序块的以下位置处设置:

在块属性中启用 EN/ENO 机制,按以下步骤操作:

  1. 在项目浏览器中,打开“程序块”(Program blocks) 文件夹。
  2. 右键单击待显示属性的 GRAPH 块。
  3. 在快捷菜单中,选择“属性”(Properties) 命令。
  4. 该块的属性对话框随即打开。
  5. 在区域导航中,单击“属性”(Attributes) 组。
  6. 激活属性“自动置位 ENO”(Set ENO automatically)。
  7. 单击“确定”(OK) 进行确认。

结果:仅所选 GRAPH 块激活了 EN/ENO 机制。

GRAPH 中的 EN/ENO 机制示例

带有使能输出 ENO 的程序状态示例

下文中举例说明了顺序视图内相应动作下使能输出 ENO 的程序状态:

如果在执行过程中发生错误,则使能输出 ENO 的信号状态为 FALSE。

程序块调用示例

下图中举例说明了 LAD 程序块如何通过 EN/ENO 调用 GRAPH 程序块:

如果操作数“TagEnable”的信号状态为“1”,则执行该程序块:

块中不同程序段语言的 EN/ENO 机制

说明

在块中,可使用不同网络语言的 EN/ENO 机制。各种编程语言显示的错误状态也往往有所不同:

以下规则适用于读取整个块中的错误状态:

ENO 块的影响

对于包含多个程序段的 LAD/FBD 的程序块(可能包含不同的编程语言,如 LAD、FBD、STL 或 SCL),ENO 块的信号状态取决于最后执行的程序段。

如果程序块中最后执行的程序段为 LAD 或 FBD 程序段,则 ENO 块的信号状态不一定会受影响。如果指令中已激活 EN/ENO 机制,则仅当使能输出 ENO 的信号状态为“0”且程序块可使用指令“RET:返回”时,才会受到影响。如果该指令未包含任何编程代码,则 ENO 块的信号状态始终为“1”。指令 ENO 的信号状态为“0”时(如果有),不会影响 ENO 块。这是因为,程序段开始处的信号状态通常为“1”。

这同样适用于另一个程序段(LAD、FBD 或 SCL)之前的 LAD 或 FBD 程序段。仅当使用指令“RET:返回”时,ENO 块的信号状态才会受到影响。否则,ENO 块的信号状态在转换到该程序段时将复位为“1”。

混合程序块中的最后一个程序段为 SCL 程序段,则 ENO 块通常受此影响。

展开阅读全文

页面更新:2024-02-22

标签:机制   示例   单击   指令   基础知识   属性   信号   状态   错误   操作   程序

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top