Протокол modbus rtu

Содержание

Стандарт MODBUS

В настоящее время развитием Modbus занимается некоммерческая организация Modbus-IDA.

Специфическая терминология

  • PDU (Protocol Data Unit) — общая для всех физических уровней часть пакета MODBUS. Включает в себя код функции и данные пакета.
  • ADU (Application Data Unit) — полный пакет MODBUS. Включает в себя специфичную для физического уровня часть пакета и PDU.

MODBUS специфицирует 4 типа данных:

  • Discrete Inputs — однобитовый тип, доступен только для чтения.
  • Coils — однобитовый тип, доступен для чтения и записи.
  • Input Registers — 16-битовый знаковый или беззнаковый тип, доступен только для чтения.
  • Holding Registers — 16-битовый знаковый или беззнаковый тип, доступен для чтения и записи.

Состав стандарта

Стандарты MODBUS состоят из 3 частей:

  • Документ Modbus Application Protocol содержит спецификацию прикладного уровня сетевой модели OSI:
    • Элементарный пакет протокола, так называемый PDU (Protocol Data Unit), он един для всех физических уровней. PDU упаковывается в индивидуальный для каждого транспорта application data unit (ADU).
    • Коды функций и состав PDU для каждого кода.
  • Документ Modbus over serial line содержит спецификацию канального и физического уровней сетевой модели OSI для физических уровней RS-485 и RS-232. В принципе, может использоваться любой физический уровень, основанный на асинхронном приемопередатчике.
  • Документ MODBUS Messaging on TCP/IP Implementation Guide содержит спецификацию ADU для транспорта через TCP/IP-стек.

Достоинства стандарта

Основные достоинства стандарта — открытость и массовость. Промышленностью сейчас (2014 г.) выпускается очень много типов и моделей датчиков, исполнительных устройств, модулей обработки и нормализации сигналов и др. Практически все промышленные системы контроля и управления имеют программные драйверы для работы с MODBUS-сетями.

Недостатки стандарта

Стандарт в своей основе был разработан в 1979 году с учётом потребностей и вычислительных возможностей того времени, и многие актуальные для современных промышленных сетей вопросы не были учтены. Необходимо отметить, что отсутствие перечисленных возможностей является следствием простоты протокола, которая облегчает его изучение и ускоряет внедрение.

  • Стандарт специфицирует метод передачи только двух типов данных. Отсутствие чёткого указания в стандарте привело к тому, что с другими типами данных сторонние производители MODBUS-решений поступали по своему усмотрению. Различие мнений производителей оборудования в этом вопросе не позволило впоследствии сделать уточнения в официальном документе: это вызвало бы всплеск недовольства производителей несогласных с предлагавшимися поправками стандарта и возможную войну форматов.
  • Стандарт не регламентирует начальную инициализацию системы. Назначение сетевых адресов и прописывание в системе параметров каждого конкретного устройства выполняются вручную на этапе адаптации и программирования системы.
  • Не предусмотрена передача сообщений по инициативе подчинённого устройства (прерываний). Ведущее устройство должно периодически опрашивать ведомые.
  • Длина запроса ограничена, а данные могут быть запрошены только из последовательно расположенных регистров. Это увеличивает задержки и накладные расходы при использовании сети, так как для получения данных из регистров, расположенных далеко друг от друга в адресном пространстве, мастер должен либо запрашивать ненужные данные, либо использовать несколько запросов.
  • Не предусмотрен способ, с помощью которого подчинённое устройство могло бы обнаружить потерю связи с ведущим.

Введение

Контроллеры на шине Modbus взаимодействуют, используя master-slave модель, основанную на транзакциях, состоящих из запроса и ответа.

Обычно в сети есть только одно ведущее, так называемое, «главное» (англ. master) устройство, и несколько ведомых — «подчинённых» (англ. slaves) устройств. Главное устройство (мастер) инициирует транзакции (передаёт запросы). Мастер может адресовать запрос индивидуально любому подчиненному или инициировать передачу широковещательного сообщения для всех подчиненных устройств. Подчинённое устройство, опознав свой адрес, отвечает на запрос, адресованный именно ему. При получении широковещательного запроса ответ подчинёнными устройствами не формируется.

Спецификация Modbus описывает структуру запросов и ответов. Их основа — элементарный пакет протокола, так называемый PDU (Protocol Data Unit). Структура PDU не зависит от типа линии связи и включает в себя код функции и поле данных. Код функции кодируется однобайтовым полем и может принимать значения в диапазоне 1…127. Диапазон значений 128…255 зарезервирован для кодов ошибок. Поле данных может быть переменной длины. Размер пакета PDU ограничен 253 байтами.

Modbus PDU

код функции данные
1 байт N ≤ 252 (байт)

Для передачи пакета по физическим линиям связи PDU помещается в другой пакет, содержащий дополнительные поля. Этот пакет носит название ADU (Application Data Unit). Формат ADU зависит от типа линии связи. Существуют три варианта ADU, два для передачи данных через асинхронный интерфейс и один — через TCP/IP сети:

  • Modbus ASCII — для обмена используются только ASCII символы. Для проверки целостности используется однобайтовая контрольная сумма. Начало и конец сообщения помечаются специальными символами (начало сообщения «:», конец сообщения CR/LF).
  • Modbus RTU — компактный двоичный вариант. Сообщения разделяются по паузе в линии. Сообщение должно начинаться и заканчиваться интервалом тишины, длительностью не менее 3,5 символов при данной скорости передачи. Во время передачи сообщения не должно быть пауз длительностью более 1,5 символов. Для скоростей более 19200 бод допускается использовать интервалы 1,75 и 0,75 мс, соответственно. Проверка целостности осуществляется с помощью CRC.
  • Modbus TCP — для передачи данных через TCP/IP соединение.

Общая структура ADU следующая (в зависимости от реализации, некоторые из полей могут отсутствовать):

адрес ведомого (подчинённого) устройства код функции данные блок обнаружения ошибок

где

  • адрес ведомого устройства — адрес подчинённого устройства, к которому адресован запрос. Ведомые устройства отвечают только на запросы, поступившие в их адрес. Ответ также начинается с адреса отвечающего ведомого устройства, который может изменяться от 1 до 247. Адрес 0 используется для широковещательной передачи, его распознаёт каждое устройство, адреса в диапазоне 248…255 — зарезервированы;
  • код функции — это следующее однобайтное поле кадра. Оно говорит ведомому устройству, какие данные или выполнение какого действия требует от него ведущее устройство;
  • данные — поле содержит информацию, необходимую ведомому устройству для выполнения заданной мастером функции или содержит данные, передаваемые ведомым устройством в ответ на запрос ведущего. Длина и формат поля зависит от номера функции, также в поле данных может быть детализация кода функции;
  • блок обнаружения ошибок — контрольная сумма для проверки отсутствия ошибок в кадре.

Максимальный размер ADU для последовательных сетей RS232/RS485 — 256 байт, для сетей TCP — 260 байт.

Для Modbus TCP ADU выглядит следующим образом:

ID транзакции ID протокола длина пакета адрес ведомого устройства код функции данные

где

  • ID транзакции — два байта, обычно нули
  • ID протокола — два байта, нули
  • длина пакета — два байта, старший затем младший, длина следующей за этим полем части пакета
  • адрес ведомого устройства — адрес подчинённого устройства, к которому адресован запрос. Обычно игнорируется, если соединение уже установлено с конкретным устройством, или в системе только одно устройство. Может использоваться, если соединение установлено с мостом, который связан физически, например, с сетью RS-485.

Следует обратить внимание, что поле контроля ошибок в Modbus TCP отсутствует, так как целостность данных обеспечивает TCP/IP-стек.

Модель данных

Одно из типичных применений протокола — чтение и запись данных в регистры контроллеров. Спецификация протокола определяет четыре таблицы данных:

Таблица Тип элемента Тип доступа
Регистры флагов (Coils) один бит чтение и запись
Дискретные входы (Discrete Inputs) один бит только чтение
Регистры ввода (Input Registers) 16-битное слово только чтение
Регистры хранения (Holding Registers) 16-битное слово чтение и запись

Доступ к элементам в каждой таблице осуществляется с помощью 16-битного адреса, первой ячейке соответствует адрес 0. Таким образом, каждая таблица может содержать до 65536 элементов. Спецификация не определяет, что физически должны представлять собой элементы таблиц и по каким внутренним адресам устройства они должны быть доступны. Например, допустимо организовать перекрывающиеся таблицы. В этом случае команды работающие с дискретными данными и с 16-битными регистрами будут фактически обращаться к одним и тем же данным.

Следует отметить, что со способом адресации данных связана определённая путаница. Modbus был первоначально разработан для контроллеров Modicon. В этих контроллерах для каждой из таблиц использовалась специальная нумерация. Например, первому регистру ввода соответствовал номер ячейки 30001, а первому регистру хранения — 40001. Таким образом, регистру хранения с адресом 107 в команде Modbus соответствовал регистр № 40108 контроллера. Хотя такое соответствие адресов больше не является частью стандарта, некоторые программные пакеты могут автоматически «корректировать» вводимые пользователем адреса, например, вычитая 40001 из адреса регистра хранения.

Стандартные функции протокола Modbus

PDU запроса и ответа для стандартных функций

номер
функции
запрос/ответ
1 (0x01) A1 A0 Q1 Q0
N D (N байт)
2 (0x02) A1 A0 Q1 Q0
N D (N байт)
3 (0x03) A1 A0 Q1 Q0
N D (N байт)
4 (0x04) A1 A0 Q1 Q0
N D (N байт)
5 (0x05) A1 A0 D1 D0
A1 A0 D1 D0
6 (0x06) A1 A0 D1 D0
A1 A0 D1 D0
15 (0x0F) A1 A0 Q1 Q0 N D (N байт)
A1 A0 Q1 Q0
16 (0x10) A1 A0 Q1 Q0 N D (N байт)
A1 A0 Q1 Q0
  • A1 и A0 — адрес элемента,
  • Q1 и Q0 — количество элементов,
  • N — количество байт данных
  • D — данные

Доступ к данным

Чтение данных

Для чтения значений из перечисленных выше таблиц данных используются функции с кодами 1—4 (шестнадцатеричные значения 0x01—0x04):

  • 1 (0x01) — чтение значений из нескольких регистров флагов (Read Coil Status).
  • 2 (0x02) — чтение значений из нескольких дискретных входов (Read Discrete Inputs).
  • 3 (0x03) — чтение значений из нескольких регистров хранения (Read Holding Registers).
  • 4 (0x04) — чтение значений из нескольких регистров ввода (Read Input Registers).

Запрос состоит из адреса первого элемента таблицы, значение которого требуется прочитать, и количества считываемых элементов. Адрес и количество данных задаются 16-битными числами, старший байт каждого из них передается первым.

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

Значения регистров хранения и регистров ввода передаются начиная с указанного адреса, по два байта на регистр, старший байт каждого регистра передаётся первым:

байт 1 байт 2 байт 3 байт 4 байт N-1 байт N
RA,1 RA,0 RA+1,1 RA+1,0 RA+Q-1,1 RA+Q-1,0

Значения флагов и дискретных входов передаются в упакованном виде: по одному биту на флаг. Единица означает включённое состояние, ноль — выключенное. Значения запрошенных флагов заполняют сначала первый байт, начиная с младшего бита, затем следующие байты, также от младшего бита к старшим. Младший бит первого байта данных содержит значение флага, указанного в поле «адрес». Если запрошено количество флагов, не кратное восьми, то значения лишних битов заполняются нулями:

байт 1 байт N
FA+7 FA+6 FA+5 FA+4 FA+3 FA+2 FA+1 FA 0 0 FA+Q-1 FA+Q-2

Запись одного значения

  • 5 (0x05) — запись значения одного флага (Force Single Coil).
  • 6 (0x06) — запись значения в один регистр хранения (Preset Single Register).

Команда состоит из адреса элемента (2 байта) и устанавливаемого значения (2 байта).

Для регистра хранения значение является просто 16-битным словом.

Для флагов значение 0xFF00 означает включённое состояние, 0x0000 — выключенное, другие значения недопустимы.

Если команда выполнена успешно, ведомое устройство возвращает копию запроса.

Запись нескольких значений

  • 15 (0x0F) — запись значений в несколько регистров флагов (Force Multiple Coils)
  • 16 (0x10) — запись значений в несколько регистров хранения (Preset Multiple Registers)

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

Ответ состоит из начального адреса и количества изменённых элементов.

Изменение регистров

  • 22 (0x16) — запись в один регистр хранения с использованием маски «И» и маски «ИЛИ» (Mask Write Register).

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

Результат = (Текущее_значение AND Маска_И) OR (Маска_ИЛИ AND (NOT Маска_И))

Очереди данных

  • 24 (0x18) — Чтение данных из очереди (Read FIFO Queue)

Функция предназначена для получения 16-битных слов из очереди, организованной по принципу «первым пришёл — первым ушёл» (FIFO).

Доступ к файлам

  • 20 (0x14) — Чтение из файла (Read File Record)
  • 21 (0x15) — Запись в файл (Write File Record)

Эти функции используются для доступа к 16-битным регистрам, организованным в файлы, состоящие из записей произвольной длины. В команде указывается номер файла, номер записи и длина записи в 16-битных словах. С помощью одной команды можно записать или прочитать несколько записей, не обязательно соседних.

Кроме того, команда содержит однобайтовый код для указания типа ссылки на данные. В действующей версии стандарта определен только один тип (описанный выше) с кодом 0x06.

Диагностика

Перечисленные ниже функции предназначены для устройств на последовательных линиях связи (Modbus RTU и Modbus ASCII).

  • 7 (0x07) — Чтение сигналов состояния (Read Exception Status)

Функция предназначена для получения информации об индикаторах состояния на удалённом устройстве. Функция возвращает один байт, каждый бит которого соответствует состоянию одного индикатора.

  • 8 (0x08) — Диагностика (Diagnostic)
  • 11 (0x0B) — Чтение счетчика событий (Get Com Event Counter)
  • 12 (0x0C) — Чтение журнала событий (Get Com Event Log)

Эти функции предназначены для проверки функционирования последовательной линии связи.

  • 17 (0x11) — Чтение информации об устройстве (Report Slave ID)

Функция предназначена для получения информации о типе устройства и его состоянии. Формат ответа зависит от устройства.

Другие

  • 43 (0x2B) — Encapsulated Interface Transport

Функция предназначена для передачи данных в произвольных форматах (определённых другими стандартами) от ведущего (master) к ведомому (slave) и обратно.

Тип передаваемых данных определяется дополнительным кодом (MEI — MODBUS Encapsulated Interface), передаваемым после номера функции. Стандарт определяет MEI 13 (0x0D), предназначенный для инкапсуляции протокола CANopen. MEI 14 (0x0E) используется для получения информации об устройстве и MEI в диапазонах 0—12 и 15—255 зарезервированы.

Обработка ошибок

Во время обмена данными могут возникать ошибки двух типов:

  • ошибки, связанные с искажениями при передаче данных;
  • логические ошибки (запрос принят без искажений, но не может быть выполнен)

При передаче по асинхронным линиям связи ошибки первого типа обнаруживаются при помощи проверки соответствия принятого запроса установленному формату ADU и вычисления контрольной суммы. Дополнительно, для проверки каждого символа может использоваться бит четности. Если подчинённое устройство обнаруживает искажение данных, принятый запрос игнорируется, ответное сообщение не формируется. Главное устройство может обнаружить ошибку по отсутствию ответа.

В Modbus TCP дополнительная проверка целостности данных не предусмотрена. Передача данных без искажений обеспечивается протоколами TCP/IP.

При ошибках второго типа подчинённое устройство отсылает сообщение об ошибке (если запрос адресован этому устройству; на широковещательные запросы ответ не отправляется). Признаком того, что ответ содержит сообщение об ошибке, является установленный старший бит номера функции. За номером функции, вместо обычных данных, следует код ошибки и, при необходимости, дополнительные данные об ошибке.

Стандартные коды ошибок

  • 01 — Принятый код функции не может быть обработан.
  • 02 — Адрес данных, указанный в запросе, недоступен.
  • 03 — Значение, содержащееся в поле данных запроса, является недопустимой величиной.
  • 04 — Невосстанавливаемая ошибка имела место, пока ведомое устройство пыталось выполнить затребованное действие.
  • 05 — Ведомое устройство приняло запрос и обрабатывает его, но это требует много времени. Этот ответ предохраняет ведущее устройство от генерации ошибки тайм-аута.
  • 06 — Ведомое устройство занято обработкой команды. Ведущее устройство должно повторить сообщение позже, когда ведомое освободится.
  • 07 — Ведомое устройство не может выполнить программную функцию, заданную в запросе. Этот код возвращается для неуспешного программного запроса, использующего функции с номерами 13 или 14. Ведущее устройство должно запросить диагностическую информацию или информацию об ошибках от ведомого.
  • 08 — Ведомое устройство при чтении расширенной памяти обнаружило ошибку контроля четности.

Эмулятор UNetLab — революционный прыжок

Данная статья посвящена новому Эмулятору UNL, с помощью которого вы можете создавать свои собственные виртуальные стенды для подготовки как к экзаменам CCNP/CCIE, так для решения своих инженерных задач.

Что такое UNetLab

UNenLab (Unified Networking Lab, UNL) – это мульти-вендорная и многопользовательская платформа для создания и моделирования самых различных лабораторий и дизайнов, которая позволяет смоделировать виртуальную сеть из маршрутизаторов, коммутаторов, устройств безопасности и др.
Это продолжение того же девелопера, который в своё время создал веб фронтенд для IOU. Теперь разработка iou-web завершена, разрабатывается только UNetLab и является незаменимым инструментом для подготовки к CCIE, сетевого инженеринга, в том числе и Troubleshooting. Это, по сути, убийца GNS, IOU и даже VIRL.
UnetLab – полностью бесплатен. Вы можете запускать столько экземпляров оборудования (роутеров, коммутаторов, устройств безопасности и т.д) сколько вы хотите и какого хотите. Например, в том же Cisco VIRL Personal Edition вы ограничены 15-ю узлами и набор устройств довольно скромный. Например полноценную ASA получить не представляется возможным, равно как и маршрутизатор с Serial-интерфейсом.
Поддержка оборудования в UNetLab очень широкая. Вы можете запускать Cisco IOL-образы, образы из VIRL (vIOS-L2 и vIOS-L3), образы ASA Firewall (как портируемые 8.4(2), 9.1(5), так и официальные ASAv), образ Cisco IPS, образы XRv и CSR1000v, образы dynamips из GNS, образы Cisco vWLC и vWSA, а также образы других вендоров, таких как Juniper, HP, Checkpoint и т.д.
Кроме того, начиная с версии UNetLab 0.9.54 появилась многопользовательский функционал. На одной и той же VM, каждый авторизованный пользователь может создавать свои стенды независимо друг от друга, а также совместно работать с общим стендом, который разделяют несколько пользователей одновременно. При этом пользователи запускают общий стенд независимо друг от друга.
На текущий момент поддерживаются следующий список оборудования:
С более подробным списком можно ознакомится на сайте разработчиков.
Самые существенные плюсы UnetLAB по сравнению с Cisco VIRL

  • Полностью бесплатен
  • Практически полноценная поддержка L2 (за счет EOS-коммутатора, который полностью cisco-like)
  • Широкая поддержка Cisco оборудования
  • Число запускаемых узлов ничем неограничен, кроме ваших ресурсов (CPU, RAM)
  • Мультивендорность
  • Многопользовательский функционал
  • Низкие требования к ресурсам ПК

Данная платформа подойдет как новичкам для подготовки к CCNA/CCNP, так и для профессионалов для подготовки CCIE Routing and Switching, CCIE Security, CCIE Service Provides, CCIE Data Centers и т.д, а также для других разнообразных инженерных задач.
В отличие от предыдущего проекта IOU-WEB, в UNetLAB реализован полностью графический интерфейс дизайна топологии, примерно так, как это делается в GNS. Теперь нет необходимости писать netmap файлы для каждой топологии. Недостатком является полное отсутствие совместимости с предыдущим проектом. Файлы топологий собранные в iou-web необходимо переписывать для UNL. Но в последней версии разработчики предоставляют скрипт который поможет автоматизировать процесс.

Также в UNL включена поддержка так называемой Custom Topology, т.е кликабельных красивых картинок-диаграмм, которые вы можете нарисовать в MS Visio и импортировать в вашу лабу, так как это было в iou-web.

Проект постоянно развивается, добавлением нового функционала и расширением списка поддерживаемых устройств.

Установка UNetLab

UnetLAB поставляется в виде отдельной виртуальной машины основанной на Linux Ubuntu 14 x64. В комплект НЕ входят образы какого-либо оборудования. Например, использование образов IOU не законно, если ты не сотрудник Cisco. Даже для обучения. По этой причине сами образы L2IOU и L3IOU не предоставляются, равно как и другие образы (например образы из VIRL). При желании вы можете найти их в Интернете, а также на официальных сайтах производителей, например Cisco ASAv, Cisco XRv, Cisco CSR1000v, Juniper vSRX и т.п.
На сайте разработчика UnetLAB имеются всеобъемлющие инструкции по инсталляции тех или иных образов в среду UNL. Далее мы рассмотрим установку VM UNetLAB на VmWare Workstation или VmPlayer, а также установку под ESXi.

Ставим виртуальную машину

Для начала нам понадобится vmware player для установки нашей виртуальной машины. Скачать можно с сайта VmWare, так же подойдет Vmware Workstation или ESXi vsphere. После установки vmware player необходимо скачать виртуальную машину UNetLAB примерно 700Mb с сайта разработчика и открыть при помощи VmWare Player или VM Workstation файл .ova

В течении нескольких секунд VM будет создана.

Далее необходимо выбрать меню “Edit virtual machine settings” вашей VM и настроить соответствующее ресурсы CPU и памяти. По умолчанию для VM стоит 1G, 1 CPU и 1 NIC (сетевой интерфейс). Для простейших задач этого хватит, но для серьезного CCIE стенда, данные параметры необходимо увеличить. Я использовал 6 CPU и 12Gb на моем 16G ноутбуке. А под ESXi выделил 8 vCPU и 24Gb. Все зависит от того, что вы хотите запускать. Если например вы готовитесь для сдачи CCIE SP или CCIE Security, то памяти надо выделить побольше. Для CCIE RS хватит 4Gb и 1CPU.

В заключении обязательно включите опцию “Virtualize Intel VT-x/EPT or AMD-V/RVI” в настройках CPU. UNetLAB умеет определять в какой среде она запущена, а также доступны ли ей команды виртуализации CPU. Если у вас Поддержка CPU виртуализации выключена в BIOS, или процессор не поддерживает виртуализацию, UnetLAB детектирует это и выдаст соответствующие предупреждение при загрузке. Вы все еще сможете запускать 32бит образы, такие как IOL или vIOS, но не сможете запускать 64бит образы, такие как ASAv, vSRX и т.п. Поэтому обязательно стоит включить поддержку виртуализации для VM UNetLAB. Если UNetLAB развертывается в среде ESXi, то аналогичная опция должна быть включена в настройках CPU виртуальной машины UNetLAB.

Запуск виртуальной машины UNetLAB

После старта VM вы должны зайти на ее Linux-консоль используя root/unl в качестве логина и пароля. Сразу после этого запускается скрипт инициализации, который предлагает вам настроить такие параметры, как IP-адрес сетевого интерфейса, имя хоста, время и т.п. Просто следуйте инструкциям на экране.

После первоначальной настройки виртуальная машина перегрузится. После установки Виртуальной машины, зайдите на нее под пользователем root и выполните обновление с текущей версии до последней. На сегодняшний день это UNetLab 0.9.54, командами
apt-get update apt-get -o Dpkg::Options::=»—force-overwrite» install unetlab
После обновления VM желательно еще раз перезагрузить, так как будет обновлен linux-kernel.
Далее с помощью браузера можно зайти на веб-интерфейс UNetLAB. Вводим в строке браузера адрес виртуальной машины, который мы задали во время начальной установки, например, 10.0.200.91, и мы увидим интерфейс UNetLAB.

Начиная с версии 0.9.54 введена многопользовательская поддержка, в связи с чем был немного изменен web-интерфейс. Теперь необходимо пройти авторизацию. Используйте login: admin и password: unl.

Добавляем образы устройств

Первым шагом должно быть импортирование образов того оборудования которое мы хотим использовать. В текущей статье мы импортируем IOU образы, как наиболее простые. Первая задача здесь состоит в том, что вам нужна лицензия на IOU. Я не буду вдаваться в подробности, как и где ее получить, но это легко сделать, немного помучив Google.
Вторая особенность — это то, что образы IOU должны иметь расширение .bin, поэтому убедитесь, что вы добавляете его к имени файла.
Нам необходимо для работы как минимум два образа — L2 и L3. Cisco идет в ногу со временем и эти два уровня не разделяются явно на канальный и сетевой. В данный момент L3 более или менее соответствует маршрутизатору уровня ISR, а L2 – коммутатору уровня 3560. Самая свежая версия на сегодня это IOS 15.5T для маршрутизаторов и IOS 15.1 для коммутаторов.
Образы добавляются в UNetLAB из CLI. Т.е вы должны загрузить IOU образ по SCP в папку /opt/unetlab/addons/iol/bin и настроить права доступа к ним с помощью команды.
/opt/unetlab/wrappers/unl_wrapper -a fixpermissions
Вот как это может выглядеть в конечном результате:

Так же помним, что IOU образ заглядывает в файл iourc при каждом своем запуске на предмет лицензионного ключа, который использует информацию о текущем хосте.
# cat /opt/unetlab/addons/iol/bin/iourc unl01 = 0123456789abcdef;
Для того, чтобы протестировать, что образы IOU будут у нас запускаться, выполните следующие команды.
# cd /opt/unetlab/addons/iol/bin # touch NETMAP # LD_LIBRARY_PATH=/opt/unetlab/addons/iol/lib /opt/unetlab/addons/iol/bin/L3-ADVENTERPRISEK9-M-15.4-2T.bin 100
Здесь L3-ADVENTERPRISEK9-M-15.4-2T.bin – это IOU образ L3-маршрутизатора который мы загрузили, а 100 – это просто ID запущенного устройства. Может быть любым числом.
Если у вас появилось на экране, что-то типа:

То, значит, образы IOU запускаются корректно и могут быть использованы в вашем стенде.

Создаем свою топологию в UNetLAB

Из меню Lab->Actions выбираем “Add a new lab” и назовем ее скажем IOL test и нажимаем кнопку ADD:

Далее мы попадаем в режим редактирования нашей топологии. Здесь вы должны добавить в вашу топологию те устройства, с которыми вы будете работать. Так как мы импортировали только образы IOU мы будем добавлять только L2 и L3 IOU устройства. Из меню Actions выбираем пункт Nodes.


Перед вами откроется низ спадающий список со всем поддерживаемым оборудованием. Но так как мы импортировали только IOU образы, нам необходимо выбрать из списка Cisco IOL.

В появившимся окне свойств мы можем выбрать образ IOU, который мы хотим запускать, в данном случае это L3 маршрутизаторы, а также количество таких устройств (в данном случае 2), объемы памяти для каждого устройства (по умолчанию 256Mb), имя устройства, его графическое представление в топологии количество портов Ethernet и Serial.

Указав все параметры, жмем ADD и на экране появятся два роутра.

Давайте сделаем небольшое отступление и добавим ASA Firewall (porting) и IOU коммутатор. IOU-коммутатор добавляется в топологию так же, как и IOU маршрутизатор — выбором пункта меню Cisco IOL. А вот для ASA выбирается пункт Cisco ASA.

Обратите внимание на объем RAM. По умолчанию там стоит 256Mb. С таким объемом ASA не запустится, минимально можно выставить 512-768Mb. Добавив еще два устройства мы получим все четыре устройства нашей топологии на экране.

Теперь данные устройства необходимо связать друг с другом. Для этого в UNL есть понятие Networks (сеть) и соответствующий пункт меню.

Устройства в UNL не связываются как GNS через прямой провод (Direct Link), а связываются через сеть (Network). Общее правило такое, что два устройства связываются друг с другом через один и тот же Network (сеть), так как если бы вы соединяли их одним проводом. Просто объявите для провода свой уникальный Network.
Для нашего простого стенда необходимо три линка. Устройтва ASA, R1 и R2 все подключаются к коммутатору SW1. Поэтому в меню Networks выбираем количество сетей 3 и ждем ADD.

По умолчанию имя для сети начинается с Net и наши сети будут называться Net1, Net2 и Net3. Но имена можно всегда поменять, чтобы точно знать какая сеть куда должна вести. Тип сети ставим по умолчанию Bridge. О типах сетей расскажем в одной из следующих статей. Во вкладке Objects можно увидеть созданные сети, равно как и объекты устройств и их параметры. Сети которые не подключены к интерфейсам устройств в топологии (вкладка Topology) не показываются.

Далее нам необходимо соединить устройства друг с другом. Т.к сети определены, мы можем это сделать через контекстное меню Interfaces конкретного устройства. Во вкладке Topology нашей топологии выберем нужное устройство, например, роутер R1 и кликаем на него правой кнопкой мыши.

В появившимся контекстном меню выбираем Interfaces. Откроется окно, в котором показывается все интерфейсы устройства и каким сетям они подключены:

Если интерфейс не подключен ни какой сети, он показан как Disconnected. В нашем случае R1 имеет 4 Ethernet интерфейса e0/0 – e0/3 и 4 Serial интерфейса s1/0 – s1/3. Нам нужно подсоединить e0/0 к коммутатору e0/0. Поэтому выбираем для интерфейса e0/0 сеть Net1 и нажимаем Save.

В топологии появилась сеть Net1 подключенная к интерфейсу e0/0 роутера R1. Повторим туже процедуру, но для коммутатора SW1 и подключим его интерфейс e0/0 к сети Net1.

Теперь R1 и SW1 соединены Ethernet линком и могут взаимодействовать друг с другом. Аналогичным образом соединим R2 e0/0 с SW1 e0/1 через Net2, a ASA e0 c SW1 e0/2 через Net3. Вот что получилось:

После того, как дизайн закончен, можно попробовать запустить наш стенд. Из меню Actions выбираем «Open this Lab», затем кликаем правой кнопкой на устройство и нажимаем Start:

Когда устройство запустилось успешно, у него меняется индикатор состояния с квадратика (символ Stop) на треугольник (символ Play).

Повторите тоже самое для каждого устройства в топологии. Дадим им минуты три для полной загрузки. Теперь можно получить доступ ко всем устройствам. Однако по умолчанию клик на устройствах будет приводить к запуску стандартного telnet клиента. Это не очень удобно, особенно если учесть, что в последних версиях Windows он уже не предустановлен. Гораздо привычнее использовать PuTTY или SecureCRT.

Зайдем на роутер R1, поднимем интерфейс e0/0 в UP и убедимся, что все работает. Ротуер R1 видим по CDP наш коммутатор SW1.
Теперь назначим на интерфейс e0/0 маршрутизатора R1 IP-адрес 192.168.1.1/24, а на e0/0 ASA интерфейс 192.168.1.12/24 и убедимся, что все работает.

Заключение

С появлением UNetLab работа с образами не представляет особой сложности, все реализовано достаточно логично. Во многих случаях этот эмулятор оставляет далеко позади GNS/Dynamips, VIRL, особенно когда идет речь о разнообразных моделях устройств в стенде, не только коммутаторах и маршрутизаторах. А аж об оборудовании других вендоров речь вообще не идет. Например, если нужно смоделировать взаимодействие оборудование разных вендоров друг с другом, например, IPSEC VPN туннель между Cisco ASA и Juniper SRX или Checkpoint Firewall и т.п

Также UNetLab значительно менее ресурсоемок как и IOU, чем тот же VIRL. На сегодняшний день UNetLab остается лучшим инструментом как для подготовки к CCNP/CCIE, так и для моделирования разнообразных инженерных задач.

Полезные ссылки и используемые материалы

Сайт разработчика UNetLab
Статьи по UNetLab на русском
Лаборатория сетей CiscoLAB.

Просто о Modbus RTU с подробным описанием и примерами

Из данной статьи вы узнаете о протоколе Modbus RTU, который широко применяется в АСУ ТП. Англоязычная версия статьи доступна на сайте ipc2u.com. Описание протокола Modbus TCP можно найти в статье.

  • Описание протокола Modbus RTU
  • Какие бывают команды Modbus RTU?
  • Как послать команду Modbus RTU на чтение дискретного вывода? Команда 0x01
  • Как послать команду Modbus RTU на чтение дискретного ввода? Команда 0x02
  • Как послать команду Modbus RTU на чтение аналогового вывода? Команда 0x03
  • Как послать команду Modbus RTU на чтение аналогового ввода? Команда 0x04
  • Как послать команду Modbus RTU на запись дискретного вывода? Команда 0x05
  • Как послать команду Modbus RTU на запись аналогового вывода? Команда 0x06
  • Как послать команду Modbus RTU на запись нескольких дискретных выводов? Команда 0x0F
  • Как послать команду Modbus RTU на запись нескольких аналоговых выводов? Команда 0x10
  • Какие бывают ошибки запроса Modbus?
  • Программы для работы с протоколом Modbus RTU
  • Оборудование с поддержкой протокола Modbus RTU

Описание протокола Modbus RTU

Modbus —коммуникационный протокол, основан на архитектуре ведущий-ведомый (master-slave). Использует для передачи данных интерфейсы RS-485, RS-422, RS-232, а также Ethernet сети TCP/IP (протокол Modbus TCP).

Сообщение Modbus RTU состоит из адреса устройства SlaveID, кода функции, специальных данных в зависимости от кода функции и CRC контрольной суммы.

SlaveID Код функции Специальные данные CRC

Если отбросить SlaveID адрес и CRC контрольную сумму, то получится PDU, Protocol Data Unit.

SlaveID – это адрес устройства, может принимать значение от 0 до 247, адреса с 248 до 255 зарезервированы.

Данные в модуле хранятся в 4 таблицах.

Две таблицы доступны только для чтения и две для чтения-записи.

В каждой таблице помещается 9999 значений.

Номер регистра Адрес регистра HEX Тип Название Тип
1-9999 0000 до 270E Чтение-запись Discrete Output Coils DO
10001-19999 0000 до 270E Чтение Discrete Input Contacts DI
30001-39999 0000 до 270E Чтение Analog Input Registers AI
40001-49999 0000 до 270E Чтение-запись Analog Output Holding Registers AO

В сообщении Modbus используется адрес регистра.

Например, первый регистр AO Holding Register, имеет номер 40001, но его адрес равен 0000.

Разница между этими двумя величинами есть смещение offset.

Каждая таблица имеет свое смещение, соответственно: 1, 10001, 30001 и 40001.

Ниже приведен пример запроса Modbus RTU для получения значения AO аналогового выхода (holding registers) из регистров от #40108 до 40110 с адресом устройства 17.

11 03 006B 0003 7687

11 Адрес устройства SlaveID (17 = 11 hex)
03 Функциональный код Function Code (читаем Analog Output Holding Registers)
006B Адрес первого регистра (40108-40001 = 107 =6B hex)
0003 Количество требуемых регистров (чтение 3-х регистров с 40108 по 40110)
7687 Контрольная сумма CRC

В ответе от Modbus RTU Slave устройства мы получим:

11 03 06 AE41 5652 4340 49AD

Где:

11 Адрес устройства (17 = 11 hex) SlaveID
03 Функциональный код Function Code
06 Количество байт далее (6 байтов идут следом) Byte Count
AE Значение старшего разряда регистра (AE hex) Register value Hi (AO0)
41 Значение младшего разряда регистра (41 hex) Register value Lo (AO0)
56 Значение старшего разряда регистра (56 hex) Register value Hi (AO1)
52 Значение младшего разряда регистра (52 hex) Register value Lo (AO1)
43 Значение старшего разряда регистра (43 hex) Register value Hi (AO2)
40 Значение младшего разряда регистра (40 hex) Register value Lo (AO2)
49 Контрольная сумма CRC value Lo
AD Контрольная сумма CRC value Hi

Регистр аналогового выхода AO0 имеет значение AE 41 HEX или 44609 в десятичной системе.

Регистр аналогового выхода AO1 имеет значение 56 52 HEX или 22098 в десятичной системе.

Регистр аналогового выхода AO2 имеет значение 43 40 HEX или 17216 в десятичной системе.

Значение AE 41 HEX — это 16 бит 1010 1110 0100 0001, может принимать различное значение, в зависимости от типа представления.

Значение регистра 40108 при комбинации с регистром 40109 дает 32 бит значение.

Пример представления.

Наверх к оглавлению

Как послать команду Modbus RTU на чтение дискретного вывода? Команда 0x01

Эта команда используется для чтения значений дискретных выходов DO.

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

Значения DO в ответе находятся в одном байте и соответствуют значению битов.

Значения битов определяются как 1 = ON и 0 = OFF.

Младший бит первого байта данных содержит значение DO адрес которого указывался в запросе. Остальные значения DO следуют по нарастающей к старшему значению байта. Т.е. справа на лево.

Если запрашивалось меньше восьми значений DO, то оставшиеся биты в ответе будут заполнены нулями (в направлении от младшего к старшему байту). Поле Byte Count Количество байт далее указывает количество полных байтов данных в ответе.

Пример запроса DO с 20 по 56 для SlaveID адреса устройства 17. Адрес первого регистра будет 0013 hex = 19, т.к. счет ведется с 0 адреса (0014 hex = 20, -1 смещение нуля = получаем 0013 hex = 19).

Байт Запрос Байт Ответ
(Hex) Название поля (Hex) Название поля
11 Адрес устройства 11 Адрес устройства
01 Функциональный код 01 Функциональный код
00 Адрес первого регистра Hi байт 05 Количество байт далее
13 Адрес первого регистра Lo байт CD Значение регистра DO 27-20 (1100 1101)
00 Количество регистров Hi байт 6B Значение регистра DO 35-28 (0110 1011)
25 Количество регистров Lo байт B2 Значение регистра DO 43-36 (1011 0010)
0E Контрольная сумма CRC 0E Значение регистра DO 51-44 (0000 1110)
84 Контрольная сумма CRC 1B Значение регистра DO 56-52 (0001 1011)
45 Контрольная сумма CRC
E6 Контрольная сумма CRC

Состояния выходов DO 27-20 показаны как значения байта CD hex, или в двоичной системе 1100 1101.

В регистре DO 56-52 5 битов справа были запрошены, а остальные биты заполнены нулями до полного байта (0001 1011).

Каналы DO 56 DO 55 DO 54 DO 53 DO 52
Биты 0 0 0 1 1 0 1 1
Hex 1B

Модули с дискретным выводом: M-7065, ioLogik R1214, ADAM-4056S

Наверх к оглавлению

Как послать команду Modbus RTU на запись дискретного вывода? Команда 0x05

Эта команда используется для записи одного значения дискретного выхода DO.

Значение FF 00 hex устанавливает выход в значение включен ON.

Значение 00 00 hex устанавливает выход в значение выключен OFF.

Все остальные значения недопустимы и не будут влиять значение на выходе.

Нормальный ответ на такой запрос — это эхо (повтор запроса в ответе), возвращается после того, как состояние DO было изменено.

Пример записи в DO с регистром #173 для SlaveID адреса устройства 17. Адрес регистра будет 00AC hex = 172, т.к. счет ведется с 0 адреса.

Байт Запрос Байт Ответ
(Hex) Название поля (Hex) Название поля
11 Адрес устройства 11 Адрес устройства
05 Функциональный код 05 Функциональный код
00 Адрес первого регистра Hi байт 00 Адрес первого регистра Hi байт
AC Адрес первого регистра Lo байт AC Адрес первого регистра Lo байт
FF Значение Hi байт FF Значение Hi байт
00 Значение Lo байт 00 Значение Lo байт
4E Контрольная сумма CRC 4E Контрольная сумма CRC
8B Контрольная сумма CRC 8B Контрольная сумма CRC

Состояние выхода DO173 поменялось с выключен OFF на включен ON.

Модули с дискретным выводом: M-7053, ioLogik R1210, ADAM-4051

Наверх к оглавлению

Какие бывают ошибки запроса Modbus?

Если устройство получило запрос, но запрос не может быть обработан, то устройство ответит кодом ошибки.

Ответ будет содержать измененный Функциональный код, старший бит будет равен 1.

Пример:

Было Стало
Функциональный код в запросе Функциональный код ошибки в ответе
01 (01 hex) 0000 0001 129 (81 hex) 1000 0001
02 (02 hex) 0000 0010 130 (82 hex) 1000 0010
03 (03 hex) 0000 0011 131 (83 hex) 1000 0011
04 (04 hex) 0000 0100 132 (84 hex) 1000 0100
05 (05 hex) 0000 0101 133 (85 hex) 1000 0101
06 (06 hex) 0000 0110 134 (86 hex) 1000 0110
15 (0F hex) 0000 1111 143 (8F hex) 1000 1111
16 (10 hex) 0001 0000 144 (90 hex) 1001 0000

Пример запроса и ответ с ошибкой:

Байт Запрос Байт Ответ
(Hex) Название поля (Hex) Название поля
0A Адрес устройства 0A Адрес устройства
01 Функциональный код 81 Функциональный код с измененным битом
04 Адрес первого регистра Hi байт 02 Код ошибки
A1 Адрес первого регистра Lo байт B0 Контрольная сумма CRC
00 Количество регистров Hi байт 53 Контрольная сумма CRC
01 Количество регистров Lo байт
AC Контрольная сумма CRC
63 Контрольная сумма CRC

Расшифровка кодов ошибок

01 Принятый код функции не может быть обработан.
02 Адрес данных, указанный в запросе, недоступен.
03 Значение, содержащееся в поле данных запроса, является недопустимой величиной.
04 Невосстанавливаемая ошибка имела место, пока ведомое устройство пыталось выполнить затребованное действие.
05 Ведомое устройство приняло запрос и обрабатывает его, но это требует много времени. Этот ответ предохраняет ведущее устройство от генерации ошибки тайм-аута.
06 Ведомое устройство занято обработкой команды. Ведущее устройство должно повторить сообщение позже, когда ведомое освободится.
07 Ведомое устройство не может выполнить программную функцию, заданную в запросе. Этот код возвращается для неуспешного программного запроса, использующего функции с номерами 13 или 14. Ведущее устройство должно запросить диагностическую информацию или информацию об ошибках от ведомого.
08 Ведомое устройство при чтении расширенной памяти обнаружило ошибку паритета. Ведущее устройство может повторить запрос, но обычно в таких случаях требуется ремонт.

Наверх к оглавлению