程序块调用与 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 的值进行评估,并根据其信号状态指向以下操作:
如果 RLO 为“0”,则程序在跳转标签“MyLABEL”处以 BR 位的查询结果继续执行。而不执行加法运算。将操作数“Tag_Output”的值分配给当前的 RLO。
如果 RLO 为“1”,则执行加法运算。通过对溢出位 (OV) 的查询,可判断加法运算过程中是否存在错误。查询结果将保存在 BR 中。指令“CLR:将 RLO 复位为 0”将 RLO 复位为“0”,并结束逻辑序列。之后,系统将查询 BR 位并将其分配给操作数“Tag_Output”。通过 BR 位的信号状态以及操作数“Tag_Output”可判断加法运算是否成功执行没有任何错误。
通过 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”。 |
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !