Просмотр полной версии : CODESYS V3.5. Настройка обмена с другими устройствами (Modbus, ОВЕН, OPC и др.)
Страницы :
1
2
3
4
5
[
6]
7
Евгений Кислов
26.02.2024, 17:17
С Manager я справился, опросив модуль как было указано в pdf
C Агентом вроде разобрался, но при опросе с помощью приложения ManageEngine MibBrowser не получается прочитать данные.
ПЛК подключен через WAN, не знаю надо или нет, но я открыл порт 161 в настройках NAT, но все равно получаю ошибку TimedOUT
73908
https://disk.yandex.ru/d/sJ0dxL2ZZAtaeQ ссылка на проект
пробовал сначала OPAQUE тип данных, потом как в примере и STRING и Unsigned32
Посмотрите видео:
https://youtu.be/jKvbbDBBV1Y?si=wJ7cM4u_3QZKWygn
Здравствуйте, вопрос такой - хочу настроить обмен между виртуальным контроллером и панелью weintek по протоколу codesys V3. никак мне могу разобраться какой IP адрес у виртуального контроллера и как его устанавливать.
Евгений Кислов
27.02.2024, 07:39
Здравствуйте, вопрос такой - хочу настроить обмен между виртуальным контроллером и панелью weintek по протоколу codesys V3. никак мне могу разобраться какой IP адрес у виртуального контроллера и как его устанавливать.
Добрый день.
Он совпадает с IP-адресом вашего компьютера.
Я тоже так продумал , но нет - подошел 127.0.0.1 у меня другой IP
Добрый день. Есть задача связать контроллер Овен210 с семью устройствами ПР200 по сети Модбас RTU. При подключении одной ПР200 всё прекрасно - ПР200 опрашивается моментально, но при включении сразу 7 ПР200 опрос происходит с задержкой примерно 14 секунд. Есть ли способ добиться обновления данных с ПР200 хотя бы каждую секунду?
ПЛК Овен 210 выступает в качестве мастера, соответственно ПР200 слейвы.
Для Модбас мастер таймаут ответа 100 мс, время между фремами 20 мс, автоперезапуск соединения активирован.
Модбас слэйв: Таймаут ответа 1000 мс., Время цикла каналов Модбас слэйв 100 мс., на каждой ПР200 по 19 каналов.
Скорость передачи RS-485 - 9600.
Евгений Кислов
27.02.2024, 17:12
Добрый день. Есть задача связать контроллер Овен210 с семью устройствами ПР200 по сети Модбас RTU. При подключении одной ПР200 всё прекрасно - ПР200 опрашивается моментально, но при включении сразу 7 ПР200 опрос происходит с задержкой примерно 14 секунд. Есть ли способ добиться обновления данных с ПР200 хотя бы каждую секунду?
ПЛК Овен 210 выступает в качестве мастера, соответственно ПР200 слейвы.
Для Модбас мастер таймаут ответа 100 мс, время между фремами 20 мс, автоперезапуск соединения активирован.
Модбас слэйв: Таймаут ответа 1000 мс., Время цикла каналов Модбас слэйв 100 мс., на каждой ПР200 по 19 каналов.
Скорость передачи RS-485 - 9600.
Добрый день.
Все 7 ПР200 физически подключены к ПЛК210?
Добрый день.
Все 7 ПР200 физически подключены к ПЛК210?
Да, при нажатии в Кодесис кнопок : Онлайн --> Логин , рядом с ПР200 в программе появляется зеленый значок.
Пробовали сэмитировать ситуацию в офисе с двумя ПР200, задержка при обновлении данных от ПР200 составляет около 4 секунд (т.е. каждая ПР200 добавляет к увеличению времени опроса по 1,5-2 секунды)
kondor3000
27.02.2024, 18:59
Да, при нажатии в Кодесис кнопок : Онлайн --> Логин , рядом с ПР200 в программе появляется зеленый значок.
Пробовали сэмитировать ситуацию в офисе с двумя ПР200, задержка при обновлении данных от ПР200 составляет около 4 секунд (т.е. каждая ПР200 добавляет к увеличению времени опроса по 1,5-2 секунды)
Всё зависит от того, как настроен ПЛК210, скорее всего вы читаете, записываете по 1 регистру, а надо делать групповой опрос всех 19 (20) регистров за раз.
Тогда и скорость опроса возрастёт в 20 раз.
Какая скорость опроса стоит ? Максимальное расстояние до ПР200 ? Проекты на ПР200 одинаковые ?
Выкладывайте проект или скрины настроек ПЛК и ПР.
Всё зависит от того, как настроен ПЛК210, скорее всего вы читаете, записываете по 1 регистру, а надо делать групповой опрос всех 19 (20) регистров за раз.
Тогда и скорость опроса возрастёт в 20 раз.
Какая скорость опроса стоит ? Максимальное расстояние до ПР200 ? Проекты на ПР200 одинаковые ?
Выкладывайте проект или скрины настроек ПЛК и ПР.
Скорость опроса установлена на 9600.
Сейчас на пробном проекте подключены 2 ПР200 с максимальной длиной проводов между устройствами 50 сантиметров.
Проекты на Пр200 сделал одинаковые.
Каким образом можно реализовать групповой опрос?739447394573946739477394873949
kondor3000
28.02.2024, 11:03
Скорость опроса установлена на 9600.
Сейчас на пробном проекте подключены 2 ПР200 с максимальной длиной проводов между устройствами 50 сантиметров.
Проекты на Пр200 сделал одинаковые.
Каким образом можно реализовать групповой опрос?
Значит скорость лучше поднять до 115200, это первое, сделать 13 адресов подряд на чтение и читать их массивом ARRAY [0..12] OF WORD, то есть указываете начальный адрес, например 512 и длину 13 регистров.
То же самое и на запись все 8 регистров в массив ARRAY [0..7] OF WORD .
На скрине чтение и запись 16 регистров, 12 WORD и 2 REAL 73973 соотнесение 73974
Спасибо за решение проблемы!
Выявилась еще одна неприятная особенность на другом проекте.
Имеем контроллер Овен ПЛК 210-03 c написанной в Кодесис 3.5.17 патч 3 программой , который связан с Мастерскадой 4Д по OPC UA.
Периодически требуется скорректировать время в контроллере, делается это изменением соответствующих тэгов на визуализации мастерскады 4Д, которые передаются в контроллер.
При корректировке времени "вперед" все изменяется корректно, но при изменении времени "назад" происходит зависание OPC UA сервера в контроллере.
Возможно ли как-то исправить эту проблему?
Евгений Кислов
07.03.2024, 10:48
Спасибо за решение проблемы!
Выявилась еще одна неприятная особенность на другом проекте.
Имеем контроллер Овен ПЛК 210-03 c написанной в Кодесис 3.5.17 патч 3 программой , который связан с Мастерскадой 4Д по OPC UA.
Периодически требуется скорректировать время в контроллере, делается это изменением соответствующих тэгов на визуализации мастерскады 4Д, которые передаются в контроллер.
При корректировке времени "вперед" все изменяется корректно, но при изменении времени "назад" происходит зависание OPC UA сервера в контроллере.
Возможно ли как-то исправить эту проблему?
Добрый день.
Как вы определяете зависание OPC UA сервера?
Добрый день.
Как вы определяете зависание OPC UA сервера?
В программе UA Expert перестают обновляться данные по текущему времени в контроллере.
74160
Евгений Кислов
07.03.2024, 11:19
В программе UA Expert перестают обновляться данные по текущему времени в контроллере.
74160
Но статус при этом Good, судя по скриншоту.
Свяжитесь со мной через телеграм (в подписи) - посмотрим, что именно у вас происходит.
Александр_76
13.03.2024, 14:26
Добрый день.
Не получается наладить связь между ПЛК210-11-CS и сканером штрихкодов Sick CLV620. На ПЛК110 считывал данные штрихкода со сканера с помощью ФБ SysComRead. На ПЛК210 подходящей библиотеки не нашел.
Задача следующая: по сигналу с датчика принять данные от сканера по интерфейсу RS485. Сканер выступает в роли хоста, а ПЛК должен прослушивать интерфейс и улавливать отправляемые данные. Формат посылки со сканера : STX 123456 CR LF (где 123456 - это и есть нужные данные, которые необходимо получить).
Пробую решить задачу при помощи библиотеки OwenNet, ФБ OWEN_LISTEN. При работе этого ФБ на его вход/выход Buffer не поступает считанное значение, хотя в самом блоке есть буфер приема rBuf, и в нем отображаются принимаемые символы. Почему же на выходе ФБ OWEN_LISTEN нет этих символов? Я что-то делаю не так?74313743147431574316
Евгений Кислов
13.03.2024, 14:32
Добрый день.
Не получается наладить связь между ПЛК210-11-CS и сканером штрихкодов Sick CLV620. На ПЛК110 считывал данные штрихкода со сканера с помощью ФБ SysComRead. На ПЛК210 подходящей библиотеки не нашел.
Задача следующая: по сигналу с датчика принять данные от сканера по интерфейсу RS485. Сканер выступает в роли хоста, а ПЛК должен прослушивать интерфейс и улавливать отправляемые данные. Формат посылки со сканера : STX 123456 CR LF (где 123456 - это и есть нужные данные, которые необходимо получить).
Пробую решить задачу при помощи библиотеки OwenNet, ФБ OWEN_LISTEN. При работе этого ФБ на его вход/выход Buffer не поступает считанное значение, хотя в самом блоке есть буфер приема rBuf, и в нем отображаются принимаемые символы. Почему же на выходе ФБ OWEN_LISTEN нет этих символов? Я что-то делаю не так?74313743147431574316
Добрый день.
Проще сделать по примеру (ссылка на проект из него - в описании к ролику):
https://youtu.be/F_unaGOBC08?si=0VkLzVCTjy4ztXx9
Александр_76
14.03.2024, 14:05
Добрый день.
Проще сделать по примеру (ссылка на проект из него - в описании к ролику):
https://youtu.be/F_unaGOBC08?si=0VkLzVCTjy4ztXx9
Евгений, спасибо, по примеру получилось сделать. Вот еще какой вопрос остался: на ПЛК210 2 порта RS485, мне нужно подключить 3 сканера. Т.к. сканера не работают в slave режиме, получается все 3 шт я не могу повесить на один порт, на каждое устройство нужен отдельный порт? На ПЛК210 можно сделать программный порт RS485? Или приспособить под это дело RS232?
Евгений Кислов
14.03.2024, 14:08
Евгений, спасибо, по примеру получилось сделать. Вот еще какой вопрос остался: на ПЛК210 2 порта RS485, мне нужно подключить 3 сканера. Т.к. сканера не работают в slave режиме, получается все 3 шт я не могу повесить на один порт, на каждое устройство нужен отдельный порт? На ПЛК210 можно сделать программный порт RS485? Или приспособить под это дело RS232?
Вы можете использовать конвертер RS-232/RS-485.
Насколько я понимаю, в вашем случае каждый сканер должен висеть на своем порту, так как они не синхронизированы между собой и передача от любого может начаться в произвольный момент времени - если два или три сканера начнут передавать данные одновременно, то на шине будет мусор.
Александр_76
14.03.2024, 14:52
Вы можете использовать конвертер RS-232/RS-485.
Насколько я понимаю, в вашем случае каждый сканер должен висеть на своем порту, так как они не синхронизированы между собой и передача от любого может начаться в произвольный момент времени - если два или три сканера начнут передавать данные одновременно, то на шине будет мусор.
Да, все верно, передача происходит в произвольный момент времени. Про конвертер понял, попробую. Спасибо большое.
Добрый день.
Извиняюсь если плохо искал аналогичную тему на этом форуме. Вопрос по подключению контроллера заряда АКБ к PLC210-02 и чтение с него данных.
На текущий момент контроллер заряда подключен через преобразователь RS-485/RS-232 к ПК. Контроллер каждые 5 сек. отравляет в терминал данные о работе вида:
Stat=oo
Error=00
U1=12.5
U2=12.5
U3=12.5
U4=12.5
Причем данные он отправляет без всякого запроса, просто с интервалом 5 сек (интерфейс RS-485, не modbus).
Задача заключается в подключении данного контроллера через RS-232 к PLC210-02 и организации чтения данных для мониторинга работы контроллера заряда.
Прошу подсказать в каком направлении изучать программные компоненты ПЛК для реализации этой задачи. Благодарю за помощь.
МихаилГл
19.03.2024, 09:18
Добрый день.
Извиняюсь если плохо искал аналогичную тему на этом форуме. Вопрос по подключению контроллера заряда АКБ к PLC210-02 и чтение с него данных.
На текущий момент контроллер заряда подключен через преобразователь RS-485/RS-232 к ПК. Контроллер каждые 5 сек. отравляет в терминал данные о работе вида:
Stat=oo
Error=00
U1=12.5
U2=12.5
U3=12.5
U4=12.5
Причем данные он отправляет без всякого запроса, просто с интервалом 5 сек (интерфейс RS-485, не modbus).
Задача заключается в подключении данного контроллера через RS-232 к PLC210-02 и организации чтения данных для мониторинга работы контроллера заряда.
Прошу подсказать в каком направлении изучать программные компоненты ПЛК для реализации этой задачи. Благодарю за помощь.
Если в настройках контроллера заряда можно отключить трансляцию в порт и там есть модбас структура, то подключайте как обычное модбас устройство согласно документации, иначе, надо организовывать чтение данных из порта, к которому подключаете, но это всё руками делать.
https://youtube.com/playlist?list=PLUw7cl8x4xnJYec8ArbL28_3PhwQZQA4Z&si=1VieWCe6-eyZdROXhttps://youtube.com/playlist?list=PLUw7cl8x4xnJYec8ArbL28_3PhwQZQA4Z&si=1VieWCe6-eyZdROX
Евгений Кислов
19.03.2024, 09:25
Добрый день.
Извиняюсь если плохо искал аналогичную тему на этом форуме. Вопрос по подключению контроллера заряда АКБ к PLC210-02 и чтение с него данных.
На текущий момент контроллер заряда подключен через преобразователь RS-485/RS-232 к ПК. Контроллер каждые 5 сек. отравляет в терминал данные о работе вида:
Stat=oo
Error=00
U1=12.5
U2=12.5
U3=12.5
U4=12.5
Причем данные он отправляет без всякого запроса, просто с интервалом 5 сек (интерфейс RS-485, не modbus).
Задача заключается в подключении данного контроллера через RS-232 к PLC210-02 и организации чтения данных для мониторинга работы контроллера заряда.
Прошу подсказать в каком направлении изучать программные компоненты ПЛК для реализации этой задачи. Благодарю за помощь.
Добрый день.
Посмотрите видео (ссылка на пример из него - в описании к видео):
https://youtu.be/F_unaGOBC08?si=8nXR2mYC1jQAO2HG
Если в настройках контроллера заряда можно отключить трансляцию в порт и там есть модбас структура, то подключайте как обычное модбас устройство согласно документации, иначе, надо организовывать чтение данных из порта, к которому подключаете, но это всё руками делать.
https://youtube.com/playlist?list=PLUw7cl8x4xnJYec8ArbL28_3PhwQZQA4Z&si=1VieWCe6-eyZdROXhttps://youtube.com/playlist?list=PLUw7cl8x4xnJYec8ArbL28_3PhwQZQA4Z&si=1VieWCe6-eyZdROX
Возможность настройки контроллера заряда отсутствует, так что придется руками делать.
Добрый день.
Посмотрите видео (ссылка на пример из него - в описании к видео):
https://youtu.be/F_unaGOBC08?si=8nXR2mYC1jQAO2HG
Евгений, благодарю за оперативный ответ. Еще вопрос по кабелю для подключения к RS-232 ПЛК. В опциях для заказа есть несколько вариантов и поэтому интересует какую распайку использовать в данном случае?
МихаилГл
19.03.2024, 09:57
У вас устройство по умолчанию имеет 485 интерфейс, зачем вам промежуточный преобразователь? Подключайте напрямую в порту 485...
Евгений Кислов
19.03.2024, 10:00
Евгений, благодарю за оперативный ответ. Еще вопрос по кабелю для подключения к RS-232 ПЛК. В опциях для заказа есть несколько вариантов и поэтому интересует какую распайку использовать в данном случае?
Если речь о подключении устройств к этому порту - то подойдет эта распайка, но 5-6 вам не понадобится (достаточно 3-5, 7-3, 8-2):
https://owen.ru/uploads/5/kabel_ks16.png
У вас устройство по умолчанию имеет 485 интерфейс, зачем вам промежуточный преобразователь? Подключайте напрямую в порту 485...
К 485 подключены устройства по modbus. В этом случае удастся организовать одновременную работу всех устройств?
МихаилГл
19.03.2024, 10:02
К 485 подключены устройства по modbus. В этом случае удастся организовать одновременную работу всех устройств?
Тогда скрин Евгения выше. Если свободных нет.
И ещё я похоже не так понял про 232)
Тогда скрин Евгения выше. Если свободных нет.
И ещё я похоже не так понял про 232)
На самом деле 1 из 2 RS-485 на текущий момент свободен, но не хотелось бы его использовать для подключения одного устройства. Это из соображений экономии ресурсов, чтобы в будущем иметь возможность подключить к 485 несколько устройств по modbus. Может я не прав конечно)))
МихаилГл
19.03.2024, 10:18
На самом деле 1 из 2 RS-485 на текущий момент свободен, но не хотелось бы его использовать для подключения одного устройства. Это из соображений экономии ресурсов, чтобы в будущем иметь возможность подключить к 485 несколько устройств по modbus. Может я не прав конечно)))
Лучше оставить для непосредственно модбас устройств. Есть вероятность, что понадобится подключить устройство, у которого не будет таких же настроек скорости и параметров передачи, и возможно таких устройств будет много. Лучше позаботиться о такой ситуации заранее, чтоб организовать в будущем 2 группы однотипных по параметрам устройств.
Nikitos_Nu
19.03.2024, 11:57
Здравствуйте.
Возникли проблемы связи СПК107 (Master) и РАЗУМДОМ DAO2ERA (Slave) по ModBus TCP.
Ситуация такая, что я вызываю воспроизведение файла длительностью 6 секунд с помощью записи в регистр "1". И с помощью таймера через 6 секунд пишу в регистр "0", что соответствует состоянию "Стоп". Проблема в том, что воспроизведение идет 6 раз по 1 секунде. То есть посылка идет заново каждую секунду. Пробовал и циклическую отправку и по переднему фронту, и приложением. "1" записывается на секунду или меньше.
Через Modbus Tool РАЗУМДОМ DAO2ERA управляется корректно.
Подскажите, пожалуйста, где записана эта злосчастная секунда.
https://razumdom.ru/catalog/modbus_tcp/interfeysy/502/ - ссылка на описание модуля РАЗУМДОМ
https://cloud.mail.ru/public/apYr/DGkMr74b6 - ссылка на архив проекта
МихаилГл
19.03.2024, 12:27
Здравствуйте.
Возникли проблемы связи СПК107 (Master) и РАЗУМДОМ DAO2ERA (Slave) по ModBus TCP.
Ситуация такая, что я вызываю воспроизведение файла длительностью 6 секунд с помощью записи в регистр "1". И с помощью таймера через 6 секунд пишу в регистр "0", что соответствует состоянию "Стоп". Проблема в том, что воспроизведение идет 6 раз по 1 секунде. То есть посылка идет заново каждую секунду. Пробовал и циклическую отправку и по переднему фронту, и приложением. "1" записывается на секунду или меньше.
Через Modbus Tool РАЗУМДОМ DAO2ERA управляется корректно.
Подскажите, пожалуйста, где записана эта злосчастная секунда.
https://razumdom.ru/catalog/modbus_tcp/interfeysy/502/ - ссылка на описание модуля РАЗУМДОМ
https://cloud.mail.ru/public/apYr/DGkMr74b6 - ссылка на архив проекта
74491
Во первых, если будете держать кнопку "Сценарий 15" нажатой более 6 секунд, то вы вообще в тру бит переднего фронта выставите и он больше не обнулится. Если конечно нет спец кнопки (не искал).
Во вторых, 0 для сигнализации надо тоже по переднему фронту TR_play=тру отправлять. У вас неправильный код. Так я думаю.
Доброго времени суток, коллеги.
Если не сложно подсказать по MODBUS RTU как осуществлять опросы из COM порта RS485 ПЛК в HMI?
Есть карта регистров (см.прикреплённый файл).
Есть почти готовая программа, в неё нужно добавить опросы устройства по RS485 порту в HMI. Что писать в канале? какие адреса? С регистрами понятно, они 03 (чтение холдинг регистра), а вот сдвиги и переводить с шестнадцатиричного и т.п. пока не очень..
С MODBUS RTU не работал ранее:(
Карты регистров тут НЕТ. Есть пояснение, как посылать команды на запись регистров. А самих регистров нет.
Поставь нам пожалуйста задачу более точно и ясно. Простыми словами, без терминов. Опиши то, что есть из программ и оборудования, что должно получиться, через какие интерфейсы (а то RS-485 и COM-порт могут быть разными понятиями).
Хорошо, попробую.
Есть датчик ТМ-610-МС, который снимает показания направления ветра и скорость ветра. Он подключается по RS485. Схема подключения прилагаю. 3 и 4 номера проводов это питания 24 вольта постоянки.
Контроллер работает в Codesys.
Передаёт и принимает значения как в HMI так из HMI по ModBus TCP/IP. С этим проблем нет никаких. Всё работает как часы.
1. Серийный формат
8 бит данных, 1 стоповый бит, без бита четности.
Скорость передачи 9600 бит / с, программное обеспечение для последовательной отладки настроено на отправку и прием в шестнадцатеричном формате, два интервала связи не менее 500 мс, инструкции в CRC для бита четности, два байта. Адрес устройства по умолчанию - 2.
Теперь нужно внедрить датчик сюда же (в контроллер) по COM порту. Считывать с него показания скорость и направление ветра. Есть документация, в ней указаны "пояснение, как посылать команды на запись регистров."
Хочется эти данные (скорость и направление ветра) показывать на HMI панельке. Как сформировать регистры, что бы получить конечный результат?
Насколько понял я (я могу ошибаться):
1. Вначале надо разобраться, как опрашивать этот датчик и понять, требуется ли для него отдельный порт (если параметры связи у него нестандартные, то может потребоваться подключить его отдельно, а не вместе с каким-то другим оборудованием).
По датчику ни фига не понятно: то ли там RS-232, то ли RS-485. Протокол Modbus RTU может работать и там и там.
2. Потом опросить этот датчик в CodeSys. Тут тоже ничего пока не понятно: то ли это и правда протокол Modbus, то ли какой-то свой протокол, похожий на Modbus.
По картинке ничего не ясно: там называют записью, а пишут "чтение".
3. После того, как датчик будет нормально опрашиватьс в CodeSys, взять его данные и добавить в карту регистров панели оператора.
4. И потом в проекте для панели оператора получить данные с ргеистров датчика.
Если тут ничего не понятно, то стоит или подождать, когда кто-то её на форуме ответит, или всё же начать разбираться с датчиком и документацией на него.
Евгений Кислов
27.03.2024, 07:54
Основной вопрос - имеет ли ваш ПЛК лицензию на Modbus RTU для CODESYS?
2 года назад - не имел:
https://www.rusavtomatika.com/forum/viewtopic.php?f=7&t=751
Если с тех пор ничего не изменилось, то вам потребуется настраивать обмен по Modbus RTU в EasyBuilder Pro, а не CODESYS.
В сети достаточно информации о том, как это сделать.
Ага, а вопрос следующий тогда, если опрашивать его в EasyBuilder Pro? то и подключать его тогда нужно к панели, правильно понимаю?
Если верить документации, то в датчике стандартный протокол
У них на сайет есть доступ к COM порту, но он в самой панельке, а не на борту контроллера.
https://www.rusavtomatika.com/articles/kak-poluchit-dostup-k-com-portu-paneli-iz-vstroennogo-codesys-/
Евгений Кислов
27.03.2024, 08:55
Ага, а вопрос следующий тогда, если опрашивать его в EasyBuilder Pro? то и подключать его тогда нужно к панели, правильно понимаю?
Если верить документации, то в датчике стандартный протокол
Вы понимаете неправильно. cMT-CTRL01 тоже поддерживает конфигурирование в EasyBuilder Pro.
Остальное описано в статье по вашей ссылке.
Вы понимаете неправильно. cMT-CTRL01 тоже поддерживает конфигурирование в EasyBuilder Pro.
Остальное описано в статье по вашей ссылке.
Тогда при таком раскладе нужно программировать в EasyBilder PRO, а контроллер будет в роли опрашиваемого устройства. Следовательно, нужно будет менять абсолютно всю программу. Печально..
Либо ставить конвертор MODBUS RTU в MODBUS TCP/IP.
В общем, картинка у меня вырисовывается следующая - Codesys я не трогаю, пусть как есть так и будет, ставлю шлюз(преобразователь MODBUS RTU в MODBUS TCP/IP) и к нему цепляю 2 modbus RTU устройства. Далее всё завожу в общую сеть, установив роутер. Потом в EasyBuilder Pro опрашивать два новых устройства. Из опыта PROFINET обычный (домашний/бытовой) роутер гоняет спокойно, а вот MODBUS TCP/IP будет гонять? я только на 80% уверен что работать будет, хотелось бы узнать у опытных. Если сделать систему примерно как на картинке - будет сигналы видеть панелька?
Если речь о подключении устройств к этому порту - то подойдет эта распайка, но 5-6 вам не понадобится (достаточно 3-5, 7-3, 8-2):
https://owen.ru/uploads/5/kabel_ks16.png
В моем случае для подключения ПЛК 210 к контроллеру заряда через преобразователь RS-485/RS-232 (NL-232c) потребовался кабель с распайкой КС17
https://owen.ru/uploads/5/kabel_ks17.png
Задействовал только контакты 3-5, 7-2, 8-3.
Может кому-то пригодится.
Назаров Александр
17.04.2024, 09:27
При нажатии на ячейку с начальным адресом массива Регистров временного хранения появилась буква "М". Теперь невозможно изменить размер массива. Что это и как с этим работать?
75231
Евгений Кислов
17.04.2024, 09:39
При нажатии на ячейку с начальным адресом массива Регистров временного хранения появилась буква "М". Теперь невозможно изменить размер массива. Что это и как с этим работать?
75231
https://www.owen.ru/forum/showthread.php?t=28167&p=305691&viewfull=1#post305691
Назаров Александр
17.04.2024, 09:53
При эксперте соотнесений LeftSide в файл CSV несутся некоторые переменные, которых нет во вкладке соотнесения модуля. При обратном импорте возникают ошибки импортирования. Проблема в том, что текст описания данных переменных разделен ";". Отсюда проблема.
75232
Евгений Кислов
17.04.2024, 10:02
При эксперте соотнесений LeftSide в файл CSV несутся некоторые переменные, которых нет во вкладке соотнесения модуля. При обратном импорте возникают ошибки импортирования. Проблема в том, что текст описания данных переменных разделен ";". Отсюда проблема.
75232
Поправим при обновлении таргетов.
Назаров Александр
17.04.2024, 10:15
https://www.owen.ru/forum/showthread.php?t=28167&p=305691&viewfull=1#post305691
При этом работать можно? Двойное определение сделано преднамеренно, чтобы таким способом поименовать переменную.
Представленное ниже Допустимо?
VAR_GLOBAL
// LeftSide
// INPUT
d_INPUT_PLC_LeftSide AT %ID15: DWORD; (*Маска дискретных входов ПЛК. Левая сторона. FDI_01 - DI_12*)
// OUTPUT
x_OUTPUT_PLC_LeftSide_0 AT %QX44.0: BOOL; (*Дискретный выход ПЛК DO_01*)
x_OUTPUT_PLC_LeftSide_1 AT %QX44.1: BOOL; (*Дискретный выход ПЛК DO_02*)
x_OUTPUT_PLC_LeftSide_2 AT %QX44.2: BOOL; (*Дискретный выход ПЛК DO_03*)
x_OUTPUT_PLC_LeftSide_3 AT %QX44.3: BOOL; (*Дискретный выход ПЛК DO_04*)
w_OUTPUT_PLC_LeftSide: WORD; (*Маска дискретных выходов ПЛК. Левая сторона. DO_01 - DO_04*)
//RightSide
// INPUT
d_INPUT_PLC_RightSide AT %ID35: DWORD; (*Маска дискретных входов ПЛК. Правая сторона. DI_13 - DI_24*)
d_OUTPUT_PLC_RightSide AT %QD35: DWORD; (*Маска дискретных выходов ПЛК. Правая сторона. DO_05 - DO_12*)
END_VAR
Евгений Кислов
17.04.2024, 11:01
Если вы понимаете, как работает AT-адресация - то можете ее использовать.
Со своей стороны я бы не рекомендовал ее применять без существенной необходимости.
Назаров Александр
17.04.2024, 14:44
Поправим при обновлении таргетов.
Импорт файла соотнесения модуля должен содержать все переменные или он заменит только те строки, которые находятся в файле, а остальные останутся старыми?
Евгений Кислов
17.04.2024, 16:04
Импорт файла соотнесения модуля должен содержать все переменные или он заменит только те строки, которые находятся в файле, а остальные останутся старыми?
Заменит только те строки, которые находятся в файле. Остальные останутся старыми.
Назаров Александр
17.04.2024, 20:28
Не импортируется файл глобальных переменных с комментариями на кириллице.
Если у переменной нет комментария (латиница) после ее определения , то в качестве, если есть, подхватывается закомментированная строка перед ней.
Евгений Кислов
18.04.2024, 07:12
Не импортируется файл глобальных переменных с комментариями на кириллице.
Если у переменной нет комментария (латиница) после ее определения , то в качестве, если есть, подхватывается закомментированная строка перед ней.
Выложите, пожалуйста, ваш проект и файл импорта, с помощью которых можно воспроизвести вашу проблему.
Назаров Александр
18.04.2024, 09:11
Выложите, пожалуйста, ваш проект и файл импорта, с помощью которых можно воспроизвести вашу проблему.
В проекте сейчас импортируется файл с транслитерацией кириллицы. Грузится без ошибок. Во CDS2.3. эта процедура работала гораздо лучше, в плане того что при записи в ПК изменений в импортируемый файл он моментально обновлялся в CDS.
Евгений Кислов
18.04.2024, 09:52
В проекте сейчас импортируется файл с транслитерацией кириллицы. Грузится без ошибок. Во CDS2.3. эта процедура работала гораздо лучше, в плане того что при записи в ПК изменений в импортируемый файл он моментально обновлялся в CDS.
Чтобы в V3.5 работало корректно - надо использовать другой подход к комментариям:
{attribute 'qualified_only'}
// Комментарий 1
VAR_GLOBAL
// Комментарий 2
w_PLC_DI_LeftSide AT %IW0: WORD;
// Комментарий 3
xSON_TS AT %IX0.1: BOOL;
// Комментарий 4
xSOF_TS AT %IX0.1: BOOL;
END_VAR
Назаров Александр
18.04.2024, 10:58
Чтобы в V3.5 работало корректно - надо использовать другой подход к комментариям:
{attribute 'qualified_only'}
// Комментарий 1
VAR_GLOBAL
// Комментарий 2
w_PLC_DI_LeftSide AT %IW0: WORD;
// Комментарий 3
xSON_TS AT %IX0.1: BOOL;
// Комментарий 4
xSOF_TS AT %IX0.1: BOOL;
END_VAR
Спасибо! Это касается только импорта?
Евгений Кислов
18.04.2024, 11:12
Спасибо! Это касается только импорта?
В основном, импорта.
Назаров Александр
18.04.2024, 17:26
Чтобы в V3.5 работало корректно - надо использовать другой подход к комментариям:
{attribute 'qualified_only'}
// Комментарий 1
VAR_GLOBAL
// Комментарий 2
w_PLC_DI_LeftSide AT %IW0: WORD;
// Комментарий 3
xSON_TS AT %IX0.1: BOOL;
// Комментарий 4
xSOF_TS AT %IX0.1: BOOL;
END_VAR
Другой подход для кириллицы тоже не катит. Потратил только время. Компилятору все равно как оформлен комментарий. Ему однозначно не нравится кириллица или то как он ее считывает
// Kommentarij khot' kakoj, l'sh' by ne russkij
// Kommentarij khot' kakoj, l'sh' by ne russkij
w_PLC_DI_LeftSide AT %IW0: WORD;
// Kommentarij khot' kakoj, l'sh' by ne russkij
xSON_TS AT %IX0.1: BOOL;
// Kommentarij khot' kakoj, l'sh' by ne russkij
xSOF_TS AT %IX1.2: BOOL;
// Kommentarij khot' kakoj, l'sh' by ne russkij
w_PLC_DI_RightSide AT %IW1: WORD;
Евгений Кислов
19.04.2024, 08:45
Другой подход для кириллицы тоже не катит. Потратил только время. Компилятору все равно как оформлен комментарий. Ему однозначно не нравится кириллица или то как он ее считывает
https://ftp.owen.ru/CoDeSys3/99_ForumFiles/Gvl_Import_russian_comments.mp4
Назаров Александр
19.04.2024, 17:29
Проблема оказалась в кодировке КИРИЛЛИЦЫ. Нужна UTF-8. По крайней мере на неё перекодировал. Виды комментариев работают оба. Спасибо Евгению Кислову за терпение.
При обмене ПЛК210-01-CS с MOXA nPort 5130A сыпятся ошибки. При этом с модулями МВ210-101 связь стабильная, без ошибок.
В дереве
76223
возле "MOXA NPort" циклически меняются значки 76224 -> 76225 -> 76226. При этом счётчик Error Counter постоянно увеличивается, хотя данные от устройства, подключенного к nPort по RS485 Modbus RTU передаются в ПЛК, но не долго. Через несколько дней (~3...4 дня) обмен прекращается. Не пойму, что не так. :confused:
Вот код подключения к nPort и опроса удалённого устройства:
Объявления:
TCP_MOXA : OCL.TCP_Client; // ФБ подключения к MOXA NPort 5130A по TCP/IP
timertcp : TON;
MB_US800_4_AI1 : OCL.MB_TcpRequest; // ФБ опроса расходомера (канал №1) по MODBUS RTU over TCP
awAI1 : ARRAY [1..4] OF WORD; // регистры канала №1, считанные из расходомера
Программа:
(* MOXA NPort 5130A *)
TCP_MOXA(xEnable := NOT timertcp.Q, sIpAddr := '192.168.128.37', uiPort := 4001, tTimeout:=T#500MS);
IF TCP_MOXA.xDone OR TCP_MOXA.xError THEN
TCP_MOXA.xEnable := FALSE;
END_IF;
timertcp(IN := (TCP_MOXA.xDone OR TCP_MOXA.xError) AND NOT timertcp.Q, PT:= T#1S);
(* опрос расходомера (канал №1) *)
MB_US800_4_AI1(
xExecute := TCP_MOXA.xActive,
hConnection := TCP_MOXA.hConnection,
tTimeout := T#100MS, // Время ожидания ответа
xIsRtuOverTcpMode := TRUE, // Протокол MODBUS RTU over TCP
usiUnitId := 4, // Адрес устройства в сети RS485
eFuncCode := 16#03, // Функция MODBUS RTU
uiDataAddr := 16#200, // Начальный обрабатываемый регистр
uiDataCount := 4, // Количество обрабатываемых регистров
pData := ADR(awAI1),
szSize := SIZEOF(awAI1)
);
IF MB_US800_4_AI1.xDone OR MB_US800_4_AI1.xError THEN
MB_US800_4_AI1(xExecute := FALSE); // После выполнения блока, его надо сбросить
GVL.voc2a_F_fwd := WORD2_TO_REAL(awAI1[1], awAI1[2]); // Читаем Параметр1
GVL.voc2a_Fs_fwd := WORD2_TO_UDINT(awAI1[3], awAI1[4]); // Читаем Параметр2
END_IF;
При подключении видно, что у MOXA_NPort выход xBusy постоянно TRUE, а, судя по не запускающемуся таймеру timertcp, выход xDone у MOXA_NPort постоянно FALSE:
76227
Нормально ли это? Я предполагал, что после каждого успешного выполнения xDone должен переключаться в TRUE или после неуспешного выполнения xError должен переключаться в TRUE.
Александр Пинэко-Скворцов
04.06.2024, 09:16
При обмене ПЛК210-01-CS с MOXA nPort 5130A сыпятся ошибки. При этом с модулями МВ210-101 связь стабильная, без ошибок.
В дереве
76223
возле "MOXA NPort" циклически меняются значки 76224 -> 76225 -> 76226. При этом счётчик Error Counter постоянно увеличивается, хотя данные от устройства, подключенного к nPort по RS485 Modbus RTU передаются в ПЛК, но не долго. Через несколько дней (~3...4 дня) обмен прекращается. Не пойму, что не так. :confused:
Вот код подключения к nPort и опроса удалённого устройства:
Объявления:
Программа:
При подключении видно, что у MOXA_NPort выход xBusy постоянно TRUE, а, судя по не запускающемуся таймеру timertcp, выход xDone у MOXA_NPort постоянно FALSE:
76227
Нормально ли это? Я предполагал, что после каждого успешного выполнения xDone должен переключаться в TRUE или после неуспешного выполнения xError должен переключаться в TRUE.
Добрый день.
1.
Поясните, пожалуйста, для чего добавляете NPort как устройство в дереве проекта, если уже работаете через библиотеку?
Если Вам требуется реализовать Modbus RTU over TCP, то следует оставить только код.
2.
Попробуйте для теста оставить статически .xEnable := TRUE в строке вызова блока TCP_MOXA.
См. пример на стр. 166 документа: https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_Modbus_v3.2.pdf
Добрый день.
1.
Поясните, пожалуйста, для чего добавляете NPort как устройство в дереве проекта, если уже работаете через библиотеку?
Думал, что надо и там и там.
Если Вам требуется реализовать Modbus RTU over TCP, то следует оставить только код.
Убрал из дерева. Оставил только вызов ФБ из кода.
Попробуйте для теста оставить статически .xEnable := TRUE в строке вызова блока TCP_MOXA.
Сделал. Пока работает. Будем набирать статистику и смотреть, не завис ли обмен снова.
При обмене ПЛК210-01-CS с MOXA nPort 5130A сыпятся ошибки. При этом с модулями МВ210-101 связь стабильная, без ошибок.
В дереве
76223
возле "MOXA NPort" циклически меняются значки 76224 -> 76225 -> 76226. При этом счётчик Error Counter постоянно увеличивается, хотя данные от устройства, подключенного к nPort по RS485 Modbus RTU передаются в ПЛК, но не долго. Через несколько дней (~3...4 дня) обмен прекращается. Не пойму, что не так. :confused:
Вот код подключения к nPort и опроса удалённого устройства:
Объявления:
Программа:
При подключении видно, что у MOXA_NPort выход xBusy постоянно TRUE, а, судя по не запускающемуся таймеру timertcp, выход xDone у MOXA_NPort постоянно FALSE:
76227
Нормально ли это? Я предполагал, что после каждого успешного выполнения xDone должен переключаться в TRUE или после неуспешного выполнения xError должен переключаться в TRUE.
MB_US800_4_AI1(xExecute := FALSE); // После выполнения блока, его надо сбросить
Вот эту строчку надо в самый конец, так как она обнуляет все флаги. Иначе можете ошибки связи не увидеть
Назаров Александр
17.06.2024, 12:17
У меня в вашем проекте нет ошибок компиляции.
71403
Если свяжитесь по телеграм (в подписи) и предоставите доступ по AnyDesk - посмотрим, в чем у вас дело.
Такая же ситуация. Возникла при добавлении регистра записи по фронту. Помогите пожалуйста.
Евгений Кислов
17.06.2024, 12:24
Такая же ситуация. Возникла при добавлении регистра записи по фронту. Помогите пожалуйста.
Добрый день.
Мой телеграм указан в подписи.
Напишите, пожалуйста, туда - оперативно разберемся.
edvard_munch
17.06.2024, 14:50
Подскажите, а есть ли готовые или общепринятые способы распознавания восстановления связи с ПЧВ01[МО1]?
Сделал вариант, который работает с помощью отслеживания текущего входного напряжения на ПЧВ.
При разнице с предыдущим сохраненным значением выше определенного значения считать что связь восстановилась
В данном случае для себе взял значение 150 (трех фаз у меня пока нет).
Цель - ПЛК при включении частотника должен писать в него (частотник) значение по умолчанию.
IF (currentVoltage - savedVoltage) > 150 THEN
FrequencySetOutputValue:= FrequencySetStartupValue;
triggerFrequencySetOutputValue:= TRUE;
END_IF
//можно попробовать использовать xError или другие варианты, типа OwenDriver.hasError
//но xInitDone хоть и интуитивно не так понятен, но стабильно TRUE если есть связь и FALSE,
//если нет
IF NOT PChV1_M01.xInitDone THEN
currentVoltage := 0;
END_IF
savedVoltage := currentVoltage
Но этот способ кажется корявым, что скажете?
До этого пытался соорудить что-то, сделав счетчик Модбас передач с помощью xDone, сохраняя и сравнивая предыдущее значение с текущим.
Пытаясь потом поймать момент восстановления, когда значения счетчиков сравнялись и xDone снова в True.
Стабильно рабочего варианта не вышло, ибо измененное текущее значение периодически перетиралось дефолтным.
//Работает при включении-выключении ПЧВ, но также счетчики периодически сравниваются при стабильно включенном ПЧВ
IF (pchvModbusCountSaved = pchvModbusCount) AND PChV1_M01.xDone THEN
FrequencySetOutputValue:= FrequencySetStartupValue;
triggerFrequencySetOutputValue:= TRUE;
END_IF
//каждые 300 (например) циклов, сохраняем значение счетчика
IF cycleCount MOD 300 = 0 THEN
pchvModbusCountSaved := pchvModbusCount;
END_IF
IF PChV1_M01.xDone THEN
pchvModbusCount := pchvModbusCount + 1;
END_IF
edvard_munch А можно пояснить подробности:
* Как ПЧВ опрашивается? Через шаблон или через Modbus Slave Device?
* ПЛК же Master, верно?
* Связь по Modbus TCP или Modbus RS-485?
* Почему не годится стандартный способ с .xError?
На всякий случай оставлю ссылку на свою статью с обработкой ошибок и связи: https://cs-cs.net/technologii-testirovaniya-i-otladky-shhgitov-s-svtomatikoy-na-plk#6__modbus___ai__io
В ней надо почитать заголовок 6. Там есть описание того, как можно при помощи включенной диагностики и .xError получать ошибки опроса устройства с защитой от случайно возникающих ошибок.
edvard_munch
17.06.2024, 16:10
edvard_munch А можно пояснить подробности:
* Как ПЧВ опрашивается? Через шаблон или через Modbus Slave Device?
* ПЛК же Master, верно?
* Связь по Modbus TCP или Modbus RS-485?
* Почему не годится стандартный способ с .xError?
На всякий случай оставлю ссылку на свою статью с обработкой ошибок и связи: https://cs-cs.net/technologii-testirovaniya-i-otladky-shhgitov-s-svtomatikoy-na-plk#6__modbus___ai__io
В ней надо почитать заголовок 6. Там есть описание того, как можно при помощи включенной диагностики и .xError получать ошибки опроса устройства с защитой от случайно возникающих ошибок.
1) Шаблон
2) Мастер
3) RS-485
4) Спасибо, сейчас еще раз посмотрю внимательно на xError, возможно зря я полез в дебри, и не понял до конца как работать с xError
сейчас еще раз посмотрю внимательно на xError, возможно зря я полез в дебри, и не понял до конца как работать с xError
Да! Это оно! Единственное неудобство в том, что на момент ошибки xError становится TRUE, а при следующей попытке опроса сбрасывается на FALSE.
Я у себя в статье как раз это описал (ради этого стоит почитать) и показал, как сделал систему выдержки на паре таймеров.
Её суть такая, образно: "Одна ошибочка появилась - значит, глюк. О, а если пошли несколько ошибок подряд - то это точно отвал связи".
edvard_munch
17.06.2024, 18:22
Да! Это оно! Единственное неудобство в том, что на момент ошибки xError становится TRUE, а при следующей попытке опроса сбрасывается на FALSE.
Я у себя в статье как раз это описал (ради этого стоит почитать) и показал, как сделал систему выдержки на паре таймеров.
Её суть такая, образно: "Одна ошибочка появилась - значит, глюк. О, а если пошли несколько ошибок подряд - то это точно отвал связи".
Все, разобрался. Набросал быстренько пока такой код. Работает. Спасибо!
pchvModbusErrorsComing: TOF;
pchvModbusConnectionError: TON;
modbusErrorTimeout: TIME:= T#1000MS;
modbusErrorSeriesTimeout: TIME:= T#3000MS;
fTrigPchvRestarted: F_TRIG;
pchvModbusErrorsComing(IN:= PChV1_M01.xError, PT:= modbusErrorTimeout);
pchvModbusConnectionError(IN:= pchvModbusErrorsComing.Q, PT:= modbusErrorSeriesTimeout);
fTrigPchvRestarted(CLK:= pchvModbusConnectionError.Q);
IF fTrigPchvRestarted.Q THEN
FrequencySetOutputValue:= FrequencySetStartupValue;
triggerFrequencySetOutputValue:= TRUE;
END_IF
Все, разобрался. Набросал быстренько пока такой код. Работает. Спасибо!
О, класс! Наконец-то кто-то внимательно прочитал ту мою статью, ахаха (спасибо, мне приятно что в дело пошло)!
Отлично! В будущем это можно, как у меня, запихать в функциональный блок, и для разных устройств создавать его экземпляры!
PS. А не надо потом триггер записи в ПЧВ сбрасывать? Да, сам ПЛК запишет его по фронту, но а в коде не надо?
Можно его, например, обрабатывать через таймер TP и на время 500 ms поставить.
edvard_munch
18.06.2024, 10:11
PS. А не надо потом триггер записи в ПЧВ сбрасывать? Да, сам ПЛК запишет его по фронту, но а в коде не надо?
Можно его, например, обрабатывать через таймер TP и на время 500 ms поставить.
Да, надо, у меня все триггеры сбрасываются в начале каждого цикла. Это кусочек кода, относящийся к конкретной проблеме.
Также у меня там триггер поднимается по приходу сигнала об увеличении/уменьшении частоты.
И в первом цикле программы, чтоб при перезагрузке контроллера отправить нужную частоту на ПЧВ.
Из всего что относится к ПЧВ:
cycleCount := cycleCount + 1;
triggerFrequencySetOutputValue := FALSE;
IF cycleCount = 1 THEN
FrequencySetOutputValue:= FrequencySetStartupValue;
triggerFrequencySetOutputValue:= TRUE;
END_IF
pchvModbusErrorsComing(IN:= PChV1_M01.xError, PT:= modbusErrorTimeout);
pchvModbusConnectionError(IN:= pchvModbusErrorsComing.Q, PT:= modbusErrorSeriesTimeout);
fTrigPchvRestarted(CLK:= pchvModbusConnectionError.Q);
IF fTrigPchvRestarted.Q THEN
FrequencySetOutputValue:= FrequencySetStartupValue;
triggerFrequencySetOutputValue:= TRUE;
END_IF
IF frequencyUpSignal THEN
frequencySetOutputValue := frequencySetInputValue + frequencyStep;
triggerFrequencySetOutputValue := TRUE;
END_IF
IF frequencyDownSignal THEN
frequencySetOutputValue := frequencySetInputValue - frequencyStep;
triggerFrequencySetOutputValue := TRUE;
END_IF
P.S. Если что, нашел потом ошибку у себя. В счетчике циклов. При превышении верхнего лимита числового типа отсчет же снова начинается с единицы и происходят ненужные перезаписи частоты.
Нужно добавить такую проверку (заодно поменял тип с UINT на USINT), чтобы только в действительно первом цикле происходила запись.
Перескакивать сразу на цикл номер 2 по достижении верхнего предела
cycleCount: USINT := 0;
usintUpperLimit: USINT := 255;
IF cycleCount = usintUpperLimit THEN
cycleCount:= cycleCount + 3;
END_IF
Ну а вообще наверное нужно Кодсисовский метод FB_INIT() раскурить. Только о нем узнал. Похоже что он как раз для выполнения действий один раз при старте контроллера.
edvard_munch Ага, понял!
Про FB_INIT я не в курсе. Хотел написать про другой приём, но потом вспомнил, что он позволяет записать нужные значения по Modbus при начале опроса устройства (или после отвала связи), но значения там фиксированные (программно не задаются). И это не подходит.
Evgen Dnepr
08.07.2024, 10:00
Не могу найти поиском в EtherCAT, модуль ввода-вывода Sontheim DIO 32 . На сайте производителя файл для скачивания я не нашел! Подскажите какие варианты поиска возможны? 77132
Evgen Dnepr EtherCAT в ПЛК Овен не реализован, это отдельная лицензия.
fizhimik
12.07.2024, 14:31
Добрый день! Подскажите как правильно организовать переключение триггерной переменной для записи значений в Mosbus Slave по нажатию кнопки на сенсорном экране? Предполагаю, что это можно сделать через таймер. Однако если на запись будет много переменных, то делать кучу таймеров очевидно не правильно. Как следует поступить?
Очевидно один таймер для включения "триггерной переменной" при изменении любой из вашего большого списка переменных.
У меня так на последнем.
// передача триггеров в частотник
front_on_delayTimer(IN:=front_on_delayTimer_start, PT:=front_delayTime); // Запуск таймера задержки после поднятия фронта
front_off_delayTimer(IN:=front_off_delayTimer_star t, PT:=front_delayTime); // Запуск таймера задержки после снятия фронта
IF (G.ROT <> G.ROT_SET) THEN pchv_send:=TRUE; G.ROT:=G.ROT_SET; END_IF
IF (G.FREQ <> G.FREQ_SET) THEN pchv_send:=TRUE; G.FREQ := G.FREQ_SET; END_IF
IF pchv_send AND pchv_send_en THEN pchv_send1Completed:=FALSE;pchv_send:=FALSE; END_IF
// установка переднего фронта
IF NOT pchv_send1Completed THEN pchv_send_en:=FALSE;
pchv_send1Completed := TRUE; // Установка флага завершения первого действия
front_on_delayTimer_start:=TRUE;
G.TR1:=G.TR2:=TRUE; // включить передачу команды управления
END_IF
// снятие переднего фронта
IF front_on_delayTimer.Q AND pchv_send1Completed AND NOT pchv_send2Completed THEN
front_on_delayTimer_start:=FALSE; // Сброс таймера
front_off_delayTimer_start:=TRUE;
pchv_send2Completed := TRUE; // Установка флага завершения второго действия
G.TR1:=G.TR2:=FALSE; // выключить передачу команды управления
END_IF
// задержка после снятия фронта
IF front_off_delayTimer.Q AND pchv_send2Completed THEN pchv_send2Completed:=FALSE; front_off_delayTimer_start:=FALSE; pchv_send_en:=TRUE; END_IF
fizhimik
12.07.2024, 17:04
Очевидно один таймер для включения "триггерной переменной" при изменении любой из вашего большого списка переменных.
У меня так на последнем.
// передача триггеров в частотник
front_on_delayTimer(IN:=front_on_delayTimer_start, PT:=front_delayTime); // Запуск таймера задержки после поднятия фронта
front_off_delayTimer(IN:=front_off_delayTimer_star t, PT:=front_delayTime); // Запуск таймера задержки после снятия фронта
IF (G.ROT <> G.ROT_SET) THEN pchv_send:=TRUE; G.ROT:=G.ROT_SET; END_IF
IF (G.FREQ <> G.FREQ_SET) THEN pchv_send:=TRUE; G.FREQ := G.FREQ_SET; END_IF
IF pchv_send AND pchv_send_en THEN pchv_send1Completed:=FALSE;pchv_send:=FALSE; END_IF
// установка переднего фронта
IF NOT pchv_send1Completed THEN pchv_send_en:=FALSE;
pchv_send1Completed := TRUE; // Установка флага завершения первого действия
front_on_delayTimer_start:=TRUE;
G.TR1:=G.TR2:=TRUE; // включить передачу команды управления
END_IF
// снятие переднего фронта
IF front_on_delayTimer.Q AND pchv_send1Completed AND NOT pchv_send2Completed THEN
front_on_delayTimer_start:=FALSE; // Сброс таймера
front_off_delayTimer_start:=TRUE;
pchv_send2Completed := TRUE; // Установка флага завершения второго действия
G.TR1:=G.TR2:=FALSE; // выключить передачу команды управления
END_IF
// задержка после снятия фронта
IF front_off_delayTimer.Q AND pchv_send2Completed THEN pchv_send2Completed:=FALSE; front_off_delayTimer_start:=FALSE; pchv_send_en:=TRUE; END_IF
Спасибо. Буду знать что и так можно.
Я в принципе сделал, как в свое время нам показал Евгений Кислов, через По нажатию> Изменение значения>выполнить ST код>присвоить триггеру True. Если триггер True, то запускается таймер на 1 с, триггер = not (выход таймера ).
Запихал таймер в функциональный блок по руководству Первый старт 3.5.
Хотелось бы чтобы пример записи по переднему фронту вошла в новый Первый старт или руководство по Modbus.
Я использую таймер TP у себя в таких решениях. Да, на каждый канал опроса (если там триггер надо дёргать отдельно от всех) используется свой таймер.
TP удобен тем, что он по короткому импульсу на входе (минимальная длина - один цикл) запускается и дорабатывает нужное время сам.
Поэтому, образно, на его вход можно сразу вешать кнопку, а выход выводить на триггер.
TP удобен тем, что он по короткому импульсу на входе (минимальная длина - один цикл) запускается и дорабатывает нужное время сам.
Поэтому, образно, на его вход можно сразу вешать кнопку, а выход выводить на триггер.
Мне удобнее кодом писать, ТР наверное в него тоже вставить не проблема, но вот в чём затык вижу и ловил его несколько раз пока не сделал по приведённому выше коду: если на ТР подать входной сигнал, он должен отработать заданное время и обнулить выход. НО если на него сигналы сыпятся по какой-то причине не останавливаясь, в цикле например, то и выход он не обнулит либо обнулит на крайне короткий срок, который частотник не воспримет как снятие фронта. И новую команду не выполнит. Соответственно его ещё нужно дополнительно обвязать, так что-бы обязательно была достаточная пауза на снятие фронта при любом раскладе.
yray Это вообще-то принцип работы TP, можете даже диаграмму посмотреть. Чему вы удивляетесь?
Где вы увидели удивление ?
но вот в чём затык вижу и ловил его несколько раз пока не сделал по приведённому выше коду
а это что? вы увидели затык в том, что является сутью TP
fizhimik
17.07.2024, 14:49
Подскажите как правильно сделать чтение нескольких holding регистров в codesys 3.5. Прибор без проблем опрашивается OPC сервером через тип данных string с длиной строки 12 старшим байтом вперед. В кодесисе штатными средствами опроса по modbus чтение по функции 3 c длиной 12 приводит к ошибке. Как надо правильно осуществить опрос?
fizhimik
17.07.2024, 14:54
Подскажите как правильно сделать чтение нескольких holding регистров в codesys 3.5. Прибор без проблем опрашивается OPC сервером через тип данных string с длиной строки 12 старшим байтом вперед. В кодесисе штатными средствами опроса по modbus чтение по функции 3 c длиной 12 приводит к ошибке. Как надо правильно осуществить опрос?
Сам догадался, надо было длину 6 ставить. У нас же тип данных word в опросе, а он 2 байта занимает.
Можно ещё и DWORD если не хватает, например для МВ110-32
fizhimik
17.07.2024, 16:20
Подскажите как правильно сделать чтение нескольких holding регистров в codesys 3.5. Прибор без проблем опрашивается OPC сервером через тип данных string с длиной строки 12 старшим байтом вперед. В кодесисе штатными средствами опроса по modbus чтение по функции 3 c длиной 12 приводит к ошибке. Как надо правильно осуществить опрос?
Я тут неверно описал все. Надо правильно было интерпретировать мануал: в мануале таблица с кадром запроса ... число регистров на чтение 12, а потом идет текстовка расшифровка каждого байта - и их 12. Штатная команда чтения по функции 3 сразу определяет тип данных как Word, а это 2 байта
Dead Kid
22.07.2024, 16:05
Здравствуйте. Хотел бы спросить, как передавать переменные типа String из панели СП310Р в ПЛК210 CODESYS 3.5. Видел пример для CODESYS 2.3, но в 3.5 не знаю как задать String Input Module. Если не получится и надо будет на Word разбивать приходящую переменную, то какой функцией её обратно в String собрать?
Евгений Кислов
22.07.2024, 16:18
Здравствуйте. Хотел бы спросить, как передавать переменные типа String из панели СП310Р в ПЛК210 CODESYS 3.5. Видел пример для CODESYS 2.3, но в 3.5 не знаю как задать String Input Module. Если не получится и надо будет на Word разбивать приходящую переменную, то какой функцией её обратно в String собрать?
Добрый день.
Посмотрите пример - по-моему, там это демонстрируется.
https://ftp.owen.ru/CoDeSys3/21_Examples/01_3.5.11.5/03_Modbus/Example_SP3xx_PLC210_3517_v1.zip
Dead Kid
22.07.2024, 17:29
Нашёл, спасибо. Всё оказалось намного проще
Andrunchic
24.07.2024, 11:05
Добрый день
Подскажите как можно в библиотеке OwenSnmp изменить заголовок OID ?
Евгений Кислов
24.07.2024, 11:09
Добрый день
Подскажите как можно в библиотеке OwenSnmp изменить заголовок OID ?
Добрый день.
Речь, видимо, о режиме агента?
В нем OID'ы формируются автоматически, и повлиять на это нельзя.
edvard_munch
24.07.2024, 14:36
А как правильно в режиме мастера менять настройки com порта в коде
Так должно работать? (у меня не работает)
Modbus_Master_COM_Port.xStop := TRUE;
Modbus_Master_COM_Port.UpdateComParameters(udiBaud rate:=9600);
Modbus_Master_COM_Port.xStop := FALSE;
Не нашел где онлайн проверять состояние данных параметров (в каких переменных хранятся, чтоб их прочитать). Кроме основной вкладки.
77552
И кстати, если вписать "подготовленное значение" и "записать настройки" должно ли меняться текущее значение?
Евгений Кислов
24.07.2024, 16:05
Так должно работать? (у меня не работает)
1. Нужно указать все аргументы метода (в частности, номер COM-порта).
2. В современных версиях CODESYS есть баг: этот метод не срабатывает (возвращает ERR_PARAMETER), если задаваемая четность = NONE.
И кстати, если вписать "подготовленное значение" и "записать настройки" должно ли меняться текущее значение?
По идее - да. Но для Modbus я этого не проверял.
edvard_munch
29.07.2024, 11:52
По идее - да. Но для Modbus я этого не проверял.
Не работает, к сожалению. В целом это и не нужно, но хотелось бы понимать что это может быть как-то связано с работой метода UpdateComParameters или нет
1. Нужно указать все аргументы метода (в частности, номер COM-порта).
2. В современных версиях CODESYS есть баг: этот метод не срабатывает (возвращает ERR_PARAMETER), если задаваемая четность = NONE.
Пока метод не работает, пробовал варианты вызова с разными параметрами. Сделал специально пустой проект.
Как-то можно это отлаживать и увидеть что метод возвращает? Либо только простой вариант, подключить какой-то девайс на определенной скорости и меняя скорость на шине по пропавшей связи с девайсом понимать что настройки изменились?
Мб эту функцию попробовать раскурить, чтобы ловить текущие настройки порта. Но пока параметры не выглядят очень понятными
https://content.helpme-codesys.com/en/libs/SysCom/3.5.17.0/SysComGetSettings2.html
Каких-то особых настроек для Device не нужно, кроме "Enable Diagnosis"?
Евгений Кислов
29.07.2024, 12:06
Каких-то особых настроек для Device не нужно, кроме "Enable Diagnosis"?
Нет. Вот видео с демонстрацией работы метода - меняем скорость с 9600 на 19200. Оно снято пару лет назад, когда еще можно было задавать четность = NONE таким образом.
https://ftp.owen.ru/CoDeSys3/99_ForumFiles/ModbusChangeBaudrate.mp4
edvard_munch
29.07.2024, 12:14
Нет. Вот видео с демонстрацией работы метода - меняем скорость с 9600 на 19200. Оно снято пару лет назад, когда еще можно было задавать четность = NONE таким образом.
https://ftp.owen.ru/CoDeSys3/99_ForumFiles/ModbusChangeBaudrate.mp4
Я его находил сегодня по ссылке ниже)
https://forge.codesys.com/forge/talk/Engineering/thread/f1e0eba57a/
edvard_munch
29.07.2024, 12:44
Кстати, при попытке поменять настройки онлайн из интерфейса выбранное новое значение четности сразу сбрасывается почему-то
Запись с экрана - https://disk.yandex.ru/i/VMkj50bWbK2iXg
sng21099
29.07.2024, 14:52
Добрый день! Подскажите пожалуйста, как обстоят дела с ProfiNet у ОВЕН ПЛК210? Добавил через eds файл пневмоостров, настроил адреса, а при заливке программы на контроллер не получается выполнить операцию "Run". При этом контроллер уходит в периодический ребут. Может есть мануалы по этому интерфейсу?
Евгений Кислов
29.07.2024, 15:51
Добрый день! Подскажите пожалуйста, как обстоят дела с ProfiNet у ОВЕН ПЛК210? Добавил через eds файл пневмоостров, настроил адреса, а при заливке программы на контроллер не получается выполнить операцию "Run". При этом контроллер уходит в периодический ребут. Может есть мануалы по этому интерфейсу?
Добрый день.
Profinet не поддерживается.
МихаилГл
29.07.2024, 16:20
Добрый день.
Profinet не поддерживается.
А вот был бы этот протокол, а ещё ethernet/ip, это бы ускорило переход с сименса и роквелла на овен. Сменил голову, а потом по мере приобретения входов/выходов переподключаешь удаленные станции ввода/вывода...
sng21099
29.07.2024, 21:38
А вот был бы этот протокол, а ещё ethernet/ip, это бы ускорило переход с сименса и роквелла на овен. Сменил голову, а потом по мере приобретения входов/выходов переподключаешь удаленные станции ввода/вывода...
Полностью согласен!
Коллеги, здравствуйте.
ПЛК210, который работал больше года, начал сбоить.
Удалённо установил Codesys 3.5 той же версии, что у меня на ПК. Закинул архив проекта. Хочу подключиться к ПЛК - выдаёт ошибку: "Max. number of Channels (10) exceeded !"
Не смог разобраться, в чём проблема. Проект то я ранее загружал, всё было без ошибок.
В чём может быть причина?
77912
77913
Евгений Кислов
08.08.2024, 18:06
Коллеги, здравствуйте.
ПЛК210, который работал больше года, начал сбоить.
Удалённо установил Codesys 3.5 той же версии, что у меня на ПК. Закинул архив проекта. Хочу подключиться к ПЛК - выдаёт ошибку: "Max. number of Channels (10) exceeded !"
Не смог разобраться, в чём проблема. Проект то я ранее загружал, всё было без ошибок.
В чём может быть причина?
77912
77913
Добрый день.
Свяжитесь, пожалуйста, со мной через телеграм.
kondor3000
08.08.2024, 18:19
Коллеги, здравствуйте.
ПЛК210, который работал больше года, начал сбоить.
Удалённо установил Codesys 3.5 той же версии, что у меня на ПК. Закинул архив проекта. Хочу подключиться к ПЛК - выдаёт ошибку: "Max. number of Channels (10) exceeded !"
Не смог разобраться, в чём проблема. Проект то я ранее загружал, всё было без ошибок.
В чём может быть причина?
Скорее всего установленная версия Модбас Слейва не соответствует версии в проекте, проверьте все вкладки в инфо,
начиная с версии самого ПЛК, Модбас СОМ, Модбас Мастер и Модбас слейв, они должны соответствовать версии Codesys или ниже.
Например для Codesys 17.3, всё должно быть тоже 17.3 или ниже
Если версия не соответствует, надо обновить устройство, выбрав нужное. Ничего лишнего не сотрётся, переменные в слейве все останутся.
Скорее всего установленная версия Модбас Слейва не соответствует версии в проекте, проверьте все вкладки в инфо,
начиная с версии самого ПЛК, Модбас СОМ, Модбас Мастер и Модбас слейв, они должны соответствовать версии Codesys или ниже.
Например для Codesys 17.3, всё должно быть тоже 17.3 или ниже
Если версия не соответствует, надо обновить устройство, выбрав нужное. Ничего лишнего не сотрётся, переменные в слейве все останутся.
Проблему удалось решить.
Обновил плагин Modbus До 4.4.0.0.
Примечание. Она могла проявится, если раньше на ПК был установлен CODESYS V3.5 SP19.
yurgin_757
15.08.2024, 10:02
Не пинайте сразу за ламерский вопрос...
1) когда снимут с производства МР-1 и если они ещё в теме, то второй вопрос.
2)на СПК-107 ...210, возможно каким то образом повесить управление модулем расширения МР-1?!
...просто,добрая машинка, а у меня их после ПЛК-73 куча остаётся без дела
Евгений Кислов
15.08.2024, 10:25
Не пинайте сразу за ламерский вопрос...
1) когда снимут с производства МР-1 и если они ещё в теме, то второй вопрос.
2)на СПК-107 ...210, возможно каким то образом повесить управление модулем расширения МР-1?!
...просто,добрая машинка, а у меня их после ПЛК-73 куча остаётся без дела
Добрый день.
Такой возможности нет.
Смотрите документацию, какой интерфейс использует MP-1, ну и сделайте выводы.
vvnejenetch
20.08.2024, 19:21
Здравствуйте. Сразу сообщу, что уровень компетенции довольно низок. Примерно лет 8 назад реализовал не самый простой, но и не сильно сложный проект на ПЛК150. С тех пор с codesys дела не имел.
Сейчас стоит задача подключить к СПК110 стороннее модбас устройство и несколько модулей ввода-вывода овен. версия codesys 3.5 sp17 patch3. Однако сразу столкнулся с проблемой. Содержание вкладок с настройками slave устройства не соответствует описанным в руководстве. Отсутствует возможность указать сетевые настройки устройства и регистры данных. При попытке подключить модуль МВ110, выбрав его из шаблона, уже вкладка с внутренними регистрами присутствует, но указать сетевой адрес устройства не могу. Что это? Конфликт версий (ставил компилятор и таргет файлы в последовательности по мануалу), что-то не доустановил? Направьте пожалуйста в нужную сторону.
78099
Евгений Кислов
20.08.2024, 20:03
Здравствуйте. Сразу сообщу, что уровень компетенции довольно низок. Примерно лет 8 назад реализовал не самый простой, но и не сильно сложный проект на ПЛК150. С тех пор с codesys дела не имел.
Сейчас стоит задача подключить к СПК110 стороннее модбас устройство и несколько модулей ввода-вывода овен. версия codesys 3.5 sp17 patch3. Однако сразу столкнулся с проблемой. Содержание вкладок с настройками slave устройства не соответствует описанным в руководстве. Отсутствует возможность указать сетевые настройки устройства и регистры данных. При попытке подключить модуль МВ110, выбрав его из шаблона, уже вкладка с внутренними регистрами присутствует, но указать сетевой адрес устройства не могу. Что это? Конфликт версий (ставил компилятор и таргет файлы в последовательности по мануалу), что-то не доустановил? Направьте пожалуйста в нужную сторону.
78099
Добрый день.
У вас CODESYS установился без плагинов.
Удалите и установите заново по инструкции:
https://youtu.be/3KcJWZEVXCg?si=vML3TNllvpw8De6F
vvnejenetch
20.08.2024, 22:48
Разобрался. Спасибо.
Пользуюсь СПК 107 необходима вывести на регулятор мощности(TRM-1M) заданное значение ,через дерево проекта все выходит , но когда пытаюсь сделать тоже самое через библиотеку Modbus регулятор мощности не опрашивается , хотя все сетевые параметры указаны верно. [CODE][/// [1]
Settings_COM2.sPort:=2;
Settings_COM2.byStopBits:=1;
Settings_COM2.byParity:=1;
Settings_COM2.ulBaudrate:=9600;
Settings_COM2.ulTimeout:=0;
Settings_COM2.ulBufferSize:=0;
SettingsEX_COM2.byByteSize:=8;
// [2] открываем COM-порт
COM_Service_COM2
(
Enable:=TRUE,
Settings:=Settings_COM2,
Sets_Ex:=SettingsEX_COM2,
Task:=OPEN_TSK,
);
CASE iModule OF
0:
// [3] запускаем ФБ опроса модуля МВ110-8А
MV110_8A
(
Enable:=COM_Service_COM2.Ready,
Mode:=MB_RTU,
DevAddr:=1,
FirstAddr:=2,
Quantity:=4,
ComHandle:=COM_Service_COM2.handle,
TimeOut:=T#150MS,
Buffer:=abyBuffer,
);
// [4] если ФБ опроса модуля завершил работу...
IF MV110_8A.Complete THEN
// ...и ошибки отсутствуют, то забираем буфер модуля
IF MV110_8A.Exception=0 THEN
abyMV110_8A_data:=abyBuffer;
// байты 0 и 1 содержат статус измерения входа 1
// склеиваем их в WORD и декодируем в текстовое сообщение
wMV110_8A_input1_status:=BYTE_TO_WORD(abyMV110_8A_ data[1]) OR SHL(BYTE_TO_WORD(abyMV110_8A_data[0]),8);
wsMV110_8A_input1_status:=Mx110Assistant.MvStatusT oWstring(wMV110_8A_input1_status);
//
// переставляем байты местами и преобразуем в REAL
_2WORD_TO_REAL.abyBytes[3]:=abyMV110_8A_data[4];
_2WORD_TO_REAL.abyBytes[2]:=abyMV110_8A_data[5];
_2WORD_TO_REAL.abyBytes[1]:=abyMV110_8A_data[6];
_2WORD_TO_REAL.abyBytes[0]:=abyMV110_8A_data[7];
rMV110_8A_input1:=_2WORD_TO_REAL.rReal;
END_IF
iModule:=1;
// завершаем опрос модуля МВ110-8А
MV110_8A(Enable:=FALSE, Buffer:=abyBuffer);
END_IF
1:
// [3.0.1] запускаем ФБ опроса модуля МВ110-16Д
MV110_16D
(
Enable:=COM_Service_COM2.Ready,
Mode:=MB_RTU,
DevAddr:=26,
FirstAddr:=6,
Quantity:=5,
ComHandle:=COM_Service_COM2.handle,
TimeOut:=T#150MS,
Buffer:=abyMV110_16D_buffer,
);
// [3.0.2] если ФБ опроса модуля завершил работу...
IF MV110_16D.Complete THEN
// ...и ошибки отсутствуют, то забираем значения модуля
IF MV110_16D.Exception=0 THEN
abyMV110_16D_data:=abyMV110_16D_buffer;
xMV110_16D_input1:=abyMV110_16D_data[1].0;
xMV110_16D_input2:=abyMV110_16D_data[2].0;
xMV110_16D_input6:=abyMV110_16D_data[6].0;
xMV110_16D_input7:=abyMV110_16D_data[7].0;
xMV110_16D_input16:=abyMV110_16D_data[16].0;
END_IF
// завершаем опрос модуля МВ110-16Д
MV110_16D(Enable:=FALSE, Buffer:=abyMV110_16D_buffer);
// переходим к опросу модуля МУ110-8Р
iModule:=2;
// очищаем буфер модуля МУ110-8Р
abyMY110_8R_buffer:=abyEmptyBuffer;
END_IF
2:
// [3.1.1] копируем записываемое значение в буфер ФБ
abyMY110_8R_buffer[1].0:=xMY110_8R_output1;
abyMY110_8R_buffer[2].0:=xMY110_8R_output2;
abyMY110_8R_buffer[3].0:=xMY110_8R_output3;
abyMY110_8R_buffer[4].0:=xMY110_8R_output4;
abyMY110_8R_buffer[5].0:=xMY110_8R_output5;
abyMY110_8R_buffer[7].0:=xMY110_8R_output7;
// [3.1.2] запускаем ФБ опроса модуля МУ110-8Р
MY110_8R
(
Enable:=COM_SERVICE_COM2.Ready,
Mode:=MB_RTU,
DevAddr:=9,
FirstAddr:=50,
Quantity:=6,
ComHandle:=COM_SERVICE_COM2.handle,
TimeOut:=T#150MS,
Buffer:=abyMY110_8R_buffer,
);
// [3.1.3] если ФБ опроса модуля завершил работу...
IF MY110_8R.Complete THEN
// ...то завершаем опрос модуля МУ110-8Р...
MY110_8R(Enable:=FALSE, Buffer:=abyMY110_8R_buffer);
iModule:=3;
END_IF
3:
TRM
(
Enable:=COM_Service_COM2.Ready,
Mode:=MB_RTU,
DevAddr:=43,
RegAddr:=60,
Value:=50,
ComHandle:=COM_Service_COM2.handle,
TimeOut:=T#300MS,
);
IF TRM.Complete THEN
// ...то завершаем опрос
TRM(Enable:=FALSE );
// ...и начинаем новый цикл опроса
iModule:=0;
END_IF
xTRM:=100; //////GVL.AnalogTRM2;
;
END_CASE
]
kondor3000
19.09.2024, 14:32
Напишите настройки сети, которые забиты в модулях. Для 8N1 должны быть такие настройки, 2.3 78716 Для 3.5 78714
Лучше выложите свой проект, в расширенных настройках, Добавить файл.
У вас похоже 2.3, тогда вы пишите не в тот раздел, тут раздел Codesys 3.5
kondor3000
26.09.2024, 18:51
версия 3.5
У меня ваш пример сильно тормозит, скачайте пример с сайта и используйте его.
Не надо пытаться одновременно работать через биб-ку и СОМ порт одновременно, делайте разные проекты.
Не надо мутить с настройками сети, делайте всё стандартным 8N1, только скорость лучше увеличить.
Настройки сети и в шаблоне и в биб-ке не соответствуют стандартным для Овена 9600, 8N1. Скорость лучше поставить 115200.
Если работаете с биб-кой лучше полностью удалить СОМ1 в дереве.
viktor1974
16.10.2024, 12:41
Добрый день!
Столкнулся с непонятной для меня проблемой.
У меня на СПК107 на одном порту RS-485 поочередно опрашиваются два прибора газоанализатор СТМ-30м(опрос по Modbus) и электросчетчик Меркурий 230(опрос по библиотеке Овен).
Опрос запускается, но через некоторое время отваливается газоанализатор и востановить его возможно только сбросом питания, а если я отключаю отпрос электросчетчика, то он не виснит.
Пробовал увеличивать паузу между опросами не помогает.
Подскажите, как опрос другого прибора может влиять на состояние газоанализатора
kondor3000
16.10.2024, 12:47
Добрый день!
Столкнулся с непонятной для меня проблемой.
У меня на СПК107 на одном порту RS-485 поочередно опрашиваются два прибора газоанализатор СТМ-30м(опрос по Modbus) и электросчетчик Меркурий 230(опрос по библиотеке Овен).
Опрос запускается, но через некоторое время отваливается газоанализатор и востановить его возможно только сбросом питания, а если я отключаю отпрос электросчетчика, то он не виснит.
Пробовал увеличивать паузу между опросами не помогает.
Подскажите, как опрос другого прибора может влиять на состояние газоанализатора
На одном порту, один протокол с одинаковыми настройками сети. У вас разные протоколы поэтому и отваливается.
Если очень надо, то с одинаковыми настройками сети можно работать с разными протоколами, но по очереди. Например 300-500 мс один протокол, потом другой.
У меня работало, Модбас и Овен через 300 мс, по очереди.
viktor1974
16.10.2024, 13:10
настройки сети одинаковые 9600,8,N,1
опрос последовательный, сначала ГА, пауза, ЭС, пауза и так далее...
вопрос в том, что сначала все идет, а через минут 5, алес.., а если один ГА, ТО РАБОТАЕТ
kondor3000
16.10.2024, 13:11
настройки сети одинаковые 9600,8,N,1
опрос последовательный, сначала ГА, пауза, ЭС, пауза и так далее...
вопрос в том, что сначала все идет, а через минут 5, алес.., а если один ГА, ТО РАБОТАЕТ
Уже всё написал, если не работает, то разносите по разным портам.
viktor1974
16.10.2024, 13:18
хотелось бы причину понять, почему опрос ЭС приводит к зависанию ГА, ему должно быть все равно, что по сети чужие сигналы бегают, он их должен просто отбросить
Меркурий прекрасно работает на одной линии с Modbus. Отвалы скорее всего, что пока вы читаете Меркурий, у вас уже начинается опрос Modbus. Как вариант.
Ну и Адрес Меркурий не должен совпадать с адресами Modbus устройств.
У меня читается Меркурий + ПР200, и Меркурий + 2 датчика топлива с Modbus (но из Scada)
viktor1974
16.10.2024, 13:23
проверю еще раз, если бы так было, то опрос бы и не начался, а то он идет, а потом зависает прибор
У Меркурий много запросов/ответов, чтобы получить все. Плюс если читаются фиксированные данные, там идет команда фиксации, которая может быть отправлена как широковещательная, что и для Modbus окажется командой.
Тут я не подскажу, не смотрел реализацию библиотеки. Нет у меня устройств Овен с 3.5 CodeSys
viktor1974
16.10.2024, 13:40
Спасибо, поставлю флаг на одновременную работу блоков опросов, посмотрю, пересекаются ли они
kondor3000
16.10.2024, 13:50
Тут я не подскажу, не смотрел реализацию библиотеки. Нет у меня устройств Овен с 3.5 CodeSys
Биб-ка Овен прекрасно работает на вирт. контроллере, так что реальный ПЛК не нужен вообще.
viktor1974
16.10.2024, 13:57
Нет опросы не пересекаются, проверил, отработали всесте 5 минут без ошибок, и завис
может быть индивидуальная особенность прибора, что он не хочет видеть в сети чужие запросы и при их обработке зависает?
viktor1974
16.10.2024, 14:42
Ну вроде решилось. Допустил, что не справляется процессор с обработкой запросов, увеличил время между запросами до 400ms у ГА и ЭС, то есть дал ему больше времени на обработку и своих и чужих запросов, минут 20 отработал уже
kondor3000
16.10.2024, 14:55
Ну вроде решилось. Допустил, что не справляется процессор с обработкой запросов, увеличил время между запросами до 400ms у ГА и ЭС, то есть дал ему больше времени на обработку и своих и чужих запросов, минут 20 отработал уже
Рано или поздно, они у вас пересекутся, я делал по другому, тупо BLINK-ом разрешал работу 2 программ по очереди.
про 300-500 мс тоже писал.
viktor1974
16.10.2024, 15:01
нет, они программно разведены, один ждет окончания работы второго, там флажки стоят и таймеры задержки
и, похоже, проблема оказалась в том, что один запрос ГА это 2 байта (без служебных байт), а ответ максимум 8 байт, у ЭС объем передаваемых данных заметно больше, и по видимому он читая чужые запросы-ответы не справлялся с объемом данных
вроде работает, понаблюдаю
Да Modbus устройство вообще должен игнорировать запросы не к своему адресу, то есть абсолютно, ему не надо даже CRC проверять, первый байт чужой, я отдыхаю :)
kondor3000 да лениво мне его ставить. Как бы нафик не нужен без задач.
Да Modbus устройство вообще должен игнорировать запросы не к своему адресу,
Но сначала нужно вычленить пакет. А вот тут, если норм пауз нет и наличии кривой работы с буфером в ПО слейва (а оно бывает*) можно и получить такие эффекты.
*Например такое было (сейчас не знаю) у местных ПЧ. А когда-то и у МВ..-6У
ну да, если паузы тишины нет, прибор может глючить.
Например у меня два датчика топлива на линии, одно сыпало ошибками. Просто поменял их опрос местами, ошибки пропали. ХЗ че это такое было ? :)
Если что, терминаторов нет. Ну или я их не включал, не помню уже.
з.ы. сейчас глянул, из 9 тысяч запросов, 28 ошибок, и опять на последнем по опросу устройству.
Schneider
31.10.2024, 15:29
здравствуйте коллеги.
в проектах чаще всего пользуюсь стандартными средствами при описании части программы Modbus обмена.
Но вот попалась задача, где на вскидку лучше воспользоваться OwenCommunication.
Посмотрел видео по реализации, написал опрос в виде своего (!) функционального блока на CFC с использованием
FB из библиотеки OCL: OCL.COM_Control, OCL.MB_SerialRequest и т.д.
Но при добавлении экземпляра своего функционального блока в основную программу (на CFC)
в момент ввода имени экземпляра функционального блока выходит ошибка
79752
Если жму "продолжить" после в процессе компиляции выходит ошибка:
ERROR] Internal error:System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
в ..get__CompiledType() в _3S.CoDeSys.LanguageModelManager.Expression.get_Ty pe() в ..(_IVariable , IScope5 , _ICompileContext , _ISignature )
в _3S.CoDeSys.Compiler35170.Phase1_Typification.Inte rfaceCompiler.(_ISignature , IScope5 , _ICompileContext )
в _3S.CoDeSys.Compiler35170.Phase1_Typification.Inte rfaceCompiler.(_ISignature , IScope5 , _ICompileContext )
в _3S.CoDeSys.Compiler35170.CompilerPhases.CompilerP hase1_Typifier.() в _3S.CoDeSys.Compiler35170.CompilerPhases.CompilerP hase1_Typifier.()
в _3S.CoDeSys.Compiler35170.CompilerPhases.CompilerP hase1_Typifier.() в ..(Boolean , Boolean , Boolean )
Экспериментальным путем установил, что если я оставляю в объявлении своего блока OCL.COM_Control то ошибка не выходит и все компилируется.
Стоит только добавить хоть один OCL.MB_SerialRequest даже только в область объявления получаю ошибки вышеописанные.
Попробовал создать ФБ на ST, поведение тоже самое.
Программа ранее использовала стандартные средства обращения к модбас, которые я потер, чтобы не конфликтовали.
Вопрос: может быть библиотека не предоставляет возможность создать свои ФБ на их основе?
Как выйти из этой ситуации? в документации к OwenCommunication и здесь на форуме ответов не нашел.
Евгений Кислов
31.10.2024, 15:47
Добрый день.
Вопрос: может быть библиотека не предоставляет возможность создать свои ФБ на их основе?
Предоставляет.
Насколько помню - это какой-то специфический баг редактора CFC.
Попробуйте повторить то же самое на ST - будет ли ошибка в этом случае?
Schneider
31.10.2024, 18:09
Я написал в предыдущем сообщении, что на ST тоже пробовал. Поведение в точности такое же.
Сейчас создал новый проект. добавил туда OCL библиотеку и только мой новый ФБ.
хоть в PLC_PRG.CFC хоть в PLC_PRG.ST (объявлял экземпляр(и определял) своего ФБ) варианте реализации - не компилируется.
Ок. завтра подключитесь, вероятно подскажете, что я не так делаю.
Очень надеюсь на вас.
Евгений Кислов
31.10.2024, 18:21
Я написал в предыдущем сообщении, что на ST тоже пробовал. Поведение в точности такое же
Свяжитесь, пожалуйста, завтра утром со мной по телеграм (в подписи) и продемонстрируйте вашу ситуацию по AnyDesk.
kondor3000
31.10.2024, 21:40
Проверил на CFC и на ST .
В ФБ и в действиях блоки OCL.COM_Control и OCL.MB_SerialRequest добавляются и работают без ошибок. 79758
Евгений Кислов
01.11.2024, 08:49
Ошибка компиляции была связана с некорректной инициализацией переменной типа WORD.
В проекте использовался следующий синтаксис:
wVar: WORD := b#0000_0001;
Но это некорректно.
Нужно делать так:
wVar: WORD := 2#0000_0001;
Schneider
01.11.2024, 21:22
здравствуйте коллеги.
в проектах чаще всего пользуюсь стандартными средствами при описании части программы Modbus обмена.
Но вот попалась задача, где на вскидку лучше воспользоваться OwenCommunication.
Посмотрел видео по реализации, написал опрос в виде своего (!) функционального блока на CFC с использованием
FB из библиотеки OCL: OCL.COM_Control, OCL.MB_SerialRequest и т.д.
Но при добавлении экземпляра своего функционального блока в основную программу (на CFC)
в момент ввода имени экземпляра функционального блока выходит ошибка
79752
Если жму "продолжить" после в процессе компиляции выходит ошибка:
ERROR] Internal error:System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
в ..get__CompiledType() в _3S.CoDeSys.LanguageModelManager.Expression.get_Ty pe() в ..(_IVariable , IScope5 , _ICompileContext , _ISignature )
в _3S.CoDeSys.Compiler35170.Phase1_Typification.Inte rfaceCompiler.(_ISignature , IScope5 , _ICompileContext )
в _3S.CoDeSys.Compiler35170.Phase1_Typification.Inte rfaceCompiler.(_ISignature , IScope5 , _ICompileContext )
в _3S.CoDeSys.Compiler35170.CompilerPhases.CompilerP hase1_Typifier.() в _3S.CoDeSys.Compiler35170.CompilerPhases.CompilerP hase1_Typifier.()
в _3S.CoDeSys.Compiler35170.CompilerPhases.CompilerP hase1_Typifier.() в ..(Boolean , Boolean , Boolean )
Экспериментальным путем установил, что если я оставляю в объявлении своего блока OCL.COM_Control то ошибка не выходит и все компилируется.
Стоит только добавить хоть один OCL.MB_SerialRequest даже только в область объявления получаю ошибки вышеописанные.
Попробовал создать ФБ на ST, поведение тоже самое.
Программа ранее использовала стандартные средства обращения к модбас, которые я потер, чтобы не конфликтовали.
Вопрос: может быть библиотека не предоставляет возможность создать свои ФБ на их основе?
Как выйти из этой ситуации? в документации к OwenCommunication и здесь на форуме ответов не нашел.
оказалось это две разных ошибки. точнее одна ошибка и один баг среды.
неверное объявление двоичной переменной приводило к ошибке при компиляции, не указывающей, как обычно бывает в таких случаях, что именно не так написано.
Баг среды разработки заключался в том, что при добавлении экземпляра своего самописного функционального блока в поле программы на CFC, сразу после этого должен появится диалог ввода имени экземлпяра. но вместо этого появлялось окно ошибки (не происходило автоматическое объявления). чтобы этого избежать, сначала вручную добавляем в область объявления, а потом выделить имя экземпляра и драгНдроп в текст программы. тогда ошибка не возникает.
Я думал что это по сути одна ошибка, но оказалось это две разные.
Спасибо большое за поддержку.
Привет форумчани.
Не пинайте ток ногами....
Проведя не один день на просторах инета да форумах, мне так и не удалось решить проблему с Modbus TCP Slave. Просмотрел видео уроки на данную тематику, но увы.... Понимаю, что в эмуляции данная ошибка: - Шина не запущена. Данные значения, возможно, неактуальны" допустима. Но вот при опросе не важно каким "Мастером", получить данные или записать не получается. И еще, в данной версии ПЛК 210-04, то ли я с ума выжил, то ли я не правильно опрашиваю данное устройство. Одним словом, хожу вокруг сосны! 79859 79860
Дополнительный вопрос: есть ли разница в дереве переменных "Слейва" кто будет первым "BOOL" или "REAL"?
Изернет 1-2 WAN с адресом 192.168.2.150
Изернет 3 LAN с адресом 192.168.3.150 - опрос модулей
Изернет 4 LAN с адресом 192.168.3.30 - панель(мастер)
Проброшен порт 502 с WAN в LAN
kondor3000
05.11.2024, 21:32
Привет форумчани.
Не пинайте ток ногами....
Проведя не один день на просторах инета да форумах, мне так и не удалось решить проблему с Modbus TCP Slave. Просмотрел видео уроки на данную тематику, но увы.... Понимаю, что в эмуляции данная ошибка: - Шина не запущена. Данные значения, возможно, неактуальны" допустима. Но вот при опросе не важно каким "Мастером", получить данные или записать не получается. И еще, в данной версии ПЛК 210-04, то ли я с ума выжил, то ли я не правильно опрашиваю данное устройство. Одним словом, хожу вокруг сосны! 79859 79860
Дополнительный вопрос: есть ли разница в дереве переменных "Слейва" кто будет первым "BOOL" или "REAL"?
Чем опрашиваете слейв? И какими функциями? Судя по треугольнику в дереве, опроса слейва нет. Скрин 79865
Видео для вас https://www.youtube.com/watch?v=Zq1G_Njl5cw&list=PL2EcVEe6E9SCzVhL_BCDnaUJROikKheVx&index=12
"BOOL" переменные, а точнее Маски бит (биты с 0 по 15 передаются в одном регистре) лучше ставить в начале, потом целочисленные, потом "REAL".
Но для тренировки всё равно.
Панель Weintek в качестве Мастера. Да и в принципе нет разницы чем опрашивать..... Главное получить результат.
За топологию построения переменных, спасибо Вам.
Данную проблему решил функциональным блоком MB_TcpSlave. Так проще при опросе и передачи как мне кажется.
Спасибо за помощь.
Добрый день! подскажите пожалуйста. Не отправляет данные регистра "TRUE" дискретного входа среды CODESYS на сторону MASTERSCADA 4D
Вообщем такая ситуация. Работаю в среде Codesys v3.5 SP17 в связке с MASTERSCADA 4D.
На стороне CODESYS привязал дискретный выход к глобальной переменой
Протокол Modbus TCP/IP.
Контроллер вертуальный CODESYS Control Win V3.
Ethernet->
ModbusTCP_Slave_Device
Помогите пожалуйста разобраться!
79964
МихаилГл
10.11.2024, 14:56
А где скрин мастерскады? Это область 0х или 1х должна там быть.
Сейчас пытаюсь сбросить скрин
kondor3000
10.11.2024, 15:09
Сейчас пытаюсь сбросить скрин
Зря вы сделали байт, ваш бит попадёт во 2 байт этого регистра. 0 бит это 8 бит будет, а 8 это нулевой.
Битовые области не нужны, используйте 8 бит 0 регистра. В него упакуйте маску из 16 бит, через точку.
1 еденичка должна быть. Как то не понятно
МихаилГл
10.11.2024, 15:12
Зря вы сделали байт, ваш бит попадёт во 2 байт этого регистра. 0 бит это 8 бит будет, а 8 это нулевой.
Это же область входов-выходов, там же не регистры, и это смещение... Хотя надо проверить.
Тоесть, а где надо было мне связывать переменую. Там где Дискретные входы %QB16
Это скрин MASTERSCADA 4D
79965
ну там идут регистры временного хранения и входные регистры. Что где куда?. И адреса на стороне CODESYS мне не надо назначать, ток в MASTERSCADA 4D буду назначать типа 000001 или 00017 в зависимости от типа регистра
МихаилГл
10.11.2024, 16:03
ну там идут регистры временного хранения и входные регистры. Что где куда?. И адреса на стороне CODESYS мне не надо назначать, ток в MASTERSCADA 4D буду назначать типа 000001 или 00017 в зависимости от типа регистра
Вот их и используйте, назначая их битам нужные значения. А про область входов-выходов забудьте, чтоб их не было в объявлении. Считайте что эти области будут наложены на холдинг и входные регистры. К ним также функциями 0х и 1х можно обращаться будет.
kondor3000
10.11.2024, 16:48
Проверил ещё раз, запись мастером 0 бит 0 регистра, попадает в 0 бит 0 регистра слейва (рег. временного хранения) 79967
Чтение в мастере надо делать функцией 0х04. Это если с одного виртуального ПЛК на другой передавать массивом.
А вот с ОРС сервера (чтение запись бит) 8 бит попадает в 0, а 0 бит в 8 бит 79968
Чтение бит функция 0х02 и запись бит функция 0х0f.
Спасибо, пока разбираюсь. У меня вертуальный ПЛК выступает в роли slave, а MASTERSCADA 4D как MASTER. Ток при настройках ничего такого я не видел. Просто Modbus TCP Device на стороне MASTERSCADA 4D и все. Как я понял к этим регистрам протокола Modbuss TCP надо правельно уметь обращаться. Пока читаю докумнтацию между строк 79974
И с этими регистрами большая вложеность при открытии клике мыши. Надо привыкать к этой среде
edvard_munch
13.11.2024, 12:41
1. Нужно указать все аргументы метода (в частности, номер COM-порта).
2. В современных версиях CODESYS есть баг: этот метод не срабатывает (возвращает ERR_PARAMETER), если задаваемая четность = NONE.
Для ПЛК-200 в итоге заработало даже с четностью NONE
И даже когда я по ошибке указал параметр usiMedium:=0, то есть rs232 вместо реального rs485, то все равно работает.
Я так понял, что в данном конкретном случае этот параметр не влияет на работу метода.
Modbus_Master_COM_Port.xStop := TRUE;
Modbus_Master_COM_Port.UpdateComParameters(9600, 0, 0, 8, 1, FALSE, 4)
Modbus_Master_COM_Port.xStop := FALSE;
НО, уже второй день пытаюсь тоже самое сделать для ПЛК-210, но никак не выходит (
Уже все комбинации параметров перебрал. Хотя казалось бы, отличие от вызова только в номере ком порта должно быть
https://disk.yandex.ru/i/CwQtK3UukD906g - вот запись с экрана (первая строчка - подача питания на HMI)
В связи с этим несколько вопросов.
1) Как вообще можно что-то вернуть из этого метода, в частности ERR_PARAMETER?
В описании ничего не вижу
https://content.helpme-codesys.com/en/libs/IoDrvModbus/4.3.0.0/ModbusComPort/pou-IoDrvModbusComPort/UpdateComParameters.html
2) Есть ли возможность у кого-нибудь протестировать этот метод именно на ПЛК-210? (чтобы сравнить с моим результатом)
Ибо эта функция очень нужна
Или может быть кто-то увидит на демонстрации, что я где-то косячу.
Евгений Кислов
14.11.2024, 11:35
Добрый день.
Проверил с ПЛК210-01 - функционал работает корректно. Использовал такой код:
IF xChangeBaudrate THEN
Modbus_Master_COM_Port.xStop := TRUE;
Modbus_Master_COM_Port.Enable := FALSE;
Modbus_Master_COM_Port.UpdateComParameters
(
COMPORT := 5,
udiBaudrate := udiBaudrate,
usiDataBits := 8,
usiStopBits := 1,
usiParity := 0,
usiMedium := 1,
xPolarization := FALSE
);
Modbus_Master_COM_Port.Enable := TRUE;
Modbus_Master_COM_Port.xStop := FALSE;
xChangeBaudrate := FALSE;
END_IF
Для ПЛК-200 в итоге заработало даже с четностью NONE
1) Как вообще можно что-то вернуть из этого метода, в частности ERR_PARAMETER?
Про NONE - я ошибся, баг с NONE проявляется только когда сам ПЛК работает в режиме Slave.
Это касается и метода - для мастера метод ничего не возвращает.
На вашем скриншоте Parity устанавливается в ODD - так и задумано?
edvard_munch
14.11.2024, 16:12
Добрый день.
На вашем скриншоте Parity устанавливается в ODD - так и задумано?
Ну я разные варианты перебирал, для NONE PARITY тоже самое, не вижу чтобы был эффект
Скопировал прямо ваш код целиком + `udiBaudrate: UDINT := 9600;`
Пока так же не работает, не знаю что еще попробовать
edvard_munch
14.11.2024, 16:24
Про NONE - я ошибся, баг с NONE проявляется только когда сам ПЛК работает в режиме Slave.
Это касается и метода - для мастера метод ничего не возвращает.
Это тоже интересно, пытаюсь также наладить работу для ПЛК как слэйва
UpdateComPortSettings и UpdateUnitID.
Вроде как не срабатывают, запросы от мастера продолжают успешно приниматься
Оба метода при этом возвращают 1. Это показатель успешного выполнения или что единичка означает в данном случае?
edvard_munch
14.11.2024, 16:26
Или ошибка видимо все же
https://content.helpme-codesys.com/en/libs/CmpErrors2%20Interfaces/Current/Errors.html
Евгений Кислов
14.11.2024, 16:58
Или ошибка видимо все же
https://content.helpme-codesys.com/en/libs/CmpErrors2%20Interfaces/Current/Errors.html
Напишите завтра утром в телеграм (в подписи) - разберемся.
Nelegal41
18.11.2024, 11:33
Всем здравия. Работаю с ОВЕН ПЛК 110 30м v2, среда разработки БЫЛА codesys 2.3, поставил 3.5.
Вопрос: Где взять таргет файл для v3.5 или как их подружить? Подскажите пожалуйста.
Евгений Кислов
18.11.2024, 11:39
Всем здравия. Работаю с ОВЕН ПЛК 110 30м v2, среда разработки БЫЛА codesys 2.3, поставил 3.5.
Вопрос: Где взять таргет файл для v3.5 или как их подружить? Подскажите пожалуйста.
Добрый день.
ПЛК 110 нельзя программировать в CODESYS V3.5.Только в V2.3
meta11ist87
19.11.2024, 23:25
Есть спк110, выступает слейвом под modbus tcp, опрашивается по 502 порту. Можно ли передавать данные в owencloud с этой же спк110 через этот же ethernet порт? Чисто логически вроде как можно, но с ходу не заработало(( Если да, то какой порт указывать в настройках owencloud в codesys? Пробовал по разному, чёт не передаются данные в ОК. Может кто-то сможет помочь скринами настроек.
Вы порт физический же имеете в виду. Да может, возможно пароль забыли в cloud указать
In_Da_Cher_A
20.11.2024, 09:21
Работаю с ОВЕН ПЛК 110 30м v2, среда разработки БЫЛА codesys 2.3, поставил 3.5.зачем поставил-то? как работал, так и работай.
3.5и 2.3 это разные программы для разного железа, несовместимые между собой. типа как Адоб Акробат и Адоб Фотошоп. Общее только Адоб
Здравствуйте, не подскажете как использовать структуру при опросе с использованием библиотек mx210 assistant МВ210. То есть без соотнесения какой нибудь переменной в соответствующей вкладке? Нужно обратиться, например к устройству MV210_101 Вход 1 и считать rValue. Как мне в ST этот код прописать? Не пойму, весь гугл обгуглил. Есть структура ANALOG_SENSOR_VALUE, а в ней rValue. Как мне в ST к конкретному каналу обратиться и прочитать его rValue?
kondor3000
21.11.2024, 16:00
Здравствуйте, не подскажете как использовать структуру при опросе с использованием библиотек mx210 assistant МВ210. То есть без соотнесения какой нибудь переменной в соответствующей вкладке? Нужно обратиться, например к устройству MV210_101 Вход 1 и считать rValue. Как мне в ST этот код прописать? Не пойму, весь гугл обгуглил. Есть структура ANALOG_SENSOR_VALUE, а в ней rValue. Как мне в ST к конкретному каналу обратиться и прочитать его rValue?
Через точку, структура.переменная структуры, например ANALOG_SENSOR_VALUE.rValue
Как поставите точку, выпадет список всех переменных структуры.
ANALOG_SENSOR_VALUE.rValue это же обезличенно. А как, допустим, первый канал или третий прочитать? ANALOG_SENSOR_VALUE.rValue это уже какое то неполное выражение без конкретики
Николай Суриков
21.11.2024, 16:34
ANALOG_SENSOR_VALUE.rValue это же обезличенно. А как, допустим, первый канал или третий прочитать? ANALOG_SENSOR_VALUE.rValue это уже какое то неполное выражение без конкретики
Так будет понятнее?
80245
Объявляете переменные с типом данных ANALOG_SENSOR_VALUE, привязываете эти переменные в шаблоне устройства, в коде используете имя_переменной.rValue
Так будет понятнее?
80245
Объявляете переменные с типом данных ANALOG_SENSOR_VALUE, привязываете эти переменные в шаблоне устройства, в коде используете имя_переменной.rValue
Спасибо. Так понятнее. Без действий со стрелкой и номером 2 это возможно? Ну грубо говоря: обратиться ко входу как: MV210_101.Analog_inputs.channel(1).ANALOG_SENSOR_V ALUE.rValue?
Николай Суриков
21.11.2024, 17:10
Без пункта 2 ПЛК не знает что у MV210_101 есть какая-либо связь с ANALOG_SENSOR_VALUE
То есть без объявления переменной невозможно считать будет вход? Никаким способом?
kondor3000
21.11.2024, 19:13
То есть без объявления переменной невозможно считать будет вход? Никаким способом?
Можете выбросить шаблон, создать чтение массива из 24 регистров,80252 начиная с адреса 4000. 80248 регистры80250 модуль МВ210-101
Создать свою структуру Ai из переменной Float и циклического времени.
Создать массив Ai_Oll AT%IW22 : ARRAY [1..8] OF Ai;
И обращайтесь к любому каналу как Ai_Oll[1].rValue; Ai_Oll[8].rValue;
При чём, в соотнесении ничего нет вообще.
Можете выбросить шаблон, создать чтение массива из 24 регистров, начиная с адреса 4000. 80248 регистры80250 модуль МВ210-101
Создать свою структуру Ai из переменной Float и циклического времени.
Создать массив Ai_Oll AT%IW22 : ARRAY [1..8] OF Ai;
И обращайтесь к любому каналу как Ai_Oll[1].rValue; Ai_Oll[8].rValue;
При чём, в соотнесении ничего нет вообще.
Тоже интересно. Спасибо. Но если не знаю адреса (типа AT%IW22), а просто модуль (ip его) и номер канала? Или это уже из фантастики? Интересно просто насколько это возможно
kondor3000
21.11.2024, 19:43
Тоже интересно. Спасибо. Но если не знаю адреса (типа AT%IW22), а просто модуль (ip его) и номер канала? Или это уже из фантастики? Интересно просто насколько это возможно
Этот адрес AT%IW22 вы смотрите у себя при создании массива чтения из модуля.
А просто так, берёте адрес из таблицы и читаете его по IP модуля, но тогда придётся присваивать переменную в соотнесении.
Например по адресу 4000 читаете 1 канал.
Этот адрес AT%IW22 вы смотрите у себя при создании массива чтения из модуля.
А просто так, берёте адрес из таблицы и читаете его по IP модуля, но тогда придётся присваивать переменную в соотнесении.
Так ну имеем, - адрес регистра 4000, ip 192.168.0.1 и больше ничего. Что в ST написать?). Соотнесением пользоваться нельзя. Это теоретически, интересно возможно ли так
kondor3000
22.11.2024, 09:07
Так ну имеем, - адрес регистра 4000, ip 192.168.0.1 и больше ничего. Что в ST написать?). Соотнесением пользоваться нельзя. Это теоретически, интересно возможно ли так
Вариант без соотнесения, указание прямого адреса, для 1 переменной или для массива. Типа AT%IW0.
Массивом будет намного быстрее прочитать модуль, чем ковырять по 1 переменной.
Николай Суриков
22.11.2024, 09:26
Так ну имеем, - адрес регистра 4000, ip 192.168.0.1 и больше ничего. Что в ST написать?). Соотнесением пользоваться нельзя. Это теоретически, интересно возможно ли так
CASE iState OF
0: //Открытие соединения
fbTCPClient(
xEnable:=TRUE ,
tTimeout:=T#5S ,
sIpAddr:='192.168.0.1',
uiPort:=502);
IF fbTCPClient.xActive THEN
iState := 1;
END_IF
IF fbTCPClient.xError THEN
fbTCPClient(xEnable:=FALSE);
END_IF
1:
fbModbus(
xExecute:=TRUE ,
tTimeout:=T#50MS ,
usiRetry:=3 ,
hConnection:=fbTCPClient.hConnection ,
xIsRtuOverTcpMode:=FALSE ,
usiUnitId:=1 ,
eFuncCode:=OCL.MB_FC.READ_HOLDING_REGISTERS,
uiDataAddr:=4000 ,
uiDataCount:=2 ,
pData:=ADR(arWORD) ,
szSize:=SIZEOF(arWORD) ,
xDone=> ,
xBusy=> ,
xError=> ,
eError=> );
IF fbModbus.xDone OR fbModbus.xError THEN
fbModbus(xExecute:=FALSE);
iState := 0;
ReadValue1 := OCL.WORD2_TO_REAL(wInput1:=arWORD[1] , wInput2:=arWORD[0] , xSwapBytes:=FALSE );
END_IF
END_CASE
Дальше сами адаптируете по свою непонятную задачу.
То что надо, благодарю,а что за библиотека? У меня не может найти этот fbModbus? Задача для общего развития, так как слышал что некоторые производители российских плк каким то макаром так параметрируются. Есть только адрес и регистр, к сожалению никаких прямых адресов нет,никаких вкладок с соотнесением нет. Мануал пустой))
Николай Суриков
22.11.2024, 14:57
То что надо, благодарю,а что за библиотека? У меня не может найти этот fbModbus? Задача для общего развития, так как слышал что некоторые производители российских плк каким то макаром так параметрируются. Есть только адрес и регистр, к сожалению никаких прямых адресов нет,никаких вкладок с соотнесением нет. Мануал пустой))
https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_Modbus_v3.2.pdf
https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_Modbus_v3.2.pdf
Огромное спасибо, вы очень умный человек
rybakov-ks
28.11.2024, 14:39
Добрый день. ПМ210 подключен к СПК110. Как в Modbus_Serial_Device посмотреть вкладку "Cостояние"? Необходимо определять Modbus Serial Device: Работает или Не запущено. Использовал ФБ Modbus_Serial_Device.GetDeviceState (GetDeviceState_0: IoDrvModbusSerialSlaveLibrary.ModbusSerialDeviceDi ag) но получаю ошибку:
'GetDeviceState_0' не является экземпляром 'Modbus_Serial_Device'.
Евгений Кислов
28.11.2024, 15:44
Добрый день. ПМ210 подключен к СПК110. Как в Modbus_Serial_Device посмотреть вкладку "Cостояние"? Необходимо определять Modbus Serial Device: Работает или Не запущено. Использовал ФБ Modbus_Serial_Device.GetDeviceState (GetDeviceState_0: IoDrvModbusSerialSlaveLibrary.ModbusSerialDeviceDi ag) но получаю ошибку:
'GetDeviceState_0' не является экземпляром 'Modbus_Serial_Device'.
Добрый день.
Можно ориентироваться на Modbus_Serial_Device.xBusy - если он имеет значение TRUE, то слэйв работает.
rybakov-ks
28.11.2024, 15:58
Добрый день.
Можно ориентироваться на Modbus_Serial_Device.xBusy - если он имеет значение TRUE, то слэйв работает.
Мне необходимо со стороны СПК110 понимать опрашивает ли его ПМ210. При отключении ПМ210 переменная Modbus_Serial_Device.xBusy не меняет своего значения. А если открыть вкладку "Cостояние", то поле "Modbus Serial Device: Работает или Не запущено" меняется как мне нужно в зависимости от активности ПМ210.
Евгений Кислов
28.11.2024, 16:06
Мне необходимо со стороны СПК110 понимать опрашивает ли его ПМ210. При отключении ПМ210 переменная Modbus_Serial_Device.xBusy не меняет своего значения. А если открыть вкладку "Cостояние", то поле "Modbus Serial Device: Работает или Не запущено" меняется как мне нужно в зависимости от активности ПМ210.
По-моему, в современных версиях CODESYS (например, 3.5.17.30) поведение следующее:
- при старте в дереве проекта рядом со слэйвом отображается желтый треугольник, состояние = не запущено
- при получении первого корректного запроса от мастера индикатор меняется на зеленый круг, состояние = запущено
И после этого индикатор сохраняет зеленый цвет даже при отсутствии запросов от мастера (потому что с точки зрения слэйва, отсутствие запросов от мастера - это нормальная ситуация).
В вашем случае, на мой взгляд, проще всего отказаться от слэйва в дереве проекта и поднять его через библиотеку OwenCommunication - в этом случае вы получите нужную вам диагностику.
rybakov-ks
29.11.2024, 07:38
По-моему, в современных версиях CODESYS (например, 3.5.17.30) поведение следующее:
- при старте в дереве проекта рядом со слэйвом отображается желтый треугольник, состояние = не запущено
- при получении первого корректного запроса от мастера индикатор меняется на зеленый круг, состояние = запущено
И после этого индикатор сохраняет зеленый цвет даже при отсутствии запросов от мастера (потому что с точки зрения слэйва, отсутствие запросов от мастера - это нормальная ситуация).
В вашем случае, на мой взгляд, проще всего отказаться от слэйва в дереве проекта и поднять его через библиотеку OwenCommunication - в этом случае вы получите нужную вам диагностику.
Да, это так, но в Modbus Serial Device есть возможность задать время сторожевого таймера. Если по истечении этого времени мастер не отправляет запрос, статус изменится с "Работает" на "Не запущен".
Евгений Кислов
29.11.2024, 07:40
Да, это так, но в Modbus Serial Device есть возможность задать время сторожевого таймера. Если по истечении этого времени мастер не отправляет запрос, статус изменится с "Работает" на "Не запущен".
Этот статус (как и иконка) формируются внутри компонента - вы не сможете считать их в программе.
rybakov-ks
29.11.2024, 07:42
Этот статус (как и иконка) формируются внутри компонента - вы не сможете считать их в программе.
Понятно. Спасибо.
rybakov-ks
29.11.2024, 14:02
По-моему, в современных версиях CODESYS (например, 3.5.17.30) поведение следующее:
- при старте в дереве проекта рядом со слэйвом отображается желтый треугольник, состояние = не запущено
- при получении первого корректного запроса от мастера индикатор меняется на зеленый круг, состояние = запущено
И после этого индикатор сохраняет зеленый цвет даже при отсутствии запросов от мастера (потому что с точки зрения слэйва, отсутствие запросов от мастера - это нормальная ситуация).
В вашем случае, на мой взгляд, проще всего отказаться от слэйва в дереве проекта и поднять его через библиотеку OwenCommunication - в этом случае вы получите нужную вам диагностику.
Интересующий меня функционал реализовал через OwenCommunication. Столкнулся с проблемой: записываю через OwenCloud переменную типа BOOL в бит регистра slave’а и сохраняю её в программе в RETAIN-переменную. После перезагрузки СПК110 переменная сбрасывается на 0. Это нормальное поведение? Какие существуют способы сохранить значение переменной после перезагрузки?
Евгений Кислов
29.11.2024, 14:09
Интересующий меня функционал реализовал через OwenCommunication. Столкнулся с проблемой: записываю через OwenCloud переменную типа BOOL в бит регистра slave’а и сохраняю её в программе в RETAIN-переменную. После перезагрузки СПК110 переменная сбрасывается на 0. Это нормальное поведение? Какие существуют способы сохранить значение переменной после перезагрузки?
Проще всего - буфер самого слэйва объявить в области RETAIN.
В данный момент, как я понимаю, вы циклически перезаписываете вашу RETAIN-переменную значением из буфера слэйва - но он-то переинициализруется после перезагрузки.
rybakov-ks
29.11.2024, 14:47
Проще всего - буфер самого слэйва объявить в области RETAIN.
В данный момент, как я понимаю, вы циклически перезаписываете вашу RETAIN-переменную значением из буфера слэйва - но он-то переинициализруется после перезагрузки.
Работает. Спасибо.
Добрый день. А как читать ПЛК200 сетевые переменные из ПР103, находящиеся в одной локалке?
З.Ы. Поковырялся, вроде их сконнектил - а где можно посмотреть текущее значение сетевых переменных в 103?80500
З.Ы.Ы. Возможно, есть инструкция, как коннектить ПЛК с ПР?
Евгений Кислов
02.12.2024, 15:46
Добрый день.
З.Ы. Поковырялся, вроде их сконнектил - а где можно посмотреть текущее значение сетевых переменных в 103
В CODESYS - на вкладке Соотнесение входов-выходов (ее видно на вашем скриншоте).
В OwenLogic - в режиме онлайн-отладки, если эти переменные вынесены на холст (см. руководство по OwenLogic).
З.Ы.Ы. Возможно, есть инструкция, как коннектить ПЛК с ПР?
Здесь для СПК и Modbus RTU - но существенной разницы с вашим вариантом нет:
https://rutube.ru/video/49f084888978edf3233041a11f182145/
Добрый день.
В CODESYS - на вкладке Соотнесение входов-выходов (ее видно на вашем скриншоте).
В OwenLogic - в режиме онлайн-отладки, если эти переменные вынесены на холст (см. руководство по OwenLogic).
Здесь для СПК и Modbus RTU - но существенной разницы с вашим вариантом нет:
https://rutube.ru/video/49f084888978edf3233041a11f182145/
а подскажите по скриншоту, я адреса переменных сто-третьей правильно указал?
Евгений Кислов
02.12.2024, 15:56
а подскажите по скриншоту, я адреса переменных сто-третьей правильно указал?
Я не вижу скриншота из OwenLogic - но вообще похоже на правду (адреса регистров в слэйве для ПР103 действительно начинаются с 16384).
Можно было бы считать их и одним запросом (ReafOffset = 16384, ReadLength = 2).
rybakov-ks
03.12.2024, 12:36
Добрый день. СПК110 и ПМ210. Записываю переменную типа REAL в регистры 9 и 10 и эту же переменную записываю в регистры 11 и 12:
80524
В OwenCloud считываю:
80523
В итоге из регистров 9 и 10 считывается верное значение, а из 11 и 12 считывается 0. Неправильно задаю адрес регистра?
Евгений Кислов
03.12.2024, 12:56
Добрый день. СПК110 и ПМ210. Записываю переменную типа REAL в регистры 9 и 10 и эту же переменную записываю в регистры 11 и 12:
80524
В OwenCloud считываю:
80523
В итоге из регистров 9 и 10 считывается верное значение, а из 11 и 12 считывается 0. Неправильно задаю адрес регистра?
Добрый день.
В облаке адреса регистров задаются в HEX.
Т.е. для 9 в облаке надо написать 9, а для 11 - уже B (0xB = 11 в DEC).
rybakov-ks
03.12.2024, 13:06
Добрый день.
В облаке адреса регистров задаются в HEX.
Т.е. для 9 в облаке надо написать 9, а для 11 - уже B (0xB = 11 в DEC).
Понятно. Спасибо.
Всех приветствую, коллеги!
Есть задача: Опрашивать SCADA системой SmartICS контроллер ПЛК210 по OPC UA.
Есть проблема: Получается опросить не более 100 тэгов. При попытке добавить к опросу 100+1 перестают опрашиваться все. А опрашивать нужно порядка 300 тэгов.
Что пробовал: Опрашивать ПЛК через Multiprotocol MasterOPC (Инсат) и UaExpert (Шнайдер). Multiprotocol Тоже самое - 100 тэгов, если 101, то у всех качество BAD. Но, в Multiprotocol можно создать ещё одно подключение (устройство) с такими же настройками и ещё 100 сигналов можно опрашивать. Т.е. получается на одно OPC UA устройство только 100 тэгов... UaExpert же видит все тэги сразу без каких либо проблем.
Возможно кто-то сталкивался с подобным поведением? В чём проблема? Как решали?
P.S. в SmartICS можно создать только одно подключение к одному OPC UA серверу.
По поводу 100 тегов вроде была инфа, и кажется эта проблема не только в вашем ПО. В самом ПЛК нельзя создать несколько серверов ?
Евгений Кислов
06.12.2024, 11:23
Всех приветствую, коллеги!
Есть задача: Опрашивать SCADA системой SmartICS контроллер ПЛК210 по OPC UA.
Есть проблема: Получается опросить не более 100 тэгов. При попытке добавить к опросу 100+1 перестают опрашиваться все. А опрашивать нужно порядка 300 тэгов.
Что пробовал: Опрашивать ПЛК через Multiprotocol MasterOPC (Инсат) и UaExpert (Шнайдер). Multiprotocol Тоже самое - 100 тэгов, если 101, то у всех качество BAD. Но, в Multiprotocol можно создать ещё одно подключение (устройство) с такими же настройками и ещё 100 сигналов можно опрашивать. Т.е. получается на одно OPC UA устройство только 100 тэгов... UaExpert же видит все тэги сразу без каких либо проблем.
Возможно кто-то сталкивался с подобным поведением? В чём проблема? Как решали?
P.S. в SmartICS можно создать только одно подключение к одному OPC UA серверу.
Добрый день.
Свяжитесь, пожалуйста, со мной через телеграм (в подписи) - посмотрим, что у вас происходит.
У меня 3000 тегов с ПЛК210-03 получалось опрашивать в SP16
SOS!!! Подскажите пожалуйста. использую вертуалный ПЛК CODESYS Control Win V3 как slave в CODESYS v3.5 sp17 и MASTERSCADA 4D как MASTER. надо опросить его. использую протокол Modbus RTU. Иcпользую вертуальные порты программой Virtual Serial Port Driver COM1 и СOM2. Так вот MASTERSCADA 4D подхватывает вертуальнный порт COM2, а CODESYS нет. НА стороне CODESYS было создано Modbus_COM (Modbus_COM) Версия: 3.5.16.0 и под него добавлено => Modbus Serial Device Версия: 3.5.17.0.
почему нет соеденения?
MASTERSCADA 4D и MasterOPC Modbus Server сразу подхватывают вертуальный порт при чем под статусом портов COM1 и СOM2 в программе Virtual Serial Port Driver указываеться что они слушают MASTERSCADA 4D и MasterOPC Modbus Server, а вот CODESYS не садиться на порт
подскажите пожалуйста
я пробывал по отдельности MASTERSCADA 4D и MasterOPC Modbus Server и СoDEsys. Может проблема в Modbus_COM (Modbus_COM) Версия: 3.5.16.0??????
Евгений Кислов
07.12.2024, 22:52
SOS!!! Подскажите пожалуйста. использую вертуалный ПЛК CODESYS Control Win V3 как slave в CODESYS v3.5 sp17 и MASTERSCADA 4D как MASTER. надо опросить его. использую протокол Modbus RTU. Иcпользую вертуальные порты программой Virtual Serial Port Driver COM1 и СOM2. Так вот MASTERSCADA 4D подхватывает вертуальнный порт COM2, а CODESYS нет. НА стороне CODESYS было создано Modbus_COM (Modbus_COM) Версия: 3.5.16.0 и под него добавлено => Modbus Serial Device Версия: 3.5.17.0.
почему нет соеденения?
MASTERSCADA 4D и MasterOPC Modbus Server сразу подхватывают вертуальный порт при чем под статусом портов COM1 и СOM2 в программе Virtual Serial Port Driver указываеться что они слушают MASTERSCADA 4D и MasterOPC Modbus Server, а вот CODESYS не садиться на порт
подскажите пожалуйста
я пробывал по отдельности MASTERSCADA 4D и MasterOPC Modbus Server и СoDEsys. Может проблема в Modbus_COM (Modbus_COM) Версия: 3.5.16.0??????
Добрый день.
Не наблюдаю никаких проблем в такой связке с именно теми же версиями Modbus-компонентов.
80612
Напишите в понедельник утром мне в телеграм (см. в подписи) или на support@owen.ru - посмотрим, что происходит в вашем окружении.
Спасибо за ответ! И вправду у ВАС на скриншоте все ок! И такой же вертуальный ПЛК использовали
8062280622
А у меня вот так. CODESYS не подхватывает порт COM1
Евгений Кислов
08.12.2024, 11:20
8062280622
А у меня вот так. CODESYS не подхватывает порт COM1
Я для создания виртуальных COM-портов использую VSPE.
Попробуйте повторить вашу ситуацию с ним:
https://eterlogic.com/Products.VSPE_Download.html
80636
Хех, долго провозился до сегоднийшего дня. Вобщем по вашему рецепту удалось толкнуть сборочку. Все думал что проблемы с библиотекой Modbus_COM (Modbus_COM) Версия: 3.5.16.0. Размышлял, что ее надо прокинуть с Modbus_COM (Modbus_COM) Версия: 3.5.16.0 => до Modbus_COM (Modbus_COM) Версия: 3.5.17.0 если вообще такая существует. Если б не ваша подсказка, то наверное на Х5 времени завис, и так уже неделю как застрял. Что примечательно Modbus TCP куда легче мне было развернуть.
Премного благодарен, для FeedBack сверху приложил скрин
Здравствуйте!
При решении задачи на базе ПЛК210 необходимо считывать значение float из весов от Тензо-М, ТВИ025, со встроенным MiiNePort E1 мостом от MOXA со следующими настройками:80731 80732
Удалось наладить связь с MasterOPC Universal Modbus Server, настроив такую конфигурацию: 80733 80734 80735 80736
Но настроить соединение с ПЛК не удаётся: 80737
Что я делаю не так? Помогите кто может!
Евгений Кислов
12.12.2024, 10:46
Здравствуйте!
При решении задачи на базе ПЛК210 необходимо считывать значение float из весов от Тензо-М, ТВИ025, со встроенным MiiNePort E1 мостом от MOXA со следующими настройками:80731 80732
Удалось наладить связь с MasterOPC Universal Modbus Server, настроив такую конфигурацию: 80733 80734 80735 80736
Но настроить соединение с ПЛК не удаётся: 80737
Что я делаю не так? Помогите кто может!
Добрый день.
В настройках OPC вы задали режим "Modbus поверх TCP".
Стандартные компоненты CODESYS из дереве проекта не поддерживают этот режим.
Вам потребуется организовать обмен через библиотеку OwenCommunication:
https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_Modbus_v3.2.pdf
В ФБ MB_TcpRequest входу xIsRtuOverTcp нужно будет присвоить значение TRUE.
Andrei51
12.12.2024, 15:39
Всем добрый день, столкнулся с такой проблемой! Пишу дипломную работу на СПК207 (с обратной стороны написано СПК207-220.03.00-CS-WEB -90...264B 50 Гц 15ВА IP64/IP20 [M05] ).
Программный код написан и в виртуальном контроллере через эмуляцию визуализация работает (без ошибок).
CODESYS V3.5 SP5 Patch 5 на ноутбуке установлена данная версия.
Обновил версию на контроллера до 3.5.4.26 ''Device SPK2xx 03.CS.WEB ''.
Подключался через LAN кабель от ноутбука через USB-LAN (переходник) и к СПК207 LAN - LAN в гнездо "LAN". Пробовал также через COM2 и COM3. По итогу создавал Gateway, затем сканировал Сеть (Scan network), программа не видела контроллер. Попробовал через командную строку и вписать ping 192.168.0.10 (ситуация такая же).
Подскажите, в чём может быть проблема? Кто-то говорит, что проблема может быть из-за разных прошивок контроллера. Есть парнишка, который закачивал свой проект год назад. У него осталось все пакеты и программа, который работали на данном контроллере СПК207. Писать заново нет желания программный код. Нюанс: на контроллере стоит уже проект старый и через флешку прошивать и сносить программный код не вариант.
Если надо могу предоставить дополнительную информацию всю.
Заранее благодарю!
Евгений Кислов
12.12.2024, 15:48
Всем добрый день, столкнулся с такой проблемой! Пишу дипломную работу на СПК207 (с обратной стороны написано СПК207-220.03.00-CS-WEB -90...264B 50 Гц 15ВА IP64/IP20 [M05] ).
Программный код написан и в виртуальном контроллере через эмуляцию визуализация работает (без ошибок).
CODESYS V3.5 SP5 Patch 5 на ноутбуке установлена данная версия.
Обновил версию на контроллера до 3.5.4.26 ''Device SPK2xx 03.CS.WEB ''.
Подключался через LAN кабель от ноутбука через USB-LAN (переходник) и к СПК207 LAN - LAN в гнездо "LAN". Пробовал также через COM2 и COM3. По итогу создавал Gateway, затем сканировал Сеть (Scan network), программа не видела контроллер. Попробовал через командную строку и вписать ping 192.168.0.10 (ситуация такая же).
Подскажите, в чём может быть проблема? Кто-то говорит, что проблема может быть из-за разных прошивок контроллера. Есть парнишка, который закачивал свой проект год назад. У него осталось все пакеты и программа, который работали на данном контроллере СПК207. Писать заново нет желания программный код. Нюанс: на контроллере стоит уже проект старый и через флешку прошивать и сносить программный код не вариант.
Если надо могу предоставить дополнительную информацию всю.
Заранее благодарю!
Добрый день.
1. Подключиться к СПК207 можно только через его LAN-порт.
2. Вы уверены, что IP контроллера - именно 192.168.0.10? Проверили это в экранном конфигураторе?
3. Для Ethernet-интерфейса ноутбука был выставлен IP-адрес из подсети 192.168.0.x?
Andrei51
12.12.2024, 16:10
Да, подключался через LAN порт.
Да, вот это момент я упустил. Не пробовал через экранный конфигуратор. Завтра отпишусь!
Добрый день.
В настройках OPC вы задали режим "Modbus поверх TCP".
Стандартные компоненты CODESYS из дереве проекта не поддерживают этот режим.
Вам потребуется организовать обмен через библиотеку OwenCommunication:
https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_Modbus_v3.2.pdf
В ФБ MB_TcpRequest входу xIsRtuOverTcp нужно будет присвоить значение TRUE.
Простите, но, поскольку мне не приходилось заниматься программированием протоколов связи, я заблудился в чтении CDSv3.5_Modbus_v3.2.pdf. Нельзя ли, для ускорения процесса, объяснить по шагам что мне нужно сделать?
1) Modbus_TCP_Slave я установил правильно, или надо что-то переделать?
2) В какие разделы документа мне надо вчитаться для понимания ситуации?
Евгений Кислов
12.12.2024, 17:20
Простите, но, поскольку мне не приходилось заниматься программированием протоколов связи, я заблудился в чтении CDSv3.5_Modbus_v3.2.pdf. Нельзя ли, для ускорения процесса, объяснить по шагам что мне нужно сделать?
1) Modbus_TCP_Slave я установил правильно, или надо что-то переделать?
2) В какие разделы документа мне надо вчитаться для понимания ситуации?
1) Он вам не нужен
2) п. 5.6.3, п. 5.9.3
Можете завтра утром связаться со мной по телеграм (см. в подписи) - минут за 10 всё вам настроим.
Спасибо большое!
После внимательного изучения п. 5.9.3 применительно к моей ситуации, всё получилось!
W1nn1ep00h
14.12.2024, 00:15
Ситуация следующая. В режиме эмулятора контроллера не записываются значения в переменные соотнесенные с Holding-регистрами ветки ModBusTCP Server Device(см.рис.1) - версия 4.4.0.0
Настройки ветки ModBusTCP Server Device представлены на рис.2.
Но при этом , если включать в режиме Эмуляции, то все нормально записывается(рис.3).
Адресное пространство не трогал,все адреса(%QW) Codesys проставлял сам.
Сейчас нет под рукой 210, чтобы проверить на реальном. Это нормальная ситуация и своего рода ограничения или я делаю, что-то не так?
807758077680777
Доброго времени суток! Eвгений подскажите пожалуйста80793
Как установить СAN если он подерживаеться MASTERSCADA 4D?
Евгений Кислов
14.12.2024, 19:38
Доброго времени суток! Eвгений подскажите пожалуйста80793
Как установить СAN если он подерживаеться MASTERSCADA 4D?
Добрый день. Задайте этот вопрос в разделе про MasterSCADA 4D, пожалуйста.
https://owen.ru/forum/forumdisplay.php?f=94
Он не имеет отношения к CODESYS.
Евгений Кислов
14.12.2024, 19:41
Адресное пространство не трогал,все адреса(%QW) Codesys проставлял сам.
Синяя буква M на втором скриншоте опровергает это утверждение. Но не факт, что она влияет на вашу ситуацию (которая не выглядит нормальной).
Выложите, пожалуйста, простейший проект с одной переменной, в котором она проявится.
Добрый день!
Моя проблема состоит в том, что устройство, с которым необходимо установить связь, не способно корректно обрабатывать запросы с идентификатором транзакций, превышающим значение 255. На данный момент удалось установить соединение с помощью функционального блока "UNM_TcpRequest", где я самостоятельно формирую Modbus-запрос.
Подскажите, пожалуйста, возможно ли установить конкретное значение "Идентификатора Транзакций" в протоколе Modbus TCP на уровне штатной конфигурации Modbus TCP Slave или при настройке обмена с использованием функционального блока "MB_PcpRequest" из библиотеки OwenCommunication?
Евгений Кислов
17.12.2024, 18:35
Добрый день!
Моя проблема состоит в том, что устройство, с которым необходимо установить связь, не способно корректно обрабатывать запросы с идентификатором транзакций, превышающим значение 255. На данный момент удалось установить соединение с помощью функционального блока "UNM_TcpRequest", где я самостоятельно формирую Modbus-запрос.
Подскажите, пожалуйста, возможно ли установить конкретное значение "Идентификатора Транзакций" в протоколе Modbus TCP на уровне штатной конфигурации Modbus TCP Slave или при настройке обмена с использованием функционального блока "MB_PcpRequest" из библиотеки OwenCommunication?
Добрый день. Нет.
В рамках библиотеки (как и в штатной конфигурации) для каждого следующего запроса значение Transaction ID увеличивается на единицу - это типовой способ обработки данного поля, упоминаемый в спецификации протокола.
МихаилГл
10.01.2025, 06:12
Доброе утро!
Кто-нибудь пробовал программировать ПЛК2ХХ как spy устройство в линии ModBus RTU?
Евгений Кислов
10.01.2025, 06:18
Доброе утро!
Кто-нибудь пробовал программировать ПЛК2ХХ как spy устройство в линии ModBus RTU?
Добрый день.
Это позволяет сделать ФБ MB_SerialSlave из библиотеки OwenCommunication.
https://youtu.be/ga625dWdevE?si=Sukvqrq4AORwk661
МихаилГл
10.01.2025, 11:28
Спасибо за ссылку... Потом гляну.
Хотелось конечно самому написать такое, но раз уже есть... Хотя возможно на иной протокол для RS485 линии сам попробую что-нибудь сделать.
eretindaniil
30.01.2025, 10:28
Выложите ваш проект - я попробую воспроизвести проблему у себя и разобраться, что происходит.
Надпись появляется сразу при первом вызове ФБ MB_SerialRequest?
Какую версию библиотеки OwenCommunication вы используете?
Подскажите пожалуйста, как решилась данная проблемаа
Евгений Кислов
30.01.2025, 10:31
Подскажите пожалуйста, как решилась данная проблемаа
Добрый день.
Не помню.
Опишите в деталях вашу конкретную проблему, и будем с ней разбираться.
eretindaniil
30.01.2025, 10:37
ПЛК 210 является мастером в сети Mobdus RTU (RS485) для работы со всем оборудованием и также является слейвом в сети Mobdus TCP для работы с панелью оператора. Проблема возникает при записи значения полученного с панели (глобальная переменная в проекте) по RTU. Выдает ошибку отсутствия исходного кода библиотеки owencommunication 3.5.11.7.
Евгений Кислов
30.01.2025, 10:51
ПЛК 210 является мастером в сети Mobdus RTU (RS485) для работы со всем оборудованием и также является слейвом в сети Mobdus TCP для работы с панелью оператора. Проблема возникает при записи значения полученного с панели (глобальная переменная в проекте) по RTU. Выдает ошибку отсутствия исходного кода библиотеки owencommunication 3.5.11.7.
Свяжитесь, пожалуйста, со мной по телеграм (см. в подписи) и продемонстрируйте вашу проблему по AnyDesk.
Добрый вечер. Вопрос может банальный, но всё же: есть ПЛК и две ПР-ки. с одной плк читает переменную, в другую её пишет. Как писать переменную во вторую ПР только по её изменению? Какой триггер выбрать? Или сохранять в третьей локальной переменной состояние, сравнивать входящую и, если изменилась, то писать её с триггером "приложение"? и как это кстати делается с таким триггером?
kondor3000
04.02.2025, 16:12
Добрый вечер. Вопрос может банальный, но всё же: есть ПЛК и две ПР-ки. с одной плк читает переменную, в другую её пишет. Как писать переменную во вторую ПР только по её изменению? Какой триггер выбрать? Или сохранять в третьей локальной переменной состояние, сравнивать входящую и, если изменилась, то писать её с триггером "приложение"? и как это кстати делается с таким триггером?
Сделать можно как угодно, достаточно сравнить новую и записанную переменную, если изменилась, то выставить флаг на 1 цикл или 100-300 мс.
Только сегодня выложил ФБ для управления из 2 мест (сравнения переменных), вам надо сравнить одну переменную, значит ФБ можно сократить вдвое и прикрутить булевый флаг и триггер (таймер ТР), который включит триггер записи.
https://owen.ru/forum/showthread.php?t=10555&page=1123&p=456513#post456513#11223
Сделать можно как угодно, достаточно сравнить новую и записанную переменную, если изменилась, то выставить флаг на 1 цикл или 100-300 мс.
Только сегодня выложил ФБ для управления из 2 мест (сравнения переменных), вам надо сравнить одну переменную, значит ФБ можно сократить вдвое и прикрутить булевый флаг и триггер (таймер ТР), который включит триггер записи.
https://owen.ru/forum/showthread.php?t=10555&page=1123&p=456513#post456513#11223
выставить флаг - это с выбором триггера "передний фронт, получается". Как и в каких случаях писать переменную с триггером "приложение"?
Дополнение: и еще, если я прям из программы пишу значение в переменную напрямую, а слейва два - как объявлять тогда переменную, как правильно выбрать слейв? вот написал я "iSomeVar AT %QW0 : INT; - и как ПЛК догадается, в какой ПР она, если и в обоих слейвах есть такой канал?
81776 вот так я могу писать переменную в ПР по изменению? просто она так не доходит до ПР... 8177781778
kondor3000
05.02.2025, 14:58
выставить флаг - это с выбором триггера "передний фронт, получается". Как и в каких случаях писать переменную с триггером "приложение"?
Дополнение: и еще, если я прям из программы пишу значение в переменную напрямую, а слейва два - как объявлять тогда переменную, как правильно выбрать слейв? вот написал я "iSomeVar AT %QW0 : INT; - и как ПЛК догадается, в какой ПР она, если и в обоих слейвах есть такой канал?
Если вы записываете ПЛК мастером в два слейва, у слейвов разные адреса, значит надо сделать 2 слейва.
В двух слейвах сделайте два разных бита для записи по переднему фронту. Какой бит включите тот слейв и запишите.
ФБ вы просто скопировали половину ( и то не правильно), а бит записи с триггером не добавили.
Короче для начала сделайте просто запись по фронту бита. Проверьте, что она работает, записав бит руками.
Потом делайте запись по изменению, с выставлением бита записи.
Если вы записываете ПЛК мастером в два слейва, у слейвов разные адреса, значит надо сделать 2 слейва.
В двух слейвах сделайте два разных бита для записи по переднему фронту. Какой бит включите тот слейв и запишите.
ФБ вы просто скопировали половину ( и то не правильно), а бит записи с триггером не добавили.
Короче для начала сделайте просто запись по фронту бита. Проверьте, что она работает, записав бит руками.
Потом делайте запись по изменению, с выставлением бита записи.
как писать по переднему фронту булевой команды, я разобрался, благодарю, всё получилось и пишется. Очень хочется понять, как работает триггер "приложение", и как писать переменные в слейвах с таким триггером в обоих вариантах: либо привязывая переменную из программы к входу, либо объявляя адрес хранения переменной с помощью "AT %..." - и в этом варианте актуален вопрос с двумя слейвами с одинаковыми именами каналов, как правильно выбрать нужный слейв
kondor3000
05.02.2025, 15:59
как писать по переднему фронту булевой команды, я разобрался, благодарю, всё получилось и пишется. Очень хочется понять, как работает триггер "приложение", и как писать переменные в слейвах с таким триггером в обоих вариантах: либо привязывая переменную из программы к входу, либо объявляя адрес хранения переменной с помощью "AT %..." - и в этом варианте актуален вопрос с двумя слейвами с одинаковыми именами каналов, как правильно выбрать нужный слейв
1) Внимательно посмотрите на свои адреса AT %. в разных слейвах и увидите что они Разные
Кроме того, их не следует использовать вообще, кроме редких случаев указания на массив в обмене.
2) Открываете талмут по Codesys и читаете как работает триггер "приложение"
1) Внимательно посмотрите на свои адреса AT %. в разных слейвах и увидите что они Разные
Кроме того, их не следует использовать вообще, кроме редких случаев указания на массив в обмене.
2) Открываете талмут по Codesys и читаете как работает триггер "приложение"
1. Благодарю за инфу, так и есть.
2. Вот только в талмуде в этом месте ссылка на ресурс, по которой nginx вываливает ошибку 404. И быстрый гуглеж тоже ничего годного не находит.
Евгений Кислов
06.02.2025, 16:10
2. Вот только в талмуде в этом месте ссылка на ресурс, по которой nginx вываливает ошибку 404. И быстрый гуглеж тоже ничего годного не находит.
https://www.youtube.com/watch?v=elizZ9l_-sw
https://www.youtube.com/watch?v=elizZ9l_-sw
Получается, хреновый из меня гуглёжник. Благодарю за ссылочку
Павел Алешин
28.02.2025, 09:57
Здравствуйте !
Столкнулся со следующей проблемой.
Создал передачу входов/выходов 2-ого ПЛК на 1-ый при помощи сетевых переменных.
На контроллерах другого производителя, все успешно работает, при попытке сделать подобное на ОВЕН ПЛК210-03-CS, происходит неудача.
82245
Павел Алешин
28.02.2025, 10:41
Связались с Евгением, успешно решили проблему.
У меня используется Codesys 3.5 SP19 Patch5.
Для установки связи с плк при помощи сетевых переменных необходимо в значение Broadcast Adr. записать значение Широковещательный IPv4-адрес
8225182250
Dmitry Dedkov
12.03.2025, 13:12
День добрый. Возникла такая проблема. Решил воспользоваться библиотекой OwenCommunication для ModbusTCP чтобы получать данные с модулей Mx210. Проблема возникает при использовании ФБ mb_tcpRequest. Обращаюсь к регистру 51 (читаю битовую маску), а блок выдает ошибку ILLEGAL_DATA_ADRESS. Не могу понять из-за чего возникает ошибка, настроил блок по примеру из документа, регистр вроде выбрал правильный (модуль МВ210-202). Пишу на ST, не использую case тк необходимо выполнять все действия в одном и том же цикле
MU210_202_DI_Client(xEnable := TRUE,
tTimeout := T#0S,
sIpAddr := ip_202_di,
uiPort := 502
);
MU210_202_DI_request(
xExecute := MU210_202_DI_Client.xActive,
tTimeout := T#0S,
usiRetry := 3,
hConnection := MU210_202_DI_Client.hConnection,
xIsRtuOverTcpMode := FALSE,
usiUnitId := 1,
eFuncCode := OCL.MB_FC.READ_HOLDING_REGISTERS,
uiDataAddr := 51,
uiDataCount := 1,
pData := ADR(wDImask),
szSize := SIZEOF(wDImask)
);
IF MU210_202_DI_request.xDone OR MU210_202_DI_request.xError THEN
MU210_202_DI_Client.xEnable := FALSE;
END_IF
Евгений Кислов
12.03.2025, 13:16
Надо запрашивать 2 регистра, а не 1.
В реализации модулей - нельзя считать часть параметра (например, "половину" битовой маски входов).
Dmitry Dedkov
12.03.2025, 14:21
Спасибо, как-то не обратил на это внимание
Здравствуйте.
Терморегулятор ТРМ10 подключен через преобразователь интерфейсов RS485-USB к ПК. В начале работал на виртуальном контроллере и обращался к регистрам по Modbus RTU, указывая соответствующий COM-порт, к которому подключен прибор. Сейчас уже работаю с СПК207, подключенному к ПК по LAN для отладки и загрузки проекта.
Вопрос: Можно ли при нынешних подключениях как-то обратиться к ТРМ, подключенному к ПК, или же 100% нужно переподключать его напрямую к COM-порту СПК207? Возможно, ответ очевиден, но вдруг есть какие-то варианты
Евгений Кислов
18.03.2025, 09:53
Добрый день.
Вопрос: Можно ли при нынешних подключениях как-то обратиться к ТРМ, подключенному к ПК, или же 100% нужно переподключать его напрямую к COM-порту СПК207? Возможно, ответ очевиден, но вдруг есть какие-то варианты
Вы можете запустить на ПК программу, которая будет выполнять роль шлюза Modbus TCP/Modbus RTU.
Например - в качестве такой программы можно использовать упомянутый вами виртуальный контроллер.
Соответственно, СПК207 будет обращаться к ПК, используя протокол Modbus TCP.
Спасибо. Получается, я на виртуальном контроллере через Modbus RTU задаю каналы с регистрами и привязываю их к переменным, а потом эти переменные как сетевые передаю на СПК207?
Евгений Кислов
18.03.2025, 10:49
Спасибо. Получается, я на виртуальном контроллере через Modbus RTU задаю каналы с регистрами и привязываю их к переменным, а потом эти переменные как сетевые передаю на СПК207?
Да, можно и так сказать.
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot