微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用软件面板生成器 600 在 ABB HMI 中显示查询

如何解决使用软件面板生成器 600 在 ABB HMI 中显示查询

我正在使用 ABB HMI 并在面板构建器 600 上对其进行编程。我使用米来显示角度并将比例设置为 -100 到 +100。我在显示角度方面取得了成功,但问题是角度变化非常频繁,仪表指针失控。例如:角度是5度然后突然增加到10度,然后在很短的时间内又减少到3度,我的显示表指针失控了。我应该怎么做才能解决这个问题?我正在使用 ABB plc 并用 CFC 语言在 codesys 中编写我的代码。等待有用的回复 TIA

解决方法

降低采样率

VAR
    plcValue: INT; // this value changes a lot
    hmiValue: INT := plcValue; // this value is sent to the HMI to be displayed
    sampleRate: TIME := T#2S; // hmiValue will change every 2 seconds
    timer: TON; // the timer
END_VAR
timer(IN := TRUE,PT := sampleRate);
IF (timer.Q) THEN
    hmiValue := plcValue;
    timer(IN := FALSE,PT := sampleRate); // reset
END_IF

移动平均线

VAR CONSTANT
    SIZE: INT := 100; // the number of values to average
END_VAR
VAR
    plcValue: INT; // this value changes a lot
    hmiValue: INT := plcValue; // this value is sent to the HMI to be displayed
    movingAverage: ARRAY [0..SIZE] OF INT; // last SIZE number of values of plcValue
    maIndex: INT := 0;
    maFilled: BOOL;
    sum: REAL;
    i: INT;
END_VAR
movingAverage[maIndex] := plcValue;
sum := 0;
IF (maFilled) THEN
    FOR i := 0 TO SIZE DO
        sum := sum + movingAverage[i];
    END_FOR
    hmiValue := REAL_TO_INT(sum / SIZE);
ELSE
    FOR i := 0 TO maIndex DO
        sum := sum + movingAverage[i];
    END_FOR
    hmiValue := REAL_TO_INT(sum / (maIndex + 1));
END_IF
IF (maIndex = SIZE) THEN
    maIndex := 0;
    maFilled := TRUE;
ELSE
    maIndex := maIndex + 1;
END_IF

比较

运行此代码:

IF (plcValue = 5) THEN
    plcValue := 10;
ELSIF (plcValue = 10) THEN
    plcValue := 3;
ELSE
    plcValue := 5;
END_IF

降低采样率导致 hmiValue 仍然每 2 秒跳跃一次(或任何 sampleRate 设置),而移动平均线停留在 6,这通常使它更受欢迎两者中,虽然代码稍大一些,但执行速度较慢(尽管这无关紧要,除非您在每个周期计算数千个平均值)。您还可以更改平均大小:它越大,值越平滑,但对更改的反应也较慢。尽量不要太大

,

您可以在 OSCAT 库中使用一些不同的块(这是一个 3rd 方免费库。如果您想使用它,您需要下载它)。我知道你在 CFC 工作,也许你不熟悉 ST,但这是代表如何解决你的任务的最佳方式。

FADE

此块允许将值从一个值缓慢更改为另一个值。

PROGRAM PLC_PRG
    VAR
        iValue: INT(-100..100); (* Value input *)
        iGauge: INT(-100..100); (* Smoothed Value for HMI *)
        fbFade: FADE; (* fade block *)
    END_VAR

    (* Play with TF parameter to achieve desired smoothness *)
    fbFade(IN1 := INT_TO_REAL(iValue),IN2 := INT_TO_REAL(iGauge),F := FALSE,TF := T#500MS);
    iGauge := REAL_TO_INT(fbFade.Y);
END_PROGRAM

FILTER_I

这个块在给定的时间间隔内取平均值。 FILTER_I是16位INT数据的一级过滤器。

PROGRAM PLC_PRG
    VAR
        iValue: INT(-100..100); (* Value input *)
        iGauge: INT(-100..100); (* Smoothed Value for HMI *)
        fbFilter: FILETR_I; (* filter block *)
    END_VAR

    (* Play with T parameter to achieve desired smoothness *)
    fbFilter(X := iValue,T := T#500MS,Y => iGauge);
END_PROGRAM

FILTER_MAV_W

另一个过滤器就像@Guiorgy 制作的例子不是基于时间而是基于存储的值的数量,称为 MA(移动平均)。

PROGRAM PLC_PRG
    VAR
        iValue: INT(-100..100); (* Value input *)
        iGauge: INT(-100..100); (* Smoothed Value for HMI *)
        fbFilter: FILTER_MAV_W; (* filter block *)
    END_VAR

    (* Play with N parameter to achieve desired smoothness *)
    fbFilter(X := INT_TO_WORD(iValue),N := INT#32);
    iGauge := WORD_TO_INT(fbFilter.Y);
END_PROGRAM

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。