Modbus
Modbus - це комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).[1]
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.[2]
Зміст
Історія
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.
Стандарт MODBUS
Специфічна термінологія
- PDU (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.
- ADU (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.
MODBUS специфікує 4 типи даних:
- Дискретних входів - однобітовий тип, доступний тільки на читання.
- Котушки - однобітовий тип, доступний на читання і на запис.
- Вхідні регістри - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.
- Проведення регістри - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.
Склад стандарту
Стандарти MODBUS складаються з 3 частин:
- Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:
- Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).
- Коди функцій і складу PDU для кожного коду.
- Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.
- Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.
Переваги стандарту
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.
Недоліки стандарту
- Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.
- Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.
- Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.
- Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.
- Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.
Вступ
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. 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 символи. Для перевірки цілісності використовується алгоритм 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 - Підлеглий намагається читати розширену пам'ять, але виявив помилку паритету. Головний може повторити запит, але звичайно в таких випадках потрібний ремонт.
Зовнішні посилання
Посилання у різних вільних енциклопедіях (wikipedia):