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