Hafizov G, по второму вопросу мало информации. Нужно видеть проект.
Hafizov G, по второму вопросу мало информации. Нужно видеть проект.
запросто,Вложение 9051,суть такова почти в каждом теле программы есть счетчик СТУ, он и приводит в действие тело ШАГА, первый цикл программа проходит, тоесть init - step 6, то по идее в инните дожен произойти сброс всех счетчиков, как я думал, но это не прокатывает, пробовал ставить генератор изменения reseta перед тоже на 2 цикле не замечает.
или есть возможность предложите код счетчика как в CTU, илискажите можно ли обнулить значение CV? - прога говорит он недоступен для записи, можно ли его сделать доступным?
Хорошо, а как сравнивать значения с модуля в моменты, когда поочерёдно включаются 1 и 2 входы контроллера. Т.е., мне нужно получить разницу значения модуля ввода при включённых 1 и 2 входах, в зависимости от которой будут включаться два других выхода контроллера. Что-то типа U1 - это необходимое значение модуля ввода при 1 включённом входе, U2 - это при 2 входе. И всё, что мне нужно, это получить разницу значений U1-U2.Что-то Вы мудрите. Зачем объединять? Почему нельзя просто сравнить значения с модуля? Приведите пример, чего хотите добиться в результате. А то не понятно, что дано, с чем сравнивать, и что в итоге должно получиться?
"по идее в инните дожен произойти сброс всех счетчиков"
Это по какой-такой идее, а где код, который сбрасывает счетчики?
По крайней мере код действия шага Init должен быть вот так
И что это за код (встречается в во всех шагах)Код:A5:=1; i:=0; WHILE i<5 DO NA:=1; i:=i+1; END_WHILE NA:=0; i:=0; (*----------- Сброс счетчиков*) CTUInst(RESET:= TRUE); CTUInst1(RESET:=TRUE); T1(RESET:= TRUE); T3(RESET:= TRUE); (*------------*)
Это код паразит, он ни чего не делает, может это типа задержки(он просто считает число циклов ПЛК).Код:i:=0; WHILE i<5 DO NA:=1; i:=i+1; END_WHILE NA:=0; i:=0;
А вот здесь
Состояние элементов Т1, Т2, Т3, вообще не будут иметь значение.
Что это за выражение
Ведь переменная имеет тип BOOL, интересно когда она станет отрицательной.
И еще. Почему нельзя просто прямо возле черточки само условие написать. Ведь простейшие условия
Дальше программу не смотрел, наверняка есть и другие ляпсусы.
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
Вообщем этому человеку нужно устройство выборки и хранения измеренного значения
Если нужно запоминать измеренные значения в момент включения входов, то нужно в условия IF добавить R_TRIG.Код:IF in1 THEN (*Пока вход 1 включен*) U1:=izm; (*эта переменная повторяет измеренное значение*) END_IF (*после выключения входа 1 в переменной U1 запомнится значение в момент отключения входа in1*) IF in2 THEN (*Пока вход 2 включен*) U2:=izm; (*эта переменная повторяет измеренное значение*) END_IF (*после выключения входа 2 в переменной U2 запомнится значение в момент отключения входа in1*)
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
У тебя в глобальных перменных CTUInst: CTU и эта же переменная в локальных PLC_PRG, так и должно быть?
Вообще старайся как можно меньше использовать глобальные переменные. Это избавит тебя от ошибок, которые очень трудно найти. Для этого используй в функциональных блоках переменные var_input.
Действие Init.
Смотри, что у тебя тут происходит:
A5:=1;
i:=0;
Далее зачем-то цикл
WHILE i<5 DO
NA:=1;
i:=i+1;
END_WHILE
после цикла имеем: NA=1, i=5;
далее эти же переменные меняются:
NA:=0;
i:=0;
В результате работы действия Init у тебя всегда будут одни и те же значения: A5=1, NA=0, i=0. То есть цикл никак не повлиял на результат.
Имей в виду, что цикл надо использовать осторожно, так как он увеличивает время работы программы в целом, и если цикл будет большим, то контроллер зависнет и перезагрузится. Контроллер сам работает в цикле. И этим надо пользоваться.
По поводу счетчика. Почитай описание работы в документации CoDeSys_V23_RU.pdf стр.347. Обрати внимание, что счетчик будет считать тогда, когда будет меняться сигнал на входе CU, а обнуляться будет тогда, когда на вход RESET подается TRUE.
Для для Hafizov G
Если Вы хотели сбрасывать счетчики, которые используются в шагах, просто изменив в шаге Init переменную NA из 0 в 1 и затем опять в 0, то эти манипуляции ни как не отразятся на состоянии счетчиков, нужно именно вызывать сами экземпляры счетчиков с нужным значением входа RESET, потому как любая подпрограмма сохраняет свою внутренние переменные до следующего к ней обращения.
Счетчик это тоже подпрограмма.
Исходя из ранее не замеченной мной переменной NA предлагаю, такой код для шага Init
Код:A5:=1; (*----------- Сброс счетчиков*) CTUInst(RESET:=1); CTUInst(RESET:=0); CTUInst1(RESET:=1);CTUInst1(RESET:=0); T1(RESET:=1);T1(RESET:=0); T3(RESET:=1);T3(RESET:=0); (*------------*)
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
Блин, ребята спасибо! Все учту, буду учиться пользоваться, есть еще один вопрос- о LD. возможно ли на LD строить циклы? и есть ли литература с примерами (как по LD так и по остальным для новичков)? а то на мануале конечно здорово, но увидеть в одной книжке пару десятков примеров было бы круто, я инет чуть чуть порыл, только статьи, а книг хороших не заметил, наверное плохо искал.