TC3: Multiple Instance of FB_TcAlarm Issue



我是使用Tc3EventLogger功能的新手。我已经在类型系统中创建了EventClasses。我已经成功地创建并引发了基于EventClass使用CreateEx, iarguments, Raise等不同的警报的单个实例。

问题:我的问题是,我有多件设备需要提出相同的报警类型,但我通过提供参数将它们与操作员(HMI EventGrid)区分开来。

我的方法是创建FB_TcAlarm的数组,并在循环中迭代它们到CreateEx,通过HRESULT验证创建,修改数组中每个FB_TcAlarm实例的参数,然后在处理条件应该触发警报时单独提出它们。

// Bank Global Pressure Limit Alarms
FOR nLoopCtr := 1 TO nNumBanks BY 1 DO 
arrFbBankPressHresult[nLoopCtr] := arrFbBankPressAlm[nLoopCtr].CreateEx(TC_Events.BankPressureAlarm.Trigger, FALSE, 0);
END_FOR

然而,当我这样做时,只创建一个警报实例(由一个具有HRESULT = S_OK的索引验证),而数组中剩余的FB_TcAlarm对象具有HRESULT = 16#B7,即"ERROR_ALREADY_EXISTS"。此外,当我检查数组中创建的告警实例的TcSourceInfo.nId时,它们都是相同的。

我已经通读了倍福手册TC3事件记录器。

任何反馈为什么会发生这种情况,或者我对EventClass或FB_TcAlarm的理解是不正确的,我将非常感谢。

谢谢。亚当

一段时间以前,我做了一个解决方案,以便您可以多次使用相同的TcEventEntry

创建Alarm实例时,必须确保tcEventEntry。nEventId是独一无二的!

您可以在创建实例之前设置该属性,只需添加1就足够了。

的例子:

// Set the event text from tmc file
tcEventEntry := TC_Events.TcGeneralAdsEventClass.AddHash;
// Set event id to 1
tcEventEntry.nEventId := 1;
// Create instance 1 of event text 'AddHash'
nResult := fbTcAlarm[1].CreateEx( tcEventEntry, TRUE, _ipSourceInfo )
// Set event id to 2
tcEventEntry.nEventId := 2;
// Create instance 2 of event text 'AddHash'
nResult := fbTcAlarm[2].CreateEx( tcEventEntry, TRUE, _ipSourceInfo )

在你的例子中:

声明:

VAR
tcEventEntry := TC_Events.BankPressureAlarm.Trigger;
END_VAR
代码:

// Bank Global Pressure Limit Alarms
FOR nLoopCtr := 1 TO nNumBanks BY 1 DO 
tcEventEntry.nEventId := nLoopCtr;
arrFbBankPressHresult[nLoopCtr] := arrFbBankPressAlm[nLoopCtr].CreateEx(tcEventEntry, FALSE, 0);
END_FOR

现在当你触发你的事件时,你应该在TcHmiEventGrid

中单独看到它们

您的问题似乎与在多个警报实例中使用相同的TcEventEntry(Tc_Events.BankPressureAlarm.Trigger)有关。

我的理解是,每个Alarm, Message(任何扩展TcEventBase的东西)必须注册回一个单独的EventEntry。'Create'似乎把这个EventEntry生成作为方法的一部分捆绑在一起,而'CreateEx'把这个负担加在你身上。

失败的代码Result2, Result3返回16#B7.

AdsErr_TO_TcEventEntry( ErrCode, Event1 );
Result1 := Alarm1.CreateEx( Event1, FALSE, 0 );
Result2 := Alarm2.CreateEx( Event1, FALSE, 0 );
Result3 := Alarm3.CreateEx( Event1, FALSE, 0 );

所有告警返回S_OK

AdsErr_TO_TcEventEntry( ErrCode, Event1 );
AdsErr_TO_TcEventEntry( ErrCode, Event2 );
AdsErr_TO_TcEventEntry( ErrCode, Event3 );
Result1 := Alarm1.CreateEx( Event1, FALSE, 0 );
Result2 := Alarm2.CreateEx( Event2, FALSE, 0 );
Result3 := Alarm3.CreateEx( Event3, FALSE, 0 );

最新更新