PLC结构化文本(ST)——异常捕获(__TRY__CATCH)
PLC Structured Text Object Oriented Programming
PLC结构化文本(ST)——异常捕获(__TRY__CATCH)
异常处理
异常是在程序执行期间出现的问题。C# 中的异常是对程序运行时出现的特殊情况的一种响应,比如尝试除以零。异常提供了一种把程序控制权从某个部分转移到另一个部分的方式。---C#异常处理|菜鸟教程
异常捕获是从 IEC61131-3 标准扩展而来的,用于IEC代码中的特定异常处理。当运算符 __Try 块内的程序抛出异常,PLC应用程序不会停止,接着执行下面的语句 __Catch 内的语句块,然后它执行下面的指令 __FINALLY。异常处理以 __ENDTRY 结束。继续执行后面的PLC逻辑程序。
我们常常在 C# 中代码示例中看到 try、catch 代码块,用来捕获某段代码异常问题。其实在PLC中,同样可以使用异常捕获,来排查程序问题。
语法结构
- 除零异常
PROGRAM MAIN
VAR
iTest1 : INT;
iResult: REAL;
iTest2 : INT := 0;
exc : __SYSTEM.ExceptionCode;
END_VAR
// 不使用异常捕获
iResult := iTest1 / iTest2; // PLC执行到此处,立即停止。
// 使用异常捕获
__TRY
iResult := iTest1 / iTest2; // 执行到此处捕获到除零异常,PLC不停止继续执行__CATCH运算块。
__CATCH(exc)
exc := exc; // exc:RTSEXCPT_DIVIDEBYZERO ,捕获到异常代码。
__FINALLY
iResult := 2 / 1; // 最终执行__FINALLY运算块。
__ENDTRY
- 空指针异常
PROGRAM MAIN
VAR
exc : __SYSTEM.ExceptionCode;
pTest : POINTER TO INT;
END_VAR
__TRY
pTest^ := 1;
__CATCH(exc)
exc := exc; // exc:RTSEXCPT_ACCESS_VIOLATION
__FINALLY
;
__ENDTRY
捕获无效指针引用异常。程序不停止,继续执行。
- 空引用异常
PROGRAM MAIN
VAR
exc : __SYSTEM.ExceptionCode;
refTest: REFERENCE TO INT;
END_VAR
__TRY
refTest := 1;
__CATCH(exc)
exc := exc; // exc:RTSEXCPT_ACCESS_VIOLATION
__FINALLY
;
__ENDTRY
- 接口空引用异常
PROGRAM MAIN
VAR
exc : __SYSTEM.ExceptionCode;
iTFTest : I_Test;
END_VAR
__TRY
iTFTest.METH();
__CATCH(exc)
exc := exc; // exc:RTSEXCPT_ACCESS_VIOLATION
__FINALLY
;
__ENDTRY
指针、引用、接口异常捕获代码都是 RTSEXCPT_ACCESS_VIOLATION。上述只是较为常见的几个范例。
实际上在PLC中一般不允许程序异常的出现,工业设备安全稳定运行是最基本的,但在开发调试阶段难免会遇到PLC程序突然异常导致停止,可以尝试使用异常捕获代码排查问题代码位置。
总结
在 TwinCAT3 中并不是任何版本都可以使用异常捕获代码,只有 TwinCAT3.1 4024 32bit 和 TwinCAT3.1 4026 64bit 可以使用此运算块。CODESYS 平台好像没有这些限制,具体是否可行各位可以自行测试。
异常的 IEC 变量具有数据类型
__System.ExceptionCode。
TYPE ExceptionCode :
(
RTSEXCPT_UNKNOWN := 16#FFFFFFFF,
RTSEXCPT_NOEXCEPTION := 16#00000000,
RTSEXCPT_WATCHDOG := 16#00000010,
RTSEXCPT_HARDWAREWATCHDOG := 16#00000011,
RTSEXCPT_IO_CONFIG_ERROR := 16#00000012,
RTSEXCPT_PROGRAMCHECKSUM := 16#00000013,
RTSEXCPT_FIELDBUS_ERROR := 16#00000014,
RTSEXCPT_IOUPDATE_ERROR := 16#00000015,
RTSEXCPT_CYCLE_TIME_EXCEED := 16#00000016,
RTSEXCPT_ONLCHANGE_PROGRAM_EXCEEDED := 16#00000017,
RTSEXCPT_UNRESOLVED_EXTREFS := 16#00000018,
RTSEXCPT_DOWNLOAD_REJECTED := 16#00000019,
RTSEXCPT_BOOTPROJECT_REJECTED_DUE_RETAIN_ERROR := 16#0000001A,
RTSEXCPT_LOADBOOTPROJECT_FAILED := 16#0000001B,
RTSEXCPT_OUT_OF_MEMORY := 16#0000001C,
RTSEXCPT_RETAIN_MEMORY_ERROR := 16#0000001D,
RTSEXCPT_BOOTPROJECT_CRASH := 16#0000001E,
RTSEXCPT_BOOTPROJECTTARGETMISMATCH := 16#00000021,
RTSEXCPT_SCHEDULEERROR := 16#00000022,
RTSEXCPT_FILE_CHECKSUM_ERR := 16#00000023,
RTSEXCPT_RETAIN_IDENTITY_MISMATCH := 16#00000024,
RTSEXCPT_IEC_TASK_CONFIG_ERROR := 16#00000025,
RTSEXCPT_APP_TARGET_MISMATCH := 16#00000026,
RTSEXCPT_ILLEGAL_INSTRUCTION := 16#00000050,
RTSEXCPT_ACCESS_VIOLATION := 16#00000051,
RTSEXCPT_PRIV_INSTRUCTION := 16#00000052,
RTSEXCPT_IN_PAGE_ERROR := 16#00000053,
RTSEXCPT_STACK_OVERFLOW := 16#00000054,
RTSEXCPT_INVALID_DISPOSITION := 16#00000055,
RTSEXCPT_INVALID_HANDLE := 16#00000056,
RTSEXCPT_GUARD_PAGE := 16#00000057,
RTSEXCPT_DOUBLE_FAULT := 16#00000058,
RTSEXCPT_INVALID_OPCODE := 16#00000059,
RTSEXCPT_MISALIGNMENT := 16#00000100,
RTSEXCPT_ARRAYBOUNDS := 16#00000101,
RTSEXCPT_DIVIDEBYZERO := 16#00000102,
RTSEXCPT_OVERFLOW := 16#00000103,
RTSEXCPT_NONCONTINUABLE := 16#00000104,
RTSEXCPT_PROCESSORLOAD_WATCHDOG := 16#00000105,
RTSEXCPT_FPU_ERROR := 16#00000150,
RTSEXCPT_FPU_DENORMAL_OPERAND := 16#00000151,
RTSEXCPT_FPU_DIVIDEBYZERO := 16#00000152,
RTSEXCPT_FPU_INEXACT_RESULT := 16#00000153,
RTSEXCPT_FPU_INVALID_OPERATION := 16#00000154,
RTSEXCPT_FPU_OVERFLOW := 16#00000155,
RTSEXCPT_FPU_STACK_CHECK := 16#00000156,
RTSEXCPT_FPU_UNDERFLOW := 16#00000157,
RTSEXCPT_VENDOR_EXCEPTION_BASE := 16#00002000,
RTSEXCPT_USER_EXCEPTION_BASE := 16#00010000
) UDINT ;
END_TYPE

浙公网安备 33010602011771号