在 CODESYS 中抛出异常

Throw Exceptions in CODESYS

如何抛出标准系统异常(如果可能,创建自定义异常并抛出它们)。

想到的最简单的事情就是将变量除以零,但这充其量只是一种技巧。

我确实在 CmpApp 库中找到了对函数 AppGenerateException 的提及,但我找不到它的任何文档,也找不到任何示例。任何人都可以为我指出一些文档吗?

出于好奇,我检查了 AppGenerateException 并使其正常工作。从 this Codesys help page 那里得到了一些帮助。

我仍然认为这不是实现您需要的最佳方式,但它可以工作。

不幸的是,我有 64 位系统,据我所知,TRY..CATCH 还不能在其他 32 位系统上工作,所以我无法测试捕获。

添加以下库:

  • CmpApp
  • SysExcept

那么下面的代码似乎可以工作。设置 ThrowErr 为 true 以获取系统异常。

PROGRAM PRG_TestThrow
VAR CONSTANT
    MY_PRIVATE_EXCEPTION : DWORD := 32001;
END_VAR
VAR
    ThrowErr    : BOOL; //Set this to TRUE to throw an error

    //The next two are for getting App instance
    _pApp       : POINTER TO CmpApp.APPLICATION;
    _Result     : SysExcept.SysTypes.RTS_IEC_RESULT;
END_VAR



//Get App instance
_pApp := AppGetCurrent(pResult := ADR(_Result));

IF ThrowErr THEN
    ThrowErr := FALSE;

    IF _pApp <> 0 THEN
        //Throw divide by zero exception
        AppGenerateException(pApp:=_pApp,   ulException:=RtsExceptions.RTSEXCPT_DIVIDEBYZERO);

        //You could use probably any available number as your own custom exception. 
        //For example the following works BUT not sure if it's ok to this.
        //AppGenerateException(pApp:=_pApp,   ulException:=MY_PRIVATE_EXCEPTION);

        //See RtsExceptions type for available exception codes. 
        //For my Codesys version, it has largest exception number of 0x2000 so all larger number are free (for now...)
    END_IF
END_IF

似乎可以使用任何自定义异常代码,例如:

AppGenerateException(pApp:=_pApp,   ulException:=MY_PRIVATE_EXCEPTION);

但没有记录,所以我会小心。