提示:本文章是利用libmodbus + QT 编写服务端过程遇到的一些问题,仅供参考,酌情采纳 本次更新主要是上传了自己编辑的一个slave程序,感兴趣的可以下载测试一下。
LIBMODBUS+QT SLAVE实现
前言
libmodbus API为编写modbus通讯提供了非常便捷快速的一个接口,利用libmodbus可以迅速建立起主站即客户端或从站服务端的代码框架,实现与modbus之间的通讯:
一、libmodbus是什么?
libmodbus是什么网上很多都有介绍,简而言之,其实就是一个API。以下提供其官方网站与说明文档地址以及使用到的头文件:
libmodbus官网:https://libmodbus.org/
libmodbus说明文档:https://libmodbus.org/reference/
libmodbus使用到的头文件以及lib等:libmodbus资源包
二、使用步骤
1.引入库
A.引入头文件,以及在pro文件中添加对应的lib
注意,lib需要放在exe运行目录下
2.master客户端建立步骤:
使用libmodbus建立master是非常快速的,所以这里不会过多的介绍
2.1初始化modbus上下文
modbus_t *m_ctx;
m_ctx = modbus_new_tcp("127.0.0.1",502);
//m_ctx = modbus_new_rtu("COM1",9600,'N',8,1);//rtu方式
//可以增加判断是否初始化成功
2.2 建立连接
//设置从站地址
modbus_set_slave(m_ctx,1);//具体看从站的地址是多少 本测试用例是1
int rx = modbus_connect(m_ctx);
if(rx == -1)
{
qDebug() << "连接到MODBUS_TCP失败:" << modbus_strerror(errno);//libmodbus打印错误的方法
return -1;
}else
{
m_bisOpen = true;
qDebug() << "连接MODBUS_TCP成功" ;
}
2.3使用具体的API接口进行具体的读写操作
//读取操作 address:寄存器地址 value:写入的值/返回读到的值 readType:读取的类型方式 readAmount:读取的寄存器数量
bool Modbus_TCP::readSingleHoldingRegister(QString address, QString &value,int readType,int readAmount)
{
quint16 val;
quint16 addr;
quint8 Nval;//当读取类型是1或2时 传入的类型是uint8_t
int rc;
if(readType == 1 || readType == 2)
{
Nval = stringToUInt8(value);//QString转uint8_t
addr = stringToUInt8(address);
}else if(readType == 3 || readType == 4)
{
val = stringToUInt16(value);
addr = stringToUInt16(address);
}else
{
qDebug() << "输入的读取类型错误,请输入1-4之间的整数类型" ;
return false;
}
if(addr < 0)
{
qDebug() << "读取寄存器时发生错误,错误原因:非法寄存器地址" ;
return false;
}
switch(readType)
{
case 1