我正在使用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库上使用一些不同的块(这是一个第三方免费库。如果您想使用它,您需要下载它(。我知道你们在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