Qt【使用libmodbus库】

一、下载libmodbus库

libmodbus下载地址

二、编译

下载完后解压

查看readme.md 根据步骤在cmd中执行命令

执行完js后生成config.h

使用visual studio 打开 解决方案

生成 debug 和release的库文件待使用

三、整理库文件

整合到一个文件夹中使用


四、使用libmodbus

依赖项中添加lib

拷贝库文件到执行目录

代码示例

cpp 复制代码
#include "../Include/ModbusTcpChannel.h"
#include "QtGui/Include/Conversion.h"
#include "Base/LogSystem/Include/LogSystem.h"


CModbusTcpChannel::CModbusTcpChannel(QObject* parent)
    : CChannel(parent)
{
    m_bRun = false;
    m_bIsOpen = false;
    m_strRemoteIp = "";
    m_nPort = 0;
    m_pModbus = nullptr;
    SetChannelType(CChannel::E_CHANNLE_MODBUS_TCP_CLIENT);
    Start();
}

CModbusTcpChannel::~CModbusTcpChannel()
{

}

void CModbusTcpChannel::SetRemoteIp(const std::string& strIp)
{
    m_strRemoteIp = strIp;
}

void CModbusTcpChannel::SetRemotePort(int nPort)
{
    m_nPort = nPort;
}

std::string CModbusTcpChannel::GetRemoteIp() const
{
    return m_strRemoteIp;
}

int CModbusTcpChannel::GetRemotePort() const
{
    return m_nPort;
}

bool CModbusTcpChannel::Open()
{
    if (IsOpen())
    {
        return true;
    }

    m_pModbus = modbus_new_tcp(m_strRemoteIp.c_str(), m_nPort);
    if (m_pModbus == nullptr)
    {
        LogError() << "创建modbus对象失败!";
        return false;
    }

    if (modbus_connect(m_pModbus) == -1)
    {
        LogError() << "连接modbus服务器失败!";
        modbus_free(m_pModbus);
        m_pModbus = nullptr;
        return false;
    }

  
    m_bIsOpen = true;
    return true;
}



void CModbusTcpChannel::Close()
{
    if (m_pModbus != nullptr)
    {
        modbus_close(m_pModbus);
        modbus_free(m_pModbus);
        m_pModbus = nullptr;
        m_bIsOpen = false;
    }
}

int CModbusTcpChannel::WriteData(int nCoilAddress, uint8_t u8Value)
{
    int nLen = modbus_write_bit(m_pModbus, nCoilAddress, u8Value);
    if (nLen == -1)
    {
        LogError() << "写入失败!";
        return -1;
    }
    return nLen;
}

int CModbusTcpChannel::PushCmd(int nCmd)
{
    std::lock_guard lock(m_mutexCmd);
    m_dequeCmd.push_back(nCmd);
    return 0;
}

int CModbusTcpChannel::ReadCoilData(int nCoilAddress, int nNum, uint8_t* pBuffer)
{
    int nLen = modbus_read_bits(m_pModbus, nCoilAddress, nNum, pBuffer);
    if (nLen == -1)
    {
        LogError() << "读取失败!";
        return -1;
    }
    return nLen;
}

int CModbusTcpChannel::ReadRegsData(std::vector<uint16_t>& vecData)
{
    uint16_t u16Reg;
    if (modbus_read_registers(m_pModbus, 0, 1, &u16Reg) == 1) //当前温度
    {
        vecData.push_back(u16Reg);
    }
    else
    {
        LogError() << "读取失败!";
        return -2;
    }

    if (modbus_read_registers(m_pModbus, 7, 1, &u16Reg) == 1) //步号
    {
        vecData.push_back(u16Reg);
    }
    else
    {
        LogError() << "读取失败!";
        return -3;
    }

    if (modbus_read_registers(m_pModbus, 51, 1, &u16Reg) == 1)  //目标温度
    {
        vecData.push_back(u16Reg);
    }
    else
    {
        LogError() << "读取失败!";
        return -4;
    }

    return 0;
}


bool CModbusTcpChannel::IsOpen()
{
    return m_bIsOpen;
}


void CModbusTcpChannel::run()
{
    while (m_bRun)
    {
        if (!IsOpen())
        {
            QThread::msleep(1000);
            continue;
        }

        if (m_dequeCmd.empty())
        {
            QThread::msleep(100);
            continue;
        }

        int nCmd = 0;
        {
            std::lock_guard lock(m_mutexCmd);
            nCmd = m_dequeCmd.front();
            m_dequeCmd.pop_front();
        }


        if (nCmd == 1)
        {
            std::vector<uint16_t> vecData;
            int nRet = ReadRegsData(vecData);
            if (nRet == 0)
            {
                emit SigRegsData(vecData);
            }
        }

    }
}

可下载modbus slave模拟 读写数据。
https://modbustools.com/download/ModbusSlaveSetup32Bit.exe

相关推荐
小猿姐8 分钟前
实测对比:哪款开源 Kubernetes MySQL Operator 最值得用?(2026 深度评测)
数据库·mysql·云原生
踏着七彩祥云的小丑2 小时前
pytest——Mark标记
开发语言·python·pytest
Dream of maid2 小时前
Python12(网络编程)
开发语言·网络·php
倔强的石头_2 小时前
从 “存得下” 到 “算得快”:工业物联网需要新一代时序数据平台
数据库
W23035765733 小时前
经典算法:最长上升子序列(LIS)深度解析 C++ 实现
开发语言·c++·算法
Y4090013 小时前
【多线程】线程安全(1)
java·开发语言·jvm
不爱吃炸鸡柳3 小时前
Python入门第一课:零基础认识Python + 环境搭建 + 基础语法精讲
开发语言·python
TDengine (老段)3 小时前
TDengine IDMP 可视化 —— 分享
大数据·数据库·人工智能·时序数据库·tdengine·涛思数据·时序数据
minji...4 小时前
Linux 线程同步与互斥(三) 生产者消费者模型,基于阻塞队列的生产者消费者模型的代码实现
linux·运维·服务器·开发语言·网络·c++·算法
Dxy12393102164 小时前
Python基于BERT的上下文纠错详解
开发语言·python·bert