Как настроить обмен плк100 с УРЖ2км?
Через modbus?
Вид для печати
Как настроить обмен плк100 с УРЖ2км?
Через modbus?
Можно ли в CoDeSys V2.3 используя модуль Modbus Slave отвечать на запросы по функции 0x03, а не 0x04, как по умолчанию?
это только если в контроллере, который будет выполнять роль слейва, Вы сделаете всё, чтоб информация записанная в несоответствующие регистры сможет навредить логике программы, то тогда конечно нужно делать разделение. Другими словами создали себе трудности, чтоб их устранять. Если плк каждый цикл будет писать в регистр данные их сложно затереть из вне и успеть прочитать, единственное отличие в масетр от такой глупости не будет возвращаться код ошибки
Не всегда разные, https://sites.google.com/site/fieldb...odbuseducation
Вложение 35425Цитата:
MBAP определяет вобщем 4-ре зоны (области) данных (переменных):
- Discrete Inputs (начиная с 10001), или область дискретных входов (входных битов)
- Coils (начиная с 00001), или область дискретных выходов (выходных битов)
- Input Registers (начиная с 30001), или область входных регистров (аналоговых входов)
- Holding Registers (начиная с 40001), или область выходных регистров (аналоговых выходов)
Таким образом, согласно MODBUS можно прочитать значение входных регистров и битов, прочитать или записать значение выходных регистров и битов. Следует отметить, что эти зоны памяти были доступны в ранних контроллерах MODICON, для которых и был разработан протокол. В этих контроллерах непривязаные к физическим выходам выходные перемнные (Coils и Holding Registers) можно было использовать как внутренние.
НО: в разных реализациях MODBUS, эти зоны могут интерпритироваться по разному, это не запрещается стандартами MODBUS.ORG
ПО-ЭТОМУ: для каждого конкретного устройства в документации определено отображение областей переменных MODBUS на его область данных.
Иными словами стандарт не определяет, к каким именно данным в конкретном устройстве вы будете доступаться, обращаясь к одной из зон памяти, это будут определять правила отображения, придуманные ... разработчиком устройства.
В ПЛК ОВЕН сделано именно по 2 варианту - Все зоны накладываются на одно адресное пространство.
Вложение 35427
Так например, записывая значение 2 в переменную (ячейку) 4x0001 вы одновременно меняете 3x0001=2 и 0x0002=TRUE и 1x0002=TRUE.
Про эту особенность есть замечательная картинка из руководства по конфигурированию ПЛК ОВЕН
Скрытый текст:
capzap, petera Спасибо за разъяснения
Подскажите ещё, как проще всего организовать побитовое ИЛИ? Встроенной функции я так понимаю нет? Необходимо использовать POINTER TO BOOL и цикл по длине исходных данных или есть какой-то удобный способ?
W#16#7777 OR W#16#6666 чему будет равно?
http://www.owen.ru/catalog/codesys_v2/51162335 здесь найдутся многие ответы,начать стоит с этого документа http://www.kipshop.ru/CoDeSys/steps/codesys_v23_ru.pdf
Ставлю русский в кодесис и вот такой язык появляется Вложение 35430 раньше такого не было и ставился русский нормально.
Зайдите в настройки (Project - Options - Editor) и выберите шрифт с поддержкой кириллицы. Все русские надписи станут читабельны.
Вложение 35432
Кроме этого советую шрифт Droid Sans Mono - удобный моноширный шрифт.
Добрый день. Теперь на сайте доступен пример:
http://www.owen.ru/catalog/svetodiod..._smi2/54824558
Всем здравствуйте. Подскажите, можно ли в плк 150 продублировать каким либо способом кнопку старт/cтоп на свободный дискретный вход для удаленного останова программы?
что мешает просто вызов основной программы сделать по состоянию дискретного входа?
В PLC_PRG:
IF bIn1 THEN
ProgMain();
END_IF;
Подскажите я правильно вот это:Вложение 35545 изобразил в ST: Вложение 35546
Приветствую.
Не совсем понял, как пользоваться режимом работы modbus мастера Work mode - by command.
Для записи или считывания регистров слейва мне достаточно записать 0xFF в регистр %QB8.2.0? Как будет это работать, если я каждый цикл ПЛК буду писать это значение?
Спасибо.
Вложение 35552
Здравствуйте.
Можно ли на ПЛК160 поднять одновременно Modbus TCP мастер и слейв.
Стоит задача: по модбас вычитывать данные с нескольких устройств (до восьми), производить над этими данными ряд арифметических действий, а потом отправлять результат на другое устройство (одно), тоже по модбас.
Все эти устройства в одной сети. Всюду Modbus TCP.
Всем привет.
Делаю первые шаги ПЛК100-24-P-L.
Хочу сделать так:
При срабатывании входа DI0 (контролируется Триггером по переднему фронту TrDI0) должен вызываться таймер TOF - включать выход yellow1 и спустя 5 сек. - выключать его.
Если просто в тело PLC_PRG написать:
TOF_Yellow1(IN:=TrDI0, PT:=T#5s , Q=> , ET=> );
yellow1:=TOF_Yellow1.Q;
то работает;
а если написать
IF TrDI0=TRUE THEN
TOF_Yellow1(IN:=TRUE, PT:=T#5s , Q=> , ET=> ); ВЗВОЖУ ТАЙМЕР должен появиться Q=TRUE;
TOF_Yellow1.IN:=FALSE; ЗАПУСКАЮ ОТСЧЁТ должен начаться отсчёт
yellow1:=TOF_Yellow1.Q; Выход yellow1 = TRUE с момента взвода таймера и до конца отсчёта.
уходим на проверку IF
END_IF
не работает.
Что я делаю не так?
Спасибо.
Capzap, спасибо.
Я никак не пойму - как выполняется программа на ST?
Контроллер каждую строчку друг за дружкой читает и выполняет?
Если в строке - таймер - контроллер ждёт пока не не кончится время этого таймера, а потом читает и выполняет дальше или сразу после запуска таймера бежит дальше по программе, а таймер сам по себе работает? Т.е. можно запустить много параллельных таймеров и других задач?
Что такое этот пресловутый цикл? - Пробежка от начала программы до конца?
Почему даже 1 раз не запускается у меня таймер в IF ?
Один же раз в каком-нибудь цикле TrDI0 становится TRUE - я же жму кнопку и Триггер видит это.
Я изменил TrDI0 на просто сигнал входа DI0.
IF DI0=TRUE THEN
TOF_Yellow1(IN:=TRUE, PT:=T#5s , Q=> , ET=> ); ВЗВОЖУ ТАЙМЕР должен появиться Q=TRUE;
TOF_Yellow1.IN:=FALSE; ЗАПУСКАЮ ОТСЧЁТ должен начаться отсчёт
yellow1:=TOF_Yellow1.Q; Выход yellow1 = TRUE с момента взвода таймера и до конца отсчёта.
уходим на проверку IF
END_IF
В этом случае при нажатии кнопки - DI0 - включается выход yellow1 и продолжает быть true. Таймер не срабатывает на начало отсчёта даже после отпускания кнопки.
Почему IF даже один раз не выполняется? Не могу понять.
смысл таймера в контроллерах это зафиксировать по фронту входного сигнала текущее время и далее выполняя каждый прогон программы сравнивать текущее время с запомненным, если разница стала превышать, установленное значение в РТ, то таймер завершает свою работы и выдает на выход соответствующее состояние. Поэтому ни кто ни кого не ждет.
Постройте сперва самую простую комбинацию, например TOF_Yellow1(IN:=NOT TOF_Yellow1.Q, PT:=T#5s) без всяких условий и посмотрите как это работает, раскройте в онлайне его внутренности в окне объявлений и понаблюдайте
Capzap, я посмотрел - всё ясно, как устроен TOF TON и т.д. Мягко говоря - непривычно.
Как запустить ОТДЕЛЬНЫЙ таймер, отдельно от программы? Который сам считает свою задержку и независимо от цикла делает то, что ему сказано?
Здесь что, и инструкции в FOR DO будут исполняться не пока FOR сравняется с заданным, а один раз, затем, когда программа прокрутится по кругу - ещё раз?
Непонятно... где объясняется, как выполняется программа и что такое цикл?
Хочу сделать простейшее - по нажатию на кнопку лампа должна включится и погаснуть 10 раз. 2 сек. горит, 3 не горит.
И это должно быть в IF.
Вы хотя бы с одним из этих документов ознакомились? http://www.owen.ru/catalog/codesys_v2/51162335
Бессмысленно объяснять если основ не знаете
Вот и я о том - не понимая, как оно работает в самой своей основе - я не могу правильно им пользоваться.
:(
Ушёл читать. :)
Добрый день, уважаемые коллеги! Имеются порционные весы- один отвес:50кг+-200гр, совсем зациклился-не могу сообразить как организовать суммарный итог веса с нарастанием(суммировать вес порций) на ST, идеи, код, если возможно..
Это понятно, а как формировать этот weight(суммарный вес, что УЖЕ прошел через весы?), весы набрались-разгрузились, а мне надо это значение сохранить и суммировать затем с весом следующей порции итд до бесконечности) тут и с трезвой головой не разберешься!
PS. Утром все получилось, благодаря трезвому совету малопьющего Вольда! ;)
Необходимо засечь время между событиями А и Б (сигналы на дискретные входы).
Если использовать ФБ CurTimeEx то получу два значения, но оба они записаны как структуры, как найти разность между ними или как, например, перевести TimeDate в формат DATE_AND_TIME ?
Нужно с урж2км перевести учёт расхода с помощью плк 100, по протолку модбасу,читал инструкцию не нашел ни в одной,пробовал пример у плк 100..
Плк 100 должен запросить данные по расходу с урж2км,чтоб узнать учёт расхода не могу понять как сделать..
Сapzap, прочитал. Вот такое сделал:
F_TRIGgreen1(CLK:=STARTSTOP , Q=> );
IF F_TRIGgreen1.Q=TRUE THEN
q:=1;
z:=1; (*вспомогательная переменная*)
TOF_Green1.IN:=TRUE;
TOF_Green1.PT:=T#5s; (*можно изменить первоначальную длительность горения*)
TOF_Green1; (*взвожу таймер*)
TOF_Green1.IN:=FALSE;
TOF_Green1; (*запускаю отсчёт таймера*)
TON_Green1.IN:=FALSE;
TON_Green1.PT:=T#0.5S;
TON_Green1; (*обнуляю таймер*)
END_IF
(*теперь надо заставить лампу Green1 зажечься на 0,5с, погаснуть на 0,5с и так 10 раз*)
IF F_TRIGgreen1.Q = TRUE OR z=1 THEN
IF q<=10 THEN
TOF_Green1; (*вызываю таймер чтобы он глянул, как там время; первый раз отсчитывает со строки 8, потом будет со строки 37*)
green1:=TOF_Green1.Q;
IF TOF_Green1.Q=FALSE THEN (* проверяю, окончен ли отсчёт*)
TON_Green1(IN:= TRUE); (*запускаю отсчет негорения*)
green1:=FALSE; (*можно и так - всё равно она не должна гореть в этом месте*)
END_IF
IF (*TOF_Green1.Q=FALSE AND*) TON_Green1.Q=TRUE THEN (* проверяю, кончилось ли время негорения *)
TOF_Green1.IN:=TRUE;
TOF_Green1.PT:=T#0.5s;
TOF_Green1;
TOF_Green1.IN:=FALSE;
TOF_Green1; (*перезапуск таймера периода горения*)
TON_Green1(IN:=FALSE); (*обнуляю таймер негорения*)
q:=q+1; (*увеличиваю счётчик циклов*)
END_IF
END_IF
END_IF (* конец действия ИФ по F_Triggreen1*)
Это работает, но для такой простой задачи - достаточно корявый "код" :)
Никак не могу понять, почему, если я вместо приращаемой каждый цикл переменной q и IF использую While или FOR для отсчета количества циклов - ПЛК перезагружается, а режим эмуляции пишет о WatchDog и зацикливании....
цикл-то должен 5 раз пройти и кончится... причём здесь зацикленность.
потому что программирование контроллеров отличается от программирования на ПК
если программный цикл(for,while) задерживает исполнение очередного цикла плк на время большее чем заданное макс.время циклав настройках конфигуратора, произойдет перегрузка
ЗЫ попробуйте как на картинке