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

相关推荐
CoderYanger3 小时前
Java EE 进阶:8.MyBatis 操作数据库(入门)(第二弹)
java·数据库·spring boot·spring·面试·java-ee·mybatis
wafrdggh5 小时前
2026电商快递批量查询怎么用?固乔助手模板设置评测
大数据·数据库·小程序
一个天蝎座 白勺 程序猿6 小时前
KingbaseES数据库归档重做日志文件管理:从配置到运维的实战指南
运维·数据库·oracle·kingbasees·金仓数据库
apcipot_rain6 小时前
C++转Java日记(04)
java·开发语言·c++
sycmancia6 小时前
Qml——信号连接、自定义信号
qt
云和数据.ChenGuang7 小时前
LangGraph 异步 Node 的设计与写法实践
开发语言·人工智能·python·机器学习·php
龙腾AI白云9 小时前
仿真到现实(Sim-to-Real)迁移:跨越仿真与现实鸿沟
数据库·机器学习·plotly·知识图谱·tornado
蜗牛一步步往上爬11 小时前
第十六章 C++语言在深度学习中的应用
开发语言·c++·深度学习
freejackman11 小时前
【实战二】字段级血缘追踪:拆解 AST 迷局,精准穿透函数链与子查询
大数据·数据库·sql
.痞老板.12 小时前
mysql初阶--增删改查操作
数据库·mysql