LibModbusTest2.pro
#-------------------------------------------------
#
# Project created by QtCreator 2015-04-03T11:38:46
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = LibModbusTest2
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp \
libmodbus/modbus.c \
libmodbus/modbus-data.c \
libmodbus/modbus-rtu.c \
libmodbus/modbus-tcp.c
HEADERS += mainwindow.h \
libmodbus/modbus.h \
libmodbus/modbus-private.h \
libmodbus/modbus-rtu.h \
libmodbus/modbus-rtu-private.h \
libmodbus/modbus-tcp.h \
libmodbus/modbus-tcp-private.h \
libmodbus/modbus-version.h \
libmodbus/config.h
LIBS += -Ldll -lws2_32
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
#include "libmodbus/modbus.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
this->resize(200, 60)
this->setWindowTitle("libmodbus slave test")
pbRtu=new QPushButton("以modbus rtu方式读取地址1中前20个寄存器值", this)
pbRtu->resize(200, 30)
pbTcp=new QPushButton("以modbus tcp方式读取地址1中前20个寄存器值", this)
pbRtu->resize(200, 30)
QWidget *w=new QWidget()
QVBoxLayout *layout=new QVBoxLayout()
layout->addWidget(pbRtu)
layout->addWidget(pbTcp)
w->setLayout(layout)
this->setCentralWidget(w)
connect(pbRtu, SIGNAL(clicked()), this, SLOT(doRtuQuery()))
connect(pbTcp, SIGNAL(clicked()), this, SLOT(doTcpQuery()))
}
MainWindow::~MainWindow()
{
}
void MainWindow::doRtuQuery()
{
modbus_t *mb
uint16_t tab_reg[32]={0}
mb = modbus_new_rtu("COM1", 9600, 'N', 8, 1)//相同的端口只能同时打开一个
modbus_set_slave(mb, 1)//设置modbus从机地址
modbus_connect(mb)
struct timeval t
t.tv_sec=0
t.tv_usec=1000000//设置modbus超时时间为1000毫秒
modbus_set_response_timeout(mb, &t)
int regs=modbus_read_registers(mb, 0, 20, tab_reg)
QMessageBox::about(NULL, "报告", QString("Rtu读取寄存器的个数:%1").arg(regs))
modbus_close(mb)
modbus_free(mb)
}
void MainWindow::doTcpQuery()
{
modbus_t *mb
uint16_t tab_reg[32]={0}
mb = modbus_new_tcp("127.0.0.1", 5101)//由于是tcp
client连接,在同一个程序中相同的端口可以连接多次。
modbus_set_slave(mb, 1)//从机地址
modbus_connect(mb)
struct timeval t
t.tv_sec=0
t.tv_usec=1000000//设置modbus超时时间为1000毫秒,注意:经测试,如果没有成功建立tcp连接,则该设置无效。
modbus_set_response_timeout(mb, &t)
int regs=modbus_read_registers(mb, 0, 20, tab_reg)
QMessageBox::about(NULL, "报告", QString("Tcp读取寄存器的个数:%1").arg(regs))
modbus_close(mb)
modbus_free(mb)
}
Modbus簇主要有三种协议: Modbus-RTU、Modbus-ASCII、Modbus-TCP
工控行业通常的设备组网看,三者应用的范围如下:
三者报文格式的区别如下:
RTU相比较ASCII具备更紧凑的报文流,传输效率更高,目前MODBUS-ASCII已经应用较少。
Modbus的 *** 作对象有4种: 线圈、离散输入、保持寄存器、输入寄存器 。
modbus_rtu.c
程序流程图
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)