Search code examples
exceptioncodesys

Throw Exceptions in CODESYS


How can I throw standard system exceptions (and if possible, create custom exceptions and throw them too).

The simplest thing that comes to mind, is to just divide a variable by zero, but that's just a hack at best.

I did find mentions of a function AppGenerateException in the CmpApp library, but I can't find any documentation for it, nor any examples. Can anybody point me to some documentation for this?


Solution

  • Out of curiosity I checked the AppGenerateException and got it working. Got some help from this Codesys help page.

    I still think this is not the best way to achieve what you need, but it could work.

    Unfortunately, I have 64 bit system and the TRY..CATCH is not yet working in other that 32 bit systems as far as I know, so I couldn't test catching.

    Add the following libraries:

    • CmpApp
    • SysExcept

    Then the following code seems to work. Set ThrowErr to true to get the system exception.

    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
    

    It seems that it's possibly to use any custom exception code like:

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

    But it's not documented so I would be careful.