Compare commits

...

27 Commits

Author SHA1 Message Date
Jinhuan bec1a3e4d0 1.退回上一笔的改动
2.添加try catch块
3.设置生成pdb文件并且关闭优化
6 months ago
Jinhuan 318000820f 移除一个经常new的操作 6 months ago
Flamingo 5b215b8e0c Improve TCP send compress file of images 8 months ago
CJ980606 cf70338b7d 恢复八相机界面 9 months ago
CJ980606 c36f7190a6 添加心跳检测、修改产量统计逻辑、添加删除ng、ng_result图片功能 9 months ago
Flamingo 43303c2842 修改NG/OK结果合并处理功能,NG/OK结果可以单独处理 10 months ago
Flamingo eef068972b 添加相机NG/OK数据合并和分开处理的宏,默认合并处理 10 months ago
CJ980606 f0e12c5d1d 修复图片旋转问题 11 months ago
CJ980606 7a2fe26b88 更新部分代码 11 months ago
CJ980606 81409c3f2c 添加识别设备型号功能;修改modbus tcp从机寄存器写入方式 12 months ago
Jinhuan 45381dfdf2 添加modbus从机的代码 12 months ago
Jinhuan dc5c0efdc7 尝试加入mobude tcp 从机设置 12 months ago
Jinhuan 7583d17f52 增加define来控制调试时候的文件路径 12 months ago
CJ980606 1f0d18b37c 更新PLC-tcp部分;更新加密lib文件(适配开机自启动软件) 1 year ago
Flamingo 17bb01c5be 不打包空文件夹 1 year ago
CJ980606 1ffc704984 修复小bug;更新modbus tcp等 1 year ago
Flamingo 9300aee814 修改打包zip文件的名字,以及只打包一分钟之内的图片 1 year ago
Jinhuan f8453203c4 上传一些TCP Modebus的测试代码 1 year ago
Jinhuan 8c7ccf26cb 更新加密库 1 year ago
Jinhuan 8b3bacc136 在不影响运行的情况下,去掉一些文件的绝对路径方便调试 1 year ago
Flamingo 2284ed6032 程序不能重复打开以及TCP server 1 year ago
Flamingo 9dcfd050a6 修改不传ng文件夹下的图片以及相机掉电以后定时器到时间继续传送未发送的图片 1 year ago
Flamingo 8b7f95fbad 减少FTP连接成功打印 1 year ago
Flamingo 1ed252b5ff 解决FTP传文件有时候路径没有创建的问题 1 year ago
Flamingo cf45f5c8a1 完善ftp 发送压缩文件功能,发送完zip以后清除缓存 1 year ago
Flamingo ccf44a00d3 Add for send zip file every 5 mins 1 year ago
Flamingo 51f65124ab Init for Cigarette Shanghai 1 year ago

@ -26,7 +26,7 @@ Global
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
Qt5Version = 5.15.2_msvc2019_64
SolutionGuid = {0AF1A30E-A12C-4014-ACD5-65A1E6D54D46}
Qt5Version = 5.15.2_msvc2019_64
EndGlobalSection
EndGlobal

@ -86,7 +86,7 @@ void CaptureThread::process(void)
mvIMPACT::acquire::Statistics statistics(pDev_);
mvIMPACT::acquire::Request* pRequest = 0;
mvIMPACT::acquire::Request* pPreviousRequest = nullptr;
const unsigned int timeout_ms = 100;
const unsigned int timeout_ms = 10;
Ready = true;
while (!boTerminated_)
{

@ -123,7 +123,7 @@ void CaptureThreadBasler::process(void)
#endif
#endif
const unsigned int timeout_ms = 100;
const unsigned int timeout_ms = 10;
// This smart pointer will receive the grab result data.
Pylon::CGrabResultPtr ptrGrabResult;

@ -10,6 +10,11 @@ extern SyncQueue<_XMLExportDataInfo>* export_XMLData_Info_queue;
extern PLCDevice* m_PLCDevice;
extern int work_camera_nums;
#ifdef __TCPSend
extern SyncQueue<_TCPSendInfo>* TCP_Info_queue;
extern threadSendTCP tcpSendThread;
#endif
inline void LossCallBackfunction(unsigned int pData, void* pUser) {
try {
CaptureThreadHIK* CaptureThreadHIKptr = (CaptureThreadHIK*)pUser;
@ -40,7 +45,7 @@ inline void FallingGpioEventfunction(MV_EVENT_OUT_INFO* pEventInfo, void* pUser)
image.copyTo(roi);
}
#ifdef SYNC_CAMERA
{
{//合并所有相机图片放入队列
std::lock_guard<std::mutex> locker(CaptureThreadHIKptr->p_image_sync_arr->lock);
CaptureThreadHIKptr->p_image_sync_arr->image_sync_arr.at(CaptureThreadHIKptr->Local_Num) = std::make_pair(unit_count, long_image);
CaptureThreadHIKptr->p_image_sync_arr->collect_cnt++;
@ -220,7 +225,7 @@ void(*RisingGpioEvent[NumberOfSupportedCameras])(MV_EVENT_OUT_INFO* pEventInfo,
,RisingGpioEvent8
#endif
};
void CaptureThreadHIK::fpsTimeout(void)
void CaptureThreadHIK::fpsTimeout(void)//采集速度
{
uint64_t delta = m_cntGrabbedImages - m_cntLastGrabbedImages;
m_cntLastGrabbedImages = m_cntGrabbedImages;
@ -286,10 +291,10 @@ void CaptureThreadHIK::process(void)
nDataSize = stIntValue.nCurValue * 3;///
MV_CC_StartGrabbing(CamHandle);
Ready = true;
while (!boTerminated_)
while (!boTerminated_)//循环取流,拍照取图
{
//nRet = MV_CC_GetOneFrameTimeout(CamHandle, g_pImage_buf, nDataSize, &stFrameInfo, 200);
nRet = MV_CC_GetImageForBGR(CamHandle, g_pImage_buf, nDataSize, &stFrameInfo, 100);
nRet = MV_CC_GetImageForBGR(CamHandle, g_pImage_buf, nDataSize, &stFrameInfo, 10);
if (MV_OK == nRet)
{
m_cntGrabbedImages++;

File diff suppressed because it is too large Load Diff

@ -41,33 +41,12 @@
<ClCompile Include="cigarette.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_cigarette.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_cigarette.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\qrc_cigarette.cpp">
<Filter>Generated Files</Filter>
</ClCompile>
<ClCompile Include="dialogsetuppasswd.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_dialogsetuppasswd.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_dialogsetuppasswd.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="dialogsetup.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_dialogsetup.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_dialogsetup.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="basecamera.cpp">
<Filter>Source Files</Filter>
</ClCompile>
@ -83,42 +62,18 @@
<ClCompile Include="plcsetup.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_plcsetup.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_plcsetup.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="CaptureThread.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_CaptureThread.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_CaptureThread.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="plc_item.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="db_label.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_db_label.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_db_label.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="alarmdialog.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_alarmdialog.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_alarmdialog.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="AlarmInfo.cpp">
<Filter>Source Files</Filter>
</ClCompile>
@ -128,60 +83,24 @@
<ClCompile Include="debugthread.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_debugthread.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_debugthread.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="dialogin.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_dialogin.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_dialogin.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="ASyncQueue.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="baslercamera.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_workthread.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_workthread.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="workthread.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_CaptureThreadBasler.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_CaptureThreadBasler.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="CaptureThreadBasler.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_savethread.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_savethread.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="hikcamera.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_CaptureThreadHIK.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_CaptureThreadHIK.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="CaptureThreadHIK.cpp">
<Filter>Source Files</Filter>
</ClCompile>
@ -191,66 +110,24 @@
<ClCompile Include="threadSend.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_camera_glue.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_camera_glue.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="camera_glue.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_change_shift.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_change_shift.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="change_shift.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_output_statistic.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_output_statistic.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="output_statistic.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_Logthread.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_Logthread.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="Logthread.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_Cleanthread.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_Cleanthread.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="Cleanthread.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="threadReceive.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_threadReceive.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_threadReceive.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_exportData.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_exportData.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="exportData.cpp">
<Filter>Source Files</Filter>
</ClCompile>
@ -263,118 +140,106 @@
<ClCompile Include="SyncWorkThread.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_SyncWorkThread.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<CustomBuild Include="cigarette.h">
<QtMoc Include="cigarette.h">
<Filter>Header Files</Filter>
</CustomBuild>
<CustomBuild Include="cigarette.ui">
</QtMoc>
<QtUic Include="cigarette.ui">
<Filter>Form Files</Filter>
</CustomBuild>
<CustomBuild Include="cigarette.qrc">
</QtUic>
<QtRcc Include="cigarette.qrc">
<Filter>Resource Files</Filter>
</CustomBuild>
<CustomBuild Include="dialogsetuppasswd.hpp">
</QtRcc>
<QtMoc Include="dialogsetuppasswd.hpp">
<Filter>Header Files</Filter>
</CustomBuild>
<CustomBuild Include="dialogsetuppasswd.ui">
</QtMoc>
<QtUic Include="dialogsetuppasswd.ui">
<Filter>Form Files</Filter>
</CustomBuild>
<CustomBuild Include="dialogsetup.hpp">
</QtUic>
<QtMoc Include="dialogsetup.hpp">
<Filter>Header Files</Filter>
</CustomBuild>
<CustomBuild Include="dialogsetup.ui">
</QtMoc>
<QtUic Include="dialogsetup.ui">
<Filter>Form Files</Filter>
</CustomBuild>
<CustomBuild Include="plcsetup.hpp">
</QtUic>
<QtMoc Include="plcsetup.hpp">
<Filter>Header Files</Filter>
</CustomBuild>
<CustomBuild Include="plcsetup.ui">
</QtMoc>
<QtUic Include="plcsetup.ui">
<Filter>Form Files</Filter>
</CustomBuild>
<CustomBuild Include="CaptureThread.h">
</QtUic>
<QtMoc Include="CaptureThread.h">
<Filter>Header Files</Filter>
</CustomBuild>
<CustomBuild Include="db_label.h">
</QtMoc>
<QtMoc Include="db_label.h">
<Filter>Header Files</Filter>
</CustomBuild>
<CustomBuild Include="alarmdialog.hpp">
</QtMoc>
<QtMoc Include="alarmdialog.hpp">
<Filter>Header Files</Filter>
</CustomBuild>
<CustomBuild Include="alarmdialog.ui">
</QtMoc>
<QtUic Include="alarmdialog.ui">
<Filter>Form Files</Filter>
</CustomBuild>
<CustomBuild Include="debugthread.h">
</QtUic>
<QtMoc Include="debugthread.h">
<Filter>Header Files</Filter>
</CustomBuild>
<CustomBuild Include="dialogin.hpp">
</QtMoc>
<QtMoc Include="dialogin.hpp">
<Filter>Header Files</Filter>
</CustomBuild>
<CustomBuild Include="dialogin.ui">
</QtMoc>
<QtUic Include="dialogin.ui">
<Filter>Form Files</Filter>
</CustomBuild>
<CustomBuild Include="workthread.h">
</QtUic>
<QtMoc Include="workthread.h">
<Filter>Header Files</Filter>
</CustomBuild>
<CustomBuild Include="CaptureThreadBasler.h">
</QtMoc>
<QtMoc Include="CaptureThreadBasler.h">
<Filter>Header Files</Filter>
</CustomBuild>
<CustomBuild Include="savethread.h">
</QtMoc>
<QtMoc Include="savethread.h">
<Filter>Header Files</Filter>
</CustomBuild>
<CustomBuild Include="CaptureThreadHIK.h">
</QtMoc>
<QtMoc Include="CaptureThreadHIK.h">
<Filter>Header Files</Filter>
</CustomBuild>
</QtMoc>
<CustomBuild Include="threadSend.h">
<Filter>Header Files</Filter>
</CustomBuild>
<CustomBuild Include="camera_glue.h">
<QtMoc Include="camera_glue.h">
<Filter>Header Files</Filter>
</CustomBuild>
<CustomBuild Include="camera_glue.ui">
</QtMoc>
<QtUic Include="camera_glue.ui">
<Filter>Form Files</Filter>
</CustomBuild>
<CustomBuild Include="change_shift.h">
</QtUic>
<QtMoc Include="change_shift.h">
<Filter>Header Files</Filter>
</CustomBuild>
<CustomBuild Include="change_shift.ui">
</QtMoc>
<QtUic Include="change_shift.ui">
<Filter>Form Files</Filter>
</CustomBuild>
<CustomBuild Include="output_statistic.h">
</QtUic>
<QtMoc Include="output_statistic.h">
<Filter>Header Files</Filter>
</CustomBuild>
<CustomBuild Include="output_statistic.ui">
</QtMoc>
<QtUic Include="output_statistic.ui">
<Filter>Form Files</Filter>
</CustomBuild>
<CustomBuild Include="Logthread.h">
</QtUic>
<QtMoc Include="Logthread.h">
<Filter>Header Files</Filter>
</CustomBuild>
<CustomBuild Include="Cleanthread.h">
</QtMoc>
<QtMoc Include="Cleanthread.h">
<Filter>Header Files</Filter>
</CustomBuild>
<CustomBuild Include="threadReceive.h">
</QtMoc>
<QtMoc Include="threadReceive.h">
<Filter>Header Files</Filter>
</CustomBuild>
<CustomBuild Include="exportData.h">
</QtMoc>
<QtMoc Include="exportData.h">
<Filter>Header Files</Filter>
</CustomBuild>
<CustomBuild Include="SyncWorkThread.h">
</QtMoc>
<QtMoc Include="SyncWorkThread.h">
<Filter>Header Files</Filter>
</CustomBuild>
</QtMoc>
</ItemGroup>
<ItemGroup>
<ClInclude Include="GeneratedFiles\ui_cigarette.h">
<Filter>Generated Files</Filter>
</ClInclude>
<ClInclude Include="GeneratedFiles\ui_dialogsetuppasswd.h">
<Filter>Generated Files</Filter>
</ClInclude>
<ClInclude Include="GeneratedFiles\ui_dialogsetup.h">
<Filter>Generated Files</Filter>
</ClInclude>
<ClInclude Include="basecamera.h">
<Filter>Header Files</Filter>
</ClInclude>
@ -390,21 +255,12 @@
<ClInclude Include="common.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="GeneratedFiles\ui_plcsetup.h">
<Filter>Generated Files</Filter>
</ClInclude>
<ClInclude Include="plc_item.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="GeneratedFiles\ui_alarmdialog.h">
<Filter>Generated Files</Filter>
</ClInclude>
<ClInclude Include="AlarmInfo.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="GeneratedFiles\ui_dialogin.h">
<Filter>Generated Files</Filter>
</ClInclude>
<ClInclude Include="ASyncQueue.h">
<Filter>Header Files</Filter>
</ClInclude>
@ -417,15 +273,6 @@
<ClInclude Include="PLC\PLCDevice.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="GeneratedFiles\ui_camera_glue.h">
<Filter>Generated Files</Filter>
</ClInclude>
<ClInclude Include="GeneratedFiles\ui_change_shift.h">
<Filter>Generated Files</Filter>
</ClInclude>
<ClInclude Include="GeneratedFiles\ui_output_statistic.h">
<Filter>Generated Files</Filter>
</ClInclude>
<ClInclude Include="tinyxml2.h">
<Filter>Header Files</Filter>
</ClInclude>

@ -2,11 +2,23 @@
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<QTDIR>D:\Qt\5.15.2\msvc2019_64</QTDIR>
<QTDIR>C:\Qt\5.15.2\msvc2019_64</QTDIR>
<LocalDebuggerEnvironment>PATH=$(QTDIR)\bin%3bD:\Qt\5.15.2\msvc2019_64\bin%3b$(PATH)</LocalDebuggerEnvironment>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<QTDIR>D:\Qt\5.15.2\msvc2019_64</QTDIR>
<QTDIR>C:\Qt\5.15.2\msvc2019_64</QTDIR>
<LocalDebuggerEnvironment>PATH=$(QTDIR)\bin%3bD:\Qt\5.15.2\msvc2019_64\bin%3b$(PATH)</LocalDebuggerEnvironment>
</PropertyGroup>
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<QtLastBackgroundBuild>2024-05-17T01:16:05.2665950Z</QtLastBackgroundBuild>
</PropertyGroup>
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<QtLastBackgroundBuild>2024-05-17T01:16:05.3293859Z</QtLastBackgroundBuild>
</PropertyGroup>
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<QtLastBackgroundBuild>2024-05-17T01:16:05.3832065Z</QtLastBackgroundBuild>
</PropertyGroup>
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<QtLastBackgroundBuild>2024-05-17T01:16:05.4290511Z</QtLastBackgroundBuild>
</PropertyGroup>
</Project>

@ -37,7 +37,6 @@ void CleanWorkThread::doWork()
qint64 spaceSize;
qint64 dirSize;
QString dirPath = g_conf_path.save_pics_path;
//QString iDriver = "D:/";
char drive[_MAX_DRIVE];
char dir_1[_MAX_DIR];
char fname[_MAX_FNAME];
@ -48,8 +47,10 @@ void CleanWorkThread::doWork()
LPCWSTR strDriver = (LPCWSTR)iDriver.utf16();
ULARGE_INTEGER freeDiskSpaceAvailable, totalDiskSpace, totalFreeDiskSpace;
qint64 gb = (1024 * 1024 * 1024);
//QString dir("D:/image");
QString dir(g_conf_path.save_pics_path + "/ALL");
QString dir(g_conf_path.save_pics_path);
QString dirALL(g_conf_path.save_pics_path + "/ALL");
QString dirNg(g_conf_path.save_pics_path + "/ng");
QString dirNg_result(g_conf_path.save_pics_path + "/ng_result");
if (delSelection == 2)
{
@ -60,6 +61,9 @@ void CleanWorkThread::doWork()
qint64 delDays = g_sys_conf.save_days;///
qint64 freeSize = g_sys_conf.freesize;
CleanImageFile(dir, delDays--);
CleanImageFile(dirALL, delDays--);
CleanImageFile(dirNg, delDays--);
CleanImageFile(dirNg_result, delDays--);
//调用函数获取磁盘参数(单位为字节Byte),转化为GB需要除以(1024*1024*1024)
GetDiskFreeSpaceEx(strDriver, &freeDiskSpaceAvailable, &totalDiskSpace, &totalFreeDiskSpace);
spaceSize = ((qint64)totalFreeDiskSpace.QuadPart * (100 / freeSize)) / (qint64)totalDiskSpace.QuadPart;
@ -67,6 +71,9 @@ void CleanWorkThread::doWork()
//delDays = g_sys_conf.save_days;
while ((spaceSize < 1) && (delDays > 1)) { //磁盘剩余空间小于百分之十
CleanImageFile(dir, delDays--);
CleanImageFile(dirALL, delDays--);
CleanImageFile(dirNg, delDays--);
CleanImageFile(dirNg_result, delDays--);
GetDiskFreeSpaceEx(strDriver, &freeDiskSpaceAvailable, &totalDiskSpace, &totalFreeDiskSpace);
spaceSize = ((qint64)totalFreeDiskSpace.QuadPart * (100 / freeSize)) / (qint64)totalDiskSpace.QuadPart;
}

Binary file not shown.

@ -1,14 +1,11 @@
#include "stdio.h"
#include "PLCDevice.h"
#include "modbus.h"
#include <iostream>
#include <common.h>
#include <QDebug>
extern SysConf g_sys_conf;
modbus_t* g_modbus = NULL; //Modbus TCP
bool PLCDevice::init_plc(PLCDevice* PLCptr)
{
// modbus_connect() 建立连接成功返回0错误返回-1
@ -17,15 +14,15 @@ bool PLCDevice::init_plc(PLCDevice* PLCptr)
const char* comport = g_sys_conf.ComPort.data();
qDebug() << "COM:" << comport;
//连接PLC
g_modbus = modbus_new_rtu(comport, 9600, 'N', 8, 1);
modbus_set_debug(g_modbus, 0); // 用flag设置debug调试标志位flag=1时显示modbus消息的字节
modbus_set_response_timeout(g_modbus, 1, 0); // 设置响应超时
modbus_connect(g_modbus);
modbus_set_slave(g_modbus, 1); // 设置从站id
PLCptr->g_modbus = modbus_new_rtu(comport, 9600, 'N', 8, 1);
modbus_set_debug(PLCptr->g_modbus, 0); // 用flag设置debug调试标志位flag=1时显示modbus消息的字节
modbus_set_response_timeout(PLCptr->g_modbus, 1, 0); // 设置响应超时
modbus_connect(PLCptr->g_modbus);
modbus_set_slave(PLCptr->g_modbus, 1); // 设置从站id
uint8_t data;
int ret = modbus_read_bits(g_modbus, 30000, 1, &data);
if (g_modbus && ret == -1) {
int ret = modbus_read_bits(PLCptr->g_modbus, 30000, 1, &data);
if (PLCptr->g_modbus && ret == -1) {
PLCptr->g_plc_ok = false;
}
else {
@ -35,6 +32,153 @@ bool PLCDevice::init_plc(PLCDevice* PLCptr)
return true;
}
bool PLCDevice::init_plc_tcp(PLCDevice* PLCptr)
{
#ifdef __ModebusServer
PLCptr->g_modbus = modbus_new_tcp("192.168.1.180", 2000);
modbus_set_debug(PLCptr->g_modbus, 0); // 用flag设置debug调试标志位flag=1时显示modbus消息的字节
modbus_set_response_timeout(PLCptr->g_modbus, 1, 0); // 设置响应超时
modbus_connect(PLCptr->g_modbus);
modbus_set_slave(PLCptr->g_modbus, 1); // 设置从站id
uint8_t data;
int ret = modbus_read_bits(PLCptr->g_modbus, 0, 1, &data);
// 连接失败
if (-1 == ret)
{
PLCptr->g_plc_ok = false;
qDebug("TCP connect failed:%s\n", modbus_strerror(errno));
}
else
{
PLCptr->g_plc_ok = true;
qDebug("TCP connect successful ");
}
#endif
#ifdef __ModebusClient
const char* ip = g_sys_conf.TcpIP.data();
qDebug() << "Client ip:" << ip;
qDebug() << "Client port:" << g_sys_conf.TcpPort;
PLCptr->g_modbus = modbus_new_tcp(ip, g_sys_conf.TcpPort);
modbus_set_debug(PLCptr->g_modbus, 0); // 用flag设置debug调试标志位flag=1时显示modbus消息的字节
modbus_set_response_timeout(PLCptr->g_modbus, 1, 0); // 设置响应超时
// 侦听主站连接
PLCptr->m_modbusSocket = modbus_tcp_listen(PLCptr->g_modbus, 1); // 最多支持的主机数量 1
/*设置线圈, 离散输入, 输入寄存器, 保持寄存器个数(数组元素个数))*/
PLCptr->mapping = modbus_mapping_new(PLCptr->m_numBits, PLCptr->m_numInputBits, PLCptr->m_numInputRegisters, PLCptr->m_numRegisters);
if (PLCptr->mapping == NULL)
{
modbus_free(PLCptr->g_modbus);
PLCptr->m_initialized = false;
return false;
}
PLCptr->m_initialized = true;
PLCptr->modSerThread = new std::thread(&PLCDevice::recieveMessages, PLCptr);
PLCptr->modSerThread->detach();
std::cout << "Running ModbusTcpSlave" << std::endl;
#endif
return true;
}
#ifdef __ModebusClient
/***************************************************************
* @file PLCDevice.cpp
* @author seer-txj
* @brief master
* @version v1
* @return null
* @date 2021/10/6
**************************************************************/
void PLCDevice::recieveMessages()
{
uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH];
int fd_num = 0, fd_max = 0, ret = 0, i = 0, clnt_sock = -1;
fd_set reads, cpy_reads;
FD_ZERO(&reads);
FD_SET(m_modbusSocket, &reads);
fd_max = m_modbusSocket;
while (m_initialized)
{
cpy_reads = reads;
if ((fd_num = select(fd_max + 1, &cpy_reads, 0, 0, 0)) == -1)
break;
if (fd_num == 0)
continue;
for (i = 0; i < fd_max + 1; i++)
{
if (FD_ISSET(i, &cpy_reads))
{
if (i == m_modbusSocket)
{
clnt_sock = modbus_tcp_accept(g_modbus, &m_modbusSocket);
if ((m_modbusSocket == -1) || (clnt_sock == -1))
{
std::cerr << modbus_strerror(errno) << std::endl;
continue;
}
FD_SET(clnt_sock, &reads);
if (fd_max < clnt_sock)
fd_max = clnt_sock;
}
else
{
ret = modbus_receive(g_modbus, query);
if (ret == 0)
{
m_errCount = 0;
continue;
}
else if (ret > 0)
{
m_errCount = 0;
// 填写输出内容用于测试实际输出在threadSendTCP::sendData中实现这边只要reply
/* mapping->tab_registers[0] = 0;
mapping->tab_registers[1] = 11;
mapping->tab_registers[2] = 22;
mapping->tab_input_registers[0] = 0;
mapping->tab_input_registers[1] = 33;
mapping->tab_input_registers[2] = 44;
mapping->tab_bits[0] = 0;
mapping->tab_bits[1] = 1;
mapping->tab_bits[2] = 0;
mapping->tab_input_bits[0] = 1;
mapping->tab_input_bits[1] = 0;
mapping->tab_input_bits[2] = 1;*/
modbus_reply(g_modbus, query, sizeof(query), mapping);
}
else
{
modbus_set_error_recovery(g_modbus, MODBUS_ERROR_RECOVERY_NONE);
modbus_set_error_recovery(g_modbus, MODBUS_ERROR_RECOVERY_LINK);
modbus_close(g_modbus);
FD_CLR(i, &reads);
#ifdef _WIN32
closesocket(i);
#else
close(i);
#endif // _WIN32
m_errCount++;
}
if(m_errCount > 5)
{
m_initialized = false;
break;
}
}
}
}
}
m_initialized = false;
}
#endif
bool PLCDevice::disconnect_plc(void)
{
if (g_modbus)
@ -108,3 +252,19 @@ int PLCDevice::read_short_from_plc(int addr, int nb, uint16_t* value)
return false;
}
}
int PLCDevice::write_2_plc(int addr, int nb, uint16_t* value)
{
if (g_plc_ok)
{
//g_mutex.lock();
int ret = modbus_write_registers(g_modbus, addr, nb, value);
//g_mutex.unlock();
//printf("modbus_write_registers:addr=%d,nb=%d,value=%d,ret=%d\n", addr, nb, *value, ret);
return ret;
}
else {
//std::cout << "PLC no ok" << std::endl;
return false;
}
}

@ -1,20 +1,36 @@
#include <QMutex>
#include "modbus.h"
#include "common.h"
class PLCDevice
{
public:
QMutex g_mutex; //访问Modbus的互斥锁
modbus_t* g_modbus = NULL; //Modbus
bool g_plc_ok;
//[0]:1=连接,0=断开
uint8_t g_plc_status;
#ifdef __ModebusClient
int m_modbusSocket;
bool m_initialized;
UINT8 m_errCount=0;
modbus_mapping_t* mapping{ nullptr };
/*Mapping*/
int m_numBits{ 500 };
int m_numInputBits{ 500 };
int m_numRegisters{ 500 };
int m_numInputRegisters{ 500 };
void recieveMessages();
std::thread *modSerThread;
#endif
static bool init_plc(PLCDevice* PLCptr);
static bool init_plc_tcp(PLCDevice* PLCptr);
int write_bit_2_plc(int addr, int value);
int read_bits_from_plc(int addr, int nb, uint8_t* value);
int write_short_2_plc(int addr, int nb, uint16_t* value);
int read_short_from_plc(int addr, int nb, uint16_t* value);
int write_2_plc(int addr, int nb, uint16_t* value);
bool disconnect_plc(void);
};

@ -24,14 +24,14 @@ bool AlgJd::init(QString model_path, QString model_name)
modelWeights = model_path.toStdString() + "/" + model_name.toStdString();
modelConfiguration = model_path.toStdString() + "/jd.cfg";
classesFile = model_path.toStdString() + "/jd.names";
image_path = model_path + "/" + "alg_jd.bmp";
image_path = model_path + "/" + "alg_jd.jpg";
}
else {
modelWeights = "D:/model/jd.weights";
classesFile = "D:/model/jd.names";
// Give the configuration and weight files for the model
modelConfiguration = "D:/model/jd.cfg";
image_path = "D:/model/alg_jd.bmp";
image_path = "D:/model/alg_jd.jpg";
}
std::ifstream classNamesFile(classesFile.c_str());
@ -53,12 +53,6 @@ bool AlgJd::init(QString model_path, QString model_name)
//cv::Mat image = cv::imread("alg_jd.bmp");
cv::Mat image = cv::imread(image_path.toStdString());
/*if (g_sys_conf.model_jpg_path.length() > 0) {
image = cv::imread(g_sys_conf.model_jpg_path.toStdString());
}
else {
image = cv::imread("D:/Release/alg_jd.bmp");
}*/
//识别一张图测试模型是否正确并且完成GPU数据加载
if (!image.data) return false; //判断测试图片是否正常读取
@ -117,9 +111,10 @@ bool AlgJd::test_detect_batcht(int shoot)
int AlgJd::detect(cv::Mat& _frame, cv::Mat& out, std::vector<std::pair<int, cv::Rect> >& results)
{
cv::Mat frame = _frame.clone();
cv::Mat image_clone = frame.clone();
//cv::Mat image_clone = frame.clone();
// Process frames.
// Create a 4D blob from a frame.
//图像预处理:
cv::Mat blob;
cv::dnn::blobFromImage(frame, blob, 1 / 255.0, cv::Size(inpWidth, inpHeight), cv::Scalar(0, 0, 0), true, false);

@ -2,8 +2,9 @@
#include <opencv2/opencv.hpp>
#define NumberOfSupportedCameras 4
#define NumberOfSupportedCameras 3
//双软件
#define NumberOfIdentityCameras 8
#define EdgeEvent 1
#define ImageCap 2

@ -21,7 +21,7 @@ ConfPath g_conf_path;
SysConf g_sys_conf; //系统配置参数
ModbusConf g_modbus_conf; //modbus地址参数
PLCDevice* m_PLCDevice;
PLCDevice *m_PLCDevice,*m_PLCTCPDevice;
bool g_plc_dialog_open; //是否打开plc配置对话框
QDateTime g_ts_start;
@ -67,6 +67,7 @@ SyncQueue<_UDPSendInfo>* UDP_Info_queue;
#endif
#ifdef __TCPSend
SyncQueue<_TCPSendInfo>* TCP_Info_queue;
#endif
bool flag = false;
SyncQueue<_XMLExportDataInfo>* export_XMLData_Info_queue;
@ -113,44 +114,53 @@ Cigarette::Cigarette(QWidget* parent)
InitPtrMat();
read_conf(g_conf_path);
if (!g_conf_path.config_path.isEmpty()) {
if (!g_conf_path.config_path.isEmpty()) {//判断conf路径是否存在 空 isEmpty=1不空 isEmpty=0
// 如果非空
QDir* dirinfo = new QDir(g_conf_path.config_path);
if (!dirinfo->exists()) {
// 如果文件夹信息不存在
delete dirinfo, dirinfo = nullptr;
g_conf_path.config_path = "D:/conf";
g_conf_path.config_path = DEFAULT_CONFPATH_PATH;
}
delete dirinfo, dirinfo = nullptr;
}
else
g_conf_path.config_path = "D:/conf";
{
#ifdef __DEBUGPATH
g_conf_path.config_path = "../conf/conf.txt";
#else
g_conf_path.config_path = DEFAULT_CONFPATH_PATH;
#endif
}
bool update_rotate = false;
if (!read_rotate_message()) {
if (!read_rotate_message()) {//读取旋转参数
update_rotate = true;
}
QThread* hThread = new QThread();
CLog* clogWorkThread = new CLog();
clogWorkThread->moveToThread(hThread);
connect(this, &Cigarette::destroyed, hThread, &QThread::quit);
connect(hThread, &QThread::finished, clogWorkThread, &CLog::deleteLater);
connect(this, &Cigarette::sengMsgToClog, clogWorkThread, &CLog::recMegFromCigarette);
QThread* hThread = new QThread();//主线程
CLog* clogWorkThread = new CLog();//日志线程
clogWorkThread->moveToThread(hThread);//将日志线程依附到主线程(相当于父类)
connect(this, &Cigarette::destroyed, hThread, &QThread::quit);//Cigarette退出系统了或这个类崩溃了清除Qt所有线程
connect(hThread, &QThread::finished, clogWorkThread, &CLog::deleteLater);//Qt类结束清除日志类
connect(this, &Cigarette::sengMsgToClog, clogWorkThread, &CLog::recMegFromCigarette);// sengMsgToClog 写日志的信号recMegFromCigarette 写日志操作
hThread->start();
emit sengMsgToClog("Application Start.");
//初始化队列
//保存队列
g_save_queue = new SyncQueue<std::pair<std::string, cv::Mat>>(Queue_Size);
g_save_queue->name = "save queue";
#ifdef __UDPSend
UDP_Info_queue = new SyncQueue<_UDPSendInfo>(Queue_Size);
UDP_Info_queue->name = "UDP Info queue";
#endif
//TCP队列
#ifdef __TCPSend
TCP_Info_queue = new SyncQueue<_TCPSendInfo>(Queue_Size);
TCP_Info_queue->name = "TCP Info queue";
#endif
//FTP数据队列
#ifdef __ExportData
export_XMLData_Info_queue = new SyncQueue<_XMLExportDataInfo>(Queue_Size);
export_XMLData_Info_queue->name = "Export Data Info queue";
@ -158,6 +168,7 @@ Cigarette::Cigarette(QWidget* parent)
last_shift = 256;
work_camera_nums = 0;
//相机公共队列(合成图片)
#ifdef SYNC_CAMERA
g_image_sync_queue = new SyncQueue<std::vector<std::pair<int, cv::Mat>>>(Queue_Size);
g_image_sync_queue->name = format("sync_image");
@ -165,20 +176,26 @@ Cigarette::Cigarette(QWidget* parent)
for (int i = 0; i < NumberOfSupportedCameras; i++)
{
#ifndef SYNC_CAMERA
//相机单独队列
g_image_queue[i] = new SyncQueue<std::pair<int, cv::Mat> >(Queue_Size);
g_image_queue[i]->name = format("image_%d", i);
#endif
//结果队列
g_result_queue[i] = new ASyncQueue<bool>(Queue_Size);
g_result_queue[i]->name = format("result_%d", i);
//结果延后队列
g_result_wait_queue[i] = new ASyncQueue<bool>(Queue_Size);
g_result_wait_queue[i]->name = format("result_wait%d", i);
//两个结果队列
g_double_queue[i] = new ASyncQueue<bool>(Queue_Size);
g_double_queue[i]->name = format("double_wait%d", i);
//拍照队列
g_shooted_queue[i] = new ASyncQueue<bool>(Queue_Size);
g_shooted_queue[i]->name = format("shooted_%d", i);
//调试队列
g_debug_queue[i] = new SyncQueue<cv::Mat>(Queue_Size);
g_debug_queue[i]->name = format("debug_%d", i);
if (update_rotate) {
if (update_rotate) {//未读到旋转参数,进行初始化
rotationAngle[i] = cv::ROTATE_90_COUNTERCLOCKWISE + 1;
isNeedRotate[i] = false;
}
@ -196,7 +213,7 @@ Cigarette::Cigarette(QWidget* parent)
g_op_time = OP_TIME;
g_op_pswd = read_op_pswd();
g_working = false;
g_working = false;//调试标志
g_debug_mode = false;
g_alarm_msg << QStringLiteral("无报警") /// 0
@ -219,14 +236,14 @@ Cigarette::Cigarette(QWidget* parent)
for (int i = 0; i < NumberOfSupportedCameras; i++)
{
g_display_label_conf[i].g_max[0] = false;
g_display_label_conf[i].g_max[0] = false;//视图最大化
g_display_label_conf[i].g_max[1] = false;
OpenWithUserID[i] = 0xff;
production_number[i] = 0;
lcdNumber_total_mat[i]->display(production_number[i]);
OpenWithUserID[i] = 0xff;//没用
production_number[i] = 0;//检测个数
lcdNumber_total_mat[i]->display(production_number[i]);//display 显示到界面
ok[i] = 0;
ng[i] = 0;
g_display_label_conf[i].g_last_mat[0] = cv::Mat::zeros(20, 20, CV_8UC3);
g_display_label_conf[i].g_last_mat[0] = cv::Mat::zeros(20, 20, CV_8UC3);//放大后的图片
g_display_label_conf[i].g_last_mat[1] = cv::Mat::zeros(20, 20, CV_8UC3);
#ifdef DRAW_RECT
DrawRect_init(i);
@ -256,12 +273,15 @@ Cigarette::Cigarette(QWidget* parent)
g_modbus_conf.debug = 0;
g_modbus_conf.reset = 0;
g_modbus_conf.alarm = 0;
g_modbus_conf.heart = 0;
read_modbus_config(g_modbus_conf); //初始化modbus地址
//保存图片线程
saveThread.init();
saveThread.init();//初始化
#ifdef __TCPSend
#ifdef __ExportData
connect(&saveThread, &SaveThread::sendDataToExport, &exportDataThread, &ExportDataThread::GetDataFromSaveThread);
connect(&sync_work_thread, &SyncWorkThread::sendDataToCompress, &exportDataThread, &ExportDataThread::GetDataFromSaveThread);
#endif
#endif
saveThread.start_work();
#ifdef __UDPSend
@ -273,22 +293,31 @@ Cigarette::Cigarette(QWidget* parent)
connect(rThread, &threadReceive::sendMsgToCigratte, this, &Cigarette::recMsgFromUdp);
rThread->start_work();
#endif
//初始化TCP数据传输线程
#ifdef __TCPSend
std::string serverIp = g_sys_conf.TcpIP;
int serverPort = g_sys_conf.TcpPort;
tcpSendThread.init(TCP_Info_queue, serverIp, serverPort);
tcpSendThread.start_work();
#endif
#ifdef __ExportData
exportDataThread.init();
#endif
//初始化FTP数据传输线程
#ifdef __ExportData
string ftpip = g_sys_conf.FtpIP;
int ftpport = g_sys_conf.FtpPort;
string ftpusername = g_sys_conf.FtpUserName;
string ftpuserpwd = g_sys_conf.FtpUserPwd;
exportDataThread.init(ftpip,ftpport,ftpusername,ftpuserpwd);
connect(this, &Cigarette::sendMsgToExportData, &exportDataThread, &ExportDataThread::EDrecMsgFromCigarette);
exportDataThread.start_work();
//connect(this, &Cigarette::sendMsgToExportData, &exportDataThread, &ExportDataThread::EDrecMsgFromCigarette);
#endif
//初始化通讯PLC
m_PLCDevice = new PLCDevice;
PLCDevice::init_plc(m_PLCDevice);
m_PLCTCPDevice = new PLCDevice;
PLCDevice::init_plc_tcp(m_PLCTCPDevice);
if (m_PLCDevice->g_plc_ok)
{
printf("Connected to dev!\n");
@ -315,26 +344,27 @@ Cigarette::Cigarette(QWidget* parent)
}
std::cout << " Enumerate Cameras..." << std::endl;
EnumerateCameras((SingleCamInfoStruct*)&SingleCamInfo, true, g_sys_conf);
EnumerateCameras((SingleCamInfoStruct*)&SingleCamInfo, true, g_sys_conf);//枚举相机
// 剔除值清0
int ret = m_PLCDevice->write_bit_2_plc(g_modbus_conf.shift, 1);//给PLC发送换班消息
#ifdef SYNC_CAMERA
CreatWorkThread(0, 0, this);
CreatWorkThread(0, 0, this);//创建相机公共工作线程
#endif
//创建相机工作线程
for (int i = 0; i < NumberOfSupportedCameras; i++)
{
if (SingleCamInfo[i].Detect) {
work_camera_nums++;
//读取模型文件
if (SingleCamInfo[i].Detect) {//检测相机是否存在
work_camera_nums++;//相机数量
cam_status_mat[i]->setStyleSheet(tr("background-color: rgb(0, 170, 0);"));
QString model_path, model_name;
if (g_sys_conf.model_path.isEmpty()) {
model_path = "D:/model";
g_sys_conf.model_path = "D:/model";
model_path = DEFAULT_MODEL_PATH;
g_sys_conf.model_path = DEFAULT_MODEL_PATH;
}
else
model_path = g_sys_conf.model_path;
@ -352,14 +382,15 @@ Cigarette::Cigarette(QWidget* parent)
exit(-1);
}
#ifdef SYNC_CAMERA
//调试模式线程
debug_thread[i].init(g_debug_queue[i], i);
connect(&debug_thread[i], SIGNAL(notify(int, int, cv::Mat)), this, SLOT(OnNotifyHub(int, int, cv::Mat)));
debug_thread[i].start_work();
#else
CreatWorkThread(SingleCamInfo[i].CamClass, i, this);
CreatWorkThread(SingleCamInfo[i].CamClass, i, this);//创建相机单独工作线程
#endif
}
else {
else {//报警信息
QDateTime ts_start = QDateTime::currentDateTime();
QTime time = QTime::currentTime();
QDateTime local(ts_start);
@ -428,9 +459,9 @@ Cigarette::Cigarette(QWidget* parent)
sThread.sendData("LockOk", g_sys_conf.FeedbackPort);
#endif
DisableDebugMode();
//读取PLC信息等
m_pTimer = new QTimer(this);
connect(m_pTimer, SIGNAL(timeout()), this, SLOT(handleTimeout()));
connect(m_pTimer, SIGNAL(timeout()), this, SLOT(handleTimeout()));//SIGNAL(timeout())周期性触发SLOT(handleTimeout())周期为start(1000);
m_pTimer->start(1000);
m_delay = new QTimer(this);//换班防连击
@ -440,19 +471,28 @@ Cigarette::Cigarette(QWidget* parent)
m_sendMsg_delay = new QTimer(this);
connect(m_sendMsg_delay, SIGNAL(timeout()), this, SLOT(sendLatestData()));
#endif
//SIGNAL信号函数与SLOT槽函数参数必须对应
//无参信号对应无参槽函数
//检查操作员时间
m_op_delay = new QTimer(this);
connect(m_op_delay, SIGNAL(timeout()), this, SLOT(op_timeout()));
//检查管理员时间
m_admin_delay = new QTimer(this);
connect(m_admin_delay, SIGNAL(timeout()), this, SLOT(admin_timeout()));
//定时自动清理照片
clean_pTimer = new QTimer(this);
connect(clean_pTimer, SIGNAL(timeout()), this, SLOT(CleanThreadStartAuto()));
clean_pTimer->start(3600000);
//报警标签双击消警
connect(ui.label_alarm, SIGNAL(QlabelDoubleClick()), this, SLOT(OnCancelAlarm()));//
connect(ui.label_alarm, SIGNAL(QlabelDoubleClick()), this, SLOT(OnCancelAlarm()));//报警标签双击消警
//心跳检测
heartbeat_pTimer = new QTimer(this);
connect(heartbeat_pTimer, SIGNAL(timeout()), this, SLOT(heartbeat()));
heartbeat_pTimer->start(5000);
//无参对有参需要利用信号转发器QSignalMapper(this)
//信号转发器
image_lable_DBsignalMapper0 = new QSignalMapper(this);
image_lable_DBsignalMapper1 = new QSignalMapper(this);
image_lable_TPsignalMapper0 = new QSignalMapper(this);
@ -461,11 +501,14 @@ Cigarette::Cigarette(QWidget* parent)
pTimer_Cam_signalMapper = new QSignalMapper(this);
toolButton_cam_signalMapper = new QSignalMapper(this);
RotateReleased_signalMapper = new QSignalMapper(this);
for (int i = 0; i < NumberOfSupportedCameras; i++)
{
{
//SIGNAL信号函数与SLOT槽函数参数必须对应
m_pTimer_Cam_mat[i] = new QTimer(this);
connect(m_pTimer_Cam_mat[i], SIGNAL(timeout()), pTimer_Cam_signalMapper, SLOT(map()));
pTimer_Cam_signalMapper->setMapping(m_pTimer_Cam_mat[i], i);
pTimer_Cam_signalMapper->setMapping(m_pTimer_Cam_mat[i], i);//此句执行后map()=>mapped(int);相当于无参变有参
connect(display_lable_mat[i][0], SIGNAL(QlabelDoubleClick()), image_lable_DBsignalMapper0, SLOT(map()));
image_lable_DBsignalMapper0->setMapping(display_lable_mat[i][0], i << 4 | 0);
@ -489,6 +532,8 @@ Cigarette::Cigarette(QWidget* parent)
RotateReleased_signalMapper->setMapping(rotate_mat[i], i);
}
//SIGNAL信号函数与SLOT槽函数参数必须对应
//有参对有参
connect(toolButton_cam_signalMapper, SIGNAL(mapped(int)), this, SLOT(OnToolButtonCamReleasedHub(int)));
//connect(pTimer_Cam_signalMapper, SIGNAL(mapped(int)), this, SLOT(OpenCamTimeoutHub(int)));
connect(image_lable_DBsignalMapper0, SIGNAL(mapped(int)), this, SLOT(OnDBClickHub(int)));
@ -531,9 +576,11 @@ Cigarette::Cigarette(QWidget* parent)
}
if (m_PLCDevice->g_plc_ok) {
BeforeWork(g_sys_conf.shoot);
BeforeWork(g_sys_conf.shoot);//预热
int ret = m_PLCDevice->write_bit_2_plc(g_modbus_conf.work, 1);
ui.label_title->setStyleSheet(tr("background-color: rgb(0, 170, 0);"));
ui.label_title_2->setStyleSheet(tr("background-color: rgb(0, 170, 0);"));
ui.label_title_2->setText(QStringLiteral("运行中"));
#ifdef __UDPSend
sThread.sendData("Work", g_sys_conf.FeedbackPort);
#endif
@ -601,6 +648,8 @@ void Cigarette::start_work()
ret = m_PLCDevice->write_bit_2_plc( g_modbus_conf.work, 1);*/
//printf("write:\t%d\n", ret);
ui.label_title->setStyleSheet(tr("background-color: rgb(0, 170, 0);"));
ui.label_title_2->setStyleSheet(tr("background-color: rgb(0, 170, 0);"));
ui.label_title_2->setText(QStringLiteral("运行中"));
#ifdef __UDPSend
sThread.sendData("Work", g_sys_conf.FeedbackPort);
#endif
@ -617,6 +666,8 @@ void Cigarette::start_work()
//开始按钮
void Cigarette::on_btn_start_released()
{
uint16_t data[2] = { 1111,0 };
m_PLCTCPDevice->write_2_plc(0, 70, data);//条盒
emit sengMsgToClog("Start to work.");
if (!g_admin_mode)
{
@ -651,6 +702,8 @@ void Cigarette::pause_work()
int ret = m_PLCDevice->write_bit_2_plc(g_modbus_conf.work, 0);
//printf("write:\t%d\n", ret);
ui.label_title->setStyleSheet(tr("background-color: rgb(255, 255, 0);"));
ui.label_title_2->setStyleSheet(tr("background-color: rgb(255, 255, 0);"));
ui.label_title_2->setText(QStringLiteral("未运行"));
#ifdef __UDPSend
sThread.sendData("NoWork", g_sys_conf.FeedbackPort);
#endif
@ -721,6 +774,10 @@ void Cigarette::Exit()
m_PLCDevice->disconnect_plc();
delete m_PLCDevice;
}
if (m_PLCTCPDevice) {
m_PLCTCPDevice->disconnect_plc();
delete m_PLCTCPDevice;
}
qApp->quit();
this->close();
@ -994,7 +1051,7 @@ void Cigarette::OnToolButtonCamReleasedHub(int Num)
QMessageBox::information(NULL, QStringLiteral("权限检查"), QStringLiteral("请先点击解锁按钮,进入管理员模式"), QMessageBox::Ok);
}
}
//重连相机
void Cigarette::ReconnectCamHub(int Num)
{
//close
@ -1007,7 +1064,6 @@ void Cigarette::ReconnectCamHub(int Num)
}
}
}
void Cigarette::OpenCamTimeoutHub(int Num) //重新打开相机
{
//open
@ -1024,14 +1080,14 @@ void Cigarette::OnKey(QKeyEvent* event)
int Cnt = CurOpLabel & 0x0f;
std::lock_guard<std::mutex> locker(g_display_label_conf[Num].lock);
if (event->key() == Qt::Key_Escape && event->isAutoRepeat() == false)
if (event->key() == Qt::Key_Escape && event->isAutoRepeat() == false)//画框Esc清除参数
{
if (g_display_label_conf[Num].RectVet[Cnt].size())
{
g_display_label_conf[Num].RectVet[Cnt].pop_back();
}
}
else if (event->key() == Qt::Key_Return && event->isAutoRepeat() == false)
else if (event->key() == Qt::Key_Return && event->isAutoRepeat() == false)//画框回车保存参数
{
std::fstream cfg_file;
char buf[256];
@ -1537,7 +1593,13 @@ void Cigarette::admin_timeout()
}
}
void Cigarette::handleTimeout()
//心跳检测
void Cigarette::heartbeat()
{
int ret = m_PLCDevice->write_bit_2_plc(g_modbus_conf.heart, 1);
}
void Cigarette::handleTimeout()//获取时间读取PLC产量、剔除数检测相机状态读取PLC报警信息
{
QDateTime ts_start = QDateTime::currentDateTime();
QTime time = QTime::currentTime();
@ -2044,8 +2106,8 @@ void Cigarette::on_pushButton_clear_released()//换班
g_op_time = OP_TIME;
ui.pushButton_clear->setEnabled(false);
m_delay->setSingleShot(true);
m_delay->start(5000);
m_delay->setSingleShot(true);//执行一次
m_delay->start(5000);//5秒
Sleep(500);
for (int i = 0; i < NumberOfSupportedCameras; i++)
{
@ -2087,7 +2149,11 @@ void Cigarette::on_pushButton_clear_released()//换班
QString Cigarette::read_pswd()
{
std::fstream cfg_file;
#ifdef __DEBUGPATH
cfg_file.open("pswd.txt");
#else
cfg_file.open("D:/Release/pswd.txt");
#endif
if (!cfg_file.is_open())
{
std::cout << "Error: Open config file pswd.txt" << std::endl;
@ -2119,7 +2185,11 @@ QString Cigarette::read_pswd()
QString Cigarette::read_op_pswd()
{
std::fstream cfg_file;
#ifdef __DEBUGPATH
cfg_file.open("pswd_op.txt");
#else
cfg_file.open("D:/Release/pswd_op.txt");
#endif
if (!cfg_file.is_open())
{
std::cout << "Error: Open config file pswd_op.txt" << std::endl;
@ -2150,15 +2220,15 @@ QString Cigarette::read_op_pswd()
bool Cigarette::read_conf(ConfPath& conf_path) {
std::fstream conf_file;
conf_file.open(CONFPATH);
if (!conf_file.is_open()) {
if (!conf_file.is_open()) {//判断能否打开文件
std::cout << "Error: Open conf path file " << CONFPATH << std::endl;
return false;
}
while (!conf_file.eof()) {
while (!conf_file.eof()) {//从头读到尾完成后conf_file.eof()==TRUE
char tmp[256] = "";
conf_file.getline(tmp, 256);
std::string line(tmp);
if (line.length() > 0) {
if (line.length() > 0) {//按行读取
size_t pos = line.find('=');
std::string tmp_key = line.substr(0, pos);
if (tmp_key == "CONF_PATH") {
@ -2566,6 +2636,22 @@ bool Cigarette::read_sys_config(SysConf& conf, QString conf_path)
{
conf.TcpPort = atoi(line.substr(pos + 1).c_str());
}
else if (tmp_key == "FtpIP")
{
conf.FtpIP = line.substr(pos + 1);
}
else if (tmp_key == "FtpPort")
{
conf.FtpPort = atoi(line.substr(pos + 1).c_str());
}
else if (tmp_key == "FtpUserName")
{
conf.FtpUserName= line.substr(pos + 1);
}
else if (tmp_key == "FtpUserPwd")
{
conf.FtpUserPwd = line.substr(pos + 1);
}
}
}
@ -2627,6 +2713,10 @@ bool Cigarette::read_modbus_config(ModbusConf& conf)
{
conf.alarm = atoi(line.substr(pos + 1).c_str());
}
else if (tmp_key == "HEART")
{
conf.heart = atoi(line.substr(pos + 1).c_str());
}
}
}
cfg_file.close();
@ -2821,7 +2911,7 @@ void Cigarette::init_plc_value()
void Cigarette::CreatWorkThread(int classid, int Num, Cigarette* classptr)
{
#ifdef SYNC_CAMERA
sync_work_thread.init(g_image_sync_queue, g_result_queue[0]);
sync_work_thread.init(g_image_sync_queue, g_result_queue, 0); // 默认使用第一个相机的数据
connect(&sync_work_thread, SIGNAL(notify(int, int, cv::Mat)), classptr, SLOT(OnNotifyHub(int, int, cv::Mat)));
connect(&sync_work_thread, SIGNAL(display_timecost(int, int)), classptr, SLOT(OnDisplayTimeCostHub(int, int)));
connect(&sync_work_thread, SIGNAL(display_check_total(int, long)), classptr, SLOT(OnDisplayCheckNumberHub(int, long)));
@ -3127,11 +3217,11 @@ bool Cigarette::ControlCamOpenOrClose(int Num, bool OpenOrClose)
else if (SingleCamInfo[Num].CamClass == HIKClassID)
{
qDebug() << "open for hik";
int nRet = MV_OK;
int nRet = MV_OK;//海康内部定义MV_OK = 0x0000000;
void* camhandle;
nRet = MV_CC_CreateHandle(&camhandle, HIKCamera::stDeviceList.pDeviceInfo[SingleCamInfo[Num].unfiltered_num]);
HIKCamHandle[Num] = camhandle;
nRet = MV_CC_OpenDevice(camhandle);
nRet = MV_CC_OpenDevice(camhandle);//打开相机成功返回MV_OK
if (nRet)
{
MV_CC_CloseDevice(camhandle);
@ -3143,6 +3233,7 @@ bool Cigarette::ControlCamOpenOrClose(int Num, bool OpenOrClose)
}
if (HIKCamera::stDeviceList.pDeviceInfo[SingleCamInfo[Num].unfiltered_num]->nTLayerType == MV_GIGE_DEVICE)
{
//配置网口相机
int nPacketSize = MV_CC_GetOptimalPacketSize(camhandle);
if (nPacketSize > 0)
{
@ -3236,7 +3327,7 @@ bool Cigarette::ControlCamOpenOrClose(int Num, bool OpenOrClose)
if (!g_debug_mode)
connect(pHIKCaptureThread[Num], SIGNAL(updateStatistics(const QString&, int)), this, SLOT(updateStatisticsHub(const QString&, int)));
pThread[Num]->start();
if (pThread[Num]->isRunning())
if (pThread[Num]->isRunning())//线程开始工作后打印消息
{
qDebug() << "hik pThread OK";
SingleCamInfo[Num].IsOpen = true;
@ -3250,6 +3341,7 @@ bool Cigarette::ControlCamOpenOrClose(int Num, bool OpenOrClose)
if (SingleCamInfo[Num].CamClass == BalluffClassID)
{
qDebug() << "close for balluff";
//取消函数连接
disconnect(pThread[Num], SIGNAL(started()), pCaptureThread[Num], SLOT(process()));
//disconnect(pCaptureThread[Num], SIGNAL(error(QString)), this, SLOT(errorString(QString)));
disconnect(pCaptureThread[Num], SIGNAL(finished()), pThread[Num], SLOT(quit()));
@ -3347,7 +3439,7 @@ void Cigarette::EnumerateCameras(SingleCamInfoStruct* TempSingleCamInfoStruct, b
Pylon::CInstantCameraArray cameras(filtered);
Pylon::CTlFactory& tlFactory = Pylon::CTlFactory::GetInstance();
for (int i = 0; i < min(filtered, NumberOfSupportedCameras); i++)
for (int i = 0; i < min(filtered, NumberOfIdentityCameras); i++)
{
SingleCamInfoStruct CamInfo;
//cameras[i].Attach(tlFactory.CreateDevice(BaslerCamera::devices[i]));
@ -3378,7 +3470,7 @@ void Cigarette::EnumerateCameras(SingleCamInfoStruct* TempSingleCamInfoStruct, b
int hik_cnt = 0;
int unfiltered = 0;
unfiltered = HIKCamera::Enumerate();
for (int i = 0; i < min(unfiltered, NumberOfSupportedCameras); i++)
for (int i = 0; i < min(unfiltered, NumberOfIdentityCameras); i++)
{
MV_CC_DEVICE_INFO* pDeviceInfo = HIKCamera::stDeviceList.pDeviceInfo[i];
std::string manufacture;
@ -3441,7 +3533,7 @@ void Cigarette::EnumerateCameras(SingleCamInfoStruct* TempSingleCamInfoStruct, b
int balluff_cnt = 0;
unfiltered = BalluffCamera::Enumerate();
for (int i = 0; i < min(unfiltered, NumberOfSupportedCameras); i++)
for (int i = 0; i < min(unfiltered, NumberOfIdentityCameras); i++)
{
Device* pDev = BalluffCamera::devMgr[i];
if (!pDev->isInUse()) {
@ -3542,7 +3634,7 @@ void Cigarette::EnableDebugMode()
}
g_debug_mode = true;
}
//非调试模式
void Cigarette::DisableDebugMode()
{
for (int i = 0; i < NumberOfSupportedCameras; i++)
@ -3600,7 +3692,7 @@ void Cigarette::CleanThreadStart()
QThread* handleThread = new QThread();
CleanWorkThread* cleanWorkThread = new CleanWorkThread();
cleanWorkThread->moveToThread(handleThread);
cleanWorkThread->moveToThread(handleThread);//依附到handleThread线程
connect(handleThread, &QThread::started, cleanWorkThread, &CleanWorkThread::startWork);
connect(cleanWorkThread, &CleanWorkThread::workStart, cleanWorkThread, &CleanWorkThread::setSel);
@ -3629,39 +3721,70 @@ void Cigarette::record_output_statistic(qint64 quantity, int Kick[NumberOfSuppor
QString file_name, file_path;
for (int i = 0; i < NumberOfSupportedCameras; i++)
{
if (SingleCamInfo[i].IsOpen && quantity > 0) {
if (SingleCamInfo[i].IsOpen) //&& quantity > 0
{
std::fstream cfg_file;
file_name = QString(STATISTIC_FILE).arg(i);
file_path = g_conf_path.config_path + "/" + file_name;
char buf[256];
memset(buf, 0, 256);
sprintf(buf, "%s", file_path.toLocal8Bit().constData());
cfg_file.open(buf, std::ios::app);
if (cfg_file.good())
{
if (last_shift == 2 || last_shift == 256) {
memset(buf, 0, 256);
sprintf(buf, "\n\n**************************************************************************************\n");
cfg_file.write(buf, strlen(buf));
//QDate date = QDate::currentDate();
QDateTime date = QDateTime::currentDateTime();
memset(buf, 0, 256);
sprintf(buf, "%s:\n", date.toString("yyyy-MM-dd_HH-mm-ss").toStdString().c_str());
cfg_file.write(buf, strlen(buf));
}
memset(buf, 0, 256);
double ng_rate;
if (ng[i] > 0)
ng_rate = double(ng[i]) / production_number[i];
else
ng_rate = 0;
QDateTime date = QDateTime::currentDateTime();
string nowtime = date.toString("yyyy-MM-dd_HH:mm:ss").toStdString().c_str();
double ng_rate;
if (ng[i] > 0)
{
ng_rate = double(ng[i]) / production_number[i];
}
else
{
ng_rate = 0;
}
if (quantity > 0)
{
sprintf(buf, "%c 总产量:%010I64d 剔除率:%02.5f%% 合格率:%02.5f%% NG率:%02.5f%%\n", (shift == 0) ? 'A' : ((shift == 1) ? 'B' : 'C'), quantity, ((double)Kick[i] / quantity) * 100, (1.0 - ng_rate) * 100, ng_rate * 100);
cfg_file.write(buf, strlen(buf));
memset(buf, 0, 256);
}
cfg_file.close();
else
{
sprintf(buf, "%c 总产量:%010I64d 剔除率:%02.5f%% 合格率:%02.5f%% NG率:%02.5f%%\n", (shift == 0) ? 'A' : ((shift == 1) ? 'B' : 'C'), quantity, 0.00, 0.00, 0.00);
}
std::ifstream file(file_path.toStdString());
std::ifstream file_(file_path.toStdString());
std::vector<std::string> lines; //用于存储文件的所有行
if (file_.good())
{
file_.close();
}
else
{
std::ofstream outFile(file_path.toStdString());
std::string fristNews = "**************************************************************************************\n" + nowtime + "\n" + buf;
outFile << fristNews << endl;
outFile.close();
}
if (file.is_open())
{
std::string line;
while (std::getline(file, line))
{
lines.push_back(line);
}
file.close();
// 在第一行添加数据
std::string newData = "**************************************************************************************\n"+nowtime +"\n" + buf;
if (!lines.empty())
{
lines.insert(lines.begin(), newData); // 在vector的开始位置插入新数据
}
// 将修改后的数据写回文件
std::ofstream outFile(file_path.toStdString());
if (outFile.is_open())
{
for (const auto& l : lines)
{
outFile << l << std::endl;
}
outFile.close();
}
}
}
}
last_shift = shift;

@ -129,6 +129,8 @@ private slots:
void OnExit();
void OnRestart();
void OnAdmin();
void heartbeat();//心跳检测
#ifdef __DEBUG
void TestImg();
void TestImgs();
@ -197,6 +199,7 @@ public:
QTimer* m_op_delay; //操作员权限剩余时间
QTimer* m_admin_delay; //操作员权限剩余时间
QTimer* clean_pTimer; //定时清理任务
QTimer* heartbeat_pTimer; //心跳检测
QSignalMapper* image_lable_DBsignalMapper0;
QSignalMapper* image_lable_DBsignalMapper1;
@ -215,18 +218,20 @@ private:
threadSend sThread;
threadReceive* rThread;
#endif
//TCP数据传输
#ifdef __TCPSend
private:
threadSendTCP tcpSendThread;
#endif
public slots:
public slots://槽函数:接收信号
void CleanThreadStartAuto();
#ifdef __UDPSend
void recMsgFromUdp(QString data);
#endif
//void ClogThreadStart();
signals:
signals://信号函数:发信号
void sengMsgToClog(QString);
void sendMsgToExportData();
};

@ -6,7 +6,8 @@
#include <ShlObj.h>
#include <Commdlg.h>
#include <tchar.h>
//字符分割
//str传进来的字符串pattern分隔符out分割后的结果。例子Cigarette::read_plc_items()
int string_split(std::string str, std::string pattern, std::vector<std::string>& out)
{
std::string::size_type pos;
@ -31,19 +32,19 @@ int string_split(std::string str, std::string pattern, std::vector<std::string>&
std::string format(const char* pszFmt, ...)
{
std::string str;
va_list args;
va_start(args, pszFmt);
va_list args;//表示一个变长参数列表
va_start(args, pszFmt);//用于在使用可变参数函数时获取可变参数的起始地址
{
int nLength = _vscprintf(pszFmt, args);
int nLength = _vscprintf(pszFmt, args);//格式化字符串,获取字符串长度
nLength += 1;
std::vector<char> chars(nLength);
_vsnprintf(chars.data(), nLength, pszFmt, args);
str.assign(chars.data());
_vsnprintf(chars.data(), nLength, pszFmt, args);//指定字符串大小
str.assign(chars.data());//赋值
}
va_end(args);
va_end(args);//清除va_list数据
return str;
}
//画框:胶点范围检测
void DrawSelectRects(cv::Mat input, DisplayLabelConf& t_DisplayLabelConf, int Cnt)
{
if (t_DisplayLabelConf.Flag[Cnt] & DisplayLabel_Type_Bit) {
@ -75,11 +76,11 @@ void DrawSelectRects(cv::Mat input, DisplayLabelConf& t_DisplayLabelConf, int Cn
}
bool CheckSelectRects(
cv::Mat input,
std::vector<std::vector<std::pair<int, cv::Rect> > >& VecRects,
int VecCnt,
DisplayLabelConf& t_DisplayLabelConf,
int LabelCnt
cv::Mat input,//图像
std::vector<std::vector<std::pair<int, cv::Rect> > >& VecRects,//胶点结果
int VecCnt,//第几张图像
DisplayLabelConf& t_DisplayLabelConf,//画的框
int LabelCnt//第几个框
)
{
bool find;
@ -120,7 +121,7 @@ bool CheckSelectRects(
}
return false;
}
//获取路径下的所有文件放到files里。例子void Cigarette::TestImgs()
void getFiles(std::string path, std::vector<std::string>& files)
{
//文件句柄
@ -140,7 +141,7 @@ void getFiles(std::string path, std::vector<std::string>& files)
_findclose(hFile);
}
}
//wstring是宽字符(中文汉字)占2个字节string是窄字符(英文啥的)占1个字节
std::string WstringToString(std::wstring wstr)
{
int nLen = wcslen(wstr.c_str());
@ -168,7 +169,7 @@ char* LPWSTR2LPSTR(LPWSTR lpwszStrIn)
return pszOut;
}
//从string s的位置pos开始向后找找到第一个等于x的位置返回其位置
//从string s的位置start开始向后找找到第一个等于x的位置返回其位置
//找到,返回找到的位置,找不到返回-1
int __find(const std::string s, const int start, const char x) {
if (start >= s.length())return -1;

@ -5,38 +5,56 @@
#include "basecamera.h"
#include "QtCore\qdatetime.h"
//#define __DEBUGPATH //修改debug时候的路径
//#define __DEBUG //debug信息输出功能
//#define __UDPSend //网络发送功能
#define __TCPSend // TCP发送
#define __ExportData // FTP发送
//#define __UDPSend //网络发送功能
#define __TCPSend // TCP发送
#if defined (__TCPSend)
//#define __TCPServer // TCP服务器
//#define __TCPClient // TCP客户端
//#define __ModebusServer // 建立modbus主机
#define __ModebusClient // 建立modbus从机
#endif
#define USB_BASLER_NEW_FW //使用basler定制固件
//#define IMM_PROCESS //拍照后立马处理,不等校验信号
//#define IMM_FEED_BACK //处理完后立马反馈,不等校验信号
#define ONE_TIME_SHIFT //错开一拍发送反馈(默认错开两次)
#define AI_WARM_UP //AI识别开始前的热身动作
#define LICENSE_VERIFY //开启license文件校验
//#define IMM_PROCESS //拍照后立马处理,不等校验信号
//#define IMM_FEED_BACK //处理完后立马反馈,不等校验信号
//#define ONE_TIME_SHIFT //错开一拍发送反馈(默认错开两次)
//CAP_FEED_BACK和DOUBLE_FEED_BACK不要一起开
#if defined (ONE_TIME_SHIFT)
//#define CAP_FEED_BACK //拍照时也检测有没有测试结果,有的话就反馈
//#define DOUBLE_FEED_BACK //一次ng两次反馈ng信号
#endif
#define AI_WARM_UP //AI识别开始前的热身动作
//#define LICENSE_VERIFY //开启license文件校验
//#define identify_Hik_YSXID//识别海康相机YSXID
//#define __ExportData // 输出检测数据到XML文档
#define DRAW_RECT // 鼠标画框功能
//#define DRAW_RECT // 鼠标画框功能
#define SYNC_CAMERA //相机同步处理图片
#define IS_CAM_NG_OK_DATA_MERGED //合并相机NG/OK数据
#define Queue_Size 15
#define Unit_Queue_Size Queue_Size*3
#define StrobeLineTime 10000
#define EquipmentModel "TH"//设备型号
#define image_w 512 //图片宽度
#define image_h 512 //图片高度
#ifdef __DEBUG
#define DEBUG(format, ...) printf (format, ##__VA_ARGS__)
#else
#define DEBUG(format, ...)
#endif
#define DEFAULT_MODEL_PATH "D:/model"
#define DEFAULT_CONFPATH_PATH "D:/conf"
#define DEFAULT_PIC_SAVE_PATH "D:/image"
// 主界面基本参数配置文件
#define CONFPATH "D:/conf/conf_path.txt"
//#define CONFIGURE_FILE "D:/conf/conf.txt"
#define CONFPATH "D:/Release/conf_path2.txt"//小盒
//#define CONFPATH "D:/Release/conf_path3.txt"//条盒
// 相机旋转角度配置文件
#define ROTATE_FILE "rotate.txt"
#define MODBUS_CONFIGURE_FILE "modbus.txt"
@ -110,8 +128,12 @@ public:
//MonitorPort+NumberOfSupportedCameras为图像端口
//MonitorPort+NumberOfSupportedCameras*2为发送命令端口,也就是FeedbackPort
//MonitorPort+NumberOfSupportedCameras*2+1为接受命令端口
std::string TcpIP; // TCP服务器端ip地址
int TcpPort; // TCP服务器端端口号
std::string TcpIP; // TCP服务器端ip地址
int TcpPort; // TCP服务器端端口号
std::string FtpIP; // FTP服务器端ip地址
int FtpPort; // FTP服务器端端口号
std::string FtpUserName; // FTP服务器登录账号
std::string FtpUserPwd; // FTP服务器登录密码
SysConf()
{
@ -148,6 +170,11 @@ public:
FeedbackPort = MonitorPort + NumberOfSupportedCameras * 2;
TcpIP = "192.168.1.126";
TcpPort = 8888;
FtpIP = "192.168.1.126";
FtpPort = 111;
FtpUserName = "111";
FtpUserPwd = "111";
}
};
@ -177,7 +204,7 @@ public:
int debug; //调试模式PLC产生模拟的line4信号
int reset; //复位
int alarm; //报警
int heart; //心跳
ModbusConf()
{
for (int i = 0; i < NumberOfSupportedCameras; i++) {
@ -192,6 +219,7 @@ public:
debug = 0; //调试模式PLC产生模拟的line4信号
reset = 0; //复位
alarm = 0; //报警
heart = 0; //心跳
}
};

@ -62,7 +62,7 @@ DialogSetup::DialogSetup(QWidget* parent) : QDialog(parent) {
if (!dirinfo->exists()) {
// 如果文件夹信息不存在
delete dirinfo, dirinfo = nullptr;
g_conf_path.config_path = "D:/conf";
g_conf_path.config_path = DEFAULT_CONFPATH_PATH;
}
dirinfo->setNameFilters(QStringList("conf.txt"));
QStringList fileList = dirinfo->entryList(QDir::Files);
@ -72,7 +72,7 @@ DialogSetup::DialogSetup(QWidget* parent) : QDialog(parent) {
}
else {
// 如果路径空
g_conf_path.config_path = "D:/conf";
g_conf_path.config_path = DEFAULT_CONFPATH_PATH;
}
ui.comboBox_config_path->addItem(g_conf_path.config_path);
// 更换选择文件
@ -119,7 +119,7 @@ DialogSetup::DialogSetup(QWidget* parent) : QDialog(parent) {
delete dirinfo, dirinfo = nullptr;
}
else {
QString dirPath = "D:/image";
QString dirPath = DEFAULT_PIC_SAVE_PATH;
QDir* dirinfo = new QDir(dirPath);
if (!dirinfo->exists())
delete dirinfo, dirinfo = nullptr;
@ -354,7 +354,7 @@ void DialogSetup::on_toolButton_choose_config_path_released() {
if (dirName.isEmpty()) {
// 点击取消按钮
if (g_conf_path.config_path.isEmpty())
dirName = "D:/conf";
dirName = DEFAULT_CONFPATH_PATH;
else
dirName = g_conf_path.config_path;
}
@ -367,7 +367,7 @@ void DialogSetup::on_toolButton_choose_config_path_released() {
QStringList fileList = dirinfo->entryList(QDir::Files);
if (fileList.count() == 0) {
dirName = "D:/conf";
dirName = DEFAULT_CONFPATH_PATH;
}
//fileList.removeOne(".");
@ -395,7 +395,7 @@ void DialogSetup::on_toolButton_choose_model_path_released() {
if (dirName.isEmpty()) {
if (g_sys_conf.model_path.isEmpty())
dirName = "D:/model";
dirName = DEFAULT_MODEL_PATH;
else
dirName = g_sys_conf.model_path;
@ -409,7 +409,7 @@ void DialogSetup::on_toolButton_choose_model_path_released() {
dirinfo->setNameFilters(QStringList("*.weights"));
QStringList fileList = dirinfo->entryList(QDir::Files);
if (fileList.count() == 0) {
g_sys_conf.model_path = "D:/model";
g_sys_conf.model_path = DEFAULT_MODEL_PATH;
g_sys_conf.model_name = "jd.weights";
}
else
@ -432,7 +432,7 @@ void DialogSetup::on_toolButton_choose_save_pics_path_released() {
// 如果没有选择路径
if (dirName.isEmpty()) {
if (g_conf_path.save_pics_path.isEmpty())
dirName = "D:/image";
dirName = DEFAULT_PIC_SAVE_PATH;
else
dirName = g_conf_path.save_pics_path;
//ui.comboBox_save_pics_path->addItem(dirName);
@ -756,18 +756,29 @@ void DialogSetup::write_config()
memset(buf, 0, 256);
sprintf(buf, "MonitorIP=%s\n", g_sys_conf.MonitorIP.c_str());
cfg_file.write(buf, strlen(buf));
memset(buf, 0, 256);
cfg_file.write(buf, strlen(buf));
sprintf(buf, "MonitorPort=%d\n", g_sys_conf.MonitorPort);
cfg_file.write(buf, strlen(buf));
memset(buf, 0, 256);
sprintf(buf, "TcpIP=%s\n", g_sys_conf.TcpIP.c_str());
cfg_file.write(buf, strlen(buf));
memset(buf, 0, 256);
sprintf(buf, "TcpPort=%d\n", g_sys_conf.TcpPort);
cfg_file.write(buf, strlen(buf));
memset(buf, 0, 256);
sprintf(buf, "FtpIP=%s\n", g_sys_conf.FtpIP.c_str());
cfg_file.write(buf, strlen(buf));
sprintf(buf, "TcpPort=%d\n", g_sys_conf.TcpPort);
memset(buf, 0, 256);
sprintf(buf, "FtpPort=%d\n", g_sys_conf.FtpPort);
cfg_file.write(buf, strlen(buf));
memset(buf, 0, 256);
sprintf(buf, "FtpUserName=%s\n", g_sys_conf.FtpUserName.c_str());
cfg_file.write(buf, strlen(buf));
memset(buf, 0, 256);
sprintf(buf, "FtpUserPwd=%s\n", g_sys_conf.FtpUserPwd.c_str());
cfg_file.write(buf, strlen(buf));
}
cfg_file.close();

@ -1,6 +1,13 @@
#include "exportData.h"
#include "QtCore\qfile.h"
#include "QtCore\qtextstream.h"
#include <QTimer>
#include <QFileInfoList>
#include <QDir>
#include <QFileInfo>
#include <QIODevice>
#include <QTextStream>
#include <QProcess>
#include <string>
//#include <ftpManager.h>
#include <wininet.h>
@ -13,9 +20,12 @@ Cigarette* cg;
extern SyncQueue<_XMLExportDataInfo>* export_XMLData_Info_queue;
extern ConfPath g_conf_path;
extern bool flag;
extern SysConf g_sys_conf; //系统配置参数
ExportDataThread::ExportDataThread(QObject* parent) : QThread(parent)
{
/* Move to init()
//第一步执行
cg->read_conf(g_conf_path);
for (int index = 0; index < NumberOfSupportedCameras; index++)
{
@ -30,19 +40,65 @@ ExportDataThread::ExportDataThread(QObject* parent) : QThread(parent)
pDocument[index]->InsertFirstChild(declaration);
}
}
init(ip,port,username,userpwd);
cout << "11111111111111";
hint = InternetOpen(0, INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0);
if (hint == NULL) {
return;
}
if (!ConnectFtp())
if (!ConnectFtp(&ip, &port, &username, &userpwd))
qDebug() << "First connect FTP failed because " << GetLastError();
*/
readyToSendZip = false;
listToZip.clear();
tmpListToZip.clear();
lastTimeStamp.clear();
zipTimeStamp.clear();
hftp = NULL;
hint = NULL;
}
void ExportDataThread::init()
void ExportDataThread::init(string ip_, int port_, string username_, string userpwd_)
{
//初始化FTP连接信息
ip = ip_;
port = port_;
username = username_;
userpwd = userpwd_;
cout << "ftp ip =" << ip << "| prot =" << port << endl;
cout << "username =" << username << "| pwd =" << userpwd << endl;
b_quit = false;
flag = false;
timer = new QTimer(this);
timer->setTimerType(Qt::PreciseTimer);
timer->setSingleShot(true);
//第一步执行
cg->read_conf(g_conf_path);
for (int index = 0; index < NumberOfSupportedCameras; index++)
{
XMLError error;
pDocument[index] = new tinyxml2::XMLDocument();
QString xmlPath = QString(EXPORTDATA_FILE).arg(index);
QString filePath = g_conf_path.config_path + "/" + xmlPath;
error = pDocument[index]->LoadFile(filePath.toLocal8Bit().constData());
if (error != XML_SUCCESS) {
XMLDeclaration* declaration = pDocument[index]->NewDeclaration();
pDocument[index]->InsertFirstChild(declaration);
}
}
//init(ip, port, username, userpwd);
hint = InternetOpen(0, INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0);
if (hint == NULL) {
return;
}
if (!ConnectFtp(&ip, &port, &username, &userpwd))
qDebug() << "First connect FTP failed because " << GetLastError();
}
void ExportDataThread::start_work()
@ -55,83 +111,105 @@ void ExportDataThread::stop()
b_quit = true;
_XMLExportDataInfo data;
export_XMLData_Info_queue->put(data);
InternetCloseHandle(hftp);
InternetCloseHandle(hint);
//InternetCloseHandle(hftp);
//InternetCloseHandle(hint);
}
bool ExportDataThread::ConnectFtp() {
// FTP地址
string ftpServer = "192.168.1.170";
/* 端口号一般为21 */
int port = 666;
/* 用户名 */
string userName = "FTP2";
/* 密码 */
string pwd = "123";
bool ExportDataThread::FtpConnectionTest () {
int retryCount = 3;
if ((hftp == NULL) || (!FtpSetCurrentDirectoryA(hftp, "/"))) {
while (!ConnectFtp(&ip, &port, &username, &userpwd)) {
if (retryCount-- == 0) {
break;
}
QTime delayTime = QTime::currentTime().addMSecs(100); //100ms
while (QTime::currentTime() < delayTime) {
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}
}
}
return (retryCount > 0);
}
bool ExportDataThread::ConnectFtp(string *ip_, int *port_, string *username_, string *userpwd_) {
//// FTP地址
//string ftpServer = "192.168.1.180";
///* 端口号一般为21 */
//int port = 666;
///* 用户名 */
//string userName = "FTP2";
///* 密码 */
//string pwd = "123";
if (hftp != NULL) {
InternetCloseHandle(hftp);
hftp = NULL;
}
// 创建ftp连接
hftp = InternetConnectA(hint, ftpServer.c_str(), port, userName.c_str(), pwd.c_str(), INTERNET_SERVICE_FTP, 0, 0);
// hftp = InternetConnectA(hint, ftpServer.c_str(), port, userName.c_str(), pwd.c_str(), INTERNET_SERVICE_FTP, 0, 0);
hftp = InternetConnectA(hint, ip_->c_str(), *port_, username_->c_str(), userpwd_->c_str(), INTERNET_SERVICE_FTP, 0, 0);
if (hftp == NULL) {
qDebug() << "ftp connect failed because " << GetLastError();
return false;
}
else
qDebug() << "ftp reconnect success";
//else
// qDebug() << "ftp reconnect success";
return true;
}
bool _ExportDataInfo::getAverageData(map<string, float>& averageData, int index)
{
tinyxml2::XMLDocument doc;
//char xmlPath[256];
XMLError error;
map<string, float> data;
//memset(xmlPath, 0, 256);
QString xmlPath = QString(EXPORTDATA_FILE).arg(index);
//sprintf(xmlPath, EXPORTDATA_FILE, index);
QString filePath = g_conf_path.config_path + "/" + xmlPath;
error = doc.LoadFile(filePath.toLocal8Bit().constData());
if (error != XML_SUCCESS)
if (doc.LoadFile(filePath.toLocal8Bit().constData()) != 0)
{
cout << "load xml file failed" << endl;
return false;
}
XMLElement* root = doc.RootElement();
XMLElement* userNode = root->FirstChildElement("Camera");
data["CameraId"] = index;
data["IsNG"] = 0;
data["IsJdExist"] = 0;
data["Total"] = 0;
while (userNode != NULL)
{
if (atoi(userNode->Attribute("Id")) == index) {
data["IsNG"]++;
data["IsJdExist"]++;
data["Total"]++;
XMLElement* IsNgNode = userNode->FirstChildElement("IsNG");
data["IsNg"] = strcmp(IsNgNode->GetText(), "TRUE");
XMLElement* IsJdExistNode = userNode->FirstChildElement("IsJdExist");
if (strcmp(IsJdExistNode->GetText(), "TRUE") == 0)
data["IsJdExist"]++;
XMLElement* TimeCostNode = userNode->FirstChildElement("TimeCost");
data["TimeCost"] += stof(TimeCostNode->GetText());
}
userNode = userNode->NextSiblingElement();//下一个兄弟节点
}
if (data["Total"] == 0)
return false;
data["TimeCost"] = data["TimeCost"] / data["Total"];
averageData = data;
return true;
}
//bool _ExportDataInfo::getAverageData(map<string, float>& averageData, int index)
//{
// tinyxml2::XMLDocument doc;
// //char xmlPath[256];
// XMLError error;
// map<string, float> data;
// //memset(xmlPath, 0, 256);
// QString xmlPath = QString(EXPORTDATA_FILE).arg(index);
// //sprintf(xmlPath, EXPORTDATA_FILE, index);
// QString filePath = g_conf_path.config_path + "/" + xmlPath;
// error = doc.LoadFile(filePath.toLocal8Bit().constData());
// if (error != XML_SUCCESS)
// if (doc.LoadFile(filePath.toLocal8Bit().constData()) != 0)
// {
// cout << "load xml file failed" << endl;
// return false;
// }
// XMLElement* root = doc.RootElement();
// XMLElement* userNode = root->FirstChildElement("Camera");
// data["CameraId"] = index;
// data["IsNG"] = 0;
// data["IsJdExist"] = 0;
// data["Total"] = 0;
// while (userNode != NULL)
// {
// if (atoi(userNode->Attribute("Id")) == index) {
// data["IsNG"]++;
// data["IsJdExist"]++;
// data["Total"]++;
// XMLElement* IsNgNode = userNode->FirstChildElement("IsNG");
// data["IsNg"] = strcmp(IsNgNode->GetText(), "TRUE");
// XMLElement* IsJdExistNode = userNode->FirstChildElement("IsJdExist");
// if (strcmp(IsJdExistNode->GetText(), "TRUE") == 0)
// data["IsJdExist"]++;
// XMLElement* TimeCostNode = userNode->FirstChildElement("TimeCost");
// data["TimeCost"] += stof(TimeCostNode->GetText());
// }
// userNode = userNode->NextSiblingElement();//下一个兄弟节点
// }
// if (data["Total"] == 0)
// return false;
// data["TimeCost"] = data["TimeCost"] / data["Total"];
//
// averageData = data;
//
// return true;
//}
//XML文件
//写数据到XML文件
int ExportDataThread::insertXMLNode(const char* xmlPath, _XMLExportDataInfo& data)
{
XMLElement* root = pDocument[data.cameraId]->RootElement();
@ -232,25 +310,138 @@ int ExportDataThread::insertXMLNode(const char* xmlPath, _XMLExportDataInfo& dat
void ExportDataThread::run()
{
while (!b_quit) {
_XMLExportDataInfo element;
export_XMLData_Info_queue->take(element);
if (element.cameraId != -1 && flag) {
char buf[256];
memset(buf, 0, 256);
QString xmlPath = QString(EXPORTDATA_FILE).arg(element.cameraId);
QString filePath = g_conf_path.config_path + "/" + xmlPath;
sprintf(buf, filePath.toLocal8Bit().constData(), element.cameraId);
insertXMLNode(buf, element);
QString remotePath = "/tmp/" + xmlPath;
ConnectServer(filePath, remotePath);
try {
while (!b_quit || (b_quit && (!export_XMLData_Info_queue->isEmpty() || readyToSendZip || !tmpListToZip.isEmpty()))) {
_XMLExportDataInfo element;
if (!export_XMLData_Info_queue->isEmpty()) {
export_XMLData_Info_queue->take(element);
if (element.cameraId != -1 && flag) {
char buf[256];
memset(buf, 0, 256);
QString xmlPath = QString(EXPORTDATA_FILE).arg(element.cameraId);
QString filePath = g_conf_path.config_path + "/" + xmlPath;
sprintf(buf, filePath.toLocal8Bit().constData(), element.cameraId);
insertXMLNode(buf, element);
QString remotePath = "/tmp/" + xmlPath;
ConnectServer(filePath, remotePath);
}
}
if ((b_quit || (!timer->isActive() && !readyToSendZip)) && (!tmpListToZip.isEmpty())) {
listToZip.unite(tmpListToZip);
tmpListToZip.clear();
zipTimeStamp.append(lastTimeStamp[0]);
lastTimeStamp.clear();
readyToSendZip = true;
}
if (readyToSendZip && !listToZip.isEmpty()) {
QString remotePath;
QStringList zipFilePaths;
QStringList fileList;
QString okStr = "1";
QProcess process(0);
//QDateTime now_ts = QDateTime::currentDateTime();
QStringList argsNg;
QStringList argsOk;
//条盒TJ 小盒BJ
/*zipFilePaths.append(g_conf_path.save_pics_path + "/" + "416_BJ_" + zipTimeStamp[0] + "-00_" + zipTimeStamp[0] + "-59_0.zip");
zipFilePaths.append(g_conf_path.save_pics_path + "/" + "416_BJ_" + zipTimeStamp[0] + "-00_" + zipTimeStamp[0] + "-59_1.zip");
fileList.append(g_conf_path.save_pics_path + "/" + zipTimeStamp[0] + "ng.txt");
fileList.append(g_conf_path.save_pics_path + "/" + zipTimeStamp[0] + "ok.txt");*/
zipFilePaths.append("416_TJ_" + zipTimeStamp[0] + "-00_" + zipTimeStamp[0] + "-59_0.zip");
zipFilePaths.append("416_TJ_" + zipTimeStamp[0] + "-00_" + zipTimeStamp[0] + "-59_1.zip");
fileList.append(zipTimeStamp[0] + "ng.txt");
fileList.append(zipTimeStamp[0] + "ok.txt");
zipTimeStamp.clear();
QFile* file[2] = { NULL };
file[0] = new QFile(fileList[0]);
file[1] = new QFile(fileList[1]);
// QFile fileNg(fileList[0]);
// QFile fileOk(fileList[1]);
file[0]->open(QIODevice::WriteOnly);
file[1]->open(QIODevice::WriteOnly);
QTextStream ngStream(file[0]);
QTextStream okStream(file[1]);
argsNg.append("a");
argsNg.append(zipFilePaths[0]);
argsOk.append("a");
argsOk.append(zipFilePaths[1]);
// create zip file
QMapIterator<QString, bool> iterator(listToZip);
while (iterator.hasNext()) {
iterator.next();
if (iterator.value()) {
ngStream << iterator.key() << endl;
}
else {
okStream << iterator.key() << endl;
}
}
argsNg.append("-i@" + fileList[0]);
argsNg.append("-mx=3");
argsOk.append("-i@" + fileList[1]);
argsOk.append("-mx=3");
file[0]->close();
file[1]->close();
for (int i = 0; i < zipFilePaths.size(); i++) {
if (file[i]->size() == 0) {
continue;
}
process.start(QApplication::applicationDirPath() + "/7z.exe", i == 0 ? argsNg : argsOk);
process.waitForStarted();
process.waitForFinished();
//QString out = QString::fromLocal8Bit(process.readAllStandardOutput());
//qDebug() << out;
remotePath = zipFilePaths[i].mid(zipFilePaths[i].indexOf("image") - 1);
qDebug() << remotePath;
ConnectServer(zipFilePaths[i], remotePath);
QFile file(zipFilePaths[i]);
file.remove();
}
file[0]->remove();
file[1]->remove();
listToZip.clear();
readyToSendZip = false;
}
}
}
flag = false;
flag = false;
for (int index = 0; index < NumberOfSupportedCameras; index++) {
pDocument[index]->~XMLDocument();
for (int index = 0; index < NumberOfSupportedCameras; index++) {
pDocument[index]->~XMLDocument();
}
if (hftp != NULL) {
InternetCloseHandle(hftp);
hftp = NULL;
}
if (hftp != NULL) {
InternetCloseHandle(hint);
hint = NULL;
}
}
catch (const std::exception& e) {
// 注意std::exception通常不捕获由运行时错误引发的异常
// 但这里是为了演示catch块的结构
std::cerr << __FUNCTION__<<"捕获到异常: " << e.what() << std::endl;
}
catch (...) {
// 使用省略号(...)可以捕获所有类型的异常,这是一种通用的捕获方式
std::cerr << "捕获到未知类型的异常" << std::endl;
}
}
@ -278,7 +469,7 @@ void ExportDataThread::check_save_dir(std::string dir_path)
void ExportDataThread::EDrecMsgFromCigarette() {
flag = true;
}
//发送数据给服务器
void ExportDataThread::ConnectServer(QString srcPath, QString destPath) {
string filePath = srcPath.toLocal8Bit().constData();
string remotePath = destPath.toLocal8Bit().constData();
@ -295,20 +486,25 @@ void ExportDataThread::ConnectServer(QString srcPath, QString destPath) {
size = files.size();
}
if (!FtpConnectionTest()) {
qDebug() << "Failed to connect FTP server";
return;
}
// 上传文件源为一个文件
if (size == 0) {
int pos = remotePath.find_last_of('/');
string destFileName = remotePath.substr(pos + 1);
string tempPath = remotePath.substr(0, pos + 1);
check_save_dir(tempPath);
if (!InternetGetConnectedState(NULL, 0)) {
qDebug() << "计算机未连接到互联网";
}
else {
check_save_dir(tempPath);
while (!FtpPutFileA(hftp, filePath.c_str(), remotePath.c_str(), FTP_TRANSFER_TYPE_BINARY, 0)) {
qDebug() << "ftp put file " << filePath.c_str() << "failed because" << GetLastError();
if (!ConnectFtp())
if (!ConnectFtp(&ip, &port, &username, &userpwd))
qDebug() << "connect FTP failed because " << GetLastError();
}
}
@ -321,16 +517,47 @@ void ExportDataThread::ConnectServer(QString srcPath, QString destPath) {
int pos = tempFilePath.find_last_of('/');
string destFileName = tempFilePath.substr(pos + 1);
check_save_dir(remotePath + tempFilePath.substr(0, pos + 1));
//发送函数
if (!FtpPutFileA(hftp, files[i].c_str(), destFileName.c_str(), FTP_TRANSFER_TYPE_BINARY, 0))
qDebug() << "ftp put files failed because " << GetLastError();
}
}
}
void ExportDataThread::GetDataFromSaveThread(QString filePath) {
void ExportDataThread::GetDataFromSaveThread(QString filePath, bool Ng) {
QString remotePath;
remotePath = filePath.mid(filePath.indexOf("image") - 1);
ConnectServer(filePath, remotePath);
QStringList currentTimeStamp;
QRegExp rx("((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29))_([0-1]?[0-9]|2[0-3])-([0-5][0-9])");
if (filePath.indexOf("ng") == -1) {
if (rx.indexIn(filePath) != -1) {
currentTimeStamp = rx.capturedTexts();
}
else {
QDateTime now_ts = QDateTime::currentDateTime();
currentTimeStamp.append(now_ts.toString("yyyy-MM-dd_HH-mm"));
}
if (lastTimeStamp.isEmpty() || (currentTimeStamp[0] != lastTimeStamp[0])) {
if (!tmpListToZip.isEmpty()) {
listToZip.unite(tmpListToZip);
tmpListToZip.clear();
}
if (!listToZip.isEmpty()) {
zipTimeStamp.append(lastTimeStamp[0]);
readyToSendZip = true;
}
lastTimeStamp.clear();
lastTimeStamp.append(currentTimeStamp[0]);
timer->stop();
timer->start(1000 * (60 * 1 + 10));
}
tmpListToZip.insert(filePath, Ng);
}
}
//*****************************************已经调试好,没有理清逻辑前不要动**********************

@ -1,5 +1,7 @@
#pragma once
#include <QDialog>
#include <QList>
#include <QMap>
#include "ui_output_statistic.h"
#include <vector>
#include <qdir.h>
@ -11,9 +13,10 @@
#include "common.h"
#include "cigarette.h"
#include "qdebug.h"
#define EXPORTDATA_FILE "camera%1_data_info.xml"
#include <wininet.h>
#define EXPORTDATA_FILE "camera%1_data_info.xml"
using namespace tinyxml2;
class _XMLExportDataInfo {
@ -105,6 +108,8 @@ signals:
public:
string ip, username, userpwd;
int port;
ExportDataThread(QObject* parent = 0);
~ExportDataThread()
{
@ -113,13 +118,20 @@ public:
quit();
wait();
}
QTimer* timer;
QMap<QString, bool> listToZip;
QMap<QString, bool> tmpListToZip;
BOOLEAN readyToSendZip;
void init();
void init(string ip_, int port_, string username_, string userpwd_);
void start_work();
void stop();
//int insertXMLNode(const char* xmlPath, _ExportDataInfo& data);
int insertXMLNode(const char* xmlPath, _XMLExportDataInfo& data);
bool ConnectFtp();
bool ConnectFtp(string *ip_, int *port_, string *username_, string *userpwd_);
bool FtpConnectionTest();
void ConnectServer(QString srcPath, QString destPath);
void GetFiles(string path, std::vector<string>& files);
@ -134,7 +146,13 @@ public:
HINTERNET hint = NULL;
HINTERNET hftp = NULL;
public slots:
void EDrecMsgFromCigarette();
void GetDataFromSaveThread(QString filePath);
void GetDataFromSaveThread(QString filePath, bool Ng);
private:
QStringList lastTimeStamp;
QStringList zipTimeStamp;
};

@ -2,11 +2,14 @@
#include <QtWidgets/QApplication>
#include <QPixmap>
#include <QSplashScreen>
#include <Windows.h>
#include <qmessagebox.h>
#if defined LICENSE_VERIFY
#pragma comment(lib,"CryptoToolLib.lib")
#include "CryptoToolLib.h"
#endif
//隐藏控制窗口
//#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
int main(int argc, char* argv[])
{
#if defined LICENSE_VERIFY
@ -15,9 +18,39 @@ int main(int argc, char* argv[])
exit(0);
}
#endif
qRegisterMetaType<cv::Mat>("cv::Mat");
QApplication a(argc, argv);
#ifdef __DEBUGPATH
QPixmap pixmap("splash.jpg");
#else
QPixmap pixmap("D:/Release/splash.jpg");
#endif
#if defined EquipmentModel
//比较设备型号文件-----------------------------------------------------------------------------
string ider;
string name = "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.5/include/thrust/async/flag.txt";//标志文件
std::ifstream file_(name.c_str());
if (file_.good())
{
getline(file_, ider);
file_.close();
}
else
{
ider = "Default";
}
if(ider!= EquipmentModel)
{
QMessageBox::information(NULL, QStringLiteral("系统自检失败"), QStringLiteral("设备型号匹配失败"), QMessageBox::Ok);
exit(0);
}
//比较设备型号标志文件-----------------------------------------------------------------------------
#else
#endif
QSplashScreen splash(pixmap);
splash.show();
a.processEvents();

@ -13,12 +13,12 @@
#include <opencv2/imgproc/types_c.h>
extern SyncQueue<std::pair<std::string, cv::Mat>>* g_save_queue; //图像保存队列
extern bool IsALL;
class SaveThread : public QThread
{
Q_OBJECT
signals:
void sendDataToExport(QString filePath);
void sendDataToExport(QString filePath);//XML发送信号函数
public:
SaveThread(QObject* parent = 0) : QThread(parent)
@ -60,8 +60,8 @@ protected:
std::size_t found = file_name.find_last_of("/\\");
std::string dir_path = file_name.substr(0, found);
check_save_dir(dir_path);
bool b_save = cv::imwrite(file_name, image);
if (b_save)
bool b_save = cv::imwrite(file_name, image);//存本地
if (IsALL && b_save)
{
//sendDataToExport(QString::fromStdString(file_name));
sendDataToExport(QString::fromLocal8Bit(QByteArray::fromRawData(file_name.c_str(), file_name.size())));

@ -25,6 +25,7 @@ extern SyncQueue<_UDPSendInfo>* UDP_Info_queue;
#endif
#ifdef __TCPSend
extern SyncQueue<_TCPSendInfo>* TCP_Info_queue;
extern threadSendTCP tcpSendThread;
#endif
#ifdef __ExportData
extern ExportDataThread exportDataThread;
@ -32,6 +33,7 @@ extern ExportDataThread exportDataThread;
extern PLCDevice* m_PLCDevice;
extern bool g_debug_mode;
bool IsALL = false;//是否是全存
SyncWorkThread::~SyncWorkThread()
{
stop();
@ -41,11 +43,12 @@ SyncWorkThread::~SyncWorkThread()
wait();
}
void SyncWorkThread::init(SyncQueue<std::vector<std::pair<int, cv::Mat>>>* image_ptr, ASyncQueue<bool>* result_ptr)
void SyncWorkThread::init(SyncQueue<std::vector<std::pair<int, cv::Mat>>>* image_ptr, ASyncQueue<bool>* result_ptr[], int MergeToCamId)
{
local_g_image_sync_queue = image_ptr;
local_g_result_queue = result_ptr;
b_quit = false;
MergeToCamId = MergeToCamId;
for (int i = 0; i < NumberOfSupportedCameras; i++) {
frame_total[i] = 0;
}
@ -65,19 +68,20 @@ void SyncWorkThread::run()
try {
uint32_t result_index[NumberOfSupportedCameras] = { 0 };
while (!b_quit) {
QDateTime now_ts = QDateTime::currentDateTime();
QDateTime now_ts = QDateTime::currentDateTime();
std::vector<std::pair<int, cv::Mat>> element_vec;
local_g_image_sync_queue->take(element_vec);
#ifdef IS_CAM_NG_OK_DATA_MERGED
bool IsNGForAll = false;
#endif
int merge_index;
cv::Mat merge_image = cv::Mat::zeros(512 * work_camera_nums, 640 * g_sys_conf.shoot[0], CV_8UC3);
cv::Mat merge_image = cv::Mat::zeros(image_h * g_sys_conf.shoot[0], image_w * work_camera_nums, CV_8UC3);//640*work_camera_nums
cv::Rect roi;
int j = 0; // 实际工作的相机标识element_vec中可能有相机没在工作
for (int i = 0; i < element_vec.size(); i++)//每个相机的图轮流遍历
{
if (!SingleCamInfo[i].Detect || !SingleCamInfo[i].IsOpen || SingleCamInfo[i].OffLine)
continue;
local_camera_number = i;
std::pair<int, cv::Mat> element;
element = element_vec[i];
@ -120,11 +124,11 @@ void SyncWorkThread::run()
{
cv::cvtColor(image, image, CV_BGR2RGB); //灰度图像转为彩色图像
}
cv::resize(image, image, cv::Size(640, 512 * unit_count));
cv::resize(image, image, cv::Size(image_w, image_h * unit_count));
if (local_SysConf.shoot[local_camera_number] == unit_count)
{
std::vector<cv::Mat> vec_in;
int w = image.cols;
int w = image.cols ;
int h = image.rows / unit_count;
for (int index = 0; index < unit_count; index++) {
cv::Rect temp_Rect(0, h * index, w, h);
@ -137,7 +141,6 @@ void SyncWorkThread::run()
}
vec_in.push_back(temp_image.clone());
}
std::vector<cv::Mat> vec_out;
std::vector<std::vector<std::pair<int, cv::Rect>>> vec_results;
QDateTime ts_start = QDateTime::currentDateTime();
@ -150,7 +153,9 @@ void SyncWorkThread::run()
vec_results.push_back(results);
}
else {
alg_jd[local_camera_number].detect_batch(vec_in, vec_out, vec_results);
}
QDateTime ts_jd = QDateTime::currentDateTime();
int time_process = ts_start.msecsTo(ts_jd);
@ -170,16 +175,19 @@ void SyncWorkThread::run()
#ifdef SYNC_CAMERA
emit display_jd_no(local_camera_number, jd_no);
#endif
#ifdef __UDPSend
UDPSendInfo.JD = jd_no;
#endif
IsALL = false;//4.10
bool IsNG = false;
int ngReason = 0;
QMap<int, QString> ng_reason_maps;
ng_reason_maps[0] = "unknow";
ng_reason_maps[1] = "less_than_setting";
ng_reason_maps[2] = "too_diff_from_model";
ng_reason_maps[3] = "out_of_setting_range";
ng_reason_maps[0] = "1";
ng_reason_maps[1] = "0";
ng_reason_maps[2] = "0";
ng_reason_maps[3] = "0";
for (int index = 0; index < unit_count; index++) {
if (vec_results[index].size() < local_SysConf.no[local_camera_number][index])
{
@ -192,27 +200,28 @@ void SyncWorkThread::run()
IsNG = false;
ngReason = 0;
}
if (local_SysConf.save == 2)//三张照片分别存储
{
/// 合成work_camera_nums * unit_count 宫格图像
cv::Mat m = vec_in[index].clone();
QString file_name;
merge_index = j * unit_count + index + 1;
roi = cv::Rect(index * m.cols, j * m.rows, m.cols, m.rows);
m.copyTo(merge_image(roi));
if (merge_index == work_camera_nums * unit_count) {
file_name = g_conf_path.save_pics_path + "/"
+ now_ts.toString("yyyy-MM-dd") + "/"
+ now_ts.toString("yyyy-MM-dd_HH-mm-ss_zzz_") + ".jpg";
g_save_queue->put(std::make_pair(file_name.toLocal8Bit().constData(), merge_image));
#ifdef __TCPSend
QString sendName = now_ts.toString("yyyy-MM-dd_HH-mm-ss_zzz_") + ".jpg";
TCPSendInfo.pics_name = sendName.toLocal8Bit().constData();
TCP_Info_queue->put(TCPSendInfo);
#endif
}
}
// if (local_SysConf.save == 2)//三张照片分别存储
// {
// IsALL = true;
// /// 合成work_camera_nums * unit_count 宫格图像
// cv::Mat m = vec_in[index].clone();
// QString file_name;
// merge_index = j * unit_count + index + 1;
// roi = cv::Rect(index * m.cols, j * m.rows, m.cols, m.rows);
// m.copyTo(merge_image(roi));
//
// if (merge_index == work_camera_nums * unit_count) {
// file_name = g_conf_path.save_pics_path + "/"
// + now_ts.toString("yyyy-MM-dd") + "/"
// + now_ts.toString("yyyy-MM-dd_HH-mm-ss_zzz_") +"_" +ng_reason_maps[ngReason] + ".jpg";
// g_save_queue->put(std::make_pair(file_name.toLocal8Bit().constData(), merge_image));
//#ifdef __TCPSend
// QString sendName = now_ts.toString("yyyy-MM-dd_HH-mm-ss_zzz_") + ".jpg";
// TCPSendInfo.pics_name = sendName.toLocal8Bit().constData();
// TCP_Info_queue->put(TCPSendInfo);
//#endif
// }
// }
}
if (unit_count >= 2) {
image1 = vec_out[(result_index[i]) % 2].clone();
@ -247,7 +256,6 @@ void SyncWorkThread::run()
#endif
}
result_index[i]++;
if (!IsNG)
{
if (!g_debug_mode)
@ -255,36 +263,42 @@ void SyncWorkThread::run()
#ifdef SYNC_CAMERA
emit event_ok(local_camera_number);
#endif
local_g_result_queue->put(true);
#ifndef IS_CAM_NG_OK_DATA_MERGED
local_g_result_queue[local_camera_number]->put(true);
#endif
}
}
else
{
IsALL = false;
if (!g_debug_mode)
{
#ifdef SYNC_CAMERA
emit event_ng(local_camera_number);
#endif
local_g_result_queue->put(false);
#ifndef IS_CAM_NG_OK_DATA_MERGED
local_g_result_queue[local_camera_number]->put(false);
#else
IsNGForAll = TRUE;
#endif
}
if ((local_SysConf.save == 2) || (local_SysConf.save == 1))
{
for (int index = 0; index < unit_count; index++)
{
cv::Mat m = vec_in[index].clone();
QString file_name = g_conf_path.save_pics_path + "/ng/" +
now_ts.toString("yyyy-MM-dd") + "/"
+ QString::number(local_camera_number + 1) + "/" + QString::number(index + 1) + "/" +
now_ts.toString("yyyy-MM-dd_HH-mm-ss_zzz_") + QString::number(local_camera_number + 1) +
"#" + "_" + QString::number(index + 1) + "_" + ng_reason_maps[ngReason] +
".jpg";
QString remotePath = "/image/ng/" +
now_ts.toString("yyyy-MM-dd_HH-mm-ss_zzz_") + QString::number(local_camera_number + 1) +
"#" + "_" + QString::number(index + 1) + "_" + ng_reason_maps[ngReason] +
".jpg";
g_save_queue->put(std::make_pair(file_name.toLocal8Bit().constData(), m));
if (vec_results[index].size() < local_SysConf.no[local_camera_number][index])
{
cv::Mat m = vec_in[index].clone();
QString file_name = g_conf_path.save_pics_path + "/ng/" +
now_ts.toString("yyyy-MM-dd") + "/"
+ QString::number(local_camera_number + 1) + "/" + QString::number(index + 1) + "/" +
now_ts.toString("yyyy-MM-dd_HH-mm-ss_zzz_") + QString::number(local_camera_number + 1) +
"#" + "_" + QString::number(index + 1) + "_" + ng_reason_maps[ngReason] +
".jpg";
g_save_queue->put(std::make_pair(file_name.toLocal8Bit().constData(), m));
m = vec_out[index].clone();
file_name = g_conf_path.save_pics_path + "/ng_result/" +
@ -293,15 +307,14 @@ void SyncWorkThread::run()
now_ts.toString("yyyy-MM-dd_HH-mm-ss_zzz_") + QString::number(local_camera_number + 1) +
"#" + "_" + QString::number(index + 1) + "_" + ng_reason_maps[ngReason] +
".jpg";
remotePath = "/image/ng_result/" +
now_ts.toString("yyyy-MM-dd_HH-mm-ss_zzz_") + QString::number(local_camera_number + 1) +
"#" + "_" + QString::number(index + 1) + "_" + ng_reason_maps[ngReason] +
".jpg";
//g_save_queue->put(std::make_pair(file_name.toStdString(), m));
g_save_queue->put(std::make_pair(file_name.toLocal8Bit().constData(), m));
}
}
}
}
#ifdef SYNC_CAMERA
if (!g_debug_mode)
{
@ -312,6 +325,33 @@ void SyncWorkThread::run()
emit notify(local_camera_number, 1, image2);
}
#endif
for (int index = 0; index < unit_count; index++)
{
if (local_SysConf.save == 2)//照片存储
{
IsALL = true;
/// 合成work_camera_nums * unit_count 宫格图像
cv::Mat m = vec_in[index].clone();
QString file_name;
merge_index = j * unit_count + index + 1;
roi = cv::Rect(j * m.cols, index * m.rows, m.cols, m.rows);
m.copyTo(merge_image(roi));
if (merge_index == work_camera_nums * unit_count) {
//条盒TJ 小盒BJ
file_name = g_conf_path.save_pics_path + "/"
+ now_ts.toString("yyyy-MM-dd") + "/"+"416_BJ_01_"
+ now_ts.toString("yyyy-MM-dd_HH-mm-ss.zzz") + ".jpg";
g_save_queue->put(std::make_pair(file_name.toLocal8Bit().constData(), merge_image));
#ifdef __TCPSend
QString sendName = "416_BJ_01_" + now_ts.toString("yyyy-MM-dd_HH-mm-ss.zzz");
TCPSendInfo.pics_name = sendName.toLocal8Bit().constData();
TCP_Info_queue->put(TCPSendInfo);
sendDataToCompress(file_name, IsNG);
#endif
}
}
}
}
else
@ -334,15 +374,28 @@ void SyncWorkThread::run()
#endif
j++;
}
#ifdef IS_CAM_NG_OK_DATA_MERGED
if (IsNGForAll)
{
/*to do something*/
local_g_result_queue[MergeToCamId]->put(false);
}
else
{
local_g_result_queue[MergeToCamId]->put(true);
}
#endif
// emit display_check_total(local_camera_number, ++(frame_total[local_camera_number]));
}
}
catch (cv::Exception& e)
{
const char* err_msg = e.what();
std::cout << "exception caught: " << err_msg << std::endl;
catch (const std::exception& e) {
// 注意std::exception通常不捕获由运行时错误引发的异常
// 但这里是为了演示catch块的结构
std::cerr << __FUNCTION__<<"捕获到异常: " << e.what() << std::endl;
}
catch (...) {
// 使用省略号(...)可以捕获所有类型的异常,这是一种通用的捕获方式
std::cerr << "捕获到未知类型的异常" << std::endl;
}
}

@ -22,6 +22,10 @@ signals:
void event_ok(int Num);
void event_ng(int Num);
#endif
#ifdef __TCPSend
signals:
void sendDataToCompress(QString filePath, bool Ng);
#endif
public:
SyncWorkThread(QObject* parent = 0) : QThread(parent)
@ -30,15 +34,16 @@ public:
}
~SyncWorkThread();
void init(SyncQueue<std::vector<std::pair<int, cv::Mat>>>* image_ptr, ASyncQueue<bool>* result_ptr);
void init(SyncQueue<std::vector<std::pair<int, cv::Mat>>>* image_ptr, ASyncQueue<bool>* result_ptr[], int MergeToCamId);
void start_work();
void stop();
protected:
void run();
int MergeToCamId;
public:
int local_camera_number;
SyncQueue<std::vector<std::pair<int, cv::Mat>>>* local_g_image_sync_queue;
ASyncQueue<bool>* local_g_result_queue;
ASyncQueue<bool>** local_g_result_queue;
bool b_quit;
long frame_total[NumberOfSupportedCameras];
SysConf local_SysConf;

@ -25,41 +25,52 @@ void threadSend::stop()
void threadSend::run()
{
while (isLoop)
{
_UDPSendInfo UDPSendInfo;
Local_UDP_Info_queue->take(UDPSendInfo);
switch (UDPSendInfo.FrameID) {
case info_frame: {
sendData(&UDPSendInfo, dataport);
break;
}
case speed_frame: {
sendSpeed(&UDPSendInfo, dataport);
break;
}
case kick_frame: {
sendKick(&UDPSendInfo, dataport);
break;
}
case ok_frame: {
sendOK(&UDPSendInfo, dataport);
break;
}
case ng_frame: {
sendNG(&UDPSendInfo, dataport);
break;
}
case total_frame: {
sendTotal(&UDPSendInfo, dataport);
break;
}
case image_frame: {
sendImage(&UDPSendInfo, imageport);
break;
}
try {
while (isLoop)
{
_UDPSendInfo UDPSendInfo;
Local_UDP_Info_queue->take(UDPSendInfo);
switch (UDPSendInfo.FrameID) {
case info_frame: {
sendData(&UDPSendInfo, dataport);
break;
}
case speed_frame: {
sendSpeed(&UDPSendInfo, dataport);
break;
}
case kick_frame: {
sendKick(&UDPSendInfo, dataport);
break;
}
case ok_frame: {
sendOK(&UDPSendInfo, dataport);
break;
}
case ng_frame: {
sendNG(&UDPSendInfo, dataport);
break;
}
case total_frame: {
sendTotal(&UDPSendInfo, dataport);
break;
}
case image_frame: {
sendImage(&UDPSendInfo, imageport);
break;
}
}
}
}
catch (const std::exception& e) {
// 注意std::exception通常不捕获由运行时错误引发的异常
// 但这里是为了演示catch块的结构
std::cerr << __FUNCTION__<<"捕获到异常: " << e.what() << std::endl;
}
catch (...) {
// 使用省略号(...)可以捕获所有类型的异常,这是一种通用的捕获方式
std::cerr << "捕获到未知类型的异常" << std::endl;
}
}
void threadSend::sendData(_UDPSendInfo* UDPSendInfo, int port)

@ -3,13 +3,25 @@
#include <WS2tcpip.h>
#include <stdio.h>
#include <qtcpsocket.h>
#include <PLCDevice.h>
#pragma comment(lib, "ws2_32.lib")
extern PLCDevice* m_PLCTCPDevice;
extern PLCDevice* m_PLCDevice;
void threadSendTCP::init(SyncQueue<_TCPSendInfo>* p_TCP_Info_queue, std::string ip_, int port_) {
ip = QString::fromStdString(ip_);
port = port_;
qDebug() << "tcp ip:" << ip << "| tcp port:" << port;
Local_TCP_Info_queue = p_TCP_Info_queue;
#ifdef __TCPServer
tcpServer = new QTcpServer(this);
tcpServer->listen(QHostAddress::Any, port);// Equivalent to QHostAddress("127.0.0.1").
connect(tcpServer,SIGNAL(newConnection()),this,SLOT(onNewConnection()));
connect(mySocket, SIGNAL(connected()), this, SLOT(onClientConnected()));
connect(mySocket, SIGNAL(disconnected()), this, SLOT(onClientDisconnected()));
#endif
}
void threadSendTCP::start_work()
{
@ -19,42 +31,175 @@ void threadSendTCP::start_work()
void threadSendTCP::stop()
{
#ifdef __TCPServer
if (tcpServer->isListening())
tcpServer->close();
if(tcpServer) delete tcpServer;
#endif
#ifdef __TCPClient
mySocket->deleteLater();
if (mySocket) delete mySocket;
#endif
isLoop = false;
// wait();
delete mySocket;
}
#ifdef __TCPClient
bool threadSendTCP::connectTCP() {
mySocket = new QTcpSocket();
// 取消已有的连接
mySocket->abort();
// 连接服务器
mySocket->connectToHost(ip, port);
if (!mySocket->waitForConnected(30000)) {
qDebug() << "connect failed!";
return false;
if (!mySocket->waitForConnected(100)) {
qDebug() << "connect failed!";
return false;
}
qDebug() << "connect successfully!";
return true;
}
#endif
void threadSendTCP::run()
{
if (!connectTCP())
qDebug() << "TCP connect error!";
while (isLoop) {
_TCPSendInfo TCPSendInfo;
Local_TCP_Info_queue->take(TCPSendInfo);
num++;
sendData(&TCPSendInfo, num);
try {
#ifdef __TCPClient
if (!connectTCP())
{
qDebug() << "TCP connect error!";
}
#endif
while (isLoop) {
_TCPSendInfo TCPSendInfo;
Local_TCP_Info_queue->take(TCPSendInfo);
num++;
sendData(&TCPSendInfo, num);
#ifdef __TCPServer
if (ClientStatus == QAbstractSocket::ConnectedState)
{
sendData(&TCPSendInfo, num);
}
#endif
#ifdef __TCPClient
sendData(&TCPSendInfo, num);
#endif
//mySocket->write("Hello! here is tcp client!\n");
//mySocket->flush();
}
}
catch (const std::exception& e) {
// 注意std::exception通常不捕获由运行时错误引发的异常
// 但这里是为了演示catch块的结构
std::cerr << __FUNCTION__<<"捕获到异常: " << e.what() << std::endl;
}
catch (...) {
// 使用省略号(...)可以捕获所有类型的异常,这是一种通用的捕获方式
std::cerr << "捕获到未知类型的异常" << std::endl;
}
}
void threadSendTCP::sendData(_TCPSendInfo* TCPSendInfo, int Num) {
std::string fileName = TCPSendInfo->pics_name + ", " + QString::number(Num).toStdString();
std::string fileName = TCPSendInfo->pics_name;
QDateTime ts_start = QDateTime::currentDateTime();
#if defined(__TCPServer) || defined(__TCPClient)
mySocket->write(fileName.c_str());
char temp = num % 10;
mySocket->write((char*)&temp,sizeof(char));
mySocket->write("\n");
mySocket->flush();
#endif
#if defined(__ModebusServer) || defined(__ModebusClient)
std::vector<int> asciiVals = stringToAscii(fileName);
//mySocket->write(fileName.c_str());
/*int temp = num % 2;
if (temp == 1)
{
m_PLCDevice->write_bit_2_plc(10006, 1);
}
else
{
m_PLCDevice->write_bit_2_plc(10006, 0);
}*/
//mySocket->write((char*)&temp,sizeof(char));
//mySocket->write("\n");
//mySocket->flush();
//
//遍历发送
int val_[32] = {};
uint8_t high[17] = {};
uint8_t low[17] = {};
uint16_t val[17] = {};
int h = 0;
int l = 0;
for (int i = 0; i < asciiVals.size(); i++)
{
if (i % 2 == 0)
{
high[h] = asciiVals[i];
h++;
}
else
{
low[l] = asciiVals[i];
l++;
}
}
#endif
#ifdef __ModebusServer
//m_PLCTCPDevice->write_2_plc(40000, 70, (uint16_t*)&val_);//小盒
m_PLCTCPDevice->write_2_plc(40070, 70, (uint16_t*)&val_);//条盒
#endif
#ifdef __ModebusClient
for (int i = 0; i < sizeof(val) / sizeof(short); i++)
{
val[i]= (static_cast<uint16_t>(high[i]) << 8) | low[i];//组合高低字节
m_PLCTCPDevice->mapping->tab_registers[i] = val[i];
}
#endif
//QDateTime ts_end = QDateTime::currentDateTime();
//int time_process = ts_start.msecsTo(ts_end);
//qDebug() << "end-now_ts=" << time_process;
}
//字符串转ASCII
std::vector<int> threadSendTCP::stringToAscii(const std::string& str)
{
std::vector<int> asciiValues;
for (char c : str) {
asciiValues.push_back(static_cast<int>(c));
}
return asciiValues;
}
#ifdef __TCPServer
void threadSendTCP::onNewConnection()
{
mySocket = tcpServer->nextPendingConnection(); //创建socket
qDebug() << "NewConnectionConnected";
ClientStatus = QAbstractSocket::ConnectedState;
}
void threadSendTCP::onClientConnected()
{
qDebug() << "ClientConnected";
}
void threadSendTCP::onClientDisconnected()
{
ClientStatus = QAbstractSocket::UnconnectedState;
qDebug() << "ClientDisconnected";
mySocket->deleteLater();
}
#endif

@ -1,4 +1,5 @@
#pragma once
#include <QWidget>
#include <QDebug>
#include <QDateTime>
#include <iostream>
@ -6,15 +7,21 @@
#include <qtcpsocket.h>
#include "common.h"
#include "SyncQueue.h"
#include <QTcpServer>
class _TCPSendInfo
{
public:
std::string pics_name;
std::string result;
std::string num;
_TCPSendInfo()
{
pics_name = "";
}
};
@ -38,8 +45,9 @@ public:
wait();
}
void stop();
#ifdef __TCPClient
bool connectTCP();
#endif
protected:
void run();
@ -47,9 +55,21 @@ public:
void init(SyncQueue<_TCPSendInfo>* p_TCP_Info_queue, std::string ip_, int port_);
void start_work();
void sendData(_TCPSendInfo* TCPSendInfo, int Num);
std::vector<int> stringToAscii(const std::string& str);
#ifdef __TCPServer
private slots:
void onNewConnection();
void onClientConnected();
void onClientDisconnected();
#endif
public:
SyncQueue<_TCPSendInfo>* Local_TCP_Info_queue;
std::atomic_bool isLoop = { 0 };
QTcpSocket* mySocket;
#if defined(__TCPServer) || defined(__TCPClient)
QTcpSocket* mySocket = NULL;
#endif
#ifdef __TCPServer
QTcpServer *tcpServer = NULL;
QAbstractSocket::SocketState ClientStatus;
#endif
};

@ -161,10 +161,10 @@ void WorkThread::run()
bool IsNG = false;
int ngReason = 0;
QMap<int, QString> ng_reason_maps;
ng_reason_maps[0] = "unknow";
ng_reason_maps[1] = "less_than_setting";
ng_reason_maps[2] = "too_diff_from_model";
ng_reason_maps[3] = "out_of_setting_range";
ng_reason_maps[0] = "1";
ng_reason_maps[1] = "0";
ng_reason_maps[2] = "0";
ng_reason_maps[3] = "0";
for (int index = 0; index < unit_count; index++)
{
if (vec_results[index].size() < local_SysConf.no[local_camera_number][index])
@ -256,32 +256,36 @@ void WorkThread::run()
{
for (int index = 0; index < unit_count; index++)
{
cv::Mat m = vec_in[index].clone();
QString file_name = g_conf_path.save_pics_path + "/ng/" +
now_ts.toString("yyyy-MM-dd") + "/"
+ QString::number(local_camera_number + 1) + "/" + QString::number(index + 1) + "/" +
now_ts.toString("yyyy-MM-dd_HH-mm-ss_zzz_") + QString::number(local_camera_number + 1) +
"#" + "_" + QString::number(index + 1) + "_" + ng_reason_maps[ngReason] +
".jpg";
QString remotePath = "/image/ng/" +
now_ts.toString("yyyy-MM-dd_HH-mm-ss_zzz_") + QString::number(local_camera_number + 1) +
"#" + "_" + QString::number(index + 1) + "_" + ng_reason_maps[ngReason] +
".jpg";
g_save_queue->put(std::make_pair(file_name.toLocal8Bit().constData(), m));
if (vec_results[index].size() < local_SysConf.no[local_camera_number][index])
{
cv::Mat m = vec_in[index].clone();
QString file_name = g_conf_path.save_pics_path + "/ng/" +
now_ts.toString("yyyy-MM-dd") + "/"
+ QString::number(local_camera_number + 1) + "/" + QString::number(index + 1) + "/" +
now_ts.toString("yyyy-MM-dd_HH-mm-ss_zzz_") + QString::number(local_camera_number + 1) +
"#" + "_" + QString::number(index + 1) + "_" + ng_reason_maps[ngReason] +
".jpg";
QString remotePath = "/image/ng/" +
now_ts.toString("yyyy-MM-dd_HH-mm-ss_zzz_") + QString::number(local_camera_number + 1) +
"#" + "_" + QString::number(index + 1) + "_" + ng_reason_maps[ngReason] +
".jpg";
g_save_queue->put(std::make_pair(file_name.toLocal8Bit().constData(), m));
m = vec_out[index].clone();
file_name = g_conf_path.save_pics_path + "/ng_result/" +
now_ts.toString("yyyy-MM-dd") + "/"
+ QString::number(local_camera_number + 1) + "/" + QString::number(index + 1) + "/" +
now_ts.toString("yyyy-MM-dd_HH-mm-ss_zzz_") + QString::number(local_camera_number + 1) +
"#" + "_" + QString::number(index + 1) + "_" + ng_reason_maps[ngReason] +
".jpg";
remotePath = "/image/ng_result/" +
now_ts.toString("yyyy-MM-dd_HH-mm-ss_zzz_") + QString::number(local_camera_number + 1) +
"#" + "_" + QString::number(index + 1) + "_" + ng_reason_maps[ngReason] +
".jpg";
//g_save_queue->put(std::make_pair(file_name.toStdString(), m));
g_save_queue->put(std::make_pair(file_name.toLocal8Bit().constData(), m));
m = vec_out[index].clone();
file_name = g_conf_path.save_pics_path + "/ng_result/" +
now_ts.toString("yyyy-MM-dd") + "/"
+ QString::number(local_camera_number + 1) + "/" + QString::number(index + 1) + "/" +
now_ts.toString("yyyy-MM-dd_HH-mm-ss_zzz_") + QString::number(local_camera_number + 1) +
"#" + "_" + QString::number(index + 1) + "_" + ng_reason_maps[ngReason] +
".jpg";
remotePath = "/image/ng_result/" +
now_ts.toString("yyyy-MM-dd_HH-mm-ss_zzz_") + QString::number(local_camera_number + 1) +
"#" + "_" + QString::number(index + 1) + "_" + ng_reason_maps[ngReason] +
".jpg";
//g_save_queue->put(std::make_pair(file_name.toStdString(), m));
g_save_queue->put(std::make_pair(file_name.toLocal8Bit().constData(), m));
}
}
}
}
@ -317,9 +321,13 @@ void WorkThread::run()
#endif
}
}
catch (cv::Exception& e)
{
const char* err_msg = e.what();
std::cout << "exception caught: " << err_msg << std::endl;
catch (const std::exception& e) {
// 注意std::exception通常不捕获由运行时错误引发的异常
// 但这里是为了演示catch块的结构
std::cerr << __FUNCTION__<<"捕获到异常: " << e.what() << std::endl;
}
catch (...) {
// 使用省略号(...)可以捕获所有类型的异常,这是一种通用的捕获方式
std::cerr << "捕获到未知类型的异常" << std::endl;
}
}

Loading…
Cancel
Save