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

相关推荐
lang201509281 天前
Java JSR 250核心注解全解析
java·开发语言
Wpa.wk1 天前
接口自动化测试 - 请求构造和响应断言 -Rest-assure
开发语言·python·测试工具·接口自动化
czhc11400756631 天前
协议 25
java·开发语言·算法
ae_zr1 天前
QT动态编译应用后,如何快速获取依赖
开发语言·qt
gjxDaniel1 天前
Kotlin编程语言入门与常见问题
android·开发语言·kotlin
范纹杉想快点毕业1 天前
状态机设计与嵌入式系统开发完整指南从面向过程到面向对象,从理论到实践的全面解析
linux·服务器·数据库·c++·算法·mongodb·mfc
这周也會开心1 天前
Redis与MySQL回写中的数据类型存储设计
数据库·redis·mysql
jiang_changsheng1 天前
环境管理工具全景图与深度对比
java·c语言·开发语言·c++·python·r语言
Aaron_Wjf1 天前
PG Vector测试
数据库·postgresql
Aaron_Wjf1 天前
PG逻辑复制槽应用
数据库·postgresql