TwinCAT功能块输入变量属性访问报错,求可行解决方案
问题描述
我有一个映射到硬件输出地址的功能块变量:
bEL1852OutputBools AT %Q* : ARRAY[1..8] OF BOOL;
我希望创建属性来实现对bEL1852OutputBools的读写访问,以便执行如下操作:
fbEL1852.Outputs[1] := TRUE;
最初尝试普通属性没成功,后来通过REFERENCE类型的属性实现了输出变量的读写:
PROPERTY PUBLIC Outputs : REFERENCE TO ARRAY[1..8] OF BOOL;
对应的GET方法:
Outputs REF= bEL1852OutputBools;
SET方法:
bEL1852OutputBools = Outputs;
但对输入变量用同样方法时,编译器报错:Reference assign is not possible on a variable mapped to an input address,报错代码行:
Inputs REF= bEL1852InputBools;
请问有没有办法通过属性实现输入变量的访问?
解决方案
输入地址映射的变量(%I*)本质是只读的,PLC运行时硬件输入状态由外部设备决定,程序只能读不能改,所以没法像输出变量那样用REFERENCE类型属性——引用要求目标变量是可赋值的左值,而输入映射变量不满足这个条件。
你可以用下面两种方式实现输入变量的属性访问:
1. 普通只读属性(只实现GET方法)
直接在属性的GET方法里返回输入数组的内容,因为输入只需要读取:
// 先定义输入数组 bEL1852InputBools AT %I* : ARRAY[1..8] OF BOOL; // 定义只读属性 PROPERTY PUBLIC Inputs : ARRAY[1..8] OF BOOL; // GET方法实现 METHOD GET : ARRAY[1..8] OF BOOL GET := bEL1852InputBools; END_METHOD
访问方式:
// 读取输入值 VAR bInputValue : BOOL; END_VAR bInputValue := fbEL1852.Inputs[1];
2. 带索引的单元素属性(更灵活)
如果不需要一次性访问整个数组,可以定义带索引参数的属性,直接返回对应位置的输入值:
PROPERTY PUBLIC Input : BOOL; VAR_INPUT nIndex : INT := 1; // 默认索引为1 END_VAR // GET方法实现 METHOD GET : BOOL IF nIndex >= 1 AND nIndex <= 8 THEN GET := bEL1852InputBools[nIndex]; ELSE // 处理索引越界,比如返回FALSE或者触发错误 GET := FALSE; END_IF END_METHOD
访问方式:
bInputValue := fbEL1852.Input(nIndex := 3);
注意点
- 输入映射变量(
%I*)不支持写入,所以属性不需要实现SET方法,强行写SET方法会编译或运行报错。 - 要是你的PLC支持,也可以把输入变量的值复制到一个内部可写数组,再通过引用属性访问这个内部数组,但这会产生数据副本,没法实时反映硬件输入的最新状态(得定时同步),一般不推荐这么做。
内容的提问来源于stack exchange,提问作者Arkadiusz Rycyk
相关产品推荐
相关产品推荐

