CODESYS V3中能否创建、存储并调用方法指针实现回调?
能否在CODESYS V3中创建、存储并调用方法指针?
本问题聚焦于方法指针的实现,关联旧帖但因发布已超5年,想确认是否有新解决方案。
假设存在FB/类Alarm,需要向Alarm.ActivateCallback注入回调,在Alarm.Activate()触发时执行;PLC_PRG实例化Alarm后,希望注入PRG.OnAlarm1Activated()作为回调(该方法仅将PRG的布尔变量设为TRUE)。以下是原错误代码,可体现需求逻辑:
FB Alarm
FUNCTION_BLOCK Alarm VAR_INPUT ActivateCallback : POINTER TO CallbackDelegate; END_VAR
Alarm.Activate()方法
IF (ActivateCallback <> 0) THEN ActivateCallback^(); END_IF;
PLC_PRG程序
PROGRAM PLC_PRG VAR _init : BOOL := TRUE; _activate : BOOL := FALSE; _alarm1 : Alarm; _alarm1Activated : BOOL; END_VAR
IF (_init) THEN _alarm1.ActivateCallback :=ADR(OnAlarm1Activated); _init := FALSE; END_IF IF (_activate) THEN _alarm1.Activate(); END_IF
PLC_PRG.OnAlarm1Activated()方法
Alarm1Activated := TRUE;
运行错误
运行上述代码会触发以下错误:
- 'CallbackDelegate'是FUNCTION类型,无法实例化
- 无法对'OnAlarm1Activated'执行'Adr'操作
能否修改上述代码实现预期功能?已知可使用接口注入作为替代方案,但想确认上述方法指针的方式是否可行。
CODESYS帮助文档明确说明:CODESYS不支持在编程系统的应用中调用函数指针!
接口注入替代方案(CODESYS伪代码)
TYPE AlarmEvent : ( Activated, Cleared ); END_TYPE FUNCTION_BLOCK Alarm VAR AlarmHandler : REFERENCE TO IAlarmEventHandler; END_VAR METHOD Activate IF AlarmHandler.Valid THEN AlarmHandler.HandleAlarmEvent(THIS^, AlarmEvent.Activated); END_IF; END_METHOD INTERFACE IAlarmEventHandler METHOD HandleAlarmEvent VAR_INPUT alarm : Alarm; event : AlarmEvent; END_VAR END_METHOD END_INTERFACE FUNCTION_BLOCK PLC_PRG IMPLEMENTS IAlarmEventHandler VAR Alarm1 : Alarm; _alarm1Activated : BOOL; END_VAR METHOD FB_Init VAR_INPUT bInitRetains : BOOL; bInCopyCode : BOOL; END_VAR Alarm1.AlarmHandler := THIS^; END_METHOD METHOD HandleAlarmEvent VAR_INPUT alarm : Alarm; event : AlarmEvent; END_VAR IF (alarm = Alarm1) AND (event = AlarmEvent.Activated) THEN _alarm1Activated := TRUE; END_IF; END_METHOD
内容的提问来源于stack exchange,提问作者Cédric Moers
相关产品推荐
相关产品推荐

