Просмотр полной версии : ВОПРОС-ОТВЕТ (отвечаем на простые вопросы от новичков)
kondor3000
06.02.2025, 09:36
Спасибо большое за подсказку, все еще не проверил, но вроде бы работает. А еще один вопрос, как правильно присвоить тэг биту из 32bit input module. По адресации не очень удобно писать программу получается, под 200 адресов в уме держать.
Пытался сделать так, но выдает ошибку 4024.
IN : DWORD;
IN.0 := KSM7_1;
IN.1 := KSM8_1;
IN.2 := KSM9_1;
IN.3 := KSM10_1;
Потому что вы на вход присваиваете переменную IN.0 := KSM7_1;, а надо в переменную присваивать вход KSM7_1:=IN.0; это распаковка из Маски бит.
IN : DWORD; - объявлять не надо, если имя IN дано 32bit input module.
Адресацию AT%QW.... вообще не надо использовать, достаточно дать имя.
А пример у вас для выхода, там наоборот, на запись собираются биты. Это упаковка бит в Маску.
Я так понимаю как то так должно выглядеть?
про work mode = both
Имеет смысл для устройств "чисто вывода" при наличии на них контроля связи с влиянием на выходы
Для МУ контроль связи это t.out со значением <> 0. Из практики норм 3...6 (сек) (Если 0 - то в both смысла нет)
При сопряжении такого МУ с work mode = both, polling time имеет смысл от 1000 мс (и выше)
Для МВ контроль связи бессмыслен, разве что на его диодик "связь" посмотреть
work mode = both с polling time 100 - неадекват всегда, т.к. выродился в work mode = poll time
Для МУ..МВ/RTU/115200 max timeout >30 - неадекват всегда. Нет ответа через 30 мс - не будет никогда.
In_Da_Cher_A
06.02.2025, 10:23
Потому что вы на вход присваиваете переменную IN.0 := KSM7_1;, а надо в переменную присваивать вход KSM7_1:=IN.0; это распаковка из Маски бит.
IN : DWORD; - объявлять не надо, если имя IN дано 32bit input module.
Адресацию AT%QW.... вообще не надо использовать, достаточно дать имя.
А пример у вас для выхода, там наоборот, на запись собираются биты. Это упаковка бит в Маску.дай ты ему подумать самому :D
"вы и есть за меня будете? - ага!"
Добрый день! Вопрос по синтаксису. Можно присваивать тип переменной таким образомЖ
Var_1,Var_2,Var_n:BOOL;
Кодесис не ругается, но вот можно так делать?
kondor3000
06.02.2025, 13:57
Добрый день! Вопрос по синтаксису. Можно присваивать тип переменной таким образомЖ
Var_1,Var_2,Var_n:BOOL;
Кодесис не ругается, но вот можно так делать?
Можно, поэтому и не ругается.
Stalker46k
06.02.2025, 17:06
отлично. ещё раз - IN- что это за переменная?
подсказка = посмотрите в конфигурацию
если не поняли, приложите скрин конфига
Да, это переменная из конфига, добавил для пробы, забыл удалить.
Потому что вы на вход присваиваете переменную IN.0 := KSM7_1;, а надо в переменную присваивать вход KSM7_1:=IN.0; это распаковка из Маски бит.
IN : DWORD; - объявлять не надо, если имя IN дано 32bit input module.
Адресацию AT%QW.... вообще не надо использовать, достаточно дать имя.
А пример у вас для выхода, там наоборот, на запись собираются биты. Это упаковка бит в Маску.
Да, немного неправильно написал, но и наоборот перед этим пробовал, компилятор все равно ругается.
Сильно не ругайтесь, просто ну не привык я к овену, избалован всякими Сименсами, Шнайдерами и Дельтами. Там присвоение тэгов, да и вообще первоначальная настройка намного проще.
Переделал, все равно на меня ругается компилятор))
81813
Да, это переменная из конфига, добавил для пробы, забыл удалить.
Да, немного неправильно написал, но и наоборот перед этим пробовал, компилятор все равно ругается.
Сильно не ругайтесь, просто ну не привык я к овену, избалован всякими Сименсами, Шнайдерами и Дельтами. Там присвоение тэгов, да и вообще первоначальная настройка намного проще.
Переделал, все равно на меня ругается компилятор))
81813
Верхняя часть окна и, в частности, секции VAR ... END_VAR - для объявления переменных (и начальной инициализации КОНСТАНТАМИ), но никак не для операций присваивания, которые вы пытаетесь выполнить
In_Da_Cher_A
06.02.2025, 17:31
Переделал, все равно на меня ругается компилятор))
81813приложите скрин ВСЕЙ области программы. вместе с верхней частью, где идёт объявление перменных, и нижней, где идёт собственно сам текст.
избалован всякими Сименсами, Шнайдерами и Дельтами.ну как-то странно тогда всё это выглядит :D
вы реально не догоняете, что вы сделали? :D
вам сегодня уже писали про это
kondor3000
06.02.2025, 17:43
Да, это переменная из конфига, добавил для пробы, забыл удалить.
Да, немного неправильно написал, но и наоборот перед этим пробовал, компилятор все равно ругается.
Сильно не ругайтесь, просто ну не привык я к овену, избалован всякими Сименсами, Шнайдерами и Дельтами. Там присвоение тэгов, да и вообще первоначальная настройка намного проще.
Переделал, все равно на меня ругается компилятор))
81813
Это должен быть текст программы или ФБ, вы же написали текст программы в объявлении глобальных переменных.
Вам реально надо посмотреть обучающие видео https://www.youtube.com/watch?v=eSTmoNeLa7A&list=PLznlwtUr2FjoCI7JPJHl7GCJi0DQeV5qx
Stalker46k
06.02.2025, 18:24
Я понял, это получается можно присвоить только программно, я надеялся можно как то через глобальные переменные объявить.
Stalker46k
06.02.2025, 18:25
ну как-то странно тогда всё это выглядит :D
вы реально не догоняете, что вы сделали? :D
Уже догнал, думал проще будет. На сименсе или шнайдере гораздо проще с входами/выходами.
Stalker46k
06.02.2025, 18:41
Вы тёплое и шершавое путаете
Объявить через глобальные - можно.
Присвоить при объявлении тут можно только константу
Даже в сях присвоить при объявлении можно только 1 раз, поэтому не нужно про всякие сименсы и т.д. приплетать
Не понятно, что может быть проще присвоения имени входу/выходу
В сименсе или шнайдере, мне было достаточно в конфиге добавить необходимые блоки расширения и задать тэги входов выходов. И мне остается писать программу. Не нужно было искать какой регистр считывать, какие настройки связи с модулями устанавливать. В Овене лично мне посложнее.
Забыл сказать спасибо всем за подсказки и наставление на путь истинный)
И протоколы там внезапно без настроек связи
Stalker46k
06.02.2025, 18:51
Ну не всем и не всегда необходима связь, мне в 99% случаев необходим шкаф который работает обособленно, а когда необходимо было, на том же шнайдере я использовал Ethernet, с минимальным количеством настроек.
In_Da_Cher_A
06.02.2025, 19:06
в конфиге добавить необходимые блоки расширения и задать тэги входов выходов. а здесь это чем отличается?
те же яйца, только в профиль
в ОВЕНе даже проще - перменная IN сразу глобальная, один раз ввели имя в конфиге и всё, и не надо ничего объявлять специально
и - не надо задавать теги отдельно, в тексте программы идёт прямое обращение к нужному входу или выходу и всё.
Если бы вы не занимались тупой "перекладкой" глобальной переменной в "Имя_переменная", то вообще было бы ещё проще
Stalker46k
06.02.2025, 19:17
а здесь это чем отличается?
те же яйца, только в профиль
в ОВЕНе даже проще - перменная IN сразу глобальная, один раз ввели имя в конфиге и всё, и не надо ничего объявлять специально
и - не надо задавать теги отдельно, в тексте программы идёт прямое обращение к нужному входу или выходу и всё.
Если бы вы не занимались тупой "перекладкой" глобальной переменной в "Имя_переменная", то вообще было бы ещё проще
Так и в других контроллерах она сразу глобальная. А здесь переменная IN это 32 входа, а у меня таких от IN1 до IN4. Мне лично было бы удобнее, если я мог каждому входу сразу присвоить необходимое имя, что бы в момент написания программы, не отвлекаться на поиск по схеме на IN1.15 или на IN2.27 у меня сидит определенный датчик, а так я сразу дал ему имя и меня ничего не отвлекает.
Простите заранее, все таки наверное туплю, но я жутко не люблю возиться с Овеном.
kondor3000
06.02.2025, 19:29
Так и в других контроллерах она сразу глобальная. А здесь переменная IN это 32 входа, а у меня таких от IN1 до IN4. Мне лично было бы удобнее, если я мог каждому входу сразу присвоить необходимое имя, что бы в момент написания программы, не отвлекаться на поиск по схеме на IN1.15 или на IN2.27 у меня сидит определенный датчик, а так я сразу дал ему имя и меня ничего не отвлекает.
Простите заранее, все таки наверное туплю, но я жутко не люблю возиться с Овеном.
Какие проблемы то, в глобальных объявите свои KS1.... KS16: BOOL; , переменная маски IN1 глобальная. соотнесите их в ФБ (или в программе) и пользуйтесь своими KS1.... KS16 в любом месте.
Stalker46k
06.02.2025, 19:37
Какие проблемы то, в глобальных объявите свои KS1.... KS16: BOOL; , переменная маски IN1 глобальная. соотнесите их в ФБ и пользуйтесь своими KS1.... KS15 в любом месте.
Да я это понял уже и сделал, спасибо. Просто получается лишнее действие надо выполнять.
In_Da_Cher_A
06.02.2025, 20:12
А здесь переменная IN это 32 входа, а у меня таких от IN1 до IN4. и что, что 32? у меня сейчас в общей сумме 25 таких "IN" и десяток Out
нравится вам Имя_нарицательное, ну работайте с ним, вы же сами сказали
мне было достаточно в конфиге добавить необходимые блоки расширения и задать тэги входов выходов.в ОВЕНе всё то же самое, только "задать теги входов/выходов" как "Имя_нарицательное" здесь реализовано через присвоение в области VAR, что в общем-то логично - хочешь работай напрямую, хочешь работай с Имя_переменная
если я мог каждому входу сразу присвоить необходимое имя, что бы в момент написания программы, не отвлекаться на поиск по схеме на IN1.15 или на IN2.27 у меня сидит определенный датчик, а так я сразу дал ему имя и меня ничего не отвлекает.забили в VAR присвоение Имя_переменная = IN_номер и вас ничего не отвлекает
Просто получается лишнее действие надо выполнять.
вы просто никак не догоните, что в КДС (а не у ОВЕНа, он-то здесь малость вообще не при делах, что дали с тем и работает)
эта процедура "присвоения Имени" условно может быть выполнена в 2 этапа - объявление Глобальной Переменной в конфиге, и присвоения Имя_переменная=Глобальная.Вход101 в области VAR
вот и всё
поиск по схеме на IN1.15 или на IN2.27 у меня сидит определенный датчикой ну так или иначе мы все ведём какие-то списки входов/выходов, модулей, адресов, регистров и так далее, как удобнее работать, поэтому говорить что в Шнайдере или там где-то ещё прям вот совсем не надо ничего делать - ну вот не надо. Везде надо вести документацию, не хотите на схеме ничего писать, всё равно где-то что-то писать будет надо - на тот же аналог надо писать диапазон, какие-то уставки и прочее
и когда у вас триста четыреста входов выходов, вы так или иначе не запомните все Имя_переменная, даже если вы ас по системам кодификации переменных и всё равно полезете в какой-то "список", который у вас где-то будет "лежать"
А здесь переменная IN это 32 входа, а у меня таких от IN1 до IN4. Мне лично было бы удобнее, если я мог каждому входу сразу присвоить необходимое имя, что бы в момент написания программы, не отвлекаться на поиск по схеме на IN1.15 или на IN2.27 у меня сидит определенный датчик, а так я сразу дал ему имя и меня ничего не отвлекает.
Если тебе удобно длинное чтиво - вот тебе моя статья о том, что ты сейчас делаешь: https://cs-cs.net/technologii-testirovaniya-i-otladky-shhgitov-s-svtomatikoy-na-plk
Тебе нужен заголовок 4 (про IO сигналы). То, о чём ты спрашиваешь, я делаю во всех своих проектах.
Но, к сожалению, да - придётся делать руками: объявить много переменных на разные датчики и руками назначать их через битовые маски. Но один раз за всю программу.
В моей статье есть куча скриншотов и всё-всё описано.
Я даже так же делаю и с выходами, чтобы иметь глобальный сигнал "Включить всё" для проверки всех реле и блоков питания.
В общем-то при помощи нехитрых трюков можно и биты поименовать
81817
Stalker46k
09.02.2025, 15:55
вы просто никак не догоните, что в КДС (а не у ОВЕНа, он-то здесь малость вообще не при делах, что дали с тем и работает)
"
Ну на 210 модули сделали же таргеты, да и ABB лет 15 назад настроил CoDeSys под себя, на PM571 нужно было только скачать с их сайта КДС и там по умолчанию стояли все таргеты и библиотеки.
Если тебе удобно длинное чтиво - вот тебе моя статья о том, что ты сейчас делаешь: https://cs-cs.net/technologii-testirovaniya-i-otladky-shhgitov-s-svtomatikoy-na-plk
Тебе нужен заголовок 4 (про IO сигналы). То, о чём ты спрашиваешь, я делаю во всех своих проектах.
Но, к сожалению, да - придётся делать руками: объявить много переменных на разные датчики и руками назначать их через битовые маски. Но один раз за всю программу.
В моей статье есть куча скриншотов и всё-всё описано.
Я даже так же делаю и с выходами, чтобы иметь глобальный сигнал "Включить всё" для проверки всех реле и блоков питания.
Спасибо, почитал, во многом наши мысли совпадают.
В общем-то при помощи нехитрых трюков можно и биты поименовать
81817
А можно поинтересоваться как?))
Ладно, контроллер и блоки расширения побеждены, программа пишется, даже панель почти побеждена. Вопрос как раз по связи с панелью СП310.
Имеется много битовых сигналов, они работают штатно. А вот передача данных с цифрового ввода не работает, хотя вроде бы все сделал по инструкции. Даже в комментариях номера прописал, что бы не запутаться.
81880
Настройки цифрового ввода панели.
8188181882
Где я опять косячу? Ткните носом пожалуйста.
Регистр это 2 буля, тк буль это байт. Даже надпись что 8битс есть
Зато сименсы, шнайдеры...
Stalker46k
09.02.2025, 16:18
Регистр это 2 буля, тк буль это байт. Даже надпись что 8битс есть
Спасибо, кажется понял, адресация такая должна быть?
81885
kondor3000
11.02.2025, 07:46
Здравствуйте, есть ОВЕН ПЛК63Л РРРРР в котором по заданию руководителя необходимо было сделать управление обогревателем (пока одним). Прогу написал, датчик температуры подключил и проверил что все работет. Но есть одно НО! Нужно сделать отображение текущей температуры в главном окне ЖКИ овен плк63. Сейчас там пустота. При включении плк высвечивается вперва Э, потом название ОВЕН, потом пустой экран. Если нажать на кнопку Ввод, то переходим в меню ПЛК63. Как настроить этот пустой основной экран на показания чего либо? Нашел здесь примеры с выводом информации на ЖКИ, но при скачивании переходит на какой то сайт Kipshop который не открывается.
Первый же пример на сайте Овен для ПЛК63-73, это вывод на экране ЖКИ https://owen.ru/product/codesys_v2/example_program
Доброе утро! Вопрос по синтаксису и не только.Необходимо передать СП310 время отработки таймера ТОН.
обявляю тай мер: TON_1:TON;
загружаю : TON_1(IN:=Var_1 , PT:=T#10S , Q=> , ET=> );
Таймер работает и к нему вопросов нет. Создаю переменную для трансляции времени таймера в панель : V310_TON_1_DISPLEI:BYTE;
Терерь настраиваю в ресурсах ПЛК регистр вывода: 81934, 81935
Делаю настройку цифроого дисплея в панеле : 81936 , 81937
В ПЛК добавляю преобразования :
V310_TON_1_DISPLEI:=TIME_TO_BYTE (TON_1.ET);
И не работает. Никогда этого не делал вот и прошу меня поправить. Спасибо.
Регистр input модуле
“настраиваю.. . регистр вывода... "
А, надо OUTPUT? сейчас исправлю
Задам тупые вопросы:
1. Почему время в байты? Обычное TIME - это DWORD, который хранит число МиллиСекунд. В один байт оно не влезет.
Может быть, тебе стоит поделить время до какого-то более крупного значения.
Например, можно так:
* TIME_TO_DWORD(TON_1.ET) / 1000 = Секунды
* TIME_TO_DWORD(TON_1.ET) / (1000 * 60) = Минуты
2. Modbus передаёт WORD. Поэтому полученный результат надо явно перевести в тип WORD
DWORD_TO_WORD(TIME_TO_DWORD(TON_1.ET) / 1000)
3. Судя по скриншотам конфигурации ПЛК ты даёшь команду ЧТЕНИЯ из панели (потому что Input Module - это прочитать ИЗ чего-то в ПЛК).
Если панель Slave - то тебе нужен наоборот: Register Output Module.
4. И ещё не забудь, что иногда важен порядок регистров или байт.
Вот, данные начали ипередаваться в панель, только они там скачут между 0 и 250, и когда таймер останавливаеться там выводится цифра 16. Может надо использовать REAL а не BYTE?
CS_Cs, это не вы задаете тупые опросы а увы я, не хватает знаний вот такие вопросы и генерирую..
Назревает новый проект, где придется одним промышленным компьютером(ПК) управлять двумя ПЛК110-60[M02] (Slave) по Modbus TCP. Будут всего два шкафа. В одном шкафу расположится ПК и ПЛК110-60, а в другом только один ПЛК110-60. Расстояние между шкафами 4-7 метров. Подскажите, какой простой (не дорогой) неуправляемый коммутатор можно использовать для подобной сети взаимодействия по Ethernet? Или имеются особенности для ПЛК ОВЕН?
VSA, я использовал овеновский неуправляемый комутатор между ПЛК и Скадой на компе, 100 метров, 1 год полет нормальный
CS_Cs, это не вы задаете тупые опросы а увы я, не хватает знаний вот такие вопросы и генерирую..Ну вот щас точно ясно, что скачки значений из-за того, что ты байт передаёшь. Но REAL не надо тоже.
Меня смутил Register Input module тогда: вдруг я чего-то не знаю и не в курсе, и там какой-то сложный случай.
PS. Если панель - Master, то у меня есть удобный способ передать весь Slave через красивую структуру. Во, тут писал: https://cs-cs.net/codesys-modbus-karta-registrov-struktury (для будущих проектов может сгодиться)
Cs-Cs благодарю, выполнил Ваши рекомендации и все заработало:o
to VSA
Если ПК будет "управлять" 2мя ПЛК, зачем ПЛК?
Это система распределенного управление гальваническим оборудованием. Тут и шесть автооператоров, две передаточные тележки, водяные клапаны, сушильная камера, выпрямители и т.д. Много приходится анализировать дискретных входом и выходов. Мы этими вопросами занимаемся много лет. Но на оборудовании ОВЕН только с 2022 года. Поэтому и возникают вопросы. У нас в проекте нет ни оптики, ни 1000 Мбит. Так что на счет неуправляемого свитча? Какой можно поставить для ПЛК110-60? Хотелось бы в пределах 1000 руб. максимум.
Это система распределенного управление гальваническим оборудованием. Тут и шесть автооператоров, две передаточные тележки, водяные клапаны, сушильная камера, выпрямители и т.д. Много приходится анализировать дискретных входом и выходов. Мы этими вопросами занимаемся много лет. Но на оборудовании ОВЕН только с 2022 года. Поэтому и возникают вопросы. У нас в проекте нет ни оптики, ни 1000 Мбит. Так что на счет неуправляемого свитча? Какой можно поставить для ПЛК110-60? Хотелось бы в пределах 1000 руб. максимум.
А модули расширения? Нет? Не устраивают?
Это система распределенного управление гальваническим оборудованием. Тут и шесть автооператоров, две передаточные тележки, водяные клапаны, сушильная камера, выпрямители и т.д. Много приходится анализировать дискретных входом и выходов. Мы этими вопросами занимаемся много лет. Но на оборудовании ОВЕН только с 2022 года. Поэтому и возникают вопросы. У нас в проекте нет ни оптики, ни 1000 Мбит. Так что на счет неуправляемого свитча? Какой можно поставить для ПЛК110-60? Хотелось бы в пределах 1000 руб. максимум.
Никаких особенных требований к свичу для ПЛК нет.
Можно и за тыщу найти - но тут вопрос надёжности (в основном источника питания)
Cs-Cs благодарю, выполнил Ваши рекомендации и все заработало:oПожалуйста!
А модули расширения? Нет? Не устраивают?
Модули расширения для каждого ПЛК обязательно будут. Кроме этого дополнительные каналы RS-485 будут задействованы на каждом ПЛК. Но нас интересует быстродействие системы. У нас автооператоры на высоких скоростях перемещаются вдоль линии, а позиционирование осуществляется бесконтактными датчиками. Если все нагрузить на один ПЛК, то программа будет очень большая, а это увеличение длительности цикла опроса датчиков. Есть вероятность, что автооператоры могут на высокой скорости проезжать позиции остановки. Да и такая распределенная система управления сокращает расход "меди" на коммутационные линии. Электрические проводники становятся короче, а это, порой, и уменьшает наводимые помехи. Ведь наша СУ использует много частотных преобразователей для приводов автооператоров. И работают эти приводы на разных частотах в зависимости от ситуации. Вот такая система.
In_Da_Cher_A
12.02.2025, 19:47
Модули расширения для каждого ПЛК обязательно будут. Кроме этого дополнительные каналы RS-485 будут задействованы на каждом ПЛК. Но нас интересует быстродействие системыкакой системы? у вас куча разнопланового оборудования, при этом вы требуете скорость, непонятно только кто или чего эту скорость должен обеспечить
Да я уже понял. Нашел у ОВЕН неплохой хаб.
какой системы? у вас куча разнопланового оборудования, при этом вы требуете скорость, непонятно только кто или чего эту скорость должен обеспечить
Быстродействие необходимо для ПЛК при опросе дискретных датчиков позиционирования, когда над ними перемещается автооператор на высокой скорости. Мы подобные системы неоднократно делали, правда, не на ОВЕНовских ПЛК.
Вопрос по оптимизации кода программы.
По задаче мне нужно cчитывать значения одноименного регистра (153) по Modbus из четырех Slave устройств и записывать эти значения в регистры (36-39) Slave устройства ПЛК110 для дальнейшей передачи их по TCP в ПК.
Можно было в программе записать просто:
wTok_Real_Pult_1 := wTok_Real_Pult_1_In; (* Reg 153 Slave 1 записывается в 36 регистр ПЛК*)
wTok_Real_Pult_2 := wTok_Real_Pult_2_In; (* Reg 153 Slave 2 записывается в 37 регистр ПЛК*)
wTok_Real_Pult_3 := wTok_Real_Pult_3_In; (* Reg 153 Slave 3 записывается в 38 регистр ПЛК*)
wTok_Real_Pult_4 := wTok_Real_Pult_4_In; (* Reg 153 Slave 4 записывается в 39 регистр ПЛК*)
Т.к. эти значения имеют чисто информационный характер для оператора, работающего на этой СУ, то я решил не загружать процессор ПЛК этой операцией на каждом цикле работы контроллера, а ввел цикличность опроса. Каждые 4 сек. происходит опрос этих четырех регистров. Например, как на этом фрагменте. Для цикличноcти опросов я использовал 2 таймера TON:
(* Опрос регистров 153 (фактического тока выпрямителей) Slave1-4 каждые 4 сек.*)
(* wTok_Real_Pult_1 регистр 36 Master PLC *)
(* wTok_Real_Pult_2 регистр 37 Master PLC *)
(* wTok_Real_Pult_3 регистр 38 Master PLC *)
(* wTok_Real_Pult_4 регистр 39 Master PLC *)
(* Регистры 36-39 будут читаться по TCP внешним ПК *)
Pausa_Opros1(IN:=NOT Opros,PT:=T#2s); (* Пауза 2 сек *)
IF Pausa_Opros1.Q THEN (* Это место отрабатывается один раз за 4 сек! *)
wTok_Real_Pult_1 := wTok_Real_Pult_1_In; (* Регистр 153 Slave 1 *)
wTok_Real_Pult_2 := wTok_Real_Pult_2_In; (* Регистр 153 Slave 2 *)
wTok_Real_Pult_3 := wTok_Real_Pult_3_In; (* Регистр 153 Slave 3 *)
wTok_Real_Pult_4 := wTok_Real_Pult_4_In; (* Регистр 153 Slave 4 *)
Opros := TRUE;
END_IF
Pausa_Opros2(IN:=Opros,PT:=T#2s); (* Пауза 2 сек *)
IF Pausa_Opros2.Q THEN
Opros := FALSE;
END_IF
Все свои программы в контроллерах я стараюсь выполнять за минимальное время цикла процессора, т.к. приходится оперативно анализировать состояние дискретных входов, по которым осуществляется позиционирование движущихся автооператоров по рельсам.
Интуитивно, понимаю, что работающий таймер тоже отвлекает процессор на каждом цикле. Но все же вопросы:
1. ”Игра стоит свеч”?
2. Как можно проще реализовать приведённый мною фрагмент? Возможно с использованием BLINK.
kondor3000
16.02.2025, 10:19
Если в этом нет необходимости, то это всё вообще не нужно, пишите в регистры постоянно, выиграть ничего не получится, только ненужные таймеры добавили.
А вот читать и записывать регистры в мастере надо группой, про String уже писал.
Если же так нужно, то наличие 2 таймеров, никак не замедлит программу.
МихаилГл
16.02.2025, 10:24
Если опрашиваете не самописной программой, а средствами плк, то вроде он сам постоянно опрашивает регистры... А тут вы только в самой программе просто пытаетесь раз в несколько секунд присвоить значения этих уже несколько раз считанных контроллером регистров какой то переменной... Или я не прав?
Это имело бы смысл, если чтение регистров выполнялось с использованием библиотеки. А если сконфигурирован Polling 100ms, то чтение будет 10 раз/сек. Поставьте Polling 4000ms на эти регистры.
Это имело бы смысл, если чтение регистров выполнялось с использованием библиотеки. А если сконфигурирован Polling 100ms, то чтение будет 10 раз/сек. Поставьте Polling 4000ms на эти регистры.
А это интересно. Но параметр Polling Time распространяются на весь UMD, а там имеются регистры, которые необходимо читать гораздо чаще. Значит, этот подход не совсем корректен для моей задачи.
Если в этом нет необходимости, то это всё вообще не нужно, пишите в регистры постоянно, выиграть ничего не получится, только ненужные таймеры добавили.
А вот читать и записывать регистры в мастере надо группой, про String уже писал.
Если же так нужно, то наличие 2 таймеров, никак не замедлит программу.
Давно хотел работать с групповой записью. Напомните ссылкой место, где можно подробнее изучить этот режим. Но для формирования строки, которую в дальнейшем нужно отправить в рядом расположенные регистры, необходимо сформировать. А это дополнительные операции. А это дополнительное время. Или я ошибаюсь?
kondor3000
16.02.2025, 14:16
Давно хотел работать с групповой записью. Напомните ссылкой место, где можно подробнее изучить этот режим. Но для формирования строки, которую в дальнейшем нужно отправить в рядом расположенные регистры, необходимо сформировать. А это дополнительные операции. А это дополнительное время. Или я ошибаюсь?
Вот ссылка чтения, записи через String.
https://owen.ru/forum/showthread.php?t=22915&page=39&p=244022&viewfull=1#post244022
Несколько строк присвоения, никак не повлияют на длительность цикла программы, кроме того разложить по массивам переменные (если их много) можно, например циклом FOR
Пример чтения 7 модулей 8АС и отправки всего в слейв https://owen.ru/forum/showthread.php?t=10555&page=987
Для эмуляции с предустановленными значениями https://owen.ru/forum/showthread.php?t=10555&page=988#9875
А можно для ПЛК11-60М на один порт RS-484 закрепить несколько UMD с одним и тем же ModuluSlaveAddress, но с разными параметрами Polling time?
Было бы не плохо таким образом не перегружать Modbus частыми опросами. Например, в моем случае, для одного внешнего устройства несколько регистров чтения (101 и 103) в одном UMD имеют Polling time=200 ms, а регистр (153) в другом UMD Polling time=4000 ms. И тогда код программы в ПЛК не нужно нагружать искусственными задержками опроса регистров внешнего устройства. Или это все так не работает?
Можно. Я тоже так делаю. Есть процессы, параметры которых меняются очень медленно. Нет смысла считывать их очень часто. А есть, наоборот, надо чаще.
А можно для ПЛК11-60М на один порт RS-484 закрепить несколько UMD с одним и тем же ModuluSlaveAddress, но с разными параметрами Polling time?
Было бы не плохо таким образом не перегружать Modbus частыми опросами. Например, в моем случае, для одного внешнего устройства несколько регистров чтения (101 и 103) в одном UMD имеют Polling time=200 ms, а регистр (153) в другом UMD Polling time=4000 ms. И тогда код программы в ПЛК не нужно нагружать искусственными задержками опроса регистров внешнего устройства. Или это все так не работает?
Где-то это может быть оправдано, но если доразберётесь с групповыми запросами через string, то может и не понадобится это.
А как вы хотели делать "искусственные задержки"?
Где-то это может быть оправдано, но если доразберётесь с групповыми запросами через string, то может и не понадобится это.
А как вы хотели делать "искусственные задержки"?
Пока с групповыми запросами я еще не разбирался, возможно Вы правы. Но для редко опрашиваемых регистров я и предложил отдельный UND c большим Polling time, а для часто опрашиваемых регистров Polling time имеет маленькое значение. А "искусственную задержку" я бы осуществлял обычными таймерами TON. Но они в таком случае не потребуются. О чем и был вопрос. EFrol положительно ответил. Возьму на вооружение.
Иногда надо и реже 1-го раза в 10 секунд. Тогда можно использовать режим "По команде". Я опрашиваю так кристаллизаторы 1 раз каждые 4 минуты. https://owen.ru/uploads/373/plc1xx_plcconfiguration_v2.0.pdf
81998
А если представить, что один ПЛК110-60 управляет несколькими цехами одновременно:
81999
то используются все доступные средства.
И в полне себе работает. Вот уже лет 8.
Иногда надо и реже 1-го раза в 10 секунд. Тогда можно использовать режим "По команде". Я опрашиваю так кристаллизаторы 1 раз каждые 4 минуты. https://owen.ru/uploads/373/plc1xx_plcconfiguration_v2.0.pdf
81998
А если представить, что один ПЛК110-60 управляет несколькими цехами одновременно:
81999
то используются все доступные средства.
И в полне себе работает. Вот уже лет 8.
Спасибо за ответ. Учту в своих изысканиях.
Последняя иллюстрация достойная рамки и на стену! Класс!!!
Сразу не бросайте тапки. Что-то никак не могу придумать реализацию T-триггера на языке ST. Был бы оператор GOTO, то мог бы смоделировать, этого оператора в ST нет.
Представьте, имеются переменные IN, OUT : BOOL. Как сделать так, чтобы после первого сигнала на IN (TRUE) выставилось TRUE на OUT, а после следующего TRUE на IN должен появится сигнал FALSE на OUT и т.д. Короче, обычный T-триггер. Перебрал триггеры: RS, SR, F_TRIG и R_TRIG, но ничего красивого не выходит. Если можно, подскажите.
Сразу не бросайте тапки. Что-то никак не могу придумать реализацию T-триггера на языке ST. Был бы оператор GOTO, то мог бы смоделировать, этого оператора в ST нет.
Представьте, имеются переменные IN, OUT : BOOL. Как сделать так, чтобы после первого сигнала на IN (TRUE) выставилось TRUE на OUT, а после следующего TRUE на IN должен появится сигнал FALSE на OUT и т.д. Короче, обычный T-триггер. Перебрал триггеры: RS, SR, F_TRIG и R_TRIG, но ничего красивого не выходит. Если можно, подскажите.
помимо стандартной библиотеки есть еще oscat, там представлены всевозможные триггеры
Сразу не бросайте тапки. Что-то никак не могу придумать реализацию T-триггера на языке ST. Был бы оператор GOTO, то мог бы смоделировать, этого оператора в ST нет.
Представьте, имеются переменные IN, OUT : BOOL. Как сделать так, чтобы после первого сигнала на IN (TRUE) выставилось TRUE на OUT, а после следующего TRUE на IN должен появится сигнал FALSE на OUT и т.д. Короче, обычный T-триггер. Перебрал триггеры: RS, SR, F_TRIG и R_TRIG, но ничего красивого не выходит. Если можно, подскажите.
Нужна внутренняя переменная, чтобы выделять фронт на входе. По входному фронту инвертируйте значение выхода
Нужна внутренняя переменная, чтобы выделять фронт на входе. По входному фронту инвертируйте значение выхода
Спасибо за наводку!
Пошло!
Front_R(CLK:=IN);
IF Front_R.Q THEN
OUT := NOT OUT;
END_IF
Не додумался до NOT
vsa Тебе нужен R_TRIG, который ты поставишь на вход импульсов, чтобы он отрабатывал ОДИН раз, когда на входе TRUE.
А потом пишешь банально так: OUT := NOT OUT;
(всё-таки накидал код)
FUNCTION_BLOCK T_TRIG
(* Copyright © 2024 Cs-Cs.Net Laboratory & Studio https://cs-cs.net *)
VAR_INPUT
Trig : BOOL := FALSE;
END_VAR
VAR_OUTPUT
Out : BOOL := FALSE;
END_VAR
VAR
fbRTrig : R_TRIG;
END_VAR
fbRTrig(CLK:= Trig);
IF (fbRTrig.Q) THEN
Out := NOT Out;
END_IF
kondor3000
18.02.2025, 10:33
Спасибо за наводку!
Пошло!
Не додумался до NOT
Это делается вообще без R_Trig
if In and not M then Q:=not Q; end_if // Где M промежуточная переменная
M:=In;
Спасибо за наводку!
Пошло!
Front_R(CLK:=IN);
IF Front_R.Q THEN
OUT := NOT OUT;
END_IF
Не додумался до NOT
Я вообще не говорил про R_TRIG - kondor уже написал
Это делается вообще без R_Trig
if In and not M then Q:=not Q; end_if // Где M промежуточная переменная
M:=In;
"О сколько нам открытий чудных ..."
А это проще. Спасибо!
Это делается вообще без R_Trig
и даже без IF
Q := Q xor (IN and not M)
M := IN
и даже без IF
Q := Q xor (IN and not M)
M := IN
А я ожидал Ваш ответ. Это, наверное, и есть Булева модель Т- триггера. Возможно и ошибаюсь. Спасибо.
Проблема с ПЛК 73. Почему-то modbus возвращает функцию на чтение регистра сам в себя. На картинке normal_receive нормальный ответ от устройства, а на картинке это фукнция modbus, которая идет от ПЛК к устройству. Из-за этого данные скачут, вне зависимости от проверок. 820778207882079
Проблема с ПЛК 73...
С кодом.
Попробуйте самостоятельно выяснить назначение флага "Complete"
Писал код по примеру от разработчиков к библиотеке Modbus. Сам заметил что флаг complete не устанавливается. Но, к сожалению, не могу понять почему. Можете, пожалуйста, подсказать как он работает или указать на какой-либо пример?
С кодом.
kondor3000
21.02.2025, 13:32
Писал код по примеру от разработчиков к библиотеке Modbus. Сам заметил что флаг complete не устанавливается. Но, к сожалению, не могу понять почему. Можете, пожалуйста, подсказать как он работает или указать на какой-либо пример?
В любом примере чтения на ST по Модбас для ПЛК63-73, 82106
10) Обмен через библиотеки Modbus и OwenNet https://owen.ru/product/codesys_v2/example_program
Вы же просто всё выкинули.
kondor3000, а что Вы вкладываете в "признак завершения операции"? Это успешная операция по передачи данных по Modbus? Если да, то как Вы это отслеживаете? Это анализ регистра "Last error"?
.. что Вы вкладываете в "признак завершения операции"? Это успешная операция по передачи данных по Modbus? Если да..
Если нет.
Ты пошёл за свежим хлебом и ты его всегда купишь? Других вариантов нет? Думай.
И ЛастЕррор зачем здесь приплели?
Если нет.
Ты пошёл за свежим хлебом и ты его всегда купишь? Других вариантов нет? Думай.
И ЛастЕррор зачем здесь приплели?
Снимаю вопрос из-за не корректно поставленного мною вопроса и настроя специалистов.
Отлаживаю программу. Впервые начал использовать "Менеджер просмотров". Вещь оказалась удобная. Можно в одном окне собрать актуальные для отладки переменные программы. Но появился вопрос. Почему когда я вношу в "Менеджер просмотров" регистры от Modbus (slave)[VAR] и хочу изменить их значение, то после изменения в программе эти новые значения не появляются. А если изменяешь значение в регистре непосредственно в окне "Конфигурация ПЛК" , то все изменяется, как положено. На фото указываю конкретный регистр. Я полдня просидел с это непоняткой. Думал, что ошибка в программе.
82153
Подскажите, в чем может быть причина?
kondor3000
24.02.2025, 13:14
Снимаю вопрос из-за не корректно поставленного мною вопроса и настроя специалистов.
Отлаживаю программу. Впервые начал использовать "Менеджер просмотров". Вещь оказалась удобная. Можно в одном окне собрать актуальные для отладки переменные программы. Но появился вопрос. Почему когда я вношу в "Менеджер просмотров" регистры от Modbus (slave)[VAR] и хочу изменить их значение, то после изменения в программе эти новые значения не появляются. А если изменяешь значение в регистре непосредственно в окне "Конфигурация ПЛК" , то все изменяется, как положено. На фото указываю конкретный регистр. Я полдня просидел с это непоняткой. Думал, что ошибка в программе.
Подскажите, в чем может быть причина?
А вы в программе пробовали менять числа в переменных? Там точно так же впрямую не поменяешь.
Для применения изменений надо нажать Ctrl +F7
Так же надо понимать, что не все переменные могут быть изменены, а только доступные к изменению.
А вы в программе пробовали менять числа в переменных? Там точно так же впрямую не поменяешь.
Для применения изменений надо нажать Ctrl +F7
Так же надо понимать, что не все переменные могут быть изменены, а только доступные к изменению.
Большое спасибо! Я понял свою ошибку. Действительно, я не нажимал Ctrl +F7 после изменения значения в переменной. Меня подкупило, что появлялось окно со старым, новым значением и кнопкой "Ok" и "Отмена". Думал что это окошко окончательно прописывает значение в переменную.
Вы же просто всё выкинули.
Оставил как в примере, но флаг complete не встает все равно.8215882159
Данные сыпятся в буфер, но постоянно проскакивает запрос в сам UPS, который мы отправляем в UPS.
команда, которую мы отправляем с ПЛК: :010300010050AB
И она время от времени, без какой-либо переодичности и системности вываливается в буфер и из-за этого данные иногда проваливаются. Пытался добавить проверку на значение кол-ва данных в буфере, который возвращает UPS. По типу: :0103A008...., шде А0 это кол-во данных и стояла такая проверка IF BUFFER[2] =16#A0 THEN..., но не помогло.
Оставил как в примере, но флаг complete не встает все равно.8215882159
Данные сыпятся в буфер, но постоянно проскакивает запрос в сам UPS, который мы отправляем в UPS.
Не могу еще понять, по какому принципу этот флаг complete устанавливается в принципе. Нигде в документации, которую я читал, об этом ни слова.
Не могу еще понять, по какому принципу этот флаг complete устанавливается в принципе. Нигде в документации, которую я читал, об этом ни слова.
откройте библиотеку как проект и посмотрите при каких обстоятельствах поднимается флаг 82161
Зачем что-то открывать?
"Complete: BOOL; (*если = TRUE, обмен завершен*)"
Это ж на суахили?
Зачем что-то открывать?
Это ж на суахили?
на моем скрине 0003 и 0027 строки, текст разный, возможно прочитав комменты ко всем записям у вопрошающего сложится мнение для чего это всё
на моем скрине 0003 и 0027
А зачем на это смотреть?
Подсоединили к проекту - и смотрите объявления
Вы чтоб посмотреть уровень топлива разбираете топливную систему?
Смотрите на объявления - строка 6. Там по-русски.
kondor3000
24.02.2025, 16:25
Не могу еще понять, по какому принципу этот флаг complete устанавливается в принципе. Нигде в документации, которую я читал, об этом ни слова.
Вот скрин чтения регистров, Complete очень редко промаргивает, в буфере значения прыгают, а значения переменных стоят 82165
Чтение переменных INT (WORD) и FLOAT разнесены по шагам CASE. Так же по шагам, надо разнести запись и чтение.
...Complete очень редко промаргивает,...
Ну емаё же.
Человек не колибри - он не может в принципе увидеть процесс длительностью 1..3мс (1 цикл)
Промаргивает не Complete, а какое-то эхо отображающее значение переменной между циклами опроса ПЛК самим КДС (винда еще тупит перекрашивая квадратик)
О факте работы complete можно узнать или вставив брекпоинт, или как о "черной дыре" только косвенным путем - вставив там счетчик (например)
В предстоящем проекте систему управления придется разносить в два шкафа. В одном шкафу ПЛК110-60 и два модуля расширения, а во втором шкафу два модуля расширения (МУ110-224.16Р и МВ11-224.16ДН). Связь по RS-485. Расстояние между шкафами 8-10 метров. До этого у меня не было опыта работы с удаленными модулями расширения на такое расстояние. Вопрос: потянет ли скорость 115200 bod для такого расстояния? Ведь мне придет программировать (настраивать) модули расширения до установки их в шкаф. Или скорость нужно опустить до 57600 bod?
kondor3000
25.02.2025, 16:00
В предстоящем проекте систему управления придется разносить в два шкафа. В одном шкафу ПЛК110-60 и два модуля расширения, а во втором шкафу два модуля расширения (МУ110-224.16Р и МВ11-224.16ДН). Связь по RS-485. Расстояние между шкафами 8-10 метров. До этого у меня не было опыта работы с удаленными модулями расширения на такое расстояние. Вопрос: потянет ли скорость 115200 bod для такого расстояния? Ведь мне придет программировать (настраивать) модули расширения до установки их в шкаф. Или скорость нужно опустить до 57600 bod?
Витая пара с экраном и можно оставить 115200. При наличии частотников, ещё и резисторы 120 Ом.
В предстоящем проекте систему управления придется разносить в два шкафа. В одном шкафу ПЛК110-60 и два модуля расширения, а во втором шкафу два модуля расширения (МУ110-224.16Р и МВ11-224.16ДН). Связь по RS-485. Расстояние между шкафами 8-10 метров. До этого у меня не было опыта работы с удаленными модулями расширения на такое расстояние. Вопрос: потянет ли скорость 115200 bod для такого расстояния? Ведь мне придет программировать (настраивать) модули расширения до установки их в шкаф. Или скорость нужно опустить до 57600 bod?
У меня работает и на 115200 baud без проблем. Даже до 50м без терминальных 120 Ом. Используется МКЭШ 2x0.5
82193
...Расстояние .. 8-10 метров. ... не было опыта работы с удаленными модулями расширения на такое расстояние...потянет ли скорость 115200 bod..
Даже не парьтесь пока сотнями метров не придется заморочится. А такое будет редко.
Смотрите не расстояния а окружающие условия (как сказал выше kondor3000 - частотники и т.п.)
Витая пара с экраном и можно оставить 115200. При наличии частотников, ещё и резисторы 120 Ом.
Частотников будет много ( 9 шт.) В первом шкафу с ПЛК110 будет 5 частотников (1.5 кВт 380В), а во втором шкафу 4 частотника. Частотники без выходных фильтров. А резистор вешать у дальнего модуля?
Ну и каким боком тут расстояния?
Вы из шляпы дальше что достанете — сварочный от розетки на шкафу?
kondor3000
25.02.2025, 17:43
Частотников будет много ( 9 шт.) В первом шкафу с ПЛК110 будет 5 частотников (1.5 кВт 380В), а во втором шкафу 4 частотника. Частотники без выходных фильтров. А резистор вешать у дальнего модуля?
Резисторы ставят на концах линии, у ПЛК и последнего модуля.
По хорошему, частотники надо разделить с оборудованием, хотя бы металлическими полками. Проводить измерительные линии и линии связи надо в экранах и отдельно от силовых кабелей.
А ещё лучше разнести по разным шкафам. Шкафы заземлить.
Добрый день, вот растолкуйте, такие вопросы возникают.
У меня ABZ-энкодер на котором написано 1000 имп/об. (самого энкодера у меня пока нет). Я подключаю его к ПЛК110, a b Z на первые 3 быстрых входа (как положено), в конфигурации выбираю Fast Z-Enkoder. На входе IW0.0 должно приходить некое значение типа WORD.
Вот и 1-й вопрос: «Что показывает значение на входе IW0.0? (это кол-во импульсов приходящих с энкодера, это сумма импульсов с накоплением?)» И 2-й вопрос: «Какое значение будет у меня на входе IW0.0, когда энкодер совершит 1 оборот?» (почитал форумы и пришел к выводу, что это число не будет равно 1000, а подскажите сколько точно ?)
4000 на оборот
https://upload.wikimedia.org/wikipedia/commons/thumb/9/9b/%D0%A1%D1%87%D0%B5%D1%82%D1%87%D0%B8%D0%BA_%D0%B8% D0%BC%D0%BF%D1%83%D0%BB%D1%8C%D1%81%D0%BE%D0%B2_%D 1%80%D0%B5%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B2%D0% BD%D1%8B%D0%B9_%D1%80%D0%B5%D0%B6%D0%B8%D0%BC_%D1% 80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B.jpg/1280px-%D0%A1%D1%87%D0%B5%D1%82%D1%87%D0%B8%D0%BA_%D0%B8% D0%BC%D0%BF%D1%83%D0%BB%D1%8C%D1%81%D0%BE%D0%B2_%D 1%80%D0%B5%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B2%D0% BD%D1%8B%D0%B9_%D1%80%D0%B5%D0%B6%D0%B8%D0%BC_%D1% 80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B.jpg
Канал покажет накопленные до отметки Z. После Z будет 0. Т.е. за 3999 будет 0. Если вращение в обратную то до 0 и сразу 3999.
RaisinMGN
28.02.2025, 19:11
Добрый день, форумчане. При ознакомлении с описанием модуля МВ210-221 возник первый вопрос: "Важна ли батарейка для нормальной работы модуля или она только влияет на питание часов реального времени (ее можно не менять)?"
В руководстве по модулю указана следующая информация:
"8.2 Батарея
В приборе используется сменная батарея типа CR2032. Батарея предназначена для питания часов реального времени. Если заряд батареи опускается ниже 2 В, то индикатор "Авария" засвечивается на 100 мс один раз в две секунды. Такое свечение индикатора сигнализирует о необходимости замены батареи. Если напряжение батареи часов реального времени меньше 1,6 В, то запись конфигурационных параметров выполняется во флеш-память модуля.
Порядок записи конфигурационных параметров при разряженной батарее:
1. Новые значения конфигурационных параметров записываются в батарейный ОЗУ около 5 секунд.
2. Из батарейного ОЗУ значения конфигурационных параметров переносятся во флеш-память и
запускается таймаут не менее 2 минут (в зависимости от нагрузки на модуль).
ПРИМЕЧАНИЕ
Состояния батареи обновляется после подачи питания или по истечении 12 часов с момента подачи питания.
ПРЕДУПРЕЖДЕНИЕ
Не рекомендуется выполнять циклическую запись конфигурационных параметров в случае разряда батареи. Ресурс флеш памяти ограничен."
Второй вопрос: "При нормальной работе модуля и при должном напряжении питания батареи конфигурационные параметры хранятся для работы модуля в ОЗУ и при их изменении через OWEN configurator они изменяются в ОЗУ?"
Третий вопрос: "Что является конфигурационными параметрами? Все настройки Owen configuratora?"
kondor3000
28.02.2025, 19:30
Состояния батареи обновляется после подачи питания или по истечении 12 часов с момента подачи питания.
ПРЕДУПРЕЖДЕНИЕ
Не рекомендуется выполнять циклическую запись конфигурационных параметров в случае разряда батареи. Ресурс флеш памяти ограничен."
Второй вопрос: "При нормальной работе модуля и при должном напряжении питания батареи конфигурационные параметры хранятся для работы модуля в ОЗУ и при их изменении через OWEN configurator они изменяются в ОЗУ?"
Третий вопрос: "Что является конфигурационными параметрами? Все настройки Owen configuratora?"
Думаете, если несколько раз напишите, быстрее ответ получите? https://owen.ru/forum/showthread.php?t=27933&p=458443&viewfull=1#post458443
Лучше в тех поддержку напишите.
4000 на оборот
https://upload.wikimedia.org/wikipedia/commons/thumb/9/9b/%D0%A1%D1%87%D0%B5%D1%82%D1%87%D0%B8%D0%BA_%D0%B8% D0%BC%D0%BF%D1%83%D0%BB%D1%8C%D1%81%D0%BE%D0%B2_%D 1%80%D0%B5%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B2%D0% BD%D1%8B%D0%B9_%D1%80%D0%B5%D0%B6%D0%B8%D0%BC_%D1% 80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B.jpg/1280px-%D0%A1%D1%87%D0%B5%D1%82%D1%87%D0%B8%D0%BA_%D0%B8% D0%BC%D0%BF%D1%83%D0%BB%D1%8C%D1%81%D0%BE%D0%B2_%D 1%80%D0%B5%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B2%D0% BD%D1%8B%D0%B9_%D1%80%D0%B5%D0%B6%D0%B8%D0%BC_%D1% 80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B.jpg
Канал покажет накопленные до отметки Z. После Z будет 0. Т.е. за 3999 будет 0. Если вращение в обратную то до 0 и сразу 3999.
Спасибо, все понял, прямо по полочкам. Вот возник еще по ходу вопросик, если я от 3-го быстрого входа откину Z метку, т.е. подключу только А и В фазы, то в этом случае счет будет идти до 65535 (макс значение для типа Word), а за ним будет уже 0 и снова по нарастающей до 65535, верно, или ошибаюсь? Или просто счет остановится на максимальном числе и дальше не будет меняться?
P.S. Тут еще родилась мысль. А можно ли использовать 3-й вход для сброса(обнуления) показаний энкодера. То есть, подключить вместо Z метки на 3-й вход сигнальный провод и в нужный мне момент подавать на него импульс, как будто сработала метка Z, и при этом значение на входе IW0.0 станет равным 0? Вроде логично и выглядит просто, но может есть подвох и так не возможно сделать?
Буду благодарен за разъяснения.
Значение в канале - это номер позиции. Это значение обнуляется всегда, когда приходит фронт на вход Z или когда позиция накапливает значение Range.
Получается если событие-Z не наступит, то сброс произойдет по Range, и на оборот.
Дойдет ли канал до 65535 сказать не могу. Возможно при Range = 0.
Значение в канале - это номер позиции. Это значение обнуляется всегда, когда приходит фронт на вход Z или когда позиция накапливает значение Range.
Получается если событие-Z не наступит, то сброс произойдет по Range, и на оборот.
Дойдет ли канал до 65535 сказать не могу. Возможно при Range = 0.
Спасибо! Может кто-то реально пробовал, проводил такие эксперименты? Пока мне оборудование не доступно, чтоб самому проводить эксперимент
Andrey13102024
01.03.2025, 17:14
Добрый день! Подскажите новичку пожалуйста. Можно ли к одной группе аналоговых входов ПР200 подключить и датчик давления (4-20мА) и датчик температуры ДТС (Pt1000)? У меня на COМ3 порту сидит минус от блока питания. На АI3 подключаем датчик давления (4-20мА). Ток пойдет от блока питания (+) в датчик и потом в СОМ порт (-). При подключении датчика температуры вход AI4 сам является источником тока и посылает его в СОМ3, где у нас уже висит минус от блока питания. Можно ли так делать?82280
kondor3000
01.03.2025, 17:31
Добрый день! Подскажите новичку пожалуйста. Можно ли к одной группе аналоговых входов ПР200 подключить и датчик давления (4-20мА) и датчик температуры ДТС (Pt1000)? У меня на COМ3 порту сидит минус от блока питания. На АI3 подключаем датчик давления (4-20мА). Ток пойдет от блока питания (+) в датчик и потом в СОМ порт (-). При подключении датчика температуры вход AI4 сам является источником тока и посылает его в СОМ3, где у нас уже висит минус от блока питания. Можно ли так делать?
На модуле МВ110-8А, вообще все минусы соединены, тем не менее можно включить разные датчики термапары, Pt1000, датчик давления
и например выход 4-20 мА с НПТ-1 и всё работает. Главное правильно включить и ничего не перепутать.
Здравствуйте. Создаю простенькую программу для проверки в Codesis 2.3 программа видит ошибку, не понимаю что не так?
82423
Здравствуйте. Создаю простенькую программу для проверки в Codesis 2.3 программа видит ошибку, не понимаю что не так?
Покликайте в ошибку в окне, может покажет место
А все библиотеки подключены? Стандартная есть?
Александр Пинэко-Скворцов
13.03.2025, 14:25
Здравствуйте. Создаю простенькую программу для проверки в Codesis 2.3 программа видит ошибку, не понимаю что не так?
82423
Добрый день.
У Вас на скриншоте выход ET таймера присваивается некорректно. Его можно присвоить переменной типа TIME (нужно её объявить) либо не присваивать вовсе.
Кликал уже, ни чего не показывает.
Конечно библиотеки на месте иначе была бы другая картинка блоков.
kondor3000
13.03.2025, 14:39
Здравствуйте. Создаю простенькую программу для проверки в Codesis 2.3 программа видит ошибку, не понимаю что не так?
Должно быть так 82424 Не TIME на выходе, а переменная типа TIME.
Да, вы правы, если удалить TIME или объявить ET то ошибка уходит и все работает. Спасибо.
Александр
18.03.2025, 10:25
Добрый день!
Требуется мнение компетентных людей по вопросу организации задач ПЛК (Codesys 2.3). В существующей версии программы есть две задачи, работающие циклически, с интервалом 200 мсек каждая (задача №1 отвечает за получение технологических данных и обмен с подчиненными устройствами по Modbus, задача №2 производит расчеты и определяет состояния для подчиненных устройств). Есть предположение что такая организация задач создает неточности в управлении исполнительным механизмом, управляемым по времени его хода. Коротко говоря, контроль времени и работы реализован через сравнение времени активности шага SFC и заданного времени хода. Так как на очередном цикле, при сравнении этих времен, может быть так, что время активности шага на несколько мсек меньше заданного, то соответственно следующая проверка будет в следующем цикле, то есть через 200 мсек. То есть реальное время хода механизма может быть больше на 200 мсек. При заданном времени хода, допустим 2 сек, погрешность в 200 мсек это 10%. Причем это будет накапливающаяся погрешность, на каждом такте управления.
Возможным решением кажется иная организация задач. Задаче №1 устанавливается меньший приоритет, и тип выполнения "свободная". Задача №2 имеет более высокий приоритет, и тип "по событию". В конце выполнения задачи №1 по триггеру запускается выполнение задачи №2, по завершению второй задачи, выполняется первая. Лишних задержек нет, конфликт задач исключен вроде как. Один из незначительных недостатков, как я понимаю, в том, что при запуске выполнения задачи №2, выполнение задачи №1 прерывается, и после выполнения задачи №2, происходит завершение выполнения задачи№1 (по сути просто возврат управления системе ПЛК, то есть это дополнительный цикл, но с очень малым временем цикла).
Есть ли какие-то недостатки в таком решении?
Александр TL;DR =) А почему просто задачам не поставить меньшее время выполнения-то? Например 50 мсек?
И вообще. Почему это не может быть одна задача, внутри которой будет крутиться таймер, который каждые 200 мсек дёргает нужный код?
kondor3000
18.03.2025, 10:47
Выкинуть все задачи и поставить минимальное время цикла, 1-5 мс, тогда погрешности отсчёта времени будут минимальными.
200 мс отсчитывать таймером, как уже сказали.
In_Da_Cher_A
18.03.2025, 10:48
слишком заумно кто-то сделал
никакого смысла гонять две задачи лично я не вижу, эта задумка со связанными программами чревата проблемами изначально и дальнейшая "тонкая" настройка всё равно может не привести к результату
что мешает сделать в одном цикле?
Добрый день!
Требуется мнение компетентных людей по вопросу организации задач ПЛК (Codesys 2.3). В существующей версии программы есть две задачи, работающие циклически, с интервалом 200 мсек каждая (задача №1 отвечает за получение технологических данных и обмен с подчиненными устройствами по Modbus, задача №2 производит расчеты и определяет состояния для подчиненных устройств). Есть предположение что такая организация задач создает неточности в управлении исполнительным механизмом, управляемым по времени его хода. Коротко говоря, контроль времени и работы реализован через сравнение времени активности шага SFC и заданного времени хода. Так как на очередном цикле, при сравнении этих времен, может быть так, что время активности шага на несколько мсек меньше заданного, то соответственно следующая проверка будет в следующем цикле, то есть через 200 мсек. То есть реальное время хода механизма может быть больше на 200 мсек. При заданном времени хода, допустим 2 сек, погрешность в 200 мсек это 10%. Причем это будет накапливающаяся погрешность, на каждом такте управления.
Возможным решением кажется иная организация задач. Задаче №1 устанавливается меньший приоритет, и тип выполнения "свободная". Задача №2 имеет более высокий приоритет, и тип "по событию". В конце выполнения задачи №1 по триггеру запускается выполнение задачи №2, по завершению второй задачи, выполняется первая. Лишних задержек нет, конфликт задач исключен вроде как. Один из незначительных недостатков, как я понимаю, в том, что при запуске выполнения задачи №2, выполнение задачи №1 прерывается, и после выполнения задачи №2, происходит завершение выполнения задачи№1 (по сути просто возврат управления системе ПЛК, то есть это дополнительный цикл, но с очень малым временем цикла).
Есть ли какие-то недостатки в таком решении?
Программу обмена по модбас вызываете в задаче с типом "Свободная" и с установленным приоритетом 15.
Основную программу вызываете в задаче с типом "Циклическая", с установленным приоритетом менее 15 и минимальным значением "Интервал", которое будет соблюдаться (начните например с "t#50ms").
Отслеживать цикл можете там-же - но уже при подключенном ПЛК
Александр
18.03.2025, 11:47
Почему это не может быть одна задача, внутри которой будет крутиться таймер, который каждые 200 мсек дёргает нужный код?
Выкинуть все задачи и поставить минимальное время цикла, 1-5 мс, тогда погрешности отсчёта времени будут минимальными.
200 мс отсчитывать таймером, как уже сказали.
слишком заумно кто-то сделал
никакого смысла гонять две задачи лично я не вижу,
что мешает сделать в одном цикле?
Так как я начинающий пользователь Codesys, а программа сделана сильно более опытными чем я людьми, допустил что есть какой-то высший смысл в этом делении на задачи с интервалом в 200 мсек. При этом там в задаче №2 присоединено 10 штук PRG (управление однотипными 10-ью участками), каждая из которых огромная портянка с вложениями. Идея разместить в одну задачу в списке возможных решений есть, но увлекся вариантом с сохранением двух задач ))) Ну и пока не понимаю всех следствий объединения в одну задачу. На первый взгляд ничего не мешает, буду пробовать.
200 мсек это не требования к программе, а побочный эффект интервала заданного в типе задач. Требуемое поведение: программа рассчитывает необходимое время хода ИМ, потом это контролируется по времени активности шага SFC, отвечающего за присвоение нужных значений переменным для дискретных выходов.
Александр
18.03.2025, 11:56
Ну и пока не понимаю всех следствий объединения в одну задачу.
В частности, не понимаю как происходит обмен по Modbus в программе. Процесс выполнения будет дожидаться ответа данных от подчиненных устройств, до перехода к следующим инструкциям, или это как-то асинхронно выполняется
Александр
18.03.2025, 12:07
Программу обмена по модбас вызываете в задаче с типом "Свободная" и с установленным приоритетом 15.
Основную программу вызываете в задаче с типом "Циклическая", с установленным приоритетом менее 15 и минимальным значением "Интервал", которое будет соблюдаться (начните например с "t#50ms").
Отслеживать цикл можете там-же - но уже при подключенном ПЛК
Да, по смыслу это логично, но задача, как я её вижу, уйти вообще от интервалов, создающих погрешность при имеющемся алгоритме управления.
Александр Обмен по Modbus происходит на уровне ядра, если всё конфигурируется через дерево Конфигурации ПЛК.
Автономно, сам по себе. Без разницы, как работает в этот момент программа.
Да, по смыслу это логично, но задача, как я её вижу, уйти вообще от интервалов, создающих погрешность при имеющемся алгоритме управления.
Можете создать одну задачу со свободным вызовом и добавить в неё все вызовы всех своих программ - это будет аналогично тому, если б вы вызывали их друг за другом из PLC_PRG без использования диспетчера задач
Александр
19.03.2025, 07:18
Александр Обмен по Modbus происходит на уровне ядра, если всё конфигурируется через дерево Конфигурации ПЛК.
Автономно, сам по себе. Без разницы, как работает в этот момент программа.
Как понимаю, если сконфигурировано через Конфигурацию ПЛК, то то что на чтение идет в начале цикла, то что на запись в конце цикла. В данном же случае, запуск обмена по Modbus вызывается в PRG задачи №1, через ФБ библиотеки EthernetModbusMaster(Wago), в процессе выполнения задачи №1. Представляется что идет ожидание результата Ethernet-запроса. И никакой асинхронности там нет. Но так ли это - непонятно.
kondor3000
19.03.2025, 08:00
Как понимаю, если сконфигурировано через Конфигурацию ПЛК, то то что на чтение идет в начале цикла, то что на запись в конце цикла. В данном же случае, запуск обмена по Modbus вызывается в PRG задачи №1, через ФБ библиотеки EthernetModbusMaster(Wago), в процессе выполнения задачи №1. Представляется что идет ожидание результата Ethernet-запроса. И никакой асинхронности там нет. Но так ли это - непонятно.
Цикл ПЛК - 1 мс, запрос ответ по Модбас не менее 25-30 мс. За время одного запроса, ПЛК выполнит 25-30 раз программу целиком.
Александр
19.03.2025, 12:11
Цикл ПЛК - 1 мс, запрос ответ по Модбас не менее 25-30 мс. За время одного запроса, ПЛК выполнит 25-30 раз программу целиком.
Если это так, и цикл ПЛК не "растягивается" на время необходимое для обмена по Modbus, то возможно этот интервал для задач в 200 мсек как раз установлен для согласования обмена данных и их обработки в программе, и для того чтобы не заваливать ведомые устройства запросами каждые 20-30 мсек (такое суммарное время цикла задачи №1 и №2). Понимаю что не понимаю как оно должно работать. Есть ФБ выполняющий запрос по Ethernet. Если ответ на запрос еще не вернулся, но уже в следующем цикле идет новый вызов этого ФБ, то ответ первого запроса игнорируется? Интересно, эти вещи где-нибудь описаны вообще
Если это так, и цикл ПЛК не "растягивается" на время необходимое для обмена по Modbus, то возможно этот интервал для задач в 200 мсек как раз установлен для согласования обмена данных и их обработки в программе, и для того чтобы не заваливать ведомые устройства запросами каждые 20-30 мсек (такое суммарное время цикла задачи №1 и №2). Понимаю что не понимаю как оно должно работать. Есть ФБ выполняющий запрос по Ethernet. Если ответ на запрос еще не вернулся, но уже в следующем цикле идет новый вызов этого ФБ, то ответ первого запроса игнорируется? Интересно, эти вещи где-нибудь описаны вообще
ФБ выполняющий запросы работает в цикле: запросил - подождал - ответили - запросил - подождал - ответили и т.д. Когда ответили - обновил значения полученных данных. До момента ответа - висят данные прошлого ответа.
Основная программа в начале своего цикла считала входные данные (в том числе и текущие значения с ФБ обмена) - их обработала
Иногда PLC_PRG становится настолько большой, что время её выполнения не вмещается в цикл и происходит срабатывание WDT.
Эту проблему каждый решает по-своему:
- Кто-то разделяет на несколько PRG и создает глобальную переменную, которая определяет какой именно PRG будет работать в текущем цикле.
- Кто-то выделяет часть кода, которая по мнению создателя может выполняться еще реже и выделяет её в отдельную задачу (Task).
В любом случае OS ПЛК выполняет опрос исключительно по своим правилам и независимо от PRG.
Однако есть механизмы передачи сигналов управления в/из. Они описаны в документации.
Когда PRG обращается к переменным, то их содержимое может как еще не обновиться OS, так и обновиться несколько раз.
Так и при опросе регистра ведомого устройства, его значение может успеть измениться несколько раз, т.е. значение поступит самое последнее.
Поэтому приходится придумывать различные семафоры, четко фиксирующие ожидаемое событие. За счет чего удается синхронизироваться.
kondor3000
19.03.2025, 13:40
Если это так, и цикл ПЛК не "растягивается" на время необходимое для обмена по Modbus, то возможно этот интервал для задач в 200 мсек как раз установлен для согласования обмена данных и их обработки в программе, и для того чтобы не заваливать ведомые устройства запросами каждые 20-30 мсек (такое суммарное время цикла задачи №1 и №2). Понимаю что не понимаю как оно должно работать. Есть ФБ выполняющий запрос по Ethernet. Если ответ на запрос еще не вернулся, но уже в следующем цикле идет новый вызов этого ФБ, то ответ первого запроса игнорируется? Интересно, эти вещи где-нибудь описаны вообще
Проблемы начинаются у тех, кто бездумно втыкает задачи по 200 мс в программу, думая, что разгружает ПЛК. А по факту делает только хуже.
Надо не задачи втыкать, а оптимизировать обмен по интерфейсам и программу. Тогда и проблем не будет.
Думаю в вашем случае, задержки по 200 мс в 2 задачах, просто не дают работать программе нормально.
Вместо цикла 1-5 мс, у вас 400 мс и скорее всего обмен работает быстрее чем программа, цикл ещё не закончился, а ответами уже завалили по горло.
Любой таймер насчитает вместо нужных 100 мс, 300-500 мс, что у вас и происходит.
Александр
20.03.2025, 11:09
ФБ выполняющий запросы работает в цикле: запросил - подождал - ответили - запросил - подождал - ответили и т.д. Когда ответили - обновил значения полученных данных. До момента ответа - висят данные прошлого ответа.
Основная программа в начале своего цикла считала входные данные (в том числе и текущие значения с ФБ обмена) - их обработала
Так понимаю это должно быть реализовано в ФБ библиотеки, определение того что нужно делать: выполнить новый запрос, или ждать ответа на предыдущий? В ФБ (отвечающем за обмен по сети) использующемся в программе этого нет, а как посмотреть код библиотеки не знаю.
Александр
20.03.2025, 11:11
Однако есть механизмы передачи сигналов управления в/из. Они описаны в документации.
Какие механизмы имеются в виду в данном случае?
Буду признателен если скажете в какой именно документации.
Александр
20.03.2025, 11:16
Думаю в вашем случае, задержки по 200 мс в 2 задачах, просто не дают работать программе нормально.
Любой таймер насчитает вместо нужных 100 мс, 300-500 мс, что у вас и происходит.
Так и есть, при управлении ИМ через контроль времени активности шага SFC это и происходит.
Надо не задачи втыкать, а оптимизировать обмен по интерфейсам и программу.
Знать бы как оптимизировать этот обмен ) Из каких составляющих состоит эта оптимизация?
Так понимаю это должно быть реализовано в ФБ библиотеки, определение того что нужно делать: выполнить новый запрос, или ждать ответа на предыдущий? В ФБ (отвечающем за обмен по сети) использующемся в программе этого нет, а как посмотреть код библиотеки не знаю.
Какая используется библиотека?
sssssaaaaabbbbb
20.03.2025, 12:34
Здравствуйте коллеги, подскажите пожалуйста, почему выскакивает сообщение?82589
kondor3000
20.03.2025, 13:19
Здравствуйте коллеги, подскажите пожалуйста, почему выскакивает сообщение?82589
Когда вы уже разделы путать перестанете?
kondor3000
20.03.2025, 13:24
Знать бы как оптимизировать этот обмен ) Из каких составляющих состоит эта оптимизация?
На это уже ответил в посте #11361 https://owen.ru/forum/showthread.php?t=10555&p=459603&viewfull=1#post459603
1) Удалить все задачи, доп. программы вызывать из основной программы. Дать работать проекту циклом 1-5 мс.
2) Если будет тормозить обмен, сделать групповой опрос.
Так понимаю это должно быть реализовано в ФБ библиотеки, определение того что нужно делать: выполнить новый запрос, или ждать ответа на предыдущий? В ФБ (отвечающем за обмен по сети) использующемся в программе этого нет, а как посмотреть код библиотеки не знаю.
Ну а накой сразу смотреть её код?
..В данном же случае,...библиотеки EthernetModbusMaster(Wago)..
Ищите и выкладывайте её описание.
Или выкладывайте и проект и эту либу.
Расчетную часть можете выкинуть, никого она не интересует если что. Только архитектура и код обмена.
Код обмена должен вызыватся с макс.скоростью (сказали уже)
Александр
21.03.2025, 09:24
Ищите и выкладывайте её описание.
Или выкладывайте и проект и эту либу
Не удалось найти описания библиотек, на оф.сайте нет (там все под CDS3.5 заточено), гугл вообще не находит упоминаний о них.
Сильно обрезанный проект и либы в приложении.
В главной программе убрал вызовы программ бывших частью задачи №2 (и исключил их из компиляции).
Вызов ФБ работающих с Modbus происходит в главной PRG. Эти ФБ генерируются встроенным инструментом Modbus Configurator (Codesys адаптированная под ПЛК) исходя из сформированного списка подчиненных устройств.
Александр
21.03.2025, 09:34
1) Удалить все задачи, доп. программы вызывать из основной программы. Дать работать проекту циклом 1-5 мс.
2) Если будет тормозить обмен, сделать групповой опрос.
Так и сделал, вызовы подпрограмм Otd01...10(PRG) поместил в PLC_PRG, сейчас в проекте одна задача, тип "свободная". Проверять могу только на резервном ПЛК, который не имеет связи с ведомыми устройствами. Время цикла среднее 16 ms (при переводе в режим "Старт" максимальное 5000 ms, после сброса мониторинга времени цикла в процессе работы, максимальное до 30 ms).
Исходя из кода ФБ ModbusSLave, судя по всему там то что можно назвать групповым запросом, данные упаковываются в массив перед передачей.
Александр
21.03.2025, 09:36
Есть вероятность что проект не откроется в стандартной Codesys, вот скрины "архитектуры":
1рис - PLC_PRG с вызовом ФБ ModbusSlave.
2рис - код ФБ ModbusSlave.
3рис - Otd01...10 (PRG) вызываемых следом за ФБ ModbusSlave.
kondor3000
21.03.2025, 09:39
Так у вас ПЛК не Овен получается?
Биб-к тоже не хватает.
Александр
21.03.2025, 09:48
Так у вас ПЛК не Овен получается?
Биб-к тоже не хватает.
Нет, Wago. Предполагаю что поведение задач и ФБ такого плана идентичное для любых ПЛК. И, думаю, понимание этих вопросов будет полезно пользователям любых ПЛК. Да, там выше скрины прикрепил на этот случай.
Александр
21.03.2025, 10:20
Вообще, эта ситуация с недоступностью доков, софта сильно напрягает. И уже неоднократно возникала мысль - а что можно использовать вместо Wago 750-880. И конечно самый понятный вариант в плане доступности (в плане приобретения) и поддержки это Owen. Но вспоминаешь как вел себя ПЛК160.1, обрывы связи, невозможность подключиться, и уже непонятно, не создам ли себе еще больше проблем. В общем пока психологическая травма полученная от опыта работы с ПЛК160 не прошла )) Возможно ПЛК2ХХ уже являются оборудованием другого качества и надежности? Очень, очень хотелось бы, чтобы это было так. Интересно было бы узнать мнение тех кто проверил это.
In_Da_Cher_A
21.03.2025, 13:34
Но вспоминаешь как вел себя ПЛК160.1, обрывы связи, невозможность подключиться,у вас какие-то детские страхи
не думаю что ВАГО
а что можно использовать вместо Wago 750-880.а зачем и для чего? ваши проблемы - в том, что проект делал какой-то "тру программер" тупо запихнувший зачем-то всё в одну железку по принципу "впихнуть невпихуемое", зато программа судя по скринам - просто образчик ФБстроения, но теперь без него ничего не будет работать нормально
не думаю, что можно что-то безболезненно тут исправить, максимум - как-то поставить костыли, чтобы решить трабл с временем хода клапана и минимизировать его влияние.
расковыривать это месиво в рабочем порядке чтобы самостоятельно мигрировать на что-то другое - сомнительное удовольствие
я бы смотрел в сторону костылей и не впрягаться в эту неблагодарную работу без команды и финансирования сверху
Решил разобраться с диспетчером задач для повышения быстродействия работы моего проекта.
Дело в том, что в моей задаче автооператоры (АО) на высокой скорости проезжает бесконтактные датчики (20-30 шт.). Датчик идентифицируют номер технологической позиции. Т.к. реальной линии пока нет в моем распоряжении, то не могу оценить сколько раз ПЛК110-60 исполняет программных циклов пока АО проезжает очередной датчик. Обычно я опрос датчиков делал так:
COD_G_POZ_1 := 0;
IF D1 THEN
COD_G_POZ_1 := 1;
ELSIF D2 THEN
COD_G_POZ_1 := 2;
ELSIF D3 THEN
COD_G_POZ_1 := 3;
. . .
ELSIF D18 THEN
COD_G_POZ_1 := 18;
ELSIF D19 THEN
COD_G_POZ_1 := 19;
END_IF
В новом проекте чтобы не потерять сигнал от датчика я решил повесить на каждый дискретный вход отдельную программу, которая будет формировать номер активного датчика. В эмуляторе все работает красиво. Как вы думаете, это правильный подход для гарантированного опроса датчиков? До этого с аппаратными прерываниями на ПЛК ОВЕН не работал.
разобраться с диспетчером задач для повышения быстродействия работы моего проекта..
ПЛК110. Сама постанова - ошибочная. Дальше смотреть смысла нет.
ПЛК110. Сама постанова - ошибочная. Дальше смотреть смысла нет.
В чем ошибочность? Меня интересует опыт бывалых.
В чем ошибочность? Меня интересует опыт бывалых.Как вариант от меня - это то, что быстрее всего будет сделать одну циклическую задачу с самым минимальным временем выполнения.
Мин время - 1мс. Мин минц 1мс
О чем речь? 1 < 1 внезапно?
Лучше бы прикинули реальное время датчиков и сопоставили с характеристиками Di.
Их вроде же не 4 штуки где ещё можно было бы быстрый таймер как-то прикрутить
Мож вообще не Овен.
Убедительно. Закрываю эту тему.
Опять хочу вернуться к диспетчеру задач, но уже для другой ситуации. Просто, хочу разобраться с этим механизмом в ПЛК. Подскажите, если в программе (POU), закрепленной за событием на каком-то дискретном входе, изменится значение переменной, то это изменение появится в основной программе тут же или в начале нового цикла контроллера? Ответ на этот вопрос мне необходим для более глубокого понимания этого программного инструмента. Приведите пример, где обычно используется данная методика программирования. Дело в том, что в моих задачах имеются аварийные кнопки и нажимаются они очень редко. Только при аварийных ситуациях. Бывает, что эти кнопки не нажимаются больше месяца, а может и больше. Но эффект от нажатия должен быть экстренным - отключение движения автооператоров и фиксация их тормозами. Сейчас я в каждом цикле ПЛК анализирую эти входы. Интуитивно понимаю, что делаю не рационально. Таких кнопок бывает 2 - 6 штук. Думаю, вот эту подзадачу можно поручить диспетчеру задач. Или я опять ошибаюсь?
kondor3000
28.03.2025, 09:03
Опять хочу вернуться к диспетчеру задач, но уже для другой ситуации. Просто, хочу разобраться с этим механизмом в ПЛК. Подскажите, если в программе (POU), закрепленной за событием на каком-то дискретном входе, изменится значение переменной, то это изменение появится в основной программе тут же или в начале нового цикла контроллера? Ответ на этот вопрос мне необходим для более глубокого понимания этого программного инструмента. Приведите пример, где обычно используется данная методика программирования. Дело в том, что в моих задачах имеются аварийные кнопки и нажимаются они очень редко. Только при аварийных ситуациях. Бывает, что эти кнопки не нажимаются больше месяца, а может и больше. Но эффект от нажатия должен быть экстренным - отключение движения автооператоров и фиксация их тормозами. Сейчас я в каждом цикле ПЛК анализирую эти входы. Интуитивно понимаю, что делаю не рационально. Таких кнопок бывает 2 - 6 штук. Думаю, вот эту подзадачу можно поручить диспетчеру задач. Или я опять ошибаюсь?
Выбросить все задачи и сделать мин цикл 1 мс, все остальные варианты приведут к замедлению срабатывания кнопок и вообще всего.
Какие приоритеты не ставьте, если задача 10 мс, кнопки сработают медленнее.
МихаилГл
28.03.2025, 09:09
Опять хочу вернуться к диспетчеру задач, но уже для другой ситуации. Просто, хочу разобраться с этим механизмом в ПЛК. Подскажите, если в программе (POU), закрепленной за событием на каком-то дискретном входе, изменится значение переменной, то это изменение появится в основной программе тут же или в начале нового цикла контроллера? Ответ на этот вопрос мне необходим для более глубокого понимания этого программного инструмента. Приведите пример, где обычно используется данная методика программирования. Дело в том, что в моих задачах имеются аварийные кнопки и нажимаются они очень редко. Только при аварийных ситуациях. Бывает, что эти кнопки не нажимаются больше месяца, а может и больше. Но эффект от нажатия должен быть экстренным - отключение движения автооператоров и фиксация их тормозами. Сейчас я в каждом цикле ПЛК анализирую эти входы. Интуитивно понимаю, что делаю не рационально. Таких кнопок бывает 2 - 6 штук. Думаю, вот эту подзадачу можно поручить диспетчеру задач. Или я опять ошибаюсь?
Для аварийного отключения контроллер конечно можно использовать, но в нормальных схемах применяются реле аварийного отключения, сертифицированные по SIL3 и т.п.
А ПЛК обычно работают так:
1 действие - запись выходов
2 действие - обработка программы
3 действие - чтение входов
Ранее первым было чтение входов, а последним - запись выходов, но потом вроде стали применять такую последовательность, по крайней мере в Siemens'е...
PS 2 и 3 местами поменять надо, косяк...
1 действие - запись выходов
2 действие - чтение входов
3 действие - обработка программы
В начале цикла, практически у всех.
Вариант другой ПЛК, где в отдельной задаче можно проверять обычные входы внутри цикла.
Вариант использования быстрых входов и в задаче проверять счётчик.
Вариант, описанный выше
In_Da_Cher_A
28.03.2025, 10:01
Дело в том, что в моих задачах имеются аварийные кнопки и нажимаются они очень редко. Только при аварийных ситуациях. Бывает, что эти кнопки не нажимаются больше месяца, а может и больше. Но эффект от нажатия должен быть экстренным - отключение движения автооператоров и фиксация их тормозами.элементы, обеспечивающие безопасность, тем более - связанные с людьми, должны быть отделены от "основного" процесса и приводить к остановке движения НЕЗАВИСИМО от состояния "технологического" ПЛК
для этого применяют либо ПЛК и модули, сертифицированные для безопасности, либо электрическую схему проектирую так, что действие элементов безопасности идёт в "обход" основного ПЛК напрямую на "привода" активных элементов и приводит к безопасному "останову" процесса.
Или я опять ошибаюсь?
Советую вам серьёзно отнестись к проектированию именно СИСТЕМЫ ЗАЩИТЫ, а не пихать всё это в несчастный ОВЕН, который вообще для этого не предназначен. Если при аварии могут пострадать и люди, прямо или косвенно, то за вашу самодеятельность вам будет уголовное преследование.
.. либо электрическую схему проектирую так, что действие элементов безопасности идёт в "обход" основного ПЛК напрямую на "привода" активных элементов и приводит к безопасному "останову" процесса...
Большое спасибо за совет. А что Вы понимаете под "...напрямую на "привода" активных элементов..."? У меня электродвигатели 1.5 кВт управляются частотными преобразователями. Вы предлагаете отключать сеть питания 380В на входе частотников? Или снимать управление с частотников? Естественно без ПЛК. Надежнее отключать фазы, чем отключать управление, т.к. сам частотник может и сам выйти из строя и постоянно подключать движение электродвигателю. И все это реализовать на самоблокирующих реле 24В. Кроме этого параллельно, пусть и ПЛК тоже занимается реализацией аварийной ситуации. В моем случае в зоне работы автооператоров запрещено находится людям. Имеется аварийная струна в опасных зонах.
In_Da_Cher_A
28.03.2025, 10:46
А что Вы понимаете под "...напрямую на "привода" активных элементов..."? У меня электродвигатели 1.5 кВт управляются частотными преобразователями. Вы предлагаете отключать сеть питания 380В на входе частотников? Или снимать управление с частотников?
помимо частотников, должны быть защитные активные устройства, останавливающие "процесс" независимо от всего остального и именно на них должно идти воздействие защмитных кнопок и прочих элементов безопасности. Это как катапульта в самолёте.
воздействие на пч и прочие технологические привода - это уже отработка останова "основного процесса" по аварии
т.к. сам частотник может и сам выйти из строякогда речь идёт о предотвращении аварийной ситуации, то выход частотника это меньшее зло. Конечно не надо закладываться на это
и постоянно подключать движение электродвигателю.а это уже привет вам, что у вас глючный пч приведёт к "восстанию машин", такого быть не должно - занимайтесь проектированием схемы управления и грамотной настройкой ПЧ
В моем проекте ПЛК110-60 связан через Ethernet с ПК. И заказчик решил отказаться от 2ТРМ1 для регулировки температуры в ваннах и предложил переложить задачу регулировки температуры растворов на ПЛК или ПК. Никогда не сталкивался с аналоговыми модулями ОВЕН. Поэтому несколько вопросов специалистам. В качестве термосопротивлений мы используем ДТС 35 50M (50 Ом). Температуры в растворах 60-90 С. Выбрал для данной задачи МВ110-224.8А. Посмотрел документацию на данный модуль. И на примере первого входа вопрос. При конфигурировании я настроюсь на 50 Ом сопротивление. Правильно ли я понял, что можно опрашивать регистр "1" (Целое значение измерения входа) и таким образом можно прочитать текущую температуру? Или нужно умножать значение регистра "1" на некоторый коэффициент для получения нормальной величины? Или это не требуется? Например, раствор, где находится ДТС 35 50M, имеет температуру 67С, то и в регистре "1" МВ110-224.8А будет число 67?
В моем проекте ПЛК110-60 связан через Ethernet с ПК. И заказчик решил отказаться от 2ТРМ1 для регулировки температуры в ваннах и предложил переложить задачу регулировки температуры растворов на ПЛК или ПК. Никогда не сталкивался с аналоговыми модулями ОВЕН. Поэтому несколько вопросов специалистам. В качестве термосопротивлений мы используем ДТС 35 50M (50 Ом). Температуры в растворах 60-90 С. Выбрал для данной задачи МВ110-224.8А. Посмотрел документацию на данный модуль. И на примере первого входа вопрос. При конфигурировании я настроюсь на 50 Ом сопротивление. Правильно ли я понял, что можно опрашивать регистр "1" (Целое значение измерения входа) и таким образом можно прочитать текущую температуру? Или нужно умножать значение регистра "1" на некоторый коэффициент для получения нормальной величины? Или это не требуется? Например, раствор, где находится ДТС 35 50M, имеет температуру 67С, то и в регистре "1" МВ110-224.8А будет число 67?
Если в параметре "Смещение десятичной точки" поставите 0 - то при температуре 67.345 получите 67. Если поставите 1 - получите 673 и т.д
Спасибо. Это отлично! И еще, в CodeSys 2.3 имеется функциональный блок HYSTERESIS. Ведь я же могу его настроить на регулировку температурой раствора? Тут и верхняя нижняя температурная граница. Возможно таким образом повторю закон регулирования 2ТРМ.
kondor3000
02.04.2025, 13:44
Спасибо. Это отлично! И еще, в CodeSys 2.3 имеется функциональный блок HYSTERESIS. Ведь я же могу его настроить на регулировку температурой раствора? Тут и верхняя нижняя температурная граница. Возможно таким образом повторю закон регулирования 2ТРМ.
Если он вам подойдёт, то можете использовать, только там входы INT, если нужен REAL, то проще сделать на сравнении или написать свой блок.
Кстати пример чтения модуля 8А через String, двумя запросами https://owen.ru/forum/showthread.php?t=35094&p=360380&viewfull=1#post360380
Пример чтения 7 модулей 8АС, через Структуры и String и отправкой всего в панель https://owen.ru/forum/showthread.php?t=10555&p=414990&viewfull=1#post414990
Если он вам подойдёт, то можете использовать, только там входы INT, если нужен REAL, то проще сделать на сравнении или написать свой блок.
Наверно, для простоты буду работать с INT. Настрою "Смещение десятичной точки" на 1. Ведь ПЛК будет получать от ПК температурное задание для регулирования уже в формате Т*10.
При формировании UMD (МВ110-224.8А )в этом случае я должен выбрать Registr input modul?
kondor3000
02.04.2025, 14:15
Наверно, для простоты буду работать с INT. Настрою "Смещение десятичной точки" на 1. Ведь ПЛК будет получать от ПК температурное задание для регулирования уже в формате Т*10.
При формировании UMD (МВ110-224.8А )в этом случае я должен выбрать Registr input modul?
Да, но лучше прочитать сразу весь модуль и взять что вам надо,
пример чтения модуля 8А через String, двумя запросами https://owen.ru/forum/showthread.php?t=35094&p=360380&viewfull=1#post360380
Да, но лучше прочитать сразу весь модуль и взять что вам надо,
пример чтения модуля 8А через String, двумя запросами https://owen.ru/forum/showthread.php?t=35094&p=360380&viewfull=1#post360380
Спасибо за ссылку, где Вы подробно расписали, как можно одним "махом" прочитать все регистры модуля МВ110-224.8А. Код внимательно изучил. Уважаю, кто свободно оперирует указателями. Для себя добавлю чтение регистра "Статуса измерения входа" для диагностики. А два регистра под "Значение с плавающей точкой" уберу. Достаточно мне регистра "Целое значение".
Вопрос по регистру "Циклическое время измерения". Это не тоже самое, что за параметр "Poling time" UMD? На что он влияет?
kondor3000
02.04.2025, 21:19
Спасибо за ссылку, где Вы подробно расписали, как можно одним "махом" прочитать все регистры модуля МВ110-224.8А. Код внимательно изучил. Уважаю, кто свободно оперирует указателями. Для себя добавлю чтение регистра "Статуса измерения входа" для диагностики. А два регистра под "Значение с плавающей точкой" уберу. Достаточно мне регистра "Целое значение".
Вопрос по регистру "Циклическое время измерения". Это не тоже самое, что за параметр "Poling time" UMD? На что он влияет?
Нет это не тоже самое, циклическое время измерения - нужно например для некоторых блоков PID регуляторов, целочисленное, кратное 10 мс.
По поводу чтения с модуля, выше давал ещё ссылку, там чтение 7 модулей 8АС, через Структуры и String, 82844
плюс перестановка регистров в переменных Float и отправка всего на панель СП310.
Советую посмотреть как минимум, а ещё лучше применить этот подход к чтению модуля 8А. Скрин в эмуляции. 82845
Когда собирается оборудование для проектируемой СУ, я, обычно, в домашних условиях конфигурирую все модули расширения входа-выхода ПЛК. Подключаю к модулю через АС-4 компьютер и через программу конфигуратор и прописываю все необходимые параметры. И так по каждому модулю. После чего модули уходят на сборку шкафов СУ. Вопрос. А если в процессе отладки СУ у Заказчика мне придется изменить, например, скорость обмена данными у модулей, то я могу опять через АС-4 подключиться только теперь к общей шине RS-485 и все выполнить по каждому модулю отдельно? В этом случае нужно отключать сеть RS-485 от ПЛК? Поделитесь опытом.
kondor3000
03.04.2025, 10:34
Когда собирается оборудование для проектируемой СУ, я, обычно, в домашних условиях конфигурирую все модули расширения входа-выхода ПЛК. Подключаю к модулю через АС-4 компьютер и через программу конфигуратор и прописываю все необходимые параметры. И так по каждому модулю. После чего модули уходят на сборку шкафов СУ. Вопрос. А если в процессе отладки СУ у Заказчика мне придется изменить, например, скорость обмена данными у модулей, то я могу опять через АС-4 подключиться только теперь к общей шине RS-485 и все выполнить по каждому модулю отдельно? В этом случае нужно отключать сеть RS-485 от ПЛК? Поделитесь опытом.
Для новых модулей H/W 2.0 настроенных по Модбас RTU можно, только вместо ПЛК (мастера надо отключить)
старые модули настраивались по протоколу Овен, там лучше было подключаться к каждому модулю отдельно, либо соблюдать шаг адресов модулей по кол-ву входов.
AlexCrane
03.04.2025, 10:41
Когда собирается оборудование для проектируемой СУ, я, обычно, в домашних условиях конфигурирую все модули расширения входа-выхода ПЛК. Подключаю к модулю через АС-4 компьютер и через программу конфигуратор и прописываю все необходимые параметры. И так по каждому модулю. После чего модули уходят на сборку шкафов СУ. Вопрос. А если в процессе отладки СУ у Заказчика мне придется изменить, например, скорость обмена данными у модулей, то я могу опять через АС-4 подключиться только теперь к общей шине RS-485 и все выполнить по каждому модулю отдельно? В этом случае нужно отключать сеть RS-485 от ПЛК? Поделитесь опытом.
Обычно откидываю мастер и через AC-4 конфигурирую через общую шину (вывожу специально две клеммы). Но нужно сделать определенный разбег по адресам, к примеру МВ110-8А занимает 8 адресов по протоколу ОВЕН
Обычно откидываю мастер и через AC-4 конфигурирую через общую шину (вывожу специально две клеммы). Но нужно сделать определенный разбег по адресам, к примеру МВ110-8А занимает 8 адресов по протоколу ОВЕН
А я та и не понял, чем хорош протокол ОВЕН? Пока пользуюсь Modbus RTU
Николай Суриков
03.04.2025, 11:59
А я та и не понял, чем хорош протокол ОВЕН? Пока пользуюсь Modbus RTU
Не важно какой протокол вы используете, Конфигуратор МХ110 для модулей H/W 1.0 работает по протоколу Овен.
Например Вы сконфигурировали отдельно два модуля М110-8А с адресами 1 и 2 соответственно. При подключении к общей шине, на которой висят оба модуля Вы конфигурируете модуль с адресом 1, но при этом в оба модуля зальются изменения с непридвиденными последствиями.
Что бы такого не было, назначать адреса модулей необходимо кратно их входам, например для МВ110-8А - это 8, 16, 24, 32 и т.д.
А я та и не понял, чем хорош протокол ОВЕН? Пока пользуюсь Modbus RTU
Модбас объявили инагентом? Пользуйтесь. И кладите болт на "кратности" - нет никого смысла в них, если не планируете заким-то юзать протокол-овен
Добрый день! Подскажите пожалуйста реле ПР200-220.220.2.1.0 Не получается сделать. Нужно с панели задать допустим 100 часов, включается обратный отсчет и на DO подаются раз в две секунды импульсы через бленкер вкл, выклю, идет счет импульсов это я сделал на панели. А вот задачу времени с панели времени и пуска с панели при заданном времени не получается. Смысл такой задаю часы (идет обратный отсчет) с панели реле работают и считают срабатывания, по окончанию вижу сколько срабатываний было времени и что время закончилось, если свет отключили, то при включении счетчики и время просто с того же момента должны начать. Это в таком виде возможно реализовать?
kondor3000
04.04.2025, 14:29
Добрый день! Подскажите пожалуйста реле ПР200-220.220.2.1.0 Не получается сделать. Нужно с панели задать допустим 100 часов, включается обратный отсчет и на DO подаются раз в две секунды импульсы через бленкер вкл, выклю, идет счет импульсов это я сделал на панели. А вот задачу времени с панели времени и пуска с панели при заданном времени не получается. Смысл такой задаю часы (идет обратный отсчет) с панели реле работают и считают срабатывания, по окончанию вижу сколько срабатываний было времени и что время закончилось, если свет отключили, то при включении счетчики и время просто с того же момента должны начать. Это в таком виде возможно реализовать?
Во первых вы пишите в раздел ПЛК (среда CoDeSys V2.3), пишите в Разделе ПР200 или Овен лоджик.
Во вторых время прекрасно отсчитывается и запоминается в ПР200, а в панель время передаётся как DWORD (в лоджике целочисленное UDINT -2 регистра ) и битовый сигнал окончания отсчёта. Или ещё проще, в виде часов минут и секунд, 3 регистрами WORD ( целочисленное 1 регистр)
Это в таком виде возможно реализовать?Если вопрос только в этом - то да, возможно.
Лосев Олег
04.04.2025, 18:03
После установки и начало работы оказалось что просто открыть вент камеру ( Belimo привод) и закрыть по показаниям датчика влажности не подходит.
Нужно постепенное открывание и такое же закрывание. Подскажите как реализовать, может маштабированием сигнала ( как то я делал по температуре увеличивал частоту на ПЧВ) А здесь незнаю как мне по секундам сделать открытие и закрытие в зависимости от влажности камеры. Стоит ПВТ110-4А - подключен к МВ110-8А - подключен к ПЛК 110 , к выходу ПЛК подключена заслонка ( полное открытие 150 сек)
И надо сделать что бы например уставка 75% влажности
в камере 78% - мы немного приоткрываем заслонку, а если в камере 72% немного закрываем заслонку.
In_Da_Cher_A
04.04.2025, 18:37
это уже П-регулятор получается
а заслонка как управляется?
ну так сделайте линеаризацию входа от датчика к выходу на заслонку, если это аналоговый выход
а если открыть закрыть то это уже можно делать ПИ регулятор с ШИМ.
Только это всё равно кривой способ, мало влияющий на влажность, здесь скорее надо оперировать частотой вращения вентилятора как минимум, а не мучать заслонку, которая для этого не предназначена
а как максимум - смотря что у вас происходит в камере, откуда источник влажности - ставить осушитель воздуха и управлять уже им
Лосев Олег
04.04.2025, 19:47
Спасибо. нашел вариант работы заслонки как требуется. Сам не ожидал что так просто без пид и шим регуляторов.
Лосев Олег
05.04.2025, 09:07
Сушильная камера пиломатериала. В режиме сушки требуется постепенное уменьшение влажности и увеличение температуры. С настройкой температуры проблем нет, а вот с влажностью! ( я сначало просто написал логику - открыть полностью или закрыть полностью. Но это шок для материала. Пришлось думать как сделать плавное открытие. Как то давненько я делал каскадное переключение частоты ПЧВ по датчику температуры( Маштабировал - на ардуинке)
Вот посмотрите набросок. Осталось сделать так чтобы в по окончанию сушки заслонка закрывалась.
Ясно.
Т.к. процесс очень инерционный, то, возможно, ПИД регулятор будет плохо работать (хотя, можно и попробовать).
При мне выбранный метод как-то назвали "палец наладчика" - короткие импульсы в нужном направлении с паузой для ожидания реакции и фиксированными длительностями этих импульсов и пауз.
Можете дополнить зоной нечувствительности.
И ещё, учитывайте, что в CoDeSys генератор BLINK после снятия и установки входа ENABLE продолжает цикл с прерванного места, а не с начала.
Вообщем сделать виртуальный позиционер (время полного вращения в помощь) который стремится к заданию, и для периодической "юстировки" юзает концевики и/или иногда принудительный перевод в крайние положения.
Блинки тут такое себе. В останове расчитывать время/направление и при превышении зоны нечуствительности (как сказали) уходить во вращение с возможностью увеличения и подреза этого времени на ходу. Всё.
Всё нормально здесь с ПИД. Он здесь просто задание. И он должен быть настроен так, чтоб скорость изменения его выхода незначительно превышала скорость реального вращения. Значительно выше - бессмысленно.
Очень часто это пИд
Добрый день!
Есть панель оператора овен сп315 может ли она взаимодействовать с контроллером от другого производителя?
Не получается привязать сигналы на hmi
kondor3000
08.04.2025, 16:21
Добрый день!
Есть панель оператора овен сп315 может ли она взаимодействовать с контроллером от другого производителя?
Не получается привязать сигналы на hmi
Панель то может, на Модбас RTU или TCP/IP, надо только настроить сеть и адреса регистров.
Протокол, настройки сети и адреса в ПЛК знаете?
Подскажите, имеется ли возможность загружать в ПЛК110-60 только скомпилированный код (без ST исходников)?
vsa Отвечаю, как понял можно загрузить DEAFULT.PRG и DEFAULT.CHK напрямую в ПЛК, если они скомпилированы прям для этой версии таргета ПЛК.
Но загружать придётся всё равно через подключение к ПЛК и CodeSys (без исходников) через команду "Записать файл в ПЛК".
vsa Отвечаю, как понял можно загрузить DEAFULT.PRG и DEFAULT.CHK напрямую в ПЛК, если они скомпилированы прям для этой версии таргета ПЛК.
Но загружать придётся всё равно через подключение к ПЛК и CodeSys (без исходников) через команду "Записать файл в ПЛК".
Спасибо, но где-то читал, что этот подход очень рискованный для дальнейшей работы ПЛК. Мне нужно защитить текст программы от любопытных глаз.
.. этот подход очень рискованный защитить текст программы от любопытных глаз.
Ищи/спрашивай про plc_io и обойдёшься без кодесиса для загрузки вышеуказанных файлов
kondor3000
09.04.2025, 18:57
Спасибо, но где-то читал, что этот подход очень рискованный для дальнейшей работы ПЛК. Мне нужно защитить текст программы от любопытных глаз.
Риска никакого, если потренироваться на простом примере и знать что и как делать.
Обратил внимание, что в моих проектах при настройке UMD для внешнего модуля МВ110-16ДН параметр Command стоит значение Read holding Registers (0х03). Все работает хорошо. Наверно, это значение было выставлено по умолчанию. Но там же имеется и другой параметр для способа опроса - read input registers (0х04). Подскажите, какой правильнее выбрать параметр? В интернете много разночтения по данным регистрам. Возможно уже кто-то задавал подобный вопрос, но я не знаю, как сделать запрос в данном форуме для поиска ответа.
vsa Это разные команды протокола Modbus.
Некоторые устройства поддерживают разные команды, а некоторые - оба варианта.
То есть, это не так, что "0x04 лучше чем 0x03" - а прям разные.
Чтобы точно научиться и узнатть на будущее, какие команды поддерживаются - надо найти инструкцию к устройствам.
Мало того, на некоторых устройствах используя один и тот-же адрес регистра, но различные функции чтения - можно получить разные значения
kondor3000
10.04.2025, 14:29
Обратил внимание, что в моих проектах при настройке UMD для внешнего модуля МВ110-16ДН параметр Command стоит значение Read holding Registers (0х03). Все работает хорошо. Наверно, это значение было выставлено по умолчанию. Но там же имеется и другой параметр для способа опроса - read input registers (0х04). Подскажите, какой правильнее выбрать параметр? В интернете много разночтения по данным регистрам. Возможно уже кто-то задавал подобный вопрос, но я не знаю, как сделать запрос в данном форуме для поиска ответа.
Не надо мудрить и ломать голову, открываете руководство и читаете 82992 скрин для нового модуля МВ110-16ДН H/W 2.0
Мало того, на некоторых устройствах используя один и тот-же адрес регистра, но различные функции чтения - можно получить разные значения
Спасибо, что заострили на этом внимание. Вот с этим я сегодня столкнулся при изучении программирования выпрямителя Flex Kraft. Благо под рукой было несколько web-платформ ИИ. Часа два я пытался получить вразумительный ответ - как мне использовать одинаковые адреса регистров выпрямителя для разного назначения в программе ПЛК110-60 при управлении по Modbus? Вот фрагмент ответа DeepSeek:
"Для 30006 (Input Register) → FUNCTION=4, ADDR=5.
Для 40006 (Holding Register) → FUNCTION=3, ADDR=5.
Не путайте функции (04 vs 03), даже если адрес в CoDeSys одинаковый!"
У меня в проекте как раз подобная ситуация будет. Мне предстоит через регистр 5 (40006) записывать ток в выпрямитель, а из регистра 5 (30006) читать фактическое значение тока при нагрузке. Теперь мне понятно, как я должен настраивать регистры в UMD выпрямителя.
Sergey_RZ
14.04.2025, 15:27
я новичок в подключении устройств по протоколу MODBUS. Необходимо получить данные от контроллера Logik33 S. Пробовал подключать к RS 232, RS 485 нет ответа на запросы от Lectusa. Таймауты (300-10000) и межбайтовый интервал (4-20) менял - не помогло. Качество связи показывает хорошее, но ответа по логам нет. Как должен быть настроен Lectus (Master/Slave)? Логи прилогаю.
я новичок в подключении устройств
я может чего и не понял, но CoDeSys то тут каким боком? :confused:
Добрый день! Есть ПЛК 110 М02 Хочу на нем сэмулировать работу датчика с modbus rtu стороннего производителя (для тестов). У датчика регистры начинаются с 0х200. Подскажите как в CodeSYS сместить адреса регистров для modbus slave
In_Da_Cher_A
17.04.2025, 14:18
Хочу на нем сэмулировать работу датчика с modbus rtu стороннего производителяв переводе на русский - вы хотите из ПЛК сделать "датчик"?
сместить адреса регистров для modbus slaveникак, кроме как набив руками перед нужным адресом 511 "пустышек"
Добрый день! Есть ПЛК 110 М02 Хочу на нем сэмулировать работу датчика с modbus rtu стороннего производителя (для тестов). У датчика регистры начинаются с 0х200. Подскажите как в CodeSYS сместить адреса регистров для modbus slave
через конфигурацию придется добавлять все регистры начиная с нуля. Лучше через библиотеку, чтоб функция отвечала только на соответствующие запросы
в переводе на русский - вы хотите из ПЛК сделать "датчик"?
Все верно. Опыты на столе
через конфигурацию придется добавлять все регистры начиная с нуля. Лучше через библиотеку, чтоб функция отвечала только на соответствующие запросы
Речь о OwenModbusSlave_v2.3.9.4 ?
kondor3000
17.04.2025, 14:24
Добрый день! Есть ПЛК 110 М02 Хочу на нем сэмулировать работу датчика с modbus rtu стороннего производителя (для тестов). У датчика регистры начинаются с 0х200. Подскажите как в CodeSYS сместить адреса регистров для modbus slave
Сделайте эмулятор на ОПС Лектус или Инсат, Modbus Universal MasterOPC они позволяют создать слейв с любого адреса. https://owen.ru/catalog/opc_serveri
Или в среде Codesys 3.5 на виртуальном ПЛК Codesys Control WIN V3, там можно задать слейв с любого регистра или бита,
в Онлайн по 485 и ТСР.
МихаилГл
17.04.2025, 14:39
А я вот этим пользуюсь:
https://www.ardsoft.ru/mEmulator.html
Всем спасибо! По эмуляции на ПК рассматривал вариант. Но задача стоит сделать на ПЛК. Буду копать библиотеку
Речь о OwenModbusSlave_v2.3.9.4 ?
нет, syslibcom или unm, научится принимать и разбирать запросы, формировать ответ, отправлять посылку
Огородников Сергей
18.04.2025, 13:50
Нужна помощь экспертов.
В контроллере установлен модуль МВ210-101. Данный модуль опрашивает 4 аналоговых датчика 4...20мА.
Основное питание и питание опроса датчиков выполнено от разных блоков питания.
При измерении одного датчика все измерения в норме, при добавлении второго датчика измерения на первом проседают.
В чем может быть проблема ?
In_Da_Cher_A
18.04.2025, 13:54
При измерении одного датчика все измерения в норме, при добавлении второго датчика измерения на первом проседают.
В чем может быть проблема ?я не эксперт, но при подключении датчиков к модулю с ЗАВИСИМЫМИ каналами - проблема в цепи одного датчика одного канала - сказывается и на других каналах
проверяйте, где и что вы накосячили в схемах подключения и настройках канала
может у вас банально блок питания не тянет
kondor3000
18.04.2025, 14:16
Нужна помощь экспертов.
В контроллере установлен модуль МВ210-101. Данный модуль опрашивает 4 аналоговых датчика 4...20мА.
Основное питание и питание опроса датчиков выполнено от разных блоков питания.
При измерении одного датчика все измерения в норме, при добавлении второго датчика измерения на первом проседают.
В чем может быть проблема ?
Скорее всего подключили не правильно, питание одного канала просаживает питание другого. У этого модуля все минусы каналов соединены (общие).
Как почти у всех 8 канальных аналоговых модулей Овен.
AlexTambovtsev
18.04.2025, 14:28
Здравствуйте, уважаемые!
Необходима ваша помощь. Имеется ПЛК110-60. Поставили задачу либо скачать с него проект (если он там есть), либо, как я понял из энторнетов, хотя бы выкачать скомпилированный файл проекта на случай выхода контроллера из строя. Как вы поняли, самого проекта у нас нет. Итак, я подключаюсь к контроллеру через usb (драйвера стоят, всё норм, вроде), сначала жму "открыть проект из ПЛК". Выбираю таргет, соединение. И вылетает ошибка 80 (Номер сервиса 49). "Файл не может быть прочитан (вроде)". Оок, создаём проект новый, выбираем таргет, жмём подключиться. Видим окошко "Программа изменена, записать в контроллер?". Жмём нет. Идём в подключения, прочитать файл из ПЛК. При нажатии "save" получаем ту же ошибку. Подскажите, плз, куда копать? Из ньюансов: ПЛК в run-е, я так и не понял, как перевести его в "stop" :)).. На нажатие кнопки на панели ПЛК визуально ничего не происходит. При нажатии кнопри "Стоп" из Codesys - тоже. IP-адреса контроллера не знаю. Заранее спасибо:)..
AlexTambovtsev Прочитай вот эту статью: https://cs-cs.net/codesys-archiv-projekta-ishodniye-kody (там есть заголовки про CodeSys 2.3)
Раз выводится ошибка о том, что файл не найден - то проекта в ПЛК нет, а есть только скомпилированный.
После установления соединения заходите в ПЛК-Браузер и в верхней строке набираете "?" и Enter. Получиться так:
83260
Как видите получить список файлов - filedir:
83261
после чего "Онлайн"->"скачать файл из ПЛК" -> указываете имя файла, который надо скачать
PLCInfo сообщит об текущем IP:
83262
In_Da_Cher_A
18.04.2025, 16:36
Раз выводится ошибка о том, что файл не найден - то проекта в ПЛК нетне всегда это так ;)
83278
83279
Добры день всем! У меня ПЛК 210 и энкодер ABZ. Я подключаю его к ПЛК и конфигурирую как AB энкодер. Привязываю переменную в конфигурации к соответствующему каналу для считывания импульсов энкодера. На скрине все видно. Да и сам вопрос на скрине есть. У меня цепь вращается вперед, как я понял счет будет идти "бесконечно" и в какой-то момент времени все равно произойдет переполнение этого канала и переменной типа DINT. Какое значение покажет тут энкодер при этом и как его сбрасывать? Мне бы хотелось сбрасывать значение энкодера по датчику, у меня при вращении метка на цепи проходит мимо датчика, он как раз и должен определять 0 положение цепи, начальная точка, вот по нему я и хотел обнулять энкодер. Подскажите, возможно ли это и как мне лучше поступить, дайте совет? Может кто из своего опыта что подскажет?
МихаилГл
19.04.2025, 16:30
Немного не туда написали...
А если крутануть энкодер в другую сторону, когда показания 0, что будет? Я бы физически так проверил на столе...
А куда лучше написать, подскажите? Крутануть не могу, на руках еще нет энкодера, будет не скоро, а ПО надо писать уже сейчас и хотелось бы понимать как оно будет, потом времени на эксперименты почти не будет
МихаилГл
19.04.2025, 17:19
А куда лучше написать, подскажите? Крутануть не могу, на руках еще нет энкодера, будет не скоро, а ПО надо писать уже сейчас и хотелось бы понимать как оно будет, потом времени на эксперименты почти не будет
Не в ту тему. Это для кодесиса 2.3. Просто промазали.
А сам контроллер на руках? По идее должен перейти в 0 и заново начать считать. Но сам не проверял.
Evgenii123
24.04.2025, 05:21
Здравствуйте. Подскажите, как опросить ПЛК 110 с помощью Scada системы? Сейчас ПЛК работает в режиме мастер по Modbus RTU. Для SCADA нужен Modbus TCP и карта адресации Modbus.
Здравствуйте. Подскажите, как опросить ПЛК 110 с помощью Scada системы? Сейчас ПЛК работает в режиме мастер по Modbus RTU. Для SCADA нужен Modbus TCP и карта адресации Modbus.
Вопрос в чём?
In_Da_Cher_A
24.04.2025, 07:39
Вопрос в чём?очевидно в том, что кто-то должен прочитать все инструкции и руководства к ПЛК и сообщить Евгению123 краткую выжимку по КДС2.3 о конфигурации, о распределении памяти, о выравнивании, о работе в КДС собственно, куда идти и где смотреть и на что нажимать
roskmv
У меня ПЛК 210 и энкодер ABZ.
С энкодерами у Овенов прям бяда, причем уже более десятилетия. Конфигурация таргета не позволяет а) сделать программный сброс счетчика энкодера, б) транслировать входа в программу (например если нужно программно видеть фазу Z энкодера, ц) Сохранять данные счетчика, и устанавливать их обратно при включении ПЛК.
В вашем случае возможно надо сконфигурировать именно ABZ, но на Z подать сигнал с датчика нуля цепи. Но в этом случае в программе должен быть алгоритм поиска нуля при включении установки. Потому что при выключении ПЛК он забывает данные регистра энкодера, и это значение равно 0.
в какой-то момент времени все равно произойдет переполнение этого канала и переменной типа DINT. Какое значение покажет тут энкодер при этом
При вращении вперед и переполнении счетчика он будет считать с минимального значения в плюс (инкремент), при вращении назад будет тоже самое, только с максимального но в минус (декремент). То есть проще говоря, там "карусель".
Evgenii123
24.04.2025, 16:59
Мне нужно составить карту Modbus. А вот как это сделать или где бы про это почитать, не знаю.
kondor3000
24.04.2025, 17:06
Мне нужно составить карту Modbus. А вот как это сделать или где бы про это почитать, не знаю.
Настройка ПЛК слейва, регистры считаются с адреса 0, скада будет Мастером, ПЛК слейвом, интерфейс выбрать не RS485, а ТСР https://rutube.ru/video/fa7a6d2ddd9762f1e9c8095597fe837d/
Подключение к ОРС и Скаде, без слейва https://rutube.ru/video/e652ac0d22ad519d14eea755ff35a6ca/
Evgenii123
24.04.2025, 17:17
Подскажите, я правильно понял, что ПЛК на Ethernete может быть в режиме слейв, а на 485 мастером?
kondor3000
24.04.2025, 17:19
Подскажите, я правильно понял, что ПЛК на Ethernete может быть в режиме слейв, а на 485 мастером?
Может, а может наоборот, а может слейвом сразу по нескольким портам и разным интерфейсам.
Мне нужно составить карту Modbus. А вот как это сделать или где бы про это почитать, не знаю.
Карта Модбас - это перечень регистров устройства, которые доступны для опроса(чтения и/или записи) другими устройствами.
Применительно к ПЛК1Х0 и CDS2.3 - это можно создать путём добавления в конфигурацию ПЛК раздела Modbus(slave), конфигурации интерфейса и наполнения этого раздела необходимыми данными
. Подскажите, возможно ли это и как мне лучше поступить, дайте совет? Может кто из своего опыта что подскажет?
Перейдите на LINT/ULINT коли нужно. Непонятно зачем, но ещё и на жизнь внуков хватит. Переходит через 0 также как и часы в полночь. Со сбросом - а не трогайте сам энкодер, работайте с разницей между обращениями и базой-точкой отсчёта. Нет же проблем определить расстояние от N-cка до д.Васюки если у N-ска столбик 447й к, а у Васюков 491й? Или с этим проблемы? Если нет - то сменили точку отчёта и поехало снова с нуля.
Все проблемы с этим надуманные.
In_Da_Cher_A
24.04.2025, 21:11
Мне нужно составить карту Modbus. А вот как это сделать или где бы про это почитать, не знаю.то есть вы собираетесь работать с контроллером и софтом, но при этом не знаете про существование руководства по программированию, руководства по эксплуатации, описание программного обеспечения? и вы на сайте овен не видели ни разу раздела Документация и ПО?
и ни разу не видели ни обучающих видео на страницах прибора и вообще вас в гугле и ютюбе забанили?
Evgenii123
28.04.2025, 10:52
Подскажите что не так, вроде все прописал а тестером ни чего не вижу!
83505
In_Da_Cher_A
28.04.2025, 11:08
Подскажите что не так, вроде все прописал а тестером ни чего не вижу!
83505откройте руководство и прочтите про память и её распределение в слейве
In_Da_Cher_A
28.04.2025, 11:12
подсказка - ответьте на вопрос - сколько бит в байте, и что такое регистр памяти и его размеры (в нашем случае)
Evgenii123
28.04.2025, 11:38
Читал я про распределение памяти, но не скажу чтобы я то то из этого понял
Evgenii123
28.04.2025, 11:51
Даже если я не соображаю в распределении памяти, то хоть что то я должен увидеть в тестере 83510
In_Da_Cher_A
28.04.2025, 12:12
Читал я про распределение памяти, но не скажу чтобы я то то из этого понялну простите, тогда наука бессильна как-то помочь
Evgenii123
28.04.2025, 12:19
Вы если не можете не чем конкретным помочь, для чего отвечаете. ЧСВ?
kondor3000
28.04.2025, 13:19
Даже если я не соображаю в распределении памяти, то хоть что то я должен увидеть в тестере 83510
Что за тестер у вас?
читать слейв можно любым ОРС сервером, панелью мастером в эмуляции, надо только настроить IP ПЛК, порт 502 и слейв адрес 1, читать регистр с адресом 0, функцией 03 или 04.
На предыдущем скрине, где биты, 8Bit надо добавлять по 2 шт., чтение бит функции 01 или 02, запись 0x0f
Evgenii123
28.04.2025, 13:29
Прочитать получилось только я не совсем понимаю к каким адресам скаде обращаться. Скаде нужно только чтение, записывать ей ничего не надо. И читается с функцией 0х
In_Da_Cher_A
28.04.2025, 13:46
Вы если не можете не чем конкретным помочь, для чего отвечаете. ЧСВ?ну я же не могу думать за вас,
подсказки я вам дал куда смотреть
но если вы не знаете что такой байт и сколько байт в регистре памяти, и заявляете как студент на экзамене "я читал. но ничего не понял" - ну что тогда вы тут делаете?
вы не знаете азбуки и даже откровенное списывание у Кондора3000 мало чем вам поможет
Evgenii123
28.04.2025, 13:54
ну я же не могу думать за вас,
подсказки я вам дал куда смотреть
но если вы не знаете что такой байт и сколько байт в регистре памяти, и заявляете как студент на экзамене "я читал. но ничего не понял" - ну что тогда вы тут делаете?
вы не знаете азбуки и даже откровенное списывание у Кондора3000 мало чем вам поможет
Вы мне начали рассказывать про выравнивание памяти, а оно мне зачем. мне семь переменных нужно передать в состоянии 1 и 0.
kondor3000
28.04.2025, 14:08
Прочитать получилось только я не совсем понимаю к каким адресам скаде обращаться. Скаде нужно только чтение, записывать ей ничего не надо. И читается с функцией 0х
Адреса битов в слейве считаются с нуля , биты 0,1,2,3.....7
Функции 0х нет, есть 0х01, 0х02
Evgenii123
28.04.2025, 14:28
Адреса битов в слейве считаются с нуля , биты 0,1,2,3.....7
Функции 0х нет, есть 0х01, 0х02
Понял. То есть если в скаде обратятся к адресу 10001 то считают состояние переменной?
kondor3000
28.04.2025, 15:04
Понял. То есть если в скаде обратятся к адресу 10001 то считают состояние переменной?
Что у вас за скада такая? 10001 это логический адрес, а обычно используют физический.
Во всех скадах адресация так и есть бит 0,1,2,3 и т. д.
Evgenii123
28.04.2025, 15:07
Что у вас за скада такая?
Во всех скадах адресация так и есть бит 0,1,2,3 и т. д.
Я не знаю что там за скада. И наладка контроллера не совсем моё, просто появилась необходимость разобраться. А для передачи температуры её преобразовывать надо? Real же нельзя передать?
kondor3000
28.04.2025, 15:15
Я не знаю что там за скада. И наладка контроллера не совсем моё, просто появилась необходимость разобраться. А для передачи температуры её преобразовывать надо? Real же нельзя передать?
Почему нельзя, для переменной REAL есть Float.
Тут уже есть выравнивание, все 32 битные переменные должны быть с чётным адресом.
8Bit надо добавлять по 2 штуки, потом все 2 Byte (целые), потом Float. Если попало на нечётный адрес, добавляете ещё один 2 Byte (запасной), перед Float
Real же нельзя передать?
а откуда у вас такая инфа странная?
Evgenii123
28.04.2025, 16:23
Подскажите, так правильно выровнял?83530
Подскажите, так правильно выровнял?83530
Еще пару байт вставьте
kondor3000
28.04.2025, 17:27
Подскажите, так правильно выровнял?83530
Не правильно, 2 штуки 8 Bit это 0 адрес (один регистр или 2 байт) , Float имеет адрес 1 (занимает 1 и 2 регистр или 4 байт), то есть нечётный, а должен быть чётный ( 0,2,4,6,8 и т. д. )
Добавите 2 Byte (1 регистр ) между ними (или ещё 2 штуки 8 Bit)
Evgenii123
29.04.2025, 13:44
Не правильно, 2 штуки 8 Bit это 0 адрес (один регистр или 2 байт) , Float имеет адрес 1 (занимает 1 и 2 регистр или 4 байт), то есть нечётный, а должен быть чётный ( 0,2,4,6,8 и т. д. )
Добавите 2 Byte (1 регистр ) между ними (или ещё 2 штуки 8 Bit)
Спасибо за подсказку.
In_Da_Cher_A
29.04.2025, 17:27
Спасибо за подсказку.а вчера было
про выравнивание памяти, а оно мне зачем:D
Kalessin
15.05.2025, 16:35
Коллеги, а растолкуйте мелочь, о которой не задумываешься, пока не стукнешься об неё лбом :)) Есть код на CFC. В него надо впихнуть фрагмент из дюжины блоков, причём располагаться они должны впереди уже написанной части. Как правильно выделить для них место на рабочем пространстве? Можно, конечно, уменьшить масштаб, выделить всю диаграмму и утащить её вниз, но она развесистая, постоянно опасаешься, что где-то что-то не выделится и уедет не туда. Неужели нет штатного способа добавления рабочего пространства там, где это надо?
...
Делаешь PROGRAM XXX на CFC - 1 шт
Пихаешь туда
фрагмент из дюжины блоков,
Вставляешь 1 (один) квадратик XXX в
.. код на CFC.
Всё.
Неужели нет штатного способа добавления рабочего пространства там, где это надо?
Просто оно не надо. А если это надо - не надо этим заниматься вообще.
Лосев Олег
17.05.2025, 18:00
мне как то помог kondor3000 на форуме по вопросу сохранение уставок в панеле СП307 и присылал пример (Панель МастерСохранение уставок) Так вот я все сделал как в примере.
Присвоил PFW значение и оно появилось в эмуляции но вот копировать регистор из PFW в PSW в функциональной области копирую а в PSW ничего не отображается. Посмотрите что я делаю не так.
kondor3000
17.05.2025, 18:42
Надо копирование в PSW сделать в одной ФО, сразу все 55 регистров. Расставьте их по порядку.
А ещё у вас 1 график пишется в PFW256, то есть прямо в ваши рецепты, где все уставки.
Лосев Олег
17.05.2025, 20:22
Спасибо большое , всё получилось. Главное чтобы в ПЛК регистры не переписывать по порядку,а то переделки будет огого.
kondor3000
17.05.2025, 21:00
Спасибо большое , всё получилось. Главное чтобы в ПЛК регистры не переписывать по порядку,а то переделки будет огого.
Копировать в PSW можно группами регистров и в 4х тоже, если WORD.
Если DWORD, то в 4х лучше копировать по 2 регистра, иначе могут поменяться местами регистры.
Регистры лучше сразу расставить по порядку, сделать запасные, иначе потом переделывать ещё больше.
Kalessin
26.05.2025, 11:34
Валенок, спасибо, можно и так. Но тут новая беда стряслась. В редакторе CFC упёрся вниз после сорокового блока, ползунок вертикальной прокрутки внизу, место не добавляется, соответственно ничего больше вставить не могу. Почему? В настойках пошарил, никаких ограничений на размер рабочего поля и кол-во блоков не нашёл, на форуме тоже тишина, либо я не так запрос формулирую. Подскажите, если кто знает.
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot