如何在STL中的EN/ENO机制仿真示例呢?

描述

程序块调用与 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”。






审核编辑:刘清

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分