您不能以这种方式访问数组字段。
还有其他几种方法可以在结构化文本中实现您想要的:
- 由于您的属性是公开的,因此没有理由不将 IObserver 数组声明为功能块的输入字段。如果你这样做,你可以按照你想要的方式访问它。
声明部分:
FUNCTION_BLOCK CommandHandler
VAR_INPUT
IObservers : ARRAY[0..19] OF IObserver;
END_VAR
示例调用:
fbCommandHandler.IObservers[i].update();
- 另一种方法是您从更新方法内部访问(和修改等)您的 IObserver:
使用更新方法创建一个新的接口 IObserverArray:
METHOD update : BOOL
VAR_INPUT
index : INT;
cmd : INT;
END_VAR
创建一个实现 IObserverArray itf 的新功能块:
FUNCTION_BLOCK ObserverArray IMPLEMENTS IObserverArray
//declaration part of the update method
METHOD update : BOOL
VAR_INPUT
index : INT;
cmd : INT;
END_VAR
VAR
itfObservers : ARRAY [0..19] OF IObserver;
END_VAR
//imlementation part of the update method
itfObservers[index].update(cmd);
在返回 IObserverArray 的 CommandHandler 功能块中创建方法 getObservers():
METHOD getObservers : IObserverArray
//imlementation part of the getObservers method
getObservers := aObservers;
现在您只需aObservers : ObserverArray;
在 CommandHandler 中声明为 VAR 并像这样调用它:fbCommandHandler.getObservers().update(5,12);