Сети‎ > ‎

Modbus протокол (рус)

6. Сети MODBUS

MODBUS разработан в 1979 р. фимой Modicon Gould (сейчас в составе  Schneider Electric). Это один из самых первых и самых популярных протоколов промышленной сети на сегодняшний день. Омнованя причина такой популярности – это простота в реализации. Даный раздел посвящен сетям, базирующимся на протоколе прикладного уровня MODBUS.

В настоящее время MODBUS поддерживает и развивает организация MODBUS-IDA, которая представляет собой группу независимых потребителей и поставщиков устройств автоматизации. Она обеспечивает открытость данного протокола и разрабатывает готовые компоненты для упрощения реализации. Будем рассматривать MODBUS таким, каким он существует в настоящее время в стандартах MODBUS-IDA. Одна из реализаций протокола - MODBUS TCP / IP вошла в стандарты МЭК IEC 61158-5-15, IEC 61158-6-15 и IEC 61784-2 как 15-й тип. Учитывая особенности реализации сетей базирующихся на MODBUS, и описания его в МЭК только на прикладном уровне, целесообразно рассматривать его в контексте модели OSI а не МЭК.
 

6.1. Сети MODBUS в контексте модели OSI

    Согласно стандартам MODBUS-IDA - MODBUS является протоколом прикладного уровня для связи типа Клиент-Сервер между прикладными Процессами устройств, которые подключены к различным типам шин или сетей. В контексте OSI-модели, эти сети имеют архитектуру, показанную на рис.6.1.
    Как видно из рисунка, MODBUS в настоящее время представлен 4-мя сетями: MODBUS RTU, MODBUS ASCII, MODBUS Plus и MODBUS TCP / IP. Первые реализации MODBUS базировались на последовательных интерфейсах с двумя режимами передачи RTU и ASCII, но с развитием компьютерных сетей и их интеграции с промышленными сетями протокол MODBUS адаптировали к использованию в сетях, базирующихся на TCP / IP. MODBUS Plus в основном используется в устройствах Schneider Electric, поэтому рассматривать его не будем.

 

6.2. Реализация MODBUS на прикладном уровне

6.2.1. Формат MODBUS PDU

MODBUS Application Protocol (MBAP MODBUS протокол прикладного уровня) базируется на модели клиент-серверного обмена сообщениями, и определяет формат сообщений MODBUS PDU (Protocol Data Unit), которые имеют вид, приведенный на рис.6.2

Клиентский прикладной Процесс отправляет сообщение-запрос к серверному Процессу, в котором в поле "код функции" указывает ему на необходимое действие. Байты данных содержат информацию, необходимую для выполнения данной функции. Серверный прикладной Процесс, в случае удачного выполнения этой функции, повторяет код функции в ответе (если запрос предполагает ответ). При возникновении ошибки, код функции в ответе модифицируется (старший бит выставляется в 1), а в байтах данных передается причина ошибки. То есть, если при исполнении Процессом-Сервером клиентского сообщения-запроса с функцией 0316 (000000112) возникла ошибка, тот он отошлет Приложению-Клиенту ответ с полем функции равным 8316 (100000112). В дополнении к изменению кода функции, при ошибке, Сервер размещает в поле данных уникальный код, который указывает на тип и причину ошибки.

Код функции представляет собой поле с одного байта, которое может принимать значения от 1 до 255 (коды 128-255 зарезервированы под коды сообщений-ответов при ошибочных действиях). Все коды функций в MBAP делятся на (см. рис.6.3):

- Public Function Codes - это публичные коды, описанные в стандарте MODBUS-IDA; их список включает уже назначенные и используемые коды, а также коды для будущего использования;

- User-Defined Function Codes (65-72, 100-110) - это коды, которые могут использоваться компаниями для собственных функций, и не описаны в спецификации;

- Reserved Function Codes (9, 10, 13, 14, 41, 42, 43, 90, 91, 125, 126 и 127) - это зарезервированы коды, которые не доступны для общего использования.

     Ниже расписаны только те функции, которые предназначены для доступа к данным процесса. Эти данные, с точки зрения MODBUS функций делятся на:

- Discrete Inputs: дискретные входы, только для чтения;

- Coils: катушки, внутренние биты или дискретные выходы, чтение/запись;

- Input Registers: входные 16-битные переменные, только чтение;

- Holding Registers: внутренние/выходные 16-битные переменные, чтение/запись.

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

6.2.2. Формат основных функций

 Полный список кодов, а также спецификацию протокола можно найти на официальном Веб сайте MODBUS-IDA - www.MODBUS.org. В пособии детально рассмотрим только наиболее употребительные функции MODBUS – для обмена данными процесса. Номер функции дается в шестнадцатеричном формате. Сокращения в скобках Hi и Lo указывают соответственно на старший и младший байты. То есть, если для указания адреса исходной переменной необходимо двухбайтовое слово, значение старшего байта будет передаваться в поле с обозначением Hi, а младшего - соответственно Lo.

6.2.2.1. Код функции 0116 - чтение статуса Coils (дискретных выходных битов). Сообщение-запрос содержит адрес начального бита и количество битов для чтения. Биты нумеруются начиная с 0. В сообщении-ответе каждое значение переменной передается одним битом, то есть в одном байте пакуется статус 8 битов переменных. Если количество их не кратно восьми, остальные биты в байте заполняются нулями. Счетчик вмещает количество байт в поле данных.

Запрос:

Код функции

01

Адрес начального бита (HI)

0 до FFFF16

Адрес начального бита (LO)

Количество бит (HI)

1 до 7D016 (2000)

Количество бит (LO)

Ответ.

Код функции

01

счетчик байт

N

Значения битов (первые 8)

0 до FF16

Значения битов (следующие 8)

0 до FF16

...

 

Значения битов (N-ные 8 бит)

0 до FF16

 

 

 

 

 

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

6.2.2.3. Код функции 0316 - чтение значения выходных/внутренних регистров. Сообщение-запрос содержит адрес начального исходного/внутреннего регистра (двухбайтовое слово), и количество регистров для чтения. Регистры нумеруются начиная с 0.

Запрос.

Код функции

01

счетчик байт

N*2

Значение 1-го регистра (Hi)

0 до FFFF16

Значение 1-го регистра (Lo)

...

 

Значение  N-го регистра (Hi)

0 до FFFF16

Значение  N-го регистра (Lo)

 

 

 

 Ответ.

Код функции

03

 Счетчик байт

N*2 

Адрес начального регистра (Hi)

 

от 0 до FFFF16

Адрес начального регистра (Lo)

Количество регистров (Hi)

от 1 до 7D16 (125)

Количество регистров (Lo)

 В ответном сообщении в поле данных каждый регистр передается двумя байтами.

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

6.2.2.5. Код функции 0516 - запись выходного/внутреннего бита. В запросе указывается номер битовой переменной и ее значение: лог. "0" - 0000, а лог."1" - FF00, все остальные значения не меняют состояние переменной. В широковещательной передаче клиентский запрос выставляет значение данной переменной для всех Серверов.

Код функции

05

Адрес бита (Hi)

від 0 до FFFF16

Адрес бита (Lo)

Значение бита (Hi)

0000 або FF0016

Значение бита (Lo)

Нормальный ответ сервера является повторением запроса клиента.

6.2.2.6. Код функции 0616 - запись выходного/внутреннего регистра. Функция аналогична предыдущей, но оперирует с регистрами (словами). В запросе указывается номер выходного/внутреннего регистра и его значение. В широковещательной передаче запрос выставляет значение данной переменной для всех серверов.

 

Код функции

06

Адрес регистра (Hi)

від 0 до FFFF16

Адрес регистра (Lo)

Значение регистра (Hi)

від 0 до FFFF16

Значение регистра (Lo)

Нормальный ответ Сервера является повторением клиентского запроса.

6.2.2.7. Код функции 0F16 - запись нескольких выходных/внутренних битов. В запросе указывается начальный адрес бита, количество бит для записи, счетчик байтов и непосредственно значения. При широковещательной передаче биты записываются всем Серверам. Рассмотрим пример для установки следующих битовых выходных/внутренних переменных:

 

Байт 1

Байт 2

26

25

24

23

22

21

20

19

--

--

--

--

--

--

28

27

1

1

0

0

1

1

0

1

 

 

 

 

 

 

0

1

В таблице показано соответствие адреса переменной, начиная с 19-й, и значение бита. Для удобства биты размещены в том порядке, что и передаются. Во втором байте полезные только 2 первых бита, значение других не будет принято во внимание, поскольку количество битов указаны в кадре. Запрос и ответ будут иметь такой вид:

Запрос.

Код функции

0F

Адрес начального бита (Hi)

00

Адрес начального бита (Lo)

13

Количество битов (Hi)

00

Количество битов (Lo)

Счетчик байт

02

Данные(переменные 19-26)

CD

Данные(переменные 27-28)

01

 Ответ. 

Код функции

0F

Адрес начального бита (Hi)

00

Адрес начального бита  (Lo)

13

Количество битов (Hi)

00

Количество битов (Lo)

 

 

 

 

 6.2.2.8. Код функции 1016 − запись нескольких выходных/внутренних регистров.

Запрос:                                                                  

Код функции

1016

Адрес начального регистра (Hi)

0 до FFFF16

Адрес начального регистра (Lo)

Количество регистров (Hi)

1 до 007B16 (123)

Количество регистров (Lo)

Счетчик байт

2*N

Данные (1-й регистр Hi)

0 до FFFF16

Данные (1-й регистр Lo)

...

 

Данные (N-й регистр Hi)

0 до FFFF16

Данные (N-й регистр Lo)

Ответ:

Код функции

10

Адрес начального регистра (Hi)

0 до FFFF16

Адрес начального регистра Lo

Количество регистров (Hi)

1 до 007B16 (123)

Количество регистров (Lo)

 

 

 

 

 

 

 

 

6.2.2.9. Сообщения об ошибках. Эти сообщения касаются всех типов MODBUS, но изначально были определены для MODBUS Serial (RTU / ASCII).

При запросе Клиента к Серверу, могут иметь место следующие ситуации:

-       если Сервер принял запрос без коммуникационных ошибок и может нормально распознать запрос, он возвращает нормальный ответ;

-       если Сервер не принял запрос, ответ не возвращается. Клиент ожидает ответа в течение определенного времени ожидания;

-       если Ведомый (для MODBUS Serial) принял кадр, но нашел коммуникационную ошибку (паритет, ошибка контрольной суммы), то кадр-ответ не возвращается, и Ведущий ждет ответа на запрос в течение определенного тайм-аута;

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

Сообщение об ошибке содержит два поля, которые отличаются от полей нормального ответа:

ПОЛЕ КОДА ФУНКЦИИ: при нормальном ответе Сервер возвращает в этом поле тот номер функции, в которой нуждался Клиент. Во всех кодах функции старший бит установлен в 0. При возврате сообщений об ошибке, Сервер устанавливает этот бит в 1.

ПОЛЕ ДАННЫХ: В этом поле возвращается код ошибки.

Таблица 6.1

Список кодов

Код

Название

Описание

01

ILLEGAL FUNCTION

Принятый код функции не может быть обработан на сервере

02

ILLEGAL DATA ADDRESS

Адрес данных, указанный в запросе, не доступен данному Серверу.

03

ILLEGAL DATA VALUE

Величина, помещенная в поле данных запроса является не допустимой для Сервера..

04

SLAVE DEVICE FAILURE

Имела место неисправимая ошибка, пока Сервер пытался выполнить действие запроса.

05

ACKNOWLEDGE

Сервер принял запрос и обрабатывает его, но необходимо определенное время. Этот ответ защищает Клиента от генерации ошибки тайм-аута.

06

SLAVE DEVICE BUSY

Сервер занят обработкой команды, Клиент должен повторить запрос позже.

07

NEGATIVE ACKNOWLEDGE

Неудачный программный запрос (для функций 13 и 14).

08

MEMORY PARITY ERROR

Сервер хочет читать расширенную память, но нашел ошибку паритета.

 

Пример 6.1. MODBUS. Запрос на чтение статуса выходных битов.

Задача. Сформировать сообщение-запрос и сообщение-ответ на чтение выходных/внутренних битов с 20 по 39 при: обработке без ошибок; обработке с ошибкой ILLEGAL DATA ADDRESS.

Решение. Формат сообщений показан на рис.6.4. Следует отметить, что 1-й бит в адресном пространстве MODBUS опрашивается под номером 0. Поэтому 20-й бит считывается под номером 19. Подробнее читайте в 6.2.3.

 

Пример 6.2. MODBUS. Запрос на чтение значения выходных/внутренних регистров.

Задача. Сформировать сообщение-запрос и сообщение-ответ на чтение выходных/внутренних регистров с 108-го по 110-й при положительной обработке запроса сервером.

Решение. Формат сообщений показан на рис.6.5. Как и в предыдущем случае 108-й регистр в запросе указывается под номером 107 (6В16).
 

6.2.3. Адресная модель MODBUS и доступ к данным

Все переменные, к которым обращается клиентский прикладной Процесс являются частью области памяти устройства. Однако физические адреса этих переменных могут не совпадать с теми, к которым он обращается по протоколу. Главное, чтобы эти переменные были отображением (mapping) действительных данных в устройстве. На рис.6.6 показан процесс обработки запросов на Сервере MODBUS. Как видно из рисунка, при обращении к определенной переменной по ее номеру, например на чтение, по сути, идет обращение к определенной области данных в прикладной программе устройства. Связь данных MODBUS модели с физическими данными называют отображением (mapping).

Рис.6.6. Адресная модель MODBUS

Следует отметить, что минимальный адрес элемента данных модели MODBUS равен 1 а не 0.

Такое разграничение между физической структурой данных и MODBUS моделью данных позволяет адаптировать протокол под структуру различных устройств. Например, в стандарте приводятся два популярные способы реализации MODBUS модели данных: разделение данных по блокам (рис.6.7) и использования доступа к данным одного и того же блока (рис.6.8). Как видно из рисунков модель данных с единым блоком дает доступ к одним и тем же физическим данным. То есть, области Input и Holding регистров совпадают, а области Digital Inputs и Coils тоже совпадают и находятся в области регистров.

 Рис.6.7. Модель данных MODBUS с разделенными блоками

Рис.6.8. Модель данных MODBUS с единым блоком

 

Пример 6.3. MODBUS. Модель данных для различных типов устройств.

Задача. Показать отображения данных модели MODBUS на адресное пространство Momentum/Quantum (Schneider Electric), Micro/Premium/M340/Twido (Schneider Electric), Vipa CPU-21xSER1 (VIPA), Vipa IM-253NET (VIPA).

Решение. Для контроллеров Schneider Electric ветви Modicon то есть Momentum и Quantum, MODBUS - это родной протокол, поэтому модель данных MODBUS абсолютно совпадает с моделью их адресного пространства. Нумерация переменных начинается с 1-й (0-ный номер в запросе обращается к 1-й переменной)

Для контроллеров Micro/Premium, которые влились в Schneider Electric под брендом Telemechanique, а также M340 и Twido, доступ предоставляется только к внутренним переменным (M - Memory), поэтому разницы между входящими и выходящими битами так же как и входящими и выходящими регистрами нет, однако битная область не совпадает с регистровой. Т.е. Серверы MODBUS этих ПЛК будут одинаково реагировать скажем на функции 01 и 02, или 03 и 04. Нумерация переменных начинается с 0-й (0-ный номер в запросе обращается к 0-й переменной, т.е.%M0-бит, или %MW0 - регистр). Таким образом общая таблица отображения данных для различных ПЛК от Schneider Electric имеет следующий вид: 

 

Momentum/Quantum

Micro/Premium/M340/ Twido

Input Discrete

1XXX

%M

Coils

0XXX

%M

Input Registers

3XXX

%MW

Holding Registers

4XXX

%MW

 Для Siemens-подобных контроллеров VIPA сети MODBUS не являются наиболее употребляемыми. Тем не менее, VIPA выпускает номенклатуру модулей с поддержкой данного протокола. В частности, в процессорных модулях типа Vipa CPU-21xSER1, имеется встроенный последовательный порт с поддержкой MODBUS Serial (RTU/ASCII) как в режиме Ведущего так и ведомого. Модуль представляет сторону Сервера MODBUS в режиме Ведомого (объяснение смотри в MODBUS Serial), поэтому именно в этом режиме рассматривается отображение данных модели MODBUS. При конфигурации последовательного порта CPU-21xSER1, задается его режим (MODBUS Slave). Далее, весь обмен проходит через входные и выходные буферы (рис.6.9), которые прикладная программа должна обновлять самостоятельно. Однако буферов всего два, и следовательно битовые переменные находятся в памяти регистровых, т.е. входные – в области входных регистров, выходные – в области выходных регистров (см.рис.6.10).

Следует отметить, что буферы являются внутренней памятью коммуникационного порта, а не самого ПЛК. Для отображения буферов на области памяти ПЛК, в коммуникационных функциях SEND и RECEIVE указывается необходимая область памяти (удобнее пользоваться DB-областью). Необходимо также помнить, что адресация данных в сетевых буферах проходит по словам, а со стороны программы к отображаемым данным ПЛК (например DB) - по байтам.
Рис.6.9. Обмен данными MODBUS в ПЛК VIPA CPU-21xSER1

Рис.6.10. Отображение переменных у входном и выходном буферах для ПЛК VIPA

 Интерфейсный модуль Vipa IM-253NET (VIPA) для построения распределенных систем ввода/вывода на базе Ethernet поддерживает MODBUS TCP/IP, то есть может быть Сервером MODBUS (Клиентом быть не может). Доступ к входам и выходам системы на базе интерфейсного модуля происходит аналогично, как показано на рис.6.10. Буфер IN возобновляется модулем автоматически, а выходы ПЛК автоматически восстанавливаются данным из буфера OUT.
 
 
 
MODBUS протокол (рус)-> Modbus RTU/ASCII (рус) -> Modbus/TCP(рус) 
Оставить комментарии Вы можете здесь http://pupena-san.blogspot.com
Comments