Modbus — это протокол, который используется поверх сокетов TCP или, в версии RTU, поверх работы с последовательным портом или интерфейсом 485, насколько я сталкивался в своей практике.
На официальном сайте есть открытые спецификации протокола, где Modbus подробно описан по компонентам, правда, на английском языке.
Modbus нужен, как правило, для чтения регистров с устройств, или записи в них данных, даже по 1 биту, и ряда дополнительных свойств.
Это может обеспечить взаимодействие программы и устройства с целью считывания измеряемых устройством данных (заряд аккумулятора, показания вольтметра, температура) и настройки устройства.
Коротко покажу, что такое modbus rtu:
Таким образом вы сможете читать запросы modbus rtu, поступающие на сервер.unsigned char* response; response = new unsigned char[8]; ReadFile(hSer, (char*)response, 8, &size, 0);
Структура 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++
-
Как Начать С Онлайн-Игр
19 Oct, 24 -
Исполнительный Директор
19 Oct, 24 -
Большая Восьмерка
19 Oct, 24 -
Настройка Заголовка Окна В Mac Os X
19 Oct, 24