geterror 与 geterrorid 指令的使用
在 step7 11 中,可以通过geterror (获取本地错误信息)或者geterrorid (获取本地错误id )指令查询块内出现的错误。
请注意:geterror 和 geterrorid 均支持块内的错误处理。当在程序块中调用geterror 或geterrorid 指令后,如果该程序块发生错误,cpu则将忽略任何预定义的系统响应。
也就是说cpu 会忽略此错误,而且cpu 的error 灯(红色)也不会亮,cpu 也不会停机。所以说该指令在某种程度上也起到了抑制程序错误的作用,同时有一定的风险存在。
建议该指令在程序块中的最后一个网络中调用, 这样可以诊断整个程序块中的错误,如果在程序中间调用该指令,则后面的程序如果有错误,cpu 也会忽略错误,不会停机,也没有相关报错,将不利于问题的诊断。
1. geterror 与 geterrorid 的调用
在编程界面下, 点击右侧 “指令-> 基本指令-> 程序控制操作” 中可以找到geterror及geterrorid 两个指令。(见下图1)
图1.
2. gererror 指令的使用
geterror :使用“获取本地错误信息”指令,可以查询块内出现的错误。如果在块执行期间出现错误,则发生的第一个错误的详细信息将保存在输出 error 中。
消除第一个错误后,该指令会在error 处输出下一个错误的信息。仅当使能输入 en 的信号状态为“1”且显示了错误信息时,才置位“获取本地错误信息”指令的使能输出 eno。
geterror 指令的输出参数error 的数据类型为:errorstruct(见图2),请注意:常规的变量类型中并未包含此类型。
图2
定义error 变量的步骤:
1. 需要创建一个全局数据块并定义变量,例如变量名为error,在db 块中手动输入 errorstruct ,该变量类型无法通过下拉列表选择(见图3)。
图3
通常输入“ e ” 时就可以看见该变量类型,可以直接点选。(见图4)
图4.
2. 定义后的error 结构如下:(见图5),详细的参数介绍请参考该指令的帮助文件。(选中块, 按键盘上功能键 f1 )
图5.
3. 定义完成后可以直接在引脚输入所创建的db 块的名称,即可在下拉框中找到所定义的error 变量( 见图6)。
图6.
直接选择error 即可完成输出参数的定义(图7)。
图7.
可以通过打开db 块,监控error的状态判断程序是否报错。详细报错信息请参考该块的帮助(选中块, 按键盘上功能键 f1 )
例如: 在fc1 中编程调用一个不存在的地址 db1.dbx0.0,此时geterror 指令执行, cpu 运行正常, 没有error 灯亮,诊断缓冲区也不会报错( 见图8 )。
图8.
注意:在tia protal v11 中,如果程序中使用了未定义的变量或未创建的变量,编译将会报警,但程序可以下载, 未定义变量不能通过变量分配,见下图9。
图9.
此时监控db 块中error 变量的状态, 根据监视值查询帮助可以知道 fc1 中调用的全局数据块 db1 中,偏移地址0 不存在(图10)。
图10.
3. geterrorid 的使用
geterrorid:使用“获取本地错误 id”指令(见图11),可以查询块内出现的错误。如果在块执行过程中系统信号出错,会将发生的第一个错误的 id 保存在输出 id 的变量中。
id 输出中只能指定 word 数据类型的操作数(见图12)。消除第一个错误后,该指令才会输出发生的下一个错误的id。
仅当“获取本地错误 id”指令的输入的信号状态为“1”且显示了错误信息时,才置位该指令的输出。
图11
图12
下表列出了getrrrorid 指令的输出参数 id 可以输出的值对应的报错信息。(geterror 指令输出结构变量中的errorid适用于下表)
id id 说明
0 0 无错误
2503 9475 指针无效
2505 9477 在用户程序中调用“stop”指令 (sfc46)
2520 9504 string 无效
2522 9506 读取错误:操作数超出有效范围
2523 9507 写入错误:操作数超出有效范围
2524 9508 读取错误:操作数无效
2525 9509 写入错误:操作数无效
2528 9512 读取错误:数据对齐
2529 9513 写入错误:数据对齐
252c 9516 指针无效
2530 9520 写入错误:数据块
2533 9523 使用了无效指针
2534 9524 块编号错误 fc
2535 9525 块编号错误 fb
2538 9528 访问错误:db 不存在
2539 9529 访问错误:使用了错误 db
253a 9530 全局数据块不存在
253c 9532 故障信息或函数不存在
253d 9533 系统函数不存在
253e 9534 故障信息或函数块不存在
253f 9535 系统块不存在
2550 9552 访问错误:db 不存在
2551 9553 访问错误:使用了错误 db
2575 9589 程序嵌套深度出错
2576 9590 本地数据分配出错
2942 10562 读取错误:input
2943 10563 写入错误:output
常问问题
geterror 与geterrorid 的区别?
答:geterror 与geterrorid 区别在于 geterror 可以得到比较详细的信息,如块编号,偏移地址等, 便于问题的快速诊断及定位。geterrorid 指令仅输出简单报错信息。
如果程序比较复杂,建议使用geterror 指令可以更快捷的帮助查找程序错误 。
是否可以在一个块中( fc 或 fb )中不同的网络段中(network)多次调用 geterror 或 geterror id 指令?
答:可以。在一个块中不同的网络段中调用多次geterror 指令或 geterrorid 指令,可以诊断一个块中不同网络段中的错误(见图13)。
图13.
当然也可以在一个块中的最后一个网络只调用一次,如果程序中存在多处错误,发生的第一个错误的详细信息将输出至输出参数error 或 id 处, 当第一个错误消失后,第二个错误的错误信息才被输出至输出参数。
是否可以在 ob1 中调用geterror 或 geterror id 指令?
答:可以,使用方法与在fc 或 fb 中调用类似。
情况一:ob1 程序中出错:
如果ob1 中的程序出错,例如调用未组态硬件的 i 地址,但未调用geterror 指令,cpu error 灯会红色闪烁,诊断缓冲区报错(见图14), 但cpu不会停机( 仅限于cpu 固件版本v2.0 以上版本,固件版本为v1.0 的cpu 在此种情况下会停机)
图14.
此时如果在ob1 中最后一条网络调用geterror 或geterrorid 指令,则诊断缓冲区的报错信息消失, cpu 指示灯恢复正常。
情况二:ob1 本身的网络中没有错误, 但在 ob1 中调用的块中存在错误, 例如fc1中存在错误 :
1 ) 如果ob1 中无条件调用的块例如fc1 出错, ob1的其它网络没有错误, fc1 中有错误但并没有调用get error 指令,cpu error 灯也会红色闪烁,诊断缓冲区报错(见图15),但cpu不会停机( 仅限于cpu 固件版本v2.0 以上版本,固件版本为v1.0 的cpu 在此种情况下会停机), 当在fc1 调用geterror 指令后, cpu 报错信息消失,指示灯恢复正常。
图15.
2 ) 如果ob1 中有条件调用块, 例如fc1, 但fc1 在ob 1 中的执行条件没有满足,则 cpu 不会报错。一旦fc1 调用条件满足被执行,且fc1 中的错误一直存在,则cpu error 灯也会闪,诊断缓冲区报错(见图15), 但cpu不会停机( 仅限于cpu 固件版本v2.0 以上版本,固件版本为v1.0 的cpu 在此种情况下会停机) 。
3) 如果ob1 中调用的块fc 有错误,在ob1 中调用了geterror 指令,但出错的块 fc1 中未调用 geterror 指令,则cpu 也会出现 指示灯error 红色闪烁,诊断缓冲器报错。见图16。
图16.
总结:由此可见, geterrorid 或geterror 指令是基于块的指令,只能诊断调用它的块中的错误,如果出错的程序中未调用该指令,则无法诊断该块中的错误。
简单的将Vsupply 与负载接通的开关控制电路
物联网与视频媒介相关的应用有哪些
三星note7爆炸原因真相大白信任危机就过去了吗?
有源滤波器APF和静止无功发生器SVG在石油行业中的应用
嵌入式软件设计模式 好文值得收藏
GetError与GetErrorID指令的使用
大数据时代需要智能云存储 边缘智能存储是新的风口?
STM32时钟与GPIO分析 基于STM32的LED灯开发
蓝牙5与WiFi有什么优势 蓝牙5与WiFi如何选择
OLED电视负增长 液晶电视全球出货量首次跌破2亿台
关于UR4205C的日光灯方案设计分析
再不革命,魅族将成为下一个乐视?Pro7还能背水一战吗?
亲子家庭重要成员——佳能LEGRIA HF R86
华为推送鸿蒙2.0系统开发者测试版,拥有功能独特设计
小米MIX和华为荣耀magic:最强国产旗舰互怼,孰强孰弱
魏德米勒工业分析:兼备数据科学研究与专业技能
土壤温湿度传感器教你科学种茶,从此种茶不再难
丹麦miniBOOSTER增压器HC3-4.0-B-1
爱普生QMEMS技术是什么?
STM32单片机开发环境安装与工程搭建