Забываем про обмотки и ищем в хелпе ФБ SR и RS, ну или разбираем работу пускателя :
мотор:=NOT кнопка_стоп AND ( мотор OR кнопка_пуск );
Вид для печати
Подскажите пожалуйста, как с помощью Modbus Master опросить (записать) старшие биты регистра другого контроллера используя конфигурацию (с младшими все понятно).
Не колупаться с битами, а опросить целый регистр
Да, но мне же придется записывать в др (slave) контроллер целый регистр, а какие там установлены биты, никто не знает...Хорошо предварительно их можно прочитать. Но за время передачи данных Они могут измениться. Например, при чтении седьмой бит=0, записываем в 9-ый ед-цу, пока идет передача в slave контроллер, там изменяется седьмой бит на1. А мы туда же пишем целый регистр с 0-м седьмым битом. как здесь быть???
Думаете кучу бит прочитате/запишите быстрее регистра ?
Отправили туда 1 бит. Записался, пока идет ответ, он стал 0. А вы думаете что там 1. Тоже самое
Короче если у вас биты - RW, а частота изменений на слейве больше частоты опросов - ничего хорошего.
Если очень нужно старший байт в регистре побитно - ручками.
Все остальное - к авторам.
Документацию читаю постоянно:) Но таких вещей,которые пишите вы там не нахожу:( в частности про копирование (дано общее описание, без примеров), про считывание времени контроллера...может у меня не хватает какой то еще документации... Навыков и опыта программирования у меня, практически, ноль( Но спасибо, Вам за помощь. Понимаю, что спрашиваю очевидные для вас вещи..эх..
прошу подсказку. ПЛК со статичным IP висит в интернете через ПМ01. Как к нему подключиться кодезисом? В ПДФ документе в соответствующем разделе описание от USB. Создание в параметрах связи TCP/IP подключения 2 уровня ничего не дает. Где еще что настроить надо?
ПЛК 160. CoDeSys.
Нужен бит, который был бы установлен на время первого скана, при включении контроллера (подаче питания).
Существует ли такой системный бит? Если нет, то как его лучше сделать?
В общем-то, +1. То есть, решать нужно концептуально - что откуда меняется. И каша с обращениями к одному регистру - это признак скорее неправильной организации.
Раздели его на 2 - один статусный, один управления. Как вариант.
Но к уважаемому capzap есть оговорка: можно так построить обмен, что в регистр управления мастер пишет бит-команду, а Слейв очищает этот бит, когда ее выполняет. Я так организовал у себя и нормально работает. Не нужно повторно по Модбасу записывать (сбрасывать) бит.
В первом цикле выполнения программы обычно выставляется системный бит...
кажется тут такого нет, хотя взгляните на раздел "конфигурация задач" в справке, возможно появится способ самому сделать этот псевдосистемный бит из своей программы
Пфф...Цитата:
Нужен бит, который был бы установлен на время первого скана, при включении контроллера (подаче питания).
Существует ли такой системный бит? Если нет, то как его лучше сделать?
Код:VAR
firstScan: BOOL := TRUE;
END_VAR
(* Тело PLC_PRG *)
firstScan := FALSE;
(* Использование: IF PLC_PRG.firstScan THEN ... *)
Ну почему. Вопрос в том, что по смыслу представляет собой та команда, которую Мастер дает записью в данный бит. У меня это команды, исполнение которых контролируется другими способами. И команда не подается второй раз, пока та проверка не произойдет. Поэтому проверять, сбросился ли бит в регистре управления - вовсе не надо.
Да и потом, как учит меня уважаемый Валенок, надо самому себе ответить: а кого я проверяю? Вот я и думаю. Прохождение команды по Модбасу - надо проверять? Нет, это делается иначе. Понимание команды Слейвом - ну, если уж принял, то поймет. Принятие команды к исполнениею: нет ли условий, которые могут позволить этому нахалу проигнорировать приказ? Да, это уже возможно. Вот это и проверяю. Но по другим регистрам. Все равно считаю, что установленный бит-команда "слизнулся" Слейвом. Он свою функцию выполнил.
Пример. Есть бит, приказывающий весоизмерительному АЦП взять тару: текущий вес записать и потом отнимать от всех последующих результатов. Мастер установил, а потом проверяет по ДРУГОМУ регистру статус. Если там нет ошибки ДИАПАЗОН ТАРЫ, то это означает, что операция выполнена. А если есть ошибка - ну, значит вес тары за пределами допустимого и тара не взята. А наш бит-приказ - он точно сброшен, что ж ему стоять...
RW для мастера и слейва - это нормально. Чисто пример : изменение параметра в меню ПЛК63 локально, и полностью синхронно, но удаленно, на панели. О частоте изменений даже смешно говорить. Но даже тут если вдруг умудрятся ввести одновременно два разных значения - кто-то потеряет свое. Но, конечно же, сразу это увидит.
А если частота изменений быстрее самого обмена - тут вообще будет засада. Поэтому и лучше
И командное управление - битами и просто числом (это одно и тоже), когда мастер просто уверен что биты/число примут и обнулят - внешне RW для всех, но это и есть решение на уровне концепций. Т.е. мастер не пишет/читает, он только пишет, и всегда знает что там будет после записи.Цитата:
решать .. концептуально - что откуда меняется. И каша с обращениями к одному регистру - это признак скорее неправильной организации.
PS
Опс. об этом сказали выше на минуту раньше
Видишь, дорогой Учитель, я стараюсь!
"Если его долго бить, то толк выйдет. Бестолочь останется" :)
Очень хочется обобщить свое разумение организации обмена между Мастером и Слейвом. Ну, что вертится сейчас:
- классификация регистров обмена по способу записи-считывания - со сравнением применительно к разным задачам;
- типовые алгоритмы взаимодействия Масетр-Слейв ("тот сказал то, а тот ответил это, а тот ему вот то, и так далее")
- способы обеспечения надежности взаимодействия
- инициализация взаимодействия (процессы при перезапуске Мастера и/или Слейва)
- построение системы отработки аварийных ситуаций
...
К сожалению, разумения пока маловато.
А может уважаемые коллеги подскажут ссылочку на материалы в тему? Одно дело - формальное описание Модбаса, а совсем иное - статья опытного разработчика по практическим вопросам.
Какими минимальными требованиями должен обладать компьютер. что бы на него можно было поставить среду Codesys? И возможность управлять проектами?
Особых требований нет. Если покупаете ПК сейчас - все будут работать.
Если ПК уже стоит, и боитесь, что будет слабоват - скачайте с нашего сайта или с сайта www.3s-software.com саму среду и попробуйте.
Мы собираемся покупать компьютер в цех и с помощью его, программы,и самого контроллера управлять производством...какой компьютер минимальный по требованиям нужно купить???
Еще раз. Сейчас какой бы компьютер не купили - его хватит. Уже нет настолько слабых ПК, чтоб CoDeSys не потянуть.
НУ и они указаны в документации:
http://www.owen.ru/uploads/rp_plk110.160.pdf
Стр.8
Пробовал в своё время ставить CoDeSys на компьютер с памятью 128МБайт и процессором 330 (или около этого) МГц, с интегрированной видеокартой.
Работало всё нормально)))).
Добрый день.
Пара вопросов от новичка. Отрывок кода:
tiktak : TON;
i : INT;
Q_ : BOOL := TRUE;
start : BOOL := TRUE;
************************************************** ***********
tiktak ( IN := start, PT := T#17s);
i := TIME_TO_INT(tiktak.ET)/1000 MOD 17;
CASE i OF
1..8:
IF Q_ THEN
Prs (START := start); (*функциональный блок - типа бегущего огня с заданными интервалами времени*)
P1 := Prs.Var1;
P2 := Prs.Var2;
P3 := Prs.Var3;
P4 := Prs.Var4;
ELSE;
END_IF
9..16:
IF Q_ THEN
Prs (START := start);
P1 := Prs.Var1;
P2 := Prs.Var2;
P3 := Prs.Var3;
P4 := Prs.Var4;
ELSE;
END_IF
END_CASE
При i = 1..8 функциональный блок вполняется.
1) Подскажите пожалуйста, почему в момент, когда i = 9..16 следующее за ним условие не выполняется? Правильно ли построен код?
И если кто подскажет, как по проще организовать цикл данного в примере FB буду очень благодарен.
2) После присвоения start = FALSE и попытке запустить программу по новой (start = TRUE) перестает работать и первый функциональный блок при i=1...8.
Есть ли ошибка по этому поводу в данном коде?
Заранее спасибо
Как можно остановить счет таймера TON если он уже начал отсчитывать время до включения? Заранее спасибо!
vooodooo22 что-то определенно не так с вашим блоком, вот картина после одного цикла работы таймера, видно, что оба кода отработали
1.Потому что никто кроме Вас не знает что и как делает Ваш Prs
2.Потому что никто кроме Вас не знает, есть ли еще желающие записать в Q_
3.Потому что i в первую секунду = 0
4.Зачем здесь case вообще ?
Любой код построен правильно если он выполняет свою задачу.Цитата:
Правильно ли построен код?
Что надо в итоге ?Цитата:
как по проще организовать цикл данного в примере FB
здравствуйте, как можно ограничить значение числа формата риал после запятой, например оставить после запятой только два знака, заранее спс
* 100, округлить, /100
А для чего если не секрет ?
ну просто слишком много разрядов после запятой)))) особенно с датчиков температуры
допустим число 27.1239999212, а после округления в в программе 27.12 просто интересно если стандартные функции округления я не нашел))
Визуализация - округляет по формату
Экран 63/73 - тоже. см.соотв.функции
Панели - округляют
Так на фик надо ?
Нужно заключить функциональный блок в регулируемый цикл (чтобы не писать длинный код повторения одного и того же блока или увеличивать код самого блока).
Функциональный блок(CFC) выполняет включение/выключение лампочек поочередно, он состоит из таймеров.
С циклами FOR, WHILE, REPEAT как то не ладится (цикл запускает блок, но мгновенно приходит к концу, пока как блок еще работает в первом цикле), поэтому попробовал CASE, но и этот оператор, как выяснилось, тут не помошник, т.к. включает условие лишь при выполнении равенства значений, в следствии чего актвиация лампочек происходит, но по времени сбивается.
лампочек 4 ?
VAR
M:byte:=17;
T:ton;
T(IN:=not T.Q, PT := T#2s);
M:=SEL(T.Q,M,ROL(M,1));
Do1:=M.0;
Do2:=M.1;
Do3:=M.2;
Do4:=M.3;
PS
Первые две стоки в одну - непредлагаю :)
вам нужен таймер с паузой
смотрите пост #7