#ifndef Logic_myiothread_H #define Logic_myiothread_H #include #include #include #include "Logic_camera_thread.h" #pragma execution_character_set("utf-8") //extern QList 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 vector_trigger_feedback_signal; // 反馈信号 QVector 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 station_camerathreadlist; bool runflag = true; bool ifTaskDoneFlag = false; //是否检查任务完成标志(按照SN容器是否为空) //要运行的相机key_取图次数 QQueue runCameraKey_num; QMap map_trigger_signal_pack; // 相机信号触发包 //相机拍照完成检查包 QQueue< trigger_signal_pack> check_pack; QMutex* commond_pack_lock = new QMutex; private: QObject* read_obj; QMap Map_getImageNum; std::vector 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,QByteArray); // 从plc获取sn码信息 void readEmergencyStopSignal(QVector); // 读取紧急停止信号 void checkReentrySign(QVector); // 防重入检查标识符 void checkTriggerCamera(QVector); // 触发相机检查 void clearPlcData(QVector); // 清理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 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 station_trigger_signal_dataIntegrationThread_list; // 触发算法检查 void checkTriggerAlgorithm(QVector); //运行算法对应的条件判断 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 station_task_thread_list; // 工站结束校验(缺图重拍) void checkEndSingnal(QVector); //返回的数据包 int dataPack_size(); dataPack getdataPack(); //项目通信流程,1简单流程,2标准流程; int CommunicationProcessLevel = 0; //发送的数据是否自动拼接PLC指令头 bool ifAddCmdHead = true; QString CmdHeadShort = "write_short_"; QString CmdHeadString= "write_string_"; private: QQueue 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 vec_mat; QMap map_sn_area_array; // 站名_读取区域,存储sn的信息 QMap map_camera_feedback_sleep_time; // 相机反馈延迟时间 QMap map_algorithm_feedback_sleep_time; // 算法反馈延迟时间 QMap map_algorithm_trigger_signal_pack; // 算法信号触发包 QMap> 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 station_camerathreadlist; //运行相机Logic_camera_thread取图及检查完成情况 runAndCheck_cameraThread* m_runAndCheck_cameraThread; //心跳指令 QString m_heartCmd; //心跳时间 int m_heartTime; //QFuture mufuture; QMap map_endSingnal_backObj; //工站结束效验信号(重拍),工站结束效验信号-回复obj QQueue< dataPack> sendProcessTask; QByteArray readsnByte ; QVector vec_value; signals: }; #endif // Logic_myiothread_H