简介
本地错误处理可单独编程,也可与其它代码一起编程。为确保可识别程序中的所有错误,建议使用本地错误处理组合方案,如以下示例所示。
为提高错误分析的准确程度的错误分析,除输出参数 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 中“UNEQUAL”的错误 ID 将与值“0”进行比较并返回结果 #Test2 = TRUE。在程序段 3 中,“EQUAL”的错误 ID 将与值“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 0 | |
T #Tag_ErrorID | |
CALL S_COMP | // 调用该指令。 |
src_type := String | // 参数 IN1 和 IN2 的数据类型 |
relation := 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,可查询该错误代码。