Добрый день всем!
Я новичок в области автоматизации. Передо мной стоит задача вникнуть и разобраться что к чему.
В общем, имеется система, элементы которой взаимодействуют между собой по Modbus. Имеется контроллер Modicon M340 (Schneider Electric), который является мастером и Slave-устройства, которые представляют собой дискретный ввод и вывод. Задача следующая: организовать систему управления используя эти элементы.
То есть ПЛК считывает состояние входов по Modbus выполняет программу и записывает выхода опять же по Modbus.
В моем конкретном случае имеется 2 Slave-устройства входов (по 96 входов каждый) и 2 Slave-устройства выходов (по 96 выходов каждый). Физически соединил 7 выходов с 7 входами. Реализовал простенькую программу: включается выход 1 (при этом включается вход 1, т.к. соединен физически), тогда если вход 1 включился, то включается выход 2 (он соединен с входом 2), если вход 2=1, то выход 3=1 и т.д. Как только выход 8=1 выключается выход 1, при этом вся цепочка тухнет и начинается заново. Условно можно назвать этот режим "змейка".
Хочется сделать следующее: постоянно опрашивать входа, а выхода записывать только тогда, когда хотя бы один из них изменит свое значение. Считывание входов производится стандартно (с помощью функции READ_VAR), а для записи написал свой блок. Исходный код следующий:
if old_out[1]<>array_in[1] or old_out[2]<>array_in[2] then
old_out[1]:=array_in[1];
old_out[2]:=array_in[2];
write_var (ADDM(ADR),OBJ, 39999, 32, old_out,gest_wr);
end_if;
где array_in - текущие значения выходов;
old_array - последние запомненные и отправленные значения выходов
ADR - адрес Slave-устройства
Проблема в следующем, в какой-то момент "змейка" перестает выполнятся. Например, в Unity отображается, что выход 1=1, хотя физически он равен 0. И соответственно цепочка не выполняется.
Вот собственно и вопрос: Почему возникает такое?
Пожалуйста, посоветуйте что нибудь. Бьюсь над этим уже приличное время. Кажется что хожу где то рядом но не могу найти правильного решения.
- Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не надо писать свой вопрос в первую попавшуюся тему - всегда лучше создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения. Непонятно? - Читать здесь.
- Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
- Перед тем как что-то написать - читать здесь, а затем здесь и здесь.
- Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.
Unity Pro
Модераторы: Глоб.модераторы, Специалисты SE
-
- здесь недавно
- Сообщения: 10
- Зарегистрирован: 19 апр 2012, 15:38
- Имя: М.Р�.
- Страна: Россия
-
- здесь недавно
- Сообщения: 10
- Зарегистрирован: 19 апр 2012, 15:38
- Имя: М.Р�.
- Страна: Россия
-
- преподаватель
- Сообщения: 1357
- Зарегистрирован: 01 сен 2008, 18:32
- Имя: Пупена Александр
- Страна: Украина
- город/регион: Киев
- Поблагодарили: 6 раз
Re: Unity Pro
Думаю что ошибка у Вас - самая распостраненная - неправильное использование параметра GEST. 0-й бит (бит активности) 0-го слова этой таблицы используется для контроля за обработкой коммуникационной функции, там же результаты/ошибки обработки.
В Вашем случае алгоритм приблизительно должен быть таким:
0-й шаг - если бит активности в WRITE_VAR2 = 0, и нет ошибок в отчете - вызвать функцию чтения READ_VAR1, перейти на 1-й шаг
1-й - если бит активности READ_VAR1 = 0, и нет ошибок в отчете - выполнить Ваш алгоритм, вызвать функцию записи WRITE_VAR1, перейти на 2-й шаг
2-й шаг - если бит активности в WRITE_VAR1 =0, и нет ошибок в отчете - вызвать функцию чтения READ_VAR2, перейти на 3-й шаг
3-й шаг - если бит активности в READ_VAR2 =0, и нет ошибок в отчете - выполнить Ваш алгоритм, вызвать функцию записи WRITE_VAR2, перейти на 0-й шаг
В Вашем случае алгоритм приблизительно должен быть таким:
0-й шаг - если бит активности в WRITE_VAR2 = 0, и нет ошибок в отчете - вызвать функцию чтения READ_VAR1, перейти на 1-й шаг
1-й - если бит активности READ_VAR1 = 0, и нет ошибок в отчете - выполнить Ваш алгоритм, вызвать функцию записи WRITE_VAR1, перейти на 2-й шаг
2-й шаг - если бит активности в WRITE_VAR1 =0, и нет ошибок в отчете - вызвать функцию чтения READ_VAR2, перейти на 3-й шаг
3-й шаг - если бит активности в READ_VAR2 =0, и нет ошибок в отчете - выполнить Ваш алгоритм, вызвать функцию записи WRITE_VAR2, перейти на 0-й шаг
-
- здесь недавно
- Сообщения: 10
- Зарегистрирован: 19 апр 2012, 15:38
- Имя: М.Р�.
- Страна: Россия
Re: Unity Pro
san, вот ссылка http://ifolder.ru/control/?file_id=3002 ... d6ad1a6109
но только я реализовывал нет так... просто брал стандартные блоки и gest нигде не использовал в явном виде..
но только я реализовывал нет так... просто брал стандартные блоки и gest нигде не использовал в явном виде..
-
- преподаватель
- Сообщения: 1357
- Зарегистрирован: 01 сен 2008, 18:32
- Имя: Пупена Александр
- Страна: Украина
- город/регион: Киев
- Поблагодарили: 6 раз
Re: Unity Pro
Я не хочу регистрироваться, лучше отправьте на pupena_san<sabaka>ukr.net
gest нужно обязательно использовать, даже в учебных примерах. Познакомьтесь со структурой и поймете почему.
gest нужно обязательно использовать, даже в учебных примерах. Познакомьтесь со структурой и поймете почему.