Hafizov G, по второму вопросу мало информации. Нужно видеть проект.
Вид для печати
Hafizov G, по второму вопросу мало информации. Нужно видеть проект.
запросто,Вложение 9051,суть такова почти в каждом теле программы есть счетчик СТУ, он и приводит в действие тело ШАГА, первый цикл программа проходит, тоесть init - step 6, то по идее в инните дожен произойти сброс всех счетчиков, как я думал, но это не прокатывает, пробовал ставить генератор изменения reseta перед тоже на 2 цикле не замечает.
или есть возможность предложите код счетчика как в CTU, илискажите можно ли обнулить значение CV? - прога говорит он недоступен для записи, можно ли его сделать доступным?
Хорошо, а как сравнивать значения с модуля в моменты, когда поочерёдно включаются 1 и 2 входы контроллера. Т.е., мне нужно получить разницу значения модуля ввода при включённых 1 и 2 входах, в зависимости от которой будут включаться два других выхода контроллера. Что-то типа U1 - это необходимое значение модуля ввода при 1 включённом входе, U2 - это при 2 входе. И всё, что мне нужно, это получить разницу значений U1-U2.Цитата:
Что-то Вы мудрите. Зачем объединять? Почему нельзя просто сравнить значения с модуля? Приведите пример, чего хотите добиться в результате. А то не понятно, что дано, с чем сравнивать, и что в итоге должно получиться?
"по идее в инните дожен произойти сброс всех счетчиков" :confused:
Это по какой-такой идее, а где код, который сбрасывает счетчики?
По крайней мере код действия шага 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;
А вот здесь
http://toolson.net/ImageData/GifAnimation/915868.gif
Состояние элементов Т1, Т2, Т3, вообще не будут иметь значение.
Что это за выражение
http://s017.radikal.ru/i420/1306/4c/6e9aebe6b64bt.jpg
Ведь переменная имеет тип BOOL, интересно когда она станет отрицательной.:rolleyes:
И еще. Почему нельзя просто прямо возле черточки само условие написать. Ведь простейшие условия
http://i058.radikal.ru/1306/d8/0498eacd56ddt.jpg
Дальше программу не смотрел, наверняка есть и другие ляпсусы.
Вообщем этому человеку нужно устройство выборки и хранения измеренного значения
Если нужно запоминать измеренные значения в момент включения входов, то нужно в условия 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*)
У тебя в глобальных перменных 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);
(*------------*)
Блин, ребята спасибо! Все учту, буду учиться пользоваться, есть еще один вопрос- о LD. возможно ли на LD строить циклы? и есть ли литература с примерами (как по LD так и по остальным для новичков)? а то на мануале конечно здорово, но увидеть в одной книжке пару десятков примеров было бы круто, я инет чуть чуть порыл, только статьи, а книг хороших не заметил, наверное плохо искал.
есть хорошее средство, как конвертация. Найдите пример с циклом, откройте его в КДС, правой кнопкой по нужному ФБ и выбрать конвертацию, так сможете разобраться как в LD выглядят циклы, если конечно это принципиально. Не могу понять только зачем, когда есть другие языки