Чаще всего входные сигналы лучше предварительно обрабатывать, а не подавать непосредственно в алгоритмы сигналы из регистров модулей ввода-вывода.
Хранить обработанные сигналы лучше в массивах.
Например:
Дискретные сигналы
Массив 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) - номер сработавшей уставки.
- Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения. Непонятно? - Читать здесь.
- Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
- Перед тем как что-то написать - читать здесь, а затем здесь и здесь.
- Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.
Обработка входных сигналов
Модератор: специалисты по PLC
-
- эксперт
- Сообщения: 1118
- Зарегистрирован: 25 июл 2008, 10:06
- Имя: Леонид
- Страна: РФ
- Благодарил (а): 44 раза
- Поблагодарили: 130 раз
Обработка входных сигналов
Хард - это то, что можно швырнуть об стенку, а софт - это то, что можно лишь обматерить.
-
- эксперт
- Сообщения: 1118
- Зарегистрирован: 25 июл 2008, 10:06
- Имя: Леонид
- Страна: РФ
- Благодарил (а): 44 раза
- Поблагодарили: 130 раз
Копирование сигнала из регистров входных модулей
Приведенное ниже описание подходит не для всех систем.
1. Создаем массив CARD_MODULES [1..количество корзин ввода-вывода в системе][1...количество модулей ввода-вывода в корзине]
2. В начальные значения элементов массива CARD_MODULES задаем номера регистров входных модулей.
3. Для дискретных (аналоговых) параметров делаем массив привязки к модулям:
DI_ADDRESS(AI_ADDRESS)[1....максимум] типа структура из полей Drop, Module, Channel
4. В программе обрабатываем сигналы в цикле по переменной i от 1 до максимума:
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] := ФУНКЦИЯ_ЗНАЧЕНИЕ_ПО_АДРЕСУ_РЕГИСТРА(Адрес сигнала);
Хард - это то, что можно швырнуть об стенку, а софт - это то, что можно лишь обматерить.
-
- эксперт
- Сообщения: 1118
- Зарегистрирован: 25 июл 2008, 10:06
- Имя: Леонид
- Страна: РФ
- Благодарил (а): 44 раза
- Поблагодарили: 130 раз
Пример программы для AI
Пример для 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;
Хард - это то, что можно швырнуть об стенку, а софт - это то, что можно лишь обматерить.
-
- эксперт
- Сообщения: 1118
- Зарегистрирован: 25 июл 2008, 10:06
- Имя: Леонид
- Страна: РФ
- Благодарил (а): 44 раза
- Поблагодарили: 130 раз
Пример программы для DI
Пример для 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;
Хард - это то, что можно швырнуть об стенку, а софт - это то, что можно лишь обматерить.
-
- эксперт
- Сообщения: 1118
- Зарегистрирован: 25 июл 2008, 10:06
- Имя: Леонид
- Страна: РФ
- Благодарил (а): 44 раза
- Поблагодарили: 130 раз
Общие замечания
Приведенные примеры конечно упрощенные.
Тут не учтены:
1. Контроль исправности модуля, который должен влиять на достоверность.
2. Контроль выхода аналогового параметра за диапазон измерительного канала.
3. Необходимость в некоторых случаях делать дополнительную обработку аналогового сигнала - сглаживание и т.п.
4. И т.д. в зависимости от требований в каждом конкретном случае.
P.S. Заметили в обработке дискретных сигналов ошибку? Попозже напишу о ней.
Тут не учтены:
1. Контроль исправности модуля, который должен влиять на достоверность.
2. Контроль выхода аналогового параметра за диапазон измерительного канала.
3. Необходимость в некоторых случаях делать дополнительную обработку аналогового сигнала - сглаживание и т.п.
4. И т.д. в зависимости от требований в каждом конкретном случае.
P.S. Заметили в обработке дискретных сигналов ошибку? Попозже напишу о ней.
Хард - это то, что можно швырнуть об стенку, а софт - это то, что можно лишь обматерить.