介绍
本地错误处理可以单独编程或与其他代码一起编程。为了确保识别出程序中的所有错误,建议使用本地错误处理方案的组合,如下例所示。
为了提高错误分析的准确性,除了输出参数RET_VAL 之外,还可以使用指令“GET_ERROR”或“GET_ERR_ID”。针对这些场景提供了错误代码,并在相应指令的描述中详细说明。
此外,RET_VAL 输出参数可能不会输出有效的错误代码。如果读取输入参数时出现访问错误(例如无法访问指令输出),这是因为指令执行被中断。此时,建议在用户程序中插入“GET_ERROR”和“GET_ERR_ID”两条指令。这是因为当发生此类错误时,这两条指令会返回可靠的错误信息。
警告读取输入参数时发生访问错误
RET_VAL 参数未返回有效的错误代码,并且诊断缓冲区中未输出详细的错误信息。错误的第一个指示符可以是状态字的BR 位或使能输出ENO。如果返回信号状态“0”,则指令执行期间发生错误。信号状态“1”意味着不存在错误并且不需要进一步的错误分析,存储器访问错误除外。此时,信号状态“1”表示发生了错误。
脚步
下面的例子说明了如何在读取输入参数时识别访问错误:
声明程序块的块接口如下:
编写以下程序代码: 在网络1 中,调用指令“MOVE_BLK_VARIANT:块移动”。在SRC参数中,变量索引用于访问“SrcField”源区域。如果指令执行成功且没有错误,则使能输出ENO 返回信号状态“1”,程序执行跳转到块4 继续执行。
如果在指令执行期间发生访问错误(例如由于变量索引),网络2 中的指令“GET_ERR_ID:获取本地错误ID”将返回错误ID。将网络2 中的错误ID“UNEQUAL”与值“0”进行比较,返回结果#Test2=TRUE。在网络3 中,将错误ID“EQUAL”与值“0”进行比较,返回结果#Test3=TRUE。
在这种情况下,输出参数RET_VAL 处的#TagRet_Val 操作数将不会返回有效的错误代码。
例外
但是,有一些指令不适用于上面示例中列出的错误处理方法。具体包括以下指令:
一般不支持EN/ENO机制的指令
禁用ENO 的说明
S_COMP
PEEK、PEEK_BOOL、POKE、POKE_BOOL 和POKE_BLK
即使发生访问错误,这些指令中的BR 位或使能输出ENO 也会被设置为TRUE。
以下示例展示了如何使用STL 编程语言编写可靠的错误处理程序:
STL 描述SET //操作数#Tag_ErrorID 将被初始化为“0”。 L 0T #Tag_ErrorIDCALL S_COMP//调用该指令。 src_type :=String//参数IN1和IN2的数据类型关系:=EQ//该指令IN1的比较类型:=#StringArray.THIS[#index]//对ARRAY元素的变量访问。 IN2 :='STRING' //比较两个值。 OUT :=#TagResult //如果两个值相等,则操作数#TagResult 的信号状态为“1”。 A BR //查询BR位。 CALL GET_ERR_ID //调用该指令。 RET_VAL :=#Tag_ErrorID//当发生访问错误时,该指令将输出错误代码。即使BR位的信号状态为“1”,也会检测到访问错误。可以通过计算指令“GET_ERR_ID:获取本地错误ID”的#Tag_ErrorID 操作数来查询该错误代码。
审稿人:刘庆