Files
ds-628/BaseModules/Hd_LogicDll_module/Logic_myiothread.h
T
2024-10-11 10:07:08 +08:00

190 lines
7.6 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;
clock_t heart_start,heart_stop;
signals:
};
#endif // Logic_myiothread_H