TwinCat3 如何在 OOP 中有效地设置 EventLogger?

问题描述

我对 OOP 和 TwinCat 还是很陌生,所以请耐心等待。我目前正在为将与 TF2000 HMI 结合使用的小型机器开发软件。因为事件网格带走了很多工作,所以我想设置 TC3 EventLogger。我了解您如何创建警报等,我可以在 HMI 事件网格中显示它们。

它适用于单个事件,但现在我想更进一步并添加每个功能块的错误。例如 FB_TemperatureController 可以报告过热,FB_Motor 可以报告停止错误等。

如何设置事件记录器,以便可以从每个实例化的 FB 发送相同的错误

我想创建一个 FB_FaultHandler:

FUNCTION_BLOCK FB_FaultHandler
VAR
    fbEventLogger       : FB_TcEventLogger;
    aMessages           : ARRAY [0..100] OF Fb_Tcmessage;
    aAlarms             : ARRAY [0..100] OF Fb_TcAlarm;
END_VAR

METHOD init
VAR_INPUT
END_VAR

aAlarms[0].CreateEx(Tc_Events.AlarmEvents.Error_Overtemp,TRUE,0);
aAlarms[1].CreateEx(Error2,0);
aAlarms[2].CreateEx(Error3,0);
aAlarms[3].CreateEx(Error4,0);
aAlarms[4].CreateEx(,0);
aAlarms[5].CreateEx(,0);
aAlarms[6].CreateEx(,0);

我不喜欢这件事的一些地方:

  1. 事件源始终是 FB_FaultHandler 但我希望它显示相关的 FB
  2. 我不知道如何从不同的实例两次发出警报。例如:fbTemp1 和 fbTemp 2 都是 FB_TemperatureController 的实例。现在,如果我在 FB_FaultHandler 中创建一个“SetFault”方法,它会引发并确认警报,它会在我不知道来源的情况下引发两次相同的错误
METHOD setError
VAR_INPUT
  nErrorId: INT;
  bErrorActive: BOOL;
END_VAR
  1. 我更喜欢用事件的 id 设置数组。因此,“Error_Overtemp”的 ID 为 96,FB_FaultHandler 会将其放入 aAlarms[96]

我还没有在任何地方找到任何真正的样本。我观看了网络研讨会,但老实说,它的描述非常糟糕。如果您能提供有关良好事件记录器的任何帮助、输入或示例,我将不胜感激。

解决方法

在互联网的帮助下,我的头顶上了。手头没有用于编译的系统。但是您可以执行以下类似代码的操作。

本质上有一个用于记录的基类(您的 FB_FaultHandler)。从这可以派生出所有具有日志功能的类。它对实例路径使用反射。我从来没有在 twincat 中使用过反射,因为我通常会以不同的方式解决此类问题。但我猜这是最通用的解决方案。
最后一个类的示例是 FB_MyClassesWithLoggingFunctionality。

MAIN 中还有一个用于初始化代码的小存根。您必须初始化并触发Info Class FB_SourceInfo 的设置。它在 FB_SourceInfo 中设置实例信息。这是一个可以移交给 CreateEx 方法的类,并且应该提供实例信息的来源。

在下面的 MAIN 示例中,源信息类似于 -project-.MAIN.fbClass

// -------------- Base class for all classes with logging
{attribute 'reflection'}
FUNCTION_BLOCK FB_FaultHandler
VAR
    {attribute 'instance-path'}
    {attribute 'noinit'}
    sErrorSource : STRING; // make sure that this variable is large enough to hold the path

    fbFaultInfo : FB_SourceInfo;

    fbEventLogger       : FB_TcEventLogger;
    aMessages           : ARRAY [0..100] OF Fb_TcMessage;
    aAlarms             : ARRAY [0..100] OF Fb_TcAlarm;
END_VAR


METHOD InitInfo
fbFaultInfo.InitInfo(sErrorSource);
// example: use faultInfo
aAlarms[0].CreateEx(Tc_Events.AlarmEvents.Error_Overtemp,TRUE,fbFaultInfo);
END_METHOD

METHOD logError
VAR_INPUT
    errorId : INT;
END_VAR
END_METHOD
   // Raise error
END_FUNCTION_BLOCK


// ------------ FB for source Info
FUNCTION_BLOCK FB_SourceInfo IMPLEMENTS I_TcSourceInfo 
VAR
    sSourceInfo : STRING
METHOD InitInfo
VAR_INPUT
    source : STRING
END_VAR
sSourceInfo := source;

END_METHOD


END_FUNCTION_BLOCK

// ------------------  Final class that has logging functions
FUNCTION_BLOCK FB_MyClassesWithLoggingFunctionality EXTENDS FB_FaultHandler

METHOD DoSomething
VAR_INPUT

END_VAR

IF bError then
    logError(id);
END_IF
END_METHOD


// Usage
PROGRAM MAIN
VAR
    fbClass : FB_MyClassesWithLoggingFunctionality;
    bInit : BOOL;
END_VAR
IF NOT bInit THEN
    fbClass.InitInfo();
    bInit := FALSE;
END_IF

END_PROGRAM