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

Codesys v3.5轴对象存入数组后调用MC_Power失效问题咨询

CODESYS轴上电异常问题咨询

环境

Codesys v3.5 sp20+(32bit)

初始正常场景

通过以下代码实现指定轴上电,运行正常。代码由任务每4毫秒循环调用:

PROGRAM PowerupTest
VAR
    MC_Power_0: MC_Power;
    Axises:ARRAY[0..5] OF SM3_Drive_ETC_DS402_CyclicSync.AXIS_REF_ETC_DS402_CS;
END_VAR
MC_Power_0(
    Axis:=Axis0, 
    Enable:=1 , 
    bRegulatorOn:=1 , 
    bDriveStart:=1 , 
    Status=> ,
    bRegulatorRealState=> , 
    bDriveStartRealState=> , 
    Busy=> , 
    Error=> , 
    ErrorID=> 
);

修改后异常场景

将Axis0存入数组,再把数组元素传入MC_Power函数块,功能无法正常运行:

Axises[0]:=Axis0;

MC_Power_0(
    Axis:=Axises[0],   // 此处修改
    Enable:=1 , 
    bRegulatorOn:=1 , 
    bDriveStart:=1 , 
    Status=> ,
    bRegulatorRealState=> , 
    bDriveStartRealState=> , 
    Busy=> , 
    Error=> , 
    ErrorID=> 
);

优化尝试仍无效

调整初始化逻辑,仅在首次循环时赋值数组,但问题依旧:

PROGRAM PowerupTest
VAR
    MC_Power_0: MC_Power;
    Axises:ARRAY[0..5] OF SM3_Drive_ETC_DS402_CyclicSync.AXIS_REF_ETC_DS402_CS;
    IsInitialized:BOOL:=false;
END_VAR
IF NOT IsInitialized THEN
    Axises[0]:=Axis0;
    IsInitialized:=TRUE;
    RETURN;
END_IF

MC_Power_0(
    Axis:=Axises[0], 
    Enable:=1 , 
    bRegulatorOn:=1 , 
    bDriveStart:=1 , 
    Status=> ,
    bRegulatorRealState=> , 
    bDriveStartRealState=> , 
    Busy=> , 
    Error=> GVL.LastError, 
    ErrorID=> GVL.LastErrorId
);

需要排查问题原因,目标是通过数组方式统一访问所有轴。


问题原因分析及解决方案

核心原因

CODESYS中AXIS_REF_ETC_DS402_CS这类轴引用类型本质是引用(Reference)而非值类型。直接赋值数组时,实际是复制了引用的副本,但部分驱动的轴引用需要保持与原轴实例的绑定关系,数组存储的副本无法正确关联驱动底层的轴上下文。

另外,部分CODESYS驱动的轴引用要求必须是全局或持久化的直接引用,通过数组传递时会破坏函数块与轴实例的绑定逻辑,导致MC_Power无法正确发送指令到目标轴。

解决方案

  1. 使用指针数组替代值数组
    定义指针类型的数组存储轴引用,确保传递的是原轴实例的地址:

    PROGRAM PowerupTest
    VAR
        MC_Power_0: MC_Power;
        Axises:ARRAY[0..5] OF POINTER TO SM3_Drive_ETC_DS402_CyclicSync.AXIS_REF_ETC_DS402_CS;
        IsInitialized:BOOL:=false;
    END_VAR
    
    IF NOT IsInitialized THEN
        Axises[0]:=ADR(Axis0); // 存储轴的地址
        IsInitialized:=TRUE;
        RETURN;
    END_IF
    
    MC_Power_0(
        Axis:=Axises[0]^, // 通过指针访问原轴实例
        Enable:=1 , 
        bRegulatorOn:=1 , 
        bDriveStart:=1 , 
        Status=> ,
        bRegulatorRealState=> , 
        bDriveStartRealState=> , 
        Busy=> , 
        Error=> GVL.LastError, 
        ErrorID=> GVL.LastErrorId
    );
    
  2. 使用轴引用的数组绑定配置
    部分驱动支持在设备配置中直接创建轴引用数组,而非在程序中手动赋值。可以在CODESYS设备树中找到对应驱动,添加轴引用数组并关联到实际轴,这样程序中直接使用配置好的数组即可。

  3. 检查驱动兼容性
    确认SM3_Drive_ETC_DS402_CyclicSync驱动版本是否支持数组传递轴引用,部分旧版本驱动存在此类限制,升级到最新兼容版本可能解决问题。


内容的提问来源于stack exchange,提问作者xiejiang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 11:50:20