PDA

Просмотр полной версии : Как работать с протоколом Modbus



Сема
23.03.2018, 16:46
Добрый день, уважаемые коллеги.

Я всё не могу разобраться, как работать с протоколом MODBUS. У меня есть несколько инструкций и описаний по нему. Но в теории примерно понятно, как протокол можно реализовать в программе? Если допустим написать вручную. Мне до сих пор не понятно, как он работает.

Можно код программы не только КДС (Хотя он тоже нужен)

Может есть какой-нибудь пример готовый, или ветка в форуме (не смог найти).

P.S. Для чего мне это? Для себя, хочу разобраться с принципом работы протокола modbus.

melky
23.03.2018, 16:58
Слишком долго придется изучать. Поищите исходники на гихабе, люди писали для многих целей.

приборист
23.03.2018, 20:20
https://ipc2u.ru/articles/prostye-resheniya/modbus-rtu/
Вполне подробно и понятно.

uni
27.03.2018, 08:05
Одна из старых библиотек owen для codesys 2.3 (Modbus.lib) доступна с исходниками (нужно галочку то ли снять, то ли поставить где-то). Там есть реализация ряда функций из протокола для режимов modbus master RTU и ASCII. Возможно их открытие и изучение будет нарушением пунктов лицензии.
Прям скажем, исходники так себе и реализовано не всё, но оно работает.

Scream
27.03.2018, 08:23
Добрый день, уважаемые коллеги.

Я всё не могу разобраться, как работать с протоколом MODBUS. У меня есть несколько инструкций и описаний по нему. Но в теории примерно понятно, как протокол можно реализовать в программе? Если допустим написать вручную. Мне до сих пор не понятно, как он работает.

Можно код программы не только КДС (Хотя он тоже нужен)

Может есть какой-нибудь пример готовый, или ветка в форуме (не смог найти).

P.S. Для чего мне это? Для себя, хочу разобраться с принципом работы протокола modbus.

Сначало просто научитесь посылать байты с помощью SyslibSocket, хотяб один, затем массив байт, на другой стороне принимать эти байты и обрабатывать.
Тоесть просто поработайте с сокетами, а только потом беритесь за модбас, и лучше для начала ModBus TCP, ASCII и RTU рановато будет.

uni
27.03.2018, 09:15
Тоесть просто поработайте с сокетами, а только потом беритесь за модбас
Нельзя вот так просто взять и поработать с сокетами. Может пример покажите как modbus tcp slave реализовать с подключением множества клиентов?

capzap
27.03.2018, 09:20
Нельзя вот так просто взять и поработать с сокетами. Может пример покажите как modbus tcp slave реализовать с подключением множества клиентов?

решили выпендрится, попросить то чего не возможно сделать. Один сокет - одно соединение
А примеров полно и по ethernet и по RS485

uni
27.03.2018, 10:25
Ну, пусть удалят ссылку, это не важно. Не нужно вводить людей в заблуждение по поводу простоты сокетов по сравнению с обычным последовательным портом. Если с последним ещё не так сложно реализовать master и slave, то с сокетами это сделать гораздо сложнее, учитывая, что пользователь будет от modbus tcp slave ожидать то, что от него ждут.

П.С. Судя по моим данным runtime СПК, к примеру, имеет версию 3.5.4.2. Библиотека SysSocket 3.5.4.0 имеет тот же состав, что и старшие версии. На СПК можно реализовать то же самое (много клиентов на одном порту). Да и не только на СПК.

capzap
27.03.2018, 10:40
примеры с сокетом простые до безобразия
http://www.owen.ru/forum/showthread.php?t=24797&p=214553&viewfull=1#post214553
http://www.owen.ru/forum/showthread.php?t=16814&p=214982&viewfull=1#post214982

uni
27.03.2018, 10:49
Осталось показать пример работы с SysSockSelect(), как это обычно делается на C. И сравнить что проще: Modbus TCP или Modbus RTU.

capzap
27.03.2018, 12:21
Осталось показать пример работы с SysSockSelect(), как это обычно делается на C. И сравнить что проще: Modbus TCP или Modbus RTU.

Какое отношение эта функция имеет к реализации протокола, чтоб сравнивать RTU vs TCP, чтоб отправить запрос и прочитать ответ она не нужна, я делал и клиентов вебсервера, ntp и mqtt, конечно же и мастера со слейвом модбас

uni
27.03.2018, 13:58
Хорошо, я не буду настаивать. Идите своим путём. Надёюсь только, что реализация Modbus TCP в новых модулях Овен подразумевает одновременный опрос разными мастерами одного устройства на одном порту.

capzap
27.03.2018, 14:03
Надёюсь только, что реализация Modbus TCP в новых модулях Овен подразумевает одновременный опрос разными мастерами одного устройства на одном порту.
и не мечтайте, это подчиненный модуль а не сервер, чтоб к нему подключались все подряд

uni
27.03.2018, 14:07
Я знаю, что поддерживает. Просто пошутил. Учите матчасть.

6.5 Режимы обмена данными

Обмен с Мастером по протоколу Modbus TCP (порт 502) — до 4 одновременных соединений с разными Мастерами сети.

capzap
27.03.2018, 15:19
Я знаю, что поддерживает. Просто пошутил. Учите матчасть.

6.5 Режимы обмена данными

Обмен с Мастером по протоколу Modbus TCP (порт 502) — до 4 одновременных соединений с разными Мастерами сети.
вот подловил так подловил, я могу себе позволить забыть, я знаю где посмотреть если у меня возникнет проблема с этим, а пока их нет
http://www.owen.ru/forum/showthread.php?t=27165&p=258236&viewfull=1#post258236

uni
27.03.2018, 15:41
Вообще, Modbus TCP подразумевает подключение любого разумного количества клиентов. Это даже может не оговариваться специально, это подразумевается из самого названия протокола. Если есть ограничение, как в примере выше, то это, видимо, вызвано проблемами с выбором мк или применяемой периферийной микросхемы, реализующей Ethernet подключение. Что печально. Надеюсь, что подключение новым Конфигуратором через Ethernet, если это возможно, не входит в эти 4 доступных канала.

Вот так приедете на объект, там модуль стоит: 1 канал на ПЛК, 1 на верхний уровень, 1 на панель оператора, 1 на внешнюю систему хранения данных (чёрный ящик) и конфигуратором уже можно и не подключиться. Мы видим ограничение в применении данного модуля.

А теперь представим ПЛК, который умеет только одного клиента обслуживать, потому что кто-то не знает для чего нужен select(), не странно ли?

Сема
28.03.2018, 14:39
Я не до конца понимаю, что такое сокет. Я знаю, что это программный интерфейс, который совершает обмен данными. Но только в общих чертах..

melky
28.03.2018, 15:26
Сема пока не забивайте голову, как раз вот с последовательным интерфейсом бы начали разбираться в начале. Все равно большинство приборов ввода/вывода подключаются по последовательному интерфейсу.

Scream
29.03.2018, 09:33
Я не до конца понимаю, что такое сокет. Я знаю, что это программный интерфейс, который совершает обмен данными. Но только в общих чертах..

Трудная и интересная дорога предстоит... тогда да, лучше начать вообще с COM портов, но тогда и CRC будет усложнять всё.

melky
29.03.2018, 10:19
Да ничего усложнять она не будет, куча примеров в сети для расчета CRC Modbus хоть с таблицей хоть кодом.

uni
29.03.2018, 10:24
Библиотека CAA Memory, функция Mem.CRC16_Modbus().

Трудность будет, если захотите сделать синхронный запрос, т.е. такой запрос, ответ на который ожидается в том же цикле. Обычно фб мастеров modbus асинхронные. Ещё трудность, к примеру, если у вас несколько последовательных соединений и желательно работать с ними параллельно (подключили к Raspberry Pi несколько usb-rs485 преобразователей).

Сема
29.03.2018, 17:40
Одна из старых библиотек owen для codesys 2.3 (Modbus.lib) доступна с исходниками (нужно галочку то ли снять, то ли поставить где-то). Там есть реализация ряда функций из протокола для режимов modbus master RTU и ASCII. Возможно их открытие и изучение будет нарушением пунктов лицензии.
Прям скажем, исходники так себе и реализовано не всё, но оно работает.

Не смог я открыть, чёрный ящик.

Интересно, почему это нарушение лицензионного соглашения. Ведь протокол является открытым источником.

uni
30.03.2018, 07:47
Нужно пытаться. Я открывал местную библиотеку Modbus.lib в среде Codesys 2.3, смотрел исходники и копировал в новую библиотеку. Так просто она у меня не конвертируется в 3.5. Все исходники полностью переделал и доработал, ибо они ужасно выглядят.

Интересно, почему это нарушение лицензионного соглашения. Ведь протокол является открытым источником.
Когда скачиваешь какой-то софт с местного сайта, то обычно нужно поставить галочку о принятии лицензионного соглашения. Сейчас не знаю, раньше так было. И вроде там написано, что нельзя до исходников докапываться. Это обычная коммерческая практика, чтобы не лезли, не декомпилировали и прочее.
Не надо путать описание протокола и сделанную кем-то его реализацию. Она хоть и частичная, но распространяется в "закрытом" виде.

Mr Green
31.08.2018, 08:42
Попробуйте открыть библиотеку как проект. Через свойства объекта добавите полные права достуа. И, с большой долей вероятности увидите скрытый код.