通常在西门子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 机制:
禁用 EN/ENO 机制
按以下操作来禁用指令的 EN/ENO 机制:
影响 LAD/FBD 程序块的 ENO 块 |
说明
使用指令“RET:返回”,可跳出一个程序块,并影响 ENO 块的信号状态。
操作步骤
要影响 ENO 块的信号状态,请按以下步骤操作:
结果
发生错误时(如,结果发生溢出),使能输出 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) 属性。
结果:仅针对所选块启用“自动置位 ENO”(Set ENO automatically) 属性。
针对所有新程序块,将“自动置位 ENO”(Set ENO automatically) 属性设置为“TRUE”
可按照以下步骤,启用程序属性中的“自动置位 ENO”(Set ENO automatically) 属性。
结果:针对所有新程序块,启用“自动置位 ENO”(Set ENO automatically) 属性。
SCL 指令中使用使能输出 ENO
说明
要运行诸如数学函数等每个 SCL 指令,都必须查询使能输出 ENO。
操作步骤要查询使能输出 ENO,请按以下步骤操作:
说明
跳转到一个 SCL 块中时,使能输出 ENO 的信号状态将自动置位为“1”。
影响 SCL 块的“ENO”
说明
SCL 程序块中 ENO 的最后一个赋值即此块的 ENO。另外,也可退出此程序块,并同时使用“RETURN”指令为此块的 ENO 赋值“TRUE”或“FALSE”。
操作步骤
可按照以下步骤影响此块的 ENO 的信号状态:
结果
当本地变量“#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 机制,按以下步骤操作:
结果:仅所选 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
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号