189 lines
7.5 KiB
C++
189 lines
7.5 KiB
C++
#ifndef Logic_myiothread_H
|
|
#define Logic_myiothread_H
|
|
|
|
#include <QMap>
|
|
#include <QSet>
|
|
#include <QTimer>
|
|
|
|
#include "Logic_camera_thread.h"
|
|
|
|
#pragma execution_character_set("utf-8")
|
|
|
|
//extern QList<Logic_camera_thread*> camerathreadlist;
|
|
extern bool Tcp_Connect_Status;
|
|
|
|
|
|
// 信号触发包
|
|
typedef struct
|
|
{
|
|
int trigger_reentry_signal; // 触发信号防重入
|
|
QString clear_camera_startpos_flag; // 是否是清除当前点位的信号
|
|
QString trigger_signal_condition = ""; // 算法需要用到触发信号,作为执行条件
|
|
QJsonArray read_clear_plc_startpos_array;
|
|
QJsonArray clear_plc_data_msg_array;
|
|
QVector<QString> vector_trigger_feedback_signal; // 反馈信号
|
|
QVector<QString> vector_camera; // 存储触发相机的名称容器
|
|
|
|
QString trigger_getImgNum = "";
|
|
QString m_startpos = "";
|
|
int sleep_time = 10;//
|
|
}trigger_signal_pack;
|
|
|
|
// 运行并检查相机是否取图完成的线程
|
|
// 一个信号取多张的情况,取图时间长,和通信线程分开。
|
|
class runAndCheck_cameraThread : public QThread
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
explicit runAndCheck_cameraThread(QObject* parent = nullptr);
|
|
~runAndCheck_cameraThread();
|
|
void run();
|
|
void setRunFlag(bool flag) { runflag = flag; }
|
|
void run_camera_module(QStringList cameraKeyS_runNumS);
|
|
QByteArray checkCamerasFinish_feedbackSignal(trigger_signal_pack pack);
|
|
|
|
//工站的相机线程列表;获取到拍照信号后,设置取图次数,Logic_camera_thread开线程运行
|
|
QList<Logic_camera_thread*> station_camerathreadlist;
|
|
bool runflag = true;
|
|
bool ifTaskDoneFlag = false; //是否检查任务完成标志(按照SN容器是否为空)
|
|
|
|
//要运行的相机key_取图次数
|
|
QQueue<QStringList> runCameraKey_num;
|
|
|
|
QMap<QString, trigger_signal_pack> map_trigger_signal_pack; // 相机信号触发包
|
|
|
|
//相机拍照完成检查包
|
|
QQueue< trigger_signal_pack> check_pack;
|
|
QMutex* commond_pack_lock = new QMutex;
|
|
private:
|
|
QObject* read_obj;
|
|
QMap<QString, int> Map_getImageNum;
|
|
std::vector<cv::Mat> vec_mat; //无数据,拿来充函数的参数
|
|
};
|
|
|
|
// IO线程
|
|
class Logic_myiothread : public QThread
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
explicit Logic_myiothread(QObject* parent = nullptr);
|
|
~Logic_myiothread();
|
|
void run();
|
|
void setCommunicationPtr(Base* finsPtr){ finstcp_ptr = finsPtr; }
|
|
void setRunFlag(bool flag){ io_runflag = flag;}
|
|
void setIOMutex(QMutex * iomutex, QMutex* write_mutex);
|
|
void setReadAllCmd(QString cmd, QString restSignal, QString restSignalBack); // 设置 从起始位开始都读取的指令,示例:readAll_DM100_50
|
|
void setOverAllCmd(QString cmd, QString restSignal, QString programNum, QString restSignalBack,QString programNumBack);//设置全局指令
|
|
void setTriggerCmd(QJsonObject station_obj);
|
|
void readSnInfo(QVector<int>,QByteArray); // 从plc获取sn码信息
|
|
void readEmergencyStopSignal(QVector<int>); // 读取紧急停止信号
|
|
void checkReentrySign(QVector<int>); // 防重入检查标识符
|
|
void checkTriggerCamera(QVector<int>); // 触发相机检查
|
|
void clearPlcData(QVector<int>); // 清理plc中的数据
|
|
void reciveCommond();
|
|
void writeCommond();
|
|
void decodeCameraCMD(QByteArray byte);
|
|
void send_Result_TimeoutA();
|
|
void send_Result_TimeoutB();
|
|
QString getSn(QString errorinfo,QString area,QByteArray byte);
|
|
QString snHex(QString sn);
|
|
bool clearSnCameraAlgorithmData(int areaIndex,QJsonObject obj);
|
|
//void checkCamerasFinish_feedbackSignal(trigger_signal_pack pack,
|
|
// QString trigger_getImgNum,QString m_startpos, int sleep_time);
|
|
//void run_camera_module(QStringList cameraKey_runNum,QString trigger_signal);
|
|
|
|
|
|
void setStationKey(QString stationKey) { m_stationKey = stationKey; }
|
|
void setStationObject(QJsonObject camera_obj);
|
|
void setCommunication_Type(QString Type) { Communication_Type = Type; }
|
|
void set_camerathreadlist(QList<Logic_camera_thread*> camerathreadlist) {
|
|
m_runAndCheck_cameraThread->station_camerathreadlist = camerathreadlist;
|
|
}
|
|
void setheartCmd(QString heartCmd) { m_heartCmd = heartCmd; }
|
|
void setheartTime(QString heartTime)
|
|
{ m_heartTime = heartTime.toInt(); }
|
|
void setType(QString io_type) { m_IoType = io_type; }
|
|
|
|
/*void setMap_getImageflag(QString, int getImageNum);
|
|
int getMap_getImageflag(QString m_name);*/
|
|
//工站根据信号运行的算法,对应的条件判断列表
|
|
QList<Logic_hdataintegration*> station_trigger_signal_dataIntegrationThread_list;
|
|
// 触发算法检查
|
|
void checkTriggerAlgorithm(QVector<int>);
|
|
//运行算法对应的条件判断
|
|
void run_Algorithm_hdataintegration(QString trigger_signal_num);
|
|
void setSN_hdataintegration(QString read_sn_startpos, int index,QString sn_value);
|
|
QJsonObject loadJsonCfg(QString json_cfg_file_path);
|
|
bool initStationCameraAndAlgorithm();
|
|
bool initStationsModule(MyModule cameraOrAlgorithm_module);
|
|
QByteArray initCameraParam(QString key, QJsonArray array);
|
|
QList<Logic_taskthread*> station_task_thread_list;
|
|
// 工站结束校验(缺图重拍)
|
|
void checkEndSingnal(QVector<int>);
|
|
|
|
//返回的数据包
|
|
int dataPack_size();
|
|
dataPack getdataPack();
|
|
//项目通信流程,1简单流程,2标准流程;
|
|
int CommunicationProcessLevel = 0;
|
|
//发送的数据是否自动拼接PLC指令头
|
|
bool ifAddCmdHead = true;
|
|
QString CmdHeadShort = "write_short_";
|
|
QString CmdHeadString= "write_string_";
|
|
private:
|
|
QQueue<QByteArray> IoCommondPack; // 读取
|
|
bool emergency_stop_state = true;
|
|
int trigger_startpos = 0 ; // finstcp 触发的起始位置
|
|
bool io_runflag = true;
|
|
Base *finstcp_ptr = nullptr;
|
|
QObject *mm_obj = nullptr;
|
|
QMutex *m_iomutex = nullptr;
|
|
QMutex* write_data_mutex = nullptr;
|
|
QMutex* sendProcess_mutex = nullptr;
|
|
QString readAll_cmd = "";
|
|
QString rest_signal = nullptr;
|
|
QString rest_signal_back = nullptr;
|
|
QString program_Num = nullptr;
|
|
QString program_Num_back = nullptr;
|
|
QString m_stationName = nullptr;
|
|
QJsonArray m_cameralist;
|
|
QJsonArray m_algorithmlistArray;
|
|
std::vector<cv::Mat> vec_mat;
|
|
QMap<QString,QJsonArray> map_sn_area_array; // 站名_读取区域,存储sn的信息
|
|
QMap<QString,QString> map_camera_feedback_sleep_time; // 相机反馈延迟时间
|
|
QMap<QString, QString> map_algorithm_feedback_sleep_time; // 算法反馈延迟时间
|
|
QMap<QString, trigger_signal_pack> map_algorithm_trigger_signal_pack; // 算法信号触发包
|
|
QMap<QString,QVector<bool>> map_read_sn_reentry_vector_flag; // 读取sn码放重入标识符
|
|
int count = 0;
|
|
double A_time_Start = 0;
|
|
double B_time_Start = 0;
|
|
|
|
|
|
//IO通信类型
|
|
QString m_IoType = "";
|
|
//工站号
|
|
QString m_stationKey;
|
|
QString Communication_Type;
|
|
//工站的相机线程列表
|
|
//QList<Logic_camera_thread*> station_camerathreadlist;
|
|
|
|
//运行相机Logic_camera_thread取图及检查完成情况
|
|
runAndCheck_cameraThread* m_runAndCheck_cameraThread;
|
|
|
|
//心跳指令
|
|
QString m_heartCmd;
|
|
//心跳时间
|
|
int m_heartTime;
|
|
|
|
//QFuture<void> mufuture;
|
|
QMap<QString, QJsonObject> map_endSingnal_backObj; //工站结束效验信号(重拍),工站结束效验信号-回复obj
|
|
|
|
QQueue< dataPack> sendProcessTask;
|
|
QByteArray readsnByte ;
|
|
QVector<int> vec_value;
|
|
signals:
|
|
};
|
|
|
|
|
|
#endif // Logic_myiothread_H
|