三菱GX Works 2中Q64AD模块输入信号平均值获取技术问询
在GX Works 2结构化文本中获取Q64AD输入平均值的解决方案
首先,你提到的问题核心是GX Works 2对数据类型的严格区分——三菱PLC里的Word[signed](带符号字)和标准INT虽然存储格式一致(都是16位带符号整数),但在ST语法中属于不同的类型,不能直接混用累加。下面给你几个可行的解决方案:
方案1:显式转换为INT类型累加
GX Works 2的ST支持类型转换函数,你可以用TO_INT()把Q64AD采集到的Word[signed]值转换成INT后再进行累加,完全兼容且不会丢失数据。示例代码如下:
VAR napr1: WORD; // 映射Q64AD的单个通道输入(带符号Word) SUM1: INT := 0; // 累加和设为INT类型 SampleNum: INT := 10; // 预设采样次数 AverageVal: REAL; // 最终平均值 END_VAR // 每次循环采集一个样本并累加(需配合采样触发逻辑) SUM1 := SUM1 + TO_INT(napr1); // 当达到预设采样次数时计算平均值 IF SampleNum > 0 THEN AverageVal := REAL(SUM1) / SampleNum; // 计算完成后重置累加器和采样计数,准备下一轮 SUM1 := 0; SampleNum := 10; END_IF
方案2:使用DINT避免累加溢出
如果你的采样次数较多(比如超过1000次),16位INT可能会出现溢出问题。这种情况下建议用32位的DINT(双整数)来存储累加和,安全性更高:
VAR napr1: WORD; SUM1: DINT := 0; // 改用DINT存储累加和 SampleNum: DINT := 100; AverageVal: REAL; END_VAR SUM1 := SUM1 + TO_DINT(napr1); IF SampleNum > 0 THEN AverageVal := REAL(SUM1) / SampleNum; SUM1 := 0; SampleNum := 100; END_IF
额外注意事项
- Q64AD的输入值本身是带符号的16位整数(范围-32768~32767),和INT的取值范围完全一致,所以类型转换不会有精度损失。
- 实际项目中,要注意采样的触发逻辑(比如定时采样、固定周期采样),避免重复累加同一个样本或者遗漏采样。
- 如果你是通过
FROM指令读取Q64AD的通道值,记得把读取到的数据寄存器(比如D0)映射为WORD类型的变量,再进行转换。
内容的提问来源于stack exchange,提问作者Roman Selin




