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

相关推荐
寻星探路几秒前
【Python 全栈测开之路】Python 进阶:库的使用与第三方生态(标准库+Pip+实战)
java·开发语言·c++·python·ai·c#·pip
2301_800256111 小时前
第九章:空间网络模型(空间网络查询、数据模型、Connected、with Recursive、pgRouting)
网络·数据库·算法·postgresql·oracle
霖霖总总2 小时前
[小技巧19]MySQL 权限管理全指南:用户、角色、授权与安全实践
数据库·mysql·安全
heartbeat..6 小时前
Spring AOP 全面详解(通俗易懂 + 核心知识点 + 完整案例)
java·数据库·spring·aop
SmartRadio8 小时前
CH585M+MK8000、DW1000 (UWB)+W25Q16的低功耗室内定位设计
c语言·开发语言·uwb
rfidunion8 小时前
QT5.7.0编译移植
开发语言·qt
rit84324998 小时前
MATLAB对组合巴克码抗干扰仿真的实现方案
开发语言·matlab
麦聪聊数据9 小时前
MySQL并发与锁:从“防止超卖”到排查“死锁”
数据库·sql·mysql
大、男人9 小时前
python之asynccontextmanager学习
开发语言·python·学习
hqwest9 小时前
码上通QT实战08--导航按钮切换界面
开发语言·qt·slot·信号与槽·connect·signals·emit