Просмотр полной версии : 2 ModbusRTU Slave на 1 порту.
Здравствуйте!
Реализую обмен по Modbus RTU посредством ФБ OCL.COM_Control и OCL.MB_SerialSlave.
Подскажите, пожалуйста, каким образом организовать работу 2-х экземпляров MB_SerialSlave с разными адресами usiSlaveId на одном порту COM_Control?
Евгений Кислов
21.04.2020, 15:57
Здравствуйте!
Реализую обмен по Modbus RTU посредством ФБ OCL.COM_Control и OCL.MB_SerialSlave.
Подскажите, пожалуйста, каким образом организовать работу 2-х экземпляров MB_SerialSlave с разными адресами usiSlaveId на одном порту COM_Control?
Добрый день.
Два экземпляра не нужны.
Достаточно одного экземпляра с usiSlaveId = 255. Он будет отвечать на запросы с любым адресом.
Организовать "эмуляцию" именно двух конкретных устройств - возможности нет.
Нидвораич
04.04.2025, 15:23
Организовать "эмуляцию" именно двух конкретных устройств - возможности нет.
Я сейчас уже успешно организовал эмуляцию работы двух модулей - дискретного ввода на 16 каналов и дискретного вывода на 16 каналов.
Благо - у них не пересекается адресация регистров. Я не имитировал всю информацию. Только состояние самих вводов и выводов, без счётчиков и прочего.
Работает.
На данный момент думаю, как можно всё же запихнуть в имитатор два устройства с одинаковой адресацией регистров. Пока что в голову приходит только банить все Айдишники кроме одного, ждать, пока от запросит инфу, скормить ему заранее подготовленный буфер данных, и дальше переходить к следующему айдишнику, баня все остальные.
Да, работать будет с задержками, но для небольшого количества устройств может проканать, мне кажется.
В идеале, конечно, было бы неплохо доработать блок OCL.MB_SerialSlave таким образом, чтоб он самостоятельно по АйДи запроса переключался на нужную область памяти.
Эту опцию, например, можно сделать отключаемой, но кому надо - смогут организовать имитацию работы реальных устройств для удобной отладки на виртуальном контролере.
Евгений Кислов
04.04.2025, 15:36
но кому надо
Кому надо - могут все сделать самостоятельно, как вы и упомянули.
У блока есть выход stRequestInfo.
В рамках имитатора - порядок запросов от мастера должен быть предсказуем.
Поэтому получив информацию о текущем запросе - можно понять, какой будет следующим, и своевременно записать в регистры слэйва нужные значения.
Никаких задержек это не должно создавать.
Добавлять в библиотеку крайне специфический функционал ради пары человек, которые по каким-то причинам не используют для имитации слэйвов готовое ПО типа MasterOPC Universal Modbus Server - не выглядит перспективной задачей.
Нидвораич
04.04.2025, 16:00
В рамках имитатора - порядок запросов от мастера должен быть предсказуем.
Поэтому получив информацию о текущем запросе - можно понять, какой будет следующим, и своевременно записать в регистры слэйва нужные значения.
Никаких задержек это не должно создавать.
Я успел обратить внимание на то, что при попытке записать в общую область памяти данные для конкретного fbModbusSerialSlave.stRequestInfo.usiSlaveId по триггеру xNewRequest - я получаю смещение ровно на один адрес.
То есть - прибор с адресом 21 получает инфу, предназначенную для прибора с адресом 20. И так далее. Я понимаю, что это происходит так:
ФБ получил запрос от адреса 20, отдал ему данные, обновил переменную Id на 20, вернул управление основному циклу.
А уже основной цикл, увидев число 20 радостно записал в общий буфер данные для 20 адреса, хотя уже поздно это делать.
И на следующем вызове эти данные достались прибору с адресом 21.
Но вот предположить, что запросы от мастера всегда будут приходить в строгом порядке, я почему-то не мог. Раз так - это полностью решает проблему имитации нужного количества модулей :)
Нидвораич
04.04.2025, 16:23
Добавлять в библиотеку крайне специфический функционал ради пары человек, которые по каким-то причинам не используют для имитации слэйвов готовое ПО типа MasterOPC Universal Modbus Server - не выглядит перспективной задачей.
Конечно же, я в первую очередь для имитации попытался использовать MasterOPC Universal Modbus Server. Вы неоднократно его упоминаете в видео и тут на форуме. Но.
Чтоб сымитировать событие на вводе нужно:
1) щёлкнуть по нужному тегу,
2) щёлкнуть для открытия диалога ввода нового значения,
3) ввести новое значение
4) подтвердить ввод
Очень много действий для такой маленькой операции. И это не самое главное в целом, хоть и очень неудобно.
Вот конкретно мой пример:
У меня есть 7 компонентов и весы. Контролер должен включать поочерёдно шнеки, чтоб насыпать в весы нужную дозу по рецепту.
Весовой модуль уже находится в работе. Я написал в Кодесис его имитатор, который по нажатию кнопки транслирует в сом порт постепенно увеличивающийся вес.
И вот для имитации работы всего проекта мне нужно:
Открыть кодесис1, запустить отладку проекта
Открыть кодесис2, запустить имитацию работы весового модуля
Открыть Мастеор ОПС для имитации модулей ввода вывода.
Далее в Кодесис1 я нажимаю "взвесить",
мне срочно нужно кинуться в ОПС, чтоб сымитировать ответную реакцию первого контактора,
потом метнуться в Кодесис2, чтоб запустить имитацию набора веса
Когда в Кодесис1 вес подойдёт к переключению на следующий шнек - мне нужно снова побежать в ОПС, остановить первый контактор
Потом в Кодесис2 остановить набор веса,
потом в ОПС сымитировать ответ второго контактора
и снова в Кодесис2 запустить набор веса.
И при всём при этом мне одним глазом нужно следить, собственно, за отладочными параметрами :))))
Ну у меня же всего же две руки же же. Я посидел так пару вечеров, и нервы мои иссякли, потому что я постоянно либо путал, что там надо включить и получал ошибку, либо не успевал в тайминги.
Плюс, у меня начинают уплывать в космос все измеряемые скорости насыпания... В общем, отладка в динамике меня сильно вымотала.
Отныне у меня будет так:
В кодесис1 крутится проект с отладкой,
в кодесис2 крутятся сразу и имитатор весового модуля, и оба модуля ввода-вывода.
Так как они находятся в одном проекте - весовой модуль сможет совершенно автоматически заупускаться и останавливаться в зависимости от состояния выходов модуля выводов.
И я наконец-то смогу сконцентрироваться на отладке, не мороча голову лишними телодвижениями :)
А, и бонусом - я могу расположить все кнопки визуально так, как они расположены на заводе, а не просто в столбик, чтоб не искать их глазами каждый раз.
В общем - может, тех, кому надо, и мало, но мы в тельняшках :)
И большое спасибо за вчерашнюю наводку про общее адресное пространство и за сегодняшнюю про строгий порядок опроса. Очень ценная информация :)
Нидвораич, если ваш отладчик написан на ST, можете прислать код посмотреть?
Нидвораич
04.04.2025, 16:51
на St. Сейчас, немного причешу описание и пришлю
F7 и производные позволяют создать динамику?
Нидвораич
04.04.2025, 19:08
Нидвораич, если ваш отладчик написан на ST, можете прислать код посмотреть?
Вы мне, оказывается, писали про C# в моей теме, но я настолько закопался в модбасе, что пропустил публикацию темы :)
Вот ссылка на моё решение :)
https://owen.ru/forum/showthread.php?t=41134&p=460987&viewfull=1#post460987
Нидвораич
04.04.2025, 19:12
По ощущениям Вы ни когда не пользовались кнопкой F7 и её производными
у меня выставлен тайминг в секунду. Если контактор не ответил - значит, я его считаю залипшим. Это один из примеров того, что я банально не успею переключить три выхода за секунду)
Со всеми производными кнопки F7 :)
И таких примеров в программе масса ещё. Я бы хотел сконцентрироваться на отладке, а не на машинописи :))
Кстати, получается, что у F7 только одна производная. 7. Если Вы понимаете, о чём я :)))
Нидвораич
04.04.2025, 20:44
Согласен. После ковыряния со всеми этими имитациями я тоже пришёл к тому, что проще в проекте это всё и имитировать.
Зато узнал много нового про Модбас :)
capzap я попал в ситуацию, когда сделал имитацию 6-ти слейвов на одном ПР200 вместо реальных Modbus устройств (просто все запросы направил на 1-й адрес вместо 6-ти на разные регистры и биты) и все работало прекрасно. На объекте с реальными слейвами все пошло вкривь и вкось... Причину даже тех поддержка не смогла понять. з.ы. не Овен
capzap я попал в ситуацию, когда сделал имитацию 6-ти слейвов на одном ПР200 вместо реальных Modbus устройств (просто все запросы направил на 1-й адрес вместо 6-ти на разные регистры и биты) и все работало прекрасно. На объекте с реальными слейвами все пошло вкривь и вкось... Причину даже тех поддержка не смогла понять. з.ы. не Овен
Ну и? Работа реального обмена на таких имитациях это всего лишь подтвержение что ваш мастер работает логически правильно. И косяки-особенности имитирующего слейва не вышли за рамки возможностей этого мастера. Но иногда этого мало - реальные косяки/особености чужих слейвов вы сможете узнать только на натуре. И не факт что конкретный мастер имеет нужные "ручки настройки". А 95% всех этих "вкривь и вкось" решает пара настроек которые легко реализовать имея доступ к непосредственному формированию пакетов и таймингу и которые у штатных мастеров я не видел.
Валенок только одно НО, я поставил на опрос этих 6-ти слейвов ноут со Scada и за 1000 опросов каждого 0 ошибок вообще. Так что там интересная проблема именно с мастером была. я кстати спрашивал, как на "квадратиках" можно организовать строго последовательный опрос ибо там fbd и никакого ST нет.
как на "квадратиках" можно организовать строго последовательный опрос ибо там fbd и никакого ST нет.
что тут - "строго последовательный опрос"?
учитывая что любой модбас в одном канале - строго последовательный
и какая связь этого с
там интересная проблема именно с мастером была
?
как на "квадратиках"
st тут не причём, можно по пляжу и на лыжах, вопрос - насколько там обмен вообще управлябелен из кода и какая там есть инфа об рез-тах обмена?
Валенок инфа только выход блока true-false о результате прочтения. И назначение последовательности выполнения блоков.
Какой обстоятельный ответ))
Что значит "результат прочтения"?
Почему прочтения?
—Любой операции?
Что значит результат?
—Завершение однократной операции?
—Подъем когда добилась таки нормы в серии запросов?
-....?
Результат - это событие или состояние?
Когда результат падает?
Можно заставить упасть?
Что после результата - обмен встал или нужно что то теребить? Я ж про управление спрашивал.
Что такое "назначение последовальности"?
—просто работа блоков как в местном CFC/FBD?
—есть ли EN/ENO?
Ответ на любой вопрос может привести либо к продолжению решения либо к “в данных условиях миссия импосибл“
И пока не слова про ST. Но оно (ST) только лишь сузило бы круг вопросов.
Out - это буль успех/не успех.
Порядок можно назначить руками (автоматического назначения как в CodeSys нет).
Вроде бы блоки все последовательны, но как мозги ПЛК это там распихивают непонятно. в блоках не задаются timeout-ы и т.д. где-то есть настройка общая. Но суть.
Когда были назначены адреса всем блокам на одно устройство (адрес 1) и на разные регистры (делал имитацию) все гуд. Как только переключил на разные устройства, все посыпалось. Хотя сами устройства доступны и со scada читались без проблем. При этом пробовал выключать максимум, ошибки все равно сыпались.
были кое какие рекомендации от тех поддержки, но объект уже ушел из доступа. работает, так как ПЛК долбится в устройства постоянно :)
Задача как программно реализовать последовательность опроса, например используя таймеры для контроля, чтобы следующий блок не начинал опрашиваться, пока не завершится первый.
лыжи как-то не едут как выстроить цепочку опроса на fbd, чтобы разрешать или запрещать опрос.
Куда оно там в буфер ПЛК попадает одному черту известно, китайскому :)
да, EN есть.
Там можно реализовать 1-кратную операцию с четким событием завершения (а-ля Comlpete) и результатом при этом Complete?
En это Enable обмена или Кодесис.CFC.ENO вызова кода блока? Если первое - что делает опускание в момент ожидания модбас-ответа?
как выстроить цепочку опроса на fbd,
Переходящий маркер-индекс разрешения. Case наизнанку - очевидно же.
Но без выяснения вопросов выше - без толку
Валенок EN там разрешение работы блоков, не более.
Да мне чисто гипотетически, как бы это выглядело в CodeSys на квадратиках. Out для разрешения работы следующего блока использовать нельзя. En просто разрешение работы блока (оборвет ли он связь или нет, не в курсе), предположим что оборвет.
Надо выстроить цепочку опроса логически, чтобы ПЛК типа в один момент времени мог опрашивать только один блок, после его опроса (или ошибки) переходил к следующему.
Такая же шняга там с блоками записи - как сделать запись по изменению любой переменной из состава послылки ? 2-3 регистра может быть или больше.
То есть как это на квадратиках вообще можно реализовать? там уже буду думать как перенести. Ибо таймеры там через флаги, как у Семена T0, T1 и т.д.
Sergey666
07.04.2025, 11:26
Out для разрешения работы следующего блока использовать нельзя.
В вышеприведенных ФБ чтения выход Out когда включается? Описание есть? Может есть флаги, не отображаемые на "УГО" ФБ?
Это выход Прочел/Не прочел. Статус чтения в общем. Все, что есть в справке. Типа EN блоков все в true, блоки последовательно. выход это статус чтения, если true - прочитал.
Все. Типа по справке так должно работать. хоть LD, хоть FBD. А есть желание заставить их опрашиваться по очереди с нужными мне задержками и паузами между, а не с теми, которые там где-то в недрах закопаны.
Sergey666
07.04.2025, 11:53
Ну, вот и ответ- если прочел хватай данные, чисть регистры, меняй адрес и айда след. запрос делать, куча ФБ чтения/записи не нужна, одного достаточно.
Китайцев можно ругать сколько угодно, но они на своих ПЛК станки, линии и все прочее делают, как-то же это работает.
Ну так и хотелось бы посмотреть как это могло бы выглядеть на "квадратиках" :) у меня в голове каша, даже не представляю как это могло бы выглядеть.
Типа вместо нескольких блоков поставить один, менять ему адресацию, тип регистров, и т.д. и потом как-то распихивать ?
з.ы. эти китайцы такие - у них CHL, CHR, ROR, ROL работают иначе, чем в других средах и языках программирования :)
Ну так и хотелось бы посмотреть как это могло бы выглядеть на "квадратиках" :) у меня в голове каша, даже не представляю как это могло бы выглядеть.
Типа вместо нескольких блоков поставить один, менять ему адресацию, тип регистров, и т.д. и потом как-то распихивать ?
з.ы. эти китайцы такие - у них CHL, CHR, ROR, ROL работают иначе, чем в других средах и языках программирования :)
Потыкал я как-то подобную (а может и эту) систему программирования и решил, что OL не так уж и плох )
Если вас насильно принуждают к использованию этой среды разработки - подайте знак! :D
1exan да я сам выбрал этот ПЛК :) пока на руках не было ПЛК вроде все норм, а когда живьем начал, так и обомлел :) ну со сдвигами регистров еще на этапе offline стало понятно, а некоторые другие вещи уже на реальном ПЛК повылазили. Виртуального там нет. Это EKF F100. Он же Haiwell.
например в нем нет Blink - лепи на таймерах, а таймеры на флагах. Типа надо 2-3 блинка - минус 4-6 таймеров. благо их там много.
Если есть вменяемая и понятная работа флагов никакие таймеры не нужны
Я пока не вижу понятности и ничего не могу сказать о вменяемости.
Почему опять чтение? А запись?
Там можно реализовать четкую 1-кратную операцию? (повтор)
Sergey666
07.04.2025, 13:08
1exan да я сам выбрал этот ПЛК :) пока на руках не было ПЛК вроде все норм, а когда живьем начал, так и обомлел :) ну со сдвигами регистров еще на этапе offline стало понятно, а некоторые другие вещи уже на реальном ПЛК повылазили. Виртуального там нет. Это EKF F100. Он же Haiwell.
например в нем нет Blink - лепи на таймерах, а таймеры на флагах. Типа надо 2-3 блинка - минус 4-6 таймеров. благо их там много.
А я думал по принуждению...Т.е я правильно понимаю:- вы добровольно, в трезвом уме с благородной CoDeSys перешли на какой-то ProLogic Master?
Ну шо, Сынку, помогли тебе твои ляхи?
Валенок запись там аналогично. тех поддержка прислала как типа делать однократную, но не пробовал, уехало все на объект.
нет там нормальной работы флагов. нет чтения - Out всегда false. Привязать к нему следующий не получится. Вся цепочка перестанет работать на первой же ошибке чтения.
Sergey666 ага, один F100 в щите на контроле АВ, второй на ротации кондиционеров. Чтобы было одно устройство а не сборная солянка. на CodeSys под такие простые задачи - ЖИРНО будет.
ну и опыт с F100 появился :) немного печальный.
две вещи (на самом деле чуть больше) удивило - смещение регистров работает вообще непонятно как? ни в CodeSys ни в C# так не работает.
То, что работает в отладке на ПК, не заработало так же в живом контроллере, сколько таких подлянок может оказаться, даже не знаю.
Sergey666
07.04.2025, 16:35
Опыт- плод ошибок трудных.
А техподдержка парадоксов друг...;););)
например в нем нет Blink - лепи на таймерах, а таймеры на флагах. Типа надо 2-3 блинка - минус 4-6 таймеров. благо их там много.
КагбЭ есть. Немного не такой, как в Codesys, а с кетайским прищуром, но заставить работать можно!
82948
Ну раз уже нету живой железки, то лично я не вижу смысла что-то мастрячить, ввиду отсутствия чёткого на 100% понимания работы En и Out. Только предположения.
А на фоне сказанного "запустил кучу ФБ и они делают последовательный обмен" вообще непонятно - эти ФБ - чистый код, или взаимосвязанные оболочки?
Не понимаю зачем заявлять что что-то не работает, если сами же не знаете как с этим работать.
Неизвестно даже что ихняя тп прислала.
Предпосылок сказать что указанная задача нерешаемая на квадратиках - пока нет.
SlavikP вы его в эмуляции запустите - охренеете... я им написал про этот FBD, он там тоже через З работает...
Валенок как работают En и Out я написал. Пример из справки для LD в том числе дает четкое понимание. Простите как оно работает в firmware самого ПЛК - да кто ж мне скажет и подскажет? Не, ну могу конечно выйти на тех поддержку Haiwell в режиме онлайн переводчика.
не важно, что все уехало и т.д. мне чисто гипотетически понять, как бы это выглядело на fbd в CodeSys например. Если вам не трудно накидать пример. Не в рамках прямо кода, рабочего на 100% а так, для затравки и понимания как бы это выглядело именно в fbd варианте ? да и скриншота бы хватило.
Учитывая, что пока блок не прочтет данные, на Out будет всегда false.
Вот просто два блока "чтения" поставить и как их надо обвязать, чтобы получилось последовательное выполнение ? и так по кругу.
Если проще. Хочу заставить блоки чтения выполняться последовательно логически. Но пока не понимаю как это добиться. То есть самому выставлять время timeout, время паузы между запросами. И чтобы в один момент времени только у одного блока был активен вход En. при этом Out не может быть флагом для чтения следующего блока, по причине того, что пока ответа нет, он будет в false.
хотя бы в примитиве, даже если мне потребуется наставить там кучу таймеров. Возможно в ближайшем будущем смогу попасть на объект и смогу протестить.
з.ы. проблемка в том, что когда En переводишь в false, то и Out станет сразу fasle.
kondor3000
08.04.2025, 09:56
Если проще. Хочу заставить блоки чтения выполняться последовательно логически. Но пока не понимаю как это добиться. То есть самому выставлять время timeout, время паузы между запросами. И чтобы в один момент времени только у одного блока был активен вход En. при этом Out не может быть флагом для чтения следующего блока, по причине того, что пока ответа нет, он будет в false.
хотя бы в примитиве, даже если мне потребуется наставить там кучу таймеров. Возможно в ближайшем будущем смогу попасть на объект и смогу протестить.
з.ы. проблемка в том, что когда En переводишь в false, то и Out станет сразу fasle.
Да блин, открой примеры для ПЛК63 или 110, вот скрин, 82957
Пока не выполнится 1 блок, 2 не работает и т. д.
kondor3000 а нужно что? если не выполнился блок 1 за Х времени, начать выполнять блок 2 и т.д. и выхода Exeption у меня нет, если там например будет Ошибка связи по timeout
kondor3000
08.04.2025, 10:16
kondor3000 а нужно что? если не выполнился блок 1 за Х времени, начать выполнять блок 2 и т.д.
Ну если нет у китайского блока выхода Complit, то как минимум таймер на 50-100 мс поставить надо и переключать переменную, для работы только 2 блока
и так по кругу.
Complite есть - это Out. Но он сработает только при успешном чтении. Вопрос как завязать это на En входы каждых блоков, чтобы они выполнялись последовательно логически программой, а не порядком выполнения блоков на fbd схеме?
Как их заставить так выполняться ?
kondor3000
08.04.2025, 10:34
Complite есть - это Out. Но он сработает только при успешном чтении. Вопрос как завязать это на En входы каждых блоков, чтобы они выполнялись последовательно логически программой, а не порядком выполнения блоков на fbd схеме?
Как их заставить так выполняться ?
На скрине у 2 блока на входе Enable стоит сравнение, пока 1 не выполнится, 2 не работает или по таймеру переход, шаг +1.
Так и надо сделать на всех блоках. Это аналогично шагам CASE на ST.
Вот для тупых скрин. Вместо блока чтения можно любой блок поставить от балды с En (Eno это типа будет Out) пример для двух блоков с цикличным переключением попыток чтения, контролем timeout и задержкой между.
Complite есть - это Out. Но он сработает только при успешном чтении. Вопрос как завязать это на En входы каждых блоков, чтобы они выполнялись последовательно логически программой, а не порядком выполнения блоков на fbd схеме?
Как их заставить так выполняться ?
Тот же вариант как и у kondor3000, но другими словами и для наглядности
Валенок Спасибо, посмотрю в понедельник.
kondor3000
12.04.2025, 11:15
Валенок Спасибо, посмотрю в понедельник.
Мой вариант даже проще и в понимании работы и в добавлении в любой проект. 83047
Одинаковые блоки на входе и выходе, только номера расставить и порядок выполнения.
Ну если нет... выхода Complit,
Мой вариант даже проще..
А хде?
...таймер на 50-100 мс поставить надо и .
только не поставить. Добавить.
))
ведь
.. если не выполнился блок 1 за Х времени, начать выполнять блок 2 и т.д. и выхода Exeption у меня нет, если там например будет Ошибка связи по timeout.....
Out это же именно нормальное завершение (OnOk у меня) "если повар нам не врёт"?
Я про "врёт" говорил - четких ответов нет.
--
Там у меня можно "залочить" out в любом FB (isOk на ходу индивидуально опустить)
Чтоб логика понятна была
kondor3000 говоря об Eno я говорил гипотетически - false там по жизни, если чтение не выполнено :)
Валенок еще раз спасибо. попробую прикрутить аналогичную комбинацию.
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot