You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:15:42