Из любопытства я проверил AppGenerateException
и все заработало. Получил помощь на этой справочной странице Codesys.
Я все еще думаю, что это не лучший способ добиться того, что вам нужно, но он может сработать.
К сожалению, у меня 64-битная система, а TRY..CATCH пока не работает в других 32-битных системах, насколько мне известно, поэтому я не смог проверить отлов.
Добавьте следующие библиотеки:
Тогда следующий код работает. Установите для 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);
Но это не задокументировано, поэтому я был бы осторожен.
person
Quirzo
schedule
04.06.2020
__TRY
,__CATCH
и__FINALLY
для перехватаEXCEPTION
, выдаваемых стандартными функциями. Как я могу сделать то же самое. И если возможно, могу ли я определить пользовательские исключения и использовать их? - person Guiorgy   schedule 03.06.2020