Exception 在CODESYS中抛出异常

Exception 在CODESYS中抛出异常,exception,codesys,Exception,Codesys,如何抛出标准系统异常(如果可能,创建自定义异常并抛出它们) 我想到的最简单的事情就是将一个变量除以零,但这充其量只是一个小技巧 我确实在CmpApp库中找到了一个函数appgenerateeexception,但我找不到任何文档,也找不到任何示例。有人能给我指一下这方面的文档吗?出于好奇,我检查了AppGenerateException并使其正常工作。我得到了他的一些帮助 我仍然认为这不是实现您所需的最佳方式,但它可能会奏效。 不幸的是,据我所知,我有64位系统和TRY..CATCH在其他32位

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

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


我确实在
CmpApp
库中找到了一个函数
appgenerateeexception
,但我找不到任何文档,也找不到任何示例。有人能给我指一下这方面的文档吗?

出于好奇,我检查了
AppGenerateException
并使其正常工作。我得到了他的一些帮助

我仍然认为这不是实现您所需的最佳方式,但它可能会奏效。

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

添加以下库:

  • CmpApp
  • 系统除外
那么下面的代码似乎可以工作了。将
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

但是它没有被记录下来,所以我会小心的。

你能告诉我更多你想要完成的事情吗?也许有完全不同的方法来解决您的任务。@Sergey Romanov,正如我所说,在CODESYS中,我们有
\uuuu TRY
\uu CATCH
\uu FINALLY
来捕获标准函数抛出的
异常。我怎么能这样做呢。如果可能的话,我可以定义自定义异常并使用它们吗?codesys中的try、catch等用于检测系统异常,比如除以零等等。我同意Sergey的观点,有数百万种其他的方法可以达到这个目的,可能更好。我补充了一个答案。但我仍然认为Sergey是对的。@Guiorgy尝试将类似C语言的编程模式、风格和方法应用于ST是绝对不正确的。这就像你给我一瓶酒,我会问把手在哪里,并进行论证,因为我来自使用cup的背景。用不同的语言,不同的任务有不同的解决方法。正如我所说的,告诉你想做什么,也许有一种优雅的方法可以做到这一点,而不是试图使用这种语言所没有的技术手段。@Quizon,谢谢你的回答,我会尽快尝试。可以肯定的是,关于不能与x64一起使用的try-catch,是否有文档记录?如果你不介意的话,当你说有更好的方法时,你能给我一些建议吗?没有必要去深入,只是一些进一步阅读的链接将不胜感激!实际上,我找不到Codesys的任何文档。对于TwinCAT来说,它是,而且它已经提出了要求。当我尝试使用它时,会收到类似的错误消息。不使用此选项的最大原因是,如果您忘记捕捉错误,PLC将立即停止。这在世界上是非常有害的。另外,它的支持似乎相当糟糕。另外,我会使用函数块的方法、输出或属性,比如
IsError
GetError
,来获取错误信息。功能块错误输出在PLC编码中非常常用,因此其他程序员会立即知道发生了什么。但是如果你想使用TRY..CATCH,我会创建一个像
Throw
这样的函数,它会发挥神奇的作用,并使用你自己在某处定义的错误代码。谢谢你的回复。我不打算在运行时使用异常(至少现在是这样),我的主要场景是这样的:假设我有一个函数将枚举数作为输入,但在这种情况下,我只接受它的部分值作为有效值。我希望通过抛出一个异常来阻止使用我的函数的人传递这样的值,该异常将停止他们的运行并在日志中显示错误。理想情况下,我希望传递带有异常/错误的消息,但不确定这是否可行?在这种情况下,你会考虑抛出一个很好的解决方案吗?如果你自己使用它,或者你把它记录得很好,它可以是好的。但是想象一个场景,有人使用你的区块,但不知道。有一台机器正在运行,PLC将错误的值传递给该块,然后引发异常。但是用户不知道异常,因此没有try..catch,PLC将和机器一样停止。这可能是非常糟糕的情况。也许更好的解决方案是类似于
有效的
命名输出的东西,如果计算正常并且可以使用返回值,这将是真的?
AppGenerateException(pApp:=_pApp,   ulException:=MY_PRIVATE_EXCEPTION);