Официальный сайт:https://libmodbus.org/
проектGithubадрес:https://github.com/stephane/libmodbus
Libmodbus
это протокол связи Modbus
изОткрытый исходный код C Языковая библиотека
。Modbus Это широко используемый протокол промышленной связи, используемый для обмена данными между оборудованием автоматизации. Либмодбус Предоставляет набор функций и инструментов, позволяющих разработчикам легко реализовать Modbus коммуникативные функции.
Ниже приводится Libmodbus
Некоторые ключевые особенности и функции библиотеки:
1. Поддержка протокола Modbus: Libmodbus реализует основные функции протокола Modbus, включая два метода связи: Modbus RTU (последовательный) и Modbus TCP (Ethernet). Он поддерживает связь ведущего и ведомого устройства Modbus, а также чтение и запись регистров Modbus.
2. Кроссплатформенная поддержка: Libmodbus обеспечивает кроссплатформенную поддержку и может работать в нескольких операционных системах, включая Linux, Windows, macOS и т. д.
3. Простота в использовании: Libmodbus предоставляет простой API, позволяющий разработчикам легко интегрировать функции Modbus в свои приложения. Он предоставляет набор функций для установления соединений, чтения и записи регистров, обработки исключений и т. д.
4. Поддержка нескольких языков программирования. Хотя Libmodbus является библиотекой языка C, она также предоставляет привязки для других языков программирования, таких как Python, Java и т. д. Это позволяет разработчикам использовать Libmodbus, используя знакомый им язык программирования.
Libmodbus
широко используется Modbus Библиотека для различных приложений промышленной автоматизации и Интернета вещей.
Настройте среду следующим образом:
# удачная установка
sudo apt install libmodbus-dev
# компилировать
g++ -o main main.cpp -lmodbus
Ниже приводится анализ использования:
Пример последовательного чтения и записи Modbus RTU:
#include <iostream>
#include <modbus/modbus.h>
int main() {
modbus_t* modbusContext;
uint16_t readBuffer[64]; // Используется для хранения считанных данных
const int slaveId = 1; // Рабская машина ID
const int registerAddress = 0; // Зарегистрировать адрес
const int numRegisters = 1; // Количество регистров
const int coilAddress = 0; // адрес катушки
const int numCoils = 1; // Количество катушек
// инициализация - Номер устройства, скорость передачи данных, бит четности, бит данных, стоповый бит
modbusContext = modbus_new_rtu("/dev/ttyUSB0", 9600, 'N', 8, 1);
if (modbusContext == nullptr) {
std::cerr << "Failed to create Modbus context" << std::endl;
return 1;
}
// Открыть Modbus соединять
if (modbus_connect(modbusContext) == -1) {
std::cerr << "Modbus connection failed: " << modbus_strerror(errno) << std::endl;
modbus_free(modbusContext);
return 1;
}
// Чтение реестра
int rc = modbus_read_registers(modbusContext, registerAddress, numRegisters, readBuffer);
if (rc == -1) {
std::cerr << "Failed to read Modbus registers: " << modbus_strerror(errno) << std::endl;
} else {
std::cout << "Read value: " << readBuffer[0] << std::endl;
}
// запись в реестр
const uint16_t writeValue = 1234;
rc = modbus_write_register(modbusContext, registerAddress, writeValue);
if (rc == -1) {
std::cerr << "Failed to write Modbus register: " << modbus_strerror(errno) << std::endl;
} else {
std::cout << "Write successful" << std::endl;
}
// Чтение состояния катушки
uint8_t coilStatus;
rc = modbus_read_bits(modbusContext, coilAddress, numCoils, &coilStatus);
if (rc == -1) {
std::cerr << "Failed to read Modbus coils: " << modbus_strerror(errno) << std::endl;
} else {
std::cout << "Coil value: " << static_cast<int>(coilStatus) << std::endl;
}
// Записать статус катушки
const uint8_t writeValue2 = 1;
rc = modbus_write_bit(modbusContext, coilAddress, writeValue2);
if (rc == -1) {
std::cerr << "Failed to write Modbus coil: " << modbus_strerror(errno) << std::endl;
} else {
std::cout << "Write successful" << std::endl;
}
// закрытие Modbus соединять
modbus_close(modbusContext);
modbus_free(modbusContext);
return 0;
}
Пример чтения и записи Modbus TCP Ethernet:
#include <iostream>
#include <modbus/modbus.h>
int main() {
modbus_t* modbusContext;
const char* ipAddress = "192.168.1.100"; // Modbus TCP Рабская машинаиз IP адрес
const int port = 502; // Modbus TCP номер порта
const int slaveId = 1; // Рабская машина ID
modbusContext = modbus_new_tcp(ipAddress, port);
if (modbusContext == nullptr) {
std::cerr << "Failed to create Modbus context" << std::endl;
return 1;
}
// Открыть Modbus соединять
if (modbus_connect(modbusContext) == -1) {
std::cerr << "Modbus connection failed: " << modbus_strerror(errno) << std::endl;
modbus_free(modbusContext);
return 1;
}
// Чтение состояния катушки
const int coilAddress = 0; // адрес катушки
const int numCoils = 1; // Количество катушек
uint8_t coilStatus[numCoils];
int rc = modbus_read_bits(modbusContext, coilAddress, numCoils, coilStatus);
if (rc == -1) {
std::cerr << "Failed to read Modbus coils: " << modbus_strerror(errno) << std::endl;
} else {
std::cout << "Coil value: " << static_cast<int>(coilStatus[0]) << std::endl;
}
// Записать статус катушки
const uint8_t writeValue = 1;
rc = modbus_write_bit(modbusContext, coilAddress, writeValue);
if (rc == -1) {
std::cerr << "Failed to write Modbus coil: " << modbus_strerror(errno) << std::endl;
} else {
std::cout << "Write successful" << std::endl;
}
// закрытие Modbus соединять
modbus_close(modbusContext);
modbus_free(modbusContext);
return 0;
}