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

相关推荐
Geek-Chow9 分钟前
微服务认证与授权:01 — 概念
java·前端·数据库
KobeSacre15 分钟前
DelayQueue 源码
java·开发语言
han_hanker28 分钟前
重新认识枚举enum
开发语言
烤代码的吐司君38 分钟前
Redis IO 多路复用原理与引入原因深度解析
数据库·redis·php
鹏易灵1 小时前
C++——8.移动语义初探(移动构造、移动赋值)
开发语言·c++·php
2601_962341301 小时前
计算机毕业设计之jsp考研在线复习平台
java·大数据·开发语言·hadoop·python·考研·课程设计
凯瑟琳.奥古斯特1 小时前
力扣1008:前序重建BST
开发语言·c++·算法·leetcode·职场和发展
luoyayun3612 小时前
Qt + FFmpeg 音频工具:重采样实现
qt·ffmpeg·重采样
Database_Cool_2 小时前
单库瓶颈解决方案首选:阿里云 PolarDB-X 平滑替代分库分表
数据库·阿里云
2zcode2 小时前
项目文档:基于MATLAB图像处理的饮料瓶灌装液位检测系统设计与实现
开发语言·图像处理·matlab