Данная статья описывает основы работы с протоколом Modbus. В статье вы можете найти:
Modbus — коммуникационный протокол, основанный на клиент-серверной архитектуре. В данной статье мы рассмотрим основы протокола и базовые принципы работы. Кроме того, вы можете ознакомиться с конкретными примерами работы протокола Modbus, изучив описания контроллеров, использующих этот протокол, к примеру, OSM-17RA, а так же скачав программу Modbus Terminal, позволяющую удобно работать с различными регистрами Modbus.
Протокол Modbus разработан для использования в программируемых логических контроллерах, таких, как управление электроприводом. В настоящее время является очень распространенным протоколом, используемых в различных промышленных системах. К примеру, данный протокол используется в контроллерах шаговых двигателей Онитекс. Широко используется для передачи данных последовательные линии связи, основанных на интерфейсах RS-485, RS-422, RS-232. В начале развития применялся интерфейс RS-232, как один из наиболее простых промышленных интерфейсов для последовательной передачи данных. В настоящее время протокол часто используется поверх интерфейса RS-485, что позволяет добиться высокой скорости передачи, больших расстояний и объединения нескольких устройств в единую сеть, тем более что протокол Modbus поддерживает адресацию. Широкая распространенность протокола Modbus, обусловленная его простотой и надежностью, позволяет легко интегрировать устройства, поддерживающие Modbus, в единую сеть.
Основной особенностью протокола является наличие в сети одного ведущего устройства - master. Только ведущее устройство может опрашивать остальные устройства сети, которые являются ведомыми (slave). Подчиненное устройство не может самостоятельно инициировать передачу данных или запрашивать какие-либо данные у других устройств, работа сети строится только по принципу "запрос-ответ". Мастер может так же выдать широковещательный запрос, адресованный всем устройствам в сети, в таком случае ответное сообщение не посылается.
Существует три типа протокола Modbus: Modbus ASCII, Modbus RTU и Modbus TCP. Устройства Onitex поддерживают протокол Modbus RTU, поэтому мы в дальнейшем будем иметь в виду прежде всего этот протокол.
Пакет данных в Modbus выглядит следующим образом:
Адрес | Код функции | Данные | Контрольная сумма.
Адрес - это поле, содержащее номер устройства, которому адресован запрос. Каждое устройство в сети должно иметь уникальный адрес. Устройство отвечает только на те запросы, которые поступают по его адресу, во избежание конфликтов. При этом, ведомое устройство в своем ответе так же посылает поле Адрес , кроме широковещательного запроса (когда ответа от ведомого быть вообще не должно).
Код функции содержит номер функции модбаса (о функциях будет сказано ниже). Функция может запрашивать данные или давать команду на определенные действия. Коды функций являются числами в диапазоне от 1 до 127. Функции с номерами от 128 до являются зарезервированными для пересылки в ответном сообщении информации об ошибках.
В поле Данные содержится информация, которую передает мастер слэйву, либо наоборот в случае ответного сообщения. Длина этого поля зависит от типа передаваемых данных.
Поле Контрольная сумма является важным элементом протокола: в нем содержится информация, необходимая для проверки целостности сообщения и отсутствия ошибок передачи.
Максимальный размер пакета для сетей RS232/RS485 — 256 байт, для сетей TCP — 260 байт.
Существует три типа функций:
При использовании режима Modbus RTU сообщение начинается с так называемого интервала тишины, равного времени передачи 3.5 символов, при заданной скорости обмена. Первым полем передается адрес устройства. Вслед за последним передаваемым символом также следует интервал тишины продолжительностью не менее 3.5 символов. Новое сообщение может начинаться после этого интервала. Фрейм сообщения передаётся непрерывно. Если интервал тишины продолжительностью 1.5 возник во время передачи фрейма, принимающее устройство должно игнорировать этот фрейм как неполный. Если новое сообщение начнется раньше интервала 3.5 символа, принимающее устройство воспримет его как продолжение предыдущего сообщения. В этом случае устанавливается ошибка CRC (несовпадение контрольной суммы).
Типы данных протокола Modbus представлены в таблице:
Для чтения значений из этих выше таблиц данных используются функции с кодами 1—4 (0x01—0x04)
:
1 (0x01)
— чтение значений из нескольких регистров флагов (Read Coil Status)
2 (0x02)
— чтение значений из нескольких дискретных входов (Read Discrete Inputs)
3 (0x03)
— чтение значений из нескольких регистров хранения (Read Holding Registers)
4 (0x04)
— чтение значений из нескольких регистров ввода (Read Input Registers)
Запрос состоит из адреса первого элемента таблицы, значение которого требуется прочитать, и количества считываемых элементов. Адрес и количество данных задаются 16-битными числами, старший байт каждого из них передается первым.
В ответе передаются запрошенные данные. Количество байт данных зависит от количества запрошенных элементов. Перед данными передается один байт, значение которого равно количеству байт данных.
Запись одного значения происходит при помощи следующих функций:
5 (0x05)
— запись значения одного флага (Force Single Coil)
6 (0x06)
— запись значения в один регистр хранения (Preset Single Register)
Команда состоит из адреса элемента (2 байта) и устанавливаемого значения (2 байта). Если команда выполнена успешно, ведомое устройство возвращает копию запроса.
Запись нескольких значений задается функциями:
15 (0x0F)
— запись значений в несколько регистров флагов (Force Multiple Coils)
16 (0x10)
— запись значений в несколько регистров хранения (Preset Multiple Registers)
Команда состоит из адреса элемента, количества изменяемых элементов, количества передаваемых байт устанавливаемых значений и самих устанавливаемых значений. В ответе ведомый передает начальный адрес и количество изменённых элементов.
Рассмотрим работу протокола на примере контроллера шагового двигателя. В документации на контроллер описано назначение регистров Modbus, которые в нем использованы. Для управления двигателем необходимо задать параметры контроллера, параметры вращения и непосредственно команду. Вся работа с контроллером при использовании протокола Модбас сводится к работе с регистрами, то есть чтению и записи. Наш контроллер имеет всего один тип регистров: Holding Registers. Этот тип регистров предназначен как для чтения, так и для записи параметров. В контроллере использовано три типа регистров: 8, 16 и 32 бита. Таким образом, для работы с ним нам понадобится использование всего лишь нескольких функций: Read Holding Registers для чтения, Preset Single Register для записи регистров размерностью 8 и 16 бит, и Preset Multiple Registers для записи дначений в регистры длиной 32 бита.
Для начала работы с контроллером необходимо установить параметры контроллера и вращения. Делается это последовательной записью нужных параметров в регистры согласно документации, используя необходимые функции. При этом, каждая запись параметра вызывает соответствующий обработчик в контроллере, который по необходимости проверяет диапазоны значений или проводит другие необходимые действия. По сути, контроллер производит прерывание по изменению значения в регистре. Такая возможность существенно расширяет возможности применения протокола Modbus.
После записи всех параметров производится запись самой команды в соответствующий регистр. Такая организация работы с протоколом Modbus весьма удобна для практического применения, так как позволяет обходиться всего лишь тремя стандартными функциями. Во время выполнения команды доступ во все регистры сохраняется, в частности, мы можем прочитать значение счетчика позиции, при необходимости обнулить его, изменить скорость, либо задать новую команду, не дожидаясь выполнения старой. Еще одной особенностью применения протокола Modbus является то, что все регистры сохраняют свои значения до их перезаписи, поэтому, если нам необходимо повторить движение с теми же параметрами, мы протсо записываем команду движения в регистр команд и двигатель повторяет прошлое задание. Это не только упрощает управление, но и уменьшает траффик между контроллером двигателя и управляющим устройством.
Таким образом, использование протокола Modbus позволило сделать управление шаговым двигателем очень простым, качественным и надежным.
Для отладки устройств с протоколом Modbus нами разработана программа OSM Modbus Terminal. Данная программа позволяет быстро освоить основные принципы управления устройствами OSM MB по протоколу Modbus RTU, проверить корректную работу устройства и быст-рее написать собственное программное обеспечение. Скачать программу можно в разделе Программное обеспечение на нашем сайте.
Программа представляет собой карту регистров, каждому из которых можно задать адрес, тип значения и название. В каждом регистре имеется возмож-ность чтения и записи значения. В окне «LogOut» можно наблюдать вывод лога по результатам каждого действия, в т. ч. и возникшие ошибки.
Для начала работы с программой необходимо установить адрес порта ПК и адрес устройства, и нажать кнопку «Connect». После этого можно производить чтение и запись в требуемые регистры. При необходимости можно сохранить названия и адреса используемых регистров кнопкой «Save». Программа написана с использованием OsmModbusDriver_SDK и может служить примером использования SDK.
Все права защищены. Перепечатка материалов с сайта возможно только с разрешения администрации
Статья посвящена промышленному протоколу ModBus — наиболее простому, а потому широко распространённому цифровому протоколу передачи данных.
Стандарт ModBus был изобретён ещё в 1979 году компанией Modicon (ныне Schneider Electric) и с того времени не утратил своей актуальности, а даже наоборот получил широкое распространение и большую популярность среди разработчиков АСУ ТП.
Преимущества:
Недостатки:
ModBus сеть объединяет одно ведущее (мастер) и несколько ведомых (слейвов). Обмен данными в сети происходит по инициативе мастера. Он может отправить запрос одному из подчинённых устройств или широковещательное сообщение сразу всем ведомым устройствам сети.
После отправки запроса мастер ожидает ответ в течение заданного времени («время таймаута»). Если в течение этого времени ответ не получен, мастер считает, что связь с ведомым отсутствует. На широковещательное сообщение ответ не предусмотрен.
Слейвы (ведомые устройства) не могут самостоятельно инициировать передачу данных. Они могут передать данные только после запроса мастера (и только те данные, которые мастер запросит).
Существует три разновидности протокола:
Для передачи ModBus сообщений используется последовательные асинхронные интерфейсы (RS232, RS485, RS422) в случае использования протоколов ASCII и RTU и Ethernet интерфейс для протокола ModBus TCP.
Использование стандартных интерфейсов делает ModBus удобным для пользователей и разработчиков.
Любой узел сети ModBus — это интеллектуальное устройство (контроллер, регулятор, датчик и др.). Согласно спецификации узел сети может иметь следующие структуры данных:
Указанные типы данных необязательны для всех устройств, поддерживающих ModBus. Например, Discrete Inputs и Coils характерны больше для .
Производитель устройства сам решает, какой тип данных сделать доступным для чтения и записи по ModBus, и об этом написано в руководстве устройства. В большинстве случае пользуются типом Holding Registers, поскольку он самый универсальный.
Как уже было сказано, обмен данными по ModBus состоит из запросов и ответов. Ведущее устройство посылает запрос одному из подчинённых устройств, указывая в запросе его адрес, или всем устройствам сразу, указывая адрес 0.
Типовой запрос или ответ состоит из следующих блоков:
Состав данных блоков отличается для RTU и TCP реализаций ModBus. Далее мы подробно рассотрим каждый из них.
ModBus ASCII мы не будем подробно рассматривать, поскольку он используется крайне редко. Состав пакета в ModBus ASCII такой же как и ModBus RTU, и отличается только типом кодирования и способом разделения пакетов.
Номер функции определяет тип запрашиваемых данных и что с ними нужно сделать (прочитать/записать).
Функций ModBus достаточно много и они разделены на три категории:
Однако, это всё лирика… На практике в большинстве случаев используются всего несколько функций, мы подробно поговорим о них в , а в этой будем рассматривать всё на примере функции Read Holding Registers (чтение регистров общего назначения).
Функция Read Holding Registers (0x03)
Функция под номером 3 — одна из самых употребимых функций, предназначена для чтения регистров общего назначения устройства.
В запросе указывается количество регистров, которые нужно прочитать и адрес первого из них.
Ответ содержит количество байт (количество регистров умноженное на 2) и значения запрошенных регистров.
Количество байт в ответе помогает ведущему устройству по мере получения данных понять, когда все данные уже получены. То есть если мастер получил третий байт с числом 200 — это означает, что ему осталось получить еще 100 байт + 2 байта контроля целостности. Это позволит ему посчитать количество пришедших байт и закончить приём, не дожидаясь, когда закончится время таймаута, отведённое слейву на ответ.
Вместо нормального ответа, содержащего запрошенные данные, подчинённое устройство может ответить ошибкой. При этом к номеру функции в ответе добавляется код 0х80 в шестнадцатеричной системе исчисления.
Обратимся к предыдущему примеру. Там подчинённое устройство ответило без ошибки и второй байт в ответе был 0х03. Если бы ответ содержал код ошибки, то к номеру функции подчинённое устройство добавило бы 0х80 и получилось бы 0х83. Вот так:
В этом примере код ошибки 02 — это один из стандартных кодов. Вот какие они бывают:
01 — функция не поддерживается. Это значит, что, возможно, функция не стандартная или просто не реализована конкретно в этом устройстве.
02 — запрошенная область памяти не доступна. Каждое устройство содержит определённое количество данных определённого типа. Например, в устройстве доступно 100 регистров общего назначения. Если при этом запросить чтение 101 регистров — возникнет ошибка 02.
03 — функция не поддержит запрошенное количество данных. Например, функция №3 «Read Holding Registers» позволяет читать от 1 до 2000 регистров общего назначения. Поэтому, даже если в подчинённом устройстве доступно для чтения 10 000 регистров, при запросе более 2000 с помощью функции №3 — возникнет эта ошибка.
04 — функция выполнена с ошибкой. Такой код ошибки будет возвращён, если есть какое-то иное препятствие для нормального выполнения команды, не охваченное тремя предыдущими кодами ошибки. Проще говоря, это такая заглушка «на всякий случай», если что-то пошло не так, но в протоколе специального кода для такой ошибки не предусмотрено.
Нужно помнить, что существуют не только стандартные функции, но ещё и пользовательские и зарезервированные. Поэтому, производители устройств, которые дополнили протокол своими функциями, возможно заложили туда другие коды ошибок. Но это всё очень большая экзотика…
Как уже говорилось, в протоколе ModBus RTU данные передаются в виде сообщений, разделённых между собой временными паузами длиной в 3,5 символа при заданной скорости передачи.
В сообщении обязательно указывается адрес получателя (или 0, если сообщение широковещательное) и номер функции.Номер функции определяет какие данные содержит сообщение и как их интерпретировать.
За номером функции идут данные. Регистры данных в ModBus 32-битные, а передаются ввиде двух 16-битных сло. Сначала идёт старший байт, затем младший.
Пример. Допустим, мы хотим прочитать из удалённого модуля сбора данных 2 регистра, начиная с первого. Адрес удалённого модуля в сети ModBus «4». Для этого воспользуемся функцией №3 Read Holding Registers.
В ответе подчинённое устройство повторяет свой адрес и номер функции, далее следует количество полезных байт в ответе. Каждый регистр состоит из двух байт (сначала идёт старший, затем младший). Значение запрошенных регистров оказались равны 11 и 22 в десятичной системе исчисления (0B и 16 в шестнадцатеричной соответственно).
О том, как использовать другие ModBus функции мы выпустим отдельную статью.
В предыдущем примере за байтами данных идут два байта проверки целостности пакета. Они являются результатом вычисления кода CRC-16 для всего сообщения.
Мастер, передавая запрос, вычисляет CRC-код и добавляет его в конец сообщения. Слейв, получив сообщение, проверяет сообщение на целостность согласно алгоритму CRC-16. Затем подчинённое устройство составляет ответ, точно так же вычисляет для него CRC и добавляет в конец пакета.
Подробно рассматривать алгоритм CRC-16 мы не будем, т.к. мы стараемся быть ближе к практике… А на практике программисту практически никогда не приходится писать блок вычисления CRC — в любой среде программирования можно найти соответствующую функцию или функциональный блок.
В данной статье мы рассмотрели общую структуру протокола ModBus и его классическую разновидность ModBus RTU. Вообще говоря, ModBus RTU — это и есть «истинный Modbus» (если отбросить ModBus ASCII, который уже устарел).
В мы поговорим о разновидности протокола ModBus TCP, который является «притягиванием за уши» классического ModBus с целью использования его в Ethernet-сетях, что, конечно же, накладывает определённые ограничения. Но об этом в следующей статье. Следите за обновлениями на LAZY SMART .
Modbus -коммуникационный протокол, основан на архитектуре ведущий-ведомый (master-slave). Использует для передачи данных интерфейсы RS-485, RS-422, RS-232, а также Ethernet сети TCP/IP (протокол Modbus TCP).
Сообщение Modbus RTU состоит из адреса устройства SlaveID, кода функции, специальных данных в зависимости от кода функции и CRC контрольной суммы.
Если отбросить SlaveID адрес и CRC контрольную сумму, то получится PDU, Protocol Data Unit.
SlaveID – это адрес устройства, может принимать значение от 0 до 247, адреса с 248 до 255 зарезервированы.
Данные в модуле хранятся в 4 таблицах.
Две таблицы доступны только для чтения и две для чтения-записи.
В каждой таблице помещается 9999 значений.
Номер регистра | Адрес регистра HEX | Тип | Название | Тип |
---|---|---|---|---|
1-9999 | 0000 до 270E | Чтение-запись | Discrete Output Coils | DO |
10001-19999 | 0000 до 270E | Чтение | Discrete Input Contacts | DI |
30001-39999 | 0000 до 270E | Чтение | Analog Input Registers | AI |
40001-49999 | 0000 до 270E | Чтение-запись | Analog Output Holding Registers | AO |
В сообщении Modbus используется адрес регистра.
Например, первый регистр AO Holding Register, имеет номер 40001, но его адрес равен 0000.
Разница между этими двумя величинами есть смещение offset.
Каждая таблица имеет свое смещение, соответственно: 1, 10001, 30001 и 40001.
Ниже приведен пример запроса Modbus RTU для получения значения AO аналогового выхода (holding registers) из регистров от #40108 до 40110 с адресом устройства 17.
11 03 006B 0003 7687
В ответе от Modbus RTU Slave устройства мы получим:
11 03 06 AE41 5652 4340 49AD
11 | Адрес устройства (17 = 11 hex) | SlaveID |
03 | Функциональный код | Function Code |
06 | Количество байт далее (6 байтов идут следом) | Byte Count |
AE | (AE hex) | Register value Hi (AO0) |
41 | (41 hex) | Register value Lo (AO0) |
56 | Значение старшего разряда регистра (56 hex) | Register value Hi (AO1) |
52 | Значение младшего разряда регистра (52 hex) | Register value Lo (AO1) |
43 | Значение старшего разряда регистра (43 hex) | Register value Hi (AO2) |
40 | Значение младшего разряда регистра (40 hex) | Register value Lo (AO2) |
49 | Контрольная сумма | CRC value Lo |
AD | Контрольная сумма | CRC value Hi |
Регистр аналогового выхода AO0 имеет значение AE 41 HEX или 44609 в десятичной системе.
Регистр аналогового выхода AO1 имеет значение 56 52 HEX или 22098 в десятичной системе.
Регистр аналогового выхода AO2 имеет значение 43 40 HEX или 17216 в десятичной системе.
Значение AE 41 HEX - это 16 бит 1010 1110 0100 0001, может принимать различное значение, в зависимости от типа представления.
Значение регистра 40108 при комбинации с регистром 40109 дает 32 бит значение.
Пример представления.
Тип представления | Диапазон значений | Пример в HEX | Будет в десятичной форме |
---|---|---|---|
16-bit unsigned integer | 0 до 65535 | AE41 | 44,609 |
16-bit signed integer | -32768 до 32767 | AE41 | -20,927 |
two character ASCII string | 2 знака | AE41 | ® A |
discrete on/off value | 0 и 1 | 0001 | 0001 |
32-bit unsigned integer | 0 до 4,294,967,295 | AE41 5652 | 2,923,517,522 |
32-bit signed integer | -2,147,483,648 до 2,147,483,647 | AE41 5652 | -1,371,449,774 |
32-bit single precision IEEE floating point number | 1,2·10−38 до 3,4×10+38 | AE41 5652 | -4.395978 E-11 |
four character ASCII string | 4 знака | AE41 5652 | ® A V R |
Приведем таблицу с кодами функций чтения и записи регистров Modbus RTU.
Код функции | Что делает функция | Тип значения | Тип доступа | |
---|---|---|---|---|
01 (0x01) | Чтение DO | Read Coil Status | Дискретное | Чтение |
02 (0x02) | Чтение DI | Read Input Status | Дискретное | Чтение |
03 (0x03) | Чтение AO | Read Holding Registers | 16 битное | Чтение |
04 (0x04) | Чтение AI | Read Input Registers | 16 битное | Чтение |
05 (0x05) | Запись одного DO | Force Single Coil | Дискретное | Запись |
06 (0x06) | Запись одного AO | Preset Single Register | 16 битное | Запись |
15 (0x0F) | Запись нескольких DO | Force Multiple Coils | Дискретное | Запись |
16 (0x10) | Запись нескольких AO | Preset Multiple Registers | 16 битное | Запись |
Эта команда используется для чтения значений дискретных выходов DO.
В запросе PDU задается начальный адрес первого регистра DO и последующее количество необходимых значений DO. В PDU значения DO адресуются, начиная с нуля.
Значения DO в ответе находятся в одном байте и соответствуют значению битов.
Значения битов определяются как 1 = ON и 0 = OFF.
Младший бит первого байта данных содержит значение DO адрес которого указывался в запросе. Остальные значения DO следуют по нарастающей к старшему значению байта. Т.е. справа на лево.
Если запрашивалось меньше восьми значений DO, то оставшиеся биты в ответе будут заполнены нулями (в направлении от младшего к старшему байту). Поле Byte Count Количество байт далее указывает количество полных байтов данных в ответе.
Пример запроса DO с 20 по 56 для SlaveID адреса устройства 17. Адрес первого регистра будет 0013 hex = 19, т.к. счет ведется с 0 адреса (0014 hex = 20, -1 смещение нуля = получаем 0013 hex = 19).
Байт | Запрос | Байт | Ответ |
---|---|---|---|
(Hex) | Название поля | (Hex) | Название поля |
11 | Адрес устройства | 11 | Адрес устройства |
01 | Функциональный код | 01 | Функциональный код |
00 | 05 | Количество байт далее | |
13 | CD | Значение регистра DO 27-20 (1100 1101) | |
00 | Количество регистров Hi байт | 6B | Значение регистра DO 35-28 (0110 1011) |
25 | Количество регистров Lo байт | B2 | Значение регистра DO 43-36 (1011 0010) |
0E | Контрольная сумма CRC | 0E | Значение регистра DO 51-44 (0000 1110) |
84 | Контрольная сумма CRC | 1B | Значение регистра DO 56-52 (0001 1011) |
45 | Контрольная сумма CRC | ||
E6 | Контрольная сумма CRC |
Состояния выходов DO 27-20 показаны как значения байта CD hex, или в двоичной системе 1100 1101.
В регистре DO 56-52 5 битов справа были запрошены, а остальные биты заполнены нулями до полного байта (000 1 1011).
Эта команда используется для чтения значений дискретных входов DI.
Пример запроса DI с регистров от #10197 до 10218 для SlaveID адреса устройства 17. Адрес первого регистра будет 00C4 hex = 196, т.к. счет ведется с 0 адреса.
Байт | Запрос | Байт | Ответ |
---|---|---|---|
(Hex) | Название поля | (Hex) | Название поля |
11 | Адрес устройства | 11 | Адрес устройства |
02 | Функциональный код | 02 | Функциональный код |
00 | Адрес первого регистра Hi байт | 03 | Количество байт далее |
C4 | Адрес первого регистра Lo байт | AC | Значение регистра DI 10204-10197 (1010 1100) |
00 | Количество регистров Hi байт | DB | Значение регистра DI 10212-10205 (1101 1011) |
16 | Количество регистров Lo байт | 35 | Значение регистра DI 10218-10213 (0011 0101) |
BA | Контрольная сумма CRC | 20 | Контрольная сумма CRC |
A9 | Контрольная сумма CRC | 18 | Контрольная сумма CRC |
Эта команда используется для чтения значений аналоговых выходов AO.
Пример запроса AO с регистров от #40108 до 40110 для SlaveID адреса устройства 17. Адрес первого регистра будет 006B hex = 107, т.к. счет ведется с 0 адреса.
Байт | Запрос | Байт | Ответ |
---|---|---|---|
(Hex) | Название поля | (Hex) | Название поля |
11 | Адрес устройства | 11 | Адрес устройства |
03 | Функциональный код | 03 | Функциональный код |
00 | Адрес первого регистра Hi байт | 06 | Количество байт далее |
6B | Адрес первого регистра Lo байт | AE | Значение регистра Hi #40108 |
00 | Количество регистров Hi байт | 41 | Значение регистра Lo #40108 |
03 | Количество регистров Lo байт | 56 | Значение регистра Hi #40109 |
76 | Контрольная сумма CRC | 52 | Значение регистра Lo #40109 |
87 | Контрольная сумма CRC | 43 | Значение регистра Hi #40110 |
40 | Значение регистра Lo #40110 | ||
49 | Контрольная сумма CRC | ||
AD | Контрольная сумма CRC |
Эта команда используется для чтения значений аналоговых входов AI.
Пример запроса AI с регистра #30009 для SlaveID адреса устройства 17. Адрес первого регистра будет 0008 hex = 8, т.к. счет ведется с 0 адреса.
Байт | Запрос | Байт | Ответ |
---|---|---|---|
(Hex) | Название поля | (Hex) | Название поля |
11 | Адрес устройства | 11 | Адрес устройства |
04 | Функциональный код | 04 | Функциональный код |
00 | Адрес первого регистра Hi байт | 02 | Количество байт далее |
08 | Адрес первого регистра Lo байт | 00 | Значение регистра Hi #30009 |
00 | Количество регистров Hi байт | 0A | Значение регистра Lo #30009 |
01 | Количество регистров Lo байт | F8 | Контрольная сумма CRC |
B2 | Контрольная сумма CRC | F4 | Контрольная сумма CRC |
98 | Контрольная сумма CRC |
Эта команда используется для записи одного значения дискретного выхода DO.
Значение FF 00 hex устанавливает выход в значение включен ON.
Значение 00 00 hex устанавливает выход в значение выключен OFF.
Все остальные значения недопустимы и не будут влиять значение на выходе.
Нормальный ответ на такой запрос - это эхо (повтор запроса в ответе), возвращается после того, как состояние DO было изменено.
Пример записи в DO с регистром #173 для SlaveID адреса устройства 17. Адрес регистра будет 00AC hex = 172, т.к. счет ведется с 0 адреса.
Байт | Запрос | Байт | Ответ |
---|---|---|---|
(Hex) | Название поля | (Hex) | Название поля |
11 | Адрес устройства | 11 | Адрес устройства |
05 | Функциональный код | 05 | Функциональный код |
00 | Адрес первого регистра Hi байт | 00 | Адрес первого регистра Hi байт |
AC | Адрес первого регистра Lo байт | AC | Адрес первого регистра Lo байт |
FF | Значение Hi байт | FF | Значение Hi байт |
00 | Значение Lo байт | 00 | Значение Lo байт |
4E | Контрольная сумма CRC | 4E | Контрольная сумма CRC |
8B | Контрольная сумма CRC | 8B | Контрольная сумма CRC |
Состояние выхода DO173 поменялось с выключен OFF на включен ON.
Эта команда используется для записи одного значения аналогового выхода AO.
Пример записи в AO с регистром #40002 для SlaveID адреса устройства 17. Адрес первого регистра будет 0001 hex = 1, т.к. счет ведется с 0 адреса.
Байт | Запрос | Байт | Ответ |
---|---|---|---|
(Hex) | Название поля | (Hex) | Название поля |
11 | Адрес устройства | 11 | Адрес устройства |
06 | Функциональный код | 06 | Функциональный код |
00 | Адрес первого регистра Hi байт | 00 | Адрес первого регистра Hi байт |
01 | Адрес первого регистра Lo байт | 01 | Адрес первого регистра Lo байт |
00 | Значение Hi байт | 00 | Значение Hi байт |
03 | Значение Lo байт | 03 | Значение Lo байт |
9A | Контрольная сумма CRC | 9A | Контрольная сумма CRC |
9B | Контрольная сумма CRC | 9B | Контрольная сумма CRC |
Эта команда используется для записи нескольких значений дискретного выхода DO.
Пример записи в несколько DO с регистрами от #20 до #29 для SlaveID адреса устройства 17. Адрес регистра будет 0013 hex = 19, т.к. счет ведется с 0 адреса.
Байт | Запрос | Байт | Ответ |
---|---|---|---|
(Hex) | Название поля | (Hex) | Название поля |
11 | Адрес устройства | 11 | Адрес устройства |
0F | Функциональный код | 0F | Функциональный код |
00 | Адрес первого регистра Hi байт | 00 | Адрес первого регистра Hi байт |
13 | Адрес первого регистра Lo байт | 13 | Адрес первого регистра Lo байт |
00 | Количество регистров Hi байт | 00 | |
0A | Количество регистров Lo байт | 0A | |
02 | Количество байт далее | 26 | Контрольная сумма CRC |
CD | Значение байт DO 27-20 (1100 1101) | 99 | Контрольная сумма CRC |
01 | Значение байт DO 29-28 (0000 0001) | ||
BF | Контрольная сумма CRC | ||
0B | Контрольная сумма CRC |
В ответе возвращается количество записанных регистров.
Эта команда используется для записи нескольких значений аналогового выхода AO.
Пример записи в несколько AO с регистрами #40002 и #40003 для SlaveID адреса устройства 17. Адрес первого регистра будет 0001 hex = 1, т.к. счет ведется с 0 адреса.
Байт | Запрос | Байт | Ответ |
---|---|---|---|
(Hex) | Название поля | (Hex) | Название поля |
11 | Адрес устройства | 11 | Адрес устройства |
10 | Функциональный код | 10 | Функциональный код |
00 | Адрес первого регистра Hi байт | 00 | Адрес первого регистра Hi байт |
01 | Адрес первого регистра Lo байт | 01 | Адрес первого регистра Lo байт |
00 | Количество регистров Hi байт | 00 | Кол-во записанных рег. Hi байт |
02 | Количество регистров Lo байт | 02 | Кол-во записанных рег. Lo байт |
04 | Количество байт далее | 12 | Контрольная сумма CRC |
00 | Значение Hi 40002 | 98 | Контрольная сумма CRC |
0A | Значение Lo 40002 | ||
01 | Значение Hi 40003 | ||
02 | Значение Lo 40003 | ||
C6 | Контрольная сумма CRC | ||
F0 | Контрольная сумма CRC |
Ну что же, пора рассмотреть, чем протокол Modbus TCP
отличается от протокола Modbus RTU
. Так как отличий не очень много, то и статья будет не очень большая.
Итак, в предыдущей стать о функциях Modbus RTU
можно узнать, какие есть функции и их бинарный формат. Теперь стоит рассказать что такое Modbus TCP
, как он применяется и чем отличается от стандартного Modbus RTU
.
Самый простой способ обмена Modbus сообщениями через сеть – просто передавать Modbus RTU пакеты через TCP сокет (соединение). В этом случае формат пакетов такой же, как и для Modbus RTU протокола. В принципе на этом можно и закончить по этому типу протокола.
Для обмена Modbsu сообщениями по сети решили использовать модифицированный протокол. Взяли стандартный Modbus RTU и немного его изменили. Во-первых убрали из него последних 2 байта CRC16 . Так как каждый пакет TCP/IP содержит свою контрольную суму, решили что делать проверку еще раз не нужно. Кроме того убрали первый байт Slave ID . В принципе, Как будет видно дальше, Его не убрали, а просто переименовали. Вот эти байты, без Slave ID и CRC16 назвали PDU – Protocol Data Unit .
Например, возьмем запрос Modbus RTU , который читает несколько HOLDING регистров с устройства #17 (Slave ID = 17)
11 03 006B 0003 7687Теперь убираем первый и последних 2 байта. Получаем PDU !
03 006B 0003С этим вроде все ясно. Теперь, что бы получить полноценный пакет Modbus TCP нам нужно добавить впереди MBAP Header — Modbus Application Header . Т.е. нам нужно добавить некий заголовок. Этот заголовок включает в себя Transaction ID , Protocol ID , Length и Unit ID .
Transaction ID – 2 байта, которые устанавливаются клиентом, что бы однозначно идентифицировать каждый запрос. Т.е. это просто число от 0 до 65535 уникальное для каждого запроса.
Protocol ID – 2 байта, которые определяют версию протокола. В текущей реализации всегда должны быть равны 0x00 0x00
Length – 2 байта, которые определяют длину пакета (за исключением байтов Protocol ID , Transaction ID и Length )
Unit ID – уникальный адрес устройства, которое опрашивается данной командой. Идентично Slave ID .
Небольшое отступление по поводу адресации. Может показаться что это излишне, так как TCP соединение может быть установлено только на конкретный IP адрес и порт. Т.е. у нас уже есть конкретный адрес сервера, поэтому назначение Unit ID не совсем понятно.
Но на самом деле вполне обычна ситуация, когда есть некий сервер, который просто маршрутизирует Modbus RTU запросы на другие устройства, которые подсоединены к нему по различным каналам (локальная сеть, последовательный порт, CAN интерфейс). Поэтому клиент может использовать Modbus TCP сервер как шлюз (Gateway ) для общения с устройствами за ним.
Пример Modbus TCP сервера, который используется как шлюз для перенаправления запросов на Modbus RTU устройства
Вот пример из жизни. Есть некое устройство основанное на Linux. Это устройство выступает Modbus TCP сервером. Любой клиент может подсоединиться к публичному IP адресу на порт 502 и инициировать Modbus TCP соединение. К данному Linux устройству подключены сенсоры, которые использую последовательный порт RS485. Сенсоров много, они очень простые и не могут быть подключены к Internet, у них есть только порт RS485 и они понимают только Modbus RTU . Поэтому клиенты посылают Modbus TCP запросы с Unit ID сенсоров на Modbus TCP Сервер. Сервер декодирует Modbus TCP запрос и преобразует его в Modbus RTU и отправляет в порт RS485. После того как сенсор отвечает ему, он преобразует Modbus RTU ответ в Modbus TCP ответ и отсылает его назад, к Modbus TCP клиенту, который инициировал запрос. Таким образом, имея всего один публичный IP адрес можно опрашивать онлайн сотню сенсоров, которые даже не могут быть подсоединены к Интернету или локальной сети.
А теперь наглядная схема, чем отличается Modbus RTU запрос от Modbus TCP запроса.
Посмотрим пример байтов для двух запросов:
Modbus RTU: 11 03 006B 0003 7687 Modbus TCP: 0001 0000 0006 11 03 006B 0003Как видите, конвертировать запросы между Modbus RTU и Modbus TCP очень просто. Хотя реализация Modbus RTU через TCP может показаться самым простым способом для маршрутизации запросов, на самом деле в Modbus TCP есть несколько положительных моментов:
6.3. MODBUS Serial
Первые сети MODBUS базировались на асинхронных последовательных линиях связи и получили название MODBUS RTU и MODBUS ASCII . На физическом уровне они используют стандартные последовательные интерфейсы с символьным режимом передачи (см. рис.6.1).
В настоящее время в MODBUS-IDA эти сети получили название MODBUS over Serial Line и описаны в соответствующем стандарте. В нем указываются правила и рекомендации использования на канальном и физическом уровне.
Поскольку сеть MODBUS RTU/ASCII может иметь шинную топологию, определен метод доступа к шине - это модель Ведущий/Ведомый. В сетях MODBUS RTU и MODBUS ASCII Процесс Ведущего всегда является Клиентом, а Процессы Ведомых - Серверами. Это значит, что Ведущий отсылает запросы, а Ведомые их обрабатывают. Этот запрос может быть адресован как индивидуальному узлу так и всем Ведомым на шине (broadcast).
На канальном уровне MODBUS RTU/ASCII используется адресация, ориентированная на идентификаторы узлов. Каждый Ведомый должен иметь свой уникальный адрес (1-247), Ведущий не адресуется. При индивидуальных запросах, Ведущий (с клиентским Процессом) формирует кадр с сообщением-запросом и отправляет его по указанному адресу. Ведомый (с серверным Процессом) получает этот кадр и обрабатывает сообщение. После его обработки, Ведомый формирует кадр с сообщением-ответом, и отправляет его обратно Ведущему. Кадр с сообщением-ответом носит также функции кадра подтверждения, которого Ведущий будет ждать от Ведомого течение времени, определенного тайм-аутом.
При широковещательных запросах (broadcast) используется 0-вой адрес. Широковещательные запросы не требуют подтверждения, поэтому после отправки широковещательного кадра, Ведущий не ожидает ответного кадра.
6.3.1. Канальный уровень
На рис.6.11 показан общий вид кадра MODBUS Serial. Обратите внимание, что разграничение между кадрами и тип контрольной суммы здесь не указаны, поскольку это зависит от режима передачи ASCII или RTU. В поле адреса устройства Ведущий (при запросе) указывает адрес получателя, а Ведомый (при ответе) - свой адрес. Поля MODBUS PDU описаны выше.
На временной диаграмме рис.6.12 показаны три типичные ситуации работы модели Ведущий-Ведомый на MODBUS Serial. Первая ситуация - типичный обмен в одноадресном режиме, вторая - в широковещательном, третья - реакция Ведомого на коммуникационную ошибку.
6.3.2.
MODBUS RTUДанный режим предусматривает использование 8 бит данных в 11-битном символе, который позволяет передавать по байту на символ. Формат символа в RTU режиме: 1 стартовый бит, 8 бит данных (младший бит передается первым), 1 бит паритета + 1 стоповый бит или без паритета + 2 стоповых бита.
Формат кадра MODBUS RTU приведен на рисунке 6.13. Разграничение между кадрами производится с помощью пауз между символами. Новый кадр не должен появляться на шине раньше, чем 3.5 * Тс от предыдущего, где Тс - время передачи одного символа. Если отсутствие сигнала на линии (интервал тишины) будет больше чем 1.5 * Тс приемник идентифицирует окончание кадра. С другой стороны, появление нового кадра ранее 3.5 * Тс, тоже приведет к ошибке.
Поле адреса и кода функции в RTU режиме занимают по одному байту, поскольку каждый байт передается одним символом. В качестве контрольной суммы используется два байта, посчитанные по алгоритму CRC16.
6.3.3. MODBUS ASCII
В данном режиме каждый байт сообщения передается как два ASCII символа их шестнадцатеричного представления, т.е. значение байта 03 16 будет передаваться как ASCII-код символов "0" и "3" (0110000 0110011) Таким образом, байты данных, код функции и байт поля проверки будет передаваться кодами
символов 0-9, A-F. Формат символа в ASCII-режиме: 1 стартовый бит, 7 битов данных (младший бит передается первым); 1 бит паритета + 1 стоповый бит или без паритета + 2 стоповых бита.Формат кадра приведен на рис.6.14. Как видим, для разграничения между кадрами используются стартовый символ ":" и стоповая последовательность "CR LF". Приемники на шине непрерывно отслеживают символ ":" который однозначно указывает на начало кадра. Когда он принят, приемники отлавливают поле адреса и т.д. Это очень простой способ синхронизации, который позволяет некритически относиться к паузам между символами (до 1 сек.). Адрес Ведомого и код функции занимают по два символа, согласно значению одного байта. Далее идут n * 2 символов данных, где n количество байт данных. В ASCII режиме для подсчета контрольной суммы используется алгоритм LRC. Причем контрольная сумма проводится над всеми байтами кадра, кроме стартовой и стоповой последовательности символов.
Режим ASCII накладывает меньшие требования на оборудование, за счет использования стартовой и столбовой последовательности в разграничении кадров, и нечувствительности к значительным паузам между символами. Но эти преимущества отражаются на его недостатках. RTU-режим более требователен к интервалам между кадрами, но значительно продуктивнее чем
ASCII .Пример 6.4. MODBUS. Расчет времени опроса ведомых на MODBUS-RTU.
Задача . Построить кадры форматов сообщений запросов и ответов для MODBUS RTU и рассчитать общее время опроса 10-ти аналоговых 16-битных переменных для 4-х ведомых (рис.6.15). Битовая скорость передачи данных - 19200 бит/с. Клиентский Процесс Ведущего (TSX Premium) и серверные Процессы ведомых (ПЛК TSX Micro) принимают сообщения в начале цикла, а отправляют - в конце цикла. Время цикла Ведущего = 10 мс, Ведомого - 5с .
Выполнения задания.
Доступ к внутренним аналоговым переменным TSX Micro проводится через 03 или 04 функцию, поэтому формат кадров будет выглядеть как на рис.6.16.Учитывая, что структура других кадров - аналогичная, приводить их формат нет смысла.
Со стороны клиентского приложения сообщение-запрос формируется с помощью коммуникационной функции, отправка данных которой через коммуникационный порт производится в конце цикла задачи, а получение из порта - в начале цикла. Такое поведение клиентской стороны вполне соответствует многим реализациям для различных ПЛК.
В TSX Micro MODBUS-сервер реализован на уровне операционной системы. Специфика реализации заключается в том, что прием MODBUS-запросов из коммуникационного порта системой проводится в начале цикла, а отправка сообщений-ответов – в конце.
Следует отметить, что реализация MODBUS-сервера может быть поддержана на уровне коммуникационного модуля, а обмен данными с памятью самого устройства производится через коммуникационные буферы. В этом случае реакция MODBUS-сервера будет значительно быстрее и не зависеть от цикла программы. Для расчета времени транзакции для других типов систем необходимо ознакомиться с деталями их реализации.
На рис.6.17 показано, что поступления кадра приходит где-то внутри цикла. Это значит, что их обработка и генерация ответа пройдет примерно через 1,5 цикла. Следует понимать, что это усредненное значение, для наихудшей оценки лучше резервировать 2 времени цикла (т.е. когда кадр пришел сразу после опроса коммуникационного порта). Таким образом время транзакции для одного ПЛК, например PLC1 (ТТ1), будет равна:
ТТ1=С5+T1.req+2*C1+T1.res+C5*2 (6.1)
ТТ1 рассчитан с учетом 2-х циклов затраченных Ведомым на генерацию ответа на сообщение-запрос. Если бы транзакция проводилась не периодически, как по условию задачи, а по возникновению события, то во время транзакции необходимо было бы включить также еще один цикл Ведущего. Несложно вывести время опроса всех ведомых:
ТТall=C5*9+C1*2+C2*2+C3*2+C4*2+T1.req+T1.res+ T2.req+T2.res+ T3.req+T3.res+ T4.req+T4.res (6.2)
Учитывая, что циклы Ведомых одинаковы, а кадры запросов и кадры ответов для всех ведомых имеют одинаковую структуру, общая формула будет иметь следующий вид:
ТТall= C5*9 + C1*8 + (T1.req+T2.req)*4(6.3)
Рассчитаем время T1.req и T2.req.
Время передачи кадра (Тframe) можно ориентировочно рассчитать по количеству символов (Nsymb) в кадре и времени передачи одного символа (Tsymb):Tframe=Nsymb*Tsymb (6.4)
Время передачи одного символа рассчитывается:
время передачи одного символа = количество бит в символе/битовая скорость;
T1.req=8*(11/19200)=4,58 мс
T1.res=25*(11/19200)=14,33 мс
TTall=90+40+ (4,58+14,33)*4= 206 мс.
Таким образом, для опроса 10-ти переменных из 4-х Ведомых со скоростью 19200 бит/с необходимо затратить примерно 206 мс. Если необходим периодический опрос, желательно зарезервировать определенное время, например еще дополнительно 100 мс.
В ряде случаев, реализация функций MODBUS-Клиента ложится на операционную систему, а доступ к ним в программе ПЛК происходит через интерфейсные коммуникационные функции. В частности, это характерно для большинства ПЛК от Scneider Electric (Momentum, Quantum, TSX Micro, TSX Premium, M340). В ряде других систем - клиентскую сторону на прикладном уровне необходимо полностью прописывать в программе ПЛК, а интерфейс предоставляется только для обмена с коммуникационным портом. В этом случае система предоставляет сервисы отправки и получения сообщений (которые формирует и анализирует сама программа пользователя), и генерации и проверки контрольной суммы.
Рассмотрим пример .Пример 6.5.
MODBUS. Реализация MODBUS-клиента на TSX Twido.Задача
. Записать фрагмент программы в ПЛК Twido для считывания 3-х регистров с Ведомого с адресом 1 (рис.6.18).Решение . В Twido клиентскую сторону MODBUS необходимо реализовывать через универсальную функцию EXCHx, которая отправляет и/или получает данные через коммуникационный порт с номером x. Параметрами функции являются таблица слов (%MW), в которых размещаются данные управления функцией, данные для отправки и буфер для приема. Если обмен будет проходить через коммуникационный порт 2, то вызов функции будет иметь следующий формат :
EXCH2 %MWy:n,
где y - номер первой переменной выделенной таблицы, n - количество слов в таблице.
Формат таблицы, то есть данных, которые необходимо заполнить, и область данных для приема одинаков для всех типов коммуникаций. Для функций 03/04 (чтение N слов) по MODBUS-RTU эта таблица будет иметь вид, приведенный в табл.6.2).
Таблица параметров состоит из 3-х частей-подтаблиц. В таблице управления функцией задаются параметры самой функции. Так в старшем байте 0-го слова указывается, что эта функция работает в обе стороны, т.е. после отправки данных, необходимо ждать ответа. Младший байт этого же слова указывает на длину таблицы передачи (в данном случае 6 байт), для того чтобы система знала о байтах которые необходимо передать (со 2-го слова по 4-е) и откуда начинается буфер приема (с 5-го слова)
. Смещение в передаче и приеме необходимо для выравнивания данных в буферах по словам.Таблица передачи содержит непосредственно сам запрос, т.е. кадр без кода CRC. Таблица приема - это буфер, который система заполнит кадром ответа, при положительном результате. Таким образом, перед использованием этой функции необходимо построить кадр запроса и ответа за исключением поля CRC (рис.6.19)
Таблица 6.2
Таблица параметров
Индекс в таблице |
Старший байт |
Младший байт |
|
Таблица управления комм. функцией |
01 (тип ф-ции отправка+приём) |
06 (длина таблицы передачи) |
|
03 (смещение в приёме) |
00 (смещение в передаче) |
||
Таблица передачи |
адрес Ведомого |
03 (номер функции) |
|
адрес начального регистра |
|||
количество регистров |
|||
Таблица приёма (сообщение-ответ) |
адреса Ведомого |
03 (номер функции) |
|
00 (байт для смещения) |
счнтчик байт |
||
первый регистр |
|||
второй регистр |
|||
… |
... |
||
N+6 |
N-ный регистр |
Как видим, в запросе 6 байт. Это количество необходимо вписать в младший байт 0-го слова таблицы. В ответе ожидается 9-байт. Если байты кадра ответа разместить в последовательности слов (в ПЛК Schneider Electric память адресуется словами), то старший байт первого принятого регистра (согласно условию это %MW100) будет находиться на младшем байте 2-го слова буфера, а младший байт принятого регистра придется на
старший байт 3-го слова в буфере. Таким образом, все принятые слова будут смещены, и прочитать их будет проблематично. Для устранения этой проблемы в таблице параметров функции есть поле смещения приема, в котором указывается номер байта в буфере приема, который будет сдвигать всю последовательность.Фрагмент программы будет выглядеть как на рис.6.20.
Во второй цепочке производится непосредственно вызов функции. Переменная %MSG2.D возвращает логическую "1", когда функция EXCH2 обработана и результат получен. Ее использование не дает "затопить" сеть чрезмерным количеством кадров, ведь пока нет ответа на предыдущий запрос или не прошло время тайм-аута, новый запрос отправлять нельзя.
Последний цепочка предназначена для записи результата чтения в переменные %MW0:3 (таблица с 3-х слов начиная с %MW0). Переменная %MSG2.E будет равной 1-це тогда, когда есть место ошибки в вызове функции.
6.3.4.
Реализация физического уровня для MODBUS SerialВ отличие от начальной спецификации, которая ограничивалась описанием кадра, в стандарте MODBUS-IDA описываются также правила для реализации сети на физическом уровне. MODBUS over Serial Line базируется на использовании последовательных интерфейсов RS-485, RS-422 и RS-232.
Для RS-485 определена топология - это шина, в которой предусмотрено три способа подключения устройств (рис.6.21):
-
Непосредственно к магистральному (trunk) кабелю, без ответвлений;-
Через пассивную коробку подключения и кабель ответвления (Derivation);-
Через активную коробку и специфический кабель ответвления.
Интерфейсы между кабелями и элементами сети имеют следующие обозначения (см. рис.6.21): ITr - интерфейс к магистральному кабелю; IDv - интерфейс между устройством и пассивной коробкой; AUI - интерфейс между устройством и активной коробкой; LT - терминаторы линии.
При использовании RS-485 стандарт определяет правила подключения устройств по 2-х проводной и 4-х проводной схеме, а также правила совместимости 2-х проводных и 4-х проводных интерфейсов на единственной линии. Ниже рассмотрено только 2-х проводное подключение, поддержка которого является обязательным.
По сути, 2-х проводное подключение на самом деле является 3-х проводным, так как кроме линий A-(D0 ) и B+(D1 ) используется также общая линия C(Common ), которая является обязательной (рис.6.22) .Общее количество устройств ограничено: 32 устройства на одном сегменте RS-485 без репитеров (использование репитеров разрешается). Максимальная длина кабеля зависит от скорости, типа кабеля, количества нагрузок и конфигурации сети (2-х проводная или 4-х проводная). Для битовой скорости 9600 и кабеля AWG26 максимальная длина ограничена 1000м. Кабель ответвления должен быть короче 20 м. Если используются мультипортовые коробки с n портами, то каждый кабель ответвления ограничен длиной 40/n м.
Общий сигнальный провод (Common) обязательно соединяется с экраном в одной точке шины, как правило возле узла Ведущего, либо его коробки ответвления.
Для погашения отражения волн на концах линии между D1 и D0 выставляется терминаторы линии (LT). Терминаторы разрешается выставлять только на магистральном кабеле.
В качестве терминаторов можно использовать:-
Резистор номиналом 150 Ом и мощностью 0.5 Вт;-
Последовательно соединенные конденсатор (1 нФ, 10 В минимум) и резистор номиналом 120 Ом (0.25 Вт) при использовании поляризации линииВ стандарте MODBUS Serial определены правила реализации защитного смещения (поляризации), которые предусматривают подключение питания номиналом 5 В между D1 и D0 через PullUp и PullDown резисторы для поддержания логической "1" на линии при отсутствии передачи.
Номинал резисторов выбирается от 450 Ом до 650 Ом в зависимости от количества устройств (650 Ом при большом количестве). Защитное смещение проводится только в одной точке линии, как правило на стороне Ведущего. Максимальное количество устройств с реализованной поляризацией уменьшается на 4 по сравнению с системой без поляризации. Поляризация является необязательной. Однако коммуникации на устройствах могут давать сбой при отсутствии логического сигнала. Если это так, то поляризацию необходимо реализовывать самостоятельно, или использовать существующие схемы, если таковые предусмотрены устройствами. Стандарт определяет также механический интерфейс, т.е. типы разъемов, вилок и соответствие сигналов на контактах. В качестве механического терминала можно использовать клемную колодку, экранированный RJ-45 (рис.6.23) или экранированный SUB-D9 разъем (рис.6.24).В таблице 6.3 указано назначение контактов для коннекторов при 2-х проводном подключением по RS-485, а в таблице 6.4 по RS-232
Таблица 6.3
Предназначение контактов конекторов при подключении по RS-485
номера контактов |
требования к наличию |
цепь IDv |
цепь ITr |
название RS-485 |
комментарий (см. раздел 3) |
|
RJ45 |
SUB-D9 |
|||||
опционально |
PMC |
управление режимом ком. порта |
||||
обязательно |
D1 |
B/B" |
напряж V1, V1>V0 для лог. "1" |
|||
обязательно |
D0 |
A/A" |
напряж V0, V0>V1 для лог. "0" |
|||
желательно |
Питание 5…24 VDC |
|||||
обязательно |
Common |
Common |
C/C" |
Питание и сигнальная земля |
Таблица 6.4
Предназначение контактов конекторов при подключении по RS-232
DCE (модем) |
контур |
DTE |
||||||
номера контактов |
требования к наличию |
название |
комментарий (см. раздел 3) |
источник RS-232 |
требования к наличию |
номера контактов |
||
RJ45 |
SUB-D9 |
RJ45 |
SUB-D9 |
|||||
обязательно |
TxD |
Transmitted Data |
<< DTE |
обязательно |
||||
обязательно |
RxD |
Received Data |
DCE >> |
обязательно |
||||
опционально |
CTS |
Clear to Send |
DCE >> |
опционально |
||||
опционально |
RTS |
Request to Send |
<< DTE |
опционально |
||||
обязательно |
Common |
Signal Common |
обязательно |
В качестве кабелей для 2-х проводного типа соединения стандарт определяет двойную экранированную витую пару категорий 4 (до 600м) или 5 (до 1000м), где в одной паре идут сбалансированные сигналы D0 и D1, а во второй - сигнальная земля Common. Рекомендуемые цвета кабелей: D1 желтый; D0 коричновий; Common серый.
Пример 6.6.
MODBUS. Схема сетевых соединений MODBUS RTU.Задача
. Нарисовать схему сетевых соединений для 2-х проводной реализации шины MODBUS RTU со следующими узлами:-
PLC1: VIPA CPU 115SER 6BL32 (Ведущий) через встроенный последовательный порт процессорного модуля;-
PLC2: TSX Twido TWDLMDA40DTK (Ведомый) через коммуникационный модуль TWD NOZ 485T-
PLC3: TSX Twido TWDLMDA40DTK (Ведомый) через коммуникационный модуль TWD NOZ 485TРешение
. На рис.6.25 показана схема сетевых соединений для поставленной задачи. Спецификация сетевых средств дана в таб.6.5.Как видно из рис.6.25, PLC1 подключается к шине через пассивную коробку, а вернее через клеммную колодку, что в принципе равнозначно. Это вызвано тем, что на ПЛК подключения идет с использованием 9-штекерного SUB-D разъема, что требует разработку собственного кабеля, схема подключения (спая) которого к коннектору и к клеммной колодке показан ниже основной схемы.
Таким образом к вилке КК1 провода кабеля КМ2 необходимо припаять.
Назначение пинов розетки SER не совпадает со стандартной. Пины 8 и 3 (соответственно А (D0) и В (D1)) идут в одну пару, затем подключаются к ХТ1:1 и ХТ1:2; 5 и 6 (соответственно M5V (-5В) и P5V (+5 В)) идут в другую витую пару кабеля КМ2. Питания 5В необходимо для того, чтобы реализовать защитное смещение (асимметрию) в соответствии со стандартом. Кроме того M5V является сигнальной землей (Common).Кабель КМ2 подключается к ХТ1 согласно схеме, показанной на рис.6.25. Экран кабеля соединяется с сигнальной землей в соответствии с требованиями стандарта. Следует напомнить, что ПЛК VIPA в этой системе является Ведущим, следовательно и защитное смещение и соединения экрана с землей необходимо реализовывать именно в этом месте. Защитное смещение производится с помощью питания 5В, которое берется из порта SER и двух резисторов.
Таблица 6.5.
Спецификация сетевых средств
№ |
Обозначение |
Наименование |
Референс |
Колич |
Примечание |
PLC1 |
ПЛК VIPA 100 |
VIPA CPU 115SER 6BL32 |
1 шт. |
VIPA |
|
PLC2, PLC3 |
ПЛК Twido |
TWDLMDA40DTK |
2 шт. |
Schneider Electric |
|
MK1, MK2 |
коммуникационный модуль для реализации интерфейса RS-485, подключение под винт |
TWD NOZ 485T |
2 шт. |
Schneider Electric |
|
KK1 |
9-пиновий SUB-D коннектор типа вилка |
1 шт. |
|||
XT1 |
клеммная колодка на 4 клеммы |
1 шт. |
|||
TL1,TL2 |
терминаторы линии |
2 шт |
изготовляются с поз. 7 и 8 |
||
Резистор 120 Ом (0.25 Вт) |
2 шт. |
в составе поз.6 |
|||
Конденсатор 1 нФ (>10 В) |
2 шт. |
в составе поз поз.6 |
|||
Ru,Rd |
Резистор 500 Ом (0.25 Вт) |
2 шт |
|||
КМ1 |
AWG26 |
300 м |
|||
КМ2 |
кабель двойная экранированная витая пара 5-й категории AWG26 |
2 м |
|||
КМ3 |
кабель двойная экранированная витая пара 5-й категории AWG26 |
300 м |
PLC2 и PLC3 соединяются с шиной с помощью коммуникационного модуля с клеммной колодкой. Это позволяет реализовать подключение без ответвлений. Однако на колодке не предусмотрено место подключения экрана, поэтому кабель экранируется отдельно.
Терминаторы линий реализованы последовательным соединением резисторов и конденсаторов, поскольку на шине задействовано защитное смещение.
В настоящее время MODBUS Serial используется как на уровне контроллеров так и на уровне датчиков (для распределенной периферии). Его использование проблематично при наличии на шине нескольких устройств
SCADA / HMI , которые в клиент-серверной архитектуре должны быть Клиентами, ведь на MODBUS RTU/ASCII только Ведущий может быть Клиентом. Но даже в такой ситуации есть возможность организовать доставку данных всем нуждающимся узлам, если они поддерживают такой режим.Исходя из указанного, на шине MODBUS Serial можно остановить свой выбор в случае, если:
-
все устройства-Серверы поддерживают MODBUS RTU / ASCII в режиме Ведомого;-
необходимо только одно устройство-Клиент, которому необходимо инициировать обмены на шине, поддерживающий MODBUS RTU/ASCII как Ведущий;-
скорость восстановления данных - удовлетворяет условию задачи;