若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/110071837
各位读者,常识无穷而人力有穷,要么改需要,要么找专业人士,要么本人钻研
红瘦子(红模拟)的博文大全:开发技术汇合(蕴含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬联合等等)继续更新中...(点击传送门)
Qt开发专栏:我的项目实战(点击传送门)
前言
西门西PLC、台达触摸屏、法兰克机床等等多年以前玩得比拟多,革新机床、培修机床、给机床编程等等,没事还能车个整机啥的,对于多年以前的研发革新,有工夫就重新整理下。
先上点有历史年代感的照片:
需要
基于Qt实现与PLC通信性能。
Demo
体验下载地址
CSDN:https://download.csdn.net/download/qq21497936/13239895
QQ群:1047134658(点击“文件”搜寻“plcCommunication”,群内与博文同步更新)
v1.2.0
v1.1.0
要害源码
PlcWidget.h
#ifndef PLCSERVERMANAGER_H#define PLCSERVERMANAGER_H/************************************************************\ * 控件名称:PlcServerManager * 性能形容:Plc通信服务器(用于模仿PLC,包含仿真DB数据空间) * 控件性能: * 1.惟一实例类 * 2.注册DB * 3.监听、进行监听 * 4.对所有事件进行反馈 * 作者:长沙红瘦子(AAA红模拟) * 博客专家地址:https://blog.csdn.net/qq21497936/article/details/102478062 * 联系方式:QQ(21497936) 微信(yangsir198808) * 版本信息 * 日期 版本号 形容 * 2020年11月23日 v1.0.0 根底性能 * 2020年12月01日 v1.1.0 减少客户端写入提醒信号\************************************************************/#include <QObject>#include <QMutex>#include <QHash>#include "snap7.h"class PlcServerManager : public QObject{ Q_OBJECTprivate: explicit PlcServerManager(QObject *parent = 0);public: static PlcServerManager * getInstance(); QHash<int, QByteArray> getHashDB2ByteArray() const;signals: void signal_listenStateChanged(bool listen); void signal_dataChanged();public slots: void slot_start(); void slot_stop(); void slot_listen(QString ip); void slot_stopListen(); void slot_regsiterDB(int dbNum, int size); void slot_setDB(int dbNum, QByteArray data);private: static PlcServerManager *_pInstance; static QMutex _mutex; static void callBack_event(void *usrPtr, PSrvEvent PEvent, int Size);private: bool _running; // 线程是否启用 bool _listen; // 是否连贯PLC QString _ip; // ip地址 QStringList _listIp; // 连贯上的客户端地址 TS7Server *_pTS7Server; QHash<int, QByteArray> _hashDB2ByteArray;};#endif // PLCMANAGER_H
PlcWidget.cpp
#include "PlcServerManager.h"#include <QMessageBox>#include <QFile>#include <QHostAddress>#include <QDebug>#define LOG qDebug()<<__FILE__<<__LINE__PlcServerManager *PlcServerManager::_pInstance = 0;QMutex PlcServerManager::_mutex;void PlcServerManager::callBack_event(void *usrPtr, PSrvEvent PEvent, int Size){ switch (PEvent->EvtCode) { case evcDataRead: // 读取数据 break; case evcDataWrite: // 写入数据 emit _pInstance->signal_dataChanged(); break; default: break; }}QHash<int, QByteArray> PlcServerManager::getHashDB2ByteArray() const{ return _hashDB2ByteArray;}PlcServerManager::PlcServerManager(QObject *parent) : QObject(parent), _running(false), _pTS7Server(0), _listen(false){}PlcServerManager *PlcServerManager::getInstance(){ if(!_pInstance) { QMutexLocker lock(&_mutex); if(!_pInstance) { _pInstance = new PlcServerManager(); } } return _pInstance;}void PlcServerManager::slot_start(){ if(_running) { LOG << "It's already running!!!"; return; } _running = true; _pTS7Server = new TS7Server();}void PlcServerManager::slot_stop(){ if(!_running) { LOG << "It's not running!!!"; return; } if(_pTS7Server) { _running = false; _pTS7Server->Stop(); delete _pTS7Server; _pTS7Server = 0; }}void PlcServerManager::slot_listen(QString ip){ if(!_running) { LOG << "It's not running!!!"; return; } if(_listen) { LOG << "It's already listen!!!"; return; } _ip = ip; _pTS7Server->SetEventsCallback(PlcServerManager::callBack_event, 0); _pTS7Server->StartTo(_ip.toUtf8().data()); _listen = true; emit signal_listenStateChanged(_listen);}void PlcServerManager::slot_stopListen(){ if(!_running) { LOG << "It's not running!!!"; return; } LOG << _pTS7Server->Stop(); _listen = false; emit signal_listenStateChanged(_listen);}void PlcServerManager::slot_regsiterDB(int dbNum, int size){ if(!_running) { LOG << "It's not running!!!"; return; } QByteArray byteArray(size, 0x00); _hashDB2ByteArray.insert(dbNum, byteArray); _pTS7Server->RegisterArea(srvAreaDB, dbNum, _hashDB2ByteArray[dbNum].data(), byteArray.size());}void PlcServerManager::slot_setDB(int dbNum, QByteArray data){ if(!_running) { LOG << "It's not running!!!"; return; } if(_hashDB2ByteArray.contains(dbNum)) { for(int index = 0; index < data.size(); index++) { _hashDB2ByteArray[dbNum][index] = data.at(index); } LOG << _hashDB2ByteArray.value(dbNum).toHex(' '); }}
若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/110071837