TwinCAT中使用EXTENDS扩展FB时如何调用基类FB的原有执行代码
TwinCAT 继承FB后基类逻辑无响应的修复方法
问题原因
很多刚接触TwinCAT面向对象编程的开发者都会踩这个坑:
- 通过
EXTENDS实现的FB继承,仅完成结构层面的成员复用,也就是子类会自动包含基类的输入、输出、内部变量、方法定义,但不会自动将子类的执行流程传导到基类的主代码块。 - 官方InfoSys中关于继承的文档条目,大多围绕独立METHOD的重写、调用规则展开,没有明确说明FB主体逻辑的执行特性,很容易产生“子类被调用就会自动跑完基类所有代码”的误解。
- 回到示例场景:你在调用
FB_Test时传入的bInTest虽然会写入到继承结构对应的内存地址,但因为FB_Test的代码块从未触发过FB_Basis的主逻辑,FB_Basis里写的nOutTest累加判断根本不会被执行,自然达不到计数效果。
修复步骤
只需要在扩展FB的代码块内,通过TwinCAT内置的SUPER^关键字,显式调用内部隐式嵌套的基类实例,就能触发基类的原有逻辑:
- 修改
FB_Test的内部实现,加入基类调用语句:FUNCTION_BLOCK FB_Test EXTENDS FB_Basis VAR_INPUT bInTest2 : BOOL; END_VAR VAR_OUTPUT nOutTest2 : INT; END_VAR // 显式触发基类主逻辑,将继承得到的基类入参透传过去 SUPER^( bInTest := bInTest ); // 保留子类自身的扩展逻辑 IF bInTest2 THEN nOutTest2 := nOutTest2 + 1; END_IF - 调用层的代码不需要做任何调整,直接按原有方式传入基类、子类的参数即可:
FB_Test( bInTest := TRUE, nOutTest => nBaseCount, bInTest2 := FALSE, nOutTest2 => nChildCount );
避坑提醒
SUPER^的调用位置可以灵活调整:需要基类逻辑优先执行就把语句放代码块最开头,需要先处理子类逻辑再触发基类流程,就把调用语句放在子类逻辑之后。- 生命周期类的特殊方法不需要手动调用:
FB_Init(构造)、FB_Exit(析构)、FB_Reinit(重初始化)这类和实例生命周期绑定的方法,TwinCAT会自动沿继承链路逐层执行,必须手动触发的只有FB主代码块中的普通逻辑。 - 不要把
EXTENDS和接口IMPLEMENTS搞混:接口只定义方法签名规范,不带任何可执行代码;EXTENDS会复用基类的全部内存结构,但所有普通可执行逻辑都需要显式调用才能运行。
内容的提问来源于stack exchange,提问作者Snake56Snake
相关产品推荐
相关产品推荐

