TwinCAT中能否创建通用GetTaskInfo方法?遇_TaskInfo引用问题
问题分析与解决方案
核心结论
无法通过库实现这种通用的任务信息获取逻辑,必须在目标PLC项目内显式处理相关逻辑。
原因说明
你提到的PlcTaskSystemInfo类型和_TaskInfo数组是TwinCAT为每个PLC项目单独生成的项目专属元素,不属于公共系统库(如Tc2_System)的范畴:
- 这些元素的编译上下文完全绑定到生成它们的具体项目;
- 库文件无法跨项目引用其他项目的自动生成符号,因此当库导入新项目时,编译器找不到
_TaskInfo的定义,导致报错; - 你在库内测试正常是因为测试环境和库处于同一个项目上下文,能直接访问当前项目的
_TaskInfo。
可行解决方案
方案1:外部注入任务信息
将抽象函数块改为需要外部传入任务信息的模式,由项目主动提供_TaskInfo的实例:
FUNCTION_BLOCK ABSTRACT FB_HasTaskInfo VAR PROTECTED _PlcTaskInfo : PlcTaskSystemInfo; END_VAR VAR PUBLIC {attribute 'monitoring':='call'} TaskInfo : REFERENCE TO PlcTaskSystemInfo GET; END_VAR METHOD PROTECTED TaskInfo_GET : REFERENCE TO PlcTaskSystemInfo TaskInfo_GET := _PlcTaskInfo; END_METHOD METHOD PUBLIC SetTaskInfo VAR_INPUT taskInfo : PlcTaskSystemInfo; END_VAR _PlcTaskInfo := taskInfo; END_METHOD
项目内使用时,在初始化逻辑中注入任务信息:
// 假设FB_Inheritor是继承自FB_HasTaskInfo的函数块 fbInheritorInstance.SetTaskInfo(_TaskInfo[Tc2_System.GETCURTASKINDEXEX()]);
方案2:抽象方法由子类实现
在抽象函数块中定义获取任务信息的抽象方法,由项目内的子类负责实现具体的_TaskInfo访问逻辑:
FUNCTION_BLOCK ABSTRACT FB_HasTaskInfo VAR PROTECTED _PlcTaskInfo : PlcTaskSystemInfo; END_VAR VAR PUBLIC {attribute 'monitoring':='call'} TaskInfo : REFERENCE TO PlcTaskSystemInfo GET; END_VAR METHOD PROTECTED TaskInfo_GET : REFERENCE TO PlcTaskSystemInfo IF _PlcTaskInfo.CycleTime = 0 THEN _PlcTaskInfo := GetTaskInfoImpl(); END_IF TaskInfo_GET := _PlcTaskInfo; END_METHOD METHOD ABSTRACT PROTECTED GetTaskInfoImpl : PlcTaskSystemInfo // 由子类实现项目内的任务信息获取逻辑 END_METHOD
子类实现示例:
FUNCTION_BLOCK FB_Inheritor EXTENDS FB_HasTaskInfo METHOD PROTECTED OVERRIDE GetTaskInfoImpl : PlcTaskSystemInfo VAR taskIndex : DINT; END_VAR taskIndex := Tc2_System.GETCURTASKINDEXEX(); IF taskIndex <> 0 THEN GetTaskInfoImpl := _TaskInfo[taskIndex]; END_IF END_METHOD
内容的提问来源于stack exchange,提问作者ziga
相关产品推荐
相关产品推荐

