若该文为原创文章,转载请注明原文出处
本文章博客地址: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