Показано с 1 по 5 из 5

Тема: Посчитать количество сработавших дискретных входов ПЛК

  1. #1

    По умолчанию Посчитать количество сработавших дискретных входов ПЛК

    Пожалуйста, подскажите новичку как программно более просто найти количество (изменяющееся) получивших лог. 1 (сработавших) дискретных входов. Чтобы вывести просто числовое значение на экран. Может есть более простой алгоритм, кроме "+1" к счёту, "-1" при отпускании... (Это просто для отображения количества неисправностей). Дальше нужно будет идентифицировать порядковый номер "неисправности", но это соображу.

  2. #2
    Пользователь
    Регистрация
    09.10.2014
    Адрес
    Киров
    Сообщений
    735

    По умолчанию

    К каждому входу привязать целочисленную переменную через преобразование Bool to int
    Затем сложить все эти Int- ы

  3. #3

    По умолчанию

    Если еще актуально, то я обычно использую методом расчета веса Хемминга. Давно где-то нашел алгоритм. За счет малого количества операций он значительно быстрей чем суммирование в цикле.
    Код:
    VAR 
       x: DWORD;
       out: INT;
    END_VAR
    
    x:=%IB1.0+%IB1.1*256+%IB1.2*512+%IB1.3*1024;
    x:=DINT_TO_DWORD(DWORD_TO_DINT(x AND 16#55555555) + DWORD_TO_DINT((SHR(x,1) AND 16#55555555)));
    x:=DINT_TO_DWORD(DWORD_TO_DINT(x AND 16#33333333) + DWORD_TO_DINT((SHR(x,2) AND 16#33333333)));
    x:=DINT_TO_DWORD(DWORD_TO_DINT(x AND 16#0F0F0F0F) + DWORD_TO_DINT((SHR(x,4) AND 16#0F0F0F0F)));
    x:=DINT_TO_DWORD(DWORD_TO_DINT(x AND 16#00FF00FF) + DWORD_TO_DINT((SHR(x,8) AND 16#00FF00FF)));
    x:=DINT_TO_DWORD(DWORD_TO_DINT(x AND 16#0000FFFF) + DWORD_TO_DINT((SHR(x,16) AND 16#0000FFFF)));
    out:=DWORD_TO_INT(x);
    Считает надежно.

  4. #4
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,825

    По умолчанию

    Цитата Сообщение от SBeaR Посмотреть сообщение
    Если еще актуально, то я обычно использую методом расчета веса Хемминга. Давно где-то нашел алгоритм. За счет малого количества операций он значительно быстрей чем суммирование в цикле.
    Код:
    VAR 
       x: DWORD;
       out: INT;
    END_VAR
    
    x:=%IB1.0+%IB1.1*256+%IB1.2*512+%IB1.3*1024;
    x:=DINT_TO_DWORD(DWORD_TO_DINT(x AND 16#55555555) + DWORD_TO_DINT((SHR(x,1) AND 16#55555555)));
    x:=DINT_TO_DWORD(DWORD_TO_DINT(x AND 16#33333333) + DWORD_TO_DINT((SHR(x,2) AND 16#33333333)));
    x:=DINT_TO_DWORD(DWORD_TO_DINT(x AND 16#0F0F0F0F) + DWORD_TO_DINT((SHR(x,4) AND 16#0F0F0F0F)));
    x:=DINT_TO_DWORD(DWORD_TO_DINT(x AND 16#00FF00FF) + DWORD_TO_DINT((SHR(x,8) AND 16#00FF00FF)));
    x:=DINT_TO_DWORD(DWORD_TO_DINT(x AND 16#0000FFFF) + DWORD_TO_DINT((SHR(x,16) AND 16#0000FFFF)));
    out:=DWORD_TO_INT(x);
    Считает надежно.
    При чем здесь суммирование в цикле?

    VAR
    NumInp: UINT;
    END_VAR

    NumInp:=BOOL_TO_INT(In1) + BOOL_TO_INT(In2) + BOOL_TO_INT(In3) + BOOL_TO_INT(In4) +
    BOOL_TO_INT(In5) + BOOL_TO_INT(In6) + BOOL_TO_INT(In7) + BOOL_TO_INT(In8);
    И все - всего одна строчка кода!
    Захват-1.png
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  5. #5

    По умолчанию

    Код универсальный и работает на любое количество входов от 1 до 32. Оформляете как функцию (без первой строки) и считаете хоть входа контроллера, хоть входа модулей дискретных, хоть произвольные переменные, в которых нужно посчитать количество единичек.
    Я только ошибся в первой строке, где идет преобразование входов в число:
    Код:
    x:=%IB1.0+%IB1.1*256+%IB1.2*65536+%IB1.3*16777216
    Правильно будет так.
    Последний раз редактировалось SBeaR; 25.10.2019 в 11:11.

Похожие темы

  1. Ответов: 1
    Последнее сообщение: 04.09.2019, 09:04
  2. Ответов: 2
    Последнее сообщение: 04.06.2019, 08:25
  3. Ответов: 4
    Последнее сообщение: 21.12.2017, 14:06
  4. Ответов: 6
    Последнее сообщение: 15.03.2011, 10:54
  5. Ответов: 6
    Последнее сообщение: 08.07.2009, 11:26

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •