首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用软件面板生成器600在ABB HMI中显示查询

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

Stack Overflow用户
提问于 2021-03-27 20:10:19
回答 2查看 142关注 0票数 0

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

EN

回答 2

Stack Overflow用户

发布于 2021-03-27 22:35:01

降低采样率

代码语言:javascript
复制
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
代码语言:javascript
复制
timer(IN := TRUE, PT := sampleRate);
IF (timer.Q) THEN
    hmiValue := plcValue;
    timer(IN := FALSE, PT := sampleRate); // reset
END_IF

移动平均

代码语言:javascript
复制
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
代码语言:javascript
复制
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

比较

运行以下代码:

代码语言:javascript
复制
IF (plcValue = 5) THEN
    plcValue := 10;
ELSIF (plcValue = 10) THEN
    plcValue := 3;
ELSE
    plcValue := 5;
END_IF

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

票数 1
EN

Stack Overflow用户

发布于 2021-03-28 19:37:45

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

FADE

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

代码语言:javascript
复制
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位整型数据的一阶过滤器。

代码语言:javascript
复制
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 (移动平均)。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66831185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档