说明 对常规错误代码的响应如果在输出参数 RET_VAL 中输入了一个常规错误代码,则可能出现以下几种情况: • 该指令相关的操作已开始或者已完成。 •执行操作时,发生特定的指令错误。但在发生一个常规错误后,系统不再指示发生此特定错误。下表列出了一个返回值的常见错误代码。错误代码显示为十六进制格式。代码编号中的字母 x仅为一个占位符,表示导致该错误的系统函数参数的编号: 错误代码 (W#16#.. .) 说明 8x01 VARIANT 参数的语法ID 非法 8x22 读取一个参数时发生超出范围错误。 该错误代码表示参数 x 完全或部分超出地址范围,或 VARIANT参数指示的位范 围长度不是 8 的倍数。 8x23 写入参数时发生超出范围错误。 该错误代码表示参数 x 完全或部分超出地址范围,或VARIANT 参数指示的位范 围长度不是 8 的倍数。 8x24 读取参数时发生超出范围错误。 该错误代码表示参数 x超出系统函数的有效范围。有关无效范围的信息,请参 见各函数的具体说明。 8x25 写入参数时发生超出范围错误。 该错误代码表示参数 x超出系统函数的有效范围。有关无效范围的信息,请参 见各函数的具体说明。 8x26 此参数包含的定时器单元编号过高。此错误代码表示在参数 x 中指定的定时器单元不存在。 8x27 此参数包含的计数器单元编号过高(计数器编号错误)。此错误代码表示在参数 x 中指定的计数器单元不存在。错误代码 (W#16#.. .) 说明 8x28 读取参数时发生对齐错误。8x29 写入参数时发生对齐错误。 此错误代码表示对参数 x 的引用是一个位地址不为 0 的操作数。 8x30此参数位于只读属性的全局 DB 中。 8x31 该参数位于一个只读背景数据块中。 此错误代码表示参数 x位于只读属性的数据块中。如果通过系统函数本身来打 开该数据块,那么系统函数将始终返回值 W#16#8x30。 8x32 此参数包含的DB 编号过高(DB 编号错误)。 该错误代码表示参数 x 所包含块的块编号超出允许的Zui大值。 8x34 此参数包含的 FC编号过高(FC 编号错误)。 该错误代码表示参数 x 所包含块的块编号超出允许的Zui大值。 8x35 此参数包含的 FB 编号过高(FB编号错误)。 该错误代码表示参数 x 所包含块的块编号超出允许的Zui大值。 8x3A 此参数包含尚未加载的 DB 编号。 8x3C此参数包含未加载 FC 的编号。 8x3E 此参数包含未加载 FB 的编号。 8x42系统尝试从外设输入区读取一个参数时,发生访问错误。 8x43 系统尝试向外设输出区写入一个参数时,发生访问错误。 8x44 出错后,第n (n > 1) 次发生读访问错误。 该错误代码表示对所需参数的访问遭到拒绝。 8x45 出错后,第 n (n > 1)次发生写访问错误。 该错误代码表示对所需参数的访问遭到拒绝。 8x7F 内部错误 该错误代码表示参数 x 处发生了内部错误。特定的错误代码 某些指令在其返回值中将提供一个该指令特定的错误代码,指示这些错误只会在特定的指令 中发生。
指令GET_ERROR 和 GET_ERR_ID 的用法 简介通过本地错误处理,可以查询程序块内发生的错误并对相关的错误信息进行评估。可以为组 织块 (OB)、功能块 (FB) 和函数 (FC)设置本地错误处理。如果启用了本地错误处理,则将忽 略系统响应。 可在指令 GET_ERR_ID的错误信息中读取相应的错误编号。例如,通过指令 GET_ERROR 的错误信息,可以确定导致访问错误的参数。要确保指令输出所需的错误信息,必须在用户程序中对待评估错误的各个程序块进行相应编程。使用这些指令时,不会调用任何错误 OB,不会在诊断缓冲区写入任何条目。采用这种错误处理方法,可通过编写错误响应方式在发生错误时主动干预程序序列的执行。由于错误可能发生在程序块内的任何位置,我们建 议在程序块末尾处添加该指令。 指令GET_ERROR 和 GET_ERR_ID 的主要区别在于输出的错误信息数量不同。在程序代码中加入其中一条指令后,在巡视窗口的“属性> 特性”(Properties > Attributes) 下 方选择“在块内处理错误”(Handle errorswithin 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。
有关处理程序执行错误的示例 简介本地错误处理可单独编程,也可与其它代码一起编程。为确保可识别程序中的所有错误,建 议使用本地错误处理组合方案,如以下示例所示。为提高错误分析的准确程度的错误分析,除输出参数 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)状态字的基本信息(S7-300, S7-400) 说明 状态字包含的状态位用于 CPU 控制二进制逻辑运算和设置数字处理。 可以查询状态位并只影响这些状态位。 下表列出了状态字中各个状态位的排列方式:逻辑运算字符串起始于 /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状态位表示值范围上溢或使用了无效的浮点数。