Многие, наверное, сталкивались: когда на экране отображаешь числовые показания, добытые по шумящим интерфейсам, то возникает мельтешение числового текста (например, между 19,9 и 20,0), причём в любых разрядах вплоть до самого старшего.
Я нашёл ну прямо обкакаться простой способ от этого избавиться без задержек, которые свойственны НЧ-фильтрам:
Код:
FUNCTION_BLOCK DEFLICKER
VAR_INPUT
IN, DEC: REAL;
END_VAR
VAR_OUTPUT
OUT: REAL;
END_VAR
VAR
inpTrunc, inpRound, inpTruncPrev, inpRoundPrev: DINT;
END_VAR
inpRound := REAL_TO_DINT(IN * DEC);
inpTrunc := TRUNC(IN * DEC);
IF inpRound <> inpRoundPrev THEN
OUT := inpTrunc / DEC;
ELSIF inpTrunc <> inpTruncPrev THEN
OUT := inpRound / DEC;
END_IF
inpRoundPrev := inpRound;
inpTruncPrev := inpTrunc;
Скажем, если надо округлить до десятых для отображения, то делаем deflicker1(IN := вход_с_помехами, DEC := 10, OUT => на_экран). DEC берём до нешумящего разряда (10 — десятые доли, 100 — сотые и т.д.). Работает очень просто: если меняется округленное, то взять отрезанное (транкейт); если меняется транкейт, то взять округленное. И т.к. одновременно транкейт и округленное почти не шумят, то число мёртво стоит на экране.
Можно, конечно, упрекнуть в неточности, но не забывайте, что это делается только для грубого отображения. Сам удивился, насколько просто решилась проблема — вот и решил поделиться.