You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 04:53:27