Modbus
Modbus — комунікаційний протокол, заснований на технології ведучий-ведений (англ. master-slave). Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP).
Історія
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. [1] Це був відкритий стандарт, що описував формат повідомлень і способи їх передачі в мережі, яка складається з різних електронних пристроїв.
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. [1] Пізніше став застосовуватися інтерфейс RS-485, оскільки він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні виробів, що його використовували. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів [2] .
Вступ
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI. [3] Контролери на шині Modbus взаємодіють, використовуючи master-slave модель, засновану на транзакціях, що складаються із запиту і відповіді.
Зазвичай в мережі є тільки один клієнт, так званий «головний» (англ. master) пристрій, і кілька серверів — «підлеглих» (англ. slaves) пристроїв. Головний пристрій ініціює транзакції (передає запити). Підлеглі пристрої передають запитувані головним пристроєм дані, або виконують запитувані дії. «Головний» може звертатися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв. Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому. При отриманні широкомовного запиту відповідь не формується.
Специфікація Modbus описує структуру запитів і відповідей. Їх основа — елементарний пакет протоколу, так званий PDU (Protocol Data Unit). Структура PDU не залежить від типу лінії зв'язку і містить у собі код функції і поле даних. Код функції кодується однобайтовим полем і може приймати значення в діапазоні 1 … 127. Діапазон значень 128 … 255 зарезервований для кодів помилок. Поле даних може бути змінної довжини. Розмір пакета PDU обмежений 253 байтами.
номер функції | дані |
---|---|
1 байт | N <253 (байт) |
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS-485), так і оптичним і радіо:
- Modbus ASCII — для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм en: Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу ": " і закінчується символами нового рядка CR / LF.
- Modbus RTU
і для передачі даних по мережах Ethernet поверх TCP/IP:
- Modbus TCP.
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):
адреса підлеглого пристрою | код функції | дані | блок виявлення помилок |
---|
де
- Адреса підлеглого пристрою — адреса підлеглого пристрою, до якого адресовано запит.
Підлеглі пристрої відповідають тільки на запити, що надійшли на їх адресу. Відповідь також починається з адреси відповідного підлеглого пристрою, який може змінюватися від 1 до 247. Адреса 0 використовується для широкомовної передачі, її розпізнає кожен пристрій, адреси в діапазоні 248 … 255 — зарезервовані;.
- Номер функції — це наступне однобайтне поле кадру. Воно говорить підлеглому пристрою, які дані або виконання якої дії вимагає від нього ведучий пристрій;
- Дані — поле містить інформацію, необхідну підлеглому пристрою для виконання заданої майстром функції або містить дані, що передаються підлеглим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;
- Блок виявлення помилок — контрольна сума для перевірки відсутності помилок в кадрі.
Максимальний розмір ADU для послідовних мереж RS232/RS485 — 256 байт, для мереж TCP — 260 байт.
Для Modbus TCP ADU виглядає наступним чином:
ід транзакції | ід протоколу | довжина пакету | адреса підлеглого пристрою | код функції | дані |
---|
де
- Ід транзакції — два байти, зазвичай нулі
- Ід протоколу — два байти, нулі
- Довжина пакету — два байти, старший потім молодший, довжина наступної за цим полем частини пакета
- Адресу відомого пристрою — адреса підлеглого пристрою, до якого адресовано запит. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з мостом, який виводить нас, наприклад, в мережу RS485.
Поле контрольної суми в Modbus TCP відсутнє.
Категорії кодів функцій
У діючій в наш час[коли?] специфікації протоколу визначаються три категорії кодів функцій:
- Стандартні команди
- Їх опис має бути опубліковано та затверджено Modbus-IDA. Ця категорія містить як вже існуючі, так і вільні в наш час[коли?] коди.
- Користувацькі команди
- Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.
- Зарезервовані
- У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.
Модель даних
Одне з типових застосувань протоколу — читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:
Таблиця | Тип елемента | Тип доступу |
---|---|---|
Дискретні входи (англ. Discrete Inputs) | Один біт | тільки читання |
Регістри прапорів (англ. Coils) | Один біт | читання і запис |
Регістри вводу (англ. Input Registers) | 16-бітне слово | тільки читання |
Регістри зберігання (англ. Holding Registers) | 16-бітне слово | читання і запис |
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітної адреси, першій комірці відповідає адреса 0. Таким чином, кожна таблиця може містити до 65536 елементів. Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яких внутрішніх адресах пристрою вони повинні бути доступні. Наприклад, припустимо організувати таблиці з перекриттям, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина. Modbus був спочатку розроблений для контролерів Modicon. У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація. Наприклад, першому регістру вводу відповідав номер комірки 30001, а першому регістру зберігання — 40001. Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера. Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» введені користувачем адреси, наприклад, віднімаючи 40001 від адреси регістра зберігання.
Стандартні функції протоколу Modbus
номер функції | запит / відповідь | |||||
---|---|---|---|---|---|---|
1 (0x01) | A 1 | A 0 | Q 1 | Q 0 | ||
N | D (N байт) | |||||
2 (0x02) | A 1 | A 0 | Q 1 | Q 0 | ||
N | D (N байт) | |||||
3 (0x03) | A 1 | A 0 | Q 1 | Q 0 | ||
N | D (N байт) | |||||
4 (0x04) | A 1 | A 0 | Q 1 | Q 0 | ||
N | D (N байт) | |||||
5 (0x05) | A 1 | A 0 | D 1 | D 0 | ||
A 1 | A 0 | D 1 | D 0 | |||
6 (0x06) | A 1 | A 0 | D 1 | D 0 | ||
A 1 | A 0 | D 1 | D 0 | |||
15 (0x0F) | A 1 | A 0 | Q 1 | Q 0 | N | D (N байт) |
A 1 | A 0 | Q 1 | Q 0 | |||
16 (0x10) | A 1 | A 0 | Q 1 | Q 0 | N | D (N байт) |
A 1 | A 0 | Q 1 | Q 0 |
- A 1 іA 0 — адреса елемента,
- Q 1 іQ 0 — кількість елементів,
- N — кількість байт даних
- D — дані
Читання даних
Для читання значень з перерахованих вище таблиць даних використовуються функції з кодами 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-бітними числами, старший байт кожного з них передається першим.
У відповіді передаються запитані дані. Кількість байт даних залежить від кількості замовлених елементів. Перед даними передається один байт, значення якого дорівнює кількості байт даних.
Значення регістрів зберігання і регістрів вводу передаються починаючи із зазначеної адреси, по два байти на регістр, старший байт кожного регістру передається першим:
байт 1 | байт 2 | байт 3 | байт 4 | … | байт N-1 | байт N |
---|---|---|---|---|---|---|
R A, 1 | R A, 0 | R A +1,1 | R A +1,0 | … | R A + Q-1, 1 | R A + Q-1, 0 |
Значення прапорів і дискретних входів передаються в упакованому вигляді: по одному біту на прапор. Одиниця означає включений стан, нуль — вимкнений. Значення запитаних прапорів заповнюють спочатку перший байт, починаючи з молодшого біта, потім наступні байти, також від молодшого біта до старших. Молодший біт першого байта даних містить значення прапора, зазначеного в полі «адреса». Якщо запитано кількість прапорів, не кратне восьми, то значення додаткових бітів заповнюються нулями:.
байт 1 | … | байт N | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
F A +7 | F A +6 | F A +5 | F A +4 | F A +3 | F A +2 | F A +1 | F A | … | 0 | … | 0 | F A + Q-1 | F A + Q-2 | … |
Запис одного значення
- 5 (0x05)- запис значення одного прапора(Force Single Coil)
- 6 (0x06)- запис значення в один регістр зберігання(Preset Single Register)
Команда складається з адреси елемента (2 байти) і встановлюваного значення (2 байти).
Для регістру зберігання значення є просто 16-бітним словом.
Для прапорів значення 0xFF00 означає включений стан, 0x0000 — вимкнений, інші значення неприпустимі.
Якщо команда виконана успішно, підлеглий пристрій повертає копію запиту.
Запис декількох значень
- 15 (0x0F)- запис значень в кілька регістрів прапорів(Force Multiple Coils)
- 16 (0x10)- запис значень в кілька регістрів зберігання(Preset Multiple Registers)
Команда складається з адреси елемента, кількості змінюваних елементів, кількості переданих байт встановлюваних значень і самих встановлюваних значень. Дані упаковуються так само, як в командах читання даних.
Відповідь складається з початкової адреси і кількості змінених елементів.
Нижче наведено приклад команди ведучого пристрою і відповіді веденого (для Modbus RTU).
Напрямок передачі | 00 адреса підлеглого пристрою | 01 номер функції | 02 Адреса ст. байт | 03 Адреса мол. байт | 04 Кількість прапорів ст. байт | 05 Кількість прапорів мол. байт | 06 Кількість байт даних | 07 Дані (значення для прапорів біти 0-7) | 08 Дані (значення для прапорів біти 8-15) | 09 CRC мол. байт | 0A CRC ст. байт |
---|---|---|---|---|---|---|---|---|---|---|---|
Master → Slave | 0x01 | 0x0F | 0x00 | 0x13 | 0x00 | 0x0A | 0x02 | 0xCD | 0x01 | 0x72 | 0xCB |
Напрямок передачі | 00 адреса підлеглого пристрою | 01 номер функції | 02 Адреса ст. байт | 03 Адреса мол. байт | 04 Кількість прапорів ст. байт | 05 Кількість прапорів мол. байт | 05 CRC мол. байт | 06 CRC ст. байт |
---|---|---|---|---|---|---|---|---|
Slave → Master | 0x01 | 0x0F | 0x00 | 0x13 | 0x00 | 0x0A | 0x24 | 0x09 |
Контроль помилок у протоколі Modbus RTU
Під час обміну даними можуть виникати помилки двох типів:
- Помилки, пов'язані з спотвореннями при передачі даних;
- Логічні помилки.
Помилки першого типу виявляються за допомогою фреймів символів, контролю парності і циклічної контрольної суми CRC-16-IBM (використовується число-поліном = 0xA001). При цьому молодший байт передається першим, на відміну від байтів адреси і значення регістра в PDU
RTU фрейм
У RTU режимі повідомлення має починатися і закінчуватися інтервалом тиші — часом передачі не менше 3.5 символів при даній швидкості в мережі. Першим полем потім передається адреса пристрою.
Слідом за останнім переданим символом також йде інтервал тиші тривалістю не менше 3.5 символів. Нове повідомлення може починатися після цього інтервалу.
Фрейм повідомлення передається безперервно. Якщо інтервал тиші тривалістю 1.5 виник під час передачі фрейму, приймаючий пристрій повинен ігнорувати цей фрейм як неповний.
Таким чином, нове повідомлення повинно починатися не раніше 3.5 інтервалу, оскільки в цьому випадку встановлюється помилка.
Трохи про інтервали (мова йде про Serial Modbus RTU): при швидкості 9600 і 11 бітах в кадрі (стартовий біт + 8 біт даних + біт контролю парності + стоп-біт): 3.5 * 11 / 9600 = 0,00401041 (6), тобто більше 4 мс; 1.5 * 11 / 9600 = 0,00171875, тобто більше 1 мс. Для швидкостей більше 19200 бод допускається використовувати інтервали 1,75 і 0,75 мс відповідно.
Логічні помилки
Для повідомлень про помилки другого типу протокол Modbus RTU передбачає, що пристрої можуть відсилати відповіді, що свідчать про помилкову ситуацію. Ознакою того, що відповідь містить повідомлення про помилку, є встановлений старший біт коду команди. Приклад кадру при виявленні помилки веденим пристроєм, у відповідь на запит наведено в (Таблиця 2-1).
1. Якщо Slave приймає коректний запит і може його нормально обробити, то повертає стандартну відповідь.
2. Якщо Slave не приймає будь-якого значення, ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.
3. Якщо Slave приймає запит, але виявляє помилку (parity, LRC, or CRC), ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.
4. Якщо Slave приймає запит, але не може його обробити (звернення до неіснуючого регістру і т. д.), відправляється відповідь, що містить у собі дані про помилку.
Напрямок передачі | Адресу підлеглого пристрою | Номер функції | Дані (або код помилки) | CRC |
---|---|---|---|---|
Запит (Master → Slave) | 0x01 | 0x77 | 0xDD | 0xC7 0xA9 |
Відповідь (Slave → Master) | 0x01 | 0xF7 | 0xEE | 0xE6 0x7C |
Стандартні коди помилок
- 01 — Прийнятий код функції не може бути опрацьований на підлеглому пристрої.
- 02 — Адреса даних, вказаних у запиті, не доступна даному підлеглому пристрою.
- 03 — Величина, що міститься в полі даних запиту, є неприпустимою величиною для підлеглого пристрою.
- 04 — невідновлювальна помилка мала місце, поки підлеглий пристрій намагався виконати запрошену дію.
- 05 — Підлеглий пристрій прийняв запит і обробляє його, але це вимагає багато часу. Ця відповідь оберігає головного від генерації помилки тайм-ауту.
- 06 — Підлеглий пристрій зайнятий обробкою команди. Головний повинен повторити повідомлення пізніше, коли підлеглий звільниться.
- 07 — Підлеглий пристрій не може виконати програмну функцію, прийняту в запиті. Цей код повертається для невдалого програмного запиту, що використовує функції з номерами 13 або 14. Головний повинен запросити діагностичну інформацію або інформацію про помилки з підлеглого.
- 08 — Підлеглий пристрій намагається читати розширену пам'ять, але виявив помилку паритету. Головний може повторити запит, але звичайно в таких випадках потрібний ремонт.
Примітки
Посилання на використані в статті джерела
- Навчальні матеріали [Архівовано 3 квітня 2011 у Wayback Machine.]
- Modbus-IDA некомерційна організація, яка підтримує цей протокол [Архівовано 20 серпня 2015 у Wayback Machine.]
- Оригінальні специфікації протоколу англійською мовою [Архівовано 16 липня 2011 у Wayback Machine.]
- Modbus Specifications and Implementation Guides (ModBus TCP \\ IP) [Архівовано 12 лютого 2011 у Wayback Machine.]
- Введення в Modbus протокол [недоступне посилання з червня 2019]
- Опис стандартного протоколу ModBus англійською мовою [Архівовано 1 червня 2002 у Wayback Machine.]
- Бібліотека для роботи з протоколом modbus в GNU / Linux [Архівовано 1 травня 2011 у Wayback Machine.]
- Як Modbus працює [Архівовано 6 вересня 2012 у Wayback Machine.]
- Site for software developers which develop, test modbus protocol in drivers, devices, PLC etc. [Архівовано 29 червня 2011 у Wayback Machine.]
- FreeModbus — ASCII / RTU і TCP для мікроконтролерів [Архівовано 31 серпня 2018 у Wayback Machine.]
Утиліти
- Реалізація протоколу на мові LabVIEW [Архівовано 23 квітня 2011 у Wayback Machine.] — Бібліотека Vi
- Утиліта опитування і запису даних за протоколом Modbus RTU / ASCII [недоступне посилання з червня 2019] — Некоректно формує запити по TCP/IP (не за Modbus TCP \\ IP Specifications and Implementation [Архівовано 12 лютого 2011 у Wayback Machine.])
- modpoll (Master) (win32, linux, solaris, qnx6) [Архівовано 20 вересня 2011 у Wayback Machine.] — Безкоштовна консольна утиліта опитування і запису даних за протоколом Modbus RTU / ASCII / TCP \\ IP; досить зручна, але код виходу програми (при правильних параметрах) завжди 0 (версія 2.4.0) навіть якщо Slave повернув код помилки на запит (обіцяно виправити у наступному релізі).
- PeakHMI MODBUS TCP/IP Slave simulator (Win GUI) — Безкоштовна і дуже зручна утиліта, симулятор ModBus TCP/IP Slave
- Simply Modbus [Архівовано 23 квітня 2011 у Wayback Machine.] — Програма випробування Modbus.
- rmodbus — Вільна реалізація протоколу на Ruby.
- NModbus [Архівовано 7 березня 2011 у Wayback Machine.] — Реалізація протоколу Modbus на мові C #.
- Сторож [Архівовано 5 лютого 2012 у Wayback Machine.] — Гнучка система диспетчеризації під Linux з підтримкою протоколу MODBUS.
- LanDrive Configurator Pro — Легке у роботі середовище конфігурування пристроїв з протоколом MODBUS
- MODBUS OPC сервер [Архівовано 20 березня 2011 у Wayback Machine.] — Зручний OPC сервер MODBUS від ReLab Software
![]() | Це незавершена стаття про інформаційні технології. Ви можете допомогти проєкту, виправивши або дописавши її. |