Многие, наверное, сталкивались: когда на экране отображаешь числовые показания, добытые по шумящим интерфейсам, то возникает мельтешение числового текста (например, между 19,9 и 20,0), причём в любых разрядах вплоть до самого старшего.
Я нашёл ну прямо обкакаться простой способ от этого избавиться без задержек, которые свойственны НЧ-фильтрам:
Скажем, если надо округлить до десятых для отображения, то делаем deflicker1(IN := вход_с_помехами, DEC := 10, OUT => на_экран). DEC берём до нешумящего разряда (10 — десятые доли, 100 — сотые и т.д.). Работает очень просто: если меняется округленное, то взять отрезанное (транкейт); если меняется транкейт, то взять округленное. И т.к. одновременно транкейт и округленное почти не шумят, то число мёртво стоит на экране.Код: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;
Можно, конечно, упрекнуть в неточности, но не забывайте, что это делается только для грубого отображения. Сам удивился, насколько просто решилась проблема — вот и решил поделиться.



Ответить с цитированием