Протокол MODBUS.
|
Содержание
Общие данные
Общие данныеОбмен данными с Modbus-устройствами происходит через регистры. Данные в модуле хранятся в 4-х таблицах регистров (смотри таблицу ниже). Две таблицы доступны только для чтения и две для чтения-записи. В каждой таблице помещается 9999 значений. ![]() Таблица регистров Доступ к элементам в каждой таблице осуществляется с помощью 16-битного адреса, первой ячейке соответствует адрес 0. Таким образом, каждая таблица может содержать от 0 (как правило, в нулевое значение не используется) до 65535 элементов.
• Coils (Регистры флагов) - хранят одно битные значения, т.е. могут находиться в состоянии 0 или 1. Такие регистры могут обозначать текущее состояние выхода (включено/отключено). Регистры флагов допускают как чтение, так и запись.
Спецификация не определяет, что физически должны представлять собой элементы таблиц и по каким внутренним адресам устройства они должны быть доступны. Например, допустимо организовать перекрывающиеся таблицы. В этом случае команды, работающие с дискретными данными и с 16-битными регистрами, будут фактически обращаться к одним и тем же данным. В настоящее время, в прошивке «Smacont-ESP», регистры не разделяются. Команды на чтение регистра хранения (Holding Registers) 0xXXXX и регистра ввода (Input Registers) 0xXXXX обратятся к одному и тому же значению в адресном пространстве устройства. Чтение регистров и запись в регистры (доступ к данным) осуществляется при помощи команд (функций). Доступ к даннымКоды функций чтения и записи регистров, поддерживаемых прошивкой «Smacont-ESP», приведены в таблице ниже. ![]() Таблица функций чтения и записи регистров Адресация регистровАдресация регистров протокола Modbus совпадает с нумерацией переменных «Vx». Например, при запросе значения регистра по адресу 0x0007, в ответ будет передано значение переменной «V7», и, наоборот, при изменении регистра по адресу 0x0007, будет изменено значение переменной «V7». Важным моментом при работе с регистрами, является то, что по протоколу Modbus регистры имеют разрядность 16 бит (два байта), в то время как разрядность переменных «Vx» составляет 64 бита (8 байт, тип dooble). Данную особенность можно не учитывать, если значение переменной «Vx» является положительным 16-ти битным числом (u16, unsigned int 16 bit, диапазон значений 0...65535). Действие «modbus_SetSlaveRegAddr()» (только для Slave-устройств)Действие «modbus_SetSlaveRegAddr()» предназначено для определения массивов переменных «Vx», которые доступны для запроса от Master-устройства. ![]() ![]() Действие «modbus_SetSlaveRegAddr()»
Примечания
Действие «modbus_SetRegFormat()»Если требуется передавать значения переменных других типов (s08; u08; s16; s32; u32; s64; u64; f32; где: s - signed int; u - unsigned int; 08, 16, 32, 64 - разрядность числа), рекомендуется использовать действие «modbus_SetRegFormat()». ![]() ![]() Действие «modbus_SetRegFormat()»
Примечания
Порядок следования байт регистров (справочная информация)В современной вычислительной технике и цифровых системах связи информация обычно представлена в виде последовательности байтов. В том случае, если число не может быть представлено одним байтом, имеет значение, в каком порядке байты записываются в памяти компьютера или передаются по линиям связи. Часто выбор порядка записи байтов произволен и определяется только соглашениями. big-endianПорядок от старшего к младшему (англ. big-endian — с большого конца). Этот порядок подобен привычному порядку записи (например арабскими цифрами) слева направо, например, число сто двадцать три было бы записано при таком порядке как 123. В этом же порядке принято записывать байты в технической и учебной литературе, если другой порядок явно не обозначен. Этот порядок является стандартным для протоколов TCP/IP, он используется в заголовках пакетов данных и во многих протоколах более высокого уровня, разработанных для использования поверх TCP/IP. Поэтому порядок байтов от старшего к младшему часто называют «сетевым порядком байтов» (англ. network byte order).
Пример:
little-endianПорядок от младшего к старшему (англ. little-endian — с малого конца). Это обратный привычному порядку записи чисел арабскими цифрами, например, число сто двадцать три было бы записано при таком порядке как 321. Иными словами этот порядок подобен правилу записи справа налево. Этот порядок записи принят в памяти персональных компьютеров с процессорами архитектуры x86, в связи с чем иногда его называют интеловским порядком байтов. Современные процессоры x86 позволяют работать с одно-, двух-, четырёх- и восьмибайтовыми операндами. В таком порядке следования байтов очень удобно то, что при увеличении размера (количества байтов) операнда, значение его первого байта неизменно: 3210 → 3210’0000. При порядке от старшего к младшему значение изменилось бы, например: 0123 → 0000’0123; Также порядок «от младшего к старшему» применяется в USB, PCI, таблице разделов GUID, он рекомендован FidoNet. Но в целом соглашение little-endian поддерживают меньше кросс-платформенных протоколов и форматов данных, чем big-endian.
Пример:
big-endian byte swap
Пример:
little-endian byte swap
Пример:
|
Программы
Прошивка «Smacont-ESP»:
«Программа Настройки»:
Телеграм каналНовостиЭнергонезависимая память (EEPROM) Переменные «Vx» (карта переменных «Vx») Действие «wifi_CheckConn()». После подключения к WiFi-сети, выполнить действие с задержкой Обмен данными. Open Monitoring Датчики температуры и влажности AHT10/AHT15/AHT20/AHT21/AHT25 Датчик температуры и влажности SHT30 (SHT31/SHT35) Действие «valueToVx()», «valueToArrVx()». Отслеживание заданного уровня в диапазоне значений Действие «termostat()». Термостат ESP-NOW. Датчик температуры и влажности с питанием от батареек Последовательные интерфейсы (UART, I2C, SPI) Управление одноканальным модулем реле |