1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения. Непонятно? - Читать здесь.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь, а затем здесь и здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

Обработка входных сигналов

Модератор: специалисты по PLC

Ответить

Автор темы
leon78
эксперт
эксперт
Сообщения: 1118
Зарегистрирован: 25 июл 2008, 10:06
Имя: Леонид
Страна: РФ
Благодарил (а): 44 раза
Поблагодарили: 130 раз

Обработка входных сигналов

Сообщение leon78 »

Чаще всего входные сигналы лучше предварительно обрабатывать, а не подавать непосредственно в алгоритмы сигналы из регистров модулей ввода-вывода.
Хранить обработанные сигналы лучше в массивах.
Например:
Дискретные сигналы
Массив DI[1....максимум] типа BYTE.
Для каждого дискретного параметра выделены 8 бит, они несут следующие значения (номера битов для этого могут быть любые):
1) Значение сигнала (0/1);
2) Достоверен/недостоверен;
3) Немаскирован/маскирован (маскирован - сигнал исключается из обработки)
4) Неимитирован/имитирован.
5..8) - резерв
Аналоговые сигналы
Массив значений AI[1....максимум] типа UINT.
Массив признаков AI_PR[1....максимум] типа BYTE.
Для каждого признака аналогового параметра выделены 8 бит, они несут следующие значения (номера битов для этого могут быть любые):
1) Достоверен/недостоверен;
2) Немаскирован/маскирован (маскирован - сигнал исключается из обработки)
3) Неимитирован/имитирован.
4..8) - номер сработавшей уставки.
Хард - это то, что можно швырнуть об стенку, а софт - это то, что можно лишь обматерить.

Автор темы
leon78
эксперт
эксперт
Сообщения: 1118
Зарегистрирован: 25 июл 2008, 10:06
Имя: Леонид
Страна: РФ
Благодарил (а): 44 раза
Поблагодарили: 130 раз

Копирование сигнала из регистров входных модулей

Сообщение leon78 »

Приведенное ниже описание подходит не для всех систем.
1. Создаем массив CARD_MODULES [1..количество корзин ввода-вывода в системе][1...количество модулей ввода-вывода в корзине]
2. В начальные значения элементов массива CARD_MODULES задаем номера регистров входных модулей.
3. Для дискретных (аналоговых) параметров делаем массив привязки к модулям:
DI_ADDRESS(AI_ADDRESS)[1....максимум] типа структура из полей Drop, Module, Channel
4. В программе обрабатываем сигналы в цикле по переменной i от 1 до максимума:

Код: Выделить всё

Адрес сигнала := CARD_MODULES [AI_ADDRESS[i].Drop][AI_ADDRESS[i].Module]+AI_ADDRESS[i].Channel-1;
AI[i] := ФУНКЦИЯ_ЗНАЧЕНИЕ_ПО_АДРЕСУ_РЕГИСТРА(Адрес сигнала);
Хард - это то, что можно швырнуть об стенку, а софт - это то, что можно лишь обматерить.

Автор темы
leon78
эксперт
эксперт
Сообщения: 1118
Зарегистрирован: 25 июл 2008, 10:06
Имя: Леонид
Страна: РФ
Благодарил (а): 44 раза
Поблагодарили: 130 раз

Пример программы для AI

Сообщение leon78 »

Пример для Modicon TSX Quantum на Unity. Т.к. писал прямо в форуме, могут быть незначительные синтаксические ошибки

Код: Выделить всё

FOR i:= 1 TO Maximum_AI DO
 IF (AI_PR[i] AND btMaskImitirovan) = 0 THEN
  X := CARD_MODULES [AI_ADDRESS[i].Drop][AI_ADDRESS[i].Module]+AI_ADDRESS[i].Channel-1;
  AI[i] := %IW1[X-1];
 END_IF;
END_FOR;
Хард - это то, что можно швырнуть об стенку, а софт - это то, что можно лишь обматерить.

Автор темы
leon78
эксперт
эксперт
Сообщения: 1118
Зарегистрирован: 25 июл 2008, 10:06
Имя: Леонид
Страна: РФ
Благодарил (а): 44 раза
Поблагодарили: 130 раз

Пример программы для DI

Сообщение leon78 »

Пример для Modicon TSX Quantum на Unity. Т.к. писал прямо в форуме, могут быть незначительные синтаксические ошибки

Код: Выделить всё

FOR i:= 1 TO Maximum_DI DO
 IF (DI[i] AND btMaskImitirovan) = 0 THEN
  X := CARD_MODULES [DI_ADDRESS[i].Drop][DI_ADDRESS[i].Module];
  IF DI_ADDRESS[i].Channel > 16 THEN
   X := X + 1;
  END_IF;
  wTemp := %IW1[X-1];
  wMask := RHL(16#0001,16-DI_ADDRESS[i].Channel);
  IF (wTemp AND wMask) <> 0 THEN
   DI[i] := DI[i] OR btMaskZnachenie;
  ELSE
   DI[i] := DI[i] AND NOT btMaskZnachenie;
  END_IF;
 END_IF;
END_FOR;
Хард - это то, что можно швырнуть об стенку, а софт - это то, что можно лишь обматерить.

Автор темы
leon78
эксперт
эксперт
Сообщения: 1118
Зарегистрирован: 25 июл 2008, 10:06
Имя: Леонид
Страна: РФ
Благодарил (а): 44 раза
Поблагодарили: 130 раз

Общие замечания

Сообщение leon78 »

Приведенные примеры конечно упрощенные.
Тут не учтены:
1. Контроль исправности модуля, который должен влиять на достоверность.
2. Контроль выхода аналогового параметра за диапазон измерительного канала.
3. Необходимость в некоторых случаях делать дополнительную обработку аналогового сигнала - сглаживание и т.п.
4. И т.д. в зависимости от требований в каждом конкретном случае.
P.S. Заметили в обработке дискретных сигналов ошибку? Попозже напишу о ней.
Хард - это то, что можно швырнуть об стенку, а софт - это то, что можно лишь обматерить.
Ответить

Вернуться в «F.A.Q. по структуре программ»