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无法正确发送指令到目标轴。
解决方案
使用指针数组替代值数组
定义指针类型的数组存储轴引用,确保传递的是原轴实例的地址: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_VARIF 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 );使用轴引用的数组绑定配置
部分驱动支持在设备配置中直接创建轴引用数组,而非在程序中手动赋值。可以在CODESYS设备树中找到对应驱动,添加轴引用数组并关联到实际轴,这样程序中直接使用配置好的数组即可。检查驱动兼容性
确认SM3_Drive_ETC_DS402_CyclicSync驱动版本是否支持数组传递轴引用,部分旧版本驱动存在此类限制,升级到最新兼容版本可能解决问题。
内容的提问来源于stack exchange,提问作者xiejiang
相关产品推荐
相关产品推荐

