Функциональный блок литья

Я использую Wago PFC200 для домашней автоматизации. Я получил базовый функциональный блок:

FUNCTION_BLOCK ABSTRACT Room

и два интерфейса:

INTERFACE IBlinds
- BlindsUp
- BlindsDown 

а также

ILights
-TurnOffLights
-TurnOnLights

Экземпляры моей комнаты выглядят так:

FUNCTION_BLOCK Garage EXTENDS Room IMPLEMENTS ILights, IBlinds

В моем PLC_PRG есть все экземпляры моих комнат:

PROGRAM PLC_PRG
VAR
    Bedroom: Bedroom;
    Garage: Garage; 
    Hall: Hall;
    Boilerroom: Boilerroom;
    ...
END_VAR

В PLC_PRG у меня есть несколько методов, например: автоматизировать блиды:

METHOD MoveBlindsToMorningPosition
VAR CONSTANT
    siCount: SINT := 5;
END_VAR
VAR_INPUT
    xMoveSignal: BOOL;
END_VAR
VAR
    _siIndex: SINT;
    _rooms: ARRAY[0..siCount] OF POINTER TO IBlinds := [ADR(Livingroom), ADR(Diningroom), ADR(Kitchen), ADR(Toilet), ADR(Boilerroom), ADR(Garage)];
END_VAR

FOR _siIndex := 0 TO siCount DO
    _rooms[_siIndex]^.MoveBlindsToMorningPosition(xMove := xMoveSignal);
END_FOR

Но я получил следующие ошибки компиляции в массиве _rooms: C0032: Cannot convert type 'POINTER TO Garage' to type 'POINTER TO IBlinds'

Мои функциональные блоки фактически реализуют IBlinds. Есть ли способ приведения функционального блока?


person Dawid Rutkowski    schedule 26.04.2021    source источник


Ответы (1)


Прежде всего, interface уже является reference для функционального блока:

CODESYS всегда обрабатывает переменные, объявленные с типом интерфейса, как ссылки.

Так что не должно быть необходимости использовать pointers.

Во-вторых, чтобы преобразовать функциональный блок в интерфейс, лично я бы рекомендовал использовать специальный метод внутри функционального блока. Например:

INTERFACE inter1
- ...
- ToInter1
INTERFACE inter2
- ...
- ToInter2

и реализовать их внутри MyObject, например:

ToInter1 := THIS^;
ToInter2 := THIS^;

И тогда вы можете:

myObj: MyObject;
i1: inter1 := myObj.ToInter1();
i2: inter2 := myObj.ToInter2();

Or

arr: ARRAY[x..y] OF inter1;
arr[z] := myObj.ToInter1();

По крайней мере, это то, что я делаю, чтобы решить эту проблему

person Guiorgy    schedule 26.04.2021
comment
Спасибо! Я не знал, что CODESYS всегда обрабатывает переменные, объявленные с типом интерфейса, как ссылки. - person Dawid Rutkowski; 26.04.2021
comment
Был на вашем месте некоторое время назад. документация codesys — ваш друг в такие времена; ) - person Guiorgy; 26.04.2021
comment
Я программирую 15 лет, но только начинаю программировать ПЛК :) Я автоматизирую свой дом с помощью PFC200. У вас есть опыт работы с библиотекой OSCAT Building? - person Dawid Rutkowski; 27.04.2021
comment
Кажется, я нашел еще один вариант - использование __QUERYINTERFACE. help.codesys.com/webapp/ - person Dawid Rutkowski; 27.04.2021
comment
К сожалению, нет, у меня нет опыта работы с OSCAT Building, так как я работаю в области автоматизации промышленных водоочистных сооружений. Кроме того, мы рассмотрели OSCAT basic, но в итоге решили написать собственные библиотеки для всего, что нам нужно. Что касается __QUERYINTERFACE, то это "type conversion of an interface reference into another type", я не думаю, что это то, что вы искали. И если у вас нет сотен интерфейсов, imo, имеющий специальный метод для преобразования, легче читать и отлаживать. - person Guiorgy; 27.04.2021