指令 GET_ERROR 和 GET_ERR_ID 的用法 简介 通过本地错误处理,可以查询程序块内发生的错误并对相关的错误信息进行评估。可以为组 织块 (OB)、功能块 (FB) 和函数 (FC) 设置本地错误处理。如果启用了本地错误处理,则将忽 略系统响应。 可在指令 GET_ERR_ID 的错误信息中读取相应的错误编号。例如,通过指令 GET_ERROR 的 错误信息,可以确定导致访问错误的参数。要确保指令输出所需的错误信息,必须在用户程 序中对待评估错误的各个程序块进行相应编程。使用这些指令时,不会调用任何错误 OB,而 且不会在诊断缓冲区写入任何条目。采用这种错误处理方法,可通过编写错误响应方式在发 生错误时主动干预程序序列的执行。由于错误可能发生在程序块内的任何位置,因此我们建 议在程序块末尾处添加该指令。 指令 GET_ERROR 和 GET_ERR_ID 的主要区别在于输出的错误信息数量不同。在程序代码中加入其中一条指令后,在巡视窗口的“属性 > 特性”(Properties > Attributes) 下 方选择“在块内处理错误”(Handle errors within block) 复选框。该设置不能在巡视窗口内编 辑。只需删除所插入的本地错误处理指令,即可取消激活本地错误处理。 说明 块属性“在块内处理错误”(Handle errors within block) 该设置既不会应用于块调用中,也不会传输到所调用的程序块中。如果没有为gaoji别和低级 别的程序块编程专用的本地错误处理方式,则可应用系统设置。 错误输出优先级 在本地错误处理过程中,可通过指令 GET_ERROR 或 GET_ERR_ID 显示发生的第一个错误信 息。如果在指令的执行过程中同时发生多个错误,则将根据这些错误的优先级进行显示。下 表列出了不同类型错误的优先级:优先级 错误类型 1 程序代码错误 2 缺少引用 3 范围无效 4 DB 不存在 5 操作数不兼容 6 指定的区域宽度不够 7 定时器或计数器不存在 8 无法写入 DB 9 I/O 错误 10 指令不存在 11 块不存在 12 嵌套深度无效 Zui高优先级为 1,Zui低为 12。 更多信息 有关这些指令的更多信息,请参见信息系统中的“PLC 编程 > 指令 > 指令 (S7-1200, S7-1500) > 基本指令”(PLC programming > Instructions > Instructions (S7-1200, S7-1500) > Basic instructions)。这些指令支持编程语言 LAD/FBD/STL/SCL 和 GRAPH。
有关处理程序执行错误的示例 简介 本地错误处理可单独编程,也可与其它代码一起编程。为确保可识别程序中的所有错误,建 议使用本地错误处理组合方案,如以下示例所示。 为提高错误分析的准确程度的错误分析,除输出参数 RET_VAL 之外,还可使用指令 “GET_ERROR”或“GET_ERR_ID”。这些方案提供有错误代码,并在相应指令的描述中对其进行 详细说明。 此外,RET_VAL 输出参数也可能不输出有效错误代码。如果在读取输入参数时发生访问错误 (如,指令输出无法入),则这是因为指令执行已中断。此时,建议在用户程序中插入两条 指令“GET_ERROR”和“GET_ERR_ID”。这是因为,发生此类错误时,这两条指令将返回可靠的 错误信息。 警告 读取输入参数时发生访问错误 RET_VAL 参数未返回有效的错误代码,且诊断缓冲区中未输出任何详细错误信息。 错误的第一个指示符可以是状态字的 BR 位,也可以是使能输出 ENO 。如果返回信号状态“0”, 则说明指令执行过程中出错。信号状态为“1”表示无错误,因而无需进行进一步错误分析,但 存储器访问错误例外。此时,信号状态为“1”表示发生错误。
操作步骤 以下示例说明了如何在读取输入参数时识别访问错误: 1. 按以下方式声明程序块的块接口: 2. 编写以下程序代码:在程序段 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 编程语言中编程可靠的错误处理方式:程序流控制S7-300、S7-400 的状态字 (S7-300, S7-400) 逻辑运算字符串起始于 /FC 位信号状态“0”和二进制扫描指令(第一次扫描)。 第一次扫描 是程序段中的第一个二进制位逻辑运算或扫描。 这会将 /FC 位置位为“1”。 逻辑运算字符串 终止于一个二进制值赋值(如“置位”指令)、条件跳转或块更改。这会将 /FC 位置位为“0”。 RLO(逻辑运算结果) 状态位 RLO 是二进制逻辑运算中的缓冲区。 CPU 将第一次扫描的扫描结果传送到 RLO。每次后续扫描的的扫描结果都将与所保存的 RLO 进行运算,并将运算后的结果保存在 RLO 中。 可以使用相应指令置位、复位或取反 RLO 或将其保存在二进制结果 (BR) 中。 RLO 用于控制存储器、定时器和计数器指令,并可执行一些特定的跳转指令。 STA(状态) STA 状态位为所查询的二进制操作数的信号状态。 读取存储器的逻辑运算的状态始终与寻址位的值相同。 向存储器执行写入操作的逻辑运算 (如“置位”或“复位”指令)的状态始终与该指令写入的位的值相同。 如果指令不写入存 储器,则其状态与寻址位的值相同。对于不访问存储器的逻辑运算指令而言,无需状态位。 这些指令将状态位置位为“1”。 而且这些指令也不会对这些状态位进行查询。 只有当显示程 序变量的在线状态时,才会检查状态位。 OR(OR 位) 如果在“或”运算之前执行“与”运算,则使用 OR 状态位。 如果“与”运算的 RLO 为“1”,则置位 OR 位。 这将提前计算出“或”运算的结果。 其它任 何二进制指令都将复位 OR 位。 OS(上溢,已存储) OS 状态位将保存 OV 状态位的设置。 如果 CPU 置位了 OV 状态位,则也会置位 OS 状态位。 但是,在下一条正确执行的指令复位 OV 位时,OS 状态位保持为置位状态。 因此能够查询到当前 CPU 循环后期阶段发生值范围 上溢或使用了无效浮点数。 OV(上溢) OV 状态位表示值范围上溢或使用了无效的浮点数。状态字的基本信息 (S7-300, S7-400) 说明 状态字包含的状态位用于 CPU 控制二进制逻辑运算和设置数字处理。 可以查询状态位并只 影响这些状态位。 下表列出了状态字中各个状态位的排列方式:数学函数、转换指令和浮点数比较可能会影响 OV 状态位。 CC 0 和 CC 1(条件代码位) CC 0 和 CC 1 状态位将提供有关下列指令结果的信息: • 比较指令 • 数学函数 • 字逻辑运算 • 移位与循环移位指令 BR(二进制结果) BR 状态位既可以对功能框执行 EN/ENO 操作,也可以作为特定跳转指令 (STL) 中的条件。 可 以使用特定指令(如 SAVE)来影响 BR 状态位。 设置状态位 (S7-300, S7-400) 为位逻辑运算设置状态位 (S7-300, S7-400) 说明 二进制指令将影响状态位 OR、STA、RLO 和 /FC。 在 LAD 中设置状态位 下表列出了如何在 LAD 编程语言中设置状态位:在定时器和计数器指令中设置状态位 (S7-300, S7-400) 说明 定时器和计数器指令将影响状态位 OR、STA、RLO 和 /ER。 在 LAD 和 FBD 中设置状态位 下表列出了如何在 LAD 和 FDB 编程语言中设置状态位:设置带有整数的指令中的状态位 (S7-300, S7-400) 说明 带有整数的指令将影响状态字中的状态位 CC 1、CC 0、OV 和 OS。 如果结果为零,状态位 CC 1 和 CC 0 将置位为“0”。如果结果为正值,状态位 CC 1 将置位为“1” 同时状态位 CC 0 将置位为“0”。 如果结果为负值,状态位 CC 1 将置位为“0”同时状态位 CC 0 将置位为“1”。 如果发生值范围上溢,状态位 OV 和 OS 将置位为“1”。除 0 时,状态位 CC 1、CC 0、OV 和 OS 的信号状态将为“0”。 下表列出了使用整数时状态位的设置情况:设置带有浮点数的指令中的状态位 (S7-300, S7-400) 说明 带有浮点数的指令将影响状态字中的状态位 CC 1、CC 0、OV 和 OS。 如果结果为零,状态位 CC 1 和 CC 0 将置位为“0”。如果结果为正值,状态位 CC 1 将置位为“1” 同时状态位 CC 0 将置位为“0”。如果结果为负值,状态位 CC 1 将置位为“0”同时状态位 CC 0 将置位为“1”。 如果发生值范围上溢,状态位 OV 和 OS 将置位为“1”。 浮点数无效时,状态位 CC 1、CC 0、 OV 和 OS 的信号状态将为“0”。 下表列出了使用浮点数时状态位的设置情况。