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# 中代码示例中看到 trycatch 代码块,用来捕获某段代码异常问题。其实在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 32bitTwinCAT3.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

posted @   J_Sheng  阅读(133)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验
点击右上角即可分享
微信分享提示