Массив как тип для свойства интерфейса CoDeSys - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь реализовать шаблон проектирования Observer в CoDeSys, используя структурированный текст. Я столкнулся с ошибкой, когда не могу вызвать ., [] или [..] в свойстве интерфейса. Возможно ли иметь свойство интерфейса в виде массива? Рассматриваемое свойство интерфейса следующее:

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

И структура интерфейса следует шаблону наблюдателя, как показано ниже.

enter image description here

Метод notifyAllObservers реализуется следующим образом.

METHOD notifyAllObservers
VAR 
   i : INT;
END_VAR

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

enter image description here enter image description here

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Вы не можете получить доступ к полям массива таким образом.

Есть несколько других способов добиться желаемого в структурированном тексте:

  1. Поскольку ваше свойство publi c, нет причин не объявлять массив IObserver в качестве поля ввода функционального блока. Если вы это сделаете, вы можете получить к нему доступ так, как вам нужно.

Часть декларации:

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

Пример вызова:

fbCommandHandler.IObservers[i].update();

Другой способ - получить доступ (и изменить, и т. Д. c ..) к вашим IObservers изнутри метода обновления:

Создайте новый интерфейс 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);

Создайте метод getObservers () в функциональном блоке CommandHandler, который возвращает IObserverArray:

METHOD getObservers : IObserverArray

//imlementation part of the getObservers method
getObservers := aObservers;

Теперь вы просто объявляете aObservers : ObserverArray; в своем CommandHandler как VAR и называете его так: fbCommandHandler.getObservers().update(5,12);

0 голосов
/ 19 июня 2020

Я думаю, проблема с вашим CommandHandler.observers [i] заключается в том, что у вас нет никаких экземпляров чего-либо, реализующего IObserver. Вы не можете получить доступ к своему свойству наблюдателей так, как это делаете, поскольку это не объект.

Если вы удалите свойство наблюдателей, определите FB наблюдателя, реализующий IObserver, а затем добавьте массив наблюдателя (FB) внутри CommandHandler вашего Код notifyAllObservers будет работать.

...