plc - 铸造功能块
问题描述
我正在使用 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。有没有办法投射功能块?
解决方案
首先,aninterface
已经是reference
功能块的 a:
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();
至少这是我为解决这个问题所做的
推荐阅读
- bash - 有没有办法枚举所有内部 docker 接口?
- python - 如何使用 SIP 制作两个或多个 C++/Qt 类的 python 模块?
- json - React JS - 我很难在我的项目的选择框中从 API 获取 JSON 信息
- circuit-sdk - 如何通过智能手机应用与来宾 Circuit 用户合作?
- recursion - 不断收到“需要对象”错误。尝试了一段时间的故障排除无济于事。
- sql - 找出两行之间的差异
- php - 当这些卡片保存从 mysql 数据库中获取的数据时,我如何才能连续排列具体化 css 卡片
- resharper - R# 参数提示,如何关闭它?
- node.js - npm start 命令给出 ELIFECYCLE 错误,errno 1
- django - Django外键字段过滤问题