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

pk87

здесь недавно
здесь недавно
Сообщения: 10
Зарегистрирован: 09 сен 2019, 15:50
Имя: Катя
Страна: Россия
город/регион: Москва

MB_CLIENT ошибка 80C8

Сообщение

pk87 »

Доброго времени суток. Использую блок MB_CLIENT для подключения ОВЕН ПЛК110-60 в качестве ведомого устройства к контроллеру S7 1200. Соединение успешно, передача данных работает исправно. При отключении связи с контролллером Овен блок MB_CLIENT возвращает ошибку 80C8. При включении конроллера ОВЕН соединение не восстанавливается, ошибка 80C8 остается. Сбрасывается ошибка на данный момент только при перезагрузке контроллера S7 1200 по питанию. Изменяла следующие параметры: Rcv_Timeout на 55с, но при отключении слейва на пару секунд, блок все равно уходит в ошибку; Retries на 1000 – также безрезультатно. Есть ли возможность программно восстанавливать работу блока при этой ошибке при восстановлении соединения? Кто-нибудь сталкивался с подобной проблемой?

Михайло

почётный участник форума
почётный участник форума
Сообщения: 3506
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 4 раза
Поблагодарили: 230 раз

MB_CLIENT ошибка 80C8

Сообщение

Михайло »

По TCP-протоколу перед передачей данных осуществляется соединение (рукопожатие клиента с сервером), после которого они переходят в состояние ESTABLISHED. Когда выключаете ОВЕН, то он выходит из этого состояния, а S7-1200 “не знает” об этом. S7-1200 следовало бы в случае ошибки 80C8 переустановить соединение. Для этого есть вход DISCONNECT у MB_CLIENT. Установите DISCONNECT в 1, затем после изменения статуса сбросьте снова в 0 и после этого можно REQ=1.

pk87

здесь недавно
здесь недавно
Сообщения: 10
Зарегистрирован: 09 сен 2019, 15:50
Имя: Катя
Страна: Россия
город/регион: Москва

MB_CLIENT ошибка 80C8

Сообщение

pk87 »

спасибо, попробую

Отправлено спустя 2 часа 16 минут 13 секунд:

Михайло писал(а): ↑09 сен 2019, 17:23
По TCP-протоколу перед передачей данных осуществляется соединение (рукопожатие клиента с сервером), после которого они переходят в состояние ESTABLISHED. Когда выключаете ОВЕН, то он выходит из этого состояния, а S7-1200 “не знает” об этом. S7-1200 следовало бы в случае ошибки 80C8 переустановить соединение. Для этого есть вход DISCONNECT у MB_CLIENT. Установите DISCONNECT в 1, затем после изменения статуса сбросьте снова в 0 и после этого можно REQ=1.

К сожалению, это не изменило ситуацию: статус меняется на 7000, но после сброса DISCONNECT в 0 и запуска REQ сразу же возвращается статус 80C8, попытки соединения нет.

Михайло

почётный участник форума
почётный участник форума
Сообщения: 3506
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 4 раза
Поблагодарили: 230 раз

MB_CLIENT ошибка 80C8

Сообщение

Михайло »

Надо дисконнектом добиться статуса #0003, сбрасывайте при этом обязательно REQ. Затем поднимаете DISCONNECT и REQ – должен мигнуть статус #0001, если нет, то повторить процедуру.

pk87

здесь недавно
здесь недавно
Сообщения: 10
Зарегистрирован: 09 сен 2019, 15:50
Имя: Катя
Страна: Россия
город/регион: Москва

MB_CLIENT ошибка 80C8

Сообщение

pk87 »

Михайло писал(а): ↑11 сен 2019, 05:24
Надо дисконнектом добиться статуса #0003, сбрасывайте при этом обязательно REQ. Затем поднимаете DISCONNECT и REQ – должен мигнуть статус #0001, если нет, то повторить процедуру.

Именно это я и делаю, пробовала выдерживать задержки, но статус переключается только между 80C8 и 7000.

Михайло

почётный участник форума
почётный участник форума
Сообщения: 3506
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 4 раза
Поблагодарили: 230 раз

MB_CLIENT ошибка 80C8

Сообщение

Михайло »

Сколько соединений по TCP вообще создается в S7-1200? Кажется, Вы пытаетесь создать уже созданное соединение (неуникальный ID).

80C8 is also an error message of TCON. It means that the connection ID is already in use.

Отправлено спустя 9 минут 11 секунд:
Посмотрите все созданные TCP-соединения в онлайн где-то в online diagnostic – они там в реальном времени отображаются. Может чего интересного обнаружите.

pk87

здесь недавно
здесь недавно
Сообщения: 10
Зарегистрирован: 09 сен 2019, 15:50
Имя: Катя
Страна: Россия
город/регион: Москва

MB_CLIENT ошибка 80C8

Сообщение

pk87 »

Михайло писал(а): ↑11 сен 2019, 17:22
Сколько соединений по TCP вообще создается в S7-1200? Кажется, Вы пытаетесь создать уже созданное соединение (неуникальный ID).

в проекте один клент и один сервер. после удаления сервера заработало исправно. теперь надо подругому настроить сервер?

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


Перейти

  • Работа форума
  • Бренды
  • ↳   Eplan Electric P8
  • ↳   Общий F.A.Q.
  • ↳   Общие вопросы
  • ↳   Новости
  • ↳   Ошибки
  • ↳   Проект
  • ↳   Изделия
  • ↳   Устройства
  • ↳   Соединения
  • ↳   Кабели
  • ↳   Клеммы
  • ↳   ПЛК
  • ↳   Компоновка 2D
  • ↳   Макросы
  • ↳   Eplan API
  • ↳   Сценарии (Только готовые решения)
  • ↳   Внешняя обработка
  • ↳   ProPanel
  • ↳   Инструкции ProPanel (Только готовые решения)
  • ↳   Прочие направления Eplan
  • ↳   FieldSys (Топология)
  • ↳   Preplanning
  • ↳   Harness proD
  • ↳   EEC One
  • ↳   Allen Bradley
  • ↳   Общие вопросы
  • ↳   ПЛК
  • ↳   Операторские панели
  • ↳   B&R Automation
  • ↳   F.A.Q.
  • ↳   Danfoss
  • ↳   Emerson
  • ↳   Общие вопросы
  • ↳   КИП и регуляторы
  • ↳   DeltaV
  • ↳   ОВЕН
  • ↳   Прософт-Системы
  • ↳   Общие вопросы
  • ↳   ПЛК REGUL
  • ↳   Schneider Electric
  • ↳   Общие вопросы
  • ↳   ПЛК
  • ↳   Панели оператора
  • ↳   SCADA
  • ↳   Электротехника
  • ↳   Приводная техника
  • ↳   SIEMENS
  • ↳   Общие вопросы
  • ↳   LOGO!
  • ↳   ПЛК SIMATIC (S7-200, S7-1200, S7-300, S7-400, S7-1500, ET200)
  • ↳   Simatic Step7
  • ↳   Simatic TIA Portal
  • ↳   Simatic PCS 7
  • ↳   Операторские панели
  • ↳   WinCC
  • ↳   Приводная техника (Sinamics, Micromaster, Masterdrive, Simoreg, Simotics)
  • ↳   WEINTEK (операторские панели)
  • ↳   F.A.Q., Инструкции
  • ↳   Архив
  • ↳   Микроконтроллеры и электроника
  • ↳   Arduino
  • ↳   Raspberry
  • ↳   Другие микроконтроллеры
  • ↳   Электроника
  • Разделы
  • ↳   Общие вопросы
  • ↳   Вопросы от студентов
  • ↳   Литература
  • ↳   Новости и отчётность
  • ↳   Нормативы, ГОСТы, стандарты
  • ↳   Информационная безопасность
  • ↳   Проектирование и САПР
  • ↳   Системная интеграция
  • ↳   Разбор полетов
  • ↳   Работа
  • ↳   Заготовки для базы знаний
  • ↳   Производство и технология
  • ↳   MES – Системы автоматизации управления производством
  • ↳   Метрология, КИП и датчики
  • ↳   Исполнительные устройства, регуляторы
  • ↳   Средний уровень автоматизации (управляющий)
  • ↳   Алгоритмы
  • ↳   Операторские панели
  • ↳   Advantech
  • ↳   F.A.Q., Инструкции
  • ↳   Flexem
  • ↳   Mitsubishi
  • ↳   Верхний уровень автоматизации (отображение)
  • ↳   GE iFix
  • ↳   Wonderware Intouch
  • ↳   MasterScada
  • ↳   SCADA+
  • ↳   Альфа платформа
  • ↳   Интерфейсы, протоколы, связь
  • ↳   Радиосвязь
  • ↳   Полезное ПО
  • ↳   Электротехника, энергетика и электропривод
  • ↳   Генераторы, электростанции и силовые агрегаты
  • ↳   Теплотехника
  • ↳   DEIF A/S
  • ↳   Общие вопросы
  • ↳   UNI-LINE
  • ↳   MULTI-LINE
  • ↳   MULTI-LINE 300
  • ↳   SmartGen
  • ↳   Общие вопросы
  • ↳   Промышленные (береговые) контроллеры
  • ↳   Морские контроллеры и устройства
  • ↳   Подбор аналогов
  • F.A.Q.
  • ↳   Документация (вариант 1)
  • ↳   Документация (вариант 2)
  • ↳   Электротехника и электроэнергетика
  • ↳   F.A.Q. по программируемым логическим контроллерам (PLC)
  • ↳   Обсуждение F.A.Q. по PLC
  • ↳   F.A.Q. по выбору PLC
  • ↳   F.A.Q. по аппаратной части PLC
  • ↳   F.A.Q. по языкам программирования
  • ↳   F.A.Q. по структуре программ
  • ↳   F.A.Q. по взаимодействию PLC с HMI
  • О жизни
  • ↳   Для дома, для семьи
  • ↳   Комната смеха
  • ↳   Электродвижение

Время на прочтение
9 мин

Количество просмотров 12K

Продолжаем тему программирования протокола Modbus TCP на контроллерах Simatic S7-1500. В прошлый раз речь шла о серверной части, сегодня опишем клиентскую. Клиент Modbus TCP — это узел, который генерирует запросы к серверу, т.е. запрашивает данные и передает уставки/команды. В терминологии Modbus RTU это «мастер», ведущее устройство. В отличии от RTU, в протоколе TCP может быть несколько «мастеров» (правильно — клиентов).

Программировать клиентскую сторону сложнее. Если для сервера достаточно одного вызова функционального блока и одного блока данных, то с клиентом не все так просто. Во-первых, клиент может обмениваться данными с несколькими серверами, что на практике и происходит. Во-вторых, к одному серверу может быть (и бывает) больше одного запроса — прочитать входные регистры, прочитать регистры хранения, записать команды в выходные «койлы», и все это с одним «абонентским устройством». В-третьих, не забываем про «остроконечный» и «тупоконечный» порядок байт в словах разных аппаратных платформ, при несовпадении байты необходимо переворачивать самостоятельно.

По этой причине имеет смысл программировать клиента на языке SCL (ST в терминологии МЭК 61131-3) и «завернуть» всю обработку в функциональный блок. Для большей реалистичности в данном примере контроллер будет общаться с двумя серверами Modbus TCP с несколькими запросами к каждому.

В первую очередь создадим функциональный блок ModbusClient на языке SCL и добавим вызов его экземпляра в OB1.

Далее в области STAT переменных функционального блока необходимо прописать две структуры TCON_IP_v4. Зачем две? Затем, что у нас два соединения с двумя разными серверами. Фактически у нас два разных соединения (connection) и каждое необходимо описать. Как я говорил ранее, возможно применить и конфигурируемые соединения, но в данном примере они не используются.

Объявлено две структуры для связи с двумя серверами

Далее необходимо заполнить обе структуры. Это возможно сделать как программным кодом, так и просто занести необходимые значения данных. Пойдем по второму пути.

Первое поле, InterfaceId. Идентификатор интерфейса (или «сетевой карты») нашего контроллера. Клиент Modbus работает на интерфейсе №1 контроллера, смотрим его ID в конфигурации устройства.

Его ID равен 64. Обращаю внимание, что нужен идентификатор именно интерфейса, а не его портов.

Следующее поле структуры, ID. Это идентификатор соединения. Не путать с идентификатором интерфейса. Не путать с «номером» модбас-устройства. Это некий «внутренний логический номер» коннекшена, который программист назначает самостоятельно в диапазоне от 1 до 4096. У каждого «коннекшена» должен быть свой уникальный идентификатор. Ответственность за корректное присвоение целиком на ваших плечах. Назначаем ID = 1 и едем дальше.

Далее идет тип соединения, ConnectionType — TCP или UDP. По умолчанию значение этого поля 0x0B в hex или 11 в dec. Оставляем по умолчанию, TCP.

Флаг ActiveEstablished. Выставляем его в «истину». В случае клиента именно наша сторона должна инициировать соединение.

RemoteAddress. Тут пишем IP-адрес нашего первого сервера. Пусть будет 192.168.43.100.

RemotePort. Номер порта, по которому сервер Modbus TCP будет отвечать на наши запросы. По умолчанию все сервера этого протокола должны «слушать» порт 502.

LocalPort. Оставляем равным нулю.

В итоге, описание соединения с первым сервером выглядит следующим образом.

Описание соединения с первым сервером

Вторая структура заполняется аналогично. Разумеется, пишем другой ID и другой IP адрес. В итоге получаем.

Сделаем первые робкие шаги и попробуем прочитать один регистр хранения с одного сервера. Для начала надо перетащить ФБ MB_CLIENT из библиотеки в программу.

После перетаскивания появится диалогое окно о создании экземпляра. Выбираем мульти-экземпляр и немного корректируем имя.

Выбираем мультиэкзепляр

Промежуточный итог

Приведем вызов в «человеческий вид»

Кратко пройдемся по параметрам этого вызова. Подробное описание — в нашей горяч0 любимой документации, которую мало кто, почему-то, читает.

REQ активирует выполнение опроса. Пока REQ = TRUE, клиент проводит чтение данных с сервера или запись данных на сервер.

DISCONNECT — разорвать соединение

MB_MODE — «режим» работы клиента. В совокупности со входом MB_DATA_ADDR оказывает влияние на используемую функций Modbus TCP. Возможные значения описаны в документации. Для чтения одного или нескольких регистров хранения значение MODE должно быть равно 0.

MB_DATA_ADDR указывает адрес в адресном пространстве протокола Modbus TCP. Значение нашего примера 40001 — «первый регистр хранения»

MB_DATA_LEN — количество читаемых или записываемых величин. В нашем случае — единица. В итоге все три указанных выше параметра означают «читать один регистр хранения начиная с адреса 40001»

MB_DATA_PTR — переменная или структура данных, куда мы записываем прочитанное значение. Переменная может быть в любом блоке данных, я объявил локальную статическую переменную SingleHR типа INT, размер которой равен 2 байтам и совпадает с размером одного регистра хранения Modbus. При несовпадении размерности читаемой области данных с локальным «хранилищем» вызов функционального блока завершится ошибкой.

CONNECT — уже созданная нами структура типа TCON_IP_V4

Остается только запустить на ноутбуке сервер Modbus, скомпилировать и загрузить программу контроллера, и… не получить ничего. Сервер не отвечает. Ответов нет. Вообще ничего нет. Ничего. По буквам — Николай, Илья, Харитон… ( «Остапа понесло» ). Для того, чтобы уточнить ошибку, необходимо доработать программу следующим образом.

Дело в том, что флаги успешного (DONE) или неуспешного (ERROR) вызова блока «живут» всего один цикл сканирования программы. Естественно, невозможно заметить настолько быстрое изменение. Поэтому по флагу ошибки я копирую статус вызова в отдельную переменную. А по флагу успешного выполнения — обнуляю статус.

Кроме того, добавлены флаги «управления» запросом и соединением.

Немного прокоментирую ошибку, которая возникла у меня. В моем случае код ошибки был 80C6. В описании на блок MB_CLIENT этой ошибки нет, поэтому я вбил код ошибки в поиск справочной системы и нашел ссылку на функцию TCON (так же при неоднозначных ошибках можно искать и среди TSEND, TRECEIVE и прочих похожих блоках). Описание: The connection partner cannot be reached (network error). Ошибки сети. Ответ был очень прост и заключался в том, что программа-иммитатор Modbus не была прописана в разрешениях встроенного в Windows Firewall. Точнее, разрешение на ее работу было настроено только на частные сети, а интерфейс программатора был назначен в качестве публичной сети. Это лишний раз подчеркивает, что техника виновата в последнюю очередь, а чаще всего ошибку надо искать в радиусе закругления рук и в соответствии этого радиуса ГОСТам. После изменения настроек брэндмауэра ОС обмен заработал.

Усложним теперь задачу самую малость, и попробуем считать с сервера одну вещественную переменную. Одна вещественная переменная (REAL) — это 4 байта. Или 2 регистра. Итого, в вызове я увеличил количество читаемых регистров до 2, и изменил «указатель» на прочитанные данные. Этот указатель все еще весьма прост — это внутренняя статическая переменная типа REAL (дальше будет интереснее).

Хотелось бы обратить внимание на одну важную деталь. Если прогружать измененное прикладное ПО на горячую, с переинициализацией переменных нашего функционального блока ModbusClient в то время, когда контроллер ведет опрос сервера Modbus, то обмен может прекратиться, и на выходе блока будет стоять статус 80A3. Связано это, разумеется, со вмешательством во внутренние структуры обмена (из-за переинициализации всего блока). В моем случае это приводило к полной невозможности коммуникаций до рестарта контроллера переключателем старт/стоп. Я намеренно изменил сейчас функциональный блок (добавил еще одну переменную), чтобы продемонстрировать эту ошибку:

После стоп/старта контроллера и «поднятия» флага Srv1Req обмен успешно возобновляется. Чтобы не допустить такого «зависания» обмена (как ни крути, это частный случай) необходимо «поднимать» флаг Srv1Disconnect, проводить изменения в переменных функционального блока (имеются в виду именно переменные, т.е. интерфейсная часть блока, а не сам программный код), выполнять загрузку с переинициализацией, а потом вручную возобновлять обмен. Помните же, что флаги REQ и DISCONNECT у нас подключены к переменным, и этими переменными можно управлять, как вручную, так и посредством программного кода.

Пока мы не продвинулись дальше, хочется продемонстрировать описанный выше случай с «разноконечностью» (little-endian и big-endian) данных. В моем примере сервер modbus держит в двух регистрах хранения вещественную переменную со значением 0.666. Наш клиент Modbus вместо этого числа читает 1.663175E+38, что сильно отличается от нужного (увы, вне зависимости от того, покупаем мы или продаем). Связано это, конечно же, с порядком байт в словах и порядком самых слов в двойном слове. Пробуем разрешить ситуацию. Доработаем программный код следующим образом.

Инструкция SWAP меняет порядок байт (конкретно тут — в двойном слове). Но в данном случае она не помогает, на выходе (в переменной Data.Test) все еще находится неправильное значение. Скорее всего, это означает, что сервер отдает регистры в «неправильном» порядке, а байты в «правильном», то есть информация «перемешалась». Радует, что байта всего 4 и составить их в нужном порядке — дело техники.

Итак, снова модифицируем запрос. Складываем результат чтения двух регистров в массив из 4 байт и объявляем еще один массив из 4 байт, которым и будем манипулировать.

Функция Deserialize «складывает» массив из байт в какое-либо конкретное значение, в данном случае — в вещественную переменную. Потребовалась всего одна итерация, чтобы получить корректное значение переменной с сервера Modbus.

Перед тем, как вернуться к штатной рутинной работе, необходимо рассказать про одну очень частую ошибку, возникающую при обмене по протоколу Modbus TCP, а именно — указание или неуказание адреса (номера) подчиненного устройства (сервера). В протоколе Modbus RTU все «слейвы» имеют свой уникальный адрес в сети. Мастер, формируя запрос, указывает адрес слейва, однобайтовое поле в заголовке пакета. Unit ID, Device ID, адрес — неважно, как называется, смысл один. В протоколе Modbus TCP адресом «абонентского устройства» является его IP-адрес. Тем не менее, поле Device ID в заголовке сохранилось. И это часто вносит путаницу, непонимание и ошибки. Дело в том, что в соответствии со спецификациями «обычный» сервер Modbus TCP должен игнорировать поле ID в запросе к нему. Unit ID учитывается лишь для устройств, преобразующих Modbus RTU в Modbus TCP (гейты, шлюзы, конвертеры протоколов и так далее). На практике же многие сервера Modbus проверяют и однобайтовый адрес Unit ID. При несовпадении «своего» адреса и адреса в запросе, сервер в этом случае чаще всего не отправляют никакую ответную телеграмму, и клиент возвращает ошибку опроса. Если на практике вы столкнетесь с таким странным поведением, то откройте экземпляр функционалного блока клиента Modbus и поищите в его статических переменных байтовую величину MB_Unit_ID. Это и есть «адрес» подчиненного устройства, т.е. сервера Modbus. По умолчанию его значение равно 0xFF или 255. «Нормальные» сервера его игнорируют, достаточно уже самого факта установления соединения по протоколу TCP/IP. Если же попался «ненормальный», то поставьте тут вручную Unit ID вашего устройства. Связь должна установиться.

Кроме того, в статических переменных есть ряд полезных настроек, таких, как таймауты, количество повторных попыток запроса и т.д. Изучить эти переменные можно во встроенной справке.

Закончив описание подводных камней, вернемя к изначальной задаче. Будем считывать с первого сервера 3 вещественных переменных (6 регистров), начиная с 40001, и записывать одну (начальный адрес 40011). Предполагаем, что порядок слов и байт «правильный». Шесть регистров (шесть «слов» данных) и три вещественных переменных. Можно, конечно, просто «в лоб» читать информацию в локальный массив байт, а потом средствами дополнительной обработки представлять их в виде трех вещественных величин (тем же Deserialize, например), но не стоит создавать себе лишнюю работу. Гораздо удобнее будет сразу «разложить» читаемую информацию в собственную структуру. В блоке данных Data я создаю структуру, состоящую из трех полей типа REAL.

Обращаю внимание, что блок данных Data должен быть «стандартным» или «неоптимизированным», в противном случае вы будете получать ошибку опроса, к примеру — 818B.

Разумеется, содержание этой структуры полностью зависит от того, в каком порядке и в какой форме «отдаются» данные от сервера.

Программа обретает следующий вид, и данные успешно читаются.

0.5, 0.7, 0.33 (с) ВИА «Несчастный случай»

Теперь необходимо добавить еще один запрос — на запись одной вещественной уставки (двух регистров). Необходимо понимать, что для обмена с одним сервером по одному соединению у нас выделен один экземпляр функционального программного блока коммуникаций. И если выполнять второй запрос, не дожидаясь результатов первого — не будет работать ни один. Необходимо работать последовательно — вначале выполнить один запрос, а после его завершения формировать следующий. Для этого достаточно добавить в наш программный блок переменную «номер шага» (или «номер запроса», если вам так удобнее).

В итоге получаем вот такую программу.

Переменная, на основании который выбирается опрос, называется у меня Server1Query (будет еще Server2Query). Выбор запроса выполнется в операторе CASE. «Номер запроса» меняется на следующий лишь в случае успешного или неуспешего выполнения текущего опроса.

Для того, чтобы организовать опрос второго сервера, достаточно лишь подготовить хранилище для локальных переменных от сервера и к серверу и дописать существующую программу. Отличия в ней минимальные, тот же принцип, отличаются лишь все переменные (включая экземпляр функциональого блока MODBUS_CLIENT) и запрашивамые/записывемые данные.

Со вторым сервером у нас настроено отдельное соединение, есть отдельный экземпляр функционального блока modbus. Его мы можем вызывать «одновременно» с коммуникациями первого сервера, поэтому в общей программе есть два оператора CASE, которые работают независимо друг от друга.

В принципе, логичным будет добавить еще анализ ответа на конкретный запрос и формирование признака достоверности данных, и сделать некоторые другие доработки. Например — оправлять команды и уставки не принудительно, а лишь по изменению.

Тем не менее, описание работы с протоколом Modbus TCP на этом я заканчиваю. В следующий раз посмотрим на программирование протокола Modbus RTU.

0000 No error / Instruction executed without errors general 0001 Connection established general 0003 Connection terminated general 7000 #no job active AND no connection established (REQ=0, DISCONNECT=1) general 7001 Start of job processing / Connection establishment triggered general,
BUSY = 1, DONE = 0. 7002 Intermediate call. Connection is being established general,
BUSY has the value „1”. 7003 Connection is being terminated general 7004 Connection established AND monitored. No job processing active. general 7005 data is being sent. general 7006 data is being received. general 8x3A Invalid pointer at parameter x. 8070 All internal instance memories are in use. 8080 The identifier entered for the communications port is invalid. 8081 Timeout, module error, internal error. 8082 Parameter assignment failed because parameter assignment is currently being performed in the background. 8083 Buffer overflow: The CM or CB has returned a receipt message with a length that is greater than permitted by the length parameter. 8085 Error specifying the length at the LENGHT parameter. The specified length is „0” or greater than the maximum permitted value. 8085 The connection ID (ID parameter) is already in use by a configured connection. TCON 8085 – LEN parameter is greater than the largest allowable value (For S7‑1200: 8192; for S7‑1500 (TCP): 65536; with S7‑1500 (FDL): 240 / 236)
– Parameter DATA and LEN both have the value „0”.
– The value of the LEN or DATA parameter was changed after the first call. TSEND
TRCV 8086 The ID parameter is out of range (1 .. 0x0FFF). TCON
TSEND
TRCV 8087 Maximum number of connections reached, no further connection possible. TCON 8088 – LEN parameter is larger than the range specified in DATA.
– Receive area is too small. TSEND
TRCV 8089 The CONNECT parameter does not point to a connection description or the connection description was created manually. TCON 8090 Message length invalid, module invalid, message invalid. 8091 Incorrect version in parameterization message. 8092 Invalid record length in parameterization message. 8092 The source or target area is only available in the load memory. BLKMOV 809A The structure at the CONNECT parameter is not supported on an integrated interface or the length is invalid. TCON 809B The InterfaceId element within the TCON_xxx structure does not reference a hardware ID of a CPU or CM/CP interface or has the value „0”. TCON 80A1 The specified connection or port is already in use. TCON 80A1 Communication error:
– The specified connection has not yet been established.
– The specified connection is being terminated. Transmission via this connection is not possible.
– The interface is reinitialized. TSEND
TRCV 80A2 Local or remote port is used by the system. The following ports are reserved locally: 20, 21, 80, 102, 135, 161, 162, 443, 34962, 34963, 34964 and the range 49152 to 65535. TCON 80A3 ID is used by a connection created by the user program that also uses the same connection description at the CONNECT parameter. TCON 80A3 An attempt is being made to terminate a non-existent connection or the connection has already been terminated. TDISCON 80A4 IP address of the remote endpoint of the connection is invalid or it matches the IP address of the local partner. TCON 80A4 Temporary communication error: The interface is being reconfigured or the connection is being set up. TDISCON 80A7 Communication error: You executed „TDISCON” before „TCON” was completed. TCON 80B1 You changed the DATA parameter before the current job ended. TSEND 80B3 The parameterized protocol variant (parameter ConnectionType in the connection description) is UDP. Please use the „TUSEND” / „TURCV” instruction for a UDP connection. TSEND
TRCV 80B4 Only with TCON_IP_RFC: The local T-Selector was not specified or the first byte does not contain the value 0x0E (only with a length of T-Selector = 2) or the local T-Selector begins with „SIMATIC-”. TCON 80B5 With connection type 13 = UDP, only passive connection establishment is permitted (ActiveEstablished parameter of the TCON_IP_v4 / TCON_PARAM structure has the value TRUE). TCON 80B6 Parameterization error in the ConnectionType parameter of the data block for the connection description.
– Only valid for TCON_IP_v4: 0x11, 0x0B and 0x13.
– Only valid for TCON_IP_RFC: 0x0C and 0x12 TCON 80B7 For TCON_IP_v4:
– TCP (active connection establishment): Remote port is „0”.
– TCP (passive connection establishment): Local port is „0”.
– UDP: Local port is „0”.
– Partner endpoint IP address was set to 0.0.0.0.
For TCON_IP_RFC:
– Local (LocalTSelector) or remote (RemoteTSelector) T-selector specified with a length greater than 32 bytes.
– A length greater than 32 was entered for TSelLength of the T-selector (local or remote).
– Error in the length of the IP address of the respective connection partner.
– Partner endpoint IP address was set to 0.0.0.0. TCON 80B8 The ID parameter in the local connection description (structure at the CONNECT parameter) and the ID parameter of the statement are different. TCON 80BB Invalid value at ActiveEstablished parameter. 80C3 All connection resources are in use or ports may be in dynamic use by other applications or connections. TCON
TRCV 80C3 – A block with this ID is already being processed in another priority group.
– Internal lack of resources. TSEND 80C4 Temporary communication error:
– The connection cannot be established at the moment.
– The connection cannot be established because firewalls on the connection path are not enabled for the required ports.
– The interface is receiving new parameters.
– The configured connection is currently being removed by a „TDISCON” instruction. TCON
TSEND
TRCV 80C5 The connection partner refuses to establish the connection, cleared down the connection or actively ended it. TCON 80C5 – Connection terminated by the communication partner.
– LSAP of the remote connection partner not released TSEND
TRCV 80C6 The connection partner cannot be reached (network error). TCON
TSEND
TRCV 80C7 Execution timed out. TCON
TRCV 80C8 #no response OF the server in the defined period. 80C8 Value at the ID parameter is already being used by a connection that was created via the user program. The connection uses the same ID but different connection settings on the CONNECT parameter. TCON 80C9 Connection partner validation failed. The connection partner who wants to establish a connection does not correspond to the partner defined in the structure at the CONNECT parameter. TCON 80C9 The length of the receive area is smaller than the length of the sent data. TRCV 80CE The IP address of the local interface is 0.0.0.0 TCON 80D0 Related to TCP and the active connection endpoint: The remote_qdn parameter is an empty string. In this case no connection can be established. TCON 80D1 The remote_qdn parameter is not a fully qualified domain name. Possibly the dot is missing at the end. TCON 80D2 There is no DNS server address configured. TCON 80D3 The fully qualified domain name could not be resolved. Possible causes:
– The DNS server cannot be reached, e.g. B. because it is down or the remote port is unreachable.
– An error occurred while communicating with the DNS server.
– The DNS server returned a valid DNS response, but the response did not contain an IPv4 address. TCON 80E0 Inappropriate or bad message was received. TCON 80E1 Error during handshake. Possible causes:
– Canceled by user
– Security not high enough
– Renegotiation is not supported
– SSL/TLS version is not supported
– Hostname validation failed TCON 80E2 Unsupported / Invalid Certificate
– Possible cause: The time of the module concerned has not been set or the module is not synchronized. TCON 80E3 Certificate has been discarded. TCON 80E4 No valid certificate authority was found. TCON 80E5 Certificate expired. TCON 80E6 Integrity error in transport layer security protocol. TCON 80E7 Unsupported extension in X.509 V3 certificate. TCON 80E9 TLS server without server certificate is not supported. TCON 80EA DTLS (UDP) protocol is not supported. TCON 80EB A client cannot request a client certificate. TCON 80EC The server cannot validate against the subjectAlternateName (Only clients can do that.) TCON 80ED TLSServerCertRef_m ID not valid TCON 80EE Handshake not finished yet TSEND 8152 The WSTRING, WCHAR, BOOL, ARRAY of STRING, ARRAY of WSTRING and ARRAY of WCHAR data types are not supported at the SRCBLK parameter. BLKMOV 8187 the MB_HOLD_REG parameter has an Invalid Pointer. Data area is too small. 8352 The WSTRING, WCHAR, BOOL, ARRAY of STRING, ARRAY of WSTRING and ARRAY of WCHAR data types are not supported at the DSTBLK parameter. BLKMOV 8380 received Modbus frame has incorrect format OR too few bytes were received. 8381 Function code is NOT supported. 8382 the length OF the Modbus frame in the frame header does NOT match the number OF received bytes. 8383 #error reading OR writing data OR access outside the address area 8384 Invalid exception code received. 8385 Diagnostics code NOT supported. 8386 received function code does NOT match the one sent originally. 8387 the protocol ID OF the Modbus TCP frame received BY the server is NOT „0”. 8388 the Modbus server sent a different data length than was requested. 8389 Invalid data area definition 80B6 Invalid connection type, only TCP connections are supported. 80BB Invalid value at ActiveEstablished parameter 8188 the MB_MODE parameter has an Invalid value. 8189 Invalid addressing OF data at the MB_DATA_ADDR parameter. 818A Invalid data length at the MB_DATA_LEN parameter. 818B the MB_DATA_PTR parameter has an Invalid Pointer. 818C Timeout at parameter BLOCKED_PROC_TIMEOUT OR RCV_TIMEOUT 8200 A different Modbus request is currently being processed via the PORT.

Содержание этого раздела:

1. S7-1200Как мастер-станция Modbus RTU

Два, S7-1200В качестве ведомого устройства Modbus RTU

Три, S7-1200Как мастер-станция Modbus RTU

S7-1200 Как мастер-станция Modbus RTU

Модули S7-1200, поддерживающие режим связи Modbus RTU, могут использоваться как ведущие станции Modbus RTU. Ниже в качестве примеров используются модули CPU1215C DC / DC / DC и CM1241 RS485 для ознакомления с этапами настройки связи и программирования главной станции S7-1200 Modbus RTU.

Аппаратные и программные требования и выполненные коммуникационные задачи:

аппаратное обеспечение:
① CPU1215C DC / DC / DC (номер для заказа: 6ES7 215-1AG31-0XB0)
② CM1241 RS485 (номер для заказа: 6ES7 241-1CH30-0XB0)
③ Блок питания PS 307 (номер для заказа: 6ES7307-1KA02-0AA0)
④ ПК (с картой Ethernet)
⑤ Кабель TP Ethernet

программного обеспечения:
① STEP 7 Professional V11 SP2 UPD4+HSP
② ModSim (это программное обеспечение стороннего производителя, которое можно загрузить из Интернета)

Коммуникационные задачи выполнены:
Считайте данные в 5 словах адреса Modbus, начиная с 40001 в подчиненной станции Modbus RTU ModSim, в 5 слов адреса, начиная с DB1.DBW0 в главной станции Modbus RTU CPU1215C.

1. Настройте коммуникационный модуль Modbus RTU.

Найдите «Коммуникационный модуль» → «Точка-точка» → «CM1241 (RS485)» в каталоге оборудования, дважды щелкните или перетащите этот модуль в левую часть ЦП, как показано на рисунке 1 ниже:

Рисунок 1 Настройка коммуникационного модуля

Затем с помощью мыши выберите модуль CM1241 (RS485) в «Обзоре устройств» и настройте параметры аппаратного интерфейса этого модуля в «Свойства» → «Конфигурация порта». Как показано на Рисунке 2 ниже:

Следующее принимает скорость передачи = 9,6 Кбит / с, проверка четности = без проверки четности, бит данных = 8 символов, стоповый бит = 1, и другие сохраняют настройки по умолчанию в качестве примера.

Рисунок 2 Настройки порта RS485

Наконец, убедитесь, что идентификатор оборудования равен 271 в «идентификаторе оборудования», как показано на рисунке 3 ниже:

Рисунок 3 Идентификатор оборудования

2. Добавить OB запуска

В дереве проекта выберите «CPU1215C DC / DC / DC» → «Программный блок» → «Добавить новый блок», во всплывающем окне выберите «Организационный блок OB» → «Запуск», добавьте запускаемый OB 100, как показано на рисунке 4 ниже. Показать:

Рисунок 4 Добавление OB запуска

3. Вызвать инструкцию MB_COMM_LOAD.

Чтобы установить порт в режим связи Modbus RTU сразу после его запуска, в OB 100 можно вызвать команду «MB_COMM_LOAD». При вызове инструкции «MB_COMM_LOAD» интерфейс для создания соответствующего блока данных экземпляра появится автоматически, как показано на рисунке 5 ниже:

Рисунок 5 Вызов инструкции MB_COMM_LOAD

Нажмите «ОК», чтобы создать экземплярный блок данных для этой инструкции и назначить адреса каждому контакту ввода / вывода. Особое внимание следует обратить на входной вывод MB_DB, чтобы он указывал на блок данных экземпляра инструкции «MB_MASTER», как показано на рисунке 6 ниже:

Примечание:Бит ввода команды «MB_COMM_LOAD» «REQ» должен запускаться по нарастающему фронту. Поскольку OB 100 выполняется только один раз при запуске S7-1200, в этом примере «REQ» устанавливается в «TRUE».

Рисунок 6 Инструкция MB_COMM_LOAD

Значение параметров инструкции MB_COMM_LOAD показано в Таблице 1 ниже:

Штырь

Описание

EN

Давать возможность

REQ

Выполните инструкцию по нарастающему фронту

PORT

Аппаратный идентификатор коммуникационного порта

BAUD

Выбор скорости передачи: 3600, 6000, 12000, 2400, 4800, 9600, 19200, 38400, 57600, 76800, 115200 (Примечание: все остальные значения недействительны)

PARITY

Выбор проверки четности: 0-нет; 1-нечетная проверка; 2-четная проверка

FLOW_CTRL

Выбор управления потоком: 0- (значение по умолчанию) без управления потоком

RTS_ON_DLY

Выбор задержки RTS: 0- (значение по умолчанию)

RTS_OFF_DLY

Выбор задержки выключения RTS: 0- (значение по умолчанию)

RESP_TO

Тайм-аут ответа: значение по умолчанию = 1000 мс. MB_MASTER определяет время (в миллисекундах) для ответа ведомого устройства.

MB_DB

Блок данных экземпляра, используемый инструкцией MB_MASTER или MB_SLAVE.

DONE

Бит завершения: устанавливается в 1, когда инструкция выполняется без ошибок.

ERROR

Бит ошибки: 0 – ошибка не обнаружена; 1 – ошибка обнаружена. Код ошибки выводится в параметре СОСТОЯНИЕ.

STATUS

Код ошибки конфигурации порта

Таблица 1 Значение параметра инструкции MB_COMM_LOAD

4. Создайте буферы отправки и получения данных DATA_PTR.

Создайте блок БД через «Программный блок» → «Добавить новый блок», выберите «Блок данных (БД)», выберите «Стандартный, совместимый с S7-300 / 400» и нажмите кнопку «ОК». Создайте в БД массив из 5 слов, как показано на рисунке 7 ниже:

Примечание. Тип доступа к БД, используемый буферами отправки и приема данных DATA_PTR, должен быть стандартно совместим с S7-300 / 400.

Рисунок 7 Создание буфера отправки и получения данных DATA_PTR

5. Вызвать инструкцию MB_MASTER.

Вызовите инструкцию «MB_MASTER» в OB1, и интерфейс для создания соответствующего экземпляра блока данных автоматически появится при вызове этой инструкции, как показано на рисунке 8 ниже:

Рисунок 8 Вызов инструкции MB_MASTER

Нажмите «ОК», чтобы создать блок фоновых данных для этой инструкции, и назначьте адреса каждому контакту ввода / вывода, как показано на рисунке 9 ниже:

Примечание:Входной бит «REQ» инструкции «MB_MASTER» должен запускаться нарастающим фронтом.

Возьмите S7-1200 в качестве ведущей станции Modbus RTU, используйте код функции F03 для чтения ведомой станции 2 Modbus RTU, пять слов, начиная с адреса Modbus 40001, и полученные данные сохраняются в начальной области буфера DB3.DBW0 как пример. Настройки следующие: MB_ADDR = 2, MODE = 0, DATA_ADDR = 40001, DATA_LEN = 5.

Соответствие адресов показано в Таблице 2 ниже:

Мастер-станция Modbus RTU Адрес буфера данных CPU1215C Адрес Modbus ведомого устройства Modbus RTU
DB3.DBW0 40001
DB3.DBW2 40002
DB3.DBW4 40003
DB3.DBW6 40004
DB3.DBW8 40005

Таблица 2 Соответствие адреса Modbus

Рисунок 9 Инструкция MB_MASTER

Значение параметров инструкции MB_MASTER показано в Таблице 3 ниже:

Штырь Описание

EN

Давать возможность

REQ

Выполнение инструкции по нарастающему фронту, запрос на отправку или чтение данных на ведомое устройство Modbus.

MB_ADDR

Адрес ведомого устройства Modbus RTU. Диапазон адресов по умолчанию: от 0 до 247; расширенный диапазон адресов: от 0 до 65535. Значение 0 зарезервировано для рассылки сообщения всем ведомым устройствам Modbus.

MODE

Выбор режима: укажите тип запроса

DATA_ADDR

Начальный адрес на подчиненной станции: укажите начальный адрес данных, к которым будет осуществляться доступ на подчиненной станции Modbus.

DATA_LEN

Длина данных: укажите количество цифр или слов, к которым будет осуществляться доступ в этом запросе.

DATA_PTR

Указатель данных: укажите адрес M или DB данных для записи или чтения (тип доступа к базе данных должен быть стандартным, совместимым с S7-300 / 400).

DONE

Бит Done: после того, как последний запрос был завершен без ошибок, бит DONE останется ИСТИННЫМ в течение одного времени цикла сканирования.

BUSY

0-операция MB_MASTER не выполняется; 1-операция MB_MASTER выполняется

EEROR

Бит ошибки: после того, как предыдущий запрос был прерван из-за ошибки, бит ERROR останется ИСТИННЫМ для одного сканирования.
Время цикла рисования. Значение кода ошибки в параметре STATUS действительно только в течение одного периода сканирования, когда ERROR = TRUE.

STATUS

код ошибки

Таблица 3 Значение параметра инструкции MB_MASTER

О MODE, DATA_ADDR, DATA_LEN можно посмотреть в Таблице 4 ниже:

MB_MASTER функция Modbus
 

Параметры адреса Modbus

Тип адреса

Параметр длины данных Modbus

Функция Modbus

Режим 0

Читать

От 00001 до 09999

Выходной бит

1 к 2000

01

С 10001 по 19999

Входной бит

1 к 2000

02

С 30001 по 39999

Регистр ввода

От 1 до 125

04

С 40001 по 49999

С 400001 по 465535 (расширенный)

Регистр холдинга

От 1 до 125

03

Режим 1
Написать

От 00001 до 09999

Выходной бит

1 (один бит)

05

С 40001 по 49999

С 400001 по 465535 (расширенный)

Регистр холдинга

1 (одно слово)

06

От 00001 до 09999

Выходной бит

2 к 1968 г.

15

С 40001 по 49999

С 400001 по 465535 (расширенный)

Регистр холдинга

2 к 123

16

Режим 2
Некоторые ведомые устройства Modbus не поддерживают использование функции Modbus 05H или 06H для записи одного бита или слова. В этом случае функция Modbus может быть вынуждена использовать 15H или 16H для записи одного бита или слова в режиме 2.

Написать

От 00001 до 09999

Выходной бит

2 к 1968 г.

15

С 40001 по 49999

С 400001 по 465535 (расширенный)

Регистр холдинга

1 к 123

16

Узор 11

Считайте слово состояния связи и счетчик событий ведомого устройства: слово состояния указывает состояние выполнения инструкции (0: не выполняется; 0xFFFF: выполняется). Каждый раз, когда сообщение успешно доставлено, значение счетчика событий будет увеличиваться. При использовании этой функции игнорируйте параметры DATA_ADDR и DATA_LEN инструкции «MB_MASTER».

Режим 80

Проверьте состояние ведомого устройства, прочитав код ошибки (0x0000): 1 слово на запрос

Узор 81.

Сброс счетчика событий ведомого через диагностический код 0x000A: 1 слово на запрос

Таблица 4 Таблица функций MB_MASTER Modbus

6. Настройки программного обеспечения Modbus Slave

Примечание:Подчиненная станция Modbus RTU тестируется программным обеспечением ModSim, которое является сторонним программным обеспечением, которое можно загрузить из Интернета.

Установите соединение в открытом программном обеспечении ModSim и установите параметры режима RTU: скорость передачи данных Baud = 9600, бит данных Data = 8, стоповый бит Stop = 1, четность = NONE, как показано на рисунке 10 ниже:

Рисунок 10 Установка соединения ModSim

Выберите «Файл» → «Новый», чтобы открыть интерфейс связи ModSim, установите адрес ведомого устройства Modbus RTU Id устройства = 2, начальный адрес Address = 0001, длину данных = 5, код функции типа данных Modbus 03. Дважды щелкните область данных за каждым адресом Modbus, и появится диалоговое окно «Регистр записи», где вы можете записать значения данных, как показано на рисунке 11 ниже:

Примечание:Настройка Device Id должна соответствовать адресу, установленному входным выводом «MB_ADDR» в инструкции «MB_MASTER».

Рисунок 11 Настройка ModSim

7. Результаты тестирования Modbus RTU.

Откройте «Таблицу мониторинга» проекта CPU1215C DC / DC / DC в программном обеспечении STEP 7 Professional V11 UPD4 и активируйте входной бит M10.0 инструкции «MB_MASER». Ведущее устройство Modbus RTU считывает значение 11 в адресе 40001 подчиненного устройства ModSim, значение 12 в 40002, значение 13 в 40003, значение 14 в 40004 и значение 15 в 40005, соответственно, по адресам DB3.DBW0 и DB3. . DBW2, DB3.DBW4, DB3.DBW6, DB3.DBW8, как показано на рисунке 12 ниже:

Рисунок 12 Результаты тестирования Modbus RTU

Многоадресный или многосайтовый опрос в режиме связи S7-1200 Modbus RTU

Несколько коммуникационных модулей CM 1241 RS485 могут быть подключены друг к другу с помощью кабелей PROFIBUS. Одна ведущая станция и до 31 ведомой станции MODBUS могут быть подключены к сети с помощью кабелей PROFIBUS.

При опросе S7-1200 Modbus RTU необходимо запустить следующую команду «MB_MASTER» через выходной бит предыдущей команды «MB_MASTER» «Готово» = 1. Для получения конкретных инструкций и идей по программированию перейдите по следующей ссылке:

Как использовать STEP 7 (TIA Portal) V11 для установления связи Modbus RTU для SIMATIC S7-1200?

http://support.automation.siemens.com/CN/view/zh/47756141

Инструкции MB_COMM_LOAD и MB_MASTER Код ошибки STATUS

STATUS(W#16#) Описание
0000 Ошибок на порте нет
8180 Неверное значение идентификатора порта
8181 Неверное значение скорости передачи
8182 Недействительное значение четности
8183 Неверное значение управления потоком
8184 Неверное значение тайм-аута ответа
8185 Параметр MB_DB не является блоком данных экземпляра MB_MASTER или MB_SLAVE

Таблица 5 Код ошибки STATUS инструкции MB_COMM_LOAD

STATUS(W#16#)

Описание

0000

Нет ошибки

80C8

Время ожидания ведомого истекло. Проверьте скорость передачи, проверку четности и подключение ведомого устройства.

80D1

Получатель отправил запрос управления потоком для приостановки активной передачи и не активировал передачу в течение указанного времени ожидания.

Если приемник не обнаруживает CTS в течение времени ожидания, эта ошибка также будет сгенерирована во время аппаратного управления потоком.

80D2

Поскольку от DCE не поступил сигнал DSR, запрос на передачу был прекращен.

80E0

Буфер приема заполнен, и сообщение завершено.

80E1

Ошибка четности, сообщение прервано

80E2

Ошибка кадрирования, сообщение прервано

80E3

Ошибка тайм-аута, сообщение было прервано

80E4

Указанная длина превышает общий размер буфера, и сообщение прекращается.

8180

Неверное значение идентификатора порта

8186

Недействительный адрес станции Modbus

8188

Для широковещательных вызовов значение параметра MODE недопустимо.

8189

Значение адреса данных недействительно

818A

Неверное значение длины данных

818B

Неверный указатель на локальный источник / цель данных

818C

Указатель на DATA_PTR недействителен: используйте указатель на битовую область хранения или блок данных, тип доступа которого “стандартно совместим с S7-300 / 400”.

8200

Порт занят обработкой запроса на передачу

Таблица 6 Код ошибки STATUS инструкции MB_MASTER (сообщение об ошибке связи и конфигурации инструкции)

STATUS(W#16#) Код ответа от ведомого

Описание

8380

CRC ошибка

8381 01

Этот код функции не поддерживается

8382 03

Ошибка длины данных

8383 02

Адрес данных неверен или адрес превышает допустимый диапазон DATA_PTR

8384 >03

Ошибка значения данных

8385 03

Этот диагностический код данных не поддерживается

8386

Код функции в ответе не соответствует коду функции в передаче.

8387

Ответная ошибка ведомого

8388

Ответ ведомого устройства на запрос записи неверен

Таблица 7 Код ошибки STATUS инструкции MB_MASTER (сообщение об ошибке протокола Modbus)

ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ:

Как проверить, был ли модуль связи S7-1200 CM1241 успешно установлен в режим связи Modbus RTU?

Вы можете проверить состояние выходных битов «DONE», «ERROR» и «STATUS» инструкции «MB_COMM_LOAD» в программе или таблице мониторинга, чтобы определить, был ли коммуникационный модуль S7-1200 CM1241 успешно настроен на связь Modbus RTU. режим.

  • Если модуль успешно установлен в режим связи Modbus RTU: «MB_COMM_LOAD», выходной бит команды «DONE» = 1, «ERROR» = 0, слово состояния выхода «STATUS» = 0;
  • Если модуль не был успешно установлен в режим связи Modbus RTU: «MB_COMM_LOAD», выходной бит команды «DONE» = 0, «ERROR» = 1, слово состояния выхода «STATUS», код ошибки выхода. Пожалуйста, обратитесь к таблице «Код ошибки STATUS инструкции MB_COMM_LOAD», чтобы узнать о конкретных причинах ошибки.

При выполнении инструкции «MB_MASTER» всегда отображается выходной бит «Занят» = 1, почему?

Поскольку порт занят обработкой запроса на передачу. Когда возникает эта ошибка, проверьте, запускается ли входной бит инструкции «MB_MASTER» «REQ» по нарастающему фронту или выполняются ли другие несколько инструкций «MB_MASTER».

Данные адреса кластера Modbus RTU не могут быть записаны или прочитаны путем выполнения инструкции «MB_MASTER», но бит ошибки «Error» = 0 и код ошибки «STATUS» = 16 # 0 инструкции мониторинга «MB_MASTER» в программе , Почему?

После того, как последний запрос инструкции «MB_MASTER» завершен из-за ошибки, бит ERROR останется ИСТИННЫМ в течение одного времени цикла сканирования, а значение кода ошибки в параметре STATUS действительно только для одного цикла сканирования, когда ERROR = TRUE, поэтому он не может передавать программу или контролировать табличное представление. Параметры ERROR и STATUS могут быть считаны с использованием метода программирования, показанного ниже.

S7-1200 используется в качестве ведущей станции Modbus RTU, как обращаться к ведомой станции Modbus RTU 0-65535?

Обычно «EXTENDED_ADDRESSING» в блоке данных экземпляра «MB_MASTER_DB» инструкции «MB_MASTER» по умолчанию равен 0, и можно получить доступ к адресу ведомого устройства Modbus RTU 0–247.

Установите «EXTENDED_ADDRESSING» в блоке данных экземпляра «MB_MASTER_DB» инструкции «MB_MASTER» на 1, чтобы включить расширенную адресацию 0-65535 к ведомому устройству Modbus RTU. Чтобы установить EXTENDED_ADDRESSING, выполните следующие действия:

Сначала найдите «системный блок» → «программный ресурс», дважды щелкните «MB_MASTER_DB» и проверьте «EXTENDED_ADDRESSING» в блоке данных экземпляра «MB_MASTER_DB» инструкции «MB_MASTER».

Введите «MB_MASTER_DB.EXTENDED_ADDRESSING» в «Таблицу мониторинга» и установите бит в 1.

S7-1200 В качестве ведомого устройства Modbus RTU

Модули S7-1200, поддерживающие режим связи Modbus RTU, могут использоваться в качестве ведомых устройств Modbus RTU. Ниже в качестве примеров используются CPU1215C DC / DC / DC и CM1241 RS485 для ознакомления с этапами настройки и программирования связи ведомого устройства S7-1200 Modbus RTU.

Аппаратные и программные требования и выполненные коммуникационные задачи:

аппаратное обеспечение:
① CPU1215C DC / DC / DC (номер для заказа: 6ES7 215-1AG31-0XB0)
② CM1241 RS485 (номер для заказа: 6ES7 241-1CH30-0XB0)
③ Блок питания PS 307 (номер для заказа: 6ES7307-1KA02-0AA0)
④ ПК (с картой Ethernet)
⑤ Кабель TP Ethernet

программного обеспечения:
① STEP 7 V11 Professional SP2 UPD4 +HSP
② ModScan (это программное обеспечение стороннего производителя, которое можно загрузить из Интернета)

Коммуникационные задачи выполнены:
Считайте данные в 5 словах, начиная с DB1.DBW0 в Modbus RTU Slave CPU1215C, в 5 слов, начиная с 40001 в ModScan ведущего Modbus RTU.

1. Настройте коммуникационный модуль Modbus RTU.

Найдите «Коммуникационный модуль» → «Точка-точка» в каталоге оборудования.«CM1241 (RS485)», дважды щелкните или перетащите этот модуль в левую часть ЦП, как показано на Рисунке 1 ниже:

Рисунок 1 Настройка коммуникационного модуля

Затем с помощью мыши выберите модуль CM1241 (RS485) в «Обзоре устройств» и настройте параметры аппаратного интерфейса этого модуля в «Свойства» → «Конфигурация порта». Как показано на Рисунке 2 ниже:

Следующее принимает скорость передачи = 9,6 Кбит / с, проверка четности = без проверки четности, бит данных = 8 символов, стоповый бит = 1, и другие сохраняют настройки по умолчанию в качестве примера.

Рисунок 2 Настройки порта RS485

Наконец, убедитесь, что идентификатор оборудования равен 271 в «идентификаторе оборудования», как показано на рисунке 3 ниже:

Рисунок 3 Идентификатор оборудования

2. Добавить OB запуска

В дереве проекта выберите «CPU1215C DC / DC / DC» → «Программный блок» → «Добавить новый блок», во всплывающем окне выберите «Организационный блок OB» → «Запуск», добавьте OB запуска 100, как показано на рисунке 4 ниже Показать:

Рисунок 4 Добавление OB запуска

3. Вызвать инструкцию MB_COMM_LOAD.

Чтобы установить порт в режим связи Modbus RTU сразу после его запуска, в OB 100 можно вызвать команду «MB_COMM_LOAD». При вызове инструкции «MB_COMM_LOAD» интерфейс для создания соответствующего блока данных экземпляра появится автоматически, как показано на рисунке 5 ниже:

Рисунок 5 Вызов инструкции MB_COMM_LOAD

Нажмите «ОК», чтобы создать экземплярный блок данных для этой инструкции и назначить адреса каждому контакту ввода / вывода. Обратите особое внимание на входной вывод MB_DB, чтобы он указывал на блок фоновых данных инструкции «MB_SLAVE», как показано на рисунке 6 ниже:

Примечание:Бит ввода команды «MB_COMM_LOAD» «REQ» должен запускаться по нарастающему фронту. Поскольку OB 100 выполняется только один раз при запуске S7-1200, в этом примере «REQ» устанавливается в «TRUE».

Рисунок 6 Инструкция MB_COMM_LOAD

Значение параметров инструкции MB_COMM_LOAD показано в Таблице 1 ниже:

Штырь

Описание

EN

Давать возможность

REQ

Выполните инструкцию по нарастающему фронту

PORT

Аппаратный идентификатор коммуникационного порта

BAUD

Выбор скорости передачи: 3600, 6000, 12000, 2400, 4800, 9600, 19200, 38400, 57600, 76800, 115200 (Примечание: все остальные значения недействительны)

PARITY

Выбор проверки четности: 0-нет; 1-нечетная проверка; 2-четная проверка

FLOW_CTRL

Выбор управления потоком: 0- (значение по умолчанию) без управления потоком

RTS_ON_DLY

Выбор задержки RTS: 0- (значение по умолчанию)

RTS_OFF_DLY

Выбор задержки выключения RTS: 0- (значение по умолчанию)

RESP_TO

Тайм-аут ответа: значение по умолчанию = 1000 мс. MB_MASTER определяет время (в миллисекундах) для ответа ведомого устройства.

MB_DB

Блок данных экземпляра, используемый инструкцией MB_MASTER или MB_SLAVE.

DONE

Бит завершения: устанавливается в 1, когда инструкция выполняется без ошибок.

ERROR

Бит ошибки: 0 – ошибка не обнаружена; 1 – ошибка обнаружена. Код ошибки выводится в параметре СОСТОЯНИЕ.

STATUS

Код ошибки конфигурации порта

Таблица 1 Значение параметра инструкции MB_COMM_LOAD

4. Создайте блок данных MB_HOLD_REG.

Создайте блок БД через «Программный блок» → «Добавить новый блок», выберите «Блок данных (БД)», выберите «Стандартный, совместимый с S7-300 / 400», нажмите «ОК», чтобы определить область данных как массив из 5 слов. , как показано на рисунке 7 ниже:

Примечание. Тип доступа к БД, используемый MB_HOLD_REG, должен быть стандартным и совместимым с S7-300 / 400.

Рисунок 7 Создание блока данных MB_HOLD_REG

5. Вызвать инструкцию MB_SLAVE.

Вызовите инструкцию MB_SLAVE в OB1, и интерфейс для создания соответствующего блока фоновых данных автоматически появится при вызове этой инструкции, как показано на рисунке 8 ниже:

Рисунок 8 Вызов инструкции MB_SLAVE

Нажмите «ОК», чтобы создать блок фоновых данных для этой инструкции, и назначьте адреса каждому контакту ввода / вывода, как показано на рисунке 9 ниже:

S7-1200 служит в качестве ведомого устройства Modbus RTU, MB_HOLD_REG указывает на указатель блока данных регистра временного хранения Modbus. Настройки следующие: MB_HOLD_REG = P # DB3.DBX0.0 WORD 5.

Соответствующее соотношение показано в Таблице 2 ниже:

Главная станция Modbus RTU Адрес Modbus Адрес буфера данных подчиненного устройства Modbus RTU CPU1215C
40001 DB3.DBW0
40002 DB3.DBW2
40003 DB3.DBW4
40004 DB3.DBW6
40005 DB3.DBW8

Таблица 2 Соответствие адреса Modbus

Рисунок 9 Инструкция MB_SLAVE

Штырь Описание

EN

Давать возможность

MB_ADDR

Адрес станции ведомого устройства Modbus. Диапазон адресов по умолчанию: от 0 до 247; расширенный диапазон адресов: от 0 до 65535

MB_HOLD_REG

Указатель на блок данных регистра временного хранения Modbus. Блок данных должен быть создан с типом доступа «стандартно совместим с S7-300 / 400».

NDR

Готовы новые данные: 0 – нет новых данных; 1 – указывает, что главная станция Modbus записала новые данные

DR

Считывание данных: 0 – данные не считываются; 1 – указывает, что главная станция Modbus прочитала новые данные

ERROR

Бит ошибки

STATUS

код ошибки

Таблица 3 Значение параметра инструкции MB_SLAVE

MB_SLAVE Функция Modbus S7-1200
Код Функции Область данных Диапазон адресов Область данных Адрес процессора
01 Прочитать бит Выход 1 к 8192 Область изображения процесса вывода Q0.0 – Q1023.7
02 Прочитать бит войти С 10001 по 18192 Область входного изображения От I0.0 до I1023.7
04 Чтение войти С 30001 по 30512 Область входного изображения IW0 – IW1022
05 Бит записи Выход 1 к 8192 Область изображения процесса вывода Q0.0 – Q1023.7
15 Бит записи Выход 1 к 8192 Область изображения процесса вывода Q0.0 – Q1023.7

Таблица 4 Отображение адреса Modbus в область образа процесса

MB_SLAVE Функция Modbus S7-1200
Код Функции Область данных Диапазон адресов Область данных БД ЦП Адрес процессора
03 Чтение Регистр холдинга С 40001 по 49999 MB_HOLD_REG Слово 1 в слово 9999
С 400001 по 465535 Слово 1 в слово 65535
06 Письмо Регистр холдинга С 40001 по 49999 MB_HOLD_REG Слово 1 в слово 9999
С 400001 по 465535 Слово 1 в слово 65535
16 Письмо Регистр холдинга С 40001 по 49999 MB_HOLD_REG Слово 1 в слово 9999
С 400001 по 465535 Слово 1 в слово 65535

Таблица 5 Сопоставление адреса Modbus с областью хранения ЦП

6. Настройки главного программного обеспечения Modbus.

Примечание:Клиентский компьютер протестирован с помощью программного обеспечения ModScan, которое является сторонним программным обеспечением, которое можно загрузить из Интернета.

Сначала установите соединение в открытом программном обеспечении ModScan и установите параметры режима RTU: скорость передачи данных Baud = 9600, бит данных Data = 8, стоповый бит Stop = 1, четность = NONE, как показано на рисунке 10 ниже:

Рисунок 10 Установка соединения ModScan

Выбрать файл”«Новый» Откройте интерфейс связи ModScan, установите адрес подчиненного устройства Modbus RTU Device Id = 1, начальный адрес данных Address = 0001, длину данных = 5, код функции типа данных Modbus 03, как показано на рисунке 11 ниже:

Примечание:Настройка идентификатора устройства должна соответствовать адресу, установленному входным выводом «MB_ADDR» в инструкции «MB_SLAVE».

Рисунок 11 Настройка ModScan

7. Результаты тестирования Modbus RTU.

Откройте «таблицу мониторинга» проекта CPU1215 DC / DC / DC в программном обеспечении STEP 7 V11 Professional SP2 UPD4, запишите значение 21 в DB3.DBW0, запишите значение 22 в DB3.DBW2, запишите значение 23 в DB3. DBW4 и DB3. DBW6 записывает значение 24, а DB3.DBW8 записывает значение 25. Главная станция ModScan считывает значение 21 адреса подчиненной станции S7-1200 Modbus RTU DB3.DBW0, значение 22 DB3.DBW2, значение 23 DB3.DBW4, значение 24 DB3.DBW6 и значение 25 DB3.DBW8 соответственно.Прибыл по адресам 40001, 40002, 40003, 40004, 40005. Как показано на Рисунке 12 ниже:

Рисунок 12 Результаты тестирования Modbus RTU

Инструкции MB_COMM_LOAD и MB_SLAVE Код ошибки STATUS

STATUS(W#16#) Описание
0000 Ошибок на порте нет
8180 Неверное значение идентификатора порта
8181 Неверное значение скорости передачи
8182 Недействительное значение четности
8183 Неверное значение управления потоком
8184 Неверное значение тайм-аута ответа
8185 Параметр MB_DB не является блоком данных экземпляра MB_MASTER или MB_SLAVE

Таблица 6 Код ошибки STATUS инструкции MB_COMM_LOAD

STATUS(W#16#) Описание
0000 Нет ошибки
80D1 Получатель выдал запрос управления потоком для приостановки активной передачи и не активировал передачу в течение указанного времени ожидания.
80D2 Запрос на передачу прекращен
80E0 Сообщение было прервано, потому что буфер приема был заполнен
80E1 Сообщение было прервано из-за ошибки четности
80E2 Сообщение было прервано из-за ошибки кадрирования
80E3 Сообщение было прервано из-за ошибки переполнения
80E4 Сообщение было прервано, поскольку указанная длина превышает общий размер буфера.
8180 Неверное значение идентификатора порта или ошибка команды MB_COMM_LOAD
8186 Недействительный адрес станции Modbus
8187 Неверный указатель на MB_HOLD_REG
818C Указатель MB_HOLD_REG на память M или DB (адрес символа и прямой адрес, разрешенный в области DB) недействителен.

Таблица 7 Значение параметра STATUS инструкции MB_SLAVE (ошибка связи и конфигурации)

STATUS(W#16#)

Код ответа от ведомого

Описание

8380 Не отвечает CRC ошибка
8381 01

Код функции не поддерживается или код функции не поддерживается в трансляции

8382 03 Ошибка длины данных
8383 02 Адрес данных неверен или адрес превышает допустимый диапазон, взятый DATA_PTR
8384 03 Ошибка значения данных
8385 03 Это значение диагностического кода данных не поддерживается

Таблица 8 Значение параметра STATUS инструкции MB_SLAVE (ошибка протокола Modbus)

ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ:

Почему возникает ошибка при запуске инструкции «MB_SLAVE», выходной бит «ERROR» = 1 и слово состояния выхода «STATUS» = 16 # 8187?

Слово состояния вывода «STATUS» = 16 # 8187 указывает, что указатель на MB_HOLD_REG недействителен. Следующие две ситуации вызовут указанную выше ошибку:

  • В программе нет блока DB, соответствующего входному выводу «MB_HOLD_REG» инструкции «MB_SLAVE».
  • При создании блока DB, соответствующего входному выводу «MB_HOLD_REG» инструкции «MB_SLAVE», была выбрана «Только адресация символа».

Решения следующие:

  • Создайте новый блок DB, соответствующий входному выводу «MB_HOLD_REG» инструкции «MB_SLAVE».
  • При создании блока DB, соответствующего входному выводу «MB_HOLD_REG» инструкции «MB_SLAVE», можно выбрать только «стандарт, совместимый с S7-300 / 400».

Параметр тайм-аута подключения

Когда сеть связи S7-1200 Mobus RTU содержит несколько подчиненных станций, из-за характеристик сети опроса, данные только одной станции могут быть прочитаны или записаны одновременно. Таким образом, следующие факторы будут влиять на окончательное общее время опроса:

1. Время установки скорости передачи данных (бод).

2. Объем коммуникационных данных на сайт.

3. Количество станций

4. Расстояние связи

5. Время подключения каждого сайта.

Будь то помехи сигнала, качество оборудования или временное отключение станции из-за инженерных нужд, время опроса системы связи будет значительно увеличено из-за увеличения «времени соединения каждой станции». В связи Modbus RTU S7-1200 есть в основном три параметра, относящиеся к настройке «времени соединения каждой станции».

1. Время отклика ведомого RESP_TO

Как показано на рисунке 1, блок инициализации MB_COMM_LOAD версии V2.x может установить параметр RESP_TO времени отклика ведомого устройства:

Установите время ответа ведомой станции с одним подключением в диапазоне от 5 мс до 65535 мс (по умолчанию 1000 мс); то есть, если ведомая станция не отвечает в течение этого периода времени, MB_MASTER завершит запрос после отправки указанного количества запросов на повтор. И это вызывает сообщение об ошибке 80C8.

Рисунок 1. Настройки параметра RESP_TO

Примечание. Как показано на рисунке 2, частота выполнения ведомого устройства Modbus должна быть по крайней мере меньше времени отклика, установленного параметром RESP_TO (необходимо учитывать время задержки отклика) для нормальной связи.

Рисунок 2. Время отклика ведомого.

2. Количество повторных попыток RETRIES

В блоке данных экземпляра функционального блока инициализации MB_COMM_LOAD вы можете установить параметр RETRIES для количества попыток:

Количество попыток до того, как главная станция вернет код ошибки отсутствия ответа 0x80C8. (Значение по умолчанию – 2 раза)
Примечание. Этот параметр представляет количество повторных подключений после того, как исходное подключение не получило ответа; то есть по умолчанию, например, 2 раза, а фактическое количество попыток подключения – 3 раза.

Рисунок 3 Настройки параметра RETRIES

Примечание. После изменения параметра RETRIES необходимо повторно включить вывод REQ функционального блока MB_COMM_LOAD, иначе измененный параметр не вступит в силу.

3. Параметр синхронизации ведущей станции Blocked_Proc_Timeout

Когда Done и Error не установлены в 1 по каким-либо причинам (например, запрос главной станции, но вызов функционального блока главной станции останавливается до того, как запрос будет полностью завершен), необходимо указать время синхронизации, который устанавливается после наступления времени Бит для выполнения следующего функционального блока или опроса следующей станции.

Блок фоновых данных MB_Master предоставляет параметр синхронизации главной станции Blocked_Proc_Timeout (диапазон от 0 до 5,5 с, по умолчанию 3 с)

Предыдущий RESP_TO соответствует времени ответа подчиненной станции, а Blocked_Proc_Timeout – времени синхронизации главной станции.Этот функциональный параметр используется для предотвращения монополизации или блокировки доступа к порту отдельной инструкцией MB_Master.

Рисунок 4. Настройки параметра Blocked_Proc_Timeout

ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ:

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

Как правило, S7-1200 может одновременно настраивать два параметра: время отклика подчиненной станции RESP_TO и количество повторных попыток RETRIES, которые используются для уменьшения увеличенного времени цикла опроса, когда подчиненная станция Modbus отключается или временно выключается. .
Пример: по умолчанию система пытается подключиться 3 раза, каждый раз по 1 с, всего 3 с;
Время отклика RESP_TO подчиненной станции может быть соответствующим образом уменьшено в соответствии с фактическими рабочими условиями проекта. Это время невозможно оценить.Рекомендуется протестировать несколько раз, чтобы убедиться, что каждая подчиненная станция может быть подключена нормально и стабильно, и установить это время как можно меньшим.
Возьмем для примера настройку 500 мс. Затем установите RETRIES на 0. То есть для каждой подчиненной станции главная станция пытается подключиться только один раз, что в сумме занимает 500 мс.

MB_MASTER сообщил об ошибке 8200 (порт занят обработкой запроса на передачу), Как с этим бороться?

Эта ситуация вызвана тем, что ни DONE, ни ERROR для MB_MASTER не установлены, что конфликтует с последующим MB_MASTER. Убедитесь, что время для подключения к следующему MB_MASTER больше, чем установленное время Blocked_Proc_Timeout (по умолчанию 3S).

Содержание этого раздела:

1. S7-1200Как мастер-станция Modbus RTU

Два, S7-1200В качестве ведомого устройства Modbus RTU

Три, S7-1200Как мастер-станция Modbus RTU

S7-1200 Как мастер-станция Modbus RTU

Модули S7-1200, поддерживающие режим связи Modbus RTU, могут использоваться как ведущие станции Modbus RTU. Ниже в качестве примеров используются модули CPU1215C DC / DC / DC и CM1241 RS485 для ознакомления с этапами настройки связи и программирования главной станции S7-1200 Modbus RTU.

Аппаратные и программные требования и выполненные коммуникационные задачи:

аппаратное обеспечение:
① CPU1215C DC / DC / DC (номер для заказа: 6ES7 215-1AG31-0XB0)
② CM1241 RS485 (номер для заказа: 6ES7 241-1CH30-0XB0)
③ Блок питания PS 307 (номер для заказа: 6ES7307-1KA02-0AA0)
④ ПК (с картой Ethernet)
⑤ Кабель TP Ethernet

программного обеспечения:
① STEP 7 Professional V11 SP2 UPD4+HSP
② ModSim (это программное обеспечение стороннего производителя, которое можно загрузить из Интернета)

Коммуникационные задачи выполнены:
Считайте данные в 5 словах адреса Modbus, начиная с 40001 в подчиненной станции Modbus RTU ModSim, в 5 слов адреса, начиная с DB1.DBW0 в главной станции Modbus RTU CPU1215C.

1. Настройте коммуникационный модуль Modbus RTU.

Найдите «Коммуникационный модуль» → «Точка-точка» → «CM1241 (RS485)» в каталоге оборудования, дважды щелкните или перетащите этот модуль в левую часть ЦП, как показано на рисунке 1 ниже:

Рисунок 1 Настройка коммуникационного модуля

Затем с помощью мыши выберите модуль CM1241 (RS485) в «Обзоре устройств» и настройте параметры аппаратного интерфейса этого модуля в «Свойства» → «Конфигурация порта». Как показано на Рисунке 2 ниже:

Следующее принимает скорость передачи = 9,6 Кбит / с, проверка четности = без проверки четности, бит данных = 8 символов, стоповый бит = 1, и другие сохраняют настройки по умолчанию в качестве примера.

Рисунок 2 Настройки порта RS485

Наконец, убедитесь, что идентификатор оборудования равен 271 в «идентификаторе оборудования», как показано на рисунке 3 ниже:

Рисунок 3 Идентификатор оборудования

2. Добавить OB запуска

В дереве проекта выберите «CPU1215C DC / DC / DC» → «Программный блок» → «Добавить новый блок», во всплывающем окне выберите «Организационный блок OB» → «Запуск», добавьте запускаемый OB 100, как показано на рисунке 4 ниже. Показать:

Рисунок 4 Добавление OB запуска

3. Вызвать инструкцию MB_COMM_LOAD.

Чтобы установить порт в режим связи Modbus RTU сразу после его запуска, в OB 100 можно вызвать команду «MB_COMM_LOAD». При вызове инструкции «MB_COMM_LOAD» интерфейс для создания соответствующего блока данных экземпляра появится автоматически, как показано на рисунке 5 ниже:

Рисунок 5 Вызов инструкции MB_COMM_LOAD

Нажмите «ОК», чтобы создать экземплярный блок данных для этой инструкции и назначить адреса каждому контакту ввода / вывода. Особое внимание следует обратить на входной вывод MB_DB, чтобы он указывал на блок данных экземпляра инструкции «MB_MASTER», как показано на рисунке 6 ниже:

Примечание:Бит ввода команды «MB_COMM_LOAD» «REQ» должен запускаться по нарастающему фронту. Поскольку OB 100 выполняется только один раз при запуске S7-1200, в этом примере «REQ» устанавливается в «TRUE».

Рисунок 6 Инструкция MB_COMM_LOAD

Значение параметров инструкции MB_COMM_LOAD показано в Таблице 1 ниже:

Штырь

Описание

EN

Давать возможность

REQ

Выполните инструкцию по нарастающему фронту

PORT

Аппаратный идентификатор коммуникационного порта

BAUD

Выбор скорости передачи: 3600, 6000, 12000, 2400, 4800, 9600, 19200, 38400, 57600, 76800, 115200 (Примечание: все остальные значения недействительны)

PARITY

Выбор проверки четности: 0-нет; 1-нечетная проверка; 2-четная проверка

FLOW_CTRL

Выбор управления потоком: 0- (значение по умолчанию) без управления потоком

RTS_ON_DLY

Выбор задержки RTS: 0- (значение по умолчанию)

RTS_OFF_DLY

Выбор задержки выключения RTS: 0- (значение по умолчанию)

RESP_TO

Тайм-аут ответа: значение по умолчанию = 1000 мс. MB_MASTER определяет время (в миллисекундах) для ответа ведомого устройства.

MB_DB

Блок данных экземпляра, используемый инструкцией MB_MASTER или MB_SLAVE.

DONE

Бит завершения: устанавливается в 1, когда инструкция выполняется без ошибок.

ERROR

Бит ошибки: 0 — ошибка не обнаружена; 1 — ошибка обнаружена. Код ошибки выводится в параметре СОСТОЯНИЕ.

STATUS

Код ошибки конфигурации порта

Таблица 1 Значение параметра инструкции MB_COMM_LOAD

4. Создайте буферы отправки и получения данных DATA_PTR.

Создайте блок БД через «Программный блок» → «Добавить новый блок», выберите «Блок данных (БД)», выберите «Стандартный, совместимый с S7-300 / 400» и нажмите кнопку «ОК». Создайте в БД массив из 5 слов, как показано на рисунке 7 ниже:

Примечание. Тип доступа к БД, используемый буферами отправки и приема данных DATA_PTR, должен быть стандартно совместим с S7-300 / 400.

Рисунок 7 Создание буфера отправки и получения данных DATA_PTR

5. Вызвать инструкцию MB_MASTER.

Вызовите инструкцию «MB_MASTER» в OB1, и интерфейс для создания соответствующего экземпляра блока данных автоматически появится при вызове этой инструкции, как показано на рисунке 8 ниже:

Рисунок 8 Вызов инструкции MB_MASTER

Нажмите «ОК», чтобы создать блок фоновых данных для этой инструкции, и назначьте адреса каждому контакту ввода / вывода, как показано на рисунке 9 ниже:

Примечание:Входной бит «REQ» инструкции «MB_MASTER» должен запускаться нарастающим фронтом.

Возьмите S7-1200 в качестве ведущей станции Modbus RTU, используйте код функции F03 для чтения ведомой станции 2 Modbus RTU, пять слов, начиная с адреса Modbus 40001, и полученные данные сохраняются в начальной области буфера DB3.DBW0 как пример. Настройки следующие: MB_ADDR = 2, MODE = 0, DATA_ADDR = 40001, DATA_LEN = 5.

Соответствие адресов показано в Таблице 2 ниже:

Мастер-станция Modbus RTU Адрес буфера данных CPU1215C Адрес Modbus ведомого устройства Modbus RTU
DB3.DBW0 40001
DB3.DBW2 40002
DB3.DBW4 40003
DB3.DBW6 40004
DB3.DBW8 40005

Таблица 2 Соответствие адреса Modbus

Рисунок 9 Инструкция MB_MASTER

Значение параметров инструкции MB_MASTER показано в Таблице 3 ниже:

Штырь Описание

EN

Давать возможность

REQ

Выполнение инструкции по нарастающему фронту, запрос на отправку или чтение данных на ведомое устройство Modbus.

MB_ADDR

Адрес ведомого устройства Modbus RTU. Диапазон адресов по умолчанию: от 0 до 247; расширенный диапазон адресов: от 0 до 65535. Значение 0 зарезервировано для рассылки сообщения всем ведомым устройствам Modbus.

MODE

Выбор режима: укажите тип запроса

DATA_ADDR

Начальный адрес на подчиненной станции: укажите начальный адрес данных, к которым будет осуществляться доступ на подчиненной станции Modbus.

DATA_LEN

Длина данных: укажите количество цифр или слов, к которым будет осуществляться доступ в этом запросе.

DATA_PTR

Указатель данных: укажите адрес M или DB данных для записи или чтения (тип доступа к базе данных должен быть стандартным, совместимым с S7-300 / 400).

DONE

Бит Done: после того, как последний запрос был завершен без ошибок, бит DONE останется ИСТИННЫМ в течение одного времени цикла сканирования.

BUSY

0-операция MB_MASTER не выполняется; 1-операция MB_MASTER выполняется

EEROR

Бит ошибки: после того, как предыдущий запрос был прерван из-за ошибки, бит ERROR останется ИСТИННЫМ для одного сканирования.
Время цикла рисования. Значение кода ошибки в параметре STATUS действительно только в течение одного периода сканирования, когда ERROR = TRUE.

STATUS

код ошибки

Таблица 3 Значение параметра инструкции MB_MASTER

О MODE, DATA_ADDR, DATA_LEN можно посмотреть в Таблице 4 ниже:

MB_MASTER функция Modbus
 

Параметры адреса Modbus

Тип адреса

Параметр длины данных Modbus

Функция Modbus

Режим 0

Читать

От 00001 до 09999

Выходной бит

1 к 2000

01

С 10001 по 19999

Входной бит

1 к 2000

02

С 30001 по 39999

Регистр ввода

От 1 до 125

04

С 40001 по 49999

С 400001 по 465535 (расширенный)

Регистр холдинга

От 1 до 125

03

Режим 1
Написать

От 00001 до 09999

Выходной бит

1 (один бит)

05

С 40001 по 49999

С 400001 по 465535 (расширенный)

Регистр холдинга

1 (одно слово)

06

От 00001 до 09999

Выходной бит

2 к 1968 г.

15

С 40001 по 49999

С 400001 по 465535 (расширенный)

Регистр холдинга

2 к 123

16

Режим 2
Некоторые ведомые устройства Modbus не поддерживают использование функции Modbus 05H или 06H для записи одного бита или слова. В этом случае функция Modbus может быть вынуждена использовать 15H или 16H для записи одного бита или слова в режиме 2.

Написать

От 00001 до 09999

Выходной бит

2 к 1968 г.

15

С 40001 по 49999

С 400001 по 465535 (расширенный)

Регистр холдинга

1 к 123

16

Узор 11

Считайте слово состояния связи и счетчик событий ведомого устройства: слово состояния указывает состояние выполнения инструкции (0: не выполняется; 0xFFFF: выполняется). Каждый раз, когда сообщение успешно доставлено, значение счетчика событий будет увеличиваться. При использовании этой функции игнорируйте параметры DATA_ADDR и DATA_LEN инструкции «MB_MASTER».

Режим 80

Проверьте состояние ведомого устройства, прочитав код ошибки (0x0000): 1 слово на запрос

Узор 81.

Сброс счетчика событий ведомого через диагностический код 0x000A: 1 слово на запрос

Таблица 4 Таблица функций MB_MASTER Modbus

6. Настройки программного обеспечения Modbus Slave

Примечание:Подчиненная станция Modbus RTU тестируется программным обеспечением ModSim, которое является сторонним программным обеспечением, которое можно загрузить из Интернета.

Установите соединение в открытом программном обеспечении ModSim и установите параметры режима RTU: скорость передачи данных Baud = 9600, бит данных Data = 8, стоповый бит Stop = 1, четность = NONE, как показано на рисунке 10 ниже:

Рисунок 10 Установка соединения ModSim

Выберите «Файл» → «Новый», чтобы открыть интерфейс связи ModSim, установите адрес ведомого устройства Modbus RTU Id устройства = 2, начальный адрес Address = 0001, длину данных = 5, код функции типа данных Modbus 03. Дважды щелкните область данных за каждым адресом Modbus, и появится диалоговое окно «Регистр записи», где вы можете записать значения данных, как показано на рисунке 11 ниже:

Примечание:Настройка Device Id должна соответствовать адресу, установленному входным выводом «MB_ADDR» в инструкции «MB_MASTER».

Рисунок 11 Настройка ModSim

7. Результаты тестирования Modbus RTU.

Откройте «Таблицу мониторинга» проекта CPU1215C DC / DC / DC в программном обеспечении STEP 7 Professional V11 UPD4 и активируйте входной бит M10.0 инструкции «MB_MASER». Ведущее устройство Modbus RTU считывает значение 11 в адресе 40001 подчиненного устройства ModSim, значение 12 в 40002, значение 13 в 40003, значение 14 в 40004 и значение 15 в 40005, соответственно, по адресам DB3.DBW0 и DB3. . DBW2, DB3.DBW4, DB3.DBW6, DB3.DBW8, как показано на рисунке 12 ниже:

Рисунок 12 Результаты тестирования Modbus RTU

Многоадресный или многосайтовый опрос в режиме связи S7-1200 Modbus RTU

Несколько коммуникационных модулей CM 1241 RS485 могут быть подключены друг к другу с помощью кабелей PROFIBUS. Одна ведущая станция и до 31 ведомой станции MODBUS могут быть подключены к сети с помощью кабелей PROFIBUS.

При опросе S7-1200 Modbus RTU необходимо запустить следующую команду «MB_MASTER» через выходной бит предыдущей команды «MB_MASTER» «Готово» = 1. Для получения конкретных инструкций и идей по программированию перейдите по следующей ссылке:

Как использовать STEP 7 (TIA Portal) V11 для установления связи Modbus RTU для SIMATIC S7-1200?

http://support.automation.siemens.com/CN/view/zh/47756141

Инструкции MB_COMM_LOAD и MB_MASTER Код ошибки STATUS

STATUS(W#16#) Описание
0000 Ошибок на порте нет
8180 Неверное значение идентификатора порта
8181 Неверное значение скорости передачи
8182 Недействительное значение четности
8183 Неверное значение управления потоком
8184 Неверное значение тайм-аута ответа
8185 Параметр MB_DB не является блоком данных экземпляра MB_MASTER или MB_SLAVE

Таблица 5 Код ошибки STATUS инструкции MB_COMM_LOAD

STATUS(W#16#)

Описание

0000

Нет ошибки

80C8

Время ожидания ведомого истекло. Проверьте скорость передачи, проверку четности и подключение ведомого устройства.

80D1

Получатель отправил запрос управления потоком для приостановки активной передачи и не активировал передачу в течение указанного времени ожидания.

Если приемник не обнаруживает CTS в течение времени ожидания, эта ошибка также будет сгенерирована во время аппаратного управления потоком.

80D2

Поскольку от DCE не поступил сигнал DSR, запрос на передачу был прекращен.

80E0

Буфер приема заполнен, и сообщение завершено.

80E1

Ошибка четности, сообщение прервано

80E2

Ошибка кадрирования, сообщение прервано

80E3

Ошибка тайм-аута, сообщение было прервано

80E4

Указанная длина превышает общий размер буфера, и сообщение прекращается.

8180

Неверное значение идентификатора порта

8186

Недействительный адрес станции Modbus

8188

Для широковещательных вызовов значение параметра MODE недопустимо.

8189

Значение адреса данных недействительно

818A

Неверное значение длины данных

818B

Неверный указатель на локальный источник / цель данных

818C

Указатель на DATA_PTR недействителен: используйте указатель на битовую область хранения или блок данных, тип доступа которого «стандартно совместим с S7-300 / 400».

8200

Порт занят обработкой запроса на передачу

Таблица 6 Код ошибки STATUS инструкции MB_MASTER (сообщение об ошибке связи и конфигурации инструкции)

STATUS(W#16#) Код ответа от ведомого

Описание

8380

CRC ошибка

8381 01

Этот код функции не поддерживается

8382 03

Ошибка длины данных

8383 02

Адрес данных неверен или адрес превышает допустимый диапазон DATA_PTR

8384 >03

Ошибка значения данных

8385 03

Этот диагностический код данных не поддерживается

8386

Код функции в ответе не соответствует коду функции в передаче.

8387

Ответная ошибка ведомого

8388

Ответ ведомого устройства на запрос записи неверен

Таблица 7 Код ошибки STATUS инструкции MB_MASTER (сообщение об ошибке протокола Modbus)

ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ:

Как проверить, был ли модуль связи S7-1200 CM1241 успешно установлен в режим связи Modbus RTU?

Вы можете проверить состояние выходных битов «DONE», «ERROR» и «STATUS» инструкции «MB_COMM_LOAD» в программе или таблице мониторинга, чтобы определить, был ли коммуникационный модуль S7-1200 CM1241 успешно настроен на связь Modbus RTU. режим.

  • Если модуль успешно установлен в режим связи Modbus RTU: «MB_COMM_LOAD», выходной бит команды «DONE» = 1, «ERROR» = 0, слово состояния выхода «STATUS» = 0;
  • Если модуль не был успешно установлен в режим связи Modbus RTU: «MB_COMM_LOAD», выходной бит команды «DONE» = 0, «ERROR» = 1, слово состояния выхода «STATUS», код ошибки выхода. Пожалуйста, обратитесь к таблице «Код ошибки STATUS инструкции MB_COMM_LOAD», чтобы узнать о конкретных причинах ошибки.

При выполнении инструкции «MB_MASTER» всегда отображается выходной бит «Занят» = 1, почему?

Поскольку порт занят обработкой запроса на передачу. Когда возникает эта ошибка, проверьте, запускается ли входной бит инструкции «MB_MASTER» «REQ» по нарастающему фронту или выполняются ли другие несколько инструкций «MB_MASTER».

Данные адреса кластера Modbus RTU не могут быть записаны или прочитаны путем выполнения инструкции «MB_MASTER», но бит ошибки «Error» = 0 и код ошибки «STATUS» = 16 # 0 инструкции мониторинга «MB_MASTER» в программе , Почему?

После того, как последний запрос инструкции «MB_MASTER» завершен из-за ошибки, бит ERROR останется ИСТИННЫМ в течение одного времени цикла сканирования, а значение кода ошибки в параметре STATUS действительно только для одного цикла сканирования, когда ERROR = TRUE, поэтому он не может передавать программу или контролировать табличное представление. Параметры ERROR и STATUS могут быть считаны с использованием метода программирования, показанного ниже.

S7-1200 используется в качестве ведущей станции Modbus RTU, как обращаться к ведомой станции Modbus RTU 0-65535?

Обычно «EXTENDED_ADDRESSING» в блоке данных экземпляра «MB_MASTER_DB» инструкции «MB_MASTER» по умолчанию равен 0, и можно получить доступ к адресу ведомого устройства Modbus RTU 0–247.

Установите «EXTENDED_ADDRESSING» в блоке данных экземпляра «MB_MASTER_DB» инструкции «MB_MASTER» на 1, чтобы включить расширенную адресацию 0-65535 к ведомому устройству Modbus RTU. Чтобы установить EXTENDED_ADDRESSING, выполните следующие действия:

Сначала найдите «системный блок» → «программный ресурс», дважды щелкните «MB_MASTER_DB» и проверьте «EXTENDED_ADDRESSING» в блоке данных экземпляра «MB_MASTER_DB» инструкции «MB_MASTER».

Введите «MB_MASTER_DB.EXTENDED_ADDRESSING» в «Таблицу мониторинга» и установите бит в 1.

S7-1200 В качестве ведомого устройства Modbus RTU

Модули S7-1200, поддерживающие режим связи Modbus RTU, могут использоваться в качестве ведомых устройств Modbus RTU. Ниже в качестве примеров используются CPU1215C DC / DC / DC и CM1241 RS485 для ознакомления с этапами настройки и программирования связи ведомого устройства S7-1200 Modbus RTU.

Аппаратные и программные требования и выполненные коммуникационные задачи:

аппаратное обеспечение:
① CPU1215C DC / DC / DC (номер для заказа: 6ES7 215-1AG31-0XB0)
② CM1241 RS485 (номер для заказа: 6ES7 241-1CH30-0XB0)
③ Блок питания PS 307 (номер для заказа: 6ES7307-1KA02-0AA0)
④ ПК (с картой Ethernet)
⑤ Кабель TP Ethernet

программного обеспечения:
① STEP 7 V11 Professional SP2 UPD4 +HSP
② ModScan (это программное обеспечение стороннего производителя, которое можно загрузить из Интернета)

Коммуникационные задачи выполнены:
Считайте данные в 5 словах, начиная с DB1.DBW0 в Modbus RTU Slave CPU1215C, в 5 слов, начиная с 40001 в ModScan ведущего Modbus RTU.

1. Настройте коммуникационный модуль Modbus RTU.

Найдите «Коммуникационный модуль» → «Точка-точка» в каталоге оборудования.«CM1241 (RS485)», дважды щелкните или перетащите этот модуль в левую часть ЦП, как показано на Рисунке 1 ниже:

Рисунок 1 Настройка коммуникационного модуля

Затем с помощью мыши выберите модуль CM1241 (RS485) в «Обзоре устройств» и настройте параметры аппаратного интерфейса этого модуля в «Свойства» → «Конфигурация порта». Как показано на Рисунке 2 ниже:

Следующее принимает скорость передачи = 9,6 Кбит / с, проверка четности = без проверки четности, бит данных = 8 символов, стоповый бит = 1, и другие сохраняют настройки по умолчанию в качестве примера.

Рисунок 2 Настройки порта RS485

Наконец, убедитесь, что идентификатор оборудования равен 271 в «идентификаторе оборудования», как показано на рисунке 3 ниже:

Рисунок 3 Идентификатор оборудования

2. Добавить OB запуска

В дереве проекта выберите «CPU1215C DC / DC / DC» → «Программный блок» → «Добавить новый блок», во всплывающем окне выберите «Организационный блок OB» → «Запуск», добавьте OB запуска 100, как показано на рисунке 4 ниже Показать:

Рисунок 4 Добавление OB запуска

3. Вызвать инструкцию MB_COMM_LOAD.

Чтобы установить порт в режим связи Modbus RTU сразу после его запуска, в OB 100 можно вызвать команду «MB_COMM_LOAD». При вызове инструкции «MB_COMM_LOAD» интерфейс для создания соответствующего блока данных экземпляра появится автоматически, как показано на рисунке 5 ниже:

Рисунок 5 Вызов инструкции MB_COMM_LOAD

Нажмите «ОК», чтобы создать экземплярный блок данных для этой инструкции и назначить адреса каждому контакту ввода / вывода. Обратите особое внимание на входной вывод MB_DB, чтобы он указывал на блок фоновых данных инструкции «MB_SLAVE», как показано на рисунке 6 ниже:

Примечание:Бит ввода команды «MB_COMM_LOAD» «REQ» должен запускаться по нарастающему фронту. Поскольку OB 100 выполняется только один раз при запуске S7-1200, в этом примере «REQ» устанавливается в «TRUE».

Рисунок 6 Инструкция MB_COMM_LOAD

Значение параметров инструкции MB_COMM_LOAD показано в Таблице 1 ниже:

Штырь

Описание

EN

Давать возможность

REQ

Выполните инструкцию по нарастающему фронту

PORT

Аппаратный идентификатор коммуникационного порта

BAUD

Выбор скорости передачи: 3600, 6000, 12000, 2400, 4800, 9600, 19200, 38400, 57600, 76800, 115200 (Примечание: все остальные значения недействительны)

PARITY

Выбор проверки четности: 0-нет; 1-нечетная проверка; 2-четная проверка

FLOW_CTRL

Выбор управления потоком: 0- (значение по умолчанию) без управления потоком

RTS_ON_DLY

Выбор задержки RTS: 0- (значение по умолчанию)

RTS_OFF_DLY

Выбор задержки выключения RTS: 0- (значение по умолчанию)

RESP_TO

Тайм-аут ответа: значение по умолчанию = 1000 мс. MB_MASTER определяет время (в миллисекундах) для ответа ведомого устройства.

MB_DB

Блок данных экземпляра, используемый инструкцией MB_MASTER или MB_SLAVE.

DONE

Бит завершения: устанавливается в 1, когда инструкция выполняется без ошибок.

ERROR

Бит ошибки: 0 — ошибка не обнаружена; 1 — ошибка обнаружена. Код ошибки выводится в параметре СОСТОЯНИЕ.

STATUS

Код ошибки конфигурации порта

Таблица 1 Значение параметра инструкции MB_COMM_LOAD

4. Создайте блок данных MB_HOLD_REG.

Создайте блок БД через «Программный блок» → «Добавить новый блок», выберите «Блок данных (БД)», выберите «Стандартный, совместимый с S7-300 / 400», нажмите «ОК», чтобы определить область данных как массив из 5 слов. , как показано на рисунке 7 ниже:

Примечание. Тип доступа к БД, используемый MB_HOLD_REG, должен быть стандартным и совместимым с S7-300 / 400.

Рисунок 7 Создание блока данных MB_HOLD_REG

5. Вызвать инструкцию MB_SLAVE.

Вызовите инструкцию MB_SLAVE в OB1, и интерфейс для создания соответствующего блока фоновых данных автоматически появится при вызове этой инструкции, как показано на рисунке 8 ниже:

Рисунок 8 Вызов инструкции MB_SLAVE

Нажмите «ОК», чтобы создать блок фоновых данных для этой инструкции, и назначьте адреса каждому контакту ввода / вывода, как показано на рисунке 9 ниже:

S7-1200 служит в качестве ведомого устройства Modbus RTU, MB_HOLD_REG указывает на указатель блока данных регистра временного хранения Modbus. Настройки следующие: MB_HOLD_REG = P # DB3.DBX0.0 WORD 5.

Соответствующее соотношение показано в Таблице 2 ниже:

Главная станция Modbus RTU Адрес Modbus Адрес буфера данных подчиненного устройства Modbus RTU CPU1215C
40001 DB3.DBW0
40002 DB3.DBW2
40003 DB3.DBW4
40004 DB3.DBW6
40005 DB3.DBW8

Таблица 2 Соответствие адреса Modbus

Рисунок 9 Инструкция MB_SLAVE

Штырь Описание

EN

Давать возможность

MB_ADDR

Адрес станции ведомого устройства Modbus. Диапазон адресов по умолчанию: от 0 до 247; расширенный диапазон адресов: от 0 до 65535

MB_HOLD_REG

Указатель на блок данных регистра временного хранения Modbus. Блок данных должен быть создан с типом доступа «стандартно совместим с S7-300 / 400».

NDR

Готовы новые данные: 0 — нет новых данных; 1 — указывает, что главная станция Modbus записала новые данные

DR

Считывание данных: 0 — данные не считываются; 1 — указывает, что главная станция Modbus прочитала новые данные

ERROR

Бит ошибки

STATUS

код ошибки

Таблица 3 Значение параметра инструкции MB_SLAVE

MB_SLAVE Функция Modbus S7-1200
Код Функции Область данных Диапазон адресов Область данных Адрес процессора
01 Прочитать бит Выход 1 к 8192 Область изображения процесса вывода Q0.0 — Q1023.7
02 Прочитать бит войти С 10001 по 18192 Область входного изображения От I0.0 до I1023.7
04 Чтение войти С 30001 по 30512 Область входного изображения IW0 — IW1022
05 Бит записи Выход 1 к 8192 Область изображения процесса вывода Q0.0 — Q1023.7
15 Бит записи Выход 1 к 8192 Область изображения процесса вывода Q0.0 — Q1023.7

Таблица 4 Отображение адреса Modbus в область образа процесса

MB_SLAVE Функция Modbus S7-1200
Код Функции Область данных Диапазон адресов Область данных БД ЦП Адрес процессора
03 Чтение Регистр холдинга С 40001 по 49999 MB_HOLD_REG Слово 1 в слово 9999
С 400001 по 465535 Слово 1 в слово 65535
06 Письмо Регистр холдинга С 40001 по 49999 MB_HOLD_REG Слово 1 в слово 9999
С 400001 по 465535 Слово 1 в слово 65535
16 Письмо Регистр холдинга С 40001 по 49999 MB_HOLD_REG Слово 1 в слово 9999
С 400001 по 465535 Слово 1 в слово 65535

Таблица 5 Сопоставление адреса Modbus с областью хранения ЦП

6. Настройки главного программного обеспечения Modbus.

Примечание:Клиентский компьютер протестирован с помощью программного обеспечения ModScan, которое является сторонним программным обеспечением, которое можно загрузить из Интернета.

Сначала установите соединение в открытом программном обеспечении ModScan и установите параметры режима RTU: скорость передачи данных Baud = 9600, бит данных Data = 8, стоповый бит Stop = 1, четность = NONE, как показано на рисунке 10 ниже:

Рисунок 10 Установка соединения ModScan

Выбрать файл»«Новый» Откройте интерфейс связи ModScan, установите адрес подчиненного устройства Modbus RTU Device Id = 1, начальный адрес данных Address = 0001, длину данных = 5, код функции типа данных Modbus 03, как показано на рисунке 11 ниже:

Примечание:Настройка идентификатора устройства должна соответствовать адресу, установленному входным выводом «MB_ADDR» в инструкции «MB_SLAVE».

Рисунок 11 Настройка ModScan

7. Результаты тестирования Modbus RTU.

Откройте «таблицу мониторинга» проекта CPU1215 DC / DC / DC в программном обеспечении STEP 7 V11 Professional SP2 UPD4, запишите значение 21 в DB3.DBW0, запишите значение 22 в DB3.DBW2, запишите значение 23 в DB3. DBW4 и DB3. DBW6 записывает значение 24, а DB3.DBW8 записывает значение 25. Главная станция ModScan считывает значение 21 адреса подчиненной станции S7-1200 Modbus RTU DB3.DBW0, значение 22 DB3.DBW2, значение 23 DB3.DBW4, значение 24 DB3.DBW6 и значение 25 DB3.DBW8 соответственно.Прибыл по адресам 40001, 40002, 40003, 40004, 40005. Как показано на Рисунке 12 ниже:

Рисунок 12 Результаты тестирования Modbus RTU

Инструкции MB_COMM_LOAD и MB_SLAVE Код ошибки STATUS

STATUS(W#16#) Описание
0000 Ошибок на порте нет
8180 Неверное значение идентификатора порта
8181 Неверное значение скорости передачи
8182 Недействительное значение четности
8183 Неверное значение управления потоком
8184 Неверное значение тайм-аута ответа
8185 Параметр MB_DB не является блоком данных экземпляра MB_MASTER или MB_SLAVE

Таблица 6 Код ошибки STATUS инструкции MB_COMM_LOAD

STATUS(W#16#) Описание
0000 Нет ошибки
80D1 Получатель выдал запрос управления потоком для приостановки активной передачи и не активировал передачу в течение указанного времени ожидания.
80D2 Запрос на передачу прекращен
80E0 Сообщение было прервано, потому что буфер приема был заполнен
80E1 Сообщение было прервано из-за ошибки четности
80E2 Сообщение было прервано из-за ошибки кадрирования
80E3 Сообщение было прервано из-за ошибки переполнения
80E4 Сообщение было прервано, поскольку указанная длина превышает общий размер буфера.
8180 Неверное значение идентификатора порта или ошибка команды MB_COMM_LOAD
8186 Недействительный адрес станции Modbus
8187 Неверный указатель на MB_HOLD_REG
818C Указатель MB_HOLD_REG на память M или DB (адрес символа и прямой адрес, разрешенный в области DB) недействителен.

Таблица 7 Значение параметра STATUS инструкции MB_SLAVE (ошибка связи и конфигурации)

STATUS(W#16#)

Код ответа от ведомого

Описание

8380 Не отвечает CRC ошибка
8381 01

Код функции не поддерживается или код функции не поддерживается в трансляции

8382 03 Ошибка длины данных
8383 02 Адрес данных неверен или адрес превышает допустимый диапазон, взятый DATA_PTR
8384 03 Ошибка значения данных
8385 03 Это значение диагностического кода данных не поддерживается

Таблица 8 Значение параметра STATUS инструкции MB_SLAVE (ошибка протокола Modbus)

ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ:

Почему возникает ошибка при запуске инструкции «MB_SLAVE», выходной бит «ERROR» = 1 и слово состояния выхода «STATUS» = 16 # 8187?

Слово состояния вывода «STATUS» = 16 # 8187 указывает, что указатель на MB_HOLD_REG недействителен. Следующие две ситуации вызовут указанную выше ошибку:

  • В программе нет блока DB, соответствующего входному выводу «MB_HOLD_REG» инструкции «MB_SLAVE».
  • При создании блока DB, соответствующего входному выводу «MB_HOLD_REG» инструкции «MB_SLAVE», была выбрана «Только адресация символа».

Решения следующие:

  • Создайте новый блок DB, соответствующий входному выводу «MB_HOLD_REG» инструкции «MB_SLAVE».
  • При создании блока DB, соответствующего входному выводу «MB_HOLD_REG» инструкции «MB_SLAVE», можно выбрать только «стандарт, совместимый с S7-300 / 400».

Параметр тайм-аута подключения

Когда сеть связи S7-1200 Mobus RTU содержит несколько подчиненных станций, из-за характеристик сети опроса, данные только одной станции могут быть прочитаны или записаны одновременно. Таким образом, следующие факторы будут влиять на окончательное общее время опроса:

1. Время установки скорости передачи данных (бод).

2. Объем коммуникационных данных на сайт.

3. Количество станций

4. Расстояние связи

5. Время подключения каждого сайта.

Будь то помехи сигнала, качество оборудования или временное отключение станции из-за инженерных нужд, время опроса системы связи будет значительно увеличено из-за увеличения «времени соединения каждой станции». В связи Modbus RTU S7-1200 есть в основном три параметра, относящиеся к настройке «времени соединения каждой станции».

1. Время отклика ведомого RESP_TO

Как показано на рисунке 1, блок инициализации MB_COMM_LOAD версии V2.x может установить параметр RESP_TO времени отклика ведомого устройства:

Установите время ответа ведомой станции с одним подключением в диапазоне от 5 мс до 65535 мс (по умолчанию 1000 мс); то есть, если ведомая станция не отвечает в течение этого периода времени, MB_MASTER завершит запрос после отправки указанного количества запросов на повтор. И это вызывает сообщение об ошибке 80C8.

Рисунок 1. Настройки параметра RESP_TO

Примечание. Как показано на рисунке 2, частота выполнения ведомого устройства Modbus должна быть по крайней мере меньше времени отклика, установленного параметром RESP_TO (необходимо учитывать время задержки отклика) для нормальной связи.

Рисунок 2. Время отклика ведомого.

2. Количество повторных попыток RETRIES

В блоке данных экземпляра функционального блока инициализации MB_COMM_LOAD вы можете установить параметр RETRIES для количества попыток:

Количество попыток до того, как главная станция вернет код ошибки отсутствия ответа 0x80C8. (Значение по умолчанию — 2 раза)
Примечание. Этот параметр представляет количество повторных подключений после того, как исходное подключение не получило ответа; то есть по умолчанию, например, 2 раза, а фактическое количество попыток подключения — 3 раза.

Рисунок 3 Настройки параметра RETRIES

Примечание. После изменения параметра RETRIES необходимо повторно включить вывод REQ функционального блока MB_COMM_LOAD, иначе измененный параметр не вступит в силу.

3. Параметр синхронизации ведущей станции Blocked_Proc_Timeout

Когда Done и Error не установлены в 1 по каким-либо причинам (например, запрос главной станции, но вызов функционального блока главной станции останавливается до того, как запрос будет полностью завершен), необходимо указать время синхронизации, который устанавливается после наступления времени Бит для выполнения следующего функционального блока или опроса следующей станции.

Блок фоновых данных MB_Master предоставляет параметр синхронизации главной станции Blocked_Proc_Timeout (диапазон от 0 до 5,5 с, по умолчанию 3 с)

Предыдущий RESP_TO соответствует времени ответа подчиненной станции, а Blocked_Proc_Timeout — времени синхронизации главной станции.Этот функциональный параметр используется для предотвращения монополизации или блокировки доступа к порту отдельной инструкцией MB_Master.

Рисунок 4. Настройки параметра Blocked_Proc_Timeout

ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ:

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

Как правило, S7-1200 может одновременно настраивать два параметра: время отклика подчиненной станции RESP_TO и количество повторных попыток RETRIES, которые используются для уменьшения увеличенного времени цикла опроса, когда подчиненная станция Modbus отключается или временно выключается. .
Пример: по умолчанию система пытается подключиться 3 раза, каждый раз по 1 с, всего 3 с;
Время отклика RESP_TO подчиненной станции может быть соответствующим образом уменьшено в соответствии с фактическими рабочими условиями проекта. Это время невозможно оценить.Рекомендуется протестировать несколько раз, чтобы убедиться, что каждая подчиненная станция может быть подключена нормально и стабильно, и установить это время как можно меньшим.
Возьмем для примера настройку 500 мс. Затем установите RETRIES на 0. То есть для каждой подчиненной станции главная станция пытается подключиться только один раз, что в сумме занимает 500 мс.

MB_MASTER сообщил об ошибке 8200 (порт занят обработкой запроса на передачу), Как с этим бороться?

Эта ситуация вызвана тем, что ни DONE, ни ERROR для MB_MASTER не установлены, что конфликтует с последующим MB_MASTER. Убедитесь, что время для подключения к следующему MB_MASTER больше, чем установленное время Blocked_Proc_Timeout (по умолчанию 3S).

Время на прочтение
9 мин

Количество просмотров 9.8K

Продолжаем тему программирования протокола Modbus TCP на контроллерах Simatic S7-1500. В прошлый раз речь шла о серверной части, сегодня опишем клиентскую. Клиент Modbus TCP — это узел, который генерирует запросы к серверу, т.е. запрашивает данные и передает уставки/команды. В терминологии Modbus RTU это «мастер», ведущее устройство. В отличии от RTU, в протоколе TCP может быть несколько «мастеров» (правильно — клиентов).

Программировать клиентскую сторону сложнее. Если для сервера достаточно одного вызова функционального блока и одного блока данных, то с клиентом не все так просто. Во-первых, клиент может обмениваться данными с несколькими серверами, что на практике и происходит. Во-вторых, к одному серверу может быть (и бывает) больше одного запроса — прочитать входные регистры, прочитать регистры хранения, записать команды в выходные «койлы», и все это с одним «абонентским устройством». В-третьих, не забываем про «остроконечный» и «тупоконечный» порядок байт в словах разных аппаратных платформ, при несовпадении байты необходимо переворачивать самостоятельно.

По этой причине имеет смысл программировать клиента на языке SCL (ST в терминологии МЭК 61131-3) и «завернуть» всю обработку в функциональный блок. Для большей реалистичности в данном примере контроллер будет общаться с двумя серверами Modbus TCP с несколькими запросами к каждому.

В первую очередь создадим функциональный блок ModbusClient на языке SCL и добавим вызов его экземпляра в OB1.

Далее в области STAT переменных функционального блока необходимо прописать две структуры TCON_IP_v4. Зачем две? Затем, что у нас два соединения с двумя разными серверами. Фактически у нас два разных соединения (connection) и каждое необходимо описать. Как я говорил ранее, возможно применить и конфигурируемые соединения, но в данном примере они не используются.

Объявлено две структуры для связи с двумя серверами

Далее необходимо заполнить обе структуры. Это возможно сделать как программным кодом, так и просто занести необходимые значения данных. Пойдем по второму пути.

Первое поле, InterfaceId. Идентификатор интерфейса (или «сетевой карты») нашего контроллера. Клиент Modbus работает на интерфейсе №1 контроллера, смотрим его ID в конфигурации устройства.

Его ID равен 64. Обращаю внимание, что нужен идентификатор именно интерфейса, а не его портов.

Следующее поле структуры, ID. Это идентификатор соединения. Не путать с идентификатором интерфейса. Не путать с «номером» модбас-устройства. Это некий «внутренний логический номер» коннекшена, который программист назначает самостоятельно в диапазоне от 1 до 4096. У каждого «коннекшена» должен быть свой уникальный идентификатор. Ответственность за корректное присвоение целиком на ваших плечах. Назначаем ID = 1 и едем дальше.

Далее идет тип соединения, ConnectionType — TCP или UDP. По умолчанию значение этого поля 0x0B в hex или 11 в dec. Оставляем по умолчанию, TCP.

Флаг ActiveEstablished. Выставляем его в «истину». В случае клиента именно наша сторона должна инициировать соединение.

RemoteAddress. Тут пишем IP-адрес нашего первого сервера. Пусть будет 192.168.43.100.

RemotePort. Номер порта, по которому сервер Modbus TCP будет отвечать на наши запросы. По умолчанию все сервера этого протокола должны «слушать» порт 502.

LocalPort. Оставляем равным нулю.

В итоге, описание соединения с первым сервером выглядит следующим образом.

Описание соединения с первым сервером

Вторая структура заполняется аналогично. Разумеется, пишем другой ID и другой IP адрес. В итоге получаем.

Сделаем первые робкие шаги и попробуем прочитать один регистр хранения с одного сервера. Для начала надо перетащить ФБ MB_CLIENT из библиотеки в программу.

После перетаскивания появится диалогое окно о создании экземпляра. Выбираем мульти-экземпляр и немного корректируем имя.

Выбираем мультиэкзепляр

Промежуточный итог

Приведем вызов в «человеческий вид»

Кратко пройдемся по параметрам этого вызова. Подробное описание — в нашей горяч0 любимой документации, которую мало кто, почему-то, читает.

REQ активирует выполнение опроса. Пока REQ = TRUE, клиент проводит чтение данных с сервера или запись данных на сервер.

DISCONNECT — разорвать соединение

MB_MODE — «режим» работы клиента. В совокупности со входом MB_DATA_ADDR оказывает влияние на используемую функций Modbus TCP. Возможные значения описаны в документации. Для чтения одного или нескольких регистров хранения значение MODE должно быть равно 0.

MB_DATA_ADDR указывает адрес в адресном пространстве протокола Modbus TCP. Значение нашего примера 40001 — «первый регистр хранения»

MB_DATA_LEN — количество читаемых или записываемых величин. В нашем случае — единица. В итоге все три указанных выше параметра означают «читать один регистр хранения начиная с адреса 40001»

MB_DATA_PTR — переменная или структура данных, куда мы записываем прочитанное значение. Переменная может быть в любом блоке данных, я объявил локальную статическую переменную SingleHR типа INT, размер которой равен 2 байтам и совпадает с размером одного регистра хранения Modbus. При несовпадении размерности читаемой области данных с локальным «хранилищем» вызов функционального блока завершится ошибкой.

CONNECT — уже созданная нами структура типа TCON_IP_V4

Остается только запустить на ноутбуке сервер Modbus, скомпилировать и загрузить программу контроллера, и… не получить ничего. Сервер не отвечает. Ответов нет. Вообще ничего нет. Ничего. По буквам — Николай, Илья, Харитон… ( «Остапа понесло» ). Для того, чтобы уточнить ошибку, необходимо доработать программу следующим образом.

Дело в том, что флаги успешного (DONE) или неуспешного (ERROR) вызова блока «живут» всего один цикл сканирования программы. Естественно, невозможно заметить настолько быстрое изменение. Поэтому по флагу ошибки я копирую статус вызова в отдельную переменную. А по флагу успешного выполнения — обнуляю статус.

Кроме того, добавлены флаги «управления» запросом и соединением.

Немного прокоментирую ошибку, которая возникла у меня. В моем случае код ошибки был 80C6. В описании на блок MB_CLIENT этой ошибки нет, поэтому я вбил код ошибки в поиск справочной системы и нашел ссылку на функцию TCON (так же при неоднозначных ошибках можно искать и среди TSEND, TRECEIVE и прочих похожих блоках). Описание: The connection partner cannot be reached (network error). Ошибки сети. Ответ был очень прост и заключался в том, что программа-иммитатор Modbus не была прописана в разрешениях встроенного в Windows Firewall. Точнее, разрешение на ее работу было настроено только на частные сети, а интерфейс программатора был назначен в качестве публичной сети. Это лишний раз подчеркивает, что техника виновата в последнюю очередь, а чаще всего ошибку надо искать в радиусе закругления рук и в соответствии этого радиуса ГОСТам. После изменения настроек брэндмауэра ОС обмен заработал.

Усложним теперь задачу самую малость, и попробуем считать с сервера одну вещественную переменную. Одна вещественная переменная (REAL) — это 4 байта. Или 2 регистра. Итого, в вызове я увеличил количество читаемых регистров до 2, и изменил «указатель» на прочитанные данные. Этот указатель все еще весьма прост — это внутренняя статическая переменная типа REAL (дальше будет интереснее).

Хотелось бы обратить внимание на одну важную деталь. Если прогружать измененное прикладное ПО на горячую, с переинициализацией переменных нашего функционального блока ModbusClient в то время, когда контроллер ведет опрос сервера Modbus, то обмен может прекратиться, и на выходе блока будет стоять статус 80A3. Связано это, разумеется, со вмешательством во внутренние структуры обмена (из-за переинициализации всего блока). В моем случае это приводило к полной невозможности коммуникаций до рестарта контроллера переключателем старт/стоп. Я намеренно изменил сейчас функциональный блок (добавил еще одну переменную), чтобы продемонстрировать эту ошибку:

После стоп/старта контроллера и «поднятия» флага Srv1Req обмен успешно возобновляется. Чтобы не допустить такого «зависания» обмена (как ни крути, это частный случай) необходимо «поднимать» флаг Srv1Disconnect, проводить изменения в переменных функционального блока (имеются в виду именно переменные, т.е. интерфейсная часть блока, а не сам программный код), выполнять загрузку с переинициализацией, а потом вручную возобновлять обмен. Помните же, что флаги REQ и DISCONNECT у нас подключены к переменным, и этими переменными можно управлять, как вручную, так и посредством программного кода.

Пока мы не продвинулись дальше, хочется продемонстрировать описанный выше случай с «разноконечностью» (little-endian и big-endian) данных. В моем примере сервер modbus держит в двух регистрах хранения вещественную переменную со значением 0.666. Наш клиент Modbus вместо этого числа читает 1.663175E+38, что сильно отличается от нужного (увы, вне зависимости от того, покупаем мы или продаем). Связано это, конечно же, с порядком байт в словах и порядком самых слов в двойном слове. Пробуем разрешить ситуацию. Доработаем программный код следующим образом.

Инструкция SWAP меняет порядок байт (конкретно тут — в двойном слове). Но в данном случае она не помогает, на выходе (в переменной Data.Test) все еще находится неправильное значение. Скорее всего, это означает, что сервер отдает регистры в «неправильном» порядке, а байты в «правильном», то есть информация «перемешалась». Радует, что байта всего 4 и составить их в нужном порядке — дело техники.

Итак, снова модифицируем запрос. Складываем результат чтения двух регистров в массив из 4 байт и объявляем еще один массив из 4 байт, которым и будем манипулировать.

Функция Deserialize «складывает» массив из байт в какое-либо конкретное значение, в данном случае — в вещественную переменную. Потребовалась всего одна итерация, чтобы получить корректное значение переменной с сервера Modbus.

Перед тем, как вернуться к штатной рутинной работе, необходимо рассказать про одну очень частую ошибку, возникающую при обмене по протоколу Modbus TCP, а именно — указание или неуказание адреса (номера) подчиненного устройства (сервера). В протоколе Modbus RTU все «слейвы» имеют свой уникальный адрес в сети. Мастер, формируя запрос, указывает адрес слейва, однобайтовое поле в заголовке пакета. Unit ID, Device ID, адрес — неважно, как называется, смысл один. В протоколе Modbus TCP адресом «абонентского устройства» является его IP-адрес. Тем не менее, поле Device ID в заголовке сохранилось. И это часто вносит путаницу, непонимание и ошибки. Дело в том, что в соответствии со спецификациями «обычный» сервер Modbus TCP должен игнорировать поле ID в запросе к нему. Unit ID учитывается лишь для устройств, преобразующих Modbus RTU в Modbus TCP (гейты, шлюзы, конвертеры протоколов и так далее). На практике же многие сервера Modbus проверяют и однобайтовый адрес Unit ID. При несовпадении «своего» адреса и адреса в запросе, сервер в этом случае чаще всего не отправляют никакую ответную телеграмму, и клиент возвращает ошибку опроса. Если на практике вы столкнетесь с таким странным поведением, то откройте экземпляр функционалного блока клиента Modbus и поищите в его статических переменных байтовую величину MB_Unit_ID. Это и есть «адрес» подчиненного устройства, т.е. сервера Modbus. По умолчанию его значение равно 0xFF или 255. «Нормальные» сервера его игнорируют, достаточно уже самого факта установления соединения по протоколу TCP/IP. Если же попался «ненормальный», то поставьте тут вручную Unit ID вашего устройства. Связь должна установиться.

Кроме того, в статических переменных есть ряд полезных настроек, таких, как таймауты, количество повторных попыток запроса и т.д. Изучить эти переменные можно во встроенной справке.

Закончив описание подводных камней, вернемя к изначальной задаче. Будем считывать с первого сервера 3 вещественных переменных (6 регистров), начиная с 40001, и записывать одну (начальный адрес 40011). Предполагаем, что порядок слов и байт «правильный». Шесть регистров (шесть «слов» данных) и три вещественных переменных. Можно, конечно, просто «в лоб» читать информацию в локальный массив байт, а потом средствами дополнительной обработки представлять их в виде трех вещественных величин (тем же Deserialize, например), но не стоит создавать себе лишнюю работу. Гораздо удобнее будет сразу «разложить» читаемую информацию в собственную структуру. В блоке данных Data я создаю структуру, состоящую из трех полей типа REAL.

Обращаю внимание, что блок данных Data должен быть «стандартным» или «неоптимизированным», в противном случае вы будете получать ошибку опроса, к примеру — 818B.

Разумеется, содержание этой структуры полностью зависит от того, в каком порядке и в какой форме «отдаются» данные от сервера.

Программа обретает следующий вид, и данные успешно читаются.

0.5, 0.7, 0.33 (с) ВИА «Несчастный случай»

Теперь необходимо добавить еще один запрос — на запись одной вещественной уставки (двух регистров). Необходимо понимать, что для обмена с одним сервером по одному соединению у нас выделен один экземпляр функционального программного блока коммуникаций. И если выполнять второй запрос, не дожидаясь результатов первого — не будет работать ни один. Необходимо работать последовательно — вначале выполнить один запрос, а после его завершения формировать следующий. Для этого достаточно добавить в наш программный блок переменную «номер шага» (или «номер запроса», если вам так удобнее).

В итоге получаем вот такую программу.

Переменная, на основании который выбирается опрос, называется у меня Server1Query (будет еще Server2Query). Выбор запроса выполнется в операторе CASE. «Номер запроса» меняется на следующий лишь в случае успешного или неуспешего выполнения текущего опроса.

Для того, чтобы организовать опрос второго сервера, достаточно лишь подготовить хранилище для локальных переменных от сервера и к серверу и дописать существующую программу. Отличия в ней минимальные, тот же принцип, отличаются лишь все переменные (включая экземпляр функциональого блока MODBUS_CLIENT) и запрашивамые/записывемые данные.

Со вторым сервером у нас настроено отдельное соединение, есть отдельный экземпляр функционального блока modbus. Его мы можем вызывать «одновременно» с коммуникациями первого сервера, поэтому в общей программе есть два оператора CASE, которые работают независимо друг от друга.

В принципе, логичным будет добавить еще анализ ответа на конкретный запрос и формирование признака достоверности данных, и сделать некоторые другие доработки. Например — оправлять команды и уставки не принудительно, а лишь по изменению.

Тем не менее, описание работы с протоколом Modbus TCP на этом я заканчиваю. В следующий раз посмотрим на программирование протокола Modbus RTU.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *