<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="uk">
		<id>https://wiki.tntu.edu.ua/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Chameleon</id>
		<title>Wiki ТНТУ - Внесок користувача [uk]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.tntu.edu.ua/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Chameleon"/>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/%D0%A1%D0%BF%D0%B5%D1%86%D1%96%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0:%D0%92%D0%BD%D0%B5%D1%81%D0%BE%D0%BA/Chameleon"/>
		<updated>2026-04-06T20:30:00Z</updated>
		<subtitle>Внесок користувача</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=%D0%9E%D0%B1%D0%B3%D0%BE%D0%B2%D0%BE%D1%80%D0%B5%D0%BD%D0%BD%D1%8F:Modbus&amp;diff=14584</id>
		<title>Обговорення:Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=%D0%9E%D0%B1%D0%B3%D0%BE%D0%B2%D0%BE%D1%80%D0%B5%D0%BD%D0%BD%D1%8F:Modbus&amp;diff=14584"/>
				<updated>2012-04-18T16:20:42Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Цю сторінку створює студент групи КТ-42 ''Пелех Олександр''&lt;br /&gt;
&lt;br /&gt;
== 18/04/2012 ==&lt;br /&gt;
* Чомусь розділ &amp;quot;Вступ&amp;quot; знаходиться всередині статті.&lt;br /&gt;
* Після врахування зауваження, можна доповідати статтю з використанням презентації на консультації.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Введені зміни відповідно до зауважень, готується презентація на консультацію 25.06.2012р.&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=%D0%9E%D0%B1%D0%B3%D0%BE%D0%B2%D0%BE%D1%80%D0%B5%D0%BD%D0%BD%D1%8F:Modbus&amp;diff=14583</id>
		<title>Обговорення:Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=%D0%9E%D0%B1%D0%B3%D0%BE%D0%B2%D0%BE%D1%80%D0%B5%D0%BD%D0%BD%D1%8F:Modbus&amp;diff=14583"/>
				<updated>2012-04-18T16:20:08Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Цю сторінку створює студент групи КТ-42 ''Пелех Олександр''&lt;br /&gt;
&lt;br /&gt;
== 18/04/2012 ==&lt;br /&gt;
* Чомусь розділ &amp;quot;Вступ&amp;quot; знаходиться всередині статті.&lt;br /&gt;
* Після врахування зауваження, можна доповідати статтю з використанням презентації на консультації.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Введені зміни відповідно до зауважень, готується презентація на 25.06.2012р.&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14582</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14582"/>
				<updated>2012-04-18T16:15:21Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Web member.gif|thumb|right|300 px|Логотип Modbus]]&lt;br /&gt;
'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ) [1].&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS [2].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Modbus tcp.jpg|thumb|300 px|Приклад мережі Modbus]]&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції:&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані:&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адреса відомого пристрою  . &lt;br /&gt;
! код функції   .&lt;br /&gt;
! дані   .&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адреса відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції  .&lt;br /&gt;
! ід протоколу  .&lt;br /&gt;
! довжина пакету  .&lt;br /&gt;
! адресу відомого пристрою  .&lt;br /&gt;
! код функції  .&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Buses-main.jpg|thumb|right|300 px|Організація Modbus-IDA]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Modbustcp.jpg|thumb|right|300 px|Мережа Modbus]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Елементи|| Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандартні функції протоколу Modbus ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright thumb&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
|+ '''PDU запиту і відповіді для стандартних функцій'''&lt;br /&gt;
! номер &amp;lt;br /&amp;gt; функції&lt;br /&gt;
! colspan = &amp;quot;6&amp;quot; | запит / відповідь&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 1 (0x01)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 2 (0x02)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 3 (0x03)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 4 (0x04)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 5 (0x05)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 6 (0x06)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 15 (0x0F)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 16 (0x10)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
*'''A &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''A &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - адреса елемента,&lt;br /&gt;
*'''Q &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''Q &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - кількість елементів,&lt;br /&gt;
*'''N''' - кількість байт даних&lt;br /&gt;
*'''D''' - дані&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Читання даних ===&lt;br /&gt;
&lt;br /&gt;
Для читання значень з перерахованих вище таблиць даних використовуються функції з кодами 1-4 шістнадцяткові значення 0x01-0x04):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''1 (0x01)'''- читання значень з декількох регістрів прапорів''(Read Coil Status)''&lt;br /&gt;
*'''2 (0x02)'''- читання значень з декількох дискретних входів''(Read Discrete Inputs)''&lt;br /&gt;
*'''3 (0x03)'''- читання значень з декількох регістрів зберігання''(Read Holding Registers)''&lt;br /&gt;
*'''4 (0x04)'''- читання значень з декількох регістрів введення''(Read Input Registers)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запит складається із адреси першого елемента таблиці, яку потрібно прочитати, і кількості зчитувальних елементів. Адреса та кількість даних задаються 16-бітними числами, старший байт кожного з них передається першим.&lt;br /&gt;
&lt;br /&gt;
У відповіді передаються запитані дані. Кількість байт даних залежить від кількості замовлених елементів. Перед даними передається один байт, значення якого дорівнює кількості байт даних.&lt;br /&gt;
&lt;br /&gt;
Значення регістрів зберігання і регістрів введення передаються починаючи із зазначеної адреси, по два байти на регістр, старший байт кожного регістру передається першим:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! байт 1 || байт 2 || байт 3 || байт 4 || ... || байт N-1 || байт N&lt;br /&gt;
|-&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A +1,1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A +1,0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A + Q-1, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A + Q-1, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Значення прапорів і дискретних входів передаються в упакованому вигляді: по одному біту на прапор.&lt;br /&gt;
Одиниця означає включений стан, нуль - вимкнений.&lt;br /&gt;
Значення запитаних прапорів заповнюють спочатку перший байт, починаючи з молодшого біта, потім наступні байти, також від молодшого біта до старших.&lt;br /&gt;
Молодший біт першого байта даних містить значення прапора, зазначеного в полі «адресу».&lt;br /&gt;
Якщо запитано кількість прапорів, не кратне восьми, то значення додаткового біта заповнюються нулями:.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! colspan = &amp;quot;8&amp;quot; | байт 1&lt;br /&gt;
! ...&lt;br /&gt;
! colspan = &amp;quot;7&amp;quot; | байт N&lt;br /&gt;
|-&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +7&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +6&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +5&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +4&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +3&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис одного значення ===&lt;br /&gt;
&lt;br /&gt;
*'''5 (0x05)'''- запис значення одного прапора''(Force Single Coil)''&lt;br /&gt;
*'''6 (0x06)'''- запис значення в один регістр зберігання''(Preset Single Register)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента (2 байти) і встановлюваного значення (2 байти).&lt;br /&gt;
&lt;br /&gt;
Для регістру зберігання значення є просто 16-бітним словом.&lt;br /&gt;
&lt;br /&gt;
Для прапорів значення 0xFF00 означає включений стан, 0x0000 - вимкнений, інші значення неприпустимі.&lt;br /&gt;
&lt;br /&gt;
Якщо команда виконана успішно, ведене пристрій повертає копію запиту.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис декількох значень ===&lt;br /&gt;
&lt;br /&gt;
*'''15 (0x0F)'''- запис значень в кілька регістрів прапорів''(Force Multiple Coils)''&lt;br /&gt;
*'''16 (0x10)'''- запис значень в кілька регістрів зберігання''(Preset Multiple Registers)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента, кількості змінюваних елементів, кількості переданих байт встановлюваних значень і самих встановлюваних значень. Дані упаковуються так само, як в командах читання даних.&lt;br /&gt;
&lt;br /&gt;
Відповідь складається з початкової адреси і кількості змінених елементів.&lt;br /&gt;
&lt;br /&gt;
Нижче наведено приклад команди ведучого пристрою і відповіді веденого (для Modbus RTU).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 06 Кількість байт даних&lt;br /&gt;
! 07 Дані (значення для прапорів біти 0-7)&lt;br /&gt;
! 08 Дані (значення для прапорів біти 8-15)&lt;br /&gt;
! 09 CRC мл. байт&lt;br /&gt;
! 0A CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Master → Slave &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x02 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCD &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x72 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCB &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 05 CRC мл. байт&lt;br /&gt;
! 06 CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Slave → Master &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x24 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x09 &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Контроль помилок у протоколі Modbus RTU ==&lt;br /&gt;
&lt;br /&gt;
Під час обміну даними можуть виникати помилки двох типів:&lt;br /&gt;
* Помилки, пов'язані з спотвореннями при передачі даних;&lt;br /&gt;
* Логічні помилки.&lt;br /&gt;
&lt;br /&gt;
Помилки першого типу виявляються за допомогою фреймів символів, контролю парності і циклічної контрольної суми [[CRC]]-16-IBM (використовується число-[[поліном]] = 0xA001). При цьому молодший байт передається першим, на відміну від байтів адреси і значення регістра в PDU&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RTU фрейм ===&lt;br /&gt;
&lt;br /&gt;
У RTU режимі повідомлення має починатися і закінчуватися інтервалом тиші - часом передачі не менше 3.5 символів при даній швидкості в мережі. Першим полем потім передається адреса пристрою.&lt;br /&gt;
&lt;br /&gt;
Слідом за останнім переданим символом також слід інтервал тиші тривалістю не менше 3.5 символів. Нове повідомлення може починатися після цього інтервалу.&lt;br /&gt;
&lt;br /&gt;
Фрейм повідомлення передається безперервно. Якщо інтервал тиші тривалістю 1.5 виник під час передачі фрейму, приймаючий пристрій повинен ігнорувати цей фрейм як неповний.&lt;br /&gt;
&lt;br /&gt;
Таким чином, нове повідомлення повинно починатися не раніше 3.5 інтервалу, так як в цьому випадку встановлюється помилка.&lt;br /&gt;
&lt;br /&gt;
Трохи про інтервали (мова йде про Serial Modbus RTU):&lt;br /&gt;
при швидкості 9600 і 11 бітах в кадрі (стартовий біт + 8 біт даних + біт контролю парності + стоп-біт):&lt;br /&gt;
3.5 * 11 / 9600 = 0,00401041 (6), тобто більше 4 мс;&lt;br /&gt;
1.5 * 11 / 9600 = 0,00171875, тобто більше 1 мс.&lt;br /&gt;
Для швидкостей більше 19200 бод допускається використовувати інтервали 1,75 і 0,75 мс відповідно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Логічні помилки ===&lt;br /&gt;
Для повідомлень про помилки другого типу протокол Modbus RTU передбачає, що пристрої можуть відсилати відповіді, що свідчать про помилкову ситуації.&lt;br /&gt;
Ознакою того, що відповідь містить повідомлення про помилку, є встановлений старший біт коду команди.&lt;br /&gt;
Приклад кадру при виявленні помилки веденим пристроєм, у відповідь на запит наведено в (Таблиця 2-1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Якщо Slave приймає коректний запит і може його нормально обробити, то повертає стандартний відповідь.&lt;br /&gt;
&lt;br /&gt;
2. Якщо Slave не приймає будь-якого значення, ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
3. Якщо Slave приймає запит, але виявляє помилку (parity, LRC, or CRC), ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
4. Якщо Slave приймає запит, але не може його обробити (звернення до неіснуючого регістру і т. д.), відправляється відповідь містить у собі дані про помилку.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Кадр відповіді (Slave → Master) при виникненні помилки modbus RTU'''&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! Адресу підлеглого пристрою&lt;br /&gt;
! Номер функції&lt;br /&gt;
! Дані (або код помилки)&lt;br /&gt;
! CRC&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Запит (Master → Slave) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x77 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xDD &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xC7 0xA9&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Відповідь (Slave → Master) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xF7 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xEE &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xE6 0x7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Стандартні коди помилок ====&lt;br /&gt;
* 01 - Прийнятий код функції не може бути опрацьований на підпорядкованому.&lt;br /&gt;
* 02 - Адреса даних, вказаний у запиті, не доступний даному підлеглому.&lt;br /&gt;
* 03 - Величина, що міститься в полі даних запиту, є неприпустимою величиною для підлеглого.&lt;br /&gt;
* 04 - невідновлювальних помилка мала місце, поки підлеглий намагався виконати затребованное дію.&lt;br /&gt;
* 05 - Підлеглий прийняв запит і обробляє його, але це вимагає багато часу. Ця відповідь оберігає головного від генерації помилки тайм-ауту.&lt;br /&gt;
* 06 - Підлеглий зайнятий обробкою команди. Головний повинен повторити повідомлення пізніше, коли підлеглий звільниться.&lt;br /&gt;
* 07 - Підлеглий не може виконати програмну функцію, прийняту в запиті. Цей код повертається для невдалого програмного запиту, що використовує функції з номерами 13 або 14. Головний повинен запросити діагностичну інформацію або інформацію про помилки з підлеглого.&lt;br /&gt;
* 08 - Підлеглий намагається читати розширену пам'ять, але виявив помилку паритету. Головний може повторити запит, але звичайно в таких випадках потрібний ремонт.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Зовнішні посилання ==&lt;br /&gt;
Посилання у різних вільних енциклопедіях (wikipedia):&lt;br /&gt;
# [http://uk.wikipedia.org/wiki/Modbus  українська]&lt;br /&gt;
# [http://ru.wikipedia.org/wiki/Modbus  російська]&lt;br /&gt;
# [http://en.wikipedia.org/wiki/Modbus  англійська]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Посилання на використані в статті джерела ==&lt;br /&gt;
* [http://plc24.ru/manual/simple/konf_oborud/ Навчальні матеріали ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.modbus.org Modbus-IDA некомерційна організація, яка підтримує цей протокол ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.modbus.org/tech.php Оригінальні специфікації протоколу англійською мовою ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.modbus-ida.org/specs.php Modbus Specifications and Implementation Guides (ModBus TCP \\ IP) ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.writely.com/Doc.aspx?id=ahkq5zp9f42n Введення в Modbus протокол ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.modicon.com/techpubs/toc7.html Опис стандартного протоколу ModBus англійською мовою ]&lt;br /&gt;
&lt;br /&gt;
* [http://sourceforge.net/projects/libmodbus/ Бібліотека для роботи з протоколом modbus в GNU / Linux ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.simplymodbus.ca/FAQ.htm Як Modbus працює ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.modbus.pl/index.html Site for software developers which develop, test modbus protocol in drivers, devices, PLC etc. ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.freemodbus.org FreeModbus - ASCII / RTU і TCP для мікроконтролерів ]&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14554</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14554"/>
				<updated>2012-04-16T14:05:26Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Web member.gif|thumb|right|300 px|Логотип Modbus]]&lt;br /&gt;
'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ) [1].&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS [2].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Buses-main.jpg|thumb|right|300 px|Організація Modbus-IDA]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Modbustcp.jpg|thumb|right|300 px|Мережа Modbus]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Modbus tcp.jpg|thumb|300 px|Приклад мережі Modbus]]&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції:&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані:&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адреса відомого пристрою  . &lt;br /&gt;
! код функції   .&lt;br /&gt;
! дані   .&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адреса відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції  .&lt;br /&gt;
! ід протоколу  .&lt;br /&gt;
! довжина пакету  .&lt;br /&gt;
! адресу відомого пристрою  .&lt;br /&gt;
! код функції  .&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Елементи|| Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандартні функції протоколу Modbus ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright thumb&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
|+ '''PDU запиту і відповіді для стандартних функцій'''&lt;br /&gt;
! номер &amp;lt;br /&amp;gt; функції&lt;br /&gt;
! colspan = &amp;quot;6&amp;quot; | запит / відповідь&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 1 (0x01)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 2 (0x02)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 3 (0x03)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 4 (0x04)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 5 (0x05)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 6 (0x06)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 15 (0x0F)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 16 (0x10)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
*'''A &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''A &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - адреса елемента,&lt;br /&gt;
*'''Q &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''Q &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - кількість елементів,&lt;br /&gt;
*'''N''' - кількість байт даних&lt;br /&gt;
*'''D''' - дані&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Читання даних ===&lt;br /&gt;
&lt;br /&gt;
Для читання значень з перерахованих вище таблиць даних використовуються функції з кодами 1-4 шістнадцяткові значення 0x01-0x04):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''1 (0x01)'''- читання значень з декількох регістрів прапорів''(Read Coil Status)''&lt;br /&gt;
*'''2 (0x02)'''- читання значень з декількох дискретних входів''(Read Discrete Inputs)''&lt;br /&gt;
*'''3 (0x03)'''- читання значень з декількох регістрів зберігання''(Read Holding Registers)''&lt;br /&gt;
*'''4 (0x04)'''- читання значень з декількох регістрів введення''(Read Input Registers)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запит складається із адреси першого елемента таблиці, яку потрібно прочитати, і кількості зчитувальних елементів. Адреса та кількість даних задаються 16-бітними числами, старший байт кожного з них передається першим.&lt;br /&gt;
&lt;br /&gt;
У відповіді передаються запитані дані. Кількість байт даних залежить від кількості замовлених елементів. Перед даними передається один байт, значення якого дорівнює кількості байт даних.&lt;br /&gt;
&lt;br /&gt;
Значення регістрів зберігання і регістрів введення передаються починаючи із зазначеної адреси, по два байти на регістр, старший байт кожного регістру передається першим:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! байт 1 || байт 2 || байт 3 || байт 4 || ... || байт N-1 || байт N&lt;br /&gt;
|-&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A +1,1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A +1,0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A + Q-1, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A + Q-1, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Значення прапорів і дискретних входів передаються в упакованому вигляді: по одному біту на прапор.&lt;br /&gt;
Одиниця означає включений стан, нуль - вимкнений.&lt;br /&gt;
Значення запитаних прапорів заповнюють спочатку перший байт, починаючи з молодшого біта, потім наступні байти, також від молодшого біта до старших.&lt;br /&gt;
Молодший біт першого байта даних містить значення прапора, зазначеного в полі «адресу».&lt;br /&gt;
Якщо запитано кількість прапорів, не кратне восьми, то значення додаткового біта заповнюються нулями:.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! colspan = &amp;quot;8&amp;quot; | байт 1&lt;br /&gt;
! ...&lt;br /&gt;
! colspan = &amp;quot;7&amp;quot; | байт N&lt;br /&gt;
|-&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +7&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +6&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +5&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +4&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +3&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис одного значення ===&lt;br /&gt;
&lt;br /&gt;
*'''5 (0x05)'''- запис значення одного прапора''(Force Single Coil)''&lt;br /&gt;
*'''6 (0x06)'''- запис значення в один регістр зберігання''(Preset Single Register)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента (2 байти) і встановлюваного значення (2 байти).&lt;br /&gt;
&lt;br /&gt;
Для регістру зберігання значення є просто 16-бітним словом.&lt;br /&gt;
&lt;br /&gt;
Для прапорів значення 0xFF00 означає включений стан, 0x0000 - вимкнений, інші значення неприпустимі.&lt;br /&gt;
&lt;br /&gt;
Якщо команда виконана успішно, ведене пристрій повертає копію запиту.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис декількох значень ===&lt;br /&gt;
&lt;br /&gt;
*'''15 (0x0F)'''- запис значень в кілька регістрів прапорів''(Force Multiple Coils)''&lt;br /&gt;
*'''16 (0x10)'''- запис значень в кілька регістрів зберігання''(Preset Multiple Registers)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента, кількості змінюваних елементів, кількості переданих байт встановлюваних значень і самих встановлюваних значень. Дані упаковуються так само, як в командах читання даних.&lt;br /&gt;
&lt;br /&gt;
Відповідь складається з початкової адреси і кількості змінених елементів.&lt;br /&gt;
&lt;br /&gt;
Нижче наведено приклад команди ведучого пристрою і відповіді веденого (для Modbus RTU).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 06 Кількість байт даних&lt;br /&gt;
! 07 Дані (значення для прапорів біти 0-7)&lt;br /&gt;
! 08 Дані (значення для прапорів біти 8-15)&lt;br /&gt;
! 09 CRC мл. байт&lt;br /&gt;
! 0A CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Master → Slave &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x02 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCD &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x72 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCB &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 05 CRC мл. байт&lt;br /&gt;
! 06 CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Slave → Master &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x24 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x09 &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Контроль помилок у протоколі Modbus RTU ==&lt;br /&gt;
&lt;br /&gt;
Під час обміну даними можуть виникати помилки двох типів:&lt;br /&gt;
* Помилки, пов'язані з спотвореннями при передачі даних;&lt;br /&gt;
* Логічні помилки.&lt;br /&gt;
&lt;br /&gt;
Помилки першого типу виявляються за допомогою фреймів символів, контролю парності і циклічної контрольної суми [[CRC]]-16-IBM (використовується число-[[поліном]] = 0xA001). При цьому молодший байт передається першим, на відміну від байтів адреси і значення регістра в PDU&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RTU фрейм ===&lt;br /&gt;
&lt;br /&gt;
У RTU режимі повідомлення має починатися і закінчуватися інтервалом тиші - часом передачі не менше 3.5 символів при даній швидкості в мережі. Першим полем потім передається адреса пристрою.&lt;br /&gt;
&lt;br /&gt;
Слідом за останнім переданим символом також слід інтервал тиші тривалістю не менше 3.5 символів. Нове повідомлення може починатися після цього інтервалу.&lt;br /&gt;
&lt;br /&gt;
Фрейм повідомлення передається безперервно. Якщо інтервал тиші тривалістю 1.5 виник під час передачі фрейму, приймаючий пристрій повинен ігнорувати цей фрейм як неповний.&lt;br /&gt;
&lt;br /&gt;
Таким чином, нове повідомлення повинно починатися не раніше 3.5 інтервалу, так як в цьому випадку встановлюється помилка.&lt;br /&gt;
&lt;br /&gt;
Трохи про інтервали (мова йде про Serial Modbus RTU):&lt;br /&gt;
при швидкості 9600 і 11 бітах в кадрі (стартовий біт + 8 біт даних + біт контролю парності + стоп-біт):&lt;br /&gt;
3.5 * 11 / 9600 = 0,00401041 (6), тобто більше 4 мс;&lt;br /&gt;
1.5 * 11 / 9600 = 0,00171875, тобто більше 1 мс.&lt;br /&gt;
Для швидкостей більше 19200 бод допускається використовувати інтервали 1,75 і 0,75 мс відповідно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Логічні помилки ===&lt;br /&gt;
Для повідомлень про помилки другого типу протокол Modbus RTU передбачає, що пристрої можуть відсилати відповіді, що свідчать про помилкову ситуації.&lt;br /&gt;
Ознакою того, що відповідь містить повідомлення про помилку, є встановлений старший біт коду команди.&lt;br /&gt;
Приклад кадру при виявленні помилки веденим пристроєм, у відповідь на запит наведено в (Таблиця 2-1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Якщо Slave приймає коректний запит і може його нормально обробити, то повертає стандартний відповідь.&lt;br /&gt;
&lt;br /&gt;
2. Якщо Slave не приймає будь-якого значення, ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
3. Якщо Slave приймає запит, але виявляє помилку (parity, LRC, or CRC), ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
4. Якщо Slave приймає запит, але не може його обробити (звернення до неіснуючого регістру і т. д.), відправляється відповідь містить у собі дані про помилку.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Кадр відповіді (Slave → Master) при виникненні помилки modbus RTU'''&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! Адресу підлеглого пристрою&lt;br /&gt;
! Номер функції&lt;br /&gt;
! Дані (або код помилки)&lt;br /&gt;
! CRC&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Запит (Master → Slave) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x77 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xDD &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xC7 0xA9&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Відповідь (Slave → Master) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xF7 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xEE &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xE6 0x7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Стандартні коди помилок ====&lt;br /&gt;
* 01 - Прийнятий код функції не може бути опрацьований на підпорядкованому.&lt;br /&gt;
* 02 - Адреса даних, вказаний у запиті, не доступний даному підлеглому.&lt;br /&gt;
* 03 - Величина, що міститься в полі даних запиту, є неприпустимою величиною для підлеглого.&lt;br /&gt;
* 04 - невідновлювальних помилка мала місце, поки підлеглий намагався виконати затребованное дію.&lt;br /&gt;
* 05 - Підлеглий прийняв запит і обробляє його, але це вимагає багато часу. Ця відповідь оберігає головного від генерації помилки тайм-ауту.&lt;br /&gt;
* 06 - Підлеглий зайнятий обробкою команди. Головний повинен повторити повідомлення пізніше, коли підлеглий звільниться.&lt;br /&gt;
* 07 - Підлеглий не може виконати програмну функцію, прийняту в запиті. Цей код повертається для невдалого програмного запиту, що використовує функції з номерами 13 або 14. Головний повинен запросити діагностичну інформацію або інформацію про помилки з підлеглого.&lt;br /&gt;
* 08 - Підлеглий намагається читати розширену пам'ять, але виявив помилку паритету. Головний може повторити запит, але звичайно в таких випадках потрібний ремонт.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Зовнішні посилання ==&lt;br /&gt;
Посилання у різних вільних енциклопедіях (wikipedia):&lt;br /&gt;
# [http://uk.wikipedia.org/wiki/Modbus  українська]&lt;br /&gt;
# [http://ru.wikipedia.org/wiki/Modbus  російська]&lt;br /&gt;
# [http://en.wikipedia.org/wiki/Modbus  англійська]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Посилання на використані в статті джерела ==&lt;br /&gt;
* [http://plc24.ru/manual/simple/konf_oborud/ Навчальні матеріали ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.modbus.org Modbus-IDA некомерційна організація, яка підтримує цей протокол ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.modbus.org/tech.php Оригінальні специфікації протоколу англійською мовою ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.modbus-ida.org/specs.php Modbus Specifications and Implementation Guides (ModBus TCP \\ IP) ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.writely.com/Doc.aspx?id=ahkq5zp9f42n Введення в Modbus протокол ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.modicon.com/techpubs/toc7.html Опис стандартного протоколу ModBus англійською мовою ]&lt;br /&gt;
&lt;br /&gt;
* [http://sourceforge.net/projects/libmodbus/ Бібліотека для роботи з протоколом modbus в GNU / Linux ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.simplymodbus.ca/FAQ.htm Як Modbus працює ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.modbus.pl/index.html Site for software developers which develop, test modbus protocol in drivers, devices, PLC etc. ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.freemodbus.org FreeModbus - ASCII / RTU і TCP для мікроконтролерів ]&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14553</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14553"/>
				<updated>2012-04-16T14:04:55Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Web member.gif|thumb|right|300 px|Логотип Modbus]]&lt;br /&gt;
'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).[1]&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.[2]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Buses-main.jpg|thumb|right|300 px|Організація Modbus-IDA]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Modbustcp.jpg|thumb|right|300 px|Мережа Modbus]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Modbus tcp.jpg|thumb|300 px|Приклад мережі Modbus]]&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції:&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані:&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адреса відомого пристрою  . &lt;br /&gt;
! код функції   .&lt;br /&gt;
! дані   .&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адреса відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції  .&lt;br /&gt;
! ід протоколу  .&lt;br /&gt;
! довжина пакету  .&lt;br /&gt;
! адресу відомого пристрою  .&lt;br /&gt;
! код функції  .&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Елементи|| Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандартні функції протоколу Modbus ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright thumb&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
|+ '''PDU запиту і відповіді для стандартних функцій'''&lt;br /&gt;
! номер &amp;lt;br /&amp;gt; функції&lt;br /&gt;
! colspan = &amp;quot;6&amp;quot; | запит / відповідь&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 1 (0x01)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 2 (0x02)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 3 (0x03)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 4 (0x04)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 5 (0x05)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 6 (0x06)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 15 (0x0F)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 16 (0x10)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
*'''A &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''A &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - адреса елемента,&lt;br /&gt;
*'''Q &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''Q &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - кількість елементів,&lt;br /&gt;
*'''N''' - кількість байт даних&lt;br /&gt;
*'''D''' - дані&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Читання даних ===&lt;br /&gt;
&lt;br /&gt;
Для читання значень з перерахованих вище таблиць даних використовуються функції з кодами 1-4 шістнадцяткові значення 0x01-0x04):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''1 (0x01)'''- читання значень з декількох регістрів прапорів''(Read Coil Status)''&lt;br /&gt;
*'''2 (0x02)'''- читання значень з декількох дискретних входів''(Read Discrete Inputs)''&lt;br /&gt;
*'''3 (0x03)'''- читання значень з декількох регістрів зберігання''(Read Holding Registers)''&lt;br /&gt;
*'''4 (0x04)'''- читання значень з декількох регістрів введення''(Read Input Registers)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запит складається із адреси першого елемента таблиці, яку потрібно прочитати, і кількості зчитувальних елементів. Адреса та кількість даних задаються 16-бітними числами, старший байт кожного з них передається першим.&lt;br /&gt;
&lt;br /&gt;
У відповіді передаються запитані дані. Кількість байт даних залежить від кількості замовлених елементів. Перед даними передається один байт, значення якого дорівнює кількості байт даних.&lt;br /&gt;
&lt;br /&gt;
Значення регістрів зберігання і регістрів введення передаються починаючи із зазначеної адреси, по два байти на регістр, старший байт кожного регістру передається першим:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! байт 1 || байт 2 || байт 3 || байт 4 || ... || байт N-1 || байт N&lt;br /&gt;
|-&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A +1,1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A +1,0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A + Q-1, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A + Q-1, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Значення прапорів і дискретних входів передаються в упакованому вигляді: по одному біту на прапор.&lt;br /&gt;
Одиниця означає включений стан, нуль - вимкнений.&lt;br /&gt;
Значення запитаних прапорів заповнюють спочатку перший байт, починаючи з молодшого біта, потім наступні байти, також від молодшого біта до старших.&lt;br /&gt;
Молодший біт першого байта даних містить значення прапора, зазначеного в полі «адресу».&lt;br /&gt;
Якщо запитано кількість прапорів, не кратне восьми, то значення додаткового біта заповнюються нулями:.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! colspan = &amp;quot;8&amp;quot; | байт 1&lt;br /&gt;
! ...&lt;br /&gt;
! colspan = &amp;quot;7&amp;quot; | байт N&lt;br /&gt;
|-&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +7&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +6&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +5&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +4&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +3&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис одного значення ===&lt;br /&gt;
&lt;br /&gt;
*'''5 (0x05)'''- запис значення одного прапора''(Force Single Coil)''&lt;br /&gt;
*'''6 (0x06)'''- запис значення в один регістр зберігання''(Preset Single Register)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента (2 байти) і встановлюваного значення (2 байти).&lt;br /&gt;
&lt;br /&gt;
Для регістру зберігання значення є просто 16-бітним словом.&lt;br /&gt;
&lt;br /&gt;
Для прапорів значення 0xFF00 означає включений стан, 0x0000 - вимкнений, інші значення неприпустимі.&lt;br /&gt;
&lt;br /&gt;
Якщо команда виконана успішно, ведене пристрій повертає копію запиту.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис декількох значень ===&lt;br /&gt;
&lt;br /&gt;
*'''15 (0x0F)'''- запис значень в кілька регістрів прапорів''(Force Multiple Coils)''&lt;br /&gt;
*'''16 (0x10)'''- запис значень в кілька регістрів зберігання''(Preset Multiple Registers)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента, кількості змінюваних елементів, кількості переданих байт встановлюваних значень і самих встановлюваних значень. Дані упаковуються так само, як в командах читання даних.&lt;br /&gt;
&lt;br /&gt;
Відповідь складається з початкової адреси і кількості змінених елементів.&lt;br /&gt;
&lt;br /&gt;
Нижче наведено приклад команди ведучого пристрою і відповіді веденого (для Modbus RTU).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 06 Кількість байт даних&lt;br /&gt;
! 07 Дані (значення для прапорів біти 0-7)&lt;br /&gt;
! 08 Дані (значення для прапорів біти 8-15)&lt;br /&gt;
! 09 CRC мл. байт&lt;br /&gt;
! 0A CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Master → Slave &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x02 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCD &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x72 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCB &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 05 CRC мл. байт&lt;br /&gt;
! 06 CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Slave → Master &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x24 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x09 &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Контроль помилок у протоколі Modbus RTU ==&lt;br /&gt;
&lt;br /&gt;
Під час обміну даними можуть виникати помилки двох типів:&lt;br /&gt;
* Помилки, пов'язані з спотвореннями при передачі даних;&lt;br /&gt;
* Логічні помилки.&lt;br /&gt;
&lt;br /&gt;
Помилки першого типу виявляються за допомогою фреймів символів, контролю парності і циклічної контрольної суми [[CRC]]-16-IBM (використовується число-[[поліном]] = 0xA001). При цьому молодший байт передається першим, на відміну від байтів адреси і значення регістра в PDU&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RTU фрейм ===&lt;br /&gt;
&lt;br /&gt;
У RTU режимі повідомлення має починатися і закінчуватися інтервалом тиші - часом передачі не менше 3.5 символів при даній швидкості в мережі. Першим полем потім передається адреса пристрою.&lt;br /&gt;
&lt;br /&gt;
Слідом за останнім переданим символом також слід інтервал тиші тривалістю не менше 3.5 символів. Нове повідомлення може починатися після цього інтервалу.&lt;br /&gt;
&lt;br /&gt;
Фрейм повідомлення передається безперервно. Якщо інтервал тиші тривалістю 1.5 виник під час передачі фрейму, приймаючий пристрій повинен ігнорувати цей фрейм як неповний.&lt;br /&gt;
&lt;br /&gt;
Таким чином, нове повідомлення повинно починатися не раніше 3.5 інтервалу, так як в цьому випадку встановлюється помилка.&lt;br /&gt;
&lt;br /&gt;
Трохи про інтервали (мова йде про Serial Modbus RTU):&lt;br /&gt;
при швидкості 9600 і 11 бітах в кадрі (стартовий біт + 8 біт даних + біт контролю парності + стоп-біт):&lt;br /&gt;
3.5 * 11 / 9600 = 0,00401041 (6), тобто більше 4 мс;&lt;br /&gt;
1.5 * 11 / 9600 = 0,00171875, тобто більше 1 мс.&lt;br /&gt;
Для швидкостей більше 19200 бод допускається використовувати інтервали 1,75 і 0,75 мс відповідно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Логічні помилки ===&lt;br /&gt;
Для повідомлень про помилки другого типу протокол Modbus RTU передбачає, що пристрої можуть відсилати відповіді, що свідчать про помилкову ситуації.&lt;br /&gt;
Ознакою того, що відповідь містить повідомлення про помилку, є встановлений старший біт коду команди.&lt;br /&gt;
Приклад кадру при виявленні помилки веденим пристроєм, у відповідь на запит наведено в (Таблиця 2-1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Якщо Slave приймає коректний запит і може його нормально обробити, то повертає стандартний відповідь.&lt;br /&gt;
&lt;br /&gt;
2. Якщо Slave не приймає будь-якого значення, ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
3. Якщо Slave приймає запит, але виявляє помилку (parity, LRC, or CRC), ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
4. Якщо Slave приймає запит, але не може його обробити (звернення до неіснуючого регістру і т. д.), відправляється відповідь містить у собі дані про помилку.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Кадр відповіді (Slave → Master) при виникненні помилки modbus RTU'''&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! Адресу підлеглого пристрою&lt;br /&gt;
! Номер функції&lt;br /&gt;
! Дані (або код помилки)&lt;br /&gt;
! CRC&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Запит (Master → Slave) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x77 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xDD &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xC7 0xA9&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Відповідь (Slave → Master) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xF7 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xEE &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xE6 0x7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Стандартні коди помилок ====&lt;br /&gt;
* 01 - Прийнятий код функції не може бути опрацьований на підпорядкованому.&lt;br /&gt;
* 02 - Адреса даних, вказаний у запиті, не доступний даному підлеглому.&lt;br /&gt;
* 03 - Величина, що міститься в полі даних запиту, є неприпустимою величиною для підлеглого.&lt;br /&gt;
* 04 - невідновлювальних помилка мала місце, поки підлеглий намагався виконати затребованное дію.&lt;br /&gt;
* 05 - Підлеглий прийняв запит і обробляє його, але це вимагає багато часу. Ця відповідь оберігає головного від генерації помилки тайм-ауту.&lt;br /&gt;
* 06 - Підлеглий зайнятий обробкою команди. Головний повинен повторити повідомлення пізніше, коли підлеглий звільниться.&lt;br /&gt;
* 07 - Підлеглий не може виконати програмну функцію, прийняту в запиті. Цей код повертається для невдалого програмного запиту, що використовує функції з номерами 13 або 14. Головний повинен запросити діагностичну інформацію або інформацію про помилки з підлеглого.&lt;br /&gt;
* 08 - Підлеглий намагається читати розширену пам'ять, але виявив помилку паритету. Головний може повторити запит, але звичайно в таких випадках потрібний ремонт.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Зовнішні посилання ==&lt;br /&gt;
Посилання у різних вільних енциклопедіях (wikipedia):&lt;br /&gt;
# [http://uk.wikipedia.org/wiki/Modbus  українська]&lt;br /&gt;
# [http://ru.wikipedia.org/wiki/Modbus  російська]&lt;br /&gt;
# [http://en.wikipedia.org/wiki/Modbus  англійська]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Посилання на використані в статті джерела ==&lt;br /&gt;
* [http://plc24.ru/manual/simple/konf_oborud/ Навчальні матеріали ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.modbus.org Modbus-IDA некомерційна організація, яка підтримує цей протокол ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.modbus.org/tech.php Оригінальні специфікації протоколу англійською мовою ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.modbus-ida.org/specs.php Modbus Specifications and Implementation Guides (ModBus TCP \\ IP) ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.writely.com/Doc.aspx?id=ahkq5zp9f42n Введення в Modbus протокол ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.modicon.com/techpubs/toc7.html Опис стандартного протоколу ModBus англійською мовою ]&lt;br /&gt;
&lt;br /&gt;
* [http://sourceforge.net/projects/libmodbus/ Бібліотека для роботи з протоколом modbus в GNU / Linux ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.simplymodbus.ca/FAQ.htm Як Modbus працює ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.modbus.pl/index.html Site for software developers which develop, test modbus protocol in drivers, devices, PLC etc. ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.freemodbus.org FreeModbus - ASCII / RTU і TCP для мікроконтролерів ]&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14552</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14552"/>
				<updated>2012-04-16T14:04:19Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Web member.gif|thumb|right|300 px|Логотип Modbus]]&lt;br /&gt;
'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Buses-main.jpg|thumb|right|300 px|Організація Modbus-IDA]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Modbustcp.jpg|thumb|right|300 px|Мережа Modbus]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Modbus tcp.jpg|thumb|300 px|Приклад мережі Modbus]]&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції:&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані:&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адреса відомого пристрою  . &lt;br /&gt;
! код функції   .&lt;br /&gt;
! дані   .&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адреса відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції  .&lt;br /&gt;
! ід протоколу  .&lt;br /&gt;
! довжина пакету  .&lt;br /&gt;
! адресу відомого пристрою  .&lt;br /&gt;
! код функції  .&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Елементи|| Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандартні функції протоколу Modbus ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright thumb&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
|+ '''PDU запиту і відповіді для стандартних функцій'''&lt;br /&gt;
! номер &amp;lt;br /&amp;gt; функції&lt;br /&gt;
! colspan = &amp;quot;6&amp;quot; | запит / відповідь&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 1 (0x01)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 2 (0x02)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 3 (0x03)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 4 (0x04)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 5 (0x05)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 6 (0x06)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 15 (0x0F)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 16 (0x10)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
*'''A &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''A &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - адреса елемента,&lt;br /&gt;
*'''Q &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''Q &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - кількість елементів,&lt;br /&gt;
*'''N''' - кількість байт даних&lt;br /&gt;
*'''D''' - дані&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Читання даних ===&lt;br /&gt;
&lt;br /&gt;
Для читання значень з перерахованих вище таблиць даних використовуються функції з кодами 1-4 шістнадцяткові значення 0x01-0x04):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''1 (0x01)'''- читання значень з декількох регістрів прапорів''(Read Coil Status)''&lt;br /&gt;
*'''2 (0x02)'''- читання значень з декількох дискретних входів''(Read Discrete Inputs)''&lt;br /&gt;
*'''3 (0x03)'''- читання значень з декількох регістрів зберігання''(Read Holding Registers)''&lt;br /&gt;
*'''4 (0x04)'''- читання значень з декількох регістрів введення''(Read Input Registers)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запит складається із адреси першого елемента таблиці, яку потрібно прочитати, і кількості зчитувальних елементів. Адреса та кількість даних задаються 16-бітними числами, старший байт кожного з них передається першим.&lt;br /&gt;
&lt;br /&gt;
У відповіді передаються запитані дані. Кількість байт даних залежить від кількості замовлених елементів. Перед даними передається один байт, значення якого дорівнює кількості байт даних.&lt;br /&gt;
&lt;br /&gt;
Значення регістрів зберігання і регістрів введення передаються починаючи із зазначеної адреси, по два байти на регістр, старший байт кожного регістру передається першим:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! байт 1 || байт 2 || байт 3 || байт 4 || ... || байт N-1 || байт N&lt;br /&gt;
|-&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A +1,1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A +1,0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A + Q-1, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A + Q-1, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Значення прапорів і дискретних входів передаються в упакованому вигляді: по одному біту на прапор.&lt;br /&gt;
Одиниця означає включений стан, нуль - вимкнений.&lt;br /&gt;
Значення запитаних прапорів заповнюють спочатку перший байт, починаючи з молодшого біта, потім наступні байти, також від молодшого біта до старших.&lt;br /&gt;
Молодший біт першого байта даних містить значення прапора, зазначеного в полі «адресу».&lt;br /&gt;
Якщо запитано кількість прапорів, не кратне восьми, то значення додаткового біта заповнюються нулями:.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! colspan = &amp;quot;8&amp;quot; | байт 1&lt;br /&gt;
! ...&lt;br /&gt;
! colspan = &amp;quot;7&amp;quot; | байт N&lt;br /&gt;
|-&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +7&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +6&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +5&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +4&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +3&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис одного значення ===&lt;br /&gt;
&lt;br /&gt;
*'''5 (0x05)'''- запис значення одного прапора''(Force Single Coil)''&lt;br /&gt;
*'''6 (0x06)'''- запис значення в один регістр зберігання''(Preset Single Register)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента (2 байти) і встановлюваного значення (2 байти).&lt;br /&gt;
&lt;br /&gt;
Для регістру зберігання значення є просто 16-бітним словом.&lt;br /&gt;
&lt;br /&gt;
Для прапорів значення 0xFF00 означає включений стан, 0x0000 - вимкнений, інші значення неприпустимі.&lt;br /&gt;
&lt;br /&gt;
Якщо команда виконана успішно, ведене пристрій повертає копію запиту.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис декількох значень ===&lt;br /&gt;
&lt;br /&gt;
*'''15 (0x0F)'''- запис значень в кілька регістрів прапорів''(Force Multiple Coils)''&lt;br /&gt;
*'''16 (0x10)'''- запис значень в кілька регістрів зберігання''(Preset Multiple Registers)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента, кількості змінюваних елементів, кількості переданих байт встановлюваних значень і самих встановлюваних значень. Дані упаковуються так само, як в командах читання даних.&lt;br /&gt;
&lt;br /&gt;
Відповідь складається з початкової адреси і кількості змінених елементів.&lt;br /&gt;
&lt;br /&gt;
Нижче наведено приклад команди ведучого пристрою і відповіді веденого (для Modbus RTU).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 06 Кількість байт даних&lt;br /&gt;
! 07 Дані (значення для прапорів біти 0-7)&lt;br /&gt;
! 08 Дані (значення для прапорів біти 8-15)&lt;br /&gt;
! 09 CRC мл. байт&lt;br /&gt;
! 0A CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Master → Slave &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x02 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCD &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x72 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCB &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 05 CRC мл. байт&lt;br /&gt;
! 06 CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Slave → Master &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x24 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x09 &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Контроль помилок у протоколі Modbus RTU ==&lt;br /&gt;
&lt;br /&gt;
Під час обміну даними можуть виникати помилки двох типів:&lt;br /&gt;
* Помилки, пов'язані з спотвореннями при передачі даних;&lt;br /&gt;
* Логічні помилки.&lt;br /&gt;
&lt;br /&gt;
Помилки першого типу виявляються за допомогою фреймів символів, контролю парності і циклічної контрольної суми [[CRC]]-16-IBM (використовується число-[[поліном]] = 0xA001). При цьому молодший байт передається першим, на відміну від байтів адреси і значення регістра в PDU&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RTU фрейм ===&lt;br /&gt;
&lt;br /&gt;
У RTU режимі повідомлення має починатися і закінчуватися інтервалом тиші - часом передачі не менше 3.5 символів при даній швидкості в мережі. Першим полем потім передається адреса пристрою.&lt;br /&gt;
&lt;br /&gt;
Слідом за останнім переданим символом також слід інтервал тиші тривалістю не менше 3.5 символів. Нове повідомлення може починатися після цього інтервалу.&lt;br /&gt;
&lt;br /&gt;
Фрейм повідомлення передається безперервно. Якщо інтервал тиші тривалістю 1.5 виник під час передачі фрейму, приймаючий пристрій повинен ігнорувати цей фрейм як неповний.&lt;br /&gt;
&lt;br /&gt;
Таким чином, нове повідомлення повинно починатися не раніше 3.5 інтервалу, так як в цьому випадку встановлюється помилка.&lt;br /&gt;
&lt;br /&gt;
Трохи про інтервали (мова йде про Serial Modbus RTU):&lt;br /&gt;
при швидкості 9600 і 11 бітах в кадрі (стартовий біт + 8 біт даних + біт контролю парності + стоп-біт):&lt;br /&gt;
3.5 * 11 / 9600 = 0,00401041 (6), тобто більше 4 мс;&lt;br /&gt;
1.5 * 11 / 9600 = 0,00171875, тобто більше 1 мс.&lt;br /&gt;
Для швидкостей більше 19200 бод допускається використовувати інтервали 1,75 і 0,75 мс відповідно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Логічні помилки ===&lt;br /&gt;
Для повідомлень про помилки другого типу протокол Modbus RTU передбачає, що пристрої можуть відсилати відповіді, що свідчать про помилкову ситуації.&lt;br /&gt;
Ознакою того, що відповідь містить повідомлення про помилку, є встановлений старший біт коду команди.&lt;br /&gt;
Приклад кадру при виявленні помилки веденим пристроєм, у відповідь на запит наведено в (Таблиця 2-1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Якщо Slave приймає коректний запит і може його нормально обробити, то повертає стандартний відповідь.&lt;br /&gt;
&lt;br /&gt;
2. Якщо Slave не приймає будь-якого значення, ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
3. Якщо Slave приймає запит, але виявляє помилку (parity, LRC, or CRC), ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
4. Якщо Slave приймає запит, але не може його обробити (звернення до неіснуючого регістру і т. д.), відправляється відповідь містить у собі дані про помилку.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Кадр відповіді (Slave → Master) при виникненні помилки modbus RTU'''&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! Адресу підлеглого пристрою&lt;br /&gt;
! Номер функції&lt;br /&gt;
! Дані (або код помилки)&lt;br /&gt;
! CRC&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Запит (Master → Slave) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x77 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xDD &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xC7 0xA9&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Відповідь (Slave → Master) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xF7 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xEE &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xE6 0x7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Стандартні коди помилок ====&lt;br /&gt;
* 01 - Прийнятий код функції не може бути опрацьований на підпорядкованому.&lt;br /&gt;
* 02 - Адреса даних, вказаний у запиті, не доступний даному підлеглому.&lt;br /&gt;
* 03 - Величина, що міститься в полі даних запиту, є неприпустимою величиною для підлеглого.&lt;br /&gt;
* 04 - невідновлювальних помилка мала місце, поки підлеглий намагався виконати затребованное дію.&lt;br /&gt;
* 05 - Підлеглий прийняв запит і обробляє його, але це вимагає багато часу. Ця відповідь оберігає головного від генерації помилки тайм-ауту.&lt;br /&gt;
* 06 - Підлеглий зайнятий обробкою команди. Головний повинен повторити повідомлення пізніше, коли підлеглий звільниться.&lt;br /&gt;
* 07 - Підлеглий не може виконати програмну функцію, прийняту в запиті. Цей код повертається для невдалого програмного запиту, що використовує функції з номерами 13 або 14. Головний повинен запросити діагностичну інформацію або інформацію про помилки з підлеглого.&lt;br /&gt;
* 08 - Підлеглий намагається читати розширену пам'ять, але виявив помилку паритету. Головний може повторити запит, але звичайно в таких випадках потрібний ремонт.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Зовнішні посилання ==&lt;br /&gt;
Посилання у різних вільних енциклопедіях (wikipedia):&lt;br /&gt;
# [http://uk.wikipedia.org/wiki/Modbus  українська]&lt;br /&gt;
# [http://ru.wikipedia.org/wiki/Modbus  російська]&lt;br /&gt;
# [http://en.wikipedia.org/wiki/Modbus  англійська]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Посилання на використані в статті джерела ==&lt;br /&gt;
* [http://plc24.ru/manual/simple/konf_oborud/ Навчальні матеріали ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.modbus.org Modbus-IDA некомерційна організація, яка підтримує цей протокол ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.modbus.org/tech.php Оригінальні специфікації протоколу англійською мовою ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.modbus-ida.org/specs.php Modbus Specifications and Implementation Guides (ModBus TCP \\ IP) ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.writely.com/Doc.aspx?id=ahkq5zp9f42n Введення в Modbus протокол ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.modicon.com/techpubs/toc7.html Опис стандартного протоколу ModBus англійською мовою ]&lt;br /&gt;
&lt;br /&gt;
* [http://sourceforge.net/projects/libmodbus/ Бібліотека для роботи з протоколом modbus в GNU / Linux ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.simplymodbus.ca/FAQ.htm Як Modbus працює ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.modbus.pl/index.html Site for software developers which develop, test modbus protocol in drivers, devices, PLC etc. ]&lt;br /&gt;
&lt;br /&gt;
* [http://www.freemodbus.org FreeModbus - ASCII / RTU і TCP для мікроконтролерів ]&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14551</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14551"/>
				<updated>2012-04-16T13:57:21Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Web member.gif|thumb|right|300 px|Логотип Modbus]]&lt;br /&gt;
'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Buses-main.jpg|thumb|right|300 px|Організація Modbus-IDA]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Modbustcp.jpg|thumb|right|300 px|Мережа Modbus]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Modbus tcp.jpg|thumb|300 px|Приклад мережі Modbus]]&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції:&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані:&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адреса відомого пристрою  . &lt;br /&gt;
! код функції   .&lt;br /&gt;
! дані   .&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адреса відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції  .&lt;br /&gt;
! ід протоколу  .&lt;br /&gt;
! довжина пакету  .&lt;br /&gt;
! адресу відомого пристрою  .&lt;br /&gt;
! код функції  .&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Елементи|| Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандартні функції протоколу Modbus ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright thumb&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
|+ '''PDU запиту і відповіді для стандартних функцій'''&lt;br /&gt;
! номер &amp;lt;br /&amp;gt; функції&lt;br /&gt;
! colspan = &amp;quot;6&amp;quot; | запит / відповідь&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 1 (0x01)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 2 (0x02)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 3 (0x03)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 4 (0x04)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 5 (0x05)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 6 (0x06)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 15 (0x0F)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 16 (0x10)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
*'''A &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''A &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - адреса елемента,&lt;br /&gt;
*'''Q &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''Q &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - кількість елементів,&lt;br /&gt;
*'''N''' - кількість байт даних&lt;br /&gt;
*'''D''' - дані&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Читання даних ===&lt;br /&gt;
&lt;br /&gt;
Для читання значень з перерахованих вище таблиць даних використовуються функції з кодами 1-4 шістнадцяткові значення 0x01-0x04):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''1 (0x01)'''- читання значень з декількох регістрів прапорів''(Read Coil Status)''&lt;br /&gt;
*'''2 (0x02)'''- читання значень з декількох дискретних входів''(Read Discrete Inputs)''&lt;br /&gt;
*'''3 (0x03)'''- читання значень з декількох регістрів зберігання''(Read Holding Registers)''&lt;br /&gt;
*'''4 (0x04)'''- читання значень з декількох регістрів введення''(Read Input Registers)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запит складається із адреси першого елемента таблиці, яку потрібно прочитати, і кількості зчитувальних елементів. Адреса та кількість даних задаються 16-бітними числами, старший байт кожного з них передається першим.&lt;br /&gt;
&lt;br /&gt;
У відповіді передаються запитані дані. Кількість байт даних залежить від кількості замовлених елементів. Перед даними передається один байт, значення якого дорівнює кількості байт даних.&lt;br /&gt;
&lt;br /&gt;
Значення регістрів зберігання і регістрів введення передаються починаючи із зазначеної адреси, по два байти на регістр, старший байт кожного регістру передається першим:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! байт 1 || байт 2 || байт 3 || байт 4 || ... || байт N-1 || байт N&lt;br /&gt;
|-&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A +1,1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A +1,0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A + Q-1, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A + Q-1, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Значення прапорів і дискретних входів передаються в упакованому вигляді: по одному біту на прапор.&lt;br /&gt;
Одиниця означає включений стан, нуль - вимкнений.&lt;br /&gt;
Значення запитаних прапорів заповнюють спочатку перший байт, починаючи з молодшого біта, потім наступні байти, також від молодшого біта до старших.&lt;br /&gt;
Молодший біт першого байта даних містить значення прапора, зазначеного в полі «адресу».&lt;br /&gt;
Якщо запитано кількість прапорів, не кратне восьми, то значення додаткового біта заповнюються нулями:.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! colspan = &amp;quot;8&amp;quot; | байт 1&lt;br /&gt;
! ...&lt;br /&gt;
! colspan = &amp;quot;7&amp;quot; | байт N&lt;br /&gt;
|-&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +7&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +6&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +5&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +4&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +3&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис одного значення ===&lt;br /&gt;
&lt;br /&gt;
*'''5 (0x05)'''- запис значення одного прапора''(Force Single Coil)''&lt;br /&gt;
*'''6 (0x06)'''- запис значення в один регістр зберігання''(Preset Single Register)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента (2 байти) і встановлюваного значення (2 байти).&lt;br /&gt;
&lt;br /&gt;
Для регістру зберігання значення є просто 16-бітним словом.&lt;br /&gt;
&lt;br /&gt;
Для прапорів значення 0xFF00 означає включений стан, 0x0000 - вимкнений, інші значення неприпустимі.&lt;br /&gt;
&lt;br /&gt;
Якщо команда виконана успішно, ведене пристрій повертає копію запиту.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис декількох значень ===&lt;br /&gt;
&lt;br /&gt;
*'''15 (0x0F)'''- запис значень в кілька регістрів прапорів''(Force Multiple Coils)''&lt;br /&gt;
*'''16 (0x10)'''- запис значень в кілька регістрів зберігання''(Preset Multiple Registers)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента, кількості змінюваних елементів, кількості переданих байт встановлюваних значень і самих встановлюваних значень. Дані упаковуються так само, як в командах читання даних.&lt;br /&gt;
&lt;br /&gt;
Відповідь складається з початкової адреси і кількості змінених елементів.&lt;br /&gt;
&lt;br /&gt;
Нижче наведено приклад команди ведучого пристрою і відповіді веденого (для Modbus RTU).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 06 Кількість байт даних&lt;br /&gt;
! 07 Дані (значення для прапорів біти 0-7)&lt;br /&gt;
! 08 Дані (значення для прапорів біти 8-15)&lt;br /&gt;
! 09 CRC мл. байт&lt;br /&gt;
! 0A CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Master → Slave &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x02 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCD &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x72 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCB &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 05 CRC мл. байт&lt;br /&gt;
! 06 CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Slave → Master &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x24 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x09 &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Контроль помилок у протоколі Modbus RTU ==&lt;br /&gt;
&lt;br /&gt;
Під час обміну даними можуть виникати помилки двох типів:&lt;br /&gt;
* Помилки, пов'язані з спотвореннями при передачі даних;&lt;br /&gt;
* Логічні помилки.&lt;br /&gt;
&lt;br /&gt;
Помилки першого типу виявляються за допомогою фреймів символів, контролю парності і циклічної контрольної суми [[CRC]]-16-IBM (використовується число-[[поліном]] = 0xA001). При цьому молодший байт передається першим, на відміну від байтів адреси і значення регістра в PDU&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RTU фрейм ===&lt;br /&gt;
&lt;br /&gt;
У RTU режимі повідомлення має починатися і закінчуватися інтервалом тиші - часом передачі не менше 3.5 символів при даній швидкості в мережі. Першим полем потім передається адреса пристрою.&lt;br /&gt;
&lt;br /&gt;
Слідом за останнім переданим символом також слід інтервал тиші тривалістю не менше 3.5 символів. Нове повідомлення може починатися після цього інтервалу.&lt;br /&gt;
&lt;br /&gt;
Фрейм повідомлення передається безперервно. Якщо інтервал тиші тривалістю 1.5 виник під час передачі фрейму, приймаючий пристрій повинен ігнорувати цей фрейм як неповний.&lt;br /&gt;
&lt;br /&gt;
Таким чином, нове повідомлення повинно починатися не раніше 3.5 інтервалу, так як в цьому випадку встановлюється помилка.&lt;br /&gt;
&lt;br /&gt;
Трохи про інтервали (мова йде про Serial Modbus RTU):&lt;br /&gt;
при швидкості 9600 і 11 бітах в кадрі (стартовий біт + 8 біт даних + біт контролю парності + стоп-біт):&lt;br /&gt;
3.5 * 11 / 9600 = 0,00401041 (6), тобто більше 4 мс;&lt;br /&gt;
1.5 * 11 / 9600 = 0,00171875, тобто більше 1 мс.&lt;br /&gt;
Для швидкостей більше 19200 бод допускається використовувати інтервали 1,75 і 0,75 мс відповідно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Логічні помилки ===&lt;br /&gt;
Для повідомлень про помилки другого типу протокол Modbus RTU передбачає, що пристрої можуть відсилати відповіді, що свідчать про помилкову ситуації.&lt;br /&gt;
Ознакою того, що відповідь містить повідомлення про помилку, є встановлений старший біт коду команди.&lt;br /&gt;
Приклад кадру при виявленні помилки веденим пристроєм, у відповідь на запит наведено в (Таблиця 2-1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Якщо Slave приймає коректний запит і може його нормально обробити, то повертає стандартний відповідь.&lt;br /&gt;
&lt;br /&gt;
2. Якщо Slave не приймає будь-якого значення, ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
3. Якщо Slave приймає запит, але виявляє помилку (parity, LRC, or CRC), ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
4. Якщо Slave приймає запит, але не може його обробити (звернення до неіснуючого регістру і т. д.), відправляється відповідь містить у собі дані про помилку.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Кадр відповіді (Slave → Master) при виникненні помилки modbus RTU'''&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! Адресу підлеглого пристрою&lt;br /&gt;
! Номер функції&lt;br /&gt;
! Дані (або код помилки)&lt;br /&gt;
! CRC&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Запит (Master → Slave) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x77 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xDD &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xC7 0xA9&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Відповідь (Slave → Master) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xF7 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xEE &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xE6 0x7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Стандартні коди помилок ====&lt;br /&gt;
* 01 - Прийнятий код функції не може бути опрацьований на підпорядкованому.&lt;br /&gt;
* 02 - Адреса даних, вказаний у запиті, не доступний даному підлеглому.&lt;br /&gt;
* 03 - Величина, що міститься в полі даних запиту, є неприпустимою величиною для підлеглого.&lt;br /&gt;
* 04 - невідновлювальних помилка мала місце, поки підлеглий намагався виконати затребованное дію.&lt;br /&gt;
* 05 - Підлеглий прийняв запит і обробляє його, але це вимагає багато часу. Ця відповідь оберігає головного від генерації помилки тайм-ауту.&lt;br /&gt;
* 06 - Підлеглий зайнятий обробкою команди. Головний повинен повторити повідомлення пізніше, коли підлеглий звільниться.&lt;br /&gt;
* 07 - Підлеглий не може виконати програмну функцію, прийняту в запиті. Цей код повертається для невдалого програмного запиту, що використовує функції з номерами 13 або 14. Головний повинен запросити діагностичну інформацію або інформацію про помилки з підлеглого.&lt;br /&gt;
* 08 - Підлеглий намагається читати розширену пам'ять, але виявив помилку паритету. Головний може повторити запит, але звичайно в таких випадках потрібний ремонт.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Зовнішні посилання ==&lt;br /&gt;
Посилання у різних вільних енциклопедіях (wikipedia):&lt;br /&gt;
* [http://uk.wikipedia.org/wiki/Modbus  українська]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/Modbus  російська]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Modbus  англійська]&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Modbustcp.jpg&amp;diff=14550</id>
		<title>Файл:Modbustcp.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Modbustcp.jpg&amp;diff=14550"/>
				<updated>2012-04-16T13:56:33Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14549</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14549"/>
				<updated>2012-04-16T13:55:11Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Buses-main.jpg|thumb|right|300 px|Організація Modbus-IDA]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Web member.gif|thumb|right|300 px|Логотип Modbus]]&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Modbus tcp.jpg|thumb|300 px|Приклад мережі Modbus]]&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції:&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані:&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адреса відомого пристрою  . &lt;br /&gt;
! код функції   .&lt;br /&gt;
! дані   .&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адреса відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції  .&lt;br /&gt;
! ід протоколу  .&lt;br /&gt;
! довжина пакету  .&lt;br /&gt;
! адресу відомого пристрою  .&lt;br /&gt;
! код функції  .&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Елементи|| Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандартні функції протоколу Modbus ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright thumb&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
|+ '''PDU запиту і відповіді для стандартних функцій'''&lt;br /&gt;
! номер &amp;lt;br /&amp;gt; функції&lt;br /&gt;
! colspan = &amp;quot;6&amp;quot; | запит / відповідь&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 1 (0x01)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 2 (0x02)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 3 (0x03)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 4 (0x04)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 5 (0x05)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 6 (0x06)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 15 (0x0F)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 16 (0x10)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
*'''A &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''A &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - адреса елемента,&lt;br /&gt;
*'''Q &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''Q &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - кількість елементів,&lt;br /&gt;
*'''N''' - кількість байт даних&lt;br /&gt;
*'''D''' - дані&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Читання даних ===&lt;br /&gt;
&lt;br /&gt;
Для читання значень з перерахованих вище таблиць даних використовуються функції з кодами 1-4 шістнадцяткові значення 0x01-0x04):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''1 (0x01)'''- читання значень з декількох регістрів прапорів''(Read Coil Status)''&lt;br /&gt;
*'''2 (0x02)'''- читання значень з декількох дискретних входів''(Read Discrete Inputs)''&lt;br /&gt;
*'''3 (0x03)'''- читання значень з декількох регістрів зберігання''(Read Holding Registers)''&lt;br /&gt;
*'''4 (0x04)'''- читання значень з декількох регістрів введення''(Read Input Registers)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запит складається із адреси першого елемента таблиці, яку потрібно прочитати, і кількості зчитувальних елементів. Адреса та кількість даних задаються 16-бітними числами, старший байт кожного з них передається першим.&lt;br /&gt;
&lt;br /&gt;
У відповіді передаються запитані дані. Кількість байт даних залежить від кількості замовлених елементів. Перед даними передається один байт, значення якого дорівнює кількості байт даних.&lt;br /&gt;
&lt;br /&gt;
Значення регістрів зберігання і регістрів введення передаються починаючи із зазначеної адреси, по два байти на регістр, старший байт кожного регістру передається першим:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! байт 1 || байт 2 || байт 3 || байт 4 || ... || байт N-1 || байт N&lt;br /&gt;
|-&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A +1,1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A +1,0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A + Q-1, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A + Q-1, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Значення прапорів і дискретних входів передаються в упакованому вигляді: по одному біту на прапор.&lt;br /&gt;
Одиниця означає включений стан, нуль - вимкнений.&lt;br /&gt;
Значення запитаних прапорів заповнюють спочатку перший байт, починаючи з молодшого біта, потім наступні байти, також від молодшого біта до старших.&lt;br /&gt;
Молодший біт першого байта даних містить значення прапора, зазначеного в полі «адресу».&lt;br /&gt;
Якщо запитано кількість прапорів, не кратне восьми, то значення додаткового біта заповнюються нулями:.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! colspan = &amp;quot;8&amp;quot; | байт 1&lt;br /&gt;
! ...&lt;br /&gt;
! colspan = &amp;quot;7&amp;quot; | байт N&lt;br /&gt;
|-&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +7&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +6&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +5&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +4&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +3&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис одного значення ===&lt;br /&gt;
&lt;br /&gt;
*'''5 (0x05)'''- запис значення одного прапора''(Force Single Coil)''&lt;br /&gt;
*'''6 (0x06)'''- запис значення в один регістр зберігання''(Preset Single Register)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента (2 байти) і встановлюваного значення (2 байти).&lt;br /&gt;
&lt;br /&gt;
Для регістру зберігання значення є просто 16-бітним словом.&lt;br /&gt;
&lt;br /&gt;
Для прапорів значення 0xFF00 означає включений стан, 0x0000 - вимкнений, інші значення неприпустимі.&lt;br /&gt;
&lt;br /&gt;
Якщо команда виконана успішно, ведене пристрій повертає копію запиту.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис декількох значень ===&lt;br /&gt;
&lt;br /&gt;
*'''15 (0x0F)'''- запис значень в кілька регістрів прапорів''(Force Multiple Coils)''&lt;br /&gt;
*'''16 (0x10)'''- запис значень в кілька регістрів зберігання''(Preset Multiple Registers)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента, кількості змінюваних елементів, кількості переданих байт встановлюваних значень і самих встановлюваних значень. Дані упаковуються так само, як в командах читання даних.&lt;br /&gt;
&lt;br /&gt;
Відповідь складається з початкової адреси і кількості змінених елементів.&lt;br /&gt;
&lt;br /&gt;
Нижче наведено приклад команди ведучого пристрою і відповіді веденого (для Modbus RTU).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 06 Кількість байт даних&lt;br /&gt;
! 07 Дані (значення для прапорів біти 0-7)&lt;br /&gt;
! 08 Дані (значення для прапорів біти 8-15)&lt;br /&gt;
! 09 CRC мл. байт&lt;br /&gt;
! 0A CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Master → Slave &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x02 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCD &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x72 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCB &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 05 CRC мл. байт&lt;br /&gt;
! 06 CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Slave → Master &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x24 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x09 &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Контроль помилок у протоколі Modbus RTU ==&lt;br /&gt;
&lt;br /&gt;
Під час обміну даними можуть виникати помилки двох типів:&lt;br /&gt;
* Помилки, пов'язані з спотвореннями при передачі даних;&lt;br /&gt;
* Логічні помилки.&lt;br /&gt;
&lt;br /&gt;
Помилки першого типу виявляються за допомогою фреймів символів, контролю парності і циклічної контрольної суми [[CRC]]-16-IBM (використовується число-[[поліном]] = 0xA001). При цьому молодший байт передається першим, на відміну від байтів адреси і значення регістра в PDU&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RTU фрейм ===&lt;br /&gt;
&lt;br /&gt;
У RTU режимі повідомлення має починатися і закінчуватися інтервалом тиші - часом передачі не менше 3.5 символів при даній швидкості в мережі. Першим полем потім передається адреса пристрою.&lt;br /&gt;
&lt;br /&gt;
Слідом за останнім переданим символом також слід інтервал тиші тривалістю не менше 3.5 символів. Нове повідомлення може починатися після цього інтервалу.&lt;br /&gt;
&lt;br /&gt;
Фрейм повідомлення передається безперервно. Якщо інтервал тиші тривалістю 1.5 виник під час передачі фрейму, приймаючий пристрій повинен ігнорувати цей фрейм як неповний.&lt;br /&gt;
&lt;br /&gt;
Таким чином, нове повідомлення повинно починатися не раніше 3.5 інтервалу, так як в цьому випадку встановлюється помилка.&lt;br /&gt;
&lt;br /&gt;
Трохи про інтервали (мова йде про Serial Modbus RTU):&lt;br /&gt;
при швидкості 9600 і 11 бітах в кадрі (стартовий біт + 8 біт даних + біт контролю парності + стоп-біт):&lt;br /&gt;
3.5 * 11 / 9600 = 0,00401041 (6), тобто більше 4 мс;&lt;br /&gt;
1.5 * 11 / 9600 = 0,00171875, тобто більше 1 мс.&lt;br /&gt;
Для швидкостей більше 19200 бод допускається використовувати інтервали 1,75 і 0,75 мс відповідно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Логічні помилки ===&lt;br /&gt;
Для повідомлень про помилки другого типу протокол Modbus RTU передбачає, що пристрої можуть відсилати відповіді, що свідчать про помилкову ситуації.&lt;br /&gt;
Ознакою того, що відповідь містить повідомлення про помилку, є встановлений старший біт коду команди.&lt;br /&gt;
Приклад кадру при виявленні помилки веденим пристроєм, у відповідь на запит наведено в (Таблиця 2-1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Якщо Slave приймає коректний запит і може його нормально обробити, то повертає стандартний відповідь.&lt;br /&gt;
&lt;br /&gt;
2. Якщо Slave не приймає будь-якого значення, ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
3. Якщо Slave приймає запит, але виявляє помилку (parity, LRC, or CRC), ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
4. Якщо Slave приймає запит, але не може його обробити (звернення до неіснуючого регістру і т. д.), відправляється відповідь містить у собі дані про помилку.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Кадр відповіді (Slave → Master) при виникненні помилки modbus RTU'''&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! Адресу підлеглого пристрою&lt;br /&gt;
! Номер функції&lt;br /&gt;
! Дані (або код помилки)&lt;br /&gt;
! CRC&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Запит (Master → Slave) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x77 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xDD &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xC7 0xA9&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Відповідь (Slave → Master) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xF7 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xEE &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xE6 0x7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Стандартні коди помилок ====&lt;br /&gt;
* 01 - Прийнятий код функції не може бути опрацьований на підпорядкованому.&lt;br /&gt;
* 02 - Адреса даних, вказаний у запиті, не доступний даному підлеглому.&lt;br /&gt;
* 03 - Величина, що міститься в полі даних запиту, є неприпустимою величиною для підлеглого.&lt;br /&gt;
* 04 - невідновлювальних помилка мала місце, поки підлеглий намагався виконати затребованное дію.&lt;br /&gt;
* 05 - Підлеглий прийняв запит і обробляє його, але це вимагає багато часу. Ця відповідь оберігає головного від генерації помилки тайм-ауту.&lt;br /&gt;
* 06 - Підлеглий зайнятий обробкою команди. Головний повинен повторити повідомлення пізніше, коли підлеглий звільниться.&lt;br /&gt;
* 07 - Підлеглий не може виконати програмну функцію, прийняту в запиті. Цей код повертається для невдалого програмного запиту, що використовує функції з номерами 13 або 14. Головний повинен запросити діагностичну інформацію або інформацію про помилки з підлеглого.&lt;br /&gt;
* 08 - Підлеглий намагається читати розширену пам'ять, але виявив помилку паритету. Головний може повторити запит, але звичайно в таких випадках потрібний ремонт.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Зовнішні посилання ==&lt;br /&gt;
Посилання у різних вільних енциклопедіях (wikipedia):&lt;br /&gt;
* [http://uk.wikipedia.org/wiki/Modbus  українська]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/Modbus  російська]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Modbus  англійська]&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14548</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14548"/>
				<updated>2012-04-16T13:54:42Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: /* Історія */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Buses-main.jpg|thumb|right|300 px|Організація Modbus-IDA]]&lt;br /&gt;
[[Файл:Web member.gif|thumb|right|300 px|Логотип Modbus]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Modbus tcp.jpg|thumb|300 px|Приклад мережі Modbus]]&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції:&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані:&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адреса відомого пристрою  . &lt;br /&gt;
! код функції   .&lt;br /&gt;
! дані   .&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адреса відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції  .&lt;br /&gt;
! ід протоколу  .&lt;br /&gt;
! довжина пакету  .&lt;br /&gt;
! адресу відомого пристрою  .&lt;br /&gt;
! код функції  .&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Елементи|| Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандартні функції протоколу Modbus ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright thumb&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
|+ '''PDU запиту і відповіді для стандартних функцій'''&lt;br /&gt;
! номер &amp;lt;br /&amp;gt; функції&lt;br /&gt;
! colspan = &amp;quot;6&amp;quot; | запит / відповідь&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 1 (0x01)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 2 (0x02)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 3 (0x03)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 4 (0x04)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 5 (0x05)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 6 (0x06)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 15 (0x0F)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 16 (0x10)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
*'''A &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''A &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - адреса елемента,&lt;br /&gt;
*'''Q &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''Q &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - кількість елементів,&lt;br /&gt;
*'''N''' - кількість байт даних&lt;br /&gt;
*'''D''' - дані&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Читання даних ===&lt;br /&gt;
&lt;br /&gt;
Для читання значень з перерахованих вище таблиць даних використовуються функції з кодами 1-4 шістнадцяткові значення 0x01-0x04):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''1 (0x01)'''- читання значень з декількох регістрів прапорів''(Read Coil Status)''&lt;br /&gt;
*'''2 (0x02)'''- читання значень з декількох дискретних входів''(Read Discrete Inputs)''&lt;br /&gt;
*'''3 (0x03)'''- читання значень з декількох регістрів зберігання''(Read Holding Registers)''&lt;br /&gt;
*'''4 (0x04)'''- читання значень з декількох регістрів введення''(Read Input Registers)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запит складається із адреси першого елемента таблиці, яку потрібно прочитати, і кількості зчитувальних елементів. Адреса та кількість даних задаються 16-бітними числами, старший байт кожного з них передається першим.&lt;br /&gt;
&lt;br /&gt;
У відповіді передаються запитані дані. Кількість байт даних залежить від кількості замовлених елементів. Перед даними передається один байт, значення якого дорівнює кількості байт даних.&lt;br /&gt;
&lt;br /&gt;
Значення регістрів зберігання і регістрів введення передаються починаючи із зазначеної адреси, по два байти на регістр, старший байт кожного регістру передається першим:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! байт 1 || байт 2 || байт 3 || байт 4 || ... || байт N-1 || байт N&lt;br /&gt;
|-&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A +1,1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A +1,0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A + Q-1, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A + Q-1, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Значення прапорів і дискретних входів передаються в упакованому вигляді: по одному біту на прапор.&lt;br /&gt;
Одиниця означає включений стан, нуль - вимкнений.&lt;br /&gt;
Значення запитаних прапорів заповнюють спочатку перший байт, починаючи з молодшого біта, потім наступні байти, також від молодшого біта до старших.&lt;br /&gt;
Молодший біт першого байта даних містить значення прапора, зазначеного в полі «адресу».&lt;br /&gt;
Якщо запитано кількість прапорів, не кратне восьми, то значення додаткового біта заповнюються нулями:.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! colspan = &amp;quot;8&amp;quot; | байт 1&lt;br /&gt;
! ...&lt;br /&gt;
! colspan = &amp;quot;7&amp;quot; | байт N&lt;br /&gt;
|-&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +7&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +6&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +5&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +4&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +3&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис одного значення ===&lt;br /&gt;
&lt;br /&gt;
*'''5 (0x05)'''- запис значення одного прапора''(Force Single Coil)''&lt;br /&gt;
*'''6 (0x06)'''- запис значення в один регістр зберігання''(Preset Single Register)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента (2 байти) і встановлюваного значення (2 байти).&lt;br /&gt;
&lt;br /&gt;
Для регістру зберігання значення є просто 16-бітним словом.&lt;br /&gt;
&lt;br /&gt;
Для прапорів значення 0xFF00 означає включений стан, 0x0000 - вимкнений, інші значення неприпустимі.&lt;br /&gt;
&lt;br /&gt;
Якщо команда виконана успішно, ведене пристрій повертає копію запиту.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис декількох значень ===&lt;br /&gt;
&lt;br /&gt;
*'''15 (0x0F)'''- запис значень в кілька регістрів прапорів''(Force Multiple Coils)''&lt;br /&gt;
*'''16 (0x10)'''- запис значень в кілька регістрів зберігання''(Preset Multiple Registers)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента, кількості змінюваних елементів, кількості переданих байт встановлюваних значень і самих встановлюваних значень. Дані упаковуються так само, як в командах читання даних.&lt;br /&gt;
&lt;br /&gt;
Відповідь складається з початкової адреси і кількості змінених елементів.&lt;br /&gt;
&lt;br /&gt;
Нижче наведено приклад команди ведучого пристрою і відповіді веденого (для Modbus RTU).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 06 Кількість байт даних&lt;br /&gt;
! 07 Дані (значення для прапорів біти 0-7)&lt;br /&gt;
! 08 Дані (значення для прапорів біти 8-15)&lt;br /&gt;
! 09 CRC мл. байт&lt;br /&gt;
! 0A CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Master → Slave &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x02 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCD &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x72 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCB &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 05 CRC мл. байт&lt;br /&gt;
! 06 CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Slave → Master &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x24 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x09 &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Контроль помилок у протоколі Modbus RTU ==&lt;br /&gt;
&lt;br /&gt;
Під час обміну даними можуть виникати помилки двох типів:&lt;br /&gt;
* Помилки, пов'язані з спотвореннями при передачі даних;&lt;br /&gt;
* Логічні помилки.&lt;br /&gt;
&lt;br /&gt;
Помилки першого типу виявляються за допомогою фреймів символів, контролю парності і циклічної контрольної суми [[CRC]]-16-IBM (використовується число-[[поліном]] = 0xA001). При цьому молодший байт передається першим, на відміну від байтів адреси і значення регістра в PDU&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RTU фрейм ===&lt;br /&gt;
&lt;br /&gt;
У RTU режимі повідомлення має починатися і закінчуватися інтервалом тиші - часом передачі не менше 3.5 символів при даній швидкості в мережі. Першим полем потім передається адреса пристрою.&lt;br /&gt;
&lt;br /&gt;
Слідом за останнім переданим символом також слід інтервал тиші тривалістю не менше 3.5 символів. Нове повідомлення може починатися після цього інтервалу.&lt;br /&gt;
&lt;br /&gt;
Фрейм повідомлення передається безперервно. Якщо інтервал тиші тривалістю 1.5 виник під час передачі фрейму, приймаючий пристрій повинен ігнорувати цей фрейм як неповний.&lt;br /&gt;
&lt;br /&gt;
Таким чином, нове повідомлення повинно починатися не раніше 3.5 інтервалу, так як в цьому випадку встановлюється помилка.&lt;br /&gt;
&lt;br /&gt;
Трохи про інтервали (мова йде про Serial Modbus RTU):&lt;br /&gt;
при швидкості 9600 і 11 бітах в кадрі (стартовий біт + 8 біт даних + біт контролю парності + стоп-біт):&lt;br /&gt;
3.5 * 11 / 9600 = 0,00401041 (6), тобто більше 4 мс;&lt;br /&gt;
1.5 * 11 / 9600 = 0,00171875, тобто більше 1 мс.&lt;br /&gt;
Для швидкостей більше 19200 бод допускається використовувати інтервали 1,75 і 0,75 мс відповідно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Логічні помилки ===&lt;br /&gt;
Для повідомлень про помилки другого типу протокол Modbus RTU передбачає, що пристрої можуть відсилати відповіді, що свідчать про помилкову ситуації.&lt;br /&gt;
Ознакою того, що відповідь містить повідомлення про помилку, є встановлений старший біт коду команди.&lt;br /&gt;
Приклад кадру при виявленні помилки веденим пристроєм, у відповідь на запит наведено в (Таблиця 2-1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Якщо Slave приймає коректний запит і може його нормально обробити, то повертає стандартний відповідь.&lt;br /&gt;
&lt;br /&gt;
2. Якщо Slave не приймає будь-якого значення, ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
3. Якщо Slave приймає запит, але виявляє помилку (parity, LRC, or CRC), ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
4. Якщо Slave приймає запит, але не може його обробити (звернення до неіснуючого регістру і т. д.), відправляється відповідь містить у собі дані про помилку.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Кадр відповіді (Slave → Master) при виникненні помилки modbus RTU'''&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! Адресу підлеглого пристрою&lt;br /&gt;
! Номер функції&lt;br /&gt;
! Дані (або код помилки)&lt;br /&gt;
! CRC&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Запит (Master → Slave) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x77 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xDD &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xC7 0xA9&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Відповідь (Slave → Master) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xF7 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xEE &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xE6 0x7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Стандартні коди помилок ====&lt;br /&gt;
* 01 - Прийнятий код функції не може бути опрацьований на підпорядкованому.&lt;br /&gt;
* 02 - Адреса даних, вказаний у запиті, не доступний даному підлеглому.&lt;br /&gt;
* 03 - Величина, що міститься в полі даних запиту, є неприпустимою величиною для підлеглого.&lt;br /&gt;
* 04 - невідновлювальних помилка мала місце, поки підлеглий намагався виконати затребованное дію.&lt;br /&gt;
* 05 - Підлеглий прийняв запит і обробляє його, але це вимагає багато часу. Ця відповідь оберігає головного від генерації помилки тайм-ауту.&lt;br /&gt;
* 06 - Підлеглий зайнятий обробкою команди. Головний повинен повторити повідомлення пізніше, коли підлеглий звільниться.&lt;br /&gt;
* 07 - Підлеглий не може виконати програмну функцію, прийняту в запиті. Цей код повертається для невдалого програмного запиту, що використовує функції з номерами 13 або 14. Головний повинен запросити діагностичну інформацію або інформацію про помилки з підлеглого.&lt;br /&gt;
* 08 - Підлеглий намагається читати розширену пам'ять, але виявив помилку паритету. Головний може повторити запит, але звичайно в таких випадках потрібний ремонт.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Зовнішні посилання ==&lt;br /&gt;
Посилання у різних вільних енциклопедіях (wikipedia):&lt;br /&gt;
* [http://uk.wikipedia.org/wiki/Modbus  українська]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/Modbus  російська]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Modbus  англійська]&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Buses-main.jpg&amp;diff=14547</id>
		<title>Файл:Buses-main.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Buses-main.jpg&amp;diff=14547"/>
				<updated>2012-04-16T13:53:10Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14546</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14546"/>
				<updated>2012-04-16T13:47:09Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: /* Історія */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Web member.gif|thumb|right|300 px|Приклад мережі Modbus]]&lt;br /&gt;
 &lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Modbus tcp.jpg|thumb|300 px|Приклад мережі Modbus]]&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції:&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані:&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адреса відомого пристрою  . &lt;br /&gt;
! код функції   .&lt;br /&gt;
! дані   .&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адреса відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції  .&lt;br /&gt;
! ід протоколу  .&lt;br /&gt;
! довжина пакету  .&lt;br /&gt;
! адресу відомого пристрою  .&lt;br /&gt;
! код функції  .&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Елементи|| Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандартні функції протоколу Modbus ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright thumb&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
|+ '''PDU запиту і відповіді для стандартних функцій'''&lt;br /&gt;
! номер &amp;lt;br /&amp;gt; функції&lt;br /&gt;
! colspan = &amp;quot;6&amp;quot; | запит / відповідь&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 1 (0x01)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 2 (0x02)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 3 (0x03)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 4 (0x04)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 5 (0x05)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 6 (0x06)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 15 (0x0F)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 16 (0x10)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
*'''A &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''A &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - адреса елемента,&lt;br /&gt;
*'''Q &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''Q &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - кількість елементів,&lt;br /&gt;
*'''N''' - кількість байт даних&lt;br /&gt;
*'''D''' - дані&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Читання даних ===&lt;br /&gt;
&lt;br /&gt;
Для читання значень з перерахованих вище таблиць даних використовуються функції з кодами 1-4 шістнадцяткові значення 0x01-0x04):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''1 (0x01)'''- читання значень з декількох регістрів прапорів''(Read Coil Status)''&lt;br /&gt;
*'''2 (0x02)'''- читання значень з декількох дискретних входів''(Read Discrete Inputs)''&lt;br /&gt;
*'''3 (0x03)'''- читання значень з декількох регістрів зберігання''(Read Holding Registers)''&lt;br /&gt;
*'''4 (0x04)'''- читання значень з декількох регістрів введення''(Read Input Registers)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запит складається із адреси першого елемента таблиці, яку потрібно прочитати, і кількості зчитувальних елементів. Адреса та кількість даних задаються 16-бітними числами, старший байт кожного з них передається першим.&lt;br /&gt;
&lt;br /&gt;
У відповіді передаються запитані дані. Кількість байт даних залежить від кількості замовлених елементів. Перед даними передається один байт, значення якого дорівнює кількості байт даних.&lt;br /&gt;
&lt;br /&gt;
Значення регістрів зберігання і регістрів введення передаються починаючи із зазначеної адреси, по два байти на регістр, старший байт кожного регістру передається першим:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! байт 1 || байт 2 || байт 3 || байт 4 || ... || байт N-1 || байт N&lt;br /&gt;
|-&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A +1,1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A +1,0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A + Q-1, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A + Q-1, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Значення прапорів і дискретних входів передаються в упакованому вигляді: по одному біту на прапор.&lt;br /&gt;
Одиниця означає включений стан, нуль - вимкнений.&lt;br /&gt;
Значення запитаних прапорів заповнюють спочатку перший байт, починаючи з молодшого біта, потім наступні байти, також від молодшого біта до старших.&lt;br /&gt;
Молодший біт першого байта даних містить значення прапора, зазначеного в полі «адресу».&lt;br /&gt;
Якщо запитано кількість прапорів, не кратне восьми, то значення додаткового біта заповнюються нулями:.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! colspan = &amp;quot;8&amp;quot; | байт 1&lt;br /&gt;
! ...&lt;br /&gt;
! colspan = &amp;quot;7&amp;quot; | байт N&lt;br /&gt;
|-&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +7&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +6&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +5&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +4&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +3&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис одного значення ===&lt;br /&gt;
&lt;br /&gt;
*'''5 (0x05)'''- запис значення одного прапора''(Force Single Coil)''&lt;br /&gt;
*'''6 (0x06)'''- запис значення в один регістр зберігання''(Preset Single Register)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента (2 байти) і встановлюваного значення (2 байти).&lt;br /&gt;
&lt;br /&gt;
Для регістру зберігання значення є просто 16-бітним словом.&lt;br /&gt;
&lt;br /&gt;
Для прапорів значення 0xFF00 означає включений стан, 0x0000 - вимкнений, інші значення неприпустимі.&lt;br /&gt;
&lt;br /&gt;
Якщо команда виконана успішно, ведене пристрій повертає копію запиту.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис декількох значень ===&lt;br /&gt;
&lt;br /&gt;
*'''15 (0x0F)'''- запис значень в кілька регістрів прапорів''(Force Multiple Coils)''&lt;br /&gt;
*'''16 (0x10)'''- запис значень в кілька регістрів зберігання''(Preset Multiple Registers)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента, кількості змінюваних елементів, кількості переданих байт встановлюваних значень і самих встановлюваних значень. Дані упаковуються так само, як в командах читання даних.&lt;br /&gt;
&lt;br /&gt;
Відповідь складається з початкової адреси і кількості змінених елементів.&lt;br /&gt;
&lt;br /&gt;
Нижче наведено приклад команди ведучого пристрою і відповіді веденого (для Modbus RTU).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 06 Кількість байт даних&lt;br /&gt;
! 07 Дані (значення для прапорів біти 0-7)&lt;br /&gt;
! 08 Дані (значення для прапорів біти 8-15)&lt;br /&gt;
! 09 CRC мл. байт&lt;br /&gt;
! 0A CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Master → Slave &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x02 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCD &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x72 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCB &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 05 CRC мл. байт&lt;br /&gt;
! 06 CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Slave → Master &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x24 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x09 &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Контроль помилок у протоколі Modbus RTU ==&lt;br /&gt;
&lt;br /&gt;
Під час обміну даними можуть виникати помилки двох типів:&lt;br /&gt;
* Помилки, пов'язані з спотвореннями при передачі даних;&lt;br /&gt;
* Логічні помилки.&lt;br /&gt;
&lt;br /&gt;
Помилки першого типу виявляються за допомогою фреймів символів, контролю парності і циклічної контрольної суми [[CRC]]-16-IBM (використовується число-[[поліном]] = 0xA001). При цьому молодший байт передається першим, на відміну від байтів адреси і значення регістра в PDU&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RTU фрейм ===&lt;br /&gt;
&lt;br /&gt;
У RTU режимі повідомлення має починатися і закінчуватися інтервалом тиші - часом передачі не менше 3.5 символів при даній швидкості в мережі. Першим полем потім передається адреса пристрою.&lt;br /&gt;
&lt;br /&gt;
Слідом за останнім переданим символом також слід інтервал тиші тривалістю не менше 3.5 символів. Нове повідомлення може починатися після цього інтервалу.&lt;br /&gt;
&lt;br /&gt;
Фрейм повідомлення передається безперервно. Якщо інтервал тиші тривалістю 1.5 виник під час передачі фрейму, приймаючий пристрій повинен ігнорувати цей фрейм як неповний.&lt;br /&gt;
&lt;br /&gt;
Таким чином, нове повідомлення повинно починатися не раніше 3.5 інтервалу, так як в цьому випадку встановлюється помилка.&lt;br /&gt;
&lt;br /&gt;
Трохи про інтервали (мова йде про Serial Modbus RTU):&lt;br /&gt;
при швидкості 9600 і 11 бітах в кадрі (стартовий біт + 8 біт даних + біт контролю парності + стоп-біт):&lt;br /&gt;
3.5 * 11 / 9600 = 0,00401041 (6), тобто більше 4 мс;&lt;br /&gt;
1.5 * 11 / 9600 = 0,00171875, тобто більше 1 мс.&lt;br /&gt;
Для швидкостей більше 19200 бод допускається використовувати інтервали 1,75 і 0,75 мс відповідно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Логічні помилки ===&lt;br /&gt;
Для повідомлень про помилки другого типу протокол Modbus RTU передбачає, що пристрої можуть відсилати відповіді, що свідчать про помилкову ситуації.&lt;br /&gt;
Ознакою того, що відповідь містить повідомлення про помилку, є встановлений старший біт коду команди.&lt;br /&gt;
Приклад кадру при виявленні помилки веденим пристроєм, у відповідь на запит наведено в (Таблиця 2-1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Якщо Slave приймає коректний запит і може його нормально обробити, то повертає стандартний відповідь.&lt;br /&gt;
&lt;br /&gt;
2. Якщо Slave не приймає будь-якого значення, ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
3. Якщо Slave приймає запит, але виявляє помилку (parity, LRC, or CRC), ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
4. Якщо Slave приймає запит, але не може його обробити (звернення до неіснуючого регістру і т. д.), відправляється відповідь містить у собі дані про помилку.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Кадр відповіді (Slave → Master) при виникненні помилки modbus RTU'''&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! Адресу підлеглого пристрою&lt;br /&gt;
! Номер функції&lt;br /&gt;
! Дані (або код помилки)&lt;br /&gt;
! CRC&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Запит (Master → Slave) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x77 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xDD &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xC7 0xA9&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Відповідь (Slave → Master) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xF7 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xEE &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xE6 0x7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Стандартні коди помилок ====&lt;br /&gt;
* 01 - Прийнятий код функції не може бути опрацьований на підпорядкованому.&lt;br /&gt;
* 02 - Адреса даних, вказаний у запиті, не доступний даному підлеглому.&lt;br /&gt;
* 03 - Величина, що міститься в полі даних запиту, є неприпустимою величиною для підлеглого.&lt;br /&gt;
* 04 - невідновлювальних помилка мала місце, поки підлеглий намагався виконати затребованное дію.&lt;br /&gt;
* 05 - Підлеглий прийняв запит і обробляє його, але це вимагає багато часу. Ця відповідь оберігає головного від генерації помилки тайм-ауту.&lt;br /&gt;
* 06 - Підлеглий зайнятий обробкою команди. Головний повинен повторити повідомлення пізніше, коли підлеглий звільниться.&lt;br /&gt;
* 07 - Підлеглий не може виконати програмну функцію, прийняту в запиті. Цей код повертається для невдалого програмного запиту, що використовує функції з номерами 13 або 14. Головний повинен запросити діагностичну інформацію або інформацію про помилки з підлеглого.&lt;br /&gt;
* 08 - Підлеглий намагається читати розширену пам'ять, але виявив помилку паритету. Головний може повторити запит, але звичайно в таких випадках потрібний ремонт.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Зовнішні посилання ==&lt;br /&gt;
Посилання у різних вільних енциклопедіях (wikipedia):&lt;br /&gt;
* [http://uk.wikipedia.org/wiki/Modbus  українська]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/Modbus  російська]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Modbus  англійська]&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Web_member.gif&amp;diff=14545</id>
		<title>Файл:Web member.gif</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Web_member.gif&amp;diff=14545"/>
				<updated>2012-04-16T13:45:58Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14544</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14544"/>
				<updated>2012-04-16T13:40:32Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: /* Вступ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Modbus tcp.jpg|thumb|300 px|Приклад мережі Modbus]]&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції:&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані:&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адреса відомого пристрою  . &lt;br /&gt;
! код функції   .&lt;br /&gt;
! дані   .&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адреса відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції  .&lt;br /&gt;
! ід протоколу  .&lt;br /&gt;
! довжина пакету  .&lt;br /&gt;
! адресу відомого пристрою  .&lt;br /&gt;
! код функції  .&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Елементи|| Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандартні функції протоколу Modbus ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright thumb&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
|+ '''PDU запиту і відповіді для стандартних функцій'''&lt;br /&gt;
! номер &amp;lt;br /&amp;gt; функції&lt;br /&gt;
! colspan = &amp;quot;6&amp;quot; | запит / відповідь&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 1 (0x01)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 2 (0x02)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 3 (0x03)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 4 (0x04)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 5 (0x05)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 6 (0x06)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 15 (0x0F)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 16 (0x10)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
*'''A &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''A &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - адреса елемента,&lt;br /&gt;
*'''Q &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''Q &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - кількість елементів,&lt;br /&gt;
*'''N''' - кількість байт даних&lt;br /&gt;
*'''D''' - дані&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Читання даних ===&lt;br /&gt;
&lt;br /&gt;
Для читання значень з перерахованих вище таблиць даних використовуються функції з кодами 1-4 шістнадцяткові значення 0x01-0x04):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''1 (0x01)'''- читання значень з декількох регістрів прапорів''(Read Coil Status)''&lt;br /&gt;
*'''2 (0x02)'''- читання значень з декількох дискретних входів''(Read Discrete Inputs)''&lt;br /&gt;
*'''3 (0x03)'''- читання значень з декількох регістрів зберігання''(Read Holding Registers)''&lt;br /&gt;
*'''4 (0x04)'''- читання значень з декількох регістрів введення''(Read Input Registers)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запит складається із адреси першого елемента таблиці, яку потрібно прочитати, і кількості зчитувальних елементів. Адреса та кількість даних задаються 16-бітними числами, старший байт кожного з них передається першим.&lt;br /&gt;
&lt;br /&gt;
У відповіді передаються запитані дані. Кількість байт даних залежить від кількості замовлених елементів. Перед даними передається один байт, значення якого дорівнює кількості байт даних.&lt;br /&gt;
&lt;br /&gt;
Значення регістрів зберігання і регістрів введення передаються починаючи із зазначеної адреси, по два байти на регістр, старший байт кожного регістру передається першим:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! байт 1 || байт 2 || байт 3 || байт 4 || ... || байт N-1 || байт N&lt;br /&gt;
|-&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A +1,1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A +1,0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A + Q-1, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A + Q-1, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Значення прапорів і дискретних входів передаються в упакованому вигляді: по одному біту на прапор.&lt;br /&gt;
Одиниця означає включений стан, нуль - вимкнений.&lt;br /&gt;
Значення запитаних прапорів заповнюють спочатку перший байт, починаючи з молодшого біта, потім наступні байти, також від молодшого біта до старших.&lt;br /&gt;
Молодший біт першого байта даних містить значення прапора, зазначеного в полі «адресу».&lt;br /&gt;
Якщо запитано кількість прапорів, не кратне восьми, то значення додаткового біта заповнюються нулями:.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! colspan = &amp;quot;8&amp;quot; | байт 1&lt;br /&gt;
! ...&lt;br /&gt;
! colspan = &amp;quot;7&amp;quot; | байт N&lt;br /&gt;
|-&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +7&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +6&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +5&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +4&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +3&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис одного значення ===&lt;br /&gt;
&lt;br /&gt;
*'''5 (0x05)'''- запис значення одного прапора''(Force Single Coil)''&lt;br /&gt;
*'''6 (0x06)'''- запис значення в один регістр зберігання''(Preset Single Register)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента (2 байти) і встановлюваного значення (2 байти).&lt;br /&gt;
&lt;br /&gt;
Для регістру зберігання значення є просто 16-бітним словом.&lt;br /&gt;
&lt;br /&gt;
Для прапорів значення 0xFF00 означає включений стан, 0x0000 - вимкнений, інші значення неприпустимі.&lt;br /&gt;
&lt;br /&gt;
Якщо команда виконана успішно, ведене пристрій повертає копію запиту.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис декількох значень ===&lt;br /&gt;
&lt;br /&gt;
*'''15 (0x0F)'''- запис значень в кілька регістрів прапорів''(Force Multiple Coils)''&lt;br /&gt;
*'''16 (0x10)'''- запис значень в кілька регістрів зберігання''(Preset Multiple Registers)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента, кількості змінюваних елементів, кількості переданих байт встановлюваних значень і самих встановлюваних значень. Дані упаковуються так само, як в командах читання даних.&lt;br /&gt;
&lt;br /&gt;
Відповідь складається з початкової адреси і кількості змінених елементів.&lt;br /&gt;
&lt;br /&gt;
Нижче наведено приклад команди ведучого пристрою і відповіді веденого (для Modbus RTU).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 06 Кількість байт даних&lt;br /&gt;
! 07 Дані (значення для прапорів біти 0-7)&lt;br /&gt;
! 08 Дані (значення для прапорів біти 8-15)&lt;br /&gt;
! 09 CRC мл. байт&lt;br /&gt;
! 0A CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Master → Slave &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x02 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCD &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x72 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCB &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 05 CRC мл. байт&lt;br /&gt;
! 06 CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Slave → Master &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x24 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x09 &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Контроль помилок у протоколі Modbus RTU ==&lt;br /&gt;
&lt;br /&gt;
Під час обміну даними можуть виникати помилки двох типів:&lt;br /&gt;
* Помилки, пов'язані з спотвореннями при передачі даних;&lt;br /&gt;
* Логічні помилки.&lt;br /&gt;
&lt;br /&gt;
Помилки першого типу виявляються за допомогою фреймів символів, контролю парності і циклічної контрольної суми [[CRC]]-16-IBM (використовується число-[[поліном]] = 0xA001). При цьому молодший байт передається першим, на відміну від байтів адреси і значення регістра в PDU&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RTU фрейм ===&lt;br /&gt;
&lt;br /&gt;
У RTU режимі повідомлення має починатися і закінчуватися інтервалом тиші - часом передачі не менше 3.5 символів при даній швидкості в мережі. Першим полем потім передається адреса пристрою.&lt;br /&gt;
&lt;br /&gt;
Слідом за останнім переданим символом також слід інтервал тиші тривалістю не менше 3.5 символів. Нове повідомлення може починатися після цього інтервалу.&lt;br /&gt;
&lt;br /&gt;
Фрейм повідомлення передається безперервно. Якщо інтервал тиші тривалістю 1.5 виник під час передачі фрейму, приймаючий пристрій повинен ігнорувати цей фрейм як неповний.&lt;br /&gt;
&lt;br /&gt;
Таким чином, нове повідомлення повинно починатися не раніше 3.5 інтервалу, так як в цьому випадку встановлюється помилка.&lt;br /&gt;
&lt;br /&gt;
Трохи про інтервали (мова йде про Serial Modbus RTU):&lt;br /&gt;
при швидкості 9600 і 11 бітах в кадрі (стартовий біт + 8 біт даних + біт контролю парності + стоп-біт):&lt;br /&gt;
3.5 * 11 / 9600 = 0,00401041 (6), тобто більше 4 мс;&lt;br /&gt;
1.5 * 11 / 9600 = 0,00171875, тобто більше 1 мс.&lt;br /&gt;
Для швидкостей більше 19200 бод допускається використовувати інтервали 1,75 і 0,75 мс відповідно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Логічні помилки ===&lt;br /&gt;
Для повідомлень про помилки другого типу протокол Modbus RTU передбачає, що пристрої можуть відсилати відповіді, що свідчать про помилкову ситуації.&lt;br /&gt;
Ознакою того, що відповідь містить повідомлення про помилку, є встановлений старший біт коду команди.&lt;br /&gt;
Приклад кадру при виявленні помилки веденим пристроєм, у відповідь на запит наведено в (Таблиця 2-1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Якщо Slave приймає коректний запит і може його нормально обробити, то повертає стандартний відповідь.&lt;br /&gt;
&lt;br /&gt;
2. Якщо Slave не приймає будь-якого значення, ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
3. Якщо Slave приймає запит, але виявляє помилку (parity, LRC, or CRC), ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
4. Якщо Slave приймає запит, але не може його обробити (звернення до неіснуючого регістру і т. д.), відправляється відповідь містить у собі дані про помилку.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Кадр відповіді (Slave → Master) при виникненні помилки modbus RTU'''&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! Адресу підлеглого пристрою&lt;br /&gt;
! Номер функції&lt;br /&gt;
! Дані (або код помилки)&lt;br /&gt;
! CRC&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Запит (Master → Slave) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x77 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xDD &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xC7 0xA9&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Відповідь (Slave → Master) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xF7 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xEE &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xE6 0x7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Стандартні коди помилок ====&lt;br /&gt;
* 01 - Прийнятий код функції не може бути опрацьований на підпорядкованому.&lt;br /&gt;
* 02 - Адреса даних, вказаний у запиті, не доступний даному підлеглому.&lt;br /&gt;
* 03 - Величина, що міститься в полі даних запиту, є неприпустимою величиною для підлеглого.&lt;br /&gt;
* 04 - невідновлювальних помилка мала місце, поки підлеглий намагався виконати затребованное дію.&lt;br /&gt;
* 05 - Підлеглий прийняв запит і обробляє його, але це вимагає багато часу. Ця відповідь оберігає головного від генерації помилки тайм-ауту.&lt;br /&gt;
* 06 - Підлеглий зайнятий обробкою команди. Головний повинен повторити повідомлення пізніше, коли підлеглий звільниться.&lt;br /&gt;
* 07 - Підлеглий не може виконати програмну функцію, прийняту в запиті. Цей код повертається для невдалого програмного запиту, що використовує функції з номерами 13 або 14. Головний повинен запросити діагностичну інформацію або інформацію про помилки з підлеглого.&lt;br /&gt;
* 08 - Підлеглий намагається читати розширену пам'ять, але виявив помилку паритету. Головний може повторити запит, але звичайно в таких випадках потрібний ремонт.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Зовнішні посилання ==&lt;br /&gt;
Посилання у різних вільних енциклопедіях (wikipedia):&lt;br /&gt;
* [http://uk.wikipedia.org/wiki/Modbus  українська]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/Modbus  російська]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Modbus  англійська]&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14543</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14543"/>
				<updated>2012-04-16T13:39:47Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: /* Вступ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Modbus tcp.jpg|thumb|300 px|Загальний вигляд зворотного клапана]]&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції:&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані:&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адреса відомого пристрою  . &lt;br /&gt;
! код функції   .&lt;br /&gt;
! дані   .&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адреса відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції  .&lt;br /&gt;
! ід протоколу  .&lt;br /&gt;
! довжина пакету  .&lt;br /&gt;
! адресу відомого пристрою  .&lt;br /&gt;
! код функції  .&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Елементи|| Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандартні функції протоколу Modbus ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright thumb&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
|+ '''PDU запиту і відповіді для стандартних функцій'''&lt;br /&gt;
! номер &amp;lt;br /&amp;gt; функції&lt;br /&gt;
! colspan = &amp;quot;6&amp;quot; | запит / відповідь&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 1 (0x01)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 2 (0x02)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 3 (0x03)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 4 (0x04)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 5 (0x05)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 6 (0x06)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 15 (0x0F)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 16 (0x10)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
*'''A &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''A &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - адреса елемента,&lt;br /&gt;
*'''Q &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''Q &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - кількість елементів,&lt;br /&gt;
*'''N''' - кількість байт даних&lt;br /&gt;
*'''D''' - дані&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Читання даних ===&lt;br /&gt;
&lt;br /&gt;
Для читання значень з перерахованих вище таблиць даних використовуються функції з кодами 1-4 шістнадцяткові значення 0x01-0x04):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''1 (0x01)'''- читання значень з декількох регістрів прапорів''(Read Coil Status)''&lt;br /&gt;
*'''2 (0x02)'''- читання значень з декількох дискретних входів''(Read Discrete Inputs)''&lt;br /&gt;
*'''3 (0x03)'''- читання значень з декількох регістрів зберігання''(Read Holding Registers)''&lt;br /&gt;
*'''4 (0x04)'''- читання значень з декількох регістрів введення''(Read Input Registers)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запит складається із адреси першого елемента таблиці, яку потрібно прочитати, і кількості зчитувальних елементів. Адреса та кількість даних задаються 16-бітними числами, старший байт кожного з них передається першим.&lt;br /&gt;
&lt;br /&gt;
У відповіді передаються запитані дані. Кількість байт даних залежить від кількості замовлених елементів. Перед даними передається один байт, значення якого дорівнює кількості байт даних.&lt;br /&gt;
&lt;br /&gt;
Значення регістрів зберігання і регістрів введення передаються починаючи із зазначеної адреси, по два байти на регістр, старший байт кожного регістру передається першим:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! байт 1 || байт 2 || байт 3 || байт 4 || ... || байт N-1 || байт N&lt;br /&gt;
|-&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A +1,1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A +1,0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A + Q-1, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A + Q-1, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Значення прапорів і дискретних входів передаються в упакованому вигляді: по одному біту на прапор.&lt;br /&gt;
Одиниця означає включений стан, нуль - вимкнений.&lt;br /&gt;
Значення запитаних прапорів заповнюють спочатку перший байт, починаючи з молодшого біта, потім наступні байти, також від молодшого біта до старших.&lt;br /&gt;
Молодший біт першого байта даних містить значення прапора, зазначеного в полі «адресу».&lt;br /&gt;
Якщо запитано кількість прапорів, не кратне восьми, то значення додаткового біта заповнюються нулями:.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! colspan = &amp;quot;8&amp;quot; | байт 1&lt;br /&gt;
! ...&lt;br /&gt;
! colspan = &amp;quot;7&amp;quot; | байт N&lt;br /&gt;
|-&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +7&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +6&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +5&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +4&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +3&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис одного значення ===&lt;br /&gt;
&lt;br /&gt;
*'''5 (0x05)'''- запис значення одного прапора''(Force Single Coil)''&lt;br /&gt;
*'''6 (0x06)'''- запис значення в один регістр зберігання''(Preset Single Register)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента (2 байти) і встановлюваного значення (2 байти).&lt;br /&gt;
&lt;br /&gt;
Для регістру зберігання значення є просто 16-бітним словом.&lt;br /&gt;
&lt;br /&gt;
Для прапорів значення 0xFF00 означає включений стан, 0x0000 - вимкнений, інші значення неприпустимі.&lt;br /&gt;
&lt;br /&gt;
Якщо команда виконана успішно, ведене пристрій повертає копію запиту.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис декількох значень ===&lt;br /&gt;
&lt;br /&gt;
*'''15 (0x0F)'''- запис значень в кілька регістрів прапорів''(Force Multiple Coils)''&lt;br /&gt;
*'''16 (0x10)'''- запис значень в кілька регістрів зберігання''(Preset Multiple Registers)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента, кількості змінюваних елементів, кількості переданих байт встановлюваних значень і самих встановлюваних значень. Дані упаковуються так само, як в командах читання даних.&lt;br /&gt;
&lt;br /&gt;
Відповідь складається з початкової адреси і кількості змінених елементів.&lt;br /&gt;
&lt;br /&gt;
Нижче наведено приклад команди ведучого пристрою і відповіді веденого (для Modbus RTU).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 06 Кількість байт даних&lt;br /&gt;
! 07 Дані (значення для прапорів біти 0-7)&lt;br /&gt;
! 08 Дані (значення для прапорів біти 8-15)&lt;br /&gt;
! 09 CRC мл. байт&lt;br /&gt;
! 0A CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Master → Slave &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x02 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCD &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x72 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCB &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 05 CRC мл. байт&lt;br /&gt;
! 06 CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Slave → Master &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x24 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x09 &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Контроль помилок у протоколі Modbus RTU ==&lt;br /&gt;
&lt;br /&gt;
Під час обміну даними можуть виникати помилки двох типів:&lt;br /&gt;
* Помилки, пов'язані з спотвореннями при передачі даних;&lt;br /&gt;
* Логічні помилки.&lt;br /&gt;
&lt;br /&gt;
Помилки першого типу виявляються за допомогою фреймів символів, контролю парності і циклічної контрольної суми [[CRC]]-16-IBM (використовується число-[[поліном]] = 0xA001). При цьому молодший байт передається першим, на відміну від байтів адреси і значення регістра в PDU&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RTU фрейм ===&lt;br /&gt;
&lt;br /&gt;
У RTU режимі повідомлення має починатися і закінчуватися інтервалом тиші - часом передачі не менше 3.5 символів при даній швидкості в мережі. Першим полем потім передається адреса пристрою.&lt;br /&gt;
&lt;br /&gt;
Слідом за останнім переданим символом також слід інтервал тиші тривалістю не менше 3.5 символів. Нове повідомлення може починатися після цього інтервалу.&lt;br /&gt;
&lt;br /&gt;
Фрейм повідомлення передається безперервно. Якщо інтервал тиші тривалістю 1.5 виник під час передачі фрейму, приймаючий пристрій повинен ігнорувати цей фрейм як неповний.&lt;br /&gt;
&lt;br /&gt;
Таким чином, нове повідомлення повинно починатися не раніше 3.5 інтервалу, так як в цьому випадку встановлюється помилка.&lt;br /&gt;
&lt;br /&gt;
Трохи про інтервали (мова йде про Serial Modbus RTU):&lt;br /&gt;
при швидкості 9600 і 11 бітах в кадрі (стартовий біт + 8 біт даних + біт контролю парності + стоп-біт):&lt;br /&gt;
3.5 * 11 / 9600 = 0,00401041 (6), тобто більше 4 мс;&lt;br /&gt;
1.5 * 11 / 9600 = 0,00171875, тобто більше 1 мс.&lt;br /&gt;
Для швидкостей більше 19200 бод допускається використовувати інтервали 1,75 і 0,75 мс відповідно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Логічні помилки ===&lt;br /&gt;
Для повідомлень про помилки другого типу протокол Modbus RTU передбачає, що пристрої можуть відсилати відповіді, що свідчать про помилкову ситуації.&lt;br /&gt;
Ознакою того, що відповідь містить повідомлення про помилку, є встановлений старший біт коду команди.&lt;br /&gt;
Приклад кадру при виявленні помилки веденим пристроєм, у відповідь на запит наведено в (Таблиця 2-1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Якщо Slave приймає коректний запит і може його нормально обробити, то повертає стандартний відповідь.&lt;br /&gt;
&lt;br /&gt;
2. Якщо Slave не приймає будь-якого значення, ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
3. Якщо Slave приймає запит, але виявляє помилку (parity, LRC, or CRC), ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
4. Якщо Slave приймає запит, але не може його обробити (звернення до неіснуючого регістру і т. д.), відправляється відповідь містить у собі дані про помилку.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Кадр відповіді (Slave → Master) при виникненні помилки modbus RTU'''&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! Адресу підлеглого пристрою&lt;br /&gt;
! Номер функції&lt;br /&gt;
! Дані (або код помилки)&lt;br /&gt;
! CRC&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Запит (Master → Slave) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x77 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xDD &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xC7 0xA9&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Відповідь (Slave → Master) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xF7 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xEE &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xE6 0x7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Стандартні коди помилок ====&lt;br /&gt;
* 01 - Прийнятий код функції не може бути опрацьований на підпорядкованому.&lt;br /&gt;
* 02 - Адреса даних, вказаний у запиті, не доступний даному підлеглому.&lt;br /&gt;
* 03 - Величина, що міститься в полі даних запиту, є неприпустимою величиною для підлеглого.&lt;br /&gt;
* 04 - невідновлювальних помилка мала місце, поки підлеглий намагався виконати затребованное дію.&lt;br /&gt;
* 05 - Підлеглий прийняв запит і обробляє його, але це вимагає багато часу. Ця відповідь оберігає головного від генерації помилки тайм-ауту.&lt;br /&gt;
* 06 - Підлеглий зайнятий обробкою команди. Головний повинен повторити повідомлення пізніше, коли підлеглий звільниться.&lt;br /&gt;
* 07 - Підлеглий не може виконати програмну функцію, прийняту в запиті. Цей код повертається для невдалого програмного запиту, що використовує функції з номерами 13 або 14. Головний повинен запросити діагностичну інформацію або інформацію про помилки з підлеглого.&lt;br /&gt;
* 08 - Підлеглий намагається читати розширену пам'ять, але виявив помилку паритету. Головний може повторити запит, але звичайно в таких випадках потрібний ремонт.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Зовнішні посилання ==&lt;br /&gt;
Посилання у різних вільних енциклопедіях (wikipedia):&lt;br /&gt;
* [http://uk.wikipedia.org/wiki/Modbus  українська]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/Modbus  російська]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Modbus  англійська]&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Modbus_tcp.jpg&amp;diff=14542</id>
		<title>Файл:Modbus tcp.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Modbus_tcp.jpg&amp;diff=14542"/>
				<updated>2012-04-16T13:37:46Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: Зображення мережі Modbus&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Зображення мережі Modbus&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14541</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14541"/>
				<updated>2012-04-16T13:34:57Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
[[Файл:Example.jpg]]&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції:&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані:&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адреса відомого пристрою  . &lt;br /&gt;
! код функції   .&lt;br /&gt;
! дані   .&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адреса відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції  .&lt;br /&gt;
! ід протоколу  .&lt;br /&gt;
! довжина пакету  .&lt;br /&gt;
! адресу відомого пристрою  .&lt;br /&gt;
! код функції  .&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Елементи|| Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандартні функції протоколу Modbus ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright thumb&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
|+ '''PDU запиту і відповіді для стандартних функцій'''&lt;br /&gt;
! номер &amp;lt;br /&amp;gt; функції&lt;br /&gt;
! colspan = &amp;quot;6&amp;quot; | запит / відповідь&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 1 (0x01)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 2 (0x02)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 3 (0x03)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 4 (0x04)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 5 (0x05)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 6 (0x06)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 15 (0x0F)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 16 (0x10)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
*'''A &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''A &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - адреса елемента,&lt;br /&gt;
*'''Q &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''Q &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - кількість елементів,&lt;br /&gt;
*'''N''' - кількість байт даних&lt;br /&gt;
*'''D''' - дані&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Читання даних ===&lt;br /&gt;
&lt;br /&gt;
Для читання значень з перерахованих вище таблиць даних використовуються функції з кодами 1-4 шістнадцяткові значення 0x01-0x04):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''1 (0x01)'''- читання значень з декількох регістрів прапорів''(Read Coil Status)''&lt;br /&gt;
*'''2 (0x02)'''- читання значень з декількох дискретних входів''(Read Discrete Inputs)''&lt;br /&gt;
*'''3 (0x03)'''- читання значень з декількох регістрів зберігання''(Read Holding Registers)''&lt;br /&gt;
*'''4 (0x04)'''- читання значень з декількох регістрів введення''(Read Input Registers)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запит складається із адреси першого елемента таблиці, яку потрібно прочитати, і кількості зчитувальних елементів. Адреса та кількість даних задаються 16-бітними числами, старший байт кожного з них передається першим.&lt;br /&gt;
&lt;br /&gt;
У відповіді передаються запитані дані. Кількість байт даних залежить від кількості замовлених елементів. Перед даними передається один байт, значення якого дорівнює кількості байт даних.&lt;br /&gt;
&lt;br /&gt;
Значення регістрів зберігання і регістрів введення передаються починаючи із зазначеної адреси, по два байти на регістр, старший байт кожного регістру передається першим:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! байт 1 || байт 2 || байт 3 || байт 4 || ... || байт N-1 || байт N&lt;br /&gt;
|-&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A +1,1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A +1,0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A + Q-1, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A + Q-1, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Значення прапорів і дискретних входів передаються в упакованому вигляді: по одному біту на прапор.&lt;br /&gt;
Одиниця означає включений стан, нуль - вимкнений.&lt;br /&gt;
Значення запитаних прапорів заповнюють спочатку перший байт, починаючи з молодшого біта, потім наступні байти, також від молодшого біта до старших.&lt;br /&gt;
Молодший біт першого байта даних містить значення прапора, зазначеного в полі «адресу».&lt;br /&gt;
Якщо запитано кількість прапорів, не кратне восьми, то значення додаткового біта заповнюються нулями:.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! colspan = &amp;quot;8&amp;quot; | байт 1&lt;br /&gt;
! ...&lt;br /&gt;
! colspan = &amp;quot;7&amp;quot; | байт N&lt;br /&gt;
|-&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +7&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +6&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +5&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +4&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +3&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис одного значення ===&lt;br /&gt;
&lt;br /&gt;
*'''5 (0x05)'''- запис значення одного прапора''(Force Single Coil)''&lt;br /&gt;
*'''6 (0x06)'''- запис значення в один регістр зберігання''(Preset Single Register)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента (2 байти) і встановлюваного значення (2 байти).&lt;br /&gt;
&lt;br /&gt;
Для регістру зберігання значення є просто 16-бітним словом.&lt;br /&gt;
&lt;br /&gt;
Для прапорів значення 0xFF00 означає включений стан, 0x0000 - вимкнений, інші значення неприпустимі.&lt;br /&gt;
&lt;br /&gt;
Якщо команда виконана успішно, ведене пристрій повертає копію запиту.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис декількох значень ===&lt;br /&gt;
&lt;br /&gt;
*'''15 (0x0F)'''- запис значень в кілька регістрів прапорів''(Force Multiple Coils)''&lt;br /&gt;
*'''16 (0x10)'''- запис значень в кілька регістрів зберігання''(Preset Multiple Registers)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента, кількості змінюваних елементів, кількості переданих байт встановлюваних значень і самих встановлюваних значень. Дані упаковуються так само, як в командах читання даних.&lt;br /&gt;
&lt;br /&gt;
Відповідь складається з початкової адреси і кількості змінених елементів.&lt;br /&gt;
&lt;br /&gt;
Нижче наведено приклад команди ведучого пристрою і відповіді веденого (для Modbus RTU).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 06 Кількість байт даних&lt;br /&gt;
! 07 Дані (значення для прапорів біти 0-7)&lt;br /&gt;
! 08 Дані (значення для прапорів біти 8-15)&lt;br /&gt;
! 09 CRC мл. байт&lt;br /&gt;
! 0A CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Master → Slave &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x02 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCD &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x72 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCB &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 05 CRC мл. байт&lt;br /&gt;
! 06 CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Slave → Master &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x24 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x09 &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Контроль помилок у протоколі Modbus RTU ==&lt;br /&gt;
&lt;br /&gt;
Під час обміну даними можуть виникати помилки двох типів:&lt;br /&gt;
* Помилки, пов'язані з спотвореннями при передачі даних;&lt;br /&gt;
* Логічні помилки.&lt;br /&gt;
&lt;br /&gt;
Помилки першого типу виявляються за допомогою фреймів символів, контролю парності і циклічної контрольної суми [[CRC]]-16-IBM (використовується число-[[поліном]] = 0xA001). При цьому молодший байт передається першим, на відміну від байтів адреси і значення регістра в PDU&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RTU фрейм ===&lt;br /&gt;
&lt;br /&gt;
У RTU режимі повідомлення має починатися і закінчуватися інтервалом тиші - часом передачі не менше 3.5 символів при даній швидкості в мережі. Першим полем потім передається адреса пристрою.&lt;br /&gt;
&lt;br /&gt;
Слідом за останнім переданим символом також слід інтервал тиші тривалістю не менше 3.5 символів. Нове повідомлення може починатися після цього інтервалу.&lt;br /&gt;
&lt;br /&gt;
Фрейм повідомлення передається безперервно. Якщо інтервал тиші тривалістю 1.5 виник під час передачі фрейму, приймаючий пристрій повинен ігнорувати цей фрейм як неповний.&lt;br /&gt;
&lt;br /&gt;
Таким чином, нове повідомлення повинно починатися не раніше 3.5 інтервалу, так як в цьому випадку встановлюється помилка.&lt;br /&gt;
&lt;br /&gt;
Трохи про інтервали (мова йде про Serial Modbus RTU):&lt;br /&gt;
при швидкості 9600 і 11 бітах в кадрі (стартовий біт + 8 біт даних + біт контролю парності + стоп-біт):&lt;br /&gt;
3.5 * 11 / 9600 = 0,00401041 (6), тобто більше 4 мс;&lt;br /&gt;
1.5 * 11 / 9600 = 0,00171875, тобто більше 1 мс.&lt;br /&gt;
Для швидкостей більше 19200 бод допускається використовувати інтервали 1,75 і 0,75 мс відповідно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Логічні помилки ===&lt;br /&gt;
Для повідомлень про помилки другого типу протокол Modbus RTU передбачає, що пристрої можуть відсилати відповіді, що свідчать про помилкову ситуації.&lt;br /&gt;
Ознакою того, що відповідь містить повідомлення про помилку, є встановлений старший біт коду команди.&lt;br /&gt;
Приклад кадру при виявленні помилки веденим пристроєм, у відповідь на запит наведено в (Таблиця 2-1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Якщо Slave приймає коректний запит і може його нормально обробити, то повертає стандартний відповідь.&lt;br /&gt;
&lt;br /&gt;
2. Якщо Slave не приймає будь-якого значення, ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
3. Якщо Slave приймає запит, але виявляє помилку (parity, LRC, or CRC), ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
4. Якщо Slave приймає запит, але не може його обробити (звернення до неіснуючого регістру і т. д.), відправляється відповідь містить у собі дані про помилку.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Кадр відповіді (Slave → Master) при виникненні помилки modbus RTU'''&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! Адресу підлеглого пристрою&lt;br /&gt;
! Номер функції&lt;br /&gt;
! Дані (або код помилки)&lt;br /&gt;
! CRC&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Запит (Master → Slave) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x77 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xDD &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xC7 0xA9&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Відповідь (Slave → Master) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xF7 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xEE &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xE6 0x7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Стандартні коди помилок ====&lt;br /&gt;
* 01 - Прийнятий код функції не може бути опрацьований на підпорядкованому.&lt;br /&gt;
* 02 - Адреса даних, вказаний у запиті, не доступний даному підлеглому.&lt;br /&gt;
* 03 - Величина, що міститься в полі даних запиту, є неприпустимою величиною для підлеглого.&lt;br /&gt;
* 04 - невідновлювальних помилка мала місце, поки підлеглий намагався виконати затребованное дію.&lt;br /&gt;
* 05 - Підлеглий прийняв запит і обробляє його, але це вимагає багато часу. Ця відповідь оберігає головного від генерації помилки тайм-ауту.&lt;br /&gt;
* 06 - Підлеглий зайнятий обробкою команди. Головний повинен повторити повідомлення пізніше, коли підлеглий звільниться.&lt;br /&gt;
* 07 - Підлеглий не може виконати програмну функцію, прийняту в запиті. Цей код повертається для невдалого програмного запиту, що використовує функції з номерами 13 або 14. Головний повинен запросити діагностичну інформацію або інформацію про помилки з підлеглого.&lt;br /&gt;
* 08 - Підлеглий намагається читати розширену пам'ять, але виявив помилку паритету. Головний може повторити запит, але звичайно в таких випадках потрібний ремонт.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Зовнішні посилання ==&lt;br /&gt;
Посилання у різних вільних енциклопедіях (wikipedia):&lt;br /&gt;
* [http://uk.wikipedia.org/wiki/Modbus  українська]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/Modbus  російська]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Modbus  англійська]&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14540</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14540"/>
				<updated>2012-04-16T13:29:44Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції:&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані:&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адреса відомого пристрою  . &lt;br /&gt;
! код функції   .&lt;br /&gt;
! дані   .&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адреса відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції  .&lt;br /&gt;
! ід протоколу  .&lt;br /&gt;
! довжина пакету  .&lt;br /&gt;
! адресу відомого пристрою  .&lt;br /&gt;
! код функції  .&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Елементи|| Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандартні функції протоколу Modbus ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright thumb&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
|+ '''PDU запиту і відповіді для стандартних функцій'''&lt;br /&gt;
! номер &amp;lt;br /&amp;gt; функції&lt;br /&gt;
! colspan = &amp;quot;6&amp;quot; | запит / відповідь&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 1 (0x01)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 2 (0x02)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 3 (0x03)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 4 (0x04)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 5 (0x05)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 6 (0x06)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 15 (0x0F)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 16 (0x10)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
*'''A &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''A &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - адреса елемента,&lt;br /&gt;
*'''Q &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''Q &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - кількість елементів,&lt;br /&gt;
*'''N''' - кількість байт даних&lt;br /&gt;
*'''D''' - дані&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Читання даних ===&lt;br /&gt;
&lt;br /&gt;
Для читання значень з перерахованих вище таблиць даних використовуються функції з кодами 1-4 шістнадцяткові значення 0x01-0x04):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''1 (0x01)'''- читання значень з декількох регістрів прапорів''(Read Coil Status)''&lt;br /&gt;
*'''2 (0x02)'''- читання значень з декількох дискретних входів''(Read Discrete Inputs)''&lt;br /&gt;
*'''3 (0x03)'''- читання значень з декількох регістрів зберігання''(Read Holding Registers)''&lt;br /&gt;
*'''4 (0x04)'''- читання значень з декількох регістрів введення''(Read Input Registers)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запит складається із адреси першого елемента таблиці, яку потрібно прочитати, і кількості зчитувальних елементів. Адреса та кількість даних задаються 16-бітними числами, старший байт кожного з них передається першим.&lt;br /&gt;
&lt;br /&gt;
У відповіді передаються запитані дані. Кількість байт даних залежить від кількості замовлених елементів. Перед даними передається один байт, значення якого дорівнює кількості байт даних.&lt;br /&gt;
&lt;br /&gt;
Значення регістрів зберігання і регістрів введення передаються починаючи із зазначеної адреси, по два байти на регістр, старший байт кожного регістру передається першим:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! байт 1 || байт 2 || байт 3 || байт 4 || ... || байт N-1 || байт N&lt;br /&gt;
|-&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A +1,1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A +1,0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A + Q-1, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A + Q-1, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Значення прапорів і дискретних входів передаються в упакованому вигляді: по одному біту на прапор.&lt;br /&gt;
Одиниця означає включений стан, нуль - вимкнений.&lt;br /&gt;
Значення запитаних прапорів заповнюють спочатку перший байт, починаючи з молодшого біта, потім наступні байти, також від молодшого біта до старших.&lt;br /&gt;
Молодший біт першого байта даних містить значення прапора, зазначеного в полі «адресу».&lt;br /&gt;
Якщо запитано кількість прапорів, не кратне восьми, то значення додаткового біта заповнюються нулями:.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! colspan = &amp;quot;8&amp;quot; | байт 1&lt;br /&gt;
! ...&lt;br /&gt;
! colspan = &amp;quot;7&amp;quot; | байт N&lt;br /&gt;
|-&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +7&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +6&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +5&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +4&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +3&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис одного значення ===&lt;br /&gt;
&lt;br /&gt;
*'''5 (0x05)'''- запис значення одного прапора''(Force Single Coil)''&lt;br /&gt;
*'''6 (0x06)'''- запис значення в один регістр зберігання''(Preset Single Register)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента (2 байти) і встановлюваного значення (2 байти).&lt;br /&gt;
&lt;br /&gt;
Для регістру зберігання значення є просто 16-бітним словом.&lt;br /&gt;
&lt;br /&gt;
Для прапорів значення 0xFF00 означає включений стан, 0x0000 - вимкнений, інші значення неприпустимі.&lt;br /&gt;
&lt;br /&gt;
Якщо команда виконана успішно, ведене пристрій повертає копію запиту.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис декількох значень ===&lt;br /&gt;
&lt;br /&gt;
*'''15 (0x0F)'''- запис значень в кілька регістрів прапорів''(Force Multiple Coils)''&lt;br /&gt;
*'''16 (0x10)'''- запис значень в кілька регістрів зберігання''(Preset Multiple Registers)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента, кількості змінюваних елементів, кількості переданих байт встановлюваних значень і самих встановлюваних значень. Дані упаковуються так само, як в командах читання даних.&lt;br /&gt;
&lt;br /&gt;
Відповідь складається з початкової адреси і кількості змінених елементів.&lt;br /&gt;
&lt;br /&gt;
Нижче наведено приклад команди ведучого пристрою і відповіді веденого (для Modbus RTU).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 06 Кількість байт даних&lt;br /&gt;
! 07 Дані (значення для прапорів біти 0-7)&lt;br /&gt;
! 08 Дані (значення для прапорів біти 8-15)&lt;br /&gt;
! 09 CRC мл. байт&lt;br /&gt;
! 0A CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Master → Slave &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x02 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCD &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x72 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCB &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 05 CRC мл. байт&lt;br /&gt;
! 06 CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Slave → Master &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x24 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x09 &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Контроль помилок у протоколі Modbus RTU ==&lt;br /&gt;
&lt;br /&gt;
Під час обміну даними можуть виникати помилки двох типів:&lt;br /&gt;
* Помилки, пов'язані з спотвореннями при передачі даних;&lt;br /&gt;
* Логічні помилки.&lt;br /&gt;
&lt;br /&gt;
Помилки першого типу виявляються за допомогою фреймів символів, контролю парності і циклічної контрольної суми [[CRC]]-16-IBM (використовується число-[[поліном]] = 0xA001). При цьому молодший байт передається першим, на відміну від байтів адреси і значення регістра в PDU&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RTU фрейм ===&lt;br /&gt;
&lt;br /&gt;
У RTU режимі повідомлення має починатися і закінчуватися інтервалом тиші - часом передачі не менше 3.5 символів при даній швидкості в мережі. Першим полем потім передається адреса пристрою.&lt;br /&gt;
&lt;br /&gt;
Слідом за останнім переданим символом також слід інтервал тиші тривалістю не менше 3.5 символів. Нове повідомлення може починатися після цього інтервалу.&lt;br /&gt;
&lt;br /&gt;
Фрейм повідомлення передається безперервно. Якщо інтервал тиші тривалістю 1.5 виник під час передачі фрейму, приймаючий пристрій повинен ігнорувати цей фрейм як неповний.&lt;br /&gt;
&lt;br /&gt;
Таким чином, нове повідомлення повинно починатися не раніше 3.5 інтервалу, так як в цьому випадку встановлюється помилка.&lt;br /&gt;
&lt;br /&gt;
Трохи про інтервали (мова йде про Serial Modbus RTU):&lt;br /&gt;
при швидкості 9600 і 11 бітах в кадрі (стартовий біт + 8 біт даних + біт контролю парності + стоп-біт):&lt;br /&gt;
3.5 * 11 / 9600 = 0,00401041 (6), тобто більше 4 мс;&lt;br /&gt;
1.5 * 11 / 9600 = 0,00171875, тобто більше 1 мс.&lt;br /&gt;
Для швидкостей більше 19200 бод допускається використовувати інтервали 1,75 і 0,75 мс відповідно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Логічні помилки ===&lt;br /&gt;
Для повідомлень про помилки другого типу протокол Modbus RTU передбачає, що пристрої можуть відсилати відповіді, що свідчать про помилкову ситуації.&lt;br /&gt;
Ознакою того, що відповідь містить повідомлення про помилку, є встановлений старший біт коду команди.&lt;br /&gt;
Приклад кадру при виявленні помилки веденим пристроєм, у відповідь на запит наведено в (Таблиця 2-1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Якщо Slave приймає коректний запит і може його нормально обробити, то повертає стандартний відповідь.&lt;br /&gt;
&lt;br /&gt;
2. Якщо Slave не приймає будь-якого значення, ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
3. Якщо Slave приймає запит, але виявляє помилку (parity, LRC, or CRC), ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
4. Якщо Slave приймає запит, але не може його обробити (звернення до неіснуючого регістру і т. д.), відправляється відповідь містить у собі дані про помилку.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Кадр відповіді (Slave → Master) при виникненні помилки modbus RTU'''&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! Адресу підлеглого пристрою&lt;br /&gt;
! Номер функції&lt;br /&gt;
! Дані (або код помилки)&lt;br /&gt;
! CRC&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Запит (Master → Slave) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x77 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xDD &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xC7 0xA9&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Відповідь (Slave → Master) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xF7 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xEE &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xE6 0x7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Стандартні коди помилок ====&lt;br /&gt;
* 01 - Прийнятий код функції не може бути опрацьований на підпорядкованому.&lt;br /&gt;
* 02 - Адреса даних, вказаний у запиті, не доступний даному підлеглому.&lt;br /&gt;
* 03 - Величина, що міститься в полі даних запиту, є неприпустимою величиною для підлеглого.&lt;br /&gt;
* 04 - невідновлювальних помилка мала місце, поки підлеглий намагався виконати затребованное дію.&lt;br /&gt;
* 05 - Підлеглий прийняв запит і обробляє його, але це вимагає багато часу. Ця відповідь оберігає головного від генерації помилки тайм-ауту.&lt;br /&gt;
* 06 - Підлеглий зайнятий обробкою команди. Головний повинен повторити повідомлення пізніше, коли підлеглий звільниться.&lt;br /&gt;
* 07 - Підлеглий не може виконати програмну функцію, прийняту в запиті. Цей код повертається для невдалого програмного запиту, що використовує функції з номерами 13 або 14. Головний повинен запросити діагностичну інформацію або інформацію про помилки з підлеглого.&lt;br /&gt;
* 08 - Підлеглий намагається читати розширену пам'ять, але виявив помилку паритету. Головний може повторити запит, але звичайно в таких випадках потрібний ремонт.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Зовнішні посилання ==&lt;br /&gt;
Посилання у різних вільних енциклопедіях (wikipedia):&lt;br /&gt;
* [http://uk.wikipedia.org/wiki/Modbus  українська]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/Modbus  російська]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Modbus  англійська]&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14539</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14539"/>
				<updated>2012-04-16T13:28:08Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції:&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані:&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адреса відомого пристрою  . &lt;br /&gt;
! код функції   .&lt;br /&gt;
! дані   .&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адреса відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції  .&lt;br /&gt;
! ід протоколу  .&lt;br /&gt;
! довжина пакету  .&lt;br /&gt;
! адресу відомого пристрою  .&lt;br /&gt;
! код функції  .&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Елементи|| Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандартні функції протоколу Modbus ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright thumb&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
|+ '''PDU запиту і відповіді для стандартних функцій'''&lt;br /&gt;
! номер &amp;lt;br /&amp;gt; функції&lt;br /&gt;
! colspan = &amp;quot;6&amp;quot; | запит / відповідь&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 1 (0x01)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 2 (0x02)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 3 (0x03)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 4 (0x04)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 5 (0x05)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 6 (0x06)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 15 (0x0F)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 16 (0x10)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
*'''A &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''A &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - адреса елемента,&lt;br /&gt;
*'''Q &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''Q &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - кількість елементів,&lt;br /&gt;
*'''N''' - кількість байт даних&lt;br /&gt;
*'''D''' - дані&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Читання даних ===&lt;br /&gt;
&lt;br /&gt;
Для читання значень з перерахованих вище таблиць даних використовуються функції з кодами 1-4 шістнадцяткові значення 0x01-0x04):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''1 (0x01)'''- читання значень з декількох регістрів прапорів''(Read Coil Status)''&lt;br /&gt;
*'''2 (0x02)'''- читання значень з декількох дискретних входів''(Read Discrete Inputs)''&lt;br /&gt;
*'''3 (0x03)'''- читання значень з декількох регістрів зберігання''(Read Holding Registers)''&lt;br /&gt;
*'''4 (0x04)'''- читання значень з декількох регістрів введення''(Read Input Registers)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запит складається із адреси першого елемента таблиці, яку потрібно прочитати, і кількості зчитувальних елементів. Адреса та кількість даних задаються 16-бітними числами, старший байт кожного з них передається першим.&lt;br /&gt;
&lt;br /&gt;
У відповіді передаються запитані дані. Кількість байт даних залежить від кількості замовлених елементів. Перед даними передається один байт, значення якого дорівнює кількості байт даних.&lt;br /&gt;
&lt;br /&gt;
Значення регістрів зберігання і регістрів введення передаються починаючи із зазначеної адреси, по два байти на регістр, старший байт кожного регістру передається першим:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! байт 1 || байт 2 || байт 3 || байт 4 || ... || байт N-1 || байт N&lt;br /&gt;
|-&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A +1,1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A +1,0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A + Q-1, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A + Q-1, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Значення прапорів і дискретних входів передаються в упакованому вигляді: по одному біту на прапор.&lt;br /&gt;
Одиниця означає включений стан, нуль - вимкнений.&lt;br /&gt;
Значення запитаних прапорів заповнюють спочатку перший байт, починаючи з молодшого біта, потім наступні байти, також від молодшого біта до старших.&lt;br /&gt;
Молодший біт першого байта даних містить значення прапора, зазначеного в полі «адресу».&lt;br /&gt;
Якщо запитано кількість прапорів, не кратне восьми, то значення додаткового біта заповнюються нулями:.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! colspan = &amp;quot;8&amp;quot; | байт 1&lt;br /&gt;
! ...&lt;br /&gt;
! colspan = &amp;quot;7&amp;quot; | байт N&lt;br /&gt;
|-&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +7&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +6&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +5&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +4&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +3&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис одного значення ===&lt;br /&gt;
&lt;br /&gt;
*'''5 (0x05)'''- запис значення одного прапора''(Force Single Coil)''&lt;br /&gt;
*'''6 (0x06)'''- запис значення в один регістр зберігання''(Preset Single Register)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента (2 байти) і встановлюваного значення (2 байти).&lt;br /&gt;
&lt;br /&gt;
Для регістру зберігання значення є просто 16-бітним словом.&lt;br /&gt;
&lt;br /&gt;
Для прапорів значення 0xFF00 означає включений стан, 0x0000 - вимкнений, інші значення неприпустимі.&lt;br /&gt;
&lt;br /&gt;
Якщо команда виконана успішно, ведене пристрій повертає копію запиту.&lt;br /&gt;
&lt;br /&gt;
=== Запис декількох значень ===&lt;br /&gt;
&lt;br /&gt;
*'''15 (0x0F)'''- запис значень в кілька регістрів прапорів''(Force Multiple Coils)''&lt;br /&gt;
*'''16 (0x10)'''- запис значень в кілька регістрів зберігання''(Preset Multiple Registers)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента, кількості змінюваних елементів, кількості переданих байт встановлюваних значень і самих встановлюваних значень. Дані упаковуються так само, як в командах читання даних.&lt;br /&gt;
&lt;br /&gt;
Відповідь складається з початкової адреси і кількості змінених елементів.&lt;br /&gt;
&lt;br /&gt;
Нижче наведено приклад команди ведучого пристрою і відповіді веденого (для Modbus RTU).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 06 Кількість байт даних&lt;br /&gt;
! 07 Дані (значення для прапорів біти 0-7)&lt;br /&gt;
! 08 Дані (значення для прапорів біти 8-15)&lt;br /&gt;
! 09 CRC мл. байт&lt;br /&gt;
! 0A CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Master → Slave &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x02 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCD &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x72 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCB &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 05 CRC мл. байт&lt;br /&gt;
! 06 CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Slave → Master &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x24 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x09 &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Контроль помилок у протоколі Modbus RTU ==&lt;br /&gt;
&lt;br /&gt;
Під час обміну даними можуть виникати помилки двох типів:&lt;br /&gt;
* Помилки, пов'язані з спотвореннями при передачі даних;&lt;br /&gt;
* Логічні помилки.&lt;br /&gt;
&lt;br /&gt;
Помилки першого типу виявляються за допомогою фреймів символів, контролю парності і циклічної контрольної суми [[CRC]]-16-IBM (використовується число-[[поліном]] = 0xA001). При цьому молодший байт передається першим, на відміну від байтів адреси і значення регістра в PDU&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RTU фрейм ===&lt;br /&gt;
&lt;br /&gt;
У RTU режимі повідомлення має починатися і закінчуватися інтервалом тиші - часом передачі не менше 3.5 символів при даній швидкості в мережі. Першим полем потім передається адреса пристрою.&lt;br /&gt;
&lt;br /&gt;
Слідом за останнім переданим символом також слід інтервал тиші тривалістю не менше 3.5 символів. Нове повідомлення може починатися після цього інтервалу.&lt;br /&gt;
&lt;br /&gt;
Фрейм повідомлення передається безперервно. Якщо інтервал тиші тривалістю 1.5 виник під час передачі фрейму, приймаючий пристрій повинен ігнорувати цей фрейм як неповний.&lt;br /&gt;
&lt;br /&gt;
Таким чином, нове повідомлення повинно починатися не раніше 3.5 інтервалу, так як в цьому випадку встановлюється помилка.&lt;br /&gt;
&lt;br /&gt;
Трохи про інтервали (мова йде про Serial Modbus RTU):&lt;br /&gt;
при швидкості 9600 і 11 бітах в кадрі (стартовий біт + 8 біт даних + біт контролю парності + стоп-біт):&lt;br /&gt;
3.5 * 11 / 9600 = 0,00401041 (6), тобто більше 4 мс;&lt;br /&gt;
1.5 * 11 / 9600 = 0,00171875, тобто більше 1 мс.&lt;br /&gt;
Для швидкостей більше 19200 бод допускається використовувати інтервали 1,75 і 0,75 мс відповідно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Логічні помилки ===&lt;br /&gt;
Для повідомлень про помилки другого типу протокол Modbus RTU передбачає, що пристрої можуть відсилати відповіді, що свідчать про помилкову ситуації.&lt;br /&gt;
Ознакою того, що відповідь містить повідомлення про помилку, є встановлений старший біт коду команди.&lt;br /&gt;
Приклад кадру при виявленні помилки веденим пристроєм, у відповідь на запит наведено в (Таблиця 2-1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Якщо Slave приймає коректний запит і може його нормально обробити, то повертає стандартний відповідь.&lt;br /&gt;
&lt;br /&gt;
2. Якщо Slave не приймає будь-якого значення, ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
3. Якщо Slave приймає запит, але виявляє помилку (parity, LRC, or CRC), ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
4. Якщо Slave приймає запит, але не може його обробити (звернення до неіснуючого регістру і т. д.), відправляється відповідь містить у собі дані про помилку.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Кадр відповіді (Slave → Master) при виникненні помилки modbus RTU'''&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! Адресу підлеглого пристрою&lt;br /&gt;
! Номер функції&lt;br /&gt;
! Дані (або код помилки)&lt;br /&gt;
! CRC&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Запит (Master → Slave) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x77 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xDD &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xC7 0xA9&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Відповідь (Slave → Master) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xF7 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xEE &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xE6 0x7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Стандартні коди помилок ====&lt;br /&gt;
* 01 - Прийнятий код функції не може бути опрацьований на підпорядкованому.&lt;br /&gt;
* 02 - Адреса даних, вказаний у запиті, не доступний даному підлеглому.&lt;br /&gt;
* 03 - Величина, що міститься в полі даних запиту, є неприпустимою величиною для підлеглого.&lt;br /&gt;
* 04 - невідновлювальних помилка мала місце, поки підлеглий намагався виконати затребованное дію.&lt;br /&gt;
* 05 - Підлеглий прийняв запит і обробляє його, але це вимагає багато часу. Ця відповідь оберігає головного від генерації помилки тайм-ауту.&lt;br /&gt;
* 06 - Підлеглий зайнятий обробкою команди. Головний повинен повторити повідомлення пізніше, коли підлеглий звільниться.&lt;br /&gt;
* 07 - Підлеглий не може виконати програмну функцію, прийняту в запиті. Цей код повертається для невдалого програмного запиту, що використовує функції з номерами 13 або 14. Головний повинен запросити діагностичну інформацію або інформацію про помилки з підлеглого.&lt;br /&gt;
* 08 - Підлеглий намагається читати розширену пам'ять, але виявив помилку паритету. Головний може повторити запит, але звичайно в таких випадках потрібний ремонт.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Зовнішні посилання ==&lt;br /&gt;
Посилання у різних вільних енциклопедіях (wikipedia):&lt;br /&gt;
* [http://uk.wikipedia.org/wiki/Modbus  українська]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/Modbus  російська]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Modbus  англійська]&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14538</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14538"/>
				<updated>2012-04-16T13:25:42Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).[[українська]]&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції:&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані:&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адреса відомого пристрою  . &lt;br /&gt;
! код функції   .&lt;br /&gt;
! дані   .&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адреса відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції  .&lt;br /&gt;
! ід протоколу  .&lt;br /&gt;
! довжина пакету  .&lt;br /&gt;
! адресу відомого пристрою  .&lt;br /&gt;
! код функції  .&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Елементи|| Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандартні функції протоколу Modbus ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright thumb&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
|+ '''PDU запиту і відповіді для стандартних функцій'''&lt;br /&gt;
! номер &amp;lt;br /&amp;gt; функції&lt;br /&gt;
! colspan = &amp;quot;6&amp;quot; | запит / відповідь&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 1 (0x01)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 2 (0x02)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 3 (0x03)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 4 (0x04)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 5 (0x05)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 6 (0x06)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 15 (0x0F)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 16 (0x10)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
*'''A &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''A &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - адреса елемента,&lt;br /&gt;
*'''Q &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''Q &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - кількість елементів,&lt;br /&gt;
*'''N''' - кількість байт даних&lt;br /&gt;
*'''D''' - дані&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Читання даних ===&lt;br /&gt;
&lt;br /&gt;
Для читання значень з перерахованих вище таблиць даних використовуються функції з кодами 1-4 шістнадцяткові значення 0x01-0x04):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''1 (0x01)'''- читання значень з декількох регістрів прапорів''(Read Coil Status)''&lt;br /&gt;
*'''2 (0x02)'''- читання значень з декількох дискретних входів''(Read Discrete Inputs)''&lt;br /&gt;
*'''3 (0x03)'''- читання значень з декількох регістрів зберігання''(Read Holding Registers)''&lt;br /&gt;
*'''4 (0x04)'''- читання значень з декількох регістрів введення''(Read Input Registers)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запит складається із адреси першого елемента таблиці, яку потрібно прочитати, і кількості зчитувальних елементів. Адреса та кількість даних задаються 16-бітними числами, старший байт кожного з них передається першим.&lt;br /&gt;
&lt;br /&gt;
У відповіді передаються запитані дані. Кількість байт даних залежить від кількості замовлених елементів. Перед даними передається один байт, значення якого дорівнює кількості байт даних.&lt;br /&gt;
&lt;br /&gt;
Значення регістрів зберігання і регістрів введення передаються починаючи із зазначеної адреси, по два байти на регістр, старший байт кожного регістру передається першим:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! байт 1 || байт 2 || байт 3 || байт 4 || ... || байт N-1 || байт N&lt;br /&gt;
|-&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A +1,1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A +1,0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A + Q-1, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A + Q-1, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Значення прапорів і дискретних входів передаються в упакованому вигляді: по одному біту на прапор.&lt;br /&gt;
Одиниця означає включений стан, нуль - вимкнений.&lt;br /&gt;
Значення запитаних прапорів заповнюють спочатку перший байт, починаючи з молодшого біта, потім наступні байти, також від молодшого біта до старших.&lt;br /&gt;
Молодший біт першого байта даних містить значення прапора, зазначеного в полі «адресу».&lt;br /&gt;
Якщо запитано кількість прапорів, не кратне восьми, то значення додаткового біта заповнюються нулями:.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! colspan = &amp;quot;8&amp;quot; | байт 1&lt;br /&gt;
! ...&lt;br /&gt;
! colspan = &amp;quot;7&amp;quot; | байт N&lt;br /&gt;
|-&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +7&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +6&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +5&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +4&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +3&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис одного значення ===&lt;br /&gt;
&lt;br /&gt;
*'''5 (0x05)'''- запис значення одного прапора''(Force Single Coil)''&lt;br /&gt;
*'''6 (0x06)'''- запис значення в один регістр зберігання''(Preset Single Register)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента (2 байти) і встановлюваного значення (2 байти).&lt;br /&gt;
&lt;br /&gt;
Для регістру зберігання значення є просто 16-бітним словом.&lt;br /&gt;
&lt;br /&gt;
Для прапорів значення 0xFF00 означає включений стан, 0x0000 - вимкнений, інші значення неприпустимі.&lt;br /&gt;
&lt;br /&gt;
Якщо команда виконана успішно, ведене пристрій повертає копію запиту.&lt;br /&gt;
&lt;br /&gt;
=== Запис декількох значень ===&lt;br /&gt;
&lt;br /&gt;
*'''15 (0x0F)'''- запис значень в кілька регістрів прапорів''(Force Multiple Coils)''&lt;br /&gt;
*'''16 (0x10)'''- запис значень в кілька регістрів зберігання''(Preset Multiple Registers)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента, кількості змінюваних елементів, кількості переданих байт встановлюваних значень і самих встановлюваних значень. Дані упаковуються так само, як в командах читання даних.&lt;br /&gt;
&lt;br /&gt;
Відповідь складається з початкової адреси і кількості змінених елементів.&lt;br /&gt;
&lt;br /&gt;
Нижче наведено приклад команди ведучого пристрою і відповіді веденого (для Modbus RTU).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 06 Кількість байт даних&lt;br /&gt;
! 07 Дані (значення для прапорів біти 0-7)&lt;br /&gt;
! 08 Дані (значення для прапорів біти 8-15)&lt;br /&gt;
! 09 CRC мл. байт&lt;br /&gt;
! 0A CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Master → Slave &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x02 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCD &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x72 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCB &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 05 CRC мл. байт&lt;br /&gt;
! 06 CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Slave → Master &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x24 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x09 &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Контроль помилок у протоколі Modbus RTU ==&lt;br /&gt;
&lt;br /&gt;
Під час обміну даними можуть виникати помилки двох типів:&lt;br /&gt;
* Помилки, пов'язані з спотвореннями при передачі даних;&lt;br /&gt;
* Логічні помилки.&lt;br /&gt;
&lt;br /&gt;
Помилки першого типу виявляються за допомогою фреймів символів, контролю парності і циклічної контрольної суми [[CRC]]-16-IBM (використовується число-[[поліном]] = 0xA001). При цьому молодший байт передається першим, на відміну від байтів адреси і значення регістра в PDU&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RTU фрейм ===&lt;br /&gt;
&lt;br /&gt;
У RTU режимі повідомлення має починатися і закінчуватися інтервалом тиші - часом передачі не менше 3.5 символів при даній швидкості в мережі. Першим полем потім передається адреса пристрою.&lt;br /&gt;
&lt;br /&gt;
Слідом за останнім переданим символом також слід інтервал тиші тривалістю не менше 3.5 символів. Нове повідомлення може починатися після цього інтервалу.&lt;br /&gt;
&lt;br /&gt;
Фрейм повідомлення передається безперервно. Якщо інтервал тиші тривалістю 1.5 виник під час передачі фрейму, приймаючий пристрій повинен ігнорувати цей фрейм як неповний.&lt;br /&gt;
&lt;br /&gt;
Таким чином, нове повідомлення повинно починатися не раніше 3.5 інтервалу, так як в цьому випадку встановлюється помилка.&lt;br /&gt;
&lt;br /&gt;
Трохи про інтервали (мова йде про Serial Modbus RTU):&lt;br /&gt;
при швидкості 9600 і 11 бітах в кадрі (стартовий біт + 8 біт даних + біт контролю парності + стоп-біт):&lt;br /&gt;
3.5 * 11 / 9600 = 0,00401041 (6), тобто більше 4 мс;&lt;br /&gt;
1.5 * 11 / 9600 = 0,00171875, тобто більше 1 мс.&lt;br /&gt;
Для швидкостей більше 19200 бод допускається використовувати інтервали 1,75 і 0,75 мс відповідно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Логічні помилки ===&lt;br /&gt;
Для повідомлень про помилки другого типу протокол Modbus RTU передбачає, що пристрої можуть відсилати відповіді, що свідчать про помилкову ситуації.&lt;br /&gt;
Ознакою того, що відповідь містить повідомлення про помилку, є встановлений старший біт коду команди.&lt;br /&gt;
Приклад кадру при виявленні помилки веденим пристроєм, у відповідь на запит наведено в (Таблиця 2-1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Якщо Slave приймає коректний запит і може його нормально обробити, то повертає стандартний відповідь.&lt;br /&gt;
&lt;br /&gt;
2. Якщо Slave не приймає будь-якого значення, ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
3. Якщо Slave приймає запит, але виявляє помилку (parity, LRC, or CRC), ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
4. Якщо Slave приймає запит, але не може його обробити (звернення до неіснуючого регістру і т. д.), відправляється відповідь містить у собі дані про помилку.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Кадр відповіді (Slave → Master) при виникненні помилки modbus RTU'''&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! Адресу підлеглого пристрою&lt;br /&gt;
! Номер функції&lt;br /&gt;
! Дані (або код помилки)&lt;br /&gt;
! CRC&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Запит (Master → Slave) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x77 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xDD &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xC7 0xA9&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Відповідь (Slave → Master) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xF7 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xEE &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xE6 0x7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Стандартні коди помилок ====&lt;br /&gt;
* 01 - Прийнятий код функції не може бути опрацьований на підпорядкованому.&lt;br /&gt;
* 02 - Адреса даних, вказаний у запиті, не доступний даному підлеглому.&lt;br /&gt;
* 03 - Величина, що міститься в полі даних запиту, є неприпустимою величиною для підлеглого.&lt;br /&gt;
* 04 - невідновлювальних помилка мала місце, поки підлеглий намагався виконати затребованное дію.&lt;br /&gt;
* 05 - Підлеглий прийняв запит і обробляє його, але це вимагає багато часу. Ця відповідь оберігає головного від генерації помилки тайм-ауту.&lt;br /&gt;
* 06 - Підлеглий зайнятий обробкою команди. Головний повинен повторити повідомлення пізніше, коли підлеглий звільниться.&lt;br /&gt;
* 07 - Підлеглий не може виконати програмну функцію, прийняту в запиті. Цей код повертається для невдалого програмного запиту, що використовує функції з номерами 13 або 14. Головний повинен запросити діагностичну інформацію або інформацію про помилки з підлеглого.&lt;br /&gt;
* 08 - Підлеглий намагається читати розширену пам'ять, але виявив помилку паритету. Головний може повторити запит, але звичайно в таких випадках потрібний ремонт.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Зовнішні посилання ==&lt;br /&gt;
Посилання у різних вільних енциклопедіях (wikipedia):&lt;br /&gt;
* [http://uk.wikipedia.org/wiki/Modbus  українська]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/Modbus  російська]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Modbus  англійська]&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14537</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14537"/>
				<updated>2012-04-16T13:23:20Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: /* Зовнішні посилання */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції:&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані:&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адреса відомого пристрою  . &lt;br /&gt;
! код функції   .&lt;br /&gt;
! дані   .&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адреса відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції  .&lt;br /&gt;
! ід протоколу  .&lt;br /&gt;
! довжина пакету  .&lt;br /&gt;
! адресу відомого пристрою  .&lt;br /&gt;
! код функції  .&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Елементи|| Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандартні функції протоколу Modbus ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright thumb&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
|+ '''PDU запиту і відповіді для стандартних функцій'''&lt;br /&gt;
! номер &amp;lt;br /&amp;gt; функції&lt;br /&gt;
! colspan = &amp;quot;6&amp;quot; | запит / відповідь&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 1 (0x01)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 2 (0x02)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 3 (0x03)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 4 (0x04)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 5 (0x05)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 6 (0x06)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 15 (0x0F)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 16 (0x10)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
*'''A &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''A &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - адреса елемента,&lt;br /&gt;
*'''Q &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''Q &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - кількість елементів,&lt;br /&gt;
*'''N''' - кількість байт даних&lt;br /&gt;
*'''D''' - дані&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Читання даних ===&lt;br /&gt;
&lt;br /&gt;
Для читання значень з перерахованих вище таблиць даних використовуються функції з кодами 1-4 шістнадцяткові значення 0x01-0x04):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''1 (0x01)'''- читання значень з декількох регістрів прапорів''(Read Coil Status)''&lt;br /&gt;
*'''2 (0x02)'''- читання значень з декількох дискретних входів''(Read Discrete Inputs)''&lt;br /&gt;
*'''3 (0x03)'''- читання значень з декількох регістрів зберігання''(Read Holding Registers)''&lt;br /&gt;
*'''4 (0x04)'''- читання значень з декількох регістрів введення''(Read Input Registers)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запит складається із адреси першого елемента таблиці, яку потрібно прочитати, і кількості зчитувальних елементів. Адреса та кількість даних задаються 16-бітними числами, старший байт кожного з них передається першим.&lt;br /&gt;
&lt;br /&gt;
У відповіді передаються запитані дані. Кількість байт даних залежить від кількості замовлених елементів. Перед даними передається один байт, значення якого дорівнює кількості байт даних.&lt;br /&gt;
&lt;br /&gt;
Значення регістрів зберігання і регістрів введення передаються починаючи із зазначеної адреси, по два байти на регістр, старший байт кожного регістру передається першим:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! байт 1 || байт 2 || байт 3 || байт 4 || ... || байт N-1 || байт N&lt;br /&gt;
|-&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A +1,1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A +1,0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A + Q-1, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A + Q-1, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Значення прапорів і дискретних входів передаються в упакованому вигляді: по одному біту на прапор.&lt;br /&gt;
Одиниця означає включений стан, нуль - вимкнений.&lt;br /&gt;
Значення запитаних прапорів заповнюють спочатку перший байт, починаючи з молодшого біта, потім наступні байти, також від молодшого біта до старших.&lt;br /&gt;
Молодший біт першого байта даних містить значення прапора, зазначеного в полі «адресу».&lt;br /&gt;
Якщо запитано кількість прапорів, не кратне восьми, то значення додаткового біта заповнюються нулями:.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! colspan = &amp;quot;8&amp;quot; | байт 1&lt;br /&gt;
! ...&lt;br /&gt;
! colspan = &amp;quot;7&amp;quot; | байт N&lt;br /&gt;
|-&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +7&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +6&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +5&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +4&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +3&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис одного значення ===&lt;br /&gt;
&lt;br /&gt;
*'''5 (0x05)'''- запис значення одного прапора''(Force Single Coil)''&lt;br /&gt;
*'''6 (0x06)'''- запис значення в один регістр зберігання''(Preset Single Register)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента (2 байти) і встановлюваного значення (2 байти).&lt;br /&gt;
&lt;br /&gt;
Для регістру зберігання значення є просто 16-бітним словом.&lt;br /&gt;
&lt;br /&gt;
Для прапорів значення 0xFF00 означає включений стан, 0x0000 - вимкнений, інші значення неприпустимі.&lt;br /&gt;
&lt;br /&gt;
Якщо команда виконана успішно, ведене пристрій повертає копію запиту.&lt;br /&gt;
&lt;br /&gt;
=== Запис декількох значень ===&lt;br /&gt;
&lt;br /&gt;
*'''15 (0x0F)'''- запис значень в кілька регістрів прапорів''(Force Multiple Coils)''&lt;br /&gt;
*'''16 (0x10)'''- запис значень в кілька регістрів зберігання''(Preset Multiple Registers)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента, кількості змінюваних елементів, кількості переданих байт встановлюваних значень і самих встановлюваних значень. Дані упаковуються так само, як в командах читання даних.&lt;br /&gt;
&lt;br /&gt;
Відповідь складається з початкової адреси і кількості змінених елементів.&lt;br /&gt;
&lt;br /&gt;
Нижче наведено приклад команди ведучого пристрою і відповіді веденого (для Modbus RTU).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 06 Кількість байт даних&lt;br /&gt;
! 07 Дані (значення для прапорів біти 0-7)&lt;br /&gt;
! 08 Дані (значення для прапорів біти 8-15)&lt;br /&gt;
! 09 CRC мл. байт&lt;br /&gt;
! 0A CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Master → Slave &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x02 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCD &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x72 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCB &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 05 CRC мл. байт&lt;br /&gt;
! 06 CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Slave → Master &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x24 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x09 &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Контроль помилок у протоколі Modbus RTU ==&lt;br /&gt;
&lt;br /&gt;
Під час обміну даними можуть виникати помилки двох типів:&lt;br /&gt;
* Помилки, пов'язані з спотвореннями при передачі даних;&lt;br /&gt;
* Логічні помилки.&lt;br /&gt;
&lt;br /&gt;
Помилки першого типу виявляються за допомогою фреймів символів, контролю парності і циклічної контрольної суми [[CRC]]-16-IBM (використовується число-[[поліном]] = 0xA001). При цьому молодший байт передається першим, на відміну від байтів адреси і значення регістра в PDU&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RTU фрейм ===&lt;br /&gt;
&lt;br /&gt;
У RTU режимі повідомлення має починатися і закінчуватися інтервалом тиші - часом передачі не менше 3.5 символів при даній швидкості в мережі. Першим полем потім передається адреса пристрою.&lt;br /&gt;
&lt;br /&gt;
Слідом за останнім переданим символом також слід інтервал тиші тривалістю не менше 3.5 символів. Нове повідомлення може починатися після цього інтервалу.&lt;br /&gt;
&lt;br /&gt;
Фрейм повідомлення передається безперервно. Якщо інтервал тиші тривалістю 1.5 виник під час передачі фрейму, приймаючий пристрій повинен ігнорувати цей фрейм як неповний.&lt;br /&gt;
&lt;br /&gt;
Таким чином, нове повідомлення повинно починатися не раніше 3.5 інтервалу, так як в цьому випадку встановлюється помилка.&lt;br /&gt;
&lt;br /&gt;
Трохи про інтервали (мова йде про Serial Modbus RTU):&lt;br /&gt;
при швидкості 9600 і 11 бітах в кадрі (стартовий біт + 8 біт даних + біт контролю парності + стоп-біт):&lt;br /&gt;
3.5 * 11 / 9600 = 0,00401041 (6), тобто більше 4 мс;&lt;br /&gt;
1.5 * 11 / 9600 = 0,00171875, тобто більше 1 мс.&lt;br /&gt;
Для швидкостей більше 19200 бод допускається використовувати інтервали 1,75 і 0,75 мс відповідно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Логічні помилки ===&lt;br /&gt;
Для повідомлень про помилки другого типу протокол Modbus RTU передбачає, що пристрої можуть відсилати відповіді, що свідчать про помилкову ситуації.&lt;br /&gt;
Ознакою того, що відповідь містить повідомлення про помилку, є встановлений старший біт коду команди.&lt;br /&gt;
Приклад кадру при виявленні помилки веденим пристроєм, у відповідь на запит наведено в (Таблиця 2-1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Якщо Slave приймає коректний запит і може його нормально обробити, то повертає стандартний відповідь.&lt;br /&gt;
&lt;br /&gt;
2. Якщо Slave не приймає будь-якого значення, ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
3. Якщо Slave приймає запит, але виявляє помилку (parity, LRC, or CRC), ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
4. Якщо Slave приймає запит, але не може його обробити (звернення до неіснуючого регістру і т. д.), відправляється відповідь містить у собі дані про помилку.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Кадр відповіді (Slave → Master) при виникненні помилки modbus RTU'''&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! Адресу підлеглого пристрою&lt;br /&gt;
! Номер функції&lt;br /&gt;
! Дані (або код помилки)&lt;br /&gt;
! CRC&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Запит (Master → Slave) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x77 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xDD &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xC7 0xA9&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Відповідь (Slave → Master) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xF7 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xEE &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xE6 0x7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Стандартні коди помилок ====&lt;br /&gt;
* 01 - Прийнятий код функції не може бути опрацьований на підпорядкованому.&lt;br /&gt;
* 02 - Адреса даних, вказаний у запиті, не доступний даному підлеглому.&lt;br /&gt;
* 03 - Величина, що міститься в полі даних запиту, є неприпустимою величиною для підлеглого.&lt;br /&gt;
* 04 - невідновлювальних помилка мала місце, поки підлеглий намагався виконати затребованное дію.&lt;br /&gt;
* 05 - Підлеглий прийняв запит і обробляє його, але це вимагає багато часу. Ця відповідь оберігає головного від генерації помилки тайм-ауту.&lt;br /&gt;
* 06 - Підлеглий зайнятий обробкою команди. Головний повинен повторити повідомлення пізніше, коли підлеглий звільниться.&lt;br /&gt;
* 07 - Підлеглий не може виконати програмну функцію, прийняту в запиті. Цей код повертається для невдалого програмного запиту, що використовує функції з номерами 13 або 14. Головний повинен запросити діагностичну інформацію або інформацію про помилки з підлеглого.&lt;br /&gt;
* 08 - Підлеглий намагається читати розширену пам'ять, але виявив помилку паритету. Головний може повторити запит, але звичайно в таких випадках потрібний ремонт.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Зовнішні посилання ==&lt;br /&gt;
Посилання у різних вільних енциклопедій(wikipedia):&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Modbus  англійська]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/Modbus  російська]&lt;br /&gt;
* [http://uk.wikipedia.org/wiki/Modbus  українська]&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14536</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14536"/>
				<updated>2012-04-16T13:23:10Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: /* Зовнішні посилання */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції:&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані:&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адреса відомого пристрою  . &lt;br /&gt;
! код функції   .&lt;br /&gt;
! дані   .&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адреса відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції  .&lt;br /&gt;
! ід протоколу  .&lt;br /&gt;
! довжина пакету  .&lt;br /&gt;
! адресу відомого пристрою  .&lt;br /&gt;
! код функції  .&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Елементи|| Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандартні функції протоколу Modbus ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright thumb&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
|+ '''PDU запиту і відповіді для стандартних функцій'''&lt;br /&gt;
! номер &amp;lt;br /&amp;gt; функції&lt;br /&gt;
! colspan = &amp;quot;6&amp;quot; | запит / відповідь&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 1 (0x01)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 2 (0x02)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 3 (0x03)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 4 (0x04)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 5 (0x05)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 6 (0x06)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 15 (0x0F)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 16 (0x10)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
*'''A &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''A &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - адреса елемента,&lt;br /&gt;
*'''Q &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''Q &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - кількість елементів,&lt;br /&gt;
*'''N''' - кількість байт даних&lt;br /&gt;
*'''D''' - дані&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Читання даних ===&lt;br /&gt;
&lt;br /&gt;
Для читання значень з перерахованих вище таблиць даних використовуються функції з кодами 1-4 шістнадцяткові значення 0x01-0x04):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''1 (0x01)'''- читання значень з декількох регістрів прапорів''(Read Coil Status)''&lt;br /&gt;
*'''2 (0x02)'''- читання значень з декількох дискретних входів''(Read Discrete Inputs)''&lt;br /&gt;
*'''3 (0x03)'''- читання значень з декількох регістрів зберігання''(Read Holding Registers)''&lt;br /&gt;
*'''4 (0x04)'''- читання значень з декількох регістрів введення''(Read Input Registers)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запит складається із адреси першого елемента таблиці, яку потрібно прочитати, і кількості зчитувальних елементів. Адреса та кількість даних задаються 16-бітними числами, старший байт кожного з них передається першим.&lt;br /&gt;
&lt;br /&gt;
У відповіді передаються запитані дані. Кількість байт даних залежить від кількості замовлених елементів. Перед даними передається один байт, значення якого дорівнює кількості байт даних.&lt;br /&gt;
&lt;br /&gt;
Значення регістрів зберігання і регістрів введення передаються починаючи із зазначеної адреси, по два байти на регістр, старший байт кожного регістру передається першим:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! байт 1 || байт 2 || байт 3 || байт 4 || ... || байт N-1 || байт N&lt;br /&gt;
|-&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A +1,1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A +1,0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A + Q-1, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A + Q-1, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Значення прапорів і дискретних входів передаються в упакованому вигляді: по одному біту на прапор.&lt;br /&gt;
Одиниця означає включений стан, нуль - вимкнений.&lt;br /&gt;
Значення запитаних прапорів заповнюють спочатку перший байт, починаючи з молодшого біта, потім наступні байти, також від молодшого біта до старших.&lt;br /&gt;
Молодший біт першого байта даних містить значення прапора, зазначеного в полі «адресу».&lt;br /&gt;
Якщо запитано кількість прапорів, не кратне восьми, то значення додаткового біта заповнюються нулями:.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! colspan = &amp;quot;8&amp;quot; | байт 1&lt;br /&gt;
! ...&lt;br /&gt;
! colspan = &amp;quot;7&amp;quot; | байт N&lt;br /&gt;
|-&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +7&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +6&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +5&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +4&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +3&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис одного значення ===&lt;br /&gt;
&lt;br /&gt;
*'''5 (0x05)'''- запис значення одного прапора''(Force Single Coil)''&lt;br /&gt;
*'''6 (0x06)'''- запис значення в один регістр зберігання''(Preset Single Register)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента (2 байти) і встановлюваного значення (2 байти).&lt;br /&gt;
&lt;br /&gt;
Для регістру зберігання значення є просто 16-бітним словом.&lt;br /&gt;
&lt;br /&gt;
Для прапорів значення 0xFF00 означає включений стан, 0x0000 - вимкнений, інші значення неприпустимі.&lt;br /&gt;
&lt;br /&gt;
Якщо команда виконана успішно, ведене пристрій повертає копію запиту.&lt;br /&gt;
&lt;br /&gt;
=== Запис декількох значень ===&lt;br /&gt;
&lt;br /&gt;
*'''15 (0x0F)'''- запис значень в кілька регістрів прапорів''(Force Multiple Coils)''&lt;br /&gt;
*'''16 (0x10)'''- запис значень в кілька регістрів зберігання''(Preset Multiple Registers)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента, кількості змінюваних елементів, кількості переданих байт встановлюваних значень і самих встановлюваних значень. Дані упаковуються так само, як в командах читання даних.&lt;br /&gt;
&lt;br /&gt;
Відповідь складається з початкової адреси і кількості змінених елементів.&lt;br /&gt;
&lt;br /&gt;
Нижче наведено приклад команди ведучого пристрою і відповіді веденого (для Modbus RTU).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 06 Кількість байт даних&lt;br /&gt;
! 07 Дані (значення для прапорів біти 0-7)&lt;br /&gt;
! 08 Дані (значення для прапорів біти 8-15)&lt;br /&gt;
! 09 CRC мл. байт&lt;br /&gt;
! 0A CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Master → Slave &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x02 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCD &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x72 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCB &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 05 CRC мл. байт&lt;br /&gt;
! 06 CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Slave → Master &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x24 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x09 &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Контроль помилок у протоколі Modbus RTU ==&lt;br /&gt;
&lt;br /&gt;
Під час обміну даними можуть виникати помилки двох типів:&lt;br /&gt;
* Помилки, пов'язані з спотвореннями при передачі даних;&lt;br /&gt;
* Логічні помилки.&lt;br /&gt;
&lt;br /&gt;
Помилки першого типу виявляються за допомогою фреймів символів, контролю парності і циклічної контрольної суми [[CRC]]-16-IBM (використовується число-[[поліном]] = 0xA001). При цьому молодший байт передається першим, на відміну від байтів адреси і значення регістра в PDU&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RTU фрейм ===&lt;br /&gt;
&lt;br /&gt;
У RTU режимі повідомлення має починатися і закінчуватися інтервалом тиші - часом передачі не менше 3.5 символів при даній швидкості в мережі. Першим полем потім передається адреса пристрою.&lt;br /&gt;
&lt;br /&gt;
Слідом за останнім переданим символом також слід інтервал тиші тривалістю не менше 3.5 символів. Нове повідомлення може починатися після цього інтервалу.&lt;br /&gt;
&lt;br /&gt;
Фрейм повідомлення передається безперервно. Якщо інтервал тиші тривалістю 1.5 виник під час передачі фрейму, приймаючий пристрій повинен ігнорувати цей фрейм як неповний.&lt;br /&gt;
&lt;br /&gt;
Таким чином, нове повідомлення повинно починатися не раніше 3.5 інтервалу, так як в цьому випадку встановлюється помилка.&lt;br /&gt;
&lt;br /&gt;
Трохи про інтервали (мова йде про Serial Modbus RTU):&lt;br /&gt;
при швидкості 9600 і 11 бітах в кадрі (стартовий біт + 8 біт даних + біт контролю парності + стоп-біт):&lt;br /&gt;
3.5 * 11 / 9600 = 0,00401041 (6), тобто більше 4 мс;&lt;br /&gt;
1.5 * 11 / 9600 = 0,00171875, тобто більше 1 мс.&lt;br /&gt;
Для швидкостей більше 19200 бод допускається використовувати інтервали 1,75 і 0,75 мс відповідно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Логічні помилки ===&lt;br /&gt;
Для повідомлень про помилки другого типу протокол Modbus RTU передбачає, що пристрої можуть відсилати відповіді, що свідчать про помилкову ситуації.&lt;br /&gt;
Ознакою того, що відповідь містить повідомлення про помилку, є встановлений старший біт коду команди.&lt;br /&gt;
Приклад кадру при виявленні помилки веденим пристроєм, у відповідь на запит наведено в (Таблиця 2-1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Якщо Slave приймає коректний запит і може його нормально обробити, то повертає стандартний відповідь.&lt;br /&gt;
&lt;br /&gt;
2. Якщо Slave не приймає будь-якого значення, ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
3. Якщо Slave приймає запит, але виявляє помилку (parity, LRC, or CRC), ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
4. Якщо Slave приймає запит, але не може його обробити (звернення до неіснуючого регістру і т. д.), відправляється відповідь містить у собі дані про помилку.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Кадр відповіді (Slave → Master) при виникненні помилки modbus RTU'''&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! Адресу підлеглого пристрою&lt;br /&gt;
! Номер функції&lt;br /&gt;
! Дані (або код помилки)&lt;br /&gt;
! CRC&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Запит (Master → Slave) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x77 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xDD &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xC7 0xA9&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Відповідь (Slave → Master) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xF7 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xEE &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xE6 0x7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Стандартні коди помилок ====&lt;br /&gt;
* 01 - Прийнятий код функції не може бути опрацьований на підпорядкованому.&lt;br /&gt;
* 02 - Адреса даних, вказаний у запиті, не доступний даному підлеглому.&lt;br /&gt;
* 03 - Величина, що міститься в полі даних запиту, є неприпустимою величиною для підлеглого.&lt;br /&gt;
* 04 - невідновлювальних помилка мала місце, поки підлеглий намагався виконати затребованное дію.&lt;br /&gt;
* 05 - Підлеглий прийняв запит і обробляє його, але це вимагає багато часу. Ця відповідь оберігає головного від генерації помилки тайм-ауту.&lt;br /&gt;
* 06 - Підлеглий зайнятий обробкою команди. Головний повинен повторити повідомлення пізніше, коли підлеглий звільниться.&lt;br /&gt;
* 07 - Підлеглий не може виконати програмну функцію, прийняту в запиті. Цей код повертається для невдалого програмного запиту, що використовує функції з номерами 13 або 14. Головний повинен запросити діагностичну інформацію або інформацію про помилки з підлеглого.&lt;br /&gt;
* 08 - Підлеглий намагається читати розширену пам'ять, але виявив помилку паритету. Головний може повторити запит, але звичайно в таких випадках потрібний ремонт.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Зовнішні посилання ==&lt;br /&gt;
Посилання у різних вільних енциклопедій(wikipedia):&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Modbus  англійська]&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/Modbus  російська]&lt;br /&gt;
* українська[http://uk.wikipedia.org/wiki/Modbus  українська]&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14535</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14535"/>
				<updated>2012-04-16T13:22:25Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції:&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані:&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адреса відомого пристрою  . &lt;br /&gt;
! код функції   .&lt;br /&gt;
! дані   .&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адреса відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції  .&lt;br /&gt;
! ід протоколу  .&lt;br /&gt;
! довжина пакету  .&lt;br /&gt;
! адресу відомого пристрою  .&lt;br /&gt;
! код функції  .&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Елементи|| Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандартні функції протоколу Modbus ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright thumb&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
|+ '''PDU запиту і відповіді для стандартних функцій'''&lt;br /&gt;
! номер &amp;lt;br /&amp;gt; функції&lt;br /&gt;
! colspan = &amp;quot;6&amp;quot; | запит / відповідь&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 1 (0x01)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 2 (0x02)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 3 (0x03)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 4 (0x04)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 5 (0x05)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 6 (0x06)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 15 (0x0F)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 16 (0x10)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
*'''A &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''A &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - адреса елемента,&lt;br /&gt;
*'''Q &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''Q &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - кількість елементів,&lt;br /&gt;
*'''N''' - кількість байт даних&lt;br /&gt;
*'''D''' - дані&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Читання даних ===&lt;br /&gt;
&lt;br /&gt;
Для читання значень з перерахованих вище таблиць даних використовуються функції з кодами 1-4 шістнадцяткові значення 0x01-0x04):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''1 (0x01)'''- читання значень з декількох регістрів прапорів''(Read Coil Status)''&lt;br /&gt;
*'''2 (0x02)'''- читання значень з декількох дискретних входів''(Read Discrete Inputs)''&lt;br /&gt;
*'''3 (0x03)'''- читання значень з декількох регістрів зберігання''(Read Holding Registers)''&lt;br /&gt;
*'''4 (0x04)'''- читання значень з декількох регістрів введення''(Read Input Registers)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запит складається із адреси першого елемента таблиці, яку потрібно прочитати, і кількості зчитувальних елементів. Адреса та кількість даних задаються 16-бітними числами, старший байт кожного з них передається першим.&lt;br /&gt;
&lt;br /&gt;
У відповіді передаються запитані дані. Кількість байт даних залежить від кількості замовлених елементів. Перед даними передається один байт, значення якого дорівнює кількості байт даних.&lt;br /&gt;
&lt;br /&gt;
Значення регістрів зберігання і регістрів введення передаються починаючи із зазначеної адреси, по два байти на регістр, старший байт кожного регістру передається першим:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! байт 1 || байт 2 || байт 3 || байт 4 || ... || байт N-1 || байт N&lt;br /&gt;
|-&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A +1,1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A +1,0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A + Q-1, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A + Q-1, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Значення прапорів і дискретних входів передаються в упакованому вигляді: по одному біту на прапор.&lt;br /&gt;
Одиниця означає включений стан, нуль - вимкнений.&lt;br /&gt;
Значення запитаних прапорів заповнюють спочатку перший байт, починаючи з молодшого біта, потім наступні байти, також від молодшого біта до старших.&lt;br /&gt;
Молодший біт першого байта даних містить значення прапора, зазначеного в полі «адресу».&lt;br /&gt;
Якщо запитано кількість прапорів, не кратне восьми, то значення додаткового біта заповнюються нулями:.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! colspan = &amp;quot;8&amp;quot; | байт 1&lt;br /&gt;
! ...&lt;br /&gt;
! colspan = &amp;quot;7&amp;quot; | байт N&lt;br /&gt;
|-&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +7&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +6&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +5&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +4&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +3&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис одного значення ===&lt;br /&gt;
&lt;br /&gt;
*'''5 (0x05)'''- запис значення одного прапора''(Force Single Coil)''&lt;br /&gt;
*'''6 (0x06)'''- запис значення в один регістр зберігання''(Preset Single Register)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента (2 байти) і встановлюваного значення (2 байти).&lt;br /&gt;
&lt;br /&gt;
Для регістру зберігання значення є просто 16-бітним словом.&lt;br /&gt;
&lt;br /&gt;
Для прапорів значення 0xFF00 означає включений стан, 0x0000 - вимкнений, інші значення неприпустимі.&lt;br /&gt;
&lt;br /&gt;
Якщо команда виконана успішно, ведене пристрій повертає копію запиту.&lt;br /&gt;
&lt;br /&gt;
=== Запис декількох значень ===&lt;br /&gt;
&lt;br /&gt;
*'''15 (0x0F)'''- запис значень в кілька регістрів прапорів''(Force Multiple Coils)''&lt;br /&gt;
*'''16 (0x10)'''- запис значень в кілька регістрів зберігання''(Preset Multiple Registers)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента, кількості змінюваних елементів, кількості переданих байт встановлюваних значень і самих встановлюваних значень. Дані упаковуються так само, як в командах читання даних.&lt;br /&gt;
&lt;br /&gt;
Відповідь складається з початкової адреси і кількості змінених елементів.&lt;br /&gt;
&lt;br /&gt;
Нижче наведено приклад команди ведучого пристрою і відповіді веденого (для Modbus RTU).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 06 Кількість байт даних&lt;br /&gt;
! 07 Дані (значення для прапорів біти 0-7)&lt;br /&gt;
! 08 Дані (значення для прапорів біти 8-15)&lt;br /&gt;
! 09 CRC мл. байт&lt;br /&gt;
! 0A CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Master → Slave &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x02 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCD &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x72 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCB &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 05 CRC мл. байт&lt;br /&gt;
! 06 CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Slave → Master &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x24 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x09 &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Контроль помилок у протоколі Modbus RTU ==&lt;br /&gt;
&lt;br /&gt;
Під час обміну даними можуть виникати помилки двох типів:&lt;br /&gt;
* Помилки, пов'язані з спотвореннями при передачі даних;&lt;br /&gt;
* Логічні помилки.&lt;br /&gt;
&lt;br /&gt;
Помилки першого типу виявляються за допомогою фреймів символів, контролю парності і циклічної контрольної суми [[CRC]]-16-IBM (використовується число-[[поліном]] = 0xA001). При цьому молодший байт передається першим, на відміну від байтів адреси і значення регістра в PDU&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RTU фрейм ===&lt;br /&gt;
&lt;br /&gt;
У RTU режимі повідомлення має починатися і закінчуватися інтервалом тиші - часом передачі не менше 3.5 символів при даній швидкості в мережі. Першим полем потім передається адреса пристрою.&lt;br /&gt;
&lt;br /&gt;
Слідом за останнім переданим символом також слід інтервал тиші тривалістю не менше 3.5 символів. Нове повідомлення може починатися після цього інтервалу.&lt;br /&gt;
&lt;br /&gt;
Фрейм повідомлення передається безперервно. Якщо інтервал тиші тривалістю 1.5 виник під час передачі фрейму, приймаючий пристрій повинен ігнорувати цей фрейм як неповний.&lt;br /&gt;
&lt;br /&gt;
Таким чином, нове повідомлення повинно починатися не раніше 3.5 інтервалу, так як в цьому випадку встановлюється помилка.&lt;br /&gt;
&lt;br /&gt;
Трохи про інтервали (мова йде про Serial Modbus RTU):&lt;br /&gt;
при швидкості 9600 і 11 бітах в кадрі (стартовий біт + 8 біт даних + біт контролю парності + стоп-біт):&lt;br /&gt;
3.5 * 11 / 9600 = 0,00401041 (6), тобто більше 4 мс;&lt;br /&gt;
1.5 * 11 / 9600 = 0,00171875, тобто більше 1 мс.&lt;br /&gt;
Для швидкостей більше 19200 бод допускається використовувати інтервали 1,75 і 0,75 мс відповідно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Логічні помилки ===&lt;br /&gt;
Для повідомлень про помилки другого типу протокол Modbus RTU передбачає, що пристрої можуть відсилати відповіді, що свідчать про помилкову ситуації.&lt;br /&gt;
Ознакою того, що відповідь містить повідомлення про помилку, є встановлений старший біт коду команди.&lt;br /&gt;
Приклад кадру при виявленні помилки веденим пристроєм, у відповідь на запит наведено в (Таблиця 2-1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Якщо Slave приймає коректний запит і може його нормально обробити, то повертає стандартний відповідь.&lt;br /&gt;
&lt;br /&gt;
2. Якщо Slave не приймає будь-якого значення, ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
3. Якщо Slave приймає запит, але виявляє помилку (parity, LRC, or CRC), ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
4. Якщо Slave приймає запит, але не може його обробити (звернення до неіснуючого регістру і т. д.), відправляється відповідь містить у собі дані про помилку.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Кадр відповіді (Slave → Master) при виникненні помилки modbus RTU'''&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! Адресу підлеглого пристрою&lt;br /&gt;
! Номер функції&lt;br /&gt;
! Дані (або код помилки)&lt;br /&gt;
! CRC&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Запит (Master → Slave) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x77 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xDD &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xC7 0xA9&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Відповідь (Slave → Master) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xF7 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xEE &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xE6 0x7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Стандартні коди помилок ====&lt;br /&gt;
* 01 - Прийнятий код функції не може бути опрацьований на підпорядкованому.&lt;br /&gt;
* 02 - Адреса даних, вказаний у запиті, не доступний даному підлеглому.&lt;br /&gt;
* 03 - Величина, що міститься в полі даних запиту, є неприпустимою величиною для підлеглого.&lt;br /&gt;
* 04 - невідновлювальних помилка мала місце, поки підлеглий намагався виконати затребованное дію.&lt;br /&gt;
* 05 - Підлеглий прийняв запит і обробляє його, але це вимагає багато часу. Ця відповідь оберігає головного від генерації помилки тайм-ауту.&lt;br /&gt;
* 06 - Підлеглий зайнятий обробкою команди. Головний повинен повторити повідомлення пізніше, коли підлеглий звільниться.&lt;br /&gt;
* 07 - Підлеглий не може виконати програмну функцію, прийняту в запиті. Цей код повертається для невдалого програмного запиту, що використовує функції з номерами 13 або 14. Головний повинен запросити діагностичну інформацію або інформацію про помилки з підлеглого.&lt;br /&gt;
* 08 - Підлеглий намагається читати розширену пам'ять, але виявив помилку паритету. Головний може повторити запит, але звичайно в таких випадках потрібний ремонт.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Зовнішні посилання ==&lt;br /&gt;
Посилання у різних вільних енциклопедій(wikipedia):&lt;br /&gt;
* англійська[http://en.wikipedia.org/wiki/Modbus]&lt;br /&gt;
* російська[http://ru.wikipedia.org/wiki/Modbus]&lt;br /&gt;
* українська[http://uk.wikipedia.org/wiki/Modbus]&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14534</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14534"/>
				<updated>2012-04-16T13:21:09Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: /* Історія */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції:&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані:&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адреса відомого пристрою  . &lt;br /&gt;
! код функції   .&lt;br /&gt;
! дані   .&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адреса відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції  .&lt;br /&gt;
! ід протоколу  .&lt;br /&gt;
! довжина пакету  .&lt;br /&gt;
! адресу відомого пристрою  .&lt;br /&gt;
! код функції  .&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Елементи|| Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандартні функції протоколу Modbus ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright thumb&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
|+ '''PDU запиту і відповіді для стандартних функцій'''&lt;br /&gt;
! номер &amp;lt;br /&amp;gt; функції&lt;br /&gt;
! colspan = &amp;quot;6&amp;quot; | запит / відповідь&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 1 (0x01)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 2 (0x02)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 3 (0x03)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 4 (0x04)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 5 (0x05)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 6 (0x06)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 15 (0x0F)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 16 (0x10)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
*'''A &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''A &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - адреса елемента,&lt;br /&gt;
*'''Q &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''Q &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - кількість елементів,&lt;br /&gt;
*'''N''' - кількість байт даних&lt;br /&gt;
*'''D''' - дані&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Читання даних ===&lt;br /&gt;
&lt;br /&gt;
Для читання значень з перерахованих вище таблиць даних використовуються функції з кодами 1-4 шістнадцяткові значення 0x01-0x04):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''1 (0x01)'''- читання значень з декількох регістрів прапорів''(Read Coil Status)''&lt;br /&gt;
*'''2 (0x02)'''- читання значень з декількох дискретних входів''(Read Discrete Inputs)''&lt;br /&gt;
*'''3 (0x03)'''- читання значень з декількох регістрів зберігання''(Read Holding Registers)''&lt;br /&gt;
*'''4 (0x04)'''- читання значень з декількох регістрів введення''(Read Input Registers)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запит складається із адреси першого елемента таблиці, яку потрібно прочитати, і кількості зчитувальних елементів. Адреса та кількість даних задаються 16-бітними числами, старший байт кожного з них передається першим.&lt;br /&gt;
&lt;br /&gt;
У відповіді передаються запитані дані. Кількість байт даних залежить від кількості замовлених елементів. Перед даними передається один байт, значення якого дорівнює кількості байт даних.&lt;br /&gt;
&lt;br /&gt;
Значення регістрів зберігання і регістрів введення передаються починаючи із зазначеної адреси, по два байти на регістр, старший байт кожного регістру передається першим:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! байт 1 || байт 2 || байт 3 || байт 4 || ... || байт N-1 || байт N&lt;br /&gt;
|-&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A +1,1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A +1,0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A + Q-1, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A + Q-1, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Значення прапорів і дискретних входів передаються в упакованому вигляді: по одному біту на прапор.&lt;br /&gt;
Одиниця означає включений стан, нуль - вимкнений.&lt;br /&gt;
Значення запитаних прапорів заповнюють спочатку перший байт, починаючи з молодшого біта, потім наступні байти, також від молодшого біта до старших.&lt;br /&gt;
Молодший біт першого байта даних містить значення прапора, зазначеного в полі «адресу».&lt;br /&gt;
Якщо запитано кількість прапорів, не кратне восьми, то значення додаткового біта заповнюються нулями:.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! colspan = &amp;quot;8&amp;quot; | байт 1&lt;br /&gt;
! ...&lt;br /&gt;
! colspan = &amp;quot;7&amp;quot; | байт N&lt;br /&gt;
|-&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +7&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +6&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +5&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +4&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +3&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис одного значення ===&lt;br /&gt;
&lt;br /&gt;
*'''5 (0x05)'''- запис значення одного прапора''(Force Single Coil)''&lt;br /&gt;
*'''6 (0x06)'''- запис значення в один регістр зберігання''(Preset Single Register)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента (2 байти) і встановлюваного значення (2 байти).&lt;br /&gt;
&lt;br /&gt;
Для регістру зберігання значення є просто 16-бітним словом.&lt;br /&gt;
&lt;br /&gt;
Для прапорів значення 0xFF00 означає включений стан, 0x0000 - вимкнений, інші значення неприпустимі.&lt;br /&gt;
&lt;br /&gt;
Якщо команда виконана успішно, ведене пристрій повертає копію запиту.&lt;br /&gt;
&lt;br /&gt;
=== Запис декількох значень ===&lt;br /&gt;
&lt;br /&gt;
*'''15 (0x0F)'''- запис значень в кілька регістрів прапорів''(Force Multiple Coils)''&lt;br /&gt;
*'''16 (0x10)'''- запис значень в кілька регістрів зберігання''(Preset Multiple Registers)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента, кількості змінюваних елементів, кількості переданих байт встановлюваних значень і самих встановлюваних значень. Дані упаковуються так само, як в командах читання даних.&lt;br /&gt;
&lt;br /&gt;
Відповідь складається з початкової адреси і кількості змінених елементів.&lt;br /&gt;
&lt;br /&gt;
Нижче наведено приклад команди ведучого пристрою і відповіді веденого (для Modbus RTU).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 06 Кількість байт даних&lt;br /&gt;
! 07 Дані (значення для прапорів біти 0-7)&lt;br /&gt;
! 08 Дані (значення для прапорів біти 8-15)&lt;br /&gt;
! 09 CRC мл. байт&lt;br /&gt;
! 0A CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Master → Slave &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x02 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCD &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x72 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCB &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 05 CRC мл. байт&lt;br /&gt;
! 06 CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Slave → Master &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x24 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x09 &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Контроль помилок у протоколі Modbus RTU ==&lt;br /&gt;
&lt;br /&gt;
Під час обміну даними можуть виникати помилки двох типів:&lt;br /&gt;
* Помилки, пов'язані з спотвореннями при передачі даних;&lt;br /&gt;
* Логічні помилки.&lt;br /&gt;
&lt;br /&gt;
Помилки першого типу виявляються за допомогою фреймів символів, контролю парності і циклічної контрольної суми [[CRC]]-16-IBM (використовується число-[[поліном]] = 0xA001). При цьому молодший байт передається першим, на відміну від байтів адреси і значення регістра в PDU&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RTU фрейм ===&lt;br /&gt;
&lt;br /&gt;
У RTU режимі повідомлення має починатися і закінчуватися інтервалом тиші - часом передачі не менше 3.5 символів при даній швидкості в мережі. Першим полем потім передається адреса пристрою.&lt;br /&gt;
&lt;br /&gt;
Слідом за останнім переданим символом також слід інтервал тиші тривалістю не менше 3.5 символів. Нове повідомлення може починатися після цього інтервалу.&lt;br /&gt;
&lt;br /&gt;
Фрейм повідомлення передається безперервно. Якщо інтервал тиші тривалістю 1.5 виник під час передачі фрейму, приймаючий пристрій повинен ігнорувати цей фрейм як неповний.&lt;br /&gt;
&lt;br /&gt;
Таким чином, нове повідомлення повинно починатися не раніше 3.5 інтервалу, так як в цьому випадку встановлюється помилка.&lt;br /&gt;
&lt;br /&gt;
Трохи про інтервали (мова йде про Serial Modbus RTU):&lt;br /&gt;
при швидкості 9600 і 11 бітах в кадрі (стартовий біт + 8 біт даних + біт контролю парності + стоп-біт):&lt;br /&gt;
3.5 * 11 / 9600 = 0,00401041 (6), тобто більше 4 мс;&lt;br /&gt;
1.5 * 11 / 9600 = 0,00171875, тобто більше 1 мс.&lt;br /&gt;
Для швидкостей більше 19200 бод допускається використовувати інтервали 1,75 і 0,75 мс відповідно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Логічні помилки ===&lt;br /&gt;
Для повідомлень про помилки другого типу протокол Modbus RTU передбачає, що пристрої можуть відсилати відповіді, що свідчать про помилкову ситуації.&lt;br /&gt;
Ознакою того, що відповідь містить повідомлення про помилку, є встановлений старший біт коду команди.&lt;br /&gt;
Приклад кадру при виявленні помилки веденим пристроєм, у відповідь на запит наведено в (Таблиця 2-1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Якщо Slave приймає коректний запит і може його нормально обробити, то повертає стандартний відповідь.&lt;br /&gt;
&lt;br /&gt;
2. Якщо Slave не приймає будь-якого значення, ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
3. Якщо Slave приймає запит, але виявляє помилку (parity, LRC, or CRC), ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
4. Якщо Slave приймає запит, але не може його обробити (звернення до неіснуючого регістру і т. д.), відправляється відповідь містить у собі дані про помилку.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Кадр відповіді (Slave → Master) при виникненні помилки modbus RTU'''&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! Адресу підлеглого пристрою&lt;br /&gt;
! Номер функції&lt;br /&gt;
! Дані (або код помилки)&lt;br /&gt;
! CRC&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Запит (Master → Slave) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x77 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xDD &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xC7 0xA9&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Відповідь (Slave → Master) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xF7 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xEE &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xE6 0x7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Стандартні коди помилок ====&lt;br /&gt;
* 01 - Прийнятий код функції не може бути опрацьований на підпорядкованому.&lt;br /&gt;
* 02 - Адреса даних, вказаний у запиті, не доступний даному підлеглому.&lt;br /&gt;
* 03 - Величина, що міститься в полі даних запиту, є неприпустимою величиною для підлеглого.&lt;br /&gt;
* 04 - невідновлювальних помилка мала місце, поки підлеглий намагався виконати затребованное дію.&lt;br /&gt;
* 05 - Підлеглий прийняв запит і обробляє його, але це вимагає багато часу. Ця відповідь оберігає головного від генерації помилки тайм-ауту.&lt;br /&gt;
* 06 - Підлеглий зайнятий обробкою команди. Головний повинен повторити повідомлення пізніше, коли підлеглий звільниться.&lt;br /&gt;
* 07 - Підлеглий не може виконати програмну функцію, прийняту в запиті. Цей код повертається для невдалого програмного запиту, що використовує функції з номерами 13 або 14. Головний повинен запросити діагностичну інформацію або інформацію про помилки з підлеглого.&lt;br /&gt;
* 08 - Підлеглий намагається читати розширену пам'ять, але виявив помилку паритету. Головний може повторити запит, але звичайно в таких випадках потрібний ремонт.&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14533</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14533"/>
				<updated>2012-04-16T13:20:19Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: /* Історія */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році.&lt;br /&gt;
&amp;lt;ref name=&amp;quot;tutorial&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[http://www.lammertbies.nl/comm/info/modbus.html Modbus interface tutorial ]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції:&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані:&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адреса відомого пристрою  . &lt;br /&gt;
! код функції   .&lt;br /&gt;
! дані   .&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адреса відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції  .&lt;br /&gt;
! ід протоколу  .&lt;br /&gt;
! довжина пакету  .&lt;br /&gt;
! адресу відомого пристрою  .&lt;br /&gt;
! код функції  .&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Елементи|| Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандартні функції протоколу Modbus ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright thumb&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
|+ '''PDU запиту і відповіді для стандартних функцій'''&lt;br /&gt;
! номер &amp;lt;br /&amp;gt; функції&lt;br /&gt;
! colspan = &amp;quot;6&amp;quot; | запит / відповідь&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 1 (0x01)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 2 (0x02)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 3 (0x03)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 4 (0x04)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 5 (0x05)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 6 (0x06)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 15 (0x0F)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 16 (0x10)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
*'''A &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''A &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - адреса елемента,&lt;br /&gt;
*'''Q &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''Q &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - кількість елементів,&lt;br /&gt;
*'''N''' - кількість байт даних&lt;br /&gt;
*'''D''' - дані&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Читання даних ===&lt;br /&gt;
&lt;br /&gt;
Для читання значень з перерахованих вище таблиць даних використовуються функції з кодами 1-4 шістнадцяткові значення 0x01-0x04):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''1 (0x01)'''- читання значень з декількох регістрів прапорів''(Read Coil Status)''&lt;br /&gt;
*'''2 (0x02)'''- читання значень з декількох дискретних входів''(Read Discrete Inputs)''&lt;br /&gt;
*'''3 (0x03)'''- читання значень з декількох регістрів зберігання''(Read Holding Registers)''&lt;br /&gt;
*'''4 (0x04)'''- читання значень з декількох регістрів введення''(Read Input Registers)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запит складається із адреси першого елемента таблиці, яку потрібно прочитати, і кількості зчитувальних елементів. Адреса та кількість даних задаються 16-бітними числами, старший байт кожного з них передається першим.&lt;br /&gt;
&lt;br /&gt;
У відповіді передаються запитані дані. Кількість байт даних залежить від кількості замовлених елементів. Перед даними передається один байт, значення якого дорівнює кількості байт даних.&lt;br /&gt;
&lt;br /&gt;
Значення регістрів зберігання і регістрів введення передаються починаючи із зазначеної адреси, по два байти на регістр, старший байт кожного регістру передається першим:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! байт 1 || байт 2 || байт 3 || байт 4 || ... || байт N-1 || байт N&lt;br /&gt;
|-&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A +1,1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A +1,0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A + Q-1, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A + Q-1, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Значення прапорів і дискретних входів передаються в упакованому вигляді: по одному біту на прапор.&lt;br /&gt;
Одиниця означає включений стан, нуль - вимкнений.&lt;br /&gt;
Значення запитаних прапорів заповнюють спочатку перший байт, починаючи з молодшого біта, потім наступні байти, також від молодшого біта до старших.&lt;br /&gt;
Молодший біт першого байта даних містить значення прапора, зазначеного в полі «адресу».&lt;br /&gt;
Якщо запитано кількість прапорів, не кратне восьми, то значення додаткового біта заповнюються нулями:.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! colspan = &amp;quot;8&amp;quot; | байт 1&lt;br /&gt;
! ...&lt;br /&gt;
! colspan = &amp;quot;7&amp;quot; | байт N&lt;br /&gt;
|-&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +7&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +6&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +5&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +4&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +3&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис одного значення ===&lt;br /&gt;
&lt;br /&gt;
*'''5 (0x05)'''- запис значення одного прапора''(Force Single Coil)''&lt;br /&gt;
*'''6 (0x06)'''- запис значення в один регістр зберігання''(Preset Single Register)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента (2 байти) і встановлюваного значення (2 байти).&lt;br /&gt;
&lt;br /&gt;
Для регістру зберігання значення є просто 16-бітним словом.&lt;br /&gt;
&lt;br /&gt;
Для прапорів значення 0xFF00 означає включений стан, 0x0000 - вимкнений, інші значення неприпустимі.&lt;br /&gt;
&lt;br /&gt;
Якщо команда виконана успішно, ведене пристрій повертає копію запиту.&lt;br /&gt;
&lt;br /&gt;
=== Запис декількох значень ===&lt;br /&gt;
&lt;br /&gt;
*'''15 (0x0F)'''- запис значень в кілька регістрів прапорів''(Force Multiple Coils)''&lt;br /&gt;
*'''16 (0x10)'''- запис значень в кілька регістрів зберігання''(Preset Multiple Registers)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента, кількості змінюваних елементів, кількості переданих байт встановлюваних значень і самих встановлюваних значень. Дані упаковуються так само, як в командах читання даних.&lt;br /&gt;
&lt;br /&gt;
Відповідь складається з початкової адреси і кількості змінених елементів.&lt;br /&gt;
&lt;br /&gt;
Нижче наведено приклад команди ведучого пристрою і відповіді веденого (для Modbus RTU).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 06 Кількість байт даних&lt;br /&gt;
! 07 Дані (значення для прапорів біти 0-7)&lt;br /&gt;
! 08 Дані (значення для прапорів біти 8-15)&lt;br /&gt;
! 09 CRC мл. байт&lt;br /&gt;
! 0A CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Master → Slave &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x02 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCD &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x72 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCB &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 05 CRC мл. байт&lt;br /&gt;
! 06 CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Slave → Master &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x24 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x09 &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Контроль помилок у протоколі Modbus RTU ==&lt;br /&gt;
&lt;br /&gt;
Під час обміну даними можуть виникати помилки двох типів:&lt;br /&gt;
* Помилки, пов'язані з спотвореннями при передачі даних;&lt;br /&gt;
* Логічні помилки.&lt;br /&gt;
&lt;br /&gt;
Помилки першого типу виявляються за допомогою фреймів символів, контролю парності і циклічної контрольної суми [[CRC]]-16-IBM (використовується число-[[поліном]] = 0xA001). При цьому молодший байт передається першим, на відміну від байтів адреси і значення регістра в PDU&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RTU фрейм ===&lt;br /&gt;
&lt;br /&gt;
У RTU режимі повідомлення має починатися і закінчуватися інтервалом тиші - часом передачі не менше 3.5 символів при даній швидкості в мережі. Першим полем потім передається адреса пристрою.&lt;br /&gt;
&lt;br /&gt;
Слідом за останнім переданим символом також слід інтервал тиші тривалістю не менше 3.5 символів. Нове повідомлення може починатися після цього інтервалу.&lt;br /&gt;
&lt;br /&gt;
Фрейм повідомлення передається безперервно. Якщо інтервал тиші тривалістю 1.5 виник під час передачі фрейму, приймаючий пристрій повинен ігнорувати цей фрейм як неповний.&lt;br /&gt;
&lt;br /&gt;
Таким чином, нове повідомлення повинно починатися не раніше 3.5 інтервалу, так як в цьому випадку встановлюється помилка.&lt;br /&gt;
&lt;br /&gt;
Трохи про інтервали (мова йде про Serial Modbus RTU):&lt;br /&gt;
при швидкості 9600 і 11 бітах в кадрі (стартовий біт + 8 біт даних + біт контролю парності + стоп-біт):&lt;br /&gt;
3.5 * 11 / 9600 = 0,00401041 (6), тобто більше 4 мс;&lt;br /&gt;
1.5 * 11 / 9600 = 0,00171875, тобто більше 1 мс.&lt;br /&gt;
Для швидкостей більше 19200 бод допускається використовувати інтервали 1,75 і 0,75 мс відповідно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Логічні помилки ===&lt;br /&gt;
Для повідомлень про помилки другого типу протокол Modbus RTU передбачає, що пристрої можуть відсилати відповіді, що свідчать про помилкову ситуації.&lt;br /&gt;
Ознакою того, що відповідь містить повідомлення про помилку, є встановлений старший біт коду команди.&lt;br /&gt;
Приклад кадру при виявленні помилки веденим пристроєм, у відповідь на запит наведено в (Таблиця 2-1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Якщо Slave приймає коректний запит і може його нормально обробити, то повертає стандартний відповідь.&lt;br /&gt;
&lt;br /&gt;
2. Якщо Slave не приймає будь-якого значення, ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
3. Якщо Slave приймає запит, але виявляє помилку (parity, LRC, or CRC), ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
4. Якщо Slave приймає запит, але не може його обробити (звернення до неіснуючого регістру і т. д.), відправляється відповідь містить у собі дані про помилку.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Кадр відповіді (Slave → Master) при виникненні помилки modbus RTU'''&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! Адресу підлеглого пристрою&lt;br /&gt;
! Номер функції&lt;br /&gt;
! Дані (або код помилки)&lt;br /&gt;
! CRC&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Запит (Master → Slave) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x77 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xDD &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xC7 0xA9&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Відповідь (Slave → Master) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xF7 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xEE &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xE6 0x7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Стандартні коди помилок ====&lt;br /&gt;
* 01 - Прийнятий код функції не може бути опрацьований на підпорядкованому.&lt;br /&gt;
* 02 - Адреса даних, вказаний у запиті, не доступний даному підлеглому.&lt;br /&gt;
* 03 - Величина, що міститься в полі даних запиту, є неприпустимою величиною для підлеглого.&lt;br /&gt;
* 04 - невідновлювальних помилка мала місце, поки підлеглий намагався виконати затребованное дію.&lt;br /&gt;
* 05 - Підлеглий прийняв запит і обробляє його, але це вимагає багато часу. Ця відповідь оберігає головного від генерації помилки тайм-ауту.&lt;br /&gt;
* 06 - Підлеглий зайнятий обробкою команди. Головний повинен повторити повідомлення пізніше, коли підлеглий звільниться.&lt;br /&gt;
* 07 - Підлеглий не може виконати програмну функцію, прийняту в запиті. Цей код повертається для невдалого програмного запиту, що використовує функції з номерами 13 або 14. Головний повинен запросити діагностичну інформацію або інформацію про помилки з підлеглого.&lt;br /&gt;
* 08 - Підлеглий намагається читати розширену пам'ять, але виявив помилку паритету. Головний може повторити запит, але звичайно в таких випадках потрібний ремонт.&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14532</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14532"/>
				<updated>2012-04-16T13:11:26Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції:&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані:&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адреса відомого пристрою  . &lt;br /&gt;
! код функції   .&lt;br /&gt;
! дані   .&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адреса відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції  .&lt;br /&gt;
! ід протоколу  .&lt;br /&gt;
! довжина пакету  .&lt;br /&gt;
! адресу відомого пристрою  .&lt;br /&gt;
! код функції  .&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Елементи|| Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандартні функції протоколу Modbus ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright thumb&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
|+ '''PDU запиту і відповіді для стандартних функцій'''&lt;br /&gt;
! номер &amp;lt;br /&amp;gt; функції&lt;br /&gt;
! colspan = &amp;quot;6&amp;quot; | запит / відповідь&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 1 (0x01)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 2 (0x02)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 3 (0x03)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 4 (0x04)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 5 (0x05)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 6 (0x06)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 15 (0x0F)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 16 (0x10)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
*'''A &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''A &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - адреса елемента,&lt;br /&gt;
*'''Q &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''Q &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - кількість елементів,&lt;br /&gt;
*'''N''' - кількість байт даних&lt;br /&gt;
*'''D''' - дані&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Читання даних ===&lt;br /&gt;
&lt;br /&gt;
Для читання значень з перерахованих вище таблиць даних використовуються функції з кодами 1-4 шістнадцяткові значення 0x01-0x04):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''1 (0x01)'''- читання значень з декількох регістрів прапорів''(Read Coil Status)''&lt;br /&gt;
*'''2 (0x02)'''- читання значень з декількох дискретних входів''(Read Discrete Inputs)''&lt;br /&gt;
*'''3 (0x03)'''- читання значень з декількох регістрів зберігання''(Read Holding Registers)''&lt;br /&gt;
*'''4 (0x04)'''- читання значень з декількох регістрів введення''(Read Input Registers)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запит складається із адреси першого елемента таблиці, яку потрібно прочитати, і кількості зчитувальних елементів. Адреса та кількість даних задаються 16-бітними числами, старший байт кожного з них передається першим.&lt;br /&gt;
&lt;br /&gt;
У відповіді передаються запитані дані. Кількість байт даних залежить від кількості замовлених елементів. Перед даними передається один байт, значення якого дорівнює кількості байт даних.&lt;br /&gt;
&lt;br /&gt;
Значення регістрів зберігання і регістрів введення передаються починаючи із зазначеної адреси, по два байти на регістр, старший байт кожного регістру передається першим:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! байт 1 || байт 2 || байт 3 || байт 4 || ... || байт N-1 || байт N&lt;br /&gt;
|-&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A +1,1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A +1,0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A + Q-1, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A + Q-1, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Значення прапорів і дискретних входів передаються в упакованому вигляді: по одному біту на прапор.&lt;br /&gt;
Одиниця означає включений стан, нуль - вимкнений.&lt;br /&gt;
Значення запитаних прапорів заповнюють спочатку перший байт, починаючи з молодшого біта, потім наступні байти, також від молодшого біта до старших.&lt;br /&gt;
Молодший біт першого байта даних містить значення прапора, зазначеного в полі «адресу».&lt;br /&gt;
Якщо запитано кількість прапорів, не кратне восьми, то значення додаткового біта заповнюються нулями:.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! colspan = &amp;quot;8&amp;quot; | байт 1&lt;br /&gt;
! ...&lt;br /&gt;
! colspan = &amp;quot;7&amp;quot; | байт N&lt;br /&gt;
|-&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +7&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +6&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +5&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +4&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +3&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис одного значення ===&lt;br /&gt;
&lt;br /&gt;
*'''5 (0x05)'''- запис значення одного прапора''(Force Single Coil)''&lt;br /&gt;
*'''6 (0x06)'''- запис значення в один регістр зберігання''(Preset Single Register)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента (2 байти) і встановлюваного значення (2 байти).&lt;br /&gt;
&lt;br /&gt;
Для регістру зберігання значення є просто 16-бітним словом.&lt;br /&gt;
&lt;br /&gt;
Для прапорів значення 0xFF00 означає включений стан, 0x0000 - вимкнений, інші значення неприпустимі.&lt;br /&gt;
&lt;br /&gt;
Якщо команда виконана успішно, ведене пристрій повертає копію запиту.&lt;br /&gt;
&lt;br /&gt;
=== Запис декількох значень ===&lt;br /&gt;
&lt;br /&gt;
*'''15 (0x0F)'''- запис значень в кілька регістрів прапорів''(Force Multiple Coils)''&lt;br /&gt;
*'''16 (0x10)'''- запис значень в кілька регістрів зберігання''(Preset Multiple Registers)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента, кількості змінюваних елементів, кількості переданих байт встановлюваних значень і самих встановлюваних значень. Дані упаковуються так само, як в командах читання даних.&lt;br /&gt;
&lt;br /&gt;
Відповідь складається з початкової адреси і кількості змінених елементів.&lt;br /&gt;
&lt;br /&gt;
Нижче наведено приклад команди ведучого пристрою і відповіді веденого (для Modbus RTU).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 06 Кількість байт даних&lt;br /&gt;
! 07 Дані (значення для прапорів біти 0-7)&lt;br /&gt;
! 08 Дані (значення для прапорів біти 8-15)&lt;br /&gt;
! 09 CRC мл. байт&lt;br /&gt;
! 0A CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Master → Slave &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x02 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCD &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x72 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCB &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 05 CRC мл. байт&lt;br /&gt;
! 06 CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Slave → Master &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x24 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x09 &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Контроль помилок у протоколі Modbus RTU ==&lt;br /&gt;
&lt;br /&gt;
Під час обміну даними можуть виникати помилки двох типів:&lt;br /&gt;
* Помилки, пов'язані з спотвореннями при передачі даних;&lt;br /&gt;
* Логічні помилки.&lt;br /&gt;
&lt;br /&gt;
Помилки першого типу виявляються за допомогою фреймів символів, контролю парності і циклічної контрольної суми [[CRC]]-16-IBM (використовується число-[[поліном]] = 0xA001). При цьому молодший байт передається першим, на відміну від байтів адреси і значення регістра в PDU&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RTU фрейм ===&lt;br /&gt;
&lt;br /&gt;
У RTU режимі повідомлення має починатися і закінчуватися інтервалом тиші - часом передачі не менше 3.5 символів при даній швидкості в мережі. Першим полем потім передається адреса пристрою.&lt;br /&gt;
&lt;br /&gt;
Слідом за останнім переданим символом також слід інтервал тиші тривалістю не менше 3.5 символів. Нове повідомлення може починатися після цього інтервалу.&lt;br /&gt;
&lt;br /&gt;
Фрейм повідомлення передається безперервно. Якщо інтервал тиші тривалістю 1.5 виник під час передачі фрейму, приймаючий пристрій повинен ігнорувати цей фрейм як неповний.&lt;br /&gt;
&lt;br /&gt;
Таким чином, нове повідомлення повинно починатися не раніше 3.5 інтервалу, так як в цьому випадку встановлюється помилка.&lt;br /&gt;
&lt;br /&gt;
Трохи про інтервали (мова йде про Serial Modbus RTU):&lt;br /&gt;
при швидкості 9600 і 11 бітах в кадрі (стартовий біт + 8 біт даних + біт контролю парності + стоп-біт):&lt;br /&gt;
3.5 * 11 / 9600 = 0,00401041 (6), тобто більше 4 мс;&lt;br /&gt;
1.5 * 11 / 9600 = 0,00171875, тобто більше 1 мс.&lt;br /&gt;
Для швидкостей більше 19200 бод допускається використовувати інтервали 1,75 і 0,75 мс відповідно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Логічні помилки ===&lt;br /&gt;
Для повідомлень про помилки другого типу протокол Modbus RTU передбачає, що пристрої можуть відсилати відповіді, що свідчать про помилкову ситуації.&lt;br /&gt;
Ознакою того, що відповідь містить повідомлення про помилку, є встановлений старший біт коду команди.&lt;br /&gt;
Приклад кадру при виявленні помилки веденим пристроєм, у відповідь на запит наведено в (Таблиця 2-1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Якщо Slave приймає коректний запит і може його нормально обробити, то повертає стандартний відповідь.&lt;br /&gt;
&lt;br /&gt;
2. Якщо Slave не приймає будь-якого значення, ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
3. Якщо Slave приймає запит, але виявляє помилку (parity, LRC, or CRC), ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
4. Якщо Slave приймає запит, але не може його обробити (звернення до неіснуючого регістру і т. д.), відправляється відповідь містить у собі дані про помилку.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Кадр відповіді (Slave → Master) при виникненні помилки modbus RTU'''&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! Адресу підлеглого пристрою&lt;br /&gt;
! Номер функції&lt;br /&gt;
! Дані (або код помилки)&lt;br /&gt;
! CRC&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Запит (Master → Slave) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x77 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xDD &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xC7 0xA9&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Відповідь (Slave → Master) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xF7 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xEE &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xE6 0x7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Стандартні коди помилок ====&lt;br /&gt;
* 01 - Прийнятий код функції не може бути опрацьований на підпорядкованому.&lt;br /&gt;
* 02 - Адреса даних, вказаний у запиті, не доступний даному підлеглому.&lt;br /&gt;
* 03 - Величина, що міститься в полі даних запиту, є неприпустимою величиною для підлеглого.&lt;br /&gt;
* 04 - невідновлювальних помилка мала місце, поки підлеглий намагався виконати затребованное дію.&lt;br /&gt;
* 05 - Підлеглий прийняв запит і обробляє його, але це вимагає багато часу. Ця відповідь оберігає головного від генерації помилки тайм-ауту.&lt;br /&gt;
* 06 - Підлеглий зайнятий обробкою команди. Головний повинен повторити повідомлення пізніше, коли підлеглий звільниться.&lt;br /&gt;
* 07 - Підлеглий не може виконати програмну функцію, прийняту в запиті. Цей код повертається для невдалого програмного запиту, що використовує функції з номерами 13 або 14. Головний повинен запросити діагностичну інформацію або інформацію про помилки з підлеглого.&lt;br /&gt;
* 08 - Підлеглий намагається читати розширену пам'ять, але виявив помилку паритету. Головний може повторити запит, але звичайно в таких випадках потрібний ремонт.&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14531</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14531"/>
				<updated>2012-04-16T13:08:39Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції:&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані:&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адреса відомого пристрою  . &lt;br /&gt;
! код функції   .&lt;br /&gt;
! дані   .&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адреса відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції  .&lt;br /&gt;
! ід протоколу  .&lt;br /&gt;
! довжина пакету  .&lt;br /&gt;
! адресу відомого пристрою  .&lt;br /&gt;
! код функції  .&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Таблиця || Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандартні функції протоколу Modbus ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright thumb&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
|+ '''PDU запиту і відповіді для стандартних функцій'''&lt;br /&gt;
! номер &amp;lt;br /&amp;gt; функції&lt;br /&gt;
! colspan = &amp;quot;6&amp;quot; | запит / відповідь&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 1 (0x01)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 2 (0x02)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 3 (0x03)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 4 (0x04)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 5 (0x05)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 6 (0x06)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 15 (0x0F)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 16 (0x10)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
*'''A &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''A &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - адреса елемента,&lt;br /&gt;
*'''Q &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''Q &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - кількість елементів,&lt;br /&gt;
*'''N''' - кількість байт даних&lt;br /&gt;
*'''D''' - дані&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Читання даних ===&lt;br /&gt;
&lt;br /&gt;
Для читання значень з перерахованих вище таблиць даних використовуються функції з кодами 1-4 шістнадцяткові значення 0x01-0x04):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''1 (0x01)'''- читання значень з декількох регістрів прапорів''(Read Coil Status)''&lt;br /&gt;
*'''2 (0x02)'''- читання значень з декількох дискретних входів''(Read Discrete Inputs)''&lt;br /&gt;
*'''3 (0x03)'''- читання значень з декількох регістрів зберігання''(Read Holding Registers)''&lt;br /&gt;
*'''4 (0x04)'''- читання значень з декількох регістрів введення''(Read Input Registers)''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запит складається із адреси першого елемента таблиці, яку потрібно прочитати, і кількості зчитувальних елементів. Адреса та кількість даних задаються 16-бітними числами, старший байт кожного з них передається першим.&lt;br /&gt;
&lt;br /&gt;
У відповіді передаються запитані дані. Кількість байт даних залежить від кількості замовлених елементів. Перед даними передається один байт, значення якого дорівнює кількості байт даних.&lt;br /&gt;
&lt;br /&gt;
Значення регістрів зберігання і регістрів введення передаються починаючи із зазначеної адреси, по два байти на регістр, старший байт кожного регістру передається першим:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! байт 1 || байт 2 || байт 3 || байт 4 || ... || байт N-1 || байт N&lt;br /&gt;
|-&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A +1,1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A +1,0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A + Q-1, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A + Q-1, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Значення прапорів і дискретних входів передаються в упакованому вигляді: по одному біту на прапор.&lt;br /&gt;
Одиниця означає включений стан, нуль - вимкнений.&lt;br /&gt;
Значення запитаних прапорів заповнюють спочатку перший байт, починаючи з молодшого біта, потім наступні байти, також від молодшого біта до старших.&lt;br /&gt;
Молодший біт першого байта даних містить значення прапора, зазначеного в полі «адресу».&lt;br /&gt;
Якщо запитано кількість прапорів, не кратне восьми, то значення додаткового біта заповнюються нулями:.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! colspan = &amp;quot;8&amp;quot; | байт 1&lt;br /&gt;
! ...&lt;br /&gt;
! colspan = &amp;quot;7&amp;quot; | байт N&lt;br /&gt;
|-&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +7&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +6&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +5&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +4&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +3&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Запис одного значення ===&lt;br /&gt;
&lt;br /&gt;
*'''5 (0x05)'''- запис значення одного прапора''(Force Single Coil)''&lt;br /&gt;
*'''6 (0x06)'''- запис значення в один регістр зберігання''(Preset Single Register)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента (2 байти) і встановлюваного значення (2 байти).&lt;br /&gt;
&lt;br /&gt;
Для регістру зберігання значення є просто 16-бітним словом.&lt;br /&gt;
&lt;br /&gt;
Для прапорів значення 0xFF00 означає включений стан, 0x0000 - вимкнений, інші значення неприпустимі.&lt;br /&gt;
&lt;br /&gt;
Якщо команда виконана успішно, ведене пристрій повертає копію запиту.&lt;br /&gt;
&lt;br /&gt;
=== Запис декількох значень ===&lt;br /&gt;
&lt;br /&gt;
*'''15 (0x0F)'''- запис значень в кілька регістрів прапорів''(Force Multiple Coils)''&lt;br /&gt;
*'''16 (0x10)'''- запис значень в кілька регістрів зберігання''(Preset Multiple Registers)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента, кількості змінюваних елементів, кількості переданих байт встановлюваних значень і самих встановлюваних значень. Дані упаковуються так само, як в командах читання даних.&lt;br /&gt;
&lt;br /&gt;
Відповідь складається з початкової адреси і кількості змінених елементів.&lt;br /&gt;
&lt;br /&gt;
Нижче наведено приклад команди ведучого пристрою і відповіді веденого (для Modbus RTU).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 06 Кількість байт даних&lt;br /&gt;
! 07 Дані (значення для прапорів біти 0-7)&lt;br /&gt;
! 08 Дані (значення для прапорів біти 8-15)&lt;br /&gt;
! 09 CRC мл. байт&lt;br /&gt;
! 0A CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Master → Slave &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x02 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCD &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x72 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCB &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 05 CRC мл. байт&lt;br /&gt;
! 06 CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Slave → Master &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x24 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x09 &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Контроль помилок у протоколі Modbus RTU ==&lt;br /&gt;
&lt;br /&gt;
Під час обміну даними можуть виникати помилки двох типів:&lt;br /&gt;
* Помилки, пов'язані з спотвореннями при передачі даних;&lt;br /&gt;
* Логічні помилки.&lt;br /&gt;
&lt;br /&gt;
Помилки першого типу виявляються за допомогою фреймів символів, контролю парності і циклічної контрольної суми [[CRC]]-16-IBM (використовується число-[[поліном]] = 0xA001). При цьому молодший байт передається першим, на відміну від байтів адреси і значення регістра в PDU&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== RTU фрейм ===&lt;br /&gt;
&lt;br /&gt;
У RTU режимі повідомлення має починатися і закінчуватися інтервалом тиші - часом передачі не менше 3.5 символів при даній швидкості в мережі. Першим полем потім передається адреса пристрою.&lt;br /&gt;
&lt;br /&gt;
Слідом за останнім переданим символом також слід інтервал тиші тривалістю не менше 3.5 символів. Нове повідомлення може починатися після цього інтервалу.&lt;br /&gt;
&lt;br /&gt;
Фрейм повідомлення передається безперервно. Якщо інтервал тиші тривалістю 1.5 виник під час передачі фрейму, приймаючий пристрій повинен ігнорувати цей фрейм як неповний.&lt;br /&gt;
&lt;br /&gt;
Таким чином, нове повідомлення повинно починатися не раніше 3.5 інтервалу, так як в цьому випадку встановлюється помилка.&lt;br /&gt;
&lt;br /&gt;
Трохи про інтервали (мова йде про Serial Modbus RTU):&lt;br /&gt;
при швидкості 9600 і 11 бітах в кадрі (стартовий біт + 8 біт даних + біт контролю парності + стоп-біт):&lt;br /&gt;
3.5 * 11 / 9600 = 0,00401041 (6), тобто більше 4 мс;&lt;br /&gt;
1.5 * 11 / 9600 = 0,00171875, тобто більше 1 мс.&lt;br /&gt;
Для швидкостей більше 19200 бод допускається використовувати інтервали 1,75 і 0,75 мс відповідно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Логічні помилки ===&lt;br /&gt;
Для повідомлень про помилки другого типу протокол Modbus RTU передбачає, що пристрої можуть відсилати відповіді, що свідчать про помилкову ситуації.&lt;br /&gt;
Ознакою того, що відповідь містить повідомлення про помилку, є встановлений старший біт коду команди.&lt;br /&gt;
Приклад кадру при виявленні помилки веденим пристроєм, у відповідь на запит наведено в (Таблиця 2-1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Якщо Slave приймає коректний запит і може його нормально обробити, то повертає стандартний відповідь.&lt;br /&gt;
&lt;br /&gt;
2. Якщо Slave не приймає будь-якого значення, ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
3. Якщо Slave приймає запит, але виявляє помилку (parity, LRC, or CRC), ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
4. Якщо Slave приймає запит, але не може його обробити (звернення до неіснуючого регістру і т. д.), відправляється відповідь містить у собі дані про помилку.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Таблиця Кадр відповіді (Slave → Master) при виникненні помилки modbus RTU'''&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! Адресу підлеглого пристрою&lt;br /&gt;
! Номер функції&lt;br /&gt;
! Дані (або код помилки)&lt;br /&gt;
! CRC&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Запит (Master → Slave) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x77 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xDD &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xC7 0xA9&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Відповідь (Slave → Master) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xF7 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xEE &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xE6 0x7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Стандартні коди помилок ====&lt;br /&gt;
* 01 - Прийнятий код функції не може бути опрацьований на підпорядкованому.&lt;br /&gt;
* 02 - Адреса даних, вказаний у запиті, не доступний даному підлеглому.&lt;br /&gt;
* 03 - Величина, що міститься в полі даних запиту, є неприпустимою величиною для підлеглого.&lt;br /&gt;
* 04 - невідновлювальних помилка мала місце, поки підлеглий намагався виконати затребованное дію.&lt;br /&gt;
* 05 - Підлеглий прийняв запит і обробляє його, але це вимагає багато часу. Ця відповідь оберігає головного від генерації помилки тайм-ауту.&lt;br /&gt;
* 06 - Підлеглий зайнятий обробкою команди. Головний повинен повторити повідомлення пізніше, коли підлеглий звільниться.&lt;br /&gt;
* 07 - Підлеглий не може виконати програмну функцію, прийняту в запиті. Цей код повертається для невдалого програмного запиту, що використовує функції з номерами 13 або 14. Головний повинен запросити діагностичну інформацію або інформацію про помилки з підлеглого.&lt;br /&gt;
* 08 - Підлеглий намагається читати розширену пам'ять, але виявив помилку паритету. Головний може повторити запит, але звичайно в таких випадках потрібний ремонт.&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14530</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14530"/>
				<updated>2012-04-16T13:00:04Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції:&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані:&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адреса відомого пристрою  . &lt;br /&gt;
! код функції   .&lt;br /&gt;
! дані   .&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адреса відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції  .&lt;br /&gt;
! ід протоколу  .&lt;br /&gt;
! довжина пакету  .&lt;br /&gt;
! адресу відомого пристрою  .&lt;br /&gt;
! код функції  .&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Таблиця || Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;br /&gt;
&lt;br /&gt;
== Стандартні функції протоколу Modbus ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright thumb&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
|+ '''PDU запиту і відповіді для стандартних функцій'''&lt;br /&gt;
! номер &amp;lt;br /&amp;gt; функції&lt;br /&gt;
! colspan = &amp;quot;6&amp;quot; | запит / відповідь&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 1 (0x01)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 2 (0x02)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 3 (0x03)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 4 (0x04)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 5 (0x05)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 6 (0x06)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 15 (0x0F)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 16 (0x10)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
*'''A &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''A &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - адреса елемента,&lt;br /&gt;
*'''Q &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''Q &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - кількість елементів,&lt;br /&gt;
*'''N''' - кількість байт даних&lt;br /&gt;
*'''D''' - дані&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Читання даних ===&lt;br /&gt;
&lt;br /&gt;
Для читання значень з перерахованих вище таблиць даних використовуються функції з кодами 1-4 шістнадцяткові значення 0x01-0x04):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''1 (0x01)'''- читання значень з декількох регістрів прапорів''(Read Coil Status)''&lt;br /&gt;
*'''2 (0x02)'''- читання значень з декількох дискретних входів''(Read Discrete Inputs)''&lt;br /&gt;
*'''3 (0x03)'''- читання значень з декількох регістрів зберігання''(Read Holding Registers)''&lt;br /&gt;
*'''4 (0x04)'''- читання значень з декількох регістрів введення''(Read Input Registers)''&lt;br /&gt;
&lt;br /&gt;
Запит складається із адреси першого елемента таблиці, яку потрібно прочитати, і кількості зчитувальних елементів. Адреса та кількість даних задаються 16-бітними числами, старший байт кожного з них передається першим.&lt;br /&gt;
&lt;br /&gt;
У відповіді передаються запитані дані. Кількість байт даних залежить від кількості замовлених елементів. Перед даними передається один байт, значення якого дорівнює кількості байт даних.&lt;br /&gt;
&lt;br /&gt;
Значення регістрів зберігання і регістрів введення передаються починаючи із зазначеної адреси, по два байти на регістр, старший байт кожного регістру передається першим:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! байт 1 || байт 2 || байт 3 || байт 4 || ... || байт N-1 || байт N&lt;br /&gt;
|-&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A +1,1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A +1,0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A + Q-1, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A + Q-1, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Значення прапорів і дискретних входів передаються в упакованому вигляді: по одному біту на прапор.&lt;br /&gt;
Одиниця означає включений стан, нуль - вимкнений.&lt;br /&gt;
Значення запитаних прапорів заповнюють спочатку перший байт, починаючи з молодшого біта, потім наступні байти, також від молодшого біта до старших.&lt;br /&gt;
Молодший біт першого байта даних містить значення прапора, зазначеного в полі «адресу».&lt;br /&gt;
Якщо запитано кількість прапорів, не кратне восьми, то значення додаткового біта заповнюються нулями:.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! colspan = &amp;quot;8&amp;quot; | байт 1&lt;br /&gt;
! ...&lt;br /&gt;
! colspan = &amp;quot;7&amp;quot; | байт N&lt;br /&gt;
|-&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +7&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +6&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +5&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +4&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +3&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Запис одного значення ===&lt;br /&gt;
&lt;br /&gt;
*'''5 (0x05)'''- запис значення одного прапора''(Force Single Coil)''&lt;br /&gt;
*'''6 (0x06)'''- запис значення в один регістр зберігання''(Preset Single Register)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента (2 байти) і встановлюваного значення (2 байти).&lt;br /&gt;
&lt;br /&gt;
Для регістру зберігання значення є просто 16-бітним словом.&lt;br /&gt;
&lt;br /&gt;
Для прапорів значення 0xFF00 означає включений стан, 0x0000 - вимкнений, інші значення неприпустимі.&lt;br /&gt;
&lt;br /&gt;
Якщо команда виконана успішно, ведене пристрій повертає копію запиту.&lt;br /&gt;
&lt;br /&gt;
=== Запис декількох значень ===&lt;br /&gt;
&lt;br /&gt;
*'''15 (0x0F)'''- запис значень в кілька регістрів прапорів''(Force Multiple Coils)''&lt;br /&gt;
*'''16 (0x10)'''- запис значень в кілька регістрів зберігання''(Preset Multiple Registers)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента, кількості змінюваних елементів, кількості переданих байт встановлюваних значень і самих встановлюваних значень. Дані упаковуються так само, як в командах читання даних.&lt;br /&gt;
&lt;br /&gt;
Відповідь складається з початкової адреси і кількості змінених елементів.&lt;br /&gt;
&lt;br /&gt;
Нижче наведено приклад команди ведучого пристрою і відповіді веденого (для Modbus RTU).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 06 Кількість байт даних&lt;br /&gt;
! 07 Дані (значення для прапорів біти 0-7)&lt;br /&gt;
! 08 Дані (значення для прапорів біти 8-15)&lt;br /&gt;
! 09 CRC мл. байт&lt;br /&gt;
! 0A CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Master → Slave &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x02 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCD &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x72 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCB &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 05 CRC мл. байт&lt;br /&gt;
! 06 CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Slave → Master &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x24 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x09 &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Контроль помилок у протоколі Modbus RTU ==&lt;br /&gt;
&lt;br /&gt;
Під час обміну даними можуть виникати помилки двох типів:&lt;br /&gt;
* Помилки, пов'язані з спотвореннями при передачі даних;&lt;br /&gt;
* Логічні помилки.&lt;br /&gt;
&lt;br /&gt;
Помилки першого типу виявляються за допомогою фреймів символів, контролю парності і циклічної контрольної суми [[CRC]]-16-IBM (використовується число-[[поліном]] = 0xA001). При цьому молодший байт передається першим, на відміну від байтів адреси і значення регістра в PDU&lt;br /&gt;
&lt;br /&gt;
=== RTU фрейм ===&lt;br /&gt;
&lt;br /&gt;
У RTU режимі повідомлення має починатися і закінчуватися інтервалом тиші - часом передачі не менше 3.5 символів при даній швидкості в мережі. Першим полем потім передається адреса пристрою.&lt;br /&gt;
&lt;br /&gt;
Слідом за останнім переданим символом також слід інтервал тиші тривалістю не менше 3.5 символів. Нове повідомлення може починатися після цього інтервалу.&lt;br /&gt;
&lt;br /&gt;
Фрейм повідомлення передається безперервно. Якщо інтервал тиші тривалістю 1.5 виник під час передачі фрейму, приймаючий пристрій повинен ігнорувати цей фрейм як неповний.&lt;br /&gt;
&lt;br /&gt;
Таким чином, нове повідомлення повинно починатися не раніше 3.5 інтервалу, так як в цьому випадку встановлюється помилка.&lt;br /&gt;
&lt;br /&gt;
Трохи про інтервали (мова йде про Serial Modbus RTU):&lt;br /&gt;
при швидкості 9600 і 11 бітах в кадрі (стартовий біт + 8 біт даних + біт контролю парності + стоп-біт):&lt;br /&gt;
3.5 * 11 / 9600 = 0,00401041 (6), тобто більше 4 мс;&lt;br /&gt;
1.5 * 11 / 9600 = 0,00171875, тобто більше 1 мс.&lt;br /&gt;
Для швидкостей більше 19200 бод допускається використовувати інтервали 1,75 і 0,75 мс відповідно.&lt;br /&gt;
&lt;br /&gt;
=== Логічні помилки ===&lt;br /&gt;
Для повідомлень про помилки другого типу протокол Modbus RTU передбачає, що пристрої можуть відсилати відповіді, що свідчать про помилкову ситуації.&lt;br /&gt;
Ознакою того, що відповідь містить повідомлення про помилку, є встановлений старший біт коду команди.&lt;br /&gt;
Приклад кадру при виявленні помилки веденим пристроєм, у відповідь на запит наведено в (Таблиця 2-1).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Якщо Slave приймає коректний запит і може його нормально обробити, то повертає стандартний відповідь.&lt;br /&gt;
&lt;br /&gt;
2. Якщо Slave не приймає будь-якого значення, ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
3. Якщо Slave приймає запит, але виявляє помилку (parity, LRC, or CRC), ніякої відповіді не відправляється. Master діагностує помилку по тайм-ауту.&lt;br /&gt;
&lt;br /&gt;
4. Якщо Slave приймає запит, але не може його обробити (звернення до неіснуючого регістру і т. д.), відправляється відповідь містить у собі дані про помилку.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ Таблиця 2-1. Кадр відповіді (Slave → Master) при виникненні помилки modbus RTU&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! Адресу підлеглого пристрою&lt;br /&gt;
! Номер функції&lt;br /&gt;
! Дані (або код помилки)&lt;br /&gt;
! CRC&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Запит (Master → Slave) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x77 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xDD &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xC7 0xA9&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Відповідь (Slave → Master) &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xF7 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xEE &amp;lt;/div&amp;gt;&lt;br /&gt;
| 0xE6 0x7C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Стандартні коди помилок ====&lt;br /&gt;
* 01 - Прийнятий код функції не може бути опрацьований на підпорядкованому.&lt;br /&gt;
* 02 - Адреса даних, вказаний у запиті, не доступний даному підлеглому.&lt;br /&gt;
* 03 - Величина, що міститься в полі даних запиту, є неприпустимою величиною для підлеглого.&lt;br /&gt;
* 04 - невідновлювальних помилка мала місце, поки підлеглий намагався виконати затребованное дію.&lt;br /&gt;
* 05 - Підлеглий прийняв запит і обробляє його, але це вимагає багато часу. Ця відповідь оберігає головного від генерації помилки тайм-ауту.&lt;br /&gt;
* 06 - Підлеглий зайнятий обробкою команди. Головний повинен повторити повідомлення пізніше, коли підлеглий звільниться.&lt;br /&gt;
* 07 - Підлеглий не може виконати програмну функцію, прийняту в запиті. Цей код повертається для невдалого програмного запиту, що використовує функції з номерами 13 або 14. Головний повинен запросити діагностичну інформацію або інформацію про помилки з підлеглого.&lt;br /&gt;
* 08 - Підлеглий намагається читати розширену пам'ять, але виявив помилку паритету. Головний може повторити запит, але звичайно в таких випадках потрібний ремонт.&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14529</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14529"/>
				<updated>2012-04-16T12:54:02Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: /* Стандартні функції протоколу Modbus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції:&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані:&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адреса відомого пристрою  . &lt;br /&gt;
! код функції   .&lt;br /&gt;
! дані   .&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адреса відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції  .&lt;br /&gt;
! ід протоколу  .&lt;br /&gt;
! довжина пакету  .&lt;br /&gt;
! адресу відомого пристрою  .&lt;br /&gt;
! код функції  .&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Таблиця || Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;br /&gt;
&lt;br /&gt;
== Стандартні функції протоколу Modbus ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright thumb&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
|+ '''PDU запиту і відповіді для стандартних функцій'''&lt;br /&gt;
! номер &amp;lt;br /&amp;gt; функції&lt;br /&gt;
! colspan = &amp;quot;6&amp;quot; | запит / відповідь&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 1 (0x01)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 2 (0x02)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 3 (0x03)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 4 (0x04)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 5 (0x05)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 6 (0x06)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 15 (0x0F)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 16 (0x10)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
*'''A &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''A &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - адреса елемента,&lt;br /&gt;
*'''Q &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''Q &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - кількість елементів,&lt;br /&gt;
*'''N''' - кількість байт даних&lt;br /&gt;
*'''D''' - дані&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Читання даних ===&lt;br /&gt;
&lt;br /&gt;
Для читання значень з перерахованих вище таблиць даних використовуються функції з кодами 1-4 шістнадцяткові значення 0x01-0x04):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''1 (0x01)'''- читання значень з декількох регістрів прапорів''(Read Coil Status)''&lt;br /&gt;
*'''2 (0x02)'''- читання значень з декількох дискретних входів''(Read Discrete Inputs)''&lt;br /&gt;
*'''3 (0x03)'''- читання значень з декількох регістрів зберігання''(Read Holding Registers)''&lt;br /&gt;
*'''4 (0x04)'''- читання значень з декількох регістрів введення''(Read Input Registers)''&lt;br /&gt;
&lt;br /&gt;
Запит складається із адреси першого елемента таблиці, яку потрібно прочитати, і кількості зчитувальних елементів. Адреса та кількість даних задаються 16-бітними числами, старший байт кожного з них передається першим.&lt;br /&gt;
&lt;br /&gt;
У відповіді передаються запитані дані. Кількість байт даних залежить від кількості замовлених елементів. Перед даними передається один байт, значення якого дорівнює кількості байт даних.&lt;br /&gt;
&lt;br /&gt;
Значення регістрів зберігання і регістрів введення передаються починаючи із зазначеної адреси, по два байти на регістр, старший байт кожного регістру передається першим:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! байт 1 || байт 2 || байт 3 || байт 4 || ... || байт N-1 || байт N&lt;br /&gt;
|-&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A +1,1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A +1,0&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| R &amp;lt;sub&amp;gt;A + Q-1, 1&amp;lt;/sub&amp;gt; || R &amp;lt;sub&amp;gt;A + Q-1, 0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Значення прапорів і дискретних входів передаються в упакованому вигляді: по одному біту на прапор.&lt;br /&gt;
Одиниця означає включений стан, нуль - вимкнений.&lt;br /&gt;
Значення запитаних прапорів заповнюють спочатку перший байт, починаючи з молодшого біта, потім наступні байти, також від молодшого біта до старших.&lt;br /&gt;
Молодший біт першого байта даних містить значення прапора, зазначеного в полі «адресу».&lt;br /&gt;
Якщо запитано кількість прапорів, не кратне восьми, то значення додаткового біта заповнюються нулями:.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
! colspan = &amp;quot;8&amp;quot; | байт 1&lt;br /&gt;
! ...&lt;br /&gt;
! colspan = &amp;quot;7&amp;quot; | байт N&lt;br /&gt;
|-&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +7&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +6&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +5&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +4&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +3&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A +1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| ...&lt;br /&gt;
| 0&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-1&amp;lt;/sub&amp;gt;&lt;br /&gt;
| F &amp;lt;sub&amp;gt;A + Q-2&amp;lt;/sub&amp;gt;&lt;br /&gt;
| ...&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Запис одного значення ===&lt;br /&gt;
&lt;br /&gt;
*'''5 (0x05)'''- запис значення одного прапора''(Force Single Coil)''&lt;br /&gt;
*'''6 (0x06)'''- запис значення в один регістр зберігання''(Preset Single Register)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента (2 байти) і встановлюваного значення (2 байти).&lt;br /&gt;
&lt;br /&gt;
Для регістру зберігання значення є просто 16-бітним словом.&lt;br /&gt;
&lt;br /&gt;
Для прапорів значення 0xFF00 означає включений стан, 0x0000 - вимкнений, інші значення неприпустимі.&lt;br /&gt;
&lt;br /&gt;
Якщо команда виконана успішно, ведене пристрій повертає копію запиту.&lt;br /&gt;
&lt;br /&gt;
=== Запис декількох значень ===&lt;br /&gt;
&lt;br /&gt;
*'''15 (0x0F)'''- запис значень в кілька регістрів прапорів''(Force Multiple Coils)''&lt;br /&gt;
*'''16 (0x10)'''- запис значень в кілька регістрів зберігання''(Preset Multiple Registers)''&lt;br /&gt;
&lt;br /&gt;
Команда складається з адреси елемента, кількості змінюваних елементів, кількості переданих байт встановлюваних значень і самих встановлюваних значень. Дані упаковуються так само, як в командах читання даних.&lt;br /&gt;
&lt;br /&gt;
Відповідь складається з початкової адреси і кількості змінених елементів.&lt;br /&gt;
&lt;br /&gt;
Нижче наведено приклад команди ведучого пристрою і відповіді веденого (для Modbus RTU).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 06 Кількість байт даних&lt;br /&gt;
! 07 Дані (значення для прапорів біти 0-7)&lt;br /&gt;
! 08 Дані (значення для прапорів біти 8-15)&lt;br /&gt;
! 09 CRC мл. байт&lt;br /&gt;
! 0A CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Master → Slave &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x02 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCD &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x72 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0xCB &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Напрямок передачі&lt;br /&gt;
! 00 адреса підлеглого пристрою&lt;br /&gt;
! 01 номер функції&lt;br /&gt;
! 02 Адреса ст. байт&lt;br /&gt;
! 03 Адреса мл. байт&lt;br /&gt;
! 04 Кількість прапорів ст. байт&lt;br /&gt;
! 05 Кількість прапорів мл. байт&lt;br /&gt;
! 05 CRC мл. байт&lt;br /&gt;
! 06 CRC ст. байт&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
Slave → Master &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x01 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0F &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x13 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x00 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x0A &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x24 &amp;lt;/div&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div align=&amp;quot;center&amp;quot;&amp;gt;&lt;br /&gt;
0x09 &amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14528</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14528"/>
				<updated>2012-04-16T12:52:23Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції:&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані:&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адреса відомого пристрою  . &lt;br /&gt;
! код функції   .&lt;br /&gt;
! дані   .&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адреса відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції  .&lt;br /&gt;
! ід протоколу  .&lt;br /&gt;
! довжина пакету  .&lt;br /&gt;
! адресу відомого пристрою  .&lt;br /&gt;
! код функції  .&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Таблиця || Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;br /&gt;
&lt;br /&gt;
== Стандартні функції протоколу Modbus ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;tright thumb&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;tiles&amp;quot;&lt;br /&gt;
|+ PDU запиту і відповіді для стандартних функцій&lt;br /&gt;
! номер &amp;lt;br /&amp;gt; функції&lt;br /&gt;
! colspan = &amp;quot;6&amp;quot; | запит / відповідь&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 1 (0x01)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 2 (0x02)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 3 (0x03)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 4 (0x04)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| N || colspan = &amp;quot;5&amp;quot; class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 5 (0x05)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 6 (0x06)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || D &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 15 (0x0F)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan = &amp;quot;2&amp;quot; | 16 (0x10)&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || N || class = &amp;quot;dark&amp;quot; | D (N байт)&lt;br /&gt;
|-&lt;br /&gt;
| A &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || A &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; || Q &amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
*'''A &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''A &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - адреса елемента,&lt;br /&gt;
*'''Q &amp;lt;sub&amp;gt;1'''&amp;lt;/sub&amp;gt; і'''Q &amp;lt;sub&amp;gt;0'''&amp;lt;/sub&amp;gt; - кількість елементів,&lt;br /&gt;
*'''N''' - кількість байт даних&lt;br /&gt;
*'''D''' - дані&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Читання даних ===&lt;br /&gt;
&lt;br /&gt;
Для читання значень з перерахованих вище таблиць даних використовуються функції з кодами 1-4 шістнадцяткові значення 0x01-0x04):&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14527</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14527"/>
				<updated>2012-04-16T12:50:06Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції:&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані:&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адреса відомого пристрою  . &lt;br /&gt;
! код функції   .&lt;br /&gt;
! дані   .&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адреса відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції  .&lt;br /&gt;
! ід протоколу  .&lt;br /&gt;
! довжина пакету  .&lt;br /&gt;
! адресу відомого пристрою  .&lt;br /&gt;
! код функції  .&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Таблиця || Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14526</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14526"/>
				<updated>2012-04-16T12:48:59Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції:&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані:&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адресу відомого пристрою  . &lt;br /&gt;
! код функції   .&lt;br /&gt;
! дані   .&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції&lt;br /&gt;
! ід протоколу&lt;br /&gt;
! довжина пакету&lt;br /&gt;
! адресу відомого пристрою&lt;br /&gt;
! код функції&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Таблиця || Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14525</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14525"/>
				<updated>2012-04-16T12:48:09Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції:&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані:&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адресу відомого пристрою &lt;br /&gt;
! код функції &lt;br /&gt;
! дані &lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції&lt;br /&gt;
! ід протоколу&lt;br /&gt;
! довжина пакету&lt;br /&gt;
! адресу відомого пристрою&lt;br /&gt;
! код функції&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Таблиця || Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14524</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14524"/>
				<updated>2012-04-16T12:47:47Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції:&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані:&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адресу відомого пристрою |&lt;br /&gt;
! код функції |&lt;br /&gt;
! дані |&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції&lt;br /&gt;
! ід протоколу&lt;br /&gt;
! довжина пакету&lt;br /&gt;
! адресу відомого пристрою&lt;br /&gt;
! код функції&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Таблиця || Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14523</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14523"/>
				<updated>2012-04-16T12:41:42Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: /* Вступ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ '''Modbus PDU'''&lt;br /&gt;
|-&lt;br /&gt;
! номер функції&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адресу відомого пристрою&lt;br /&gt;
! код функції&lt;br /&gt;
! дані&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції&lt;br /&gt;
! ід протоколу&lt;br /&gt;
! довжина пакету&lt;br /&gt;
! адресу відомого пристрою&lt;br /&gt;
! код функції&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Таблиця || Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14522</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14522"/>
				<updated>2012-04-16T12:41:28Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: /* Вступ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+ Modbus PDU&lt;br /&gt;
|-&lt;br /&gt;
! номер функції&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адресу відомого пристрою&lt;br /&gt;
! код функції&lt;br /&gt;
! дані&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції&lt;br /&gt;
! ід протоколу&lt;br /&gt;
! довжина пакету&lt;br /&gt;
! адресу відомого пристрою&lt;br /&gt;
! код функції&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Таблиця || Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14521</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14521"/>
				<updated>2012-04-16T12:40:45Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: /* Вступ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! + Modbus PDU&lt;br /&gt;
|-&lt;br /&gt;
! номер функції&lt;br /&gt;
| 1 байт&lt;br /&gt;
|-&lt;br /&gt;
! дані&lt;br /&gt;
| N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адресу відомого пристрою&lt;br /&gt;
! код функції&lt;br /&gt;
! дані&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції&lt;br /&gt;
! ід протоколу&lt;br /&gt;
! довжина пакету&lt;br /&gt;
! адресу відомого пристрою&lt;br /&gt;
! код функції&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Таблиця || Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14520</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14520"/>
				<updated>2012-04-16T12:35:07Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! '''номер функції:''' || 1 байт &lt;br /&gt;
|-&lt;br /&gt;
! '''дані:''' || N &amp;lt;253 (байт)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адресу відомого пристрою&lt;br /&gt;
! код функції&lt;br /&gt;
! дані&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції&lt;br /&gt;
! ід протоколу&lt;br /&gt;
! довжина пакету&lt;br /&gt;
! адресу відомого пристрою&lt;br /&gt;
! код функції&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Таблиця || Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=%D0%9E%D0%B1%D0%B3%D0%BE%D0%B2%D0%BE%D1%80%D0%B5%D0%BD%D0%BD%D1%8F:Modbus&amp;diff=14519</id>
		<title>Обговорення:Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=%D0%9E%D0%B1%D0%B3%D0%BE%D0%B2%D0%BE%D1%80%D0%B5%D0%BD%D0%BD%D1%8F:Modbus&amp;diff=14519"/>
				<updated>2012-04-16T09:29:28Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: Створена сторінка: Цю сторінку створює студент групи КТ-42 ''Пелех Олександр''&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Цю сторінку створює студент групи КТ-42 ''Пелех Олександр''&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14518</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14518"/>
				<updated>2012-04-16T09:26:00Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: /* Категорії кодів функцій */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=center&lt;br /&gt;
|+ Modbus PDU&lt;br /&gt;
! номер функції || дані&lt;br /&gt;
|-&lt;br /&gt;
| Align = &amp;quot;center&amp;quot; | 1 байт&lt;br /&gt;
| Align = &amp;quot;center&amp;quot; | N &amp;lt;253 (байт)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адресу відомого пристрою&lt;br /&gt;
! код функції&lt;br /&gt;
! дані&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції&lt;br /&gt;
! ід протоколу&lt;br /&gt;
! довжина пакету&lt;br /&gt;
! адресу відомого пристрою&lt;br /&gt;
! код функції&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Таблиця || Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14517</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14517"/>
				<updated>2012-04-16T09:25:13Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=center&lt;br /&gt;
|+ Modbus PDU&lt;br /&gt;
! номер функції || дані&lt;br /&gt;
|-&lt;br /&gt;
| Align = &amp;quot;center&amp;quot; | 1 байт&lt;br /&gt;
| Align = &amp;quot;center&amp;quot; | N &amp;lt;253 (байт)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адресу відомого пристрою&lt;br /&gt;
! код функції&lt;br /&gt;
! дані&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції&lt;br /&gt;
! ід протоколу&lt;br /&gt;
! довжина пакету&lt;br /&gt;
! адресу відомого пристрою&lt;br /&gt;
! код функції&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час{{коли}} специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час{{коли}} коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Таблиця || Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи (англ. ''Discrete Inputs'')&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів (англ. ''Coils'')&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення (англ. ''Input Registers'')&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання (англ. ''Holding Registers'')&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14516</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14516"/>
				<updated>2012-04-16T09:18:25Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=center&lt;br /&gt;
|+ Modbus PDU&lt;br /&gt;
| номер функції || дані&lt;br /&gt;
|-&lt;br /&gt;
| Align = &amp;quot;center&amp;quot; | &lt;br /&gt;
| Align = &amp;quot;center&amp;quot; | N &amp;lt;253 (байт)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адресу відомого пристрою&lt;br /&gt;
! код функції&lt;br /&gt;
! дані&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції&lt;br /&gt;
! ід протоколу&lt;br /&gt;
! довжина пакету&lt;br /&gt;
! адресу відомого пристрою&lt;br /&gt;
! код функції&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час{{коли}} специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час{{коли}} коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Таблиця || Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи ({{lang-en | Discrete Inputs}})&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів ({{lang-en | Coils}})&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення ({{lang-en | Input Registers}})&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання ({{lang-en | Holding Registers}})&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14515</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14515"/>
				<updated>2012-04-16T09:15:12Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=center&lt;br /&gt;
|+ Modbus PDU&lt;br /&gt;
! номер функції || дані&lt;br /&gt;
|-&lt;br /&gt;
| Align = &amp;quot;center&amp;quot; | 1 байт    |&lt;br /&gt;
| Align = &amp;quot;center&amp;quot; | N &amp;lt;253 (байт) &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адресу відомого пристрою&lt;br /&gt;
! код функції&lt;br /&gt;
! дані&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції&lt;br /&gt;
! ід протоколу&lt;br /&gt;
! довжина пакету&lt;br /&gt;
! адресу відомого пристрою&lt;br /&gt;
! код функції&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час{{коли}} специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час{{коли}} коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Таблиця || Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи ({{lang-en | Discrete Inputs}})&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів ({{lang-en | Coils}})&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення ({{lang-en | Input Registers}})&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання ({{lang-en | Holding Registers}})&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14514</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14514"/>
				<updated>2012-04-16T09:14:30Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=center&lt;br /&gt;
|+ Modbus PDU&lt;br /&gt;
! номер функції || дані&lt;br /&gt;
|-&lt;br /&gt;
| Align = &amp;quot;center&amp;quot; | 1 байт |&lt;br /&gt;
| Align = &amp;quot;center&amp;quot; | N &amp;lt;253 (байт) |&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адресу відомого пристрою&lt;br /&gt;
! код функції&lt;br /&gt;
! дані&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції&lt;br /&gt;
! ід протоколу&lt;br /&gt;
! довжина пакету&lt;br /&gt;
! адресу відомого пристрою&lt;br /&gt;
! код функції&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час{{коли}} специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час{{коли}} коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Таблиця || Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи ({{lang-en | Discrete Inputs}})&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів ({{lang-en | Coils}})&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення ({{lang-en | Input Registers}})&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання ({{lang-en | Holding Registers}})&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14513</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14513"/>
				<updated>2012-04-16T09:12:56Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня мережевої моделі OSI.&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи клієнт-серверну модель, засновану на транзакціях, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» (англ. ''master'') пристрій, і кілька серверів - «підлеглих» (англ. ''slaves'')  пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=center&lt;br /&gt;
|+ Modbus PDU&lt;br /&gt;
! номер функції || дані&lt;br /&gt;
|-&lt;br /&gt;
| Align = &amp;quot;center&amp;quot; | 1 байт&lt;br /&gt;
| Align = &amp;quot;center&amp;quot; | N &amp;lt;253 (байт)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E (RS-232), EIA-422, EIA/TIA-485-A (RS -485), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки ASCII символи. Для перевірки цілісності використовується алгоритм Longitudinal redundancy check. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка CR / LF.&lt;br /&gt;
* Modbus RTU&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх TCP/IP:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адресу відомого пристрою&lt;br /&gt;
! код функції&lt;br /&gt;
! дані&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції&lt;br /&gt;
! ід протоколу&lt;br /&gt;
! довжина пакету&lt;br /&gt;
! адресу відомого пристрою&lt;br /&gt;
! код функції&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час{{коли}} специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час{{коли}} коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Таблиця || Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи ({{lang-en | Discrete Inputs}})&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів ({{lang-en | Coils}})&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення ({{lang-en | Input Registers}})&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання ({{lang-en | Holding Registers}})&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14512</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14512"/>
				<updated>2012-04-16T09:02:34Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Недоліки стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані.&lt;br /&gt;
*Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
*Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
*Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
*Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Вступ ==&lt;br /&gt;
&lt;br /&gt;
Modbus відноситься до протоколів прикладного рівня [[Мережева модель OSI | мережевої моделі OSI]].&lt;br /&gt;
&lt;br /&gt;
Контролери на шині Modbus взаємодіють, використовуючи [[технологія «клієнт-сервер» | клієнт-серверну]] модель, засновану на [[транзакція]] х, що складаються із запиту і відповіді.&lt;br /&gt;
&lt;br /&gt;
Зазвичай в мережі є тільки один клієнт, так зване, «головне» ({{lang-en | master}}) пристрій, і кілька серверів - «підлеглих» ({{lang-en | slaves}}) пристроїв.&lt;br /&gt;
Головне пристрій ініціює транзакції (передає запити).&lt;br /&gt;
Підлеглі пристрої передають запитувані головним пристроєм дані, або виробляють запитувані дії.&lt;br /&gt;
Головний може адресуватися індивідуально до підлеглого або ініціювати передачу широкомовного повідомлення для всіх підлеглих пристроїв.&lt;br /&gt;
Підлеглий пристрій формує повідомлення і повертає його у відповідь на запит, адресований саме йому.&lt;br /&gt;
При отриманні широкомовного запиту відповідь не формується.&lt;br /&gt;
&lt;br /&gt;
Специфікація Modbus описує структуру запитів і відповідей.&lt;br /&gt;
Їх основа - елементарний пакет протоколу, так званий PDU (Protocol Data Unit).&lt;br /&gt;
Структура PDU не залежить від типу лінії зв'язку і включає в себе код функції і поле даних.&lt;br /&gt;
Код функції кодується однобайтові полем і може приймати значення в діапазоні 1 ... 127.&lt;br /&gt;
Діапазон значень 128 ... 255 зарезервований для кодів помилок.&lt;br /&gt;
Поле даних може бути змінної довжини.&lt;br /&gt;
Розмір пакета PDU обмежений 253 байтами.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=center&lt;br /&gt;
|+ Modbus PDU&lt;br /&gt;
! номер функції || дані&lt;br /&gt;
|-&lt;br /&gt;
| Align = &amp;quot;center&amp;quot; | 1 байт&lt;br /&gt;
| Align = &amp;quot;center&amp;quot; | N &amp;lt;253 (байт)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Для передачі пакету по фізичних лініях зв'язку PDU поміщається в інший пакет, що містить додаткові поля. Цей пакет має назву ADU (Application Data Unit). Формат ADU залежить від типу лінії зв'язку.&lt;br /&gt;
&lt;br /&gt;
Існують три основні реалізації протоколу Modbus, дві для передачі даних по послідовних лініях зв'язку, як мідним EIA/TIA-232-E ([[RS-232]]), EIA-422, EIA/TIA-485-A ([[RS -485]]), так і оптичним і радіо:&lt;br /&gt;
* Modbus ASCII - для обміну використовуються тільки [[ASCII]] символи. Для перевірки цілісності використовується алгоритм [[: en: Longitudinal redundancy check]]. Повідомлення поділяється на стовпці за допомогою символу «:» і закінчується символами нового рядка [[Переклад рядка | CR / LF]].&lt;br /&gt;
* Modbus [[Remote Terminal Unit | RTU]]&lt;br /&gt;
і для передачі даних по мережах Ethernet поверх [[TCP/IP]]:&lt;br /&gt;
* Modbus TCP.&lt;br /&gt;
&lt;br /&gt;
Загальна структура ADU наступна (у залежності від реалізації, деякі з полів можуть бути відсутні):&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! адресу відомого пристрою&lt;br /&gt;
! код функції&lt;br /&gt;
! дані&lt;br /&gt;
! блок виявлення помилок&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання.&lt;br /&gt;
Відомі пристрої відповідають тільки на запити, що надійшли на їх адресу.&lt;br /&gt;
Відповідь також починається з адреси відповідає відомого пристрою, який може змінюватися від 1 до 247.&lt;br /&gt;
Адреса 0 використовується для широкомовної передачі, його розпізнає кожне пристрій, адреси в діапазоні 248 ... 255 - зарезервовані;.&lt;br /&gt;
*'''Номер функції''' - це наступне однобайтное поле кадру. Воно говорить відомому пристрою, які дані або виконання якого дії вимагає від нього ведучий пристрій;&lt;br /&gt;
*'''Дані''' - поле містить інформацію, необхідну відомому пристрою для виконання заданої майстром функції або містить дані, що передаються веденим пристроєм у відповідь на запит ведучого. Довжина і формат поля залежить від номера функції;&lt;br /&gt;
*'''Блок виявлення помилок''' - контрольна сума для перевірки відсутності помилок в кадрі.&lt;br /&gt;
&lt;br /&gt;
Максимальний розмір ADU для послідовних мереж RS232/RS485 - 256 байт, для мереж TCP - 260 байт.&lt;br /&gt;
&lt;br /&gt;
Для Modbus TCP ADU виглядає наступним чином:&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! ід транзакції&lt;br /&gt;
! ід протоколу&lt;br /&gt;
! довжина пакету&lt;br /&gt;
! адресу відомого пристрою&lt;br /&gt;
! код функції&lt;br /&gt;
! дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
де&lt;br /&gt;
*'''Ід транзакції''' - два байти, зазвичай нулі&lt;br /&gt;
*'''Ід протоколу''' - два байти, нулі&lt;br /&gt;
*'''Довжина пакету''' - два байти, старший потім молодший, довжина наступної за цим полем частини пакета&lt;br /&gt;
*'''Адресу відомого пристрою''' - адреса підлеглого пристрою, до якого адресовано прохання. Зазвичай ігнорується, якщо з'єднання встановлено з певним пристроєм. Може використовуватися, якщо з'єднання встановлено з Бриджіт, який виводить нас, наприклад, в мережу RS485.&lt;br /&gt;
&lt;br /&gt;
Поле контрольної суми в Modbus TCP відсутня.&lt;br /&gt;
&lt;br /&gt;
== Категорії кодів функцій ==&lt;br /&gt;
&lt;br /&gt;
У діючій в наш час{{коли}} специфікації протоколу визначаються три категорії кодів функцій:&lt;br /&gt;
; Стандартні команди: Їх опис має бути опублікована та затверджено Modbus-IDA. Ця категорія включає в себе як вже певні, так і вільні в наш час{{коли}} коди.&lt;br /&gt;
; Користувальницькі команди: Два діапазони кодів (від 65 до 72 і від 100 до 110), для яких користувач може реалізувати довільну функцію. При цьому не гарантується, що якийсь інший пристрій не буде використовувати той же самий код для виконання іншої функції.&lt;br /&gt;
; Зарезервовані: У цю категорію входять коди функцій, які не є стандартними, але вже використовуються в пристроях, що виробляються різними компаніями. Це коди 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 і 127.&lt;br /&gt;
&lt;br /&gt;
== Модель даних ==&lt;br /&gt;
&lt;br /&gt;
Одне з типових застосувань протоколу - читання і запис даних в регістри контролерів. Специфікація протоколу визначає чотири таблиці даних:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
! Таблиця || Тип елемента || Тип доступу&lt;br /&gt;
|-&lt;br /&gt;
! Дискретні входи ({{lang-en | Discrete Inputs}})&lt;br /&gt;
| Один біт || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри прапорів ({{lang-en | Coils}})&lt;br /&gt;
| Один біт || читання і запис&lt;br /&gt;
|-&lt;br /&gt;
! Регістри введення ({{lang-en | Input Registers}})&lt;br /&gt;
| 16-бітне слово || тільки читання&lt;br /&gt;
|-&lt;br /&gt;
! Регістри зберігання ({{lang-en | Holding Registers}})&lt;br /&gt;
| 16-бітне слово || читання і запис&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Доступ до елементів в кожній таблиці здійснюється за допомогою 16-бітного адреси, першій клітинці відповідає адреса 0.&lt;br /&gt;
Таким чином, кожна таблиця може містити до 65536 елементів.&lt;br /&gt;
Специфікація не визначає, що фізично повинні представляти собою елементи таблиць і по яким внутрішнім адресами пристрою вони повинні бути доступні.&lt;br /&gt;
Наприклад, припустимо організувати перекриваються таблиці, У цьому випадку команди працюють з дискретними даними і з 16-бітними регістрами будуть фактично звертатися до одних і тих же даних.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Слід зазначити, що зі способом адресації даних пов'язана певна плутанина.&lt;br /&gt;
Modbus був спочатку розроблений для контролерів Modicon.&lt;br /&gt;
У цих контролерах для кожної з таблиць використовувалася спеціальна нумерація.&lt;br /&gt;
Наприклад, першому регістру введення відповідав номер комірки 30001, а першому регістру зберігання - 40001.&lt;br /&gt;
Таким чином, регістру зберігання з адресою 107 в команді Modbus відповідав регістр № 40108 контролера.&lt;br /&gt;
Хоча така відповідність адрес більше не є частиною стандарту, деякі програмні пакети можуть автоматично «коригувати» вводяться користувачем адреси, наприклад, віднімаючи 40001 з адреси регістра зберігання.&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14511</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14511"/>
				<updated>2012-04-16T08:57:14Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Стандарт MODBUS ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Специфічна термінологія ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''PDU''' (Protocol Data Unit) - загальна для всіх фізичних рівнів частина пакета MODBUS. Включає в себе код функції і дані пакета.&lt;br /&gt;
*'''ADU''' (Application Data Unit) - повний пакет MODBUS. Включає в себе специфічну для фізичного рівня частину пакету і PDU.&lt;br /&gt;
&lt;br /&gt;
MODBUS специфікує 4 типи даних:&lt;br /&gt;
*'''Дискретних входів''' - однобітовий тип, доступний тільки на читання.&lt;br /&gt;
*'''Котушки''' - однобітовий тип, доступний на читання і на запис.&lt;br /&gt;
*'''Вхідні регістри''' - 16-бітовий знаковий або беззнакові тип, доступний тільки на читання.&lt;br /&gt;
*'''Проведення регістри''' - 16-бітовий знаковий або беззнакові тип, доступний на читання і на запис.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Склад стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Стандарти MODBUS складаються з 3 частин:&lt;br /&gt;
*Документ Modbus Application Protocol містить специфікацію прикладного рівня мережевої моделі OSI:&lt;br /&gt;
**Елементарний пакет протоколу, так званий PDU (Protocol Data Unit), він єдиний для всіх фізичних рівнів. PDU упаковується в індивідуальний для кожного транспорту застосування блоку даних (ADU).&lt;br /&gt;
**Коди функцій і складу PDU для кожного коду.&lt;br /&gt;
*Документ Modbus по послідовної лінії містить специфікацію канального та фізичного рівнів мережної моделі OSI для фізичних рівнів RS485 і RS232. В принципі може використовуватися будь-який фізичний рівень заснований на асинхронному приймач.&lt;br /&gt;
*Документ MODBUS повідомлень по протоколу TCP / IP Керівництво по впровадженню містить специфікацію ADU для транспорту через TCP / IP стек.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Переваги стандарту ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основні переваги стандарту - відкритість і масовість. Величезна кількість датчиків і виконавчих пристроїв випущено промисловістю. Практично всі промислові системи контролю та управління мають програмні драйвера для роботи з мережами MODBUS.&lt;br /&gt;
[Правити]&lt;br /&gt;
Недоліки стандарту&lt;br /&gt;
&lt;br /&gt;
Стандарт у своїй основі був написаний дуже давно, і багато актуальних для сучасних промислових мереж питання не були враховані [джерело?].&lt;br /&gt;
Стандарт специфікує метод передачі тільки двох типів даних. Відсутність чіткої вказівки в стандарті призвело до того, що з іншими типами даних сторонні виробники MODBUS-рішень надходили на свій розсуд. Розбрід де-факто в цьому питанні не дозволив згодом зробити уточнення в офіційному документі: це викликало б сплеск невдоволення виробників і можливу війну форматів.&lt;br /&gt;
Стандарт не дозволяє ніякої оперативної сигналізації від кінцевого пристрою до майстра в разі необхідності (переривання). Потрібно чекати своєї черги в опитуванні. Це істотно обмежує застосовність MODBUS-рішень в системах управління реального часу.&lt;br /&gt;
Стандарт не дозволяє кінцевим пристроям обмінюватися фіксованими даними один з одним без участі майстра. Це істотно обмежує застосовність MODBUS-рішень в системах регулювання реального часу.&lt;br /&gt;
Стандарт не пропонує жодних рішень по початковій ініціалізації системи. Призначення мережевих адрес і прописування в системі параметрів кожного конкретного пристрою виконуються вручну.&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14510</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14510"/>
				<updated>2012-04-16T08:51:34Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Modbus''' - це  комунікаційний протокол, заснований на архітектурі «клієнт-сервер». Широко застосовується в промисловості для організації зв'язку між електронними пристроями. Може використовувати для передачі даних через послідовні лінії зв'язку RS-485, RS-422, RS-232, а також мережі TCP/IP (Modbus TCP ).&lt;br /&gt;
&lt;br /&gt;
Не слід плутати MODBUS і Modbus Plus. Modbus Plus - пропріетарний протокол належить компанії Schneider Electric. Фізичний рівень унікальний, схожий на Ethernet 10BASE-T, напівдуплекс по одній витій парі, швидкість 1 Мбіт / с. Транспортний протокол - HDLC, поверх якого специфіковано розширення для передачі PDU MODBUS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Історія ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modbus був розроблений компанією Modicon (в даний час належить Schneider Electric) для використання в її контролерах з програмованою логікою. Вперше специфікація протоколу була опублікована в 1979 році. Це був відкритий стандарт, що описує формат повідомлень і способи їх передачі в мережі яка складається з різних електронних пристроїв.&lt;br /&gt;
&lt;br /&gt;
Спочатку контролери MODICON використовували послідовний інтерфейс RS-232. Пізніше став застосовуватися інтерфейс RS-485, так як він забезпечує більш високу надійність, дозволяє використовувати довші лінії зв'язку і підключати до однієї лінії кілька пристроїв.&lt;br /&gt;
&lt;br /&gt;
Багато виробників електронного устаткування підтримали стандарт, на ринку з'явилися сотні використовуючих його виробів. В наш час розвитком Modbus займається некомерційна організація Modbus-IDA, створена виробниками та користувачами електронних приладів.&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14508</id>
		<title>Modbus</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=Modbus&amp;diff=14508"/>
				<updated>2012-04-16T07:52:28Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: Створена сторінка: Modbus - це ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Modbus - це ...&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	<entry>
		<id>https://wiki.tntu.edu.ua/index.php?title=%D0%9A%D0%BE%D1%80%D0%B8%D1%81%D1%82%D1%83%D0%B2%D0%B0%D1%87:Chameleon&amp;diff=14503</id>
		<title>Користувач:Chameleon</title>
		<link rel="alternate" type="text/html" href="https://wiki.tntu.edu.ua/index.php?title=%D0%9A%D0%BE%D1%80%D0%B8%D1%81%D1%82%D1%83%D0%B2%D0%B0%D1%87:Chameleon&amp;diff=14503"/>
				<updated>2012-04-15T15:54:22Z</updated>
		
		<summary type="html">&lt;p&gt;Chameleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Пелех Олександр Михайлович, студент групи КТ-42, ФКТ з 2008р''&lt;/div&gt;</summary>
		<author><name>Chameleon</name></author>	</entry>

	</feed>