当S7-1200PLC在运行中发生程序执行错误时,PLC将报错,此时没有相应的错误中断OB响应,也不会引起CPU停机,可以通过PLC的诊断缓冲区进行诊断。而在实际应用中往往需要PLC对这种编程错误立即响应,可进行相应的错误处理。S7-1200PLC根据程序错误类型和原因提供了不同的处理机制,可通过“EN/ENO”机制和“GET_ERROR”或“GET_ERR_ID”指令对程序错误进行诊断处理,见表13-12。
表13-12 程序错误类型和处理机制
①“ENO”机制可用于算数函数、移动操作、转换操作、字逻辑运算、程序控制、运行时控制、移位和循环等基本指令。
下面通过示例说明通过“EN/ENO”机制和“GET_ERROR”指令如何对程序错误进行诊断处理,满足控制系统对可能的程序错误发生时所要求的响应。在示例项目中创建一个数据块DB9“Motor_DB”,变量声明见表13-13。
并在数据块中声明一个为系统数据类型“ErrorStruct”的变量“ProgramErrInfo”,在FC1块“ProgramErr”中,对选择的电机进行转速计算,每个电机的转速需要通过转速比计算实际转速。程序块“ProgramErr”参数定义见表13-14。
表13-13 数据块“Motor_DB”变量声明
(续)
表13-14 示例程序块FC1“ProgramErr”参数声明
程序如图13-34所示。
图13-34 示例程序块ProgramErr
程序段1:计算选择的电机(Motor_Nr)的转速=motor_Nr × encoder_speed
通过使能MUL指令的“ENO”机制诊断指令的“参数值错误”(溢出错误),在指令的右键菜单中选择“生成ENO”,启动“ENO”机制,如图13-35所示。
图13-35 启用指令“ENO”机制
当指令计算值超出INT数据类型范围时会发生“溢出”错误,导致指令ENO=false。
程序段2:编程“GET_ERROR”指令可以诊断出在“程序段1”中的数组变量“#motor_ratio[#motor_Nr]”中,“motor_Nr”是否超出数组范围,当发生编程错误时将导致指令的ENO=false。
程序段3:存储“GET_ERROR”指令输出的错误信息分析具体错误原因。示例中数组下标寻址超出范围产生程序错误,读取错误信息如图13-36所示。
示例中读取错误信息数值说明如下,更详细的说明可参考TIA博途软件的在线帮助。
①ERROR_ID:错误ID。16#2522表示“读取错误:操作数超出有效范围”。
②FLAGS:程序块调用中错误。16#00表示程序块调用过程中无错误。(www.xing528.com)
图13-36 “GET_ERROR”错误信息
③REACTION:错误响应。16#01表示错误时使用替代值“0”继续。
④BLOCK_TYPE:出现错误的程序块类型。16#02表示FC块。
⑤CB_NUMBER:块号。1表示FC1(④判断错误块是FC)。
⑥AREA:存储区。16#8B表示访问“数据块”发生错误。
⑦DB_NUMBER:数据块编号。9表示错误访问的数据块是DB9。
综合以上信息,可判断出FC1在执行DB9读取过程中出现访问超出数据块范围的错误;再结合程序中DB9只有数组变量访问是变址访问,可得出结论数组下标寻址超限。
由于指令的输出错误数据只有存在错误时才会更新,为了在错误处理之后将存储的错误数据清除,可以通过以下3种方法实现:
•通过程序块的Temp变量传输错误数据,示例程序中采用的就是这种方法。
•在调用“GET_ERROR”指令之前将存储数据清除。
•查询“GET_ERROR”指令的ENO,当ENO=false(程序块中不存在编程错误)时,将存储数据清除。
程序段4:参数值错误(ENO机制)和编程错误(GET_ERROR)中发生任一错误,将使功能块FC1的ENO=false,可判断计算转速无效。在主程序OB1中调用“ProgramErr”,如图13-37所示。
图13-37 评估示例程序块“ProgramErr”的ENO输出
①电机编号实际值为12,超出了DB9中变量“Motor_ratio”的数组范围(1..10)。
②电机转速计算值。
③“ProgramErr”的ENO输出为false,可以判断②中的转速值是无效值。根据图13-37中的错误信息可判断出此时计算出的电机转速为替代值“0”。
对于SCL语言编写的程序块,启动“ENO”机制是针对整个程序块的,需要在程序块属性使能“自动置位SCL块和SCL程序段的ENO”来启动“ENO”机制,如图13-38所示。
图13-38 启用SCL程序块的ENO机制
注意:
•“GET_ERR_ID”指令与“GET_ERROR”不同的是只读取程序执行错误信息中的错误ID。
•当程序执行时有多个错误发生时,“GET_ERROR”、“GET_ERR_ID”只读取第一个发生错误的错误信息;只有在更正了发生的第一个错误后,才会读取下一个要发生错误的错误信息。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。