1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

Modbus. Помогите разобраться

ПЛК SIMATIC (S7-200, S7-1200, S7-300, S7-400, S7-1500, ET200)
Ответить

Автор темы
EldarM
здесь недавно
здесь недавно
Сообщения: 3
Зарегистрирован: 29 июл 2021, 08:11
Имя: Эльдар

Modbus. Помогите разобраться

Сообщение EldarM »

Здравствуйте!
Есть своя САУ, выполненная на S7-1200.
Есть АСУТП верхнего уровня, который хочет получить информацию с САУ по Modbus.
Из уроков на youtube понял, что нужно MB_COMM_LOAD создать и добавить MB_SLAVE.
В данном случае САУ является Slave?
Никогда не сталкивался с передачей сигналов по Modbus (только OPC) и не могу понять, как составить таблицу адресов, где будет понятно, что такому-то тегу слова состояния (Word), созданному в САУ будет присвоен конкретный адрес в Modbus-пространстве.
Как это выглядит? Необходимо каждый сигнал через MOVE связывать с тегом для таблицы Modbus?

Roman_33
освоился
освоился
Сообщения: 266
Зарегистрирован: 25 ноя 2018, 17:55
Имя: Роман
Благодарил (а): 4 раза
Поблагодарили: 41 раз

Modbus. Помогите разобраться

Сообщение Roman_33 »

EldarM писал(а): 29 июл 2021, 14:59 В данном случае САУ является Slave?
Да.
EldarM писал(а): 29 июл 2021, 14:59 Необходимо каждый сигнал через MOVE связывать с тегом для таблицы Modbus?
Ну, в общем да.
Следует понимать, что Модбас в Сименсе организован через задницу, т.к. он ему "не родной".
Я так понимаю, речь идет об RTU?
Случается нередко нам
И труд и мудрость видеть там,
Где стоит только догадаться
За дело просто взяться.

Автор темы
EldarM
здесь недавно
здесь недавно
Сообщения: 3
Зарегистрирован: 29 июл 2021, 08:11
Имя: Эльдар

Modbus. Помогите разобраться

Сообщение EldarM »

Да, RTU
капец, конечно) Думал, можно создать таблицу и укзать тегу в PLС адрес тега в Modbus, а здесь ппц заморочки, оказывается

Roman_33
освоился
освоился
Сообщения: 266
Зарегистрирован: 25 ноя 2018, 17:55
Имя: Роман
Благодарил (а): 4 раза
Поблагодарили: 41 раз

Modbus. Помогите разобраться

Сообщение Roman_33 »

Ну если все ,что вы хотите передавать у вас в одном ДБ лежит, так и ставьте в MB_SLAVE указатель на этот ДБ.
Случается нередко нам
И труд и мудрость видеть там,
Где стоит только догадаться
За дело просто взяться.
Аватара пользователя

Nicolayy
освоился
освоился
Сообщения: 281
Зарегистрирован: 14 фев 2014, 11:55
Имя: Николай
Страна: Россия
Благодарил (а): 9 раз
Поблагодарили: 64 раза

Modbus. Помогите разобраться

Сообщение Nicolayy »

EldarM писал(а): 30 июл 2021, 07:20 Думал, можно создать таблицу и укзать тегу в PLС адрес тега в 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-сервер принимает значения, то проблем с такими числами нет, сервер там сам переставляет старшее и младшее слово как захочешь.
Ну, вот как-то так.
Аватара пользователя

izhidkov
частый гость
частый гость
Сообщения: 404
Зарегистрирован: 25 фев 2016, 12:18
Имя: Жидков Игорь Алексеевич
Страна: РФ
город/регион: Королев/Фрязино
Благодарил (а): 4 раза
Поблагодарили: 12 раз

Modbus. Помогите разобраться

Сообщение izhidkov »

А что собственно означает "расшаривать" DB по модбасу? Для beckhoff TC3 slaveRtu в ПЛК вся область с %MW0 доступнапо адресу начиная с 129** (примерно) и никакие блоки отдельно не настраиваются.

Из реализаций вероятно в коммуникационном процессоре есть фича "проброса" MW в адреса. (т.е. когда сервер/ведомый работает "из-коробки") и принудительный, когда обмен осуществялется через библиотечные функции, но в данном случае нужно лишь подсунуть область памяти, которую процессор отразит на память взаимодействия по модбасу.

(Я ведущего рту на 1500 делал однажды, но там очевидно только библиотечной функцией опрос делается.)
Компилятор - лучший друг человека!
Аватара пользователя

Nicolayy
освоился
освоился
Сообщения: 281
Зарегистрирован: 14 фев 2014, 11:55
Имя: Николай
Страна: Россия
Благодарил (а): 9 раз
Поблагодарили: 64 раза

Modbus. Помогите разобраться

Сообщение Nicolayy »

izhidkov писал(а): 30 июл 2021, 21:10 А что собственно означает "расшаривать" DB по модбасу?
Ну, то и значит, что создаешь 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;
... больше как бы ничего и делать не надо, только параметры сети: скорость, адрес задать и всё.
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Автор темы
EldarM
здесь недавно
здесь недавно
Сообщения: 3
Зарегистрирован: 29 июл 2021, 08:11
Имя: Эльдар

Modbus. Помогите разобраться

Сообщение EldarM »

Спасибо большое за советы! Скоро начну пробовать
Ответить

Вернуться в «Simatic TIA Portal»