#include "gd_plc.h" GD_PLC::GD_PLC(QObject *parent , QString exePath) : QObject(parent),exePath(exePath) { my_thread = new QThread(); ClearSocket = NULL; ClearSocket = new QTcpSocket();//分配空间,指定父对象 IsPLCConnectedSuccess = false; IsWorking = false; IsFirstRec=true; connect(ClearSocket, SIGNAL(readyRead()), //接受来自组件的信息 this, SLOT(HandleDate())); connect(this, SIGNAL(ThreadSignal_TCP_Connect()), //TCP连接 this, SLOT(ThreadSlots_TCP_Connect())); connect(this, SIGNAL(ThreadSignal_TCP_SendDate(QString )), //TCP连接 this, SLOT(SendDate(QString ))); this->moveToThread(my_thread); ClearSocket->moveToThread(my_thread); my_thread->start(); //启动线程 //QProcess::startDetached("C:/Users/Clear/Desktop/clear_hik_cam_win/build-clear_hik_cam_win-Desktop_Qt_5_14_2_MinGW_64_bit-Release/release/clear_hik_cam_win.exe",QStringList()); QStringList strList = exePath.split("/"); strList.removeLast(); QString workingDirectory = strList.join("/"); QProcess::startDetached(exePath,QStringList(),workingDirectory); emit ThreadSignal_TCP_Connect(); } GD_PLC::~GD_PLC() { ClearSocket->disconnectFromHost(); ClearSocket->close();//这里释放连接,前面connect的时候会建立连接 } void GD_PLC::HandleDate() { QString data = ClearSocket->readAll(); QJsonParseError parseJsonErr; QJsonDocument document = QJsonDocument::fromJson(data.toUtf8(),&parseJsonErr); if(!(parseJsonErr.error == QJsonParseError::NoError)) return; QJsonObject jsonObject = document.object(); if(data.contains("IsPLCConnectedSuccess"))//状态信息 { if(IsFirstRec)//第一次收到信息 { IsFirstRec = false; this->CommonFunction(4);//隐藏UI UpdateStatus(IsPLCConnectedSuccess,IsWorking);//向主线程更新状态 } if((IsPLCConnectedSuccess!=jsonObject["IsPLCConnectedSuccess"].toBool()) || (IsWorking!=jsonObject["IsWorking"].toBool()) ) //状态信息有变动 { IsPLCConnectedSuccess = jsonObject["IsPLCConnectedSuccess"].toBool(); IsWorking = jsonObject["IsWorking"].toBool(); UpdateStatus(IsPLCConnectedSuccess,IsWorking);//向主线程更新状态 } } else if(data.contains("key_point_cmd"))//VLP关键点 { QString cmd = jsonObject["key_point_cmd"].toString(); emit key_point_cmd(cmd); } else if(data.contains("plc_task_state"))//PLC 运行任务状态 { QString state = jsonObject["plc_task_state"].toString(); emit Log("PLC",state); if(state.contains("finished")) { emit plc_task_state("finished"); } } } void GD_PLC::SendDate(QString date) { mutex.lock(); QByteArray SendBytes =date.toLatin1(); ClearSocket->write(SendBytes); mutex.unlock(); } void GD_PLC::CommonFunction(int FunctionCode)// 4隐藏 5显示 6重启组件 { QString CMD; switch (FunctionCode) { // case 1: // CMD = "{ \"Connet\":true }";break; // case 2: // CMD = "{ \"Connet\":false }";break; // case 3: // CMD = "{ \"Calibrate\":true }";break; case 4: CMD = "{\"UI\":\"hide\"}"; IsHide =true; break; case 5: CMD = "{\"UI\":\"show\"}"; IsHide =false; break; case 6: CMD = "{\"UI\":\"reboot\"}";break; default : break; } if(ClearSocket->isOpen()) { emit ThreadSignal_TCP_SendDate(CMD); } } void GD_PLC::Run_CMD(int cmd)//-1 停止 1-运行 0-无操作 { QString CMD ="{\"Run\":" ; CMD = CMD + QString::number(cmd); CMD = CMD +"}"; emit ThreadSignal_TCP_SendDate(CMD); }