Здравствуйте!
Есть своя САУ, выполненная на S7-1200.
Есть АСУТП верхнего уровня, который хочет получить информацию с САУ по Modbus.
Из уроков на youtube понял, что нужно MB_COMM_LOAD создать и добавить MB_SLAVE.
В данном случае САУ является Slave?
Никогда не сталкивался с передачей сигналов по Modbus (только OPC) и не могу понять, как составить таблицу адресов, где будет понятно, что такому-то тегу слова состояния (Word), созданному в САУ будет присвоен конкретный адрес в Modbus-пространстве.
Как это выглядит? Необходимо каждый сигнал через MOVE связывать с тегом для таблицы Modbus?
- Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не надо писать свой вопрос в первую попавшуюся тему - всегда лучше создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения. Непонятно? - Читать здесь.
- Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
- Перед тем как что-то написать - читать здесь, а затем здесь и здесь.
- Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.
Modbus. Помогите разобраться
Модератор: Глоб.модераторы
-
- здесь недавно
- Сообщения: 3
- Зарегистрирован: 29 июл 2021, 08:11
- Имя: Эльдар
-
- освоился
- Сообщения: 271
- Зарегистрирован: 25 ноя 2018, 17:55
- Имя: Роман
- Благодарил (а): 4 раза
- Поблагодарили: 42 раза
Modbus. Помогите разобраться
Да.
Ну, в общем да.
Следует понимать, что Модбас в Сименсе организован через задницу, т.к. он ему "не родной".
Я так понимаю, речь идет об RTU?
Случается нередко нам
И труд и мудрость видеть там,
Где стоит только догадаться
За дело просто взяться.
И труд и мудрость видеть там,
Где стоит только догадаться
За дело просто взяться.
-
- здесь недавно
- Сообщения: 3
- Зарегистрирован: 29 июл 2021, 08:11
- Имя: Эльдар
Modbus. Помогите разобраться
Да, RTU
капец, конечно) Думал, можно создать таблицу и укзать тегу в PLС адрес тега в Modbus, а здесь ппц заморочки, оказывается
капец, конечно) Думал, можно создать таблицу и укзать тегу в PLС адрес тега в Modbus, а здесь ппц заморочки, оказывается
-
- освоился
- Сообщения: 271
- Зарегистрирован: 25 ноя 2018, 17:55
- Имя: Роман
- Благодарил (а): 4 раза
- Поблагодарили: 42 раза
Modbus. Помогите разобраться
Ну если все ,что вы хотите передавать у вас в одном ДБ лежит, так и ставьте в MB_SLAVE указатель на этот ДБ.
Случается нередко нам
И труд и мудрость видеть там,
Где стоит только догадаться
За дело просто взяться.
И труд и мудрость видеть там,
Где стоит только догадаться
За дело просто взяться.
-
- не первый раз у нас
- Сообщения: 318
- Зарегистрирован: 14 фев 2014, 11:55
- Имя: Николай
- Страна: Россия
- Благодарил (а): 16 раз
- Поблагодарили: 72 раза
Modbus. Помогите разобраться
вообще никаких заморочек нет. Создавай дата-блок и его расшаривай для modbus - считай, что это и есть твоя таблица регистров. Адрес значения из этого дата-блока, делённый на два, - это и есть адрес регистра, т.е. DB$.DBW100 - это регистр 50 (40051), например.
Всё элементарно.
С нумерацией битов может быть нюанс. Если будешь использовать на верхнем уровне WinCC Runtime и протокол Modicon Modbus, то для битов там нумерация будет обратная внутри каждого передаваемого байта (последовательность самих байтов внутри слова при этом совпадает), т.е. DB$.DBX0.0 - это 4x40001.8 , DB$.DBX0.1 - это 4x40001.7 , DB$.DBX0.2 - это 4x40001.6 , ... DB$.DBX0.7 - это 4x40001.1 , DB$.DBX1.0 - это 4x40001.16 , DB$.DBX1.1 - это 4x40001.15 , ... DB$.DBX1.7 - это 4x40001.9
А еще WinCC переставляет местами слова, если захочешь передавать 32-битные числа с плавающей точкой. Т.е., например, число 1.9, которое в hex-формате представляет собой 16#3FF3_3333, будет считано WinCC RT (или сименовской панелью оператора) как 16#3333_3FF3. Т.е. надо местами их менять прежде, чем на верхний уровень отправлять. Если OPC-сервер принимает значения, то проблем с такими числами нет, сервер там сам переставляет старшее и младшее слово как захочешь.
Ну, вот как-то так.
-
- частый гость
- Сообщения: 404
- Зарегистрирован: 25 фев 2016, 12:18
- Имя: Жидков Игорь Алексеевич
- Страна: РФ
- город/регион: Королев/Фрязино
- Благодарил (а): 4 раза
- Поблагодарили: 12 раз
Modbus. Помогите разобраться
А что собственно означает "расшаривать" DB по модбасу? Для beckhoff TC3 slaveRtu в ПЛК вся область с %MW0 доступнапо адресу начиная с 129** (примерно) и никакие блоки отдельно не настраиваются.
Из реализаций вероятно в коммуникационном процессоре есть фича "проброса" MW в адреса. (т.е. когда сервер/ведомый работает "из-коробки") и принудительный, когда обмен осуществялется через библиотечные функции, но в данном случае нужно лишь подсунуть область памяти, которую процессор отразит на память взаимодействия по модбасу.
(Я ведущего рту на 1500 делал однажды, но там очевидно только библиотечной функцией опрос делается.)
Из реализаций вероятно в коммуникационном процессоре есть фича "проброса" MW в адреса. (т.е. когда сервер/ведомый работает "из-коробки") и принудительный, когда обмен осуществялется через библиотечные функции, но в данном случае нужно лишь подсунуть область памяти, которую процессор отразит на память взаимодействия по модбасу.
(Я ведущего рту на 1500 делал однажды, но там очевидно только библиотечной функцией опрос делается.)
Компилятор - лучший друг человека!
-
- не первый раз у нас
- Сообщения: 318
- Зарегистрирован: 14 фев 2014, 11:55
- Имя: Николай
- Страна: Россия
- Благодарил (а): 16 раз
- Поблагодарили: 72 раза
Modbus. Помогите разобраться
Ну, то и значит, что создаешь data block, из которого будет забирать значения мастер сети, в этот data block копируешь все те данные, которые надо. Ну, соответственно, если данные наоборот для изменения на верхнем уровне - тогда из этого data block'a их обновляешь. Например, если твои данные в области памяти меркеров (MW...) хранятся, значит, оттуда копируешь и/или туда обновляешь. Или, если, может быть, все данные и так вместе в одном data block'e находятся - тогда и заморачиваться вообще не надо, а использовать этот DB. А дальше суёшь этот data block в качестве параметра при вызове экземплярного DB от функционального блока MB_SLAVE (т.е. при вызове ставишь MB_HOLD_REG := и свой DB туда). Вот и всё.
Отправлено спустя 9 минут 32 секунды:
EldarM, тут в приложении посмотри файл, это я накидал FB, чтоб удобнее работать было с modbus slave. Вот берешь такое FB, создаешь его экземплярный DB, скажем, с именем RS485_Slave_SHARE, и просто передаешь туда в качестве input параметра variant при вызове (вызывать в каждом цикле) свой data block типа того:
"RS485_Slave_SHARE"("SHARE_DB");
, где SHARE_DB - это твой дата блок для расшаривания, он должен быть неоптимизированным в атрибутах
В OB100 (первый цикл) пишешь:
"RS485_Slave_SHARE".is_reinit := true;
"RS485_Slave_SHARE".is_enabled := true;
... больше как бы ничего и делать не надо, только параметры сети: скорость, адрес задать и всё.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- здесь недавно
- Сообщения: 3
- Зарегистрирован: 29 июл 2021, 08:11
- Имя: Эльдар