0

我正在尝试使用结构化文本在 CoDeSys 中实现观察者设计模式。我遇到了一个错误,我不能调用., [], 也不能调用[..]接口属性。是否可以有一个接口属性是一个数组?有问题的接口属性如下:

PROPERTY observers : ARRAY[0..20] OF IObserver

接口结构遵循观察者模式,如下所示。

在此处输入图像描述

notifyAllObservers方法的实现如下。

METHOD notifyAllObservers
VAR 
   i : INT;
END_VAR

FOR i := 0 TO 20 DO
  CommandHandler.observers[i].update(CommandHandler.commands);
END_FOR

在此处输入图像描述 在此处输入图像描述

4

3 回答 3

0

不能以这种方式访问​​数组字段。

还有其他几种方法可以在结构化文本中实现您想要的:

  1. 由于您的属性是公开的,因此没有理由不将 IObserver 数组声明为功能块的输入字段。如果你这样做,你可以按照你想要的方式访问它。

声明部分:

FUNCTION_BLOCK CommandHandler
VAR_INPUT
    IObservers : ARRAY[0..19] OF IObserver;
END_VAR

示例调用:

fbCommandHandler.IObservers[i].update();

  1. 另一种方法是您从更新方法内部访问(和修改等)您的 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);

于 2020-06-19T11:07:01.133 回答
0

我认为您的 CommandHandler.observers[i] 的问题在于您没有任何实现 IObserver 的实例。您不能以您的方式访问您的观察者属性,因为它不是对象。

如果删除observers 属性,定义一个实现IObserver 的observer FB,然后在CommandHandler 中添加一个observer (FB) 数组,您的notifyAllObservers 代码将起作用。

于 2020-06-19T08:26:26.747 回答
0

https://help.codesys.com/api-content/2/codesys/3.5.12.0/en/_cds_operator_new/

_new(8,nLength +1)
Make a list with memcpy(new,old)
__DELETE(old);

像这样的东西应该工作!

于 2021-03-01T22:17:59.487 回答