Введение В Modbus

Modbus — это протокол, который используется поверх сокетов TCP или, в версии RTU, поверх работы с последовательным портом или интерфейсом 485, насколько я сталкивался в своей практике.

На официальном сайте есть открытые спецификации протокола, где Modbus подробно описан по компонентам, правда, на английском языке.

Modbus нужен, как правило, для чтения регистров с устройств, или записи в них данных, даже по 1 биту, и ряда дополнительных свойств.

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

Коротко покажу, что такое modbus rtu:

  
  
  
   

unsigned char* response; response = new unsigned char[8]; ReadFile(hSer, (char*)response, 8, &size, 0);

Таким образом вы сможете читать запросы modbus rtu, поступающие на сервер.

Структура 8 байт. FF — это байт. Вы можете получить сообщение вида: 02 03 A0 28 00 04 93 2A. Я расшифрую сообщение.

02 — номер устройства, к которому осуществляется доступ.

03 - номер функции, т.е.

3 - чтение регистров, а иногда и запись, регистры, катушки по 1 биту и т.д. А0 28 при преобразовании в десятичную систему будет 41000 - номер регистра, 00 04 - значит нужно отсчитать еще 4 регистра от 41000. Последние 2 цифры - это 2 байта кода CRC16. Как только такое сообщение пришло, вам также необходимо заполнить массив на отправляющей стороне и пробросить его либо через tcp-сокеты, либо через com-порт, либо другим способом.

Ответ тоже заполняется, но уже будет сообщение вида: 02 03 08 00 01 00 02 00 03 00 04 95 B8 т.е.

код устройства, код функции, количество переданных байт, 1234 данных (это как значения регистров) .

2-байтовый код CRC. Код CRC рассчитывается из сообщения, не включающего 2 байта кода CRC. Это для функции 3. В коде:

unsigned char* request request = new unsigned char[reqsize];

Заполняем данные и вычисляем CRC:

crc.i = CRC16((unsigned char *)request, reqsize-2); request[reqsize-2] = crc.ch[1]; request[reqsize-1] = crc.ch[0];

И отправить через последовательный порт:

BOOL iRet = WriteFile(hSer, (char*)request, reqsize, &dwBytesWritten, NULL );

Таким образом, функция 3 (чтение нескольких регистров) была отправлена и на нее был получен ответ по протоколу Modbus. Спасибо за внимание! Прочтите характеристики на официальном сайте протокола.

Теги: #Modbus #C++ #C++ #series #tcp #C++ #C++

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.