若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/140387947
长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…
国产麒麟系统相关开发
上一篇:《麒麟系统开发笔记(十三):在国产麒麟系统上编译OSG库、搭建基础开发环境和移植测试Demo》
下一篇:敬请期待…
前言
在国产麒麟系统上实现modbusTcp和modbus232/485通讯,使用libmodbus库。
本篇在厂家指定的麒麟系统上编译libmodbus库,迁移modbusTcpDemo工程。
相关博客
《案例分享:Qt modbus485调试工具(读写Byte、Int、DInt、Real、DReal)(当前v1.3.0)》
《案例分享:Qt modbusTcp调试工具(读写Byte、Int、DInt、Real、DReal)(当前v1.0.0)》
《台达PLC开发笔记(一):台达PLC连接介绍,分别使用485、网口与台达PLC建立连接》
《台达PLC开发笔记(二):台达PLC设置主机通讯参数为RTU并成功通讯》
《西门子PLC开发笔记(一):PLC介绍,西门子S1200系列接线、编程、下载和仿真》
《libModbus库开发笔记(一):libmodbus库介绍、编译和基础工程模板》
《libModbus库开发笔记(二):libmodbus介绍、编译、modbusTcp连接台达PLC和modbusTcp基础模板》
《麒麟系统开发笔记(十四):在国产麒麟系统上编译libmodbus库、搭建基础开发环境和移植测试Demo》
《案例分享:Qt西门子PLC调试模拟工具(包含PLC上位机通讯,PLC服务器,读写Byte、Int、DInt、Real)(持续更新,当前v1.6.0)》
补充
modbus232/485的demo就不移植了,可以查看相关博客,移植按照本文一样,主要修改配置引用。
国产麒麟系统版本
libModbus介绍
libmodbus是一个免费软件库,可根据Modbus协议发送/接收数据。该库用C编写,并支持RTU(串行)和TCP(以太网)通信。
编译libmodbus(国产麒麟V10)
步骤一:下载解压
https://github.com/stephane/libmodbus
步骤二:配置configure
cd
cd work/src/libmodbus-3.1.6
cCd libmodbus-3.1.6
ls
以下是动态库:
./configure --prefix=/home/yang/work/src/libmodbus-3.1.6/install
若是需要静态库可更改如下:
./configure --prefix=/home/yang/work/src/libmodbus-3.1.6/installStatic –enable-static
步骤三:编译make
make -j16
再单线程确认一下
步骤四:安装make install
make install
步骤五:稍微核对下文件
与windows下相比,就是.a变成了.so,这是动态库,可以编译成静态库:
下面这是静态库的(静态库依赖编译出来,也需要运行库,这点没深究了,可能还需要其他基础动态库依赖吧?):
[外链图片转存中…(img-hrOmwtJQ-1720838579353)]
步骤六:安装到系统
为了运行时不单独去链接运行库,重新来一次,装到系统里面去。
./configure
make -j8
make
sudo make install
sudo ldconfig
获取台达PLC的IP地址
(注意:经手过三个台达了,基本默认地址都是192.168.1.5)
步骤一:下载安装COMMGR
从台达官网下载最新的通讯软件。
官网:https://downloadcenter.delta-china.com.cn/DownloadCenter?v=1&CID=06&itemID=060301&downloadID=AS%E7%B3%BB%E5%88%97&dataType=8&sort_expr=cdate&sort_dir=DESC
下载最新的探索驱动软件:
步骤二:探测台达PLC地址
点开:
点击“搜寻”,电脑必须和PLC在同一个网段,这里都是1网段:
搜索到了如下图:
这样,我们就获取到了PLC的网络地址。
模块化
在windows上加上兼容麒麟系统:
modbusTcpManager.pri
INCLUDEPATH += $$PWD
DEPENDPATH += $$PWD
HEADERS += \
$$PWD/ModbusTcpManager.h
SOURCES += \
$$PWD/ModbusTcpManager.cpp
# libmodbus-3.1.6
win {
INCLUDEPATH += $$PWD/libmodbus-3.1.6/include
LIBS += -L$$PWD/libmodbus-3.1.6/lib -lmodbus -lws2_32
}
unix {
INCLUDEPATH += $$PWD/libmodbus-3.1.6_kylin/include
LIBS += -L$$PWD/libmodbus-3.1.6_kylin/lib -lmodbus
}
Demo
#ifndef MODBUSTCPMANAGER_H
#define MODBUSTCPMANAGER_H
#include <QObject>
#include <QMutex>
union RealByte {
float f;
quint8 buf[4];
};
union DRealByte {
double f;
quint8 buf[8];
};
// libmodbus
#include "modbus/modbus.h"
#include "modbus/modbus-version.h"
#include "modbus/modbus-rtu.h"
#include "modbus/modbus-tcp.h"
class ModbusTcpManager : public QObject
{
Q_OBJECT
private:
explicit ModbusTcpManager(QObject *parent = 0);
public:
bool testEnvAndRtu();
public:
static ModbusTcpManager *getInstance();
public:
void setIp(const QString &ip);
void setPort(const quint16 &port);
void setTimeOutMs(int timeOutMs);
public:
QString getIp() const;
quint16 getPort() const;
int getTimeOutMs() const;
signals:
void signal_connected(bool connected);
void signal_disConnected();
void signal_readBitsResult(bool result, int startAddr, QList<bool> listBool);
void signal_readIntsResult(bool result, int startAddr, QList<int> listInt);
void signal_readDIntsResult(bool result, int startAddr, QList<int> listInt);
void signal_readRealsResult(bool result, int startAddr, QList<float> listFloat);
void signal_readDRealsResult(bool result, int startAddr, QList<double> listDouble);
void signal_writeBitsResult(bool result, int startAddr, QList<bool> listBool);
void signal_writeIntsResult(bool result, int startAddr, QList<int> listInt);
void signal_writeDIntsResult(bool result, int startAddr, QList<int> listInt);
void signal_writeRealsResult(bool result, int startAddr, QList<float> listFloat);
void signal_writeDRealsResult(bool result, int startAddr, QList<double> listDouble);
public slots:
void slot_start();
void slot_stop();
void slot_connect();
void slot_disConnect();
void slot_readBits(int startAddr, int size);
void slot_readInts(int startAddr, int size);
void slot_readDInts(int startAddr, int size);
void slot_readReals(int startAddr, int size);
void slot_readDReals(int startAddr, int size);
void slot_writeBits(int startAddr, QList<bool> listBool);
void slot_writeInts(int startAddr, QList<int> listInt);
void slot_writeDInts(int startAddr, QList<int> listInt);
void slot_writeReals(int startAddr, QList<float> listFloat);
void slot_writeDReals(int startAddr, QList<double> listDouble);
private:
static ModbusTcpManager *_pInstance;
static QMutex _mutex;
private:
QString _ip;
quint16 _port;
int _timeOutMs;
private:
bool _running;
bool _connected;
private:
modbus_t *_pModbus;
};
#endif // MODBUSTCPMANAGER_H
Demo演示
连接台达PLC测试:
工程模板v1.1.0
上一篇:《麒麟系统开发笔记(十三):在国产麒麟系统上编译OSG库、搭建基础开发环境和移植测试Demo》
下一篇:敬请期待…
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/140387947