TwinCat3 如何在 OOP 中有效地设置 EventLogger?
TwinCat3 how to efficiently setup the EventLogger in an OOP?
我对 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, TRUE, 0);
aAlarms[2].CreateEx(Error3, TRUE, 0);
aAlarms[3].CreateEx(Error4, TRUE, 0);
aAlarms[4].CreateEx(, TRUE, 0);
aAlarms[5].CreateEx(, TRUE, 0);
aAlarms[6].CreateEx(, TRUE, 0);
不过有几点我不喜欢:
- 事件源始终是 FB_FaultHandler 但我希望它显示相关的 FB
- 我不确定如何从不同的实例发出警报两次。例如:fbTemp1 和 fbTemp 2 都是 FB_TemperatureController 的实例。现在,如果我在 FB_FaultHandler 中创建一个“SetFault”方法,它会引发并确认警报,它会在我不知道来源的情况下引发两次相同的错误。
METHOD setError
VAR_INPUT
nErrorId: INT;
bErrorActive: BOOL;
END_VAR
- 我更愿意使用事件的 ID 来设置数组。所以“Error_Overtemp”的 ID 为 96,
FB_FaultHandler
会将其放入 aAlarms[96]
我还没有真正在任何地方找到任何关于这个的真实样本。我观看了网络研讨会,但老实说,它的描述非常糟糕。如果您提供任何帮助、输入或优秀事件记录器的示例,我将不胜感激。
在互联网的帮助下,我的脑海里浮现出一些想法。手边没有编译系统。但是你可以像下面的代码那样做。
基本有一个用于记录的基础class(您的FB_FaultHandler)。所有具有日志记录功能的 classes 都可以从中派生出来。它对实例路径使用反射。我从来没有在 twincat 中使用过反射,因为我通常会以不同的方式解决这类问题。但这是我猜想的最通用的解决方案。
最后一个 class 的例子是 FB_MyClassesWithLoggingFunctionality.
在 MAIN 中还有一个用于初始化代码的小存根。您必须初始化并触发 Info Class FB_SourceInfo 的设置。它在 FB_SourceInfo 中设置实例信息。那是一个class,你可以交给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
我建议查看属性“instance-path”的文档。这应该告诉您功能块的哪个实例是源(电机 1 或电机 2)。您会在那里找到源代码示例。
https://infosys.beckhoff.com/content/1033/tc3_plc_intro/3108100107.html?id=5092968876405062789
我对 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, TRUE, 0);
aAlarms[2].CreateEx(Error3, TRUE, 0);
aAlarms[3].CreateEx(Error4, TRUE, 0);
aAlarms[4].CreateEx(, TRUE, 0);
aAlarms[5].CreateEx(, TRUE, 0);
aAlarms[6].CreateEx(, TRUE, 0);
不过有几点我不喜欢:
- 事件源始终是 FB_FaultHandler 但我希望它显示相关的 FB
- 我不确定如何从不同的实例发出警报两次。例如:fbTemp1 和 fbTemp 2 都是 FB_TemperatureController 的实例。现在,如果我在 FB_FaultHandler 中创建一个“SetFault”方法,它会引发并确认警报,它会在我不知道来源的情况下引发两次相同的错误。
METHOD setError
VAR_INPUT
nErrorId: INT;
bErrorActive: BOOL;
END_VAR
- 我更愿意使用事件的 ID 来设置数组。所以“Error_Overtemp”的 ID 为 96,
FB_FaultHandler
会将其放入aAlarms[96]
我还没有真正在任何地方找到任何关于这个的真实样本。我观看了网络研讨会,但老实说,它的描述非常糟糕。如果您提供任何帮助、输入或优秀事件记录器的示例,我将不胜感激。
在互联网的帮助下,我的脑海里浮现出一些想法。手边没有编译系统。但是你可以像下面的代码那样做。
基本有一个用于记录的基础class(您的FB_FaultHandler)。所有具有日志记录功能的 classes 都可以从中派生出来。它对实例路径使用反射。我从来没有在 twincat 中使用过反射,因为我通常会以不同的方式解决这类问题。但这是我猜想的最通用的解决方案。
最后一个 class 的例子是 FB_MyClassesWithLoggingFunctionality.
在 MAIN 中还有一个用于初始化代码的小存根。您必须初始化并触发 Info Class FB_SourceInfo 的设置。它在 FB_SourceInfo 中设置实例信息。那是一个class,你可以交给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
我建议查看属性“instance-path”的文档。这应该告诉您功能块的哪个实例是源(电机 1 或电机 2)。您会在那里找到源代码示例。
https://infosys.beckhoff.com/content/1033/tc3_plc_intro/3108100107.html?id=5092968876405062789