微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

铸造功能块

如何解决铸造功能块

我的家庭自动化使用 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 下,我有一些方法,例如:自动化 blids:

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。有没有办法强制转换功能块?

解决方法

首先,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();

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

至少这是我解决这个问题的方法

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?