Files
2024-10-11 10:07:08 +08:00

1772 lines
80 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "Logic_myiothread.h"
//QString trigger_signal_condition_name = "";
//QMutex *commond_pack_lock = new QMutex;
static int startSign[4] = { 0 };
Logic_myiothread::Logic_myiothread(QObject* parent) :mm_obj(parent)
{
//setImageflag_lock = new QMutex;
sendProcess_mutex=new QMutex;
m_runAndCheck_cameraThread = new runAndCheck_cameraThread;
}
Logic_myiothread::~Logic_myiothread()
{
//退出线程
io_runflag = false;
m_runAndCheck_cameraThread->runflag = false;
Sleep(100);
if (m_runAndCheck_cameraThread) {
m_runAndCheck_cameraThread->deleteLater();
m_runAndCheck_cameraThread = nullptr;
}
wait(100);
exit();
qDebug() << __FUNCTION__ << " line:" << __LINE__ << " ~Logic_myiothread success! ";
}
//设置批量读指令
void Logic_myiothread::setReadAllCmd(QString cmd,QString restSignal, QString restSignalBack)
{
readAll_cmd = cmd;
QString startpos = cmd.split("_")[2].mid(1,cmd.split("_")[2].length()-1);
if(startpos.isEmpty())
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " startpos is null! ";
return;
}
trigger_startpos = startpos.toInt();
if(!restSignal.isEmpty())
rest_signal = restSignal;
if (!restSignalBack.isEmpty())
rest_signal_back = restSignalBack;
}
//设置全局指令
void Logic_myiothread::setOverAllCmd(QString cmd, QString restSignal, QString programNum, QString restSignalBack, QString programNumBack)
{
readAll_cmd = cmd;
QString startpos = cmd.split("_")[2].mid(1, cmd.split("_")[2].length() - 1);
if (startpos.isEmpty())
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " startpos is null! ";
return;
}
trigger_startpos = startpos.toInt();
if (!restSignal.isEmpty())
rest_signal = restSignal;
if (!restSignalBack.isEmpty())
rest_signal_back = restSignalBack;
if (!programNumBack.isEmpty())
program_Num_back = programNumBack;
if (!programNum.isEmpty())
program_Num = programNum;
}
void Logic_myiothread::setIOMutex(QMutex* iomutex, QMutex* write_mutex)
{
m_iomutex = iomutex; //通信模块只一个,所有IO线程用同一个锁
write_data_mutex = write_mutex;//Logic_taskthread检测完成后,需要发数据给PLC,数据存入容器,写入、取出加锁
}
//设置触发指令
void Logic_myiothread::setTriggerCmd(QJsonObject station_obj)
{
QVector<QString> camera_trigger_cmds;
{
//QJsonObject station_obj = stationlist.at(i).toObject();
QString station_name = station_obj.value("工站名").toString();
m_stationName = station_obj.value("工站名").toString();
QJsonArray cameramodulelist = station_obj.value("相机模块列表").toArray();
m_cameralist = cameramodulelist;
for (int val = 0; val < cameramodulelist.size(); val++)
{
QJsonObject m_obj = cameramodulelist.at(val).toObject();
QString trigger_camera_name = m_obj.value("相机key").toString();
QString clear_camera_startpos_flag = m_obj.value("拍照信号-收到后-写值").toString();
//相机开始信号
QJsonArray trigger_camera_startpos_array = m_obj.value("拍照信号-拍照张数-列表").toArray();
QJsonArray plc_feedback_msg_array = m_obj.value("拍照信号-完成写入PLC-列表").toArray();
QString feedback_sleep_time = m_obj.value("拍照信号-检查完成的时间").toString();
QStringList m_feedback_list;
for (auto yyy = 0; yyy < plc_feedback_msg_array.size(); yyy++)
{
m_feedback_list.push_back(plc_feedback_msg_array.at(yyy).toString());
}
// 添加相机反馈延迟时间
if (!feedback_sleep_time.isEmpty())
map_camera_feedback_sleep_time.insert(trigger_camera_name, feedback_sleep_time);
for (int val = 0; val < trigger_camera_startpos_array.size(); val++)
{
//开始的触发信号
QString trigger_signal = trigger_camera_startpos_array.at(val).toString();
if (m_runAndCheck_cameraThread->map_trigger_signal_pack.keys().contains(trigger_signal))
{
trigger_signal_pack m_pack = m_runAndCheck_cameraThread->map_trigger_signal_pack.value(trigger_signal);
m_pack.vector_camera.push_back(trigger_camera_name);
m_runAndCheck_cameraThread->map_trigger_signal_pack.insert(trigger_signal, m_pack); // 替换
}
else
{
trigger_signal_pack m_pack; // 创建
foreach(QString value, m_feedback_list)
{
QString check_trigger_signal = trigger_signal.split("_")[0];
if (value.contains(check_trigger_signal))
{
//反馈信号
m_pack.vector_trigger_feedback_signal.push_back(value);
break;
}
}
m_pack.trigger_reentry_signal = 0; // 初始化
//清理开始信号标志,true写0
m_pack.clear_camera_startpos_flag = clear_camera_startpos_flag;
m_pack.vector_camera.push_back(trigger_camera_name);
m_runAndCheck_cameraThread->map_trigger_signal_pack.insert(trigger_signal, m_pack);
}
}
}
//算法的通信内容
QJsonArray algorithmlist = station_obj.value("算法列表").toArray();
m_algorithmlistArray = algorithmlist;
for (int val = 0; val < algorithmlist.size(); val++)
{
QJsonObject m_obj = algorithmlist.at(val).toObject();
QString trigger_algorithm_name = m_obj.value("算法名称").toString();
for (int i = 0; i < station_trigger_signal_dataIntegrationThread_list.size(); i++)
{
if (station_trigger_signal_dataIntegrationThread_list[i]->m_algorithmKey == trigger_algorithm_name)
{
trigger_signal_pack m_pack;
m_pack.trigger_reentry_signal = 0; // 初始化
QString trigger_signal = station_trigger_signal_dataIntegrationThread_list[i]->m_trigger_signal;
QString trigger_feedback_signal = station_trigger_signal_dataIntegrationThread_list[i]->m_trigger_back_signal;
if (map_algorithm_trigger_signal_pack.keys().contains(trigger_signal))
m_pack = map_algorithm_trigger_signal_pack.value(trigger_signal);
m_pack.vector_trigger_feedback_signal.push_back(trigger_feedback_signal);
m_pack.vector_camera.push_back(trigger_algorithm_name);
map_algorithm_trigger_signal_pack.insert(trigger_signal, m_pack);
}
}
if (m_obj.value("SN设置").toObject().value("汇总-是否删除SN容器首数据").toString() == "true")
m_runAndCheck_cameraThread->ifTaskDoneFlag = true;
}
QJsonArray sn_array = station_obj.value("SN流程列表").toArray();
if (!sn_array.isEmpty())
{
QVector<bool> vector_flag;
for (int iiiii = 0; iiiii < sn_array.size(); iiiii++)
{
vector_flag.append(false);
}
map_sn_area_array.insert(station_name, sn_array);
map_read_sn_reentry_vector_flag.insert(station_name, vector_flag);
}
if(!station_obj.value("工站结束效验信号(缺图重拍)").toString().isEmpty())
map_endSingnal_backObj.insert(station_obj.value("工站结束效验信号(缺图重拍)").toString(), station_obj.value("工站结束效验信号-回复").toObject());
}
}
void Logic_myiothread::run()
{
// 运行并检查相机是否取图完成的线程
// 一个信号取多张的情况,取图时间长,和通信线程分开。
m_runAndCheck_cameraThread->start();
int times = 0;
heart_start = clock();
while ( io_runflag )
{
//心跳(定时向PLC的指定寄存器写入值)代码。
if (m_IoType.contains("Heart"))
{
//break;
//times++;
QStringList m_heartCmdList = m_heartCmd.split("#");
for (int m = 0; m < m_heartCmdList.size(); m++)
{
Sleep(10);
qApp->processEvents();
heart_stop = clock();
//if ((m_heartTime / 10) <= times++)
if (heart_stop - heart_start >= m_heartTime)
{
heart_start = clock();
if (!m_heartCmdList[m].isEmpty())
{// 发送心跳
////QMutexLocker locker(m_iomutex);;
QByteArray byte = m_heartCmdList[m].toUtf8(); // 设置 从起始位开始读取的指令
if (!finstcp_ptr->writeData(vec_mat, byte))
{
qCritical() << __FUNCTION__ << "line:" << __LINE__ << " finstcp_ptr reciveData error!";
}
times = 0;
}
}
else
{
if (!rest_signal.isEmpty())
{
if (times % int(m_heartTime / 50 + 1) == 0)
{
// 修改读取多个命令
//QMutexLocker locker(m_iomutex);;
QByteArray byte = readAll_cmd.toUtf8(); // 设置 从起始位开始读取的指令
if (!finstcp_ptr->writeData(vec_mat, byte))
{
qCritical() << __FUNCTION__ << "line:" << __LINE__ << " finstcp_ptr reciveData error!";
}
// 读取到的信息解析
QByteArray readByte;
if (!finstcp_ptr->readData(vec_mat, readByte))
{
qCritical() << __FUNCTION__ << "line:" << __LINE__ << " finstcp_ptr sendData error!";
}
if (readByte.isEmpty())
return;
QByteArray readsnByte = readByte;
QVector<int> vec_value;
while (!readByte.isEmpty())
{
QByteArray retByte = readByte.mid(0, 2);
readByte.remove(0, 2);
QString msg = retByte.toHex();
int number_tmp = msg.toInt(NULL, 16);
vec_value.push_back(number_tmp);
}
QString m_startpos = rest_signal.split("_")[0];
QString m_value = rest_signal.split("_")[1];
int trigger_index = m_startpos.mid(1, m_startpos.length() - 1).toInt();
trigger_index -= trigger_startpos;
if (trigger_index < 0)
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " vec_value is error! read_sn_startpos:" << m_startpos;
}
else if (vec_value.size() > trigger_index)
{
//读复位标志满足
if (vec_value.at(trigger_index) == m_value.toInt())
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " 复位信号:" << rest_signal;
foreach(QString m_station_name, station_list.keys())
for (int i = 0; i < station_list.value(m_station_name)->sndata_list.size(); i++)
{
QStringList cameraList;
cameraList.append("all");
for (int i = 0; i < 10; i++)
station_list.value(m_station_name)->clearData("all", cameraList);
}
//完成清标志
QByteArray send_byte = rest_signal_back.toUtf8();
if (!finstcp_ptr->writeData(vec_mat, send_byte))
{
qCritical() << __FUNCTION__ << "line:" << __LINE__ << " finstcp_ptr reciveData error! ";
return;
}
}
}
//程序号;传到到主界面类,再进行切换
if (!program_Num.isEmpty())
{
QString m_startpos = program_Num;// .split("_")[0];
//QString m_value = program_Num.split("_")[1];
int trigger_index = m_startpos.mid(1, m_startpos.length() - 1).toInt();
trigger_index -= trigger_startpos;
if (trigger_index < 0)
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " vec_value is error! read_sn_startpos:" << m_startpos;
}
else if (vec_value.size() > trigger_index)
{
//读复位标志满足
if (vec_value.at(trigger_index) != 0)
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " 程序号:" << vec_value.at(trigger_index);
dataPack m_data;
m_data.algorithmName = "程序号";
m_data.cameraName = m_startpos;
m_data.byteArray = QByteArray::number(vec_value.at(trigger_index));
m_data.retFlag = "algorithm";
QMutexLocker locker(sendProcess_mutex);
sendProcessTask.enqueue(m_data);
//完成清标志
QByteArray send_byte = program_Num_back.toUtf8();
if (!finstcp_ptr->writeData(vec_mat, send_byte))
{
qCritical() << __FUNCTION__ << "line:" << __LINE__ << " finstcp_ptr reciveData error! ";
return;
}
}
}
}
}
}
}
}
// 写入
writeCommond();
}
else
{
// 读取
reciveCommond();
for (int s = 0; s < 5; s++)
{
Sleep(1);
qApp->processEvents();
}
//Sleep(20);
}
}
}
// 写入数据
void Logic_myiothread::writeCommond()
{
if (writeCommondPack.isEmpty())
return;
//多线程也行
//要先加锁,不加锁会访问冲突
QMutexLocker locker(write_data_mutex);
while( !writeCommondPack.isEmpty() )
{
//QMutexLocker locker(m_iomutex);;
QByteArray write_byte = writeCommondPack.dequeue();
if ( !finstcp_ptr->writeData(vec_mat,write_byte) )
{
qCritical() << __FUNCTION__ << "line:"<< __LINE__ << " finstcp_ptr reciveData error!";
return;
}
}
}
void Logic_myiothread::reciveCommond()
{
//QString tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss-zzz");
//qDebug() << __FUNCTION__ << " line: " << __LINE__ << " readAll_cmd: " << readAll_cmd <<" " << tmpDate;
clock_t start, stop;
start = clock();
// 修改读取多个命令
//QMutexLocker locker ( m_iomutex );
m_iomutex->lock();
QByteArray byte = readAll_cmd.toUtf8(); // 设置 从起始位开始读取的指令
if ( !finstcp_ptr->writeData(vec_mat,byte) )
{
qCritical() << __FUNCTION__ << "line:"<< __LINE__ << " finstcp_ptr reciveData error!";
}
// 读取到的信息解析
QByteArray readByte;
if ( !finstcp_ptr->readData(vec_mat,readByte) )
{
qCritical() << __FUNCTION__ << "line:"<< __LINE__ << " finstcp_ptr sendData error!";
}
m_iomutex->unlock();
stop = clock();
double ctime = stop - start;
//if (ctime > 500)
//qCritical() << __FUNCTION__ << __LINE__ << "readAll_cmd ctime :" << ctime<<" m_stationName:"<<m_stationName;//;127ms
// tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss-zzz");
//qDebug() << __FUNCTION__ << " line: " << __LINE__ << " readAll_cmd done: " << readAll_cmd << " " << tmpDate;
decodeCameraCMD ( readByte );
}
// 读取多个命令信息的解析
void Logic_myiothread::decodeCameraCMD(QByteArray byte)
{
if (byte.isEmpty())
return;
readsnByte = byte;
vec_value.clear();
while ( !byte.isEmpty() )
{
QByteArray retByte = byte.mid(0,2);
byte.remove(0,2);
QString msg = retByte.toHex();
int number_tmp = msg.toInt(NULL,16);
vec_value.push_back(number_tmp);
}
// 读取sn数据
readSnInfo(vec_value, readsnByte);
// 读取紧急停止信号
//931/949-5-2,读急停信号
//readEmergencyStopSignal(vec_value);
// 防重入检查标识符
checkReentrySign(vec_value);
// 触发相机拍照信息检查
checkTriggerCamera(vec_value);
//Sleep(100);
//触发算法检查
checkTriggerAlgorithm(vec_value);
// 工站结束校验(缺图重拍使用)
checkEndSingnal(vec_value);
}
//SN逻辑
// "读SN信号"满足时,代表新料来了,安装"清理容器数据"-"相机列表"及"通道序号"清理对应的容器;
//SN保存到容器HSnData;下料的SN,根据"汇总-触发信号"、"汇总-读哪个SN"匹配Logic_hdataintegration,并保存SN到变量;
void Logic_myiothread::readSnInfo(QVector<int> vec_value, QByteArray byte)
{
QStringList keys = map_sn_area_array.keys();
//重新加载用
//bool ifinitSCA = false;
for (auto vvv = 0; vvv < keys.size(); vvv++)
{
QString station_name = keys[vvv];
QJsonArray sn_area_array = map_sn_area_array.value(station_name);//station_name应该是 this->m_stationKey
for ( int snsn = 0; snsn < sn_area_array.size(); snsn++ )
{
QJsonObject obj = sn_area_array.at(snsn).toObject();
QJsonObject clearData = obj.value("清理容器数据").toObject();
QJsonArray clera_cameraList = clearData.value("相机列表").toArray();
int channel_index = 0;
channel_index= clearData.value("通道序号").toString().toInt();
HSnData* m_sndata = station_list.value(station_name)->getSnInfoData(channel_index);
m_sndata->stationName = station_name;
if (m_sndata == nullptr)
{
continue;
}
//流程开始信号
QString read_sn_startpos = obj.value("读SN信号").toString();
if (!read_sn_startpos.isEmpty())
{
QString m_startpos = read_sn_startpos.split("_")[0];
QString m_value = read_sn_startpos.split("_")[1];
int trigger_index = m_startpos.mid(1, m_startpos.length() - 1).toInt();
trigger_index -= trigger_startpos;
if (trigger_index < 0)
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " vec_value is error! read_sn_startpos:" << m_startpos;
}
else if (vec_value.size() > trigger_index)
{
//读SN标志满足read_sn_startpos
if (vec_value.at(trigger_index) == m_value.toInt())
{
if (clera_cameraList.size() > 0) //清理时检查完成标志
{
//初始为true
if (m_runAndCheck_cameraThread->ifTaskDoneFlag == true)//是否检查任务完成标志(按照SN容器是否为空)
{
if (m_sndata->getTaskDoneFlag() == true)
{
// 所有相机线程的snIndex减一?没什么用?
for (int i = 0; i < m_runAndCheck_cameraThread->station_camerathreadlist.size(); i++)
{
m_runAndCheck_cameraThread->station_camerathreadlist.at(i)->degressSnIndex();
}
m_sndata->setTaskDoneFlag(false);
//HCameraData的m_index
}
else
{
QString tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss-zzz");
if (m_runAndCheck_cameraThread->station_camerathreadlist.size() > 0)
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " getTaskDoneFlag false !! 任务堆积风险,逻辑可能异常 "
<< tmpDate << " m_startpos::" << m_startpos << " at(0)m_stationName:" << m_runAndCheck_cameraThread->station_camerathreadlist.at(0)->m_stationName
<< " at(0)m_name:" << m_runAndCheck_cameraThread->station_camerathreadlist.at(0)->m_name;
}
}
}
// sn码防重入检查
QVector<bool> m_vec_sn_flag = map_read_sn_reentry_vector_flag.value(station_name);
//if (m_vec_sn_flag.at(channel_index)) // false 添加sn码 true 已经添加过sn,不再重复添加
//{
// // 清理当前sn码的触发信号
// QString m_signal = "write_short_" + m_startpos + "_0";
// QByteArray m_byte = m_signal.toUtf8();
// //QMutexLocker locker(m_iomutex);;
// if (!finstcp_ptr->writeData(vec_mat, m_byte))
// {
// qCritical() << __FUNCTION__ << " line:" << __LINE__ << " finstcp_ptr reciveData error! ";
// return;
// }
// continue;
//}
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " m_vec_sn_flag:" << m_vec_sn_flag.at(channel_index);
//相机列表
QStringList clearCameraList;
QJsonObject clear_obj = obj.value("清理容器数据").toObject();
for (int cl = 0; cl < clera_cameraList.size(); cl++)
{
QString cameraKey = clera_cameraList[cl].toString();
clearCameraList.append(cameraKey);
for (int ca = 0; ca < camerathreadlist.size(); ca++)
if (camerathreadlist[ca]->m_name == cameraKey)
{
QByteArray restCamera = "rest_newProductIn";//新产品进入,需清理相机模块的计数
camerathreadlist[ca]->set_m_stoprun(true);
camerathreadlist[ca]->m_Module.module_ptr->writeData(vec_mat, restCamera);
}
}
for (int i = 0; i < m_runAndCheck_cameraThread->station_camerathreadlist.size(); i++)
if (m_runAndCheck_cameraThread->station_camerathreadlist[i]->SN_signalList.contains(read_sn_startpos))
m_runAndCheck_cameraThread->station_camerathreadlist.at(i)->SN_signal = read_sn_startpos;
//软件汇总有问题,不能清理检测的结果数据?
// 清理sn、相机和算法数据
//新料来了,清容器数据;
//根据项目情况,考虑是否清检测容器数据。清,偶尔检测超时,数据缺失;不清,连续检测超时,内存溢出;默认不清,内存溢出现象容易排查。
if (clera_cameraList.size() > 0 && clearCameraList.size()>0)
{
//qCritical() << __FUNCTION__ << " line:" << __LINE__ << " clearData:" << channel_index;
station_list.value(station_name)->clearData(QString::number(channel_index), clearCameraList);
}
////重新加载并传参数到相机、算法
//if (ifinitSCA == false)
//{
// //不能开线程去传参数
// //QFuture<bool> SCAfuture= QtConcurrent::run(this, &Logic_myiothread::initStationCameraAndAlgorithm);
// initStationCameraAndAlgorithm();
// ifinitSCA = true;
//}
//SN必须正常,且不和上次相同。
QString read_sn_error_send_format = obj.value("读SN异常-插值").toString();
//读时间戳
QVector<QString> datatime_vector;
QJsonArray read_datatime_list = obj.value("读时间戳-寄存器列表").toArray();
QJsonArray write_datatime_list = obj.value("写时间戳-寄存器列表").toArray();
if (read_datatime_list.size() > 0)
{
for (int aaa = 0; aaa < read_datatime_list.size(); aaa++)
{
//SN为""时,返回配置文件的read_sn_error_send_format值
QString datatime = getSn(read_sn_error_send_format, read_datatime_list[aaa].toString(), byte);
qDebug() << __FUNCTION__ << " line: " << __LINE__ << " channel_index: " << channel_index << " read_datatime_list: " << datatime;
//sn_value = snHex(sn_value); // sn方向相反,重新做转换
//异常
if (datatime == read_sn_error_send_format)
datatime = "errDataTime";// datatime = QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss-zzz");
datatime_vector.append(datatime);
}
// 清理当前区域数据
QString clear_datatime = obj.value("读时间戳后-清0").toString();//"write_short_0"
if (!clear_datatime.isEmpty())
{
QStringList mycmdHead = clear_datatime.split("_");
for (int aaa = 0; aaa < read_datatime_list.size(); aaa++)
{
QString datatime_area = read_datatime_list.at(aaa).toString();
QString start_pos = datatime_area.split("_")[0];
int lenght = datatime_area.split("_")[1].toInt();
QString m_signal = nullptr;
for (auto yyy = 0; yyy < (lenght + 1) /2; yyy++)
{
m_signal += mycmdHead[2];
if (yyy != ((lenght + 1) / 2 - 1))
m_signal += ",";
}
m_signal = mycmdHead[0]+"_"+ mycmdHead[1]+"_" + start_pos + "_" + m_signal;// QString("write_short_%1_%2").arg(start_pos).arg(m_signal);
QByteArray m_byte = m_signal.toUtf8();
//QMutexLocker locker(m_iomutex);;
if (!finstcp_ptr->writeData(vec_mat, m_byte))
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " finstcp_ptr reciveData error! ";
return;
}
}
}
}
else if (write_datatime_list.size() > 0)
{
for (int aaa = 0; aaa < write_datatime_list.size(); aaa++)
{
QString tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss-zzz");
qDebug() << __FUNCTION__ << " line: " << __LINE__ << " channel_index: " << channel_index << " write_datatime_list: " << tmpDate;
//sn_value = snHex(sn_value); // sn方向相反,重新做转换
datatime_vector.append(tmpDate);
//发给PLC:
QString datatime_area = write_datatime_list.at(aaa).toString(); // "write_string_D3200_24"
QStringList mycmdHead = datatime_area.split("_");
QString start_pos = mycmdHead[2];
int lenght = mycmdHead[3].toInt();
if (tmpDate.size() % 2 == 1)tmpDate += "0";
QString m_signal = tmpDate; //= snHex(tmpDate);
m_signal = mycmdHead[0]+"_"+ mycmdHead[1]+"_" + start_pos + "_" + m_signal;// QString("write_string_%1_%2").arg(start_pos).arg(m_signal);
QByteArray m_byte = m_signal.toUtf8();
//QMutexLocker locker(m_iomutex);;
if (!finstcp_ptr->writeData(vec_mat, m_byte))
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " finstcp_ptr reciveData error! ";
return;
}
}
}
bool ifReadSnErr = false;
QJsonArray read_sn_list = obj.value("读SN寄存器列表").toArray(); // 读取sn
QVector<QString> sn_vector;
for (int aaa = 0; aaa < read_sn_list.size(); aaa++)
{
//SN为""时,返回配置文件的read_sn_error_send_format值
QString sn_value = getSn(read_sn_error_send_format, read_sn_list[aaa].toString(), byte);
qDebug() << __FUNCTION__ << " line: " << __LINE__ << " channel_index: " << channel_index << " sn_value: " << sn_value;
//sn_value = snHex(sn_value); // sn方向相反,重新做转换
//异常
if (sn_value == read_sn_error_send_format)
{
sn_value = "errSN";// += "_" + read_sn_startpos;
ifReadSnErr = true;
}
if (datatime_vector.size() > 0)
{
if (datatime_vector.size() == read_sn_list.size())
sn_value = sn_value + "_" + datatime_vector[aaa];
else sn_value = sn_value + "_" + datatime_vector[0];
}
sn_vector.append(sn_value);
//匹配dataIntegration,并写入SN_datatime到容器
if(station_trigger_signal_dataIntegrationThread_list.size()>0)
setSN_hdataintegration(read_sn_startpos, aaa, sn_value);
}
m_sndata->addSnVector(sn_vector);//跟上个SN做对比,不同则添加;连续SN异常的,是否考虑不对比。
// 更新sn码防重入标志
QVector<bool> vector_sn_flag = map_read_sn_reentry_vector_flag.value(station_name);
vector_sn_flag.replace(channel_index, true);
map_read_sn_reentry_vector_flag.insert(station_name, vector_sn_flag); // 替换sn码标识状态
//// 清理当前区域数据
//QString clear_SN = obj.value("读SN后-清0").toString();
//if (!clear_SN.isEmpty())
//{
// QStringList mycmdHead = clear_SN.split("_");
// for (int aaa = 0; aaa < read_sn_list.size(); aaa++)
// {
// QString sn_area = read_sn_list.at(aaa).toString();
// QString start_pos = sn_area.split("_")[0];
// int lenght = sn_area.split("_")[1].toInt();
// QString m_signal = nullptr;
// //SN清空
// for (auto yyy = 0; yyy < (lenght+1)/2; yyy++)
// {
// m_signal += mycmdHead[2];
// if (yyy != ((lenght + 1) / 2 - 1))
// m_signal += ",";
// }
// m_signal = mycmdHead[0] + "_" + mycmdHead[1] + "_" + start_pos + "_" + m_signal;// QString("write_short_%1_%2").arg(start_pos).arg(m_signal);
// QByteArray m_byte = m_signal.toUtf8();
// //QMutexLocker locker(m_iomutex);;
// if (!finstcp_ptr->writeData(vec_mat, m_byte))
// {
// qCritical() << __FUNCTION__ << " line:" << __LINE__ << " finstcp_ptr reciveData error! ";
// return;
// }
// }
//}
if (ifReadSnErr == true)
{
QStringList snOKCmdList = obj.value("读SN异常-回复指令").toString().split("#");
if (!snOKCmdList.isEmpty())
{
for (int s = 0; s < snOKCmdList.size(); s++)
{
//snOKCmd = CmdHeadShort + snOKCmd;
QByteArray ok_byte = snOKCmdList[s].toUtf8();
if (!finstcp_ptr->writeData(vec_mat, ok_byte))
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " finstcp_ptr reciveData error! ";
return;
}
}
}
}
else
{
QStringList snOKCmdList = obj.value("读SN正常-回复指令").toString().split("#");
if (!snOKCmdList.isEmpty())
{
for (int s = 0; s < snOKCmdList.size(); s++)
{
//snOKCmd = CmdHeadShort + snOKCmd;
QByteArray ok_byte = snOKCmdList[s].toUtf8();
if (!finstcp_ptr->writeData(vec_mat, ok_byte))
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " finstcp_ptr reciveData error! ";
return;
}
}
}
}
// 清理当前sn码的触发信号
QString m_signal = "write_short_" + m_startpos + "_0";
QByteArray m_byte = m_signal.toUtf8();
//QMutexLocker locker(m_iomutex);;
if (!finstcp_ptr->writeData(vec_mat, m_byte))
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " finstcp_ptr reciveData error! ";
return;
}
}
else if ( vec_value.at(trigger_index) == 0 ){ //读到PLC标志为0时
// 更改防重入标识符
QVector<bool> vector_sn_flag = map_read_sn_reentry_vector_flag.value(station_name);
vector_sn_flag.replace(channel_index, false);
map_read_sn_reentry_vector_flag.insert(station_name, vector_sn_flag); // 替换sn码标识状态
}
}
}
}
}
}
//下料的SN,根据"汇总-触发信号"、"汇总-读哪个SN"匹配Logic_hdataintegration,并保存SN到变量;
void Logic_myiothread::setSN_hdataintegration(QString read_sn_startpos, int index, QString sn_value)
{
//给算法sn
for (int da = 0; da < station_trigger_signal_dataIntegrationThread_list.size(); da++)
{
if (station_trigger_signal_dataIntegrationThread_list[da]->m_trigger_signal == read_sn_startpos)
{
QJsonObject sn_set = station_trigger_signal_dataIntegrationThread_list[da]->algorithmObject.value("SN设置").toObject();
//QString read_sn_area_index = sn_set.value("汇总-读哪个上料通道的SN").toString();
QString sn_key = sn_set.value("汇总-读哪个SN").toString();
if (sn_key.contains("sn"))
{
if (sn_key.split("sn")[1].toInt() == (index + 1))
{
station_trigger_signal_dataIntegrationThread_list[da]->SN_dataTime = sn_value;
QString sendBack = station_trigger_signal_dataIntegrationThread_list[da]->m_trigger_back_signal;//"汇总-回复信号"
if (sendBack.isEmpty())
continue;
//反馈信号
QString m_signal = sendBack;
QByteArray m_byte = m_signal.toLocal8Bit(); //toUtf8出现一次m_byte无法读取内存
//QMutexLocker locker(m_iomutex);;
if (!finstcp_ptr->writeData(vec_mat, m_byte))
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " finstcp_ptr reciveData error! ";
//return;
}
//Sleep(5);
}
}
}
}
}
//未使用
//根据配置文件clearData,清除相机图片容器内容
bool Logic_myiothread::clearSnCameraAlgorithmData(int areaIndex,QJsonObject obj)
{
if ( obj.isEmpty() )
{
return true;
}
if (m_stationName.isEmpty())
{
return true;
}
QString channel_index = obj.value("通道序号").toString();
QJsonArray cameralist = obj.value("相机列表").toArray();
QJsonArray algorithmlist = obj.value("算法列表").toArray();
QJsonArray algorithmexeclist = obj.value("算法数据容器列表").toArray();
if ( !cameralist.isEmpty() )
{
for (int ccc = 0; ccc < cameralist.size(); ccc++)
{
QString cameraName = cameralist.at(ccc).toString();
if (!cameraName.isEmpty())//.contains("camera"))// 如果用相机SN初始化;
{
if (channel_index.isEmpty())
{
station_list.value(m_stationName)->clearCameraData(cameraName,"");
}
else
{
station_list.value(m_stationName)->clearCameraData(cameraName,channel_index);
}
}
}
}
if ( !algorithmlist.isEmpty())
{
for (int aaa = 0; aaa < algorithmlist.size(); aaa++)
{
QString algorithmName = algorithmlist.at(aaa).toString();
if (algorithmName.contains("algorithm"))
{
station_list.value(m_stationName)->clearAlgorithmData(algorithmName);
}
}
}
if (!algorithmexeclist.isEmpty())
{
for (int aaa = 0; aaa < algorithmexeclist.size(); aaa++)
{
QString algorithmName = algorithmexeclist.at(aaa).toString();
if (algorithmName.contains("algorithm"))
{
station_list.value(m_stationName)->clearAlgorithmExecData(algorithmName);
}
}
}
// 清理sn码
//station_list.value(m_stationName)->clearSnData(areaIndex);
}
// sn方向相反,重新做转换
QString Logic_myiothread::snHex(QString sn)
{
QString resultStr = "";
if (sn.size() % 2 == 0)
{
for (int i = 0; i < sn.size() - 1; i = i + 2)
{
resultStr = resultStr + sn.at(i + 1) + sn.at(i);
}
}
else
{
for (int i = 0; i < sn.size() - 1; i = i + 2)
{
resultStr = resultStr + sn.at(i + 1) + sn.at(i);
}
resultStr.append(sn.at(sn.size() - 1));
}
return resultStr;
}
//SN为""时,返回配置文件的"读SN异常-插值"
QString Logic_myiothread::getSn(QString errorinfo,QString area,QByteArray byte)
{
QString m_startpos = area.split("_")[0];
QString lenght = area.split("_")[1];
int start_index = m_startpos.mid(1,m_startpos.length()-1).toInt();
start_index -= trigger_startpos;
QByteArray snByte = byte.mid(start_index*2,lenght.toInt());
QString sn = snByte;
if ( sn.contains("\n\r") )
sn.replace("\n\r", "");
if ( sn == "" )
{
return errorinfo;
}
return sn;
}
//931/949-5-2,读急停信号
//void Logic_myiothread::readEmergencyStopSignal(QVector<int> vec_value)
//{
// if (emergency_stop_signal.isEmpty())
// {
// //qWarning() << __FUNCTION__ << " LINE:" << __LINE__ << " emergency_stop_signal is null! ";
// return;
// }
// QString m_startpos = emergency_stop_signal.split("_")[0];
// QString m_value = emergency_stop_signal.split("_")[1];
// int trigger_index = m_startpos.mid(2, m_startpos.length() - 2).toInt();
// trigger_index -= trigger_startpos;
// if (trigger_index < 0){
// qCritical() << __FUNCTION__ << " line:" << __LINE__ << " value is error! m_startpos:" << m_startpos;
// }else if (vec_value.size() > trigger_index){
// if (vec_value.at(trigger_index) == m_value.toInt())
// {
// if (!emergency_stop_state)
// return;
// else
// {
// //修改报警、复位逻辑。。
//
// qDebug() << __FUNCTION__ << " LINE:" << __LINE__ << " emergency_stop_signal:" << emergency_stop_signal;
// B_time_Start = 0;
// A_time_Start = 0;
// QString m_signal = "write_DM3006_0";
// QByteArray m_byte = m_signal.toUtf8();
// if (!finstcp_ptr->writeData(vec_mat, m_byte))
// {
// qCritical() << __FUNCTION__ << " line:" << __LINE__ << " finstcp_ptr reciveData error! ";
// return;
// }
// m_signal = "write_DM3010_0";
// m_byte = m_signal.toUtf8();
// if (!finstcp_ptr->writeData(vec_mat, m_byte))
// {
// qCritical() << __FUNCTION__ << " line:" << __LINE__ << " finstcp_ptr reciveData error! ";
// return;
// }
// m_signal = "write_DM3056_0";
// m_byte = m_signal.toUtf8();
// if (!finstcp_ptr->writeData(vec_mat, m_byte))
// {
// qCritical() << __FUNCTION__ << " line:" << __LINE__ << " finstcp_ptr reciveData error! ";
// return;
// }
// m_signal = "write_DM3060_0";
// m_byte = m_signal.toUtf8();
// if (!finstcp_ptr->writeData(vec_mat, m_byte))
// {
// qCritical() << __FUNCTION__ << " line:" << __LINE__ << " finstcp_ptr reciveData error! ";
// return;
// }
// for (int vvv = 1; vvv < 7; vvv++)
// {
// QString algorithmName = QString("algorithm%1").arg(vvv);
// if (algorithmName.contains("algorithm"))
// {
// station_list.value(m_stationName)->clearAlgorithmData(algorithmName);
// }
// }
// station_list.value(m_stationName)->clearAlgorithmData("algorithm9");
// station_list.value(m_stationName)->clearAlgorithmData("algorithm10");
// station_list.value(m_stationName)->changeAlgorithmDataGetIndex("algorithm7",1);
// station_list.value(m_stationName)->changeAlgorithmDataGetIndex("algorithm8", 1);
// station_list.value(m_stationName)->getSnInfoData(0)->SetDeleteSnIndex(0);
// station_list.value(m_stationName)->getSnInfoData(1)->SetDeleteSnIndex(0);
// emergency_stop_state = false;
// }
//
// //// 先反馈信号,再清理
// //QString m_signal = "write_" + m_startpos + "_0";
// //QByteArray m_byte = m_signal.toUtf8();
// //if (!finstcp_ptr->writeData(vec_mat, m_byte))
// //{
// // qCritical() << __FUNCTION__ << " line:" << __LINE__ << " finstcp_ptr reciveData error! ";
// // return;
// //}
// //Sleep(10000);
// //QList<QString> keyList = station_list.keys();
// //for (int i = 0; i < keyList.size(); i++)
// //{
// // HStationData* stationPtr = station_list.value(keyList.at(i));
// // if (stationPtr)
// // {
// // stationPtr->clearData("");
// // }
// //}
// //qDebug() << __FUNCTION__ << " line:" << __LINE__ << " clear data success! ";
// }
// else
// {
// emergency_stop_state = true;
// }
// }
//}
//检查相机、算法信号重入
void Logic_myiothread::checkReentrySign(QVector<int> vec_value)
{
//检查相机信号重入
QStringList m_keys = m_runAndCheck_cameraThread->map_trigger_signal_pack.keys();
for( int i = 0; i < m_keys.size(); i++)
{
QString trigger_signal = m_keys.at(i);
QString m_startpos = trigger_signal.split("_")[0];
QString m_value = trigger_signal.split("_")[1];
int trigger_index = m_startpos.mid(1,m_startpos.length()-1).toInt();
trigger_index -= trigger_startpos;
if( trigger_index < 0 )
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " value is error! m_startpos:" << m_startpos;
}
else if( vec_value.size() > trigger_index )
{
trigger_signal_pack m_pack = m_runAndCheck_cameraThread->map_trigger_signal_pack.value(trigger_signal);
if ( vec_value.at(trigger_index) == 0 && m_pack.trigger_reentry_signal == 1 )
{
m_pack.trigger_reentry_signal = 0;
m_runAndCheck_cameraThread->map_trigger_signal_pack.insert(trigger_signal,m_pack); // 替换为0
}
}
}
//检查算法信号重入
//触发条件的
m_keys = map_algorithm_trigger_signal_pack.keys();
for (int i = 0; i < m_keys.size(); i++)
{
QString trigger_signal = m_keys.at(i);
QString m_startpos = trigger_signal.split("_")[0];
QString m_value = trigger_signal.split("_")[1];
int trigger_index = m_startpos.mid(1, m_startpos.length() - 1).toInt();
trigger_index -= trigger_startpos;
if (trigger_index < 0)
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " value is error! m_startpos:" << m_startpos;
}
else if (vec_value.size() > trigger_index)
{
trigger_signal_pack m_pack = map_algorithm_trigger_signal_pack.value(trigger_signal);
if (vec_value.at(trigger_index) == 0 && m_pack.trigger_reentry_signal == 1)
{
m_pack.trigger_reentry_signal = 0;
map_algorithm_trigger_signal_pack.insert(trigger_signal, m_pack); // 替换为0
}
}
}
}
void Logic_myiothread::checkTriggerCamera(QVector<int> vec_value)
{
QStringList m_keys = m_runAndCheck_cameraThread->map_trigger_signal_pack.keys();
QJsonArray sn_area_array = map_sn_area_array.value(m_stationKey);// ("station1");
for (int i = 0; i < m_keys.size(); i++)
{
QString trigger_signal = m_keys.at(i);
QStringList splist = trigger_signal.split("_");
if (splist.size() < 2)
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " trigger_signal is error! :" << trigger_signal;
return;
}
QString m_startpos = splist[0];
QString m_value = splist[1];
QString trigger_getImgNum = "1";//运行次数
if(splist.size()>3)
if(splist[3].toInt()>0)trigger_getImgNum = splist[3];
int trigger_index = m_startpos.mid(1, m_startpos.length() - 1).toInt();
trigger_index -= trigger_startpos;
if(trigger_index < 0)
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " value is error! m_startpos:" << m_startpos;
}
else if( vec_value.size() > trigger_index )
{
trigger_signal_pack m_pack = m_runAndCheck_cameraThread->map_trigger_signal_pack.value(trigger_signal);
//收到信号直接回复;软件卡顿、通信断开等异常,可能导致信号回复失败
if (vec_value.at(trigger_index) == m_value.toInt())
{
// 写清除当前信号 修改
QString clear_signal = m_startpos;
QStringList myCmdHead = m_pack.clear_camera_startpos_flag.split("_");
clear_signal = myCmdHead[0]+"_"+ myCmdHead[1] +"_" + clear_signal + +"_" + myCmdHead[2];
QByteArray m_byte = clear_signal.toUtf8();
////QMutexLocker locker(m_iomutex);;
/*if ( !finstcp_ptr->writeData(vec_mat,m_byte) )
{
qCritical() << __FUNCTION__ << " line:"<< __LINE__ << " finstcp_ptr reciveData error! ";
return;
}*/
}
if ( vec_value.at(trigger_index) == m_value.toInt() )//&& m_pack.trigger_reentry_signal == 0 )
{
qDebug() << __FUNCTION__ << " line:" << __LINE__ << "trigger_signal: " << trigger_signal;
//一个信号,对应相机拍多张图?
// 添加被触发的相机名称;运行相机及取图
if ( !m_pack.vector_camera.isEmpty() )
{
QStringList trigger_camera_name_getImgNumS;
QMutexLocker locker(m_runAndCheck_cameraThread->commond_pack_lock );
for ( int val = 0; val < m_pack.vector_camera.size(); val++ )
{
QString trigger_camera_name_getImgNum = m_pack.vector_camera.at(val)+"_"+ trigger_getImgNum;
if ( !trigger_camera_name_getImgNum.isEmpty() )
{
//多工站需考虑加锁?
//注意,信号不可重入。
//开线程去运行;一个信号对应相机拍多张图的情况
trigger_camera_name_getImgNumS.append(trigger_camera_name_getImgNum);
}
}
qCritical() << "trigger_signal:" << trigger_signal << " run_camera_module station_camerathreadlist ";
m_runAndCheck_cameraThread->runCameraKey_num.enqueue(trigger_camera_name_getImgNumS);
// 查看是否需要使用触发信号
if (!m_pack.trigger_signal_condition.isEmpty())
{
station_list.value(m_stationName)->set_trigger_signal(trigger_signal);
}
// 判断是否需要反馈延迟
int sleep_time = 10;
QString camera_name = m_pack.vector_camera.at(0); // 只提取一个
if (!camera_name.isEmpty())
{
QString m_feedback_sleep_time = map_camera_feedback_sleep_time.value(camera_name);
if (!m_feedback_sleep_time.isEmpty())
{
sleep_time = m_feedback_sleep_time.toInt();
//Sleep(sleep_time);
}
}
m_pack.trigger_getImgNum = trigger_getImgNum;
m_pack.m_startpos = m_startpos;
m_pack.sleep_time = sleep_time;
// 运行并检查相机是否取图完成的线程
// 一个信号取多张的情况,取图时间长,和通信线程分开。
//QFuture偶然需要5秒,start()偶然需要30ms;
m_runAndCheck_cameraThread->check_pack.enqueue(m_pack);
}
m_pack.trigger_reentry_signal = 1;
m_runAndCheck_cameraThread->map_trigger_signal_pack.insert(trigger_signal,m_pack); // 替换为1
}
}
}
}
// 触发算法检查
void Logic_myiothread::checkTriggerAlgorithm(QVector<int> vec_value)
{
QStringList m_keys = map_algorithm_trigger_signal_pack.keys();
QJsonArray sn_area_array = map_sn_area_array.value(m_stationKey);// ("station1");
for (int i = 0; i < m_keys.size(); i++)
{
QString trigger_signal = m_keys.at(i);
QStringList splist = trigger_signal.split("_");
if (splist.size() < 2)
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " trigger_signal is error! :" << trigger_signal;
return;
}
QString m_startpos = splist[0];
QString m_value = splist[1];
QString trigger_getImgNum = "1";//运行次数
if (splist.size() > 3)
if (splist[3].toInt() > 0)trigger_getImgNum = splist[3];
int trigger_index = m_startpos.mid(1, m_startpos.length() - 1).toInt();
trigger_index -= trigger_startpos;
if (trigger_index < 0)
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " value is error! m_startpos:" << m_startpos;
}
else if (vec_value.size() > trigger_index)
{
trigger_signal_pack m_pack = map_algorithm_trigger_signal_pack.value(trigger_signal);
if (vec_value.at(trigger_index) == m_value.toInt())
{
// 写清除当前信号 修改
QString clear_signal = m_startpos;
clear_signal = "write_short_" + clear_signal + "_0";
QByteArray m_byte = clear_signal.toUtf8();
//QMutexLocker locker(m_iomutex);;
if (!finstcp_ptr->writeData(vec_mat, m_byte))
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " finstcp_ptr reciveData error! ";
return;
}
}
if (vec_value.at(trigger_index) == m_value.toInt() )
//if(m_pack.trigger_reentry_signal == 0)
{
qDebug() << __FUNCTION__ << " line:" << __LINE__ << "trigger_signal: " << trigger_signal;
//反馈信号;考虑到一个模块可能对应几组检测内容,对应的开始和回复信号不同
QVector<QString> vector_trigger_feedback_signal = m_pack.vector_trigger_feedback_signal;
foreach(QString trigger_feedback_signal, vector_trigger_feedback_signal) //例:D3104_0
{
if (trigger_feedback_signal.isEmpty())
continue;
QByteArray send_byte = trigger_feedback_signal.toUtf8();
//QMutexLocker locker(m_iomutex);;
if (!finstcp_ptr->writeData(vec_mat, send_byte))
{
qCritical() << __FUNCTION__ << "line:" << __LINE__ << " finstcp_ptr reciveData error! ";
return;
}
}
m_pack.trigger_reentry_signal = 1;
map_algorithm_trigger_signal_pack.insert(trigger_signal, m_pack); // 替换为1
// 添加被触发的相机名称
if (!m_pack.vector_camera.isEmpty())
{
//QMutexLocker locker(commond_pack_lock);
for (int val = 0; val < m_pack.vector_camera.size(); val++)
{
QString trigger_signal_num = trigger_signal + "#" + trigger_getImgNum;
if (!trigger_signal_num.isEmpty())
{
//注意,信号不可重入。
//一般对应的是下料工位的汇总算法
run_Algorithm_hdataintegration(trigger_signal_num);
}
}
}
// 查看是否需要使用触发信号
//if (!m_pack.trigger_signal_condition.isEmpty())
//{
//station_list.value(m_stationName)->set_trigger_signal(trigger_signal);
//trigger_signal_condition_name = trigger_signal; //作用同mv_trigger_signal
//}
//if (m_pack.clear_camera_startpos_flag.contains("true"))
//{
// // 写清除当前信号 修改
// QString clear_signal = m_startpos;
// clear_signal = CmdHeadShort + clear_signal + "_0";
// QByteArray m_byte = clear_signal.toUtf8();
// if (!finstcp_ptr->writeData(vec_mat, m_byte))
// {
// qCritical() << __FUNCTION__ << " line:" << __LINE__ << " finstcp_ptr reciveData error! ";
// return;
// }
// // 判断是否需要反馈延迟
// int sleep_time = 0;
// QString trigger_name = m_pack.vector_camera.at(0); // 只提取一个
// if (!trigger_name.isEmpty())
// {
// QString m_feedback_sleep_time = map_algorithm_feedback_sleep_time.value(trigger_name);
// if (!m_feedback_sleep_time.isEmpty())
// {
// sleep_time = m_feedback_sleep_time.toInt();
// //Sleep(sleep_time);
// }
// }
//}
}
//else
// qDebug() << __FUNCTION__ << " line:" << __LINE__ << "trigger_signal: " << trigger_signal << " m_pack.trigger_reentry_signal != 0";
}
}
}
// 工站结束校验
// 相机缺图需要重拍时使用。此方法需工位开始时(读SN信号),清理相机容器、检测算法容器数据(HStationData::clearData)。
void Logic_myiothread::checkEndSingnal(QVector<int> vec_value)
{
foreach(QString endSingnal, map_endSingnal_backObj.keys())
{
QString m_startpos = endSingnal.split("_")[0];
QString m_value = endSingnal.split("_")[1];
int trigger_index = m_startpos.mid(1, m_startpos.length() - 1).toInt();
trigger_index -= trigger_startpos;
if (trigger_index < 0)
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " vec_value is error! read_sn_startpos:" << m_startpos;
}
else if (vec_value.size() > trigger_index)
{
//读SN标志满足read_sn_startpos
if (vec_value.at(trigger_index) == m_value.toInt())
{
// 清理当前信号
QString m_signal = "write_short_" + m_startpos + "_0";
QByteArray m_byte = m_signal.toUtf8();
//QMutexLocker locker(m_iomutex);;
if (!finstcp_ptr->writeData(vec_mat, m_byte))
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " finstcp_ptr reciveData error! ";
return;
}
QJsonObject end_backObj= map_endSingnal_backObj.value(endSingnal);
QString backSignal;
bool ifCameraMissImage = false;
for (int i = 0; i < m_runAndCheck_cameraThread->station_camerathreadlist.size(); i++)
if (m_runAndCheck_cameraThread->station_camerathreadlist[i]->ifMissImage == true)
{
ifCameraMissImage = true;
m_runAndCheck_cameraThread->station_camerathreadlist[i]->set_ifMissImage(false);
}
if (ifCameraMissImage == false)
{
backSignal = end_backObj.value("取图数量-正常").toString();
}
else
{
backSignal = end_backObj.value("取图数量-异常").toString();
}
if (!backSignal.isEmpty())
{
// 清理当前sn码的触发信号
m_signal = backSignal;
m_byte = m_signal.toUtf8();
if (!finstcp_ptr->writeData(vec_mat, m_byte))
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " finstcp_ptr reciveData error! ";
return;
}
}
}
}
}
}
//条件判断
//一般对应的是下料工位的汇总算法
void Logic_myiothread::run_Algorithm_hdataintegration(QString trigger_signal_num)
{
try
{
QString mytrigger_signal_num = trigger_signal_num; //相机key_运行次数
int runNum = mytrigger_signal_num.split("#")[1].toInt();
if (runNum < 1)
{
qCritical() << __FUNCTION__ << __LINE__ << " cameraKey_runNum err:" << mytrigger_signal_num;
return;
}
bool if_camera_get_All = true;
for (int i = 0; i < station_trigger_signal_dataIntegrationThread_list.size(); i++)
{
QString trigger_signal = station_trigger_signal_dataIntegrationThread_list.at(i)->m_trigger_signal; //相机SN或userID
if (trigger_signal == mytrigger_signal_num.split("#")[0])
{
Logic_hdataintegration* mydataIntegrationPtr = station_trigger_signal_dataIntegrationThread_list.at(i);
if (mydataIntegrationPtr->SN_dataTime == "")
mydataIntegrationPtr->SN_dataTime = "errSN_errDataTime";
//开线程去运行;一个信号对应相机拍多张图的情况
for (int i = 0; i < runNum; i++)
{
mydataIntegrationPtr->ifalwaysRun = true;
mydataIntegrationPtr->start();//偶然需要30ms
}
}
}
}
catch (QString ev)
{
qCritical() << __FUNCTION__ << __LINE__ << " ev:" << ev;
}
return;
}
QJsonObject Logic_myiothread::loadJsonCfg(QString json_cfg_file_path)
{
QJsonObject json_object;
try
{
QJsonParseError jsonError;
if (json_cfg_file_path.isEmpty())
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " JsonPath is null!";
return json_object;
}
QFile JsonFile;
JsonFile.setFileName(json_cfg_file_path);
if (!JsonFile.isReadable())
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " camera_cfg.json not isReadable!";
return json_object;
}
JsonFile.open(QIODevice::ReadOnly);
QByteArray m_Byte = JsonFile.readAll();
if (m_Byte.isEmpty())
{
qDebug() << __FUNCTION__ << " line:" << __LINE__ << json_cfg_file_path + " Content is empty";
JsonFile.close();
return json_object;
}
QJsonDocument jsonDocument(QJsonDocument::fromJson(m_Byte, &jsonError));
if (!jsonDocument.isNull() && jsonError.error == QJsonParseError::NoError)
{
if (jsonDocument.isObject())
{
json_object = jsonDocument.object();
JsonFile.close();
return json_object;
}
}
else
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << json_cfg_file_path + " is error!";
}
JsonFile.close();
}
catch (QString ev)
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " ev:" << ev;
}
return json_object;
}
//未使用;
// 信号复位逻辑
//重新加载并传参数到相机、算法
bool Logic_myiothread::initStationCameraAndAlgorithm()
{
//相机/算法模块,传入参数;
QDir dir = QApplication::applicationDirPath();
QString currPath = dir.path();
QString cf_finish = currPath + "/config/finish.txt";
QFile cf_finish_file(cf_finish);
if (cf_finish_file.exists())
{
Sleep(10);
//读配置文件;加载参数;
QString camera_cfg = currPath + "/config/camera_cfg.json";
QJsonObject m_jsonObj = loadJsonCfg(camera_cfg);
if (m_jsonObj.isEmpty())
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " m_jsonObj is null";
return false;
}
QJsonArray stationList = m_jsonObj.value("工站列表").toArray();
for (int s = 0; s < stationList.size(); s++)
{
QJsonObject station_obj = stationList[s].toObject();
if (station_obj.value("工站名").toString() == m_stationName)
{
QJsonArray m_cameramodulelist = station_obj.value("相机模块列表").toArray();
for (auto val = 0; val < m_cameramodulelist.size(); val++)
{
QJsonObject camera_obj = m_cameramodulelist.at(val).toObject();
QString camera_key = camera_obj.value("相机key").toString();
for (int sc = 0; sc < m_runAndCheck_cameraThread->station_camerathreadlist.size(); sc++)
{
if (m_runAndCheck_cameraThread->station_camerathreadlist[sc]->m_name == camera_key)
{
m_runAndCheck_cameraThread->station_camerathreadlist[sc]->m_Module.ConfigArray= camera_obj.value("相机参数").toArray();
initStationsModule(m_runAndCheck_cameraThread->station_camerathreadlist[sc]->m_Module);
}
}
}
QJsonArray m_Algorithmlist = station_obj.value("算法列表").toArray();
for (auto val = 0; val < m_Algorithmlist.size(); val++)
{
QJsonObject obj = m_Algorithmlist.at(val).toObject();
QString key = obj.value("算法名称").toString();
for (int sc = 0; sc < station_task_thread_list.size(); sc++)
{
//for (int t = 0; t < station_task_thread_list[sc]->m_module_list.size(); t++)
{
if (station_task_thread_list[sc]->m_module.m_stationKey == m_stationName &&
station_task_thread_list[sc]->m_module.module_key == key)
{
station_task_thread_list[sc]->m_module.ConfigArray= obj.value("算法初始化参数").toArray();
initStationsModule(station_task_thread_list[sc]->m_module);
}
}
}
}
}
}
}
}
//未使用;
// 信号复位逻辑
bool Logic_myiothread::initStationsModule(MyModule cameraOrAlgorithm_module)
{
QString moduleName = cameraOrAlgorithm_module.moduleName;
QString key = cameraOrAlgorithm_module.module_key;
//传递初始化参数
QByteArray initByte = cameraOrAlgorithm_module.m_initByte;
std::vector<cv::Mat> vec_moduleMat;
//数据格式:3+3+数据长度+数据内容
QByteArray m_keyByte = initCameraParam(key, cameraOrAlgorithm_module.ConfigArray);
//统一用initParas进行初始化
if (moduleName.contains("Camera"))
cameraOrAlgorithm_module.module_ptr->writeData(vec_moduleMat, m_keyByte); // 初始化相机
if (cameraOrAlgorithm_module.module_ptr->initParas(initByte))
{
qDebug() << __FUNCTION__ << " line: " << __LINE__ << " key: " << key << " initParas success! ";
}
else
{
qCritical() << __FUNCTION__ << " line: " << __LINE__ << " moduleName: " << cameraOrAlgorithm_module.moduleName << " initParas failed! ";
return false;
}
return true;
}
//未使用;
// 信号复位逻辑
QByteArray Logic_myiothread::initCameraParam(QString key, QJsonArray array)
{
if (key.isEmpty())
return "";
std::string sendMsg;
// 添加相机名称
int type = 3; // int
std::string m_type;
m_type.insert(0, 4, '1');
memcpy((void*)m_type.c_str(), (void*)&type, 4);
sendMsg.append(m_type);
// len
int len = key.length();
std::string m_len;
m_len.insert(0, 4, '1');
memcpy((void*)m_len.c_str(), (void*)&len, 4);
sendMsg.append(m_len);
// 相机名称
std::string m_key = key.toStdString();
sendMsg.append(key.toStdString());
//添加数据
for (int i = 0; i < array.size(); i++)
{
QJsonObject m_obj = array.at(i).toObject();
QString value = m_obj.value("相机参数值").toString();
if (value.isEmpty())
{
qCritical() << __FUNCTION__ << "line:" << __LINE__ << " value is null!";
return "";
}
int type = 3; // int
std::string _type;
_type.insert(0, 4, '1');
memcpy((void*)_type.c_str(), (void*)&type, 4);
sendMsg.append(_type);
// len
int data_len = value.length();
std::string _len;
_len.insert(0, 4, '1');
memcpy((void*)_len.c_str(), (void*)&data_len, 4);
sendMsg.append(_len);
// data
sendMsg.append(value.toStdString());
}
QByteArray byteArray(sendMsg.c_str(), sendMsg.length());
return byteArray;
}
//根据信号,切换"程序号"
int Logic_myiothread::dataPack_size()
{
QMutexLocker locker(sendProcess_mutex);
return sendProcessTask.size();
}
//根据信号,切换"程序号"
//获取数据
dataPack Logic_myiothread::getdataPack()
{
QMutexLocker locker(sendProcess_mutex);
return sendProcessTask.dequeue();
}
// 运行并检查相机是否取图完成的线程
// 一个信号取多张的情况,取图时间长,和通信线程分开。
runAndCheck_cameraThread::runAndCheck_cameraThread(QObject* parent)
{
runflag = true;
}
runAndCheck_cameraThread::~runAndCheck_cameraThread()
{
runCameraKey_num.clear();
exit();
wait(1);
qDebug() << __FUNCTION__ << "line:" << __LINE__ << " delete success! " ;
}
//Logic_myiothread的run运行时,开始线程运行
//~Logic_myiothread时,runflag为false结束运行
void runAndCheck_cameraThread::run()
{
while (true)
{
if(!runflag)
{
return;
}
while (!runCameraKey_num.isEmpty())
{
QMutexLocker locker ( commond_pack_lock );
QStringList cameraKeyS_runNumS = runCameraKey_num.dequeue();
run_camera_module(cameraKeyS_runNumS);
}
Sleep(1);
qApp->processEvents();
}
}
//运行相机并等待拍完
void runAndCheck_cameraThread::run_camera_module(QStringList cameraKeyS_runNumS)
{
try
{
clock_t start, stop;
start = clock();
trigger_signal_pack my_check_pack = check_pack.dequeue();
for (int ca = 0; ca < cameraKeyS_runNumS.size(); ca++)
{
QString cameraName_getImgNum = cameraKeyS_runNumS[ca]; //相机key_运行次数
int runNum = cameraName_getImgNum.split("_")[1].toInt();
if (runNum < 1)
{
qCritical() << __FUNCTION__ << __LINE__ << " cameraKey_runNum err:" << cameraKeyS_runNumS[ca];
return;
}
//runModule(cameraName);
bool if_camera_get_All = true;
for (int i = 0; i < station_camerathreadlist.size(); i++)
{
QString cameraKey = station_camerathreadlist.at(i)->m_name; //相机SN或userID
if (cameraKey == cameraName_getImgNum.split("_")[0])
{
station_camerathreadlist.at(i)->set_m_stoprun(true);
//----2024.03.05修改
// 回复信号放到Logic_camera_thread相机取图完成后执行
// 可能出现同一工位多个相机,信号先后给的情况,避免相机取图时间过长,导致下一个相机开始取图慢
//相机拍照完成检查包
if (my_check_pack.sleep_time > 100)
station_camerathreadlist.at(i)->maxCheckTime = my_check_pack.sleep_time;
if (ca == 0)
station_camerathreadlist.at(i)->send_byte = checkCamerasFinish_feedbackSignal(my_check_pack);
else
station_camerathreadlist.at(i)->send_byte = "pass"; //一个开始拍照对应多个相机的,回复的信号只保留一个,后面的不发了。减少通信耗时。
//Logic_camera_thread在线程运行,当getImgNums不为0时从相机模块获取getImgNums次图
//取图总时间超过maxCheckTime,会结束取图。
station_camerathreadlist.at(i)->getImgNums = runNum;
break;
}
}
}
///*stop = clock();
//qCritical() << "trigger_signal:" << trigger_signal << " run_camera_module station_camerathreadlist cut Time ::" << stop - start;
//start = clock();*/
//for (int ca = 0; ca < cameraKeyS_runNumS.size(); ca++)
//{
// QString cameraName_getImgNum = cameraKeyS_runNumS[ca]; //相机key_运行次数
// int runNum = cameraName_getImgNum.split("_")[1].toInt();
// if (runNum < 1)
// {
// qCritical() << __FUNCTION__ << __LINE__ << " cameraKey_runNum err:" << cameraKeyS_runNumS[ca];
// return;
// }
// //runModule(cameraName);
// bool if_camera_get_All = true;
// for (int i = 0; i < station_camerathreadlist.size(); i++)
// {
// QString cameraKey = station_camerathreadlist.at(i)->getName(); //相机SN或userID
// // tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss-zzz");
// //std::cout << "run_camera_module strat 3 ::" << tmpDate.toStdString() << " trigger_camera_name::" << cameraKey_runNum.toStdString() << std::endl;
// if (cameraKey == cameraName_getImgNum.split("_")[0])
// {
// Logic_camera_thread* mycameraPtr = station_camerathreadlist.at(i);
// //mycameraPtr->wait();
// int mytime = 0;
// while (mycameraPtr->getImgNums != 0)
// {
// Sleep(20);
// mytime++;
// if (mytime >= check_pack.head().sleep_time) //"拍照信号-检查完成的时间": "360000"。设置很大:机台中途报警,复位后继续拍照检测
// {
// mycameraPtr->set_m_stoprun(true);
// Sleep(10);
// }
// //mycameraPtr->m_stoprun=true相机读SN信号时,进行设置
// if (mycameraPtr->getImgNums == 0 || mytime*20 >= check_pack.head().sleep_time || (mycameraPtr->m_stoprun==true && mytime>=50))
// break;
// }
// Sleep(1);
// mycameraPtr->set_m_stoprun(true);// m_stoprun = true;
// }
// }
//}
}
catch (QString ev)
{
qCritical() << __FUNCTION__ << __LINE__ << " ev:" << ev;
}
return;
}
//获取"拍照信号-完成写入PLC-列表",拍照信号对应的反馈信号
QByteArray runAndCheck_cameraThread::checkCamerasFinish_feedbackSignal(trigger_signal_pack m_pack)
{
int tmp_size = 0;
//clock_t start_triggerTime = clock();
// 写入反馈信号
QVector<QString> vector_trigger_feedback_signal = m_pack.vector_trigger_feedback_signal;
foreach(QString trigger_feedback_signal, vector_trigger_feedback_signal)
{
QStringList plc_feedback_msg_list = trigger_feedback_signal.split("_");
if (plc_feedback_msg_list.size() != 5)
{
qWarning() << __FUNCTION__ << " line: " << __LINE__ << " plc_feedback_msg_list num is error! plc_feedback_msg_list num:" << plc_feedback_msg_list.length();
}
else if (plc_feedback_msg_list.contains(m_pack.m_startpos))
{
// 发送反馈信号
QString feedback_signal_type = plc_feedback_msg_list.at(1) + "_" + plc_feedback_msg_list.at(2);
QString feedback_signal_pos = plc_feedback_msg_list.at(3);
QString feedback_signal_value = plc_feedback_msg_list.at(4);
QString send_msg = feedback_signal_type + "_" + feedback_signal_pos + "_" + feedback_signal_value;
QByteArray send_byte = send_msg.toUtf8();
return send_byte;
/*//QMutexLocker locker(m_iomutex);;
if (!finstcp_ptr->writeData(vec_mat, send_byte))
{
qCritical() << __FUNCTION__ << "line:" << __LINE__ << " finstcp_ptr reciveData error! ";
return;
}
else
{
qDebug() << __FUNCTION__ << " line:" << __LINE__ << "feedback_signal: " << send_byte;
}*/
}
}
return "";
}