You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

三菱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

火山引擎 最新活动