[C++] Открытый исходный код: настройка и использование библиотеки протокола связи libmodbus
[C++] Открытый исходный код: настройка и использование библиотеки протокола связи libmodbus

😏1. Знакомство с проектом.

Официальный сайт: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 Библиотека для различных приложений промышленной автоматизации и Интернета вещей.

😊2. Конфигурация среды.

Настройте среду следующим образом:

Язык кода:javascript
копировать
# удачная установка
sudo apt install libmodbus-dev
Язык кода:javascript
копировать
# компилировать
g++ -o main main.cpp  -lmodbus

😆3. Инструкция по применению.

Ниже приводится анализ использования:

Пример последовательного чтения и записи Modbus RTU:

Язык кода:javascript
копировать
#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:

Язык кода:javascript
копировать
#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;
}
boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода