一、下载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