Compare commits

..

3 Commits

@ -0,0 +1,68 @@
{
"files.associations": {
"string": "cpp",
"array": "cpp",
"atomic": "cpp",
"bit": "cpp",
"*.tcc": "cpp",
"cctype": "cpp",
"chrono": "cpp",
"clocale": "cpp",
"cmath": "cpp",
"compare": "cpp",
"complex": "cpp",
"concepts": "cpp",
"condition_variable": "cpp",
"cstdarg": "cpp",
"cstddef": "cpp",
"cstdint": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"cstring": "cpp",
"ctime": "cpp",
"cwchar": "cpp",
"cwctype": "cpp",
"deque": "cpp",
"list": "cpp",
"map": "cpp",
"set": "cpp",
"unordered_map": "cpp",
"unordered_set": "cpp",
"vector": "cpp",
"exception": "cpp",
"algorithm": "cpp",
"functional": "cpp",
"iterator": "cpp",
"memory": "cpp",
"memory_resource": "cpp",
"numeric": "cpp",
"random": "cpp",
"ratio": "cpp",
"string_view": "cpp",
"system_error": "cpp",
"tuple": "cpp",
"type_traits": "cpp",
"utility": "cpp",
"fstream": "cpp",
"future": "cpp",
"initializer_list": "cpp",
"iomanip": "cpp",
"iosfwd": "cpp",
"iostream": "cpp",
"istream": "cpp",
"limits": "cpp",
"mutex": "cpp",
"new": "cpp",
"numbers": "cpp",
"ostream": "cpp",
"semaphore": "cpp",
"sstream": "cpp",
"stdexcept": "cpp",
"stop_token": "cpp",
"streambuf": "cpp",
"thread": "cpp",
"cinttypes": "cpp",
"typeindex": "cpp",
"typeinfo": "cpp"
}
}

@ -5,6 +5,8 @@ VisualStudioVersion = 17.3.32929.385
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Cigarette", "Cigarette\Cigarette.vcxproj", "{B12702AD-ABFB-343A-A199-8E24837244A3}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CigaretteSingle", "CigaretteSingle\CigaretteSingle.vcxproj", "{795A8611-044A-46D3-8DD9-13A338925BC4}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
@ -21,12 +23,18 @@ Global
{B12702AD-ABFB-343A-A199-8E24837244A3}.Release|x64.Build.0 = Release|x64
{B12702AD-ABFB-343A-A199-8E24837244A3}.Release|x86.ActiveCfg = Release|Win32
{B12702AD-ABFB-343A-A199-8E24837244A3}.Release|x86.Build.0 = Release|Win32
{795A8611-044A-46D3-8DD9-13A338925BC4}.Debug|x64.ActiveCfg = Debug|x64
{795A8611-044A-46D3-8DD9-13A338925BC4}.Debug|x86.ActiveCfg = Debug|x64
{795A8611-044A-46D3-8DD9-13A338925BC4}.Debug|x86.Build.0 = Debug|x64
{795A8611-044A-46D3-8DD9-13A338925BC4}.Release|x64.ActiveCfg = Release|x64
{795A8611-044A-46D3-8DD9-13A338925BC4}.Release|x86.ActiveCfg = Release|x64
{795A8611-044A-46D3-8DD9-13A338925BC4}.Release|x86.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {0AF1A30E-A12C-4014-ACD5-65A1E6D54D46}
Qt5Version = 5.15.2_msvc2019_64
SolutionGuid = {0AF1A30E-A12C-4014-ACD5-65A1E6D54D46}
EndGlobalSection
EndGlobal

@ -0,0 +1,5 @@
/* This file was generated by qmake with the info from <root>/src/mqtt/mqtt.pro. */
#ifdef __cplusplus /* create empty PCH in C mode */
#include <QtCore/QtCore>
#include <QtNetwork/QtNetwork>
#endif

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
@ -21,8 +21,8 @@
<PropertyGroup Label="Globals">
<ProjectGuid>{B12702AD-ABFB-343A-A199-8E24837244A3}</ProjectGuid>
<Keyword>QtVS_v304</Keyword>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
<QtMsBuild Condition="'$(QtMsBuild)'=='' OR !Exists('$(QtMsBuild)\qt.targets')">$(MSBuildProjectDirectory)\QtMsBuild</QtMsBuild>
<WindowsTargetPlatformVersion>10.0.22621.0</WindowsTargetPlatformVersion>
<QtMsBuild Condition="'$(QtMsBuild)'=='' or !Exists('$(QtMsBuild)\qt.targets')">$(MSBuildProjectDirectory)\QtMsBuild</QtMsBuild>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
@ -42,63 +42,64 @@
<PlatformToolset>v143</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<Import Project="$(QtMsBuild)\qt_defaults.props" Condition="Exists('$(QtMsBuild)\qt_defaults.props')" />
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<QtModules>core;network;gui;widgets</QtModules>
</PropertyGroup>
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<QtInstall>5.15.2_msvc2019_64</QtInstall>
<QtModules>core;network;gui;widgets</QtModules>
</PropertyGroup>
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<QtModules>core;network;gui;widgets</QtModules>
</PropertyGroup>
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<QtInstall>5.14.2_msvc2017_64</QtInstall>
<QtModules>core;network;gui;widgets</QtModules>
</PropertyGroup>
<Target Name="QtMsBuildNotFound" BeforeTargets="CustomBuild;ClCompile" Condition="!Exists('$(QtMsBuild)\qt.targets') OR !Exists('$(QtMsBuild)\Qt.props')">
<Target Name="QtMsBuildNotFound" BeforeTargets="CustomBuild;ClCompile" Condition="!Exists('$(QtMsBuild)\qt.targets') or !Exists('$(QtMsBuild)\qt.props')">
<Message Importance="High" Text="QtMsBuild: could not locate qt.targets, qt.props; project may not build correctly." />
</Target>
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="$(QtMsBuild)\Qt.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="$(QtMsBuild)\Qt.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="$(QtMsBuild)\Qt.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="$(QtMsBuild)\Qt.props" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>14.0.25431.1</_ProjectFileVersion>
<ImportGroup Condition="Exists('$(QtMsBuild)\qt_defaults.props')">
<Import Project="$(QtMsBuild)\qt_defaults.props" />
</ImportGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
<IncludePath>$(IncludePath)</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
<IncludePath>$(IncludePath)</IncludePath>
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<QtInstall>5.15.0</QtInstall>
<QtModules>core;network;gui;widgets</QtModules>
</PropertyGroup>
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<QtModules>core;network;gui;widgets</QtModules>
</PropertyGroup>
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<QtInstall>5.15.0</QtInstall>
<QtModules>core;network;gui;widgets</QtModules>
</PropertyGroup>
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<QtModules>core;network;gui;widgets</QtModules>
</PropertyGroup>
<ImportGroup Condition="Exists('$(QtMsBuild)\qt.props')">
<Import Project="$(QtMsBuild)\qt.props" />
</ImportGroup>
<PropertyGroup>
<_ProjectFileVersion>14.0.25431.1</_ProjectFileVersion>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PreprocessorDefinitions>UNICODE;_UNICODE;WIN32;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>.;.\GeneratedFiles;.\GeneratedFiles\$(ConfigurationName);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>GeneratedFiles\$(ConfigurationName);GeneratedFiles;.\GeneratedFiles;.;.\GeneratedFiles\$(ConfigurationName);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<Optimization>Disabled</Optimization>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@ -135,20 +136,21 @@
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<PreprocessorDefinitions>UNICODE;_UNICODE;WIN32;WIN64;NOMINMAX;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>.;.\GeneratedFiles;.\GeneratedFiles\$(ConfigurationName);G:\code_library\c\opencv\4.3\build-opencv-cpu\include;$(ProjectDir)MvIMPACT;$(ProjectDir)Pylon6.2\include;$(ProjectDir)Common;$(ProjectDir)modbus;$(ProjectDir)MVS3.2.1\Include;$(ProjectDir)PLC;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>GeneratedFiles\$(ConfigurationName);GeneratedFiles;.\GeneratedFiles;.;.\GeneratedFiles\$(ConfigurationName);G:\code_library\c\opencv\4.3\build-opencv-cpu\include;$(ProjectDir)MvIMPACT;$(ProjectDir)Pylon6.2\include;$(ProjectDir)Common;$(ProjectDir)modbus;$(ProjectDir)MVS3.2.1\Include;$(ProjectDir)PLC;$(ProjectDir)Ui;$(ProjectDir)Thread;$(ProjectDir)3rd\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<Optimization>MaxSpeed</Optimization>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<LanguageStandard>stdcpp14</LanguageStandard>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<OutputFile>$(OutDir)\$(ProjectName).exe</OutputFile>
<AdditionalLibraryDirectories>G:\code_library\c\opencv\4.3\build-opencv-cpu\x64\vc15\lib;$(ProjectDir)Pylon6.2\lib\Win64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalLibraryDirectories>G:\code_library\c\opencv\4.3\build-opencv-cpu\x64\vc15\lib;$(ProjectDir)Pylon6.2\lib\Win64;$(ProjectDir)3rd\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>false</GenerateDebugInformation>
<AdditionalDependencies>opencv_world430d.lib;modbus.lib;mvDeviceManager.lib;MvCameraControl.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>opencv_world430d.lib;modbus.lib;mvDeviceManager.lib;MvCameraControl.lib;Qt5Mqttd.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<QtMoc>
<ExecutionDescription>Moc'ing %(Identity)...</ExecutionDescription>
@ -173,7 +175,7 @@
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PreprocessorDefinitions>UNICODE;_UNICODE;WIN32;WIN64;QT_NO_DEBUG;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>.;.\GeneratedFiles;.\GeneratedFiles\$(ConfigurationName);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>GeneratedFiles\$(ConfigurationName);GeneratedFiles;.\GeneratedFiles;.;.\GeneratedFiles\$(ConfigurationName);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<DebugInformationFormat />
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
@ -209,22 +211,23 @@
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PreprocessorDefinitions>UNICODE;_UNICODE;WIN32;WIN64;QT_NO_DEBUG;NDEBUG;NOMINMAX;WIN32_LEAN_AND_MEAN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>.;.\GeneratedFiles;.\GeneratedFiles\$(ConfigurationName);$(ProjectDir)MvIMPACT;$(ProjectDir)OpenCV455Simple\include;$(ProjectDir)Common;$(ProjectDir)Pylon6.2\include;$(ProjectDir)modbus;$(ProjectDir)MVS3.2.1\Include;$(ProjectDir)PLC;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>GeneratedFiles\$(ConfigurationName);GeneratedFiles;.\GeneratedFiles;.;.\GeneratedFiles\$(ConfigurationName);$(ProjectDir)MvIMPACT;$(ProjectDir)OpenCV455Simple\include;$(ProjectDir)Common;$(ProjectDir)Pylon6.2\include;$(ProjectDir)modbus;$(ProjectDir)MVS3.2.1\Include;$(ProjectDir)PLC;$(ProjectDir)Ui;$(ProjectDir)Thread;$(ProjectDir)3rd\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<LanguageStandard>stdcpp14</LanguageStandard>
<Optimization>Disabled</Optimization>
<Optimization>MaxSpeed</Optimization>
<SupportJustMyCode>false</SupportJustMyCode>
<DisableSpecificWarnings>4819;%(DisableSpecificWarnings)</DisableSpecificWarnings>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<OutputFile>$(OutDir)\$(ProjectName).exe</OutputFile>
<AdditionalLibraryDirectories>$(ProjectDir)OpenCV455Simple\win64\vc15\lib;$(ProjectDir)Pylon6.2\lib\Win64;$(ProjectDir)MvIMPACT\lib\win64;$(ProjectDir)MVS3.2.1\lib\win64;$(ProjectDir)modbus;Ws2_32.lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>opencv_world455.lib;modbus.lib;mvDeviceManager.lib;MvCameraControl.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(ProjectDir)OpenCV455Simple\win64\vc15\lib;$(ProjectDir)Pylon6.2\lib\Win64;$(ProjectDir)MvIMPACT\lib\win64;$(ProjectDir)MVS3.2.1\lib\win64;$(ProjectDir)modbus;$(ProjectDir)3rd\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<GenerateDebugInformation>false</GenerateDebugInformation>
<AdditionalDependencies>opencv_world455.lib;modbus.lib;mvDeviceManager.lib;MvCameraControl.lib;Qt5Mqtt.lib;%(AdditionalDependencies)</AdditionalDependencies>
<IgnoreSpecificDefaultLibraries>
</IgnoreSpecificDefaultLibraries>
</Link>
@ -249,139 +252,107 @@
</QtUic>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="alarmdialog.cpp" />
<ClCompile Include="AlarmInfo.cpp" />
<ClCompile Include="alg_jd.cpp" />
<ClCompile Include="ASyncQueue.cpp" />
<ClCompile Include="balluffcamera.cpp" />
<ClCompile Include="basecamera.cpp" />
<ClCompile Include="baslercamera.cpp" />
<ClCompile Include="camera_glue.cpp" />
<ClCompile Include="CaptureThread.cpp" />
<ClCompile Include="CaptureThreadBasler.cpp" />
<ClCompile Include="CaptureThreadHIK.cpp" />
<ClCompile Include="change_shift.cpp" />
<ClCompile Include="cigarette.cpp" />
<ClCompile Include="Cleanthread.cpp" />
<ClCompile Include="common.cpp" />
<ClCompile Include="db_label.cpp" />
<ClCompile Include="debugthread.cpp" />
<ClCompile Include="dialogin.cpp" />
<ClCompile Include="dialogsetup.cpp" />
<ClCompile Include="dialogsetuppasswd.cpp" />
<ClCompile Include="exportData.cpp" />
<ClCompile Include="hikcamera.cpp" />
<ClCompile Include="Logthread.cpp" />
<ClCompile Include="main.cpp" />
<ClCompile Include="output_statistic.cpp" />
<ClCompile Include="plcsetup.cpp" />
<ClCompile Include="PLC\PLCDevice.cpp" />
<ClCompile Include="plc_item.cpp" />
<ClCompile Include="SyncQueue.cpp" />
<ClCompile Include="SyncWorkThread.cpp" />
<ClCompile Include="threadReceive.cpp" />
<ClCompile Include="threadSend.cpp" />
<ClCompile Include="threadSendTCP.cpp" />
<ClCompile Include="Thread\CaptureThread.cpp" />
<ClCompile Include="Thread\CaptureThreadBasler.cpp" />
<ClCompile Include="Thread\CaptureThreadHIK.cpp" />
<ClCompile Include="Thread\Cleanthread.cpp" />
<ClCompile Include="Thread\debugthread.cpp" />
<ClCompile Include="Thread\Logthread.cpp" />
<ClCompile Include="Thread\syncworkthread.cpp" />
<ClCompile Include="Thread\threadReceive.cpp" />
<ClCompile Include="Thread\threadSend.cpp" />
<ClCompile Include="Thread\threadSendMqtt.cpp" />
<ClCompile Include="Thread\threadSendTCP.cpp" />
<ClCompile Include="Thread\workthread.cpp" />
<ClCompile Include="tinyxml2.cpp" />
<ClCompile Include="workthread.cpp" />
<ClCompile Include="Ui\alarmdialog.cpp" />
<ClCompile Include="Ui\camera_glue.cpp" />
<ClCompile Include="Ui\change_shift.cpp" />
<ClCompile Include="Ui\dialogin.cpp" />
<ClCompile Include="Ui\dialogsetup.cpp" />
<ClCompile Include="Ui\dialogsetuppasswd.cpp" />
<ClCompile Include="Ui\output_statistic.cpp" />
<ClCompile Include="Ui\plcsetup.cpp" />
</ItemGroup>
<ItemGroup>
<QtMoc Include="cigarette.h" />
<QtMoc Include="cigarette.h">
</QtMoc>
</ItemGroup>
<ItemGroup>
<QtUic Include="cigarette.ui" />
<QtUic Include="cigarette.ui">
</QtUic>
<QtUic Include="Ui\alarmdialog.ui" />
<QtUic Include="Ui\camera_glue.ui" />
<QtUic Include="Ui\change_shift.ui" />
<QtUic Include="Ui\dialogin.ui" />
<QtUic Include="Ui\dialogsetup.ui" />
<QtUic Include="Ui\dialogsetuppasswd.ui" />
<QtUic Include="Ui\output_statistic.ui" />
<QtUic Include="Ui\plcsetup.ui" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="FtpManager.h" />
<QtMoc Include="SyncWorkThread.h" />
<ClInclude Include="threadSendTCP.h" />
<QtMoc Include="Ui\output_statistic.h" />
<QtMoc Include="Ui\change_shift.h" />
<QtMoc Include="Ui\camera_glue.h" />
<QtMoc Include="Ui\plcsetup.hpp" />
<QtMoc Include="Ui\dialogsetuppasswd.hpp" />
<QtMoc Include="Ui\dialogsetup.hpp" />
<QtMoc Include="Ui\dialogin.hpp" />
<QtMoc Include="Ui\alarmdialog.hpp" />
<QtMoc Include="Thread\CaptureThread.h" />
<QtMoc Include="Thread\CaptureThreadBasler.h" />
<QtMoc Include="Thread\CaptureThreadHIK.h" />
<QtMoc Include="Thread\Cleanthread.h" />
<QtMoc Include="Thread\debugthread.h" />
<QtMoc Include="Thread\Logthread.h" />
<QtMoc Include="Thread\savethread.h" />
<QtMoc Include="Thread\syncworkthread.h" />
<QtMoc Include="Thread\threadReceive.h" />
<ClInclude Include="Thread\threadSend.h" />
<ClInclude Include="Thread\threadSendMqtt.h" />
<ClInclude Include="Thread\threadSendTCP.h" />
<QtMoc Include="Thread\workthread.h" />
<ClInclude Include="tinyxml2.h" />
<QtMoc Include="threadReceive.h" />
<CustomBuild Include="threadSend.h">
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
</Command>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
</Command>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
</Command>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
</Command>
</CustomBuild>
<QtMoc Include="workthread.h" />
<QtMoc Include="alarmdialog.hpp" />
<ClInclude Include="AlarmInfo.h" />
<ClInclude Include="alg_jd.h" />
<ClInclude Include="ASyncQueue.h" />
<ClInclude Include="balluffcamera.h" />
<QtMoc Include="CaptureThread.h" />
<ClInclude Include="baslercamera.h" />
<QtMoc Include="CaptureThreadBasler.h" />
<QtMoc Include="CaptureThreadHIK.h" />
<QtMoc Include="camera_glue.h" />
<QtMoc Include="change_shift.h" />
<QtMoc Include="Cleanthread.h" />
<ClInclude Include="common.h" />
<QtMoc Include="plcsetup.hpp" />
<QtMoc Include="db_label.h" />
<QtMoc Include="debugthread.h" />
<QtMoc Include="dialogin.hpp" />
<QtMoc Include="exportData.h" />
<QtMoc Include="db_label.h">
</QtMoc>
<QtMoc Include="exportData.h">
</QtMoc>
<ClInclude Include="hikcamera.h" />
<QtMoc Include="output_statistic.h" />
<QtMoc Include="Logthread.h" />
<ClInclude Include="PLC\PLCDevice.h" />
<ClInclude Include="plc_item.h" />
<QtMoc Include="savethread.h" />
<ClInclude Include="SyncQueue.h" />
<QtMoc Include="dialogsetuppasswd.hpp" />
<QtMoc Include="dialogsetup.hpp" />
<ClInclude Include="basecamera.h" />
</ItemGroup>
<ItemGroup>
<QtRcc Include="cigarette.qrc" />
</ItemGroup>
<ItemGroup>
<QtUic Include="dialogsetuppasswd.ui" />
</ItemGroup>
<ItemGroup>
<QtUic Include="dialogsetup.ui" />
</ItemGroup>
<ItemGroup>
<QtUic Include="plcsetup.ui" />
</ItemGroup>
<ItemGroup>
<QtUic Include="alarmdialog.ui" />
</ItemGroup>
<ItemGroup>
<QtUic Include="dialogin.ui" />
</ItemGroup>
<ItemGroup>
<QtUic Include="camera_glue.ui" />
</ItemGroup>
<ItemGroup>
<QtUic Include="change_shift.ui" />
</ItemGroup>
<ItemGroup>
<QtUic Include="output_statistic.ui" />
<QtRcc Include="cigarette.qrc">
</QtRcc>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<Import Project="$(QtMsBuild)\qt.targets" Condition="Exists('$(QtMsBuild)\qt.targets')" />
<ImportGroup Condition="Exists('$(QtMsBuild)\qt.targets')">
<Import Project="$(QtMsBuild)\qt.targets" />
</ImportGroup>
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
<ProjectExtensions>

@ -33,6 +33,18 @@
<Extensions>cpp;moc</Extensions>
<SourceControlFiles>False</SourceControlFiles>
</Filter>
<Filter Include="Header Files\Ui">
<UniqueIdentifier>{473883a5-266b-4c0a-97ce-c07ce50ee349}</UniqueIdentifier>
</Filter>
<Filter Include="Header Files\Thread">
<UniqueIdentifier>{081898e5-fc92-47a4-9de7-0317588c2c6c}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\Ui">
<UniqueIdentifier>{045acf89-3551-4318-a690-0f58eaf08f4d}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\Thread">
<UniqueIdentifier>{91e6e8fc-6df2-4732-839b-4f873694fc78}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="main.cpp">
@ -41,12 +53,6 @@
<ClCompile Include="cigarette.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="dialogsetuppasswd.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="dialogsetup.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="basecamera.cpp">
<Filter>Source Files</Filter>
</ClCompile>
@ -59,86 +65,95 @@
<ClCompile Include="balluffcamera.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="plcsetup.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="CaptureThread.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="plc_item.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="db_label.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="alarmdialog.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="AlarmInfo.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="common.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="debugthread.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="dialogin.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="ASyncQueue.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="baslercamera.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="workthread.cpp">
<ClCompile Include="hikcamera.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="CaptureThreadBasler.cpp">
<ClCompile Include="PLC\PLCDevice.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="hikcamera.cpp">
<ClCompile Include="exportData.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="CaptureThreadHIK.cpp">
<ClCompile Include="tinyxml2.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="PLC\PLCDevice.cpp">
<Filter>Source Files</Filter>
<ClCompile Include="Thread\CaptureThread.cpp">
<Filter>Source Files\Thread</Filter>
</ClCompile>
<ClCompile Include="threadSend.cpp">
<Filter>Source Files</Filter>
<ClCompile Include="Thread\CaptureThreadBasler.cpp">
<Filter>Source Files\Thread</Filter>
</ClCompile>
<ClCompile Include="camera_glue.cpp">
<Filter>Source Files</Filter>
<ClCompile Include="Thread\CaptureThreadHIK.cpp">
<Filter>Source Files\Thread</Filter>
</ClCompile>
<ClCompile Include="change_shift.cpp">
<Filter>Source Files</Filter>
<ClCompile Include="Thread\Cleanthread.cpp">
<Filter>Source Files\Thread</Filter>
</ClCompile>
<ClCompile Include="output_statistic.cpp">
<Filter>Source Files</Filter>
<ClCompile Include="Thread\debugthread.cpp">
<Filter>Source Files\Thread</Filter>
</ClCompile>
<ClCompile Include="Logthread.cpp">
<Filter>Source Files</Filter>
<ClCompile Include="Thread\Logthread.cpp">
<Filter>Source Files\Thread</Filter>
</ClCompile>
<ClCompile Include="Cleanthread.cpp">
<Filter>Source Files</Filter>
<ClCompile Include="Thread\syncworkthread.cpp">
<Filter>Source Files\Thread</Filter>
</ClCompile>
<ClCompile Include="threadReceive.cpp">
<Filter>Source Files</Filter>
<ClCompile Include="Thread\threadReceive.cpp">
<Filter>Source Files\Thread</Filter>
</ClCompile>
<ClCompile Include="exportData.cpp">
<Filter>Source Files</Filter>
<ClCompile Include="Thread\threadSend.cpp">
<Filter>Source Files\Thread</Filter>
</ClCompile>
<ClCompile Include="tinyxml2.cpp">
<Filter>Source Files</Filter>
<ClCompile Include="Thread\threadSendTCP.cpp">
<Filter>Source Files\Thread</Filter>
</ClCompile>
<ClCompile Include="threadSendTCP.cpp">
<Filter>Source Files</Filter>
<ClCompile Include="Thread\workthread.cpp">
<Filter>Source Files\Thread</Filter>
</ClCompile>
<ClCompile Include="SyncWorkThread.cpp">
<Filter>Source Files</Filter>
<ClCompile Include="Ui\alarmdialog.cpp">
<Filter>Source Files\Ui</Filter>
</ClCompile>
<ClCompile Include="Ui\camera_glue.cpp">
<Filter>Source Files\Ui</Filter>
</ClCompile>
<ClCompile Include="Ui\change_shift.cpp">
<Filter>Source Files\Ui</Filter>
</ClCompile>
<ClCompile Include="Ui\dialogin.cpp">
<Filter>Source Files\Ui</Filter>
</ClCompile>
<ClCompile Include="Ui\dialogsetup.cpp">
<Filter>Source Files\Ui</Filter>
</ClCompile>
<ClCompile Include="Ui\dialogsetuppasswd.cpp">
<Filter>Source Files\Ui</Filter>
</ClCompile>
<ClCompile Include="Ui\output_statistic.cpp">
<Filter>Source Files\Ui</Filter>
</ClCompile>
<ClCompile Include="Ui\plcsetup.cpp">
<Filter>Source Files\Ui</Filter>
</ClCompile>
<ClCompile Include="Thread\threadSendMqtt.cpp">
<Filter>Source Files\Thread</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
@ -151,92 +166,65 @@
<QtRcc Include="cigarette.qrc">
<Filter>Resource Files</Filter>
</QtRcc>
<QtMoc Include="dialogsetuppasswd.hpp">
<QtMoc Include="db_label.h">
<Filter>Header Files</Filter>
</QtMoc>
<QtUic Include="dialogsetuppasswd.ui">
<Filter>Form Files</Filter>
</QtUic>
<QtMoc Include="dialogsetup.hpp">
<QtMoc Include="exportData.h">
<Filter>Header Files</Filter>
</QtMoc>
<QtUic Include="dialogsetup.ui">
<Filter>Form Files</Filter>
</QtUic>
<QtMoc Include="plcsetup.hpp">
<Filter>Header Files</Filter>
<QtMoc Include="Thread\CaptureThread.h">
<Filter>Header Files\Thread</Filter>
</QtMoc>
<QtUic Include="plcsetup.ui">
<Filter>Form Files</Filter>
</QtUic>
<QtMoc Include="CaptureThread.h">
<Filter>Header Files</Filter>
<QtMoc Include="Thread\CaptureThreadBasler.h">
<Filter>Header Files\Thread</Filter>
</QtMoc>
<QtMoc Include="db_label.h">
<Filter>Header Files</Filter>
<QtMoc Include="Thread\CaptureThreadHIK.h">
<Filter>Header Files\Thread</Filter>
</QtMoc>
<QtMoc Include="alarmdialog.hpp">
<Filter>Header Files</Filter>
<QtMoc Include="Thread\Cleanthread.h">
<Filter>Header Files\Thread</Filter>
</QtMoc>
<QtUic Include="alarmdialog.ui">
<Filter>Form Files</Filter>
</QtUic>
<QtMoc Include="debugthread.h">
<Filter>Header Files</Filter>
<QtMoc Include="Thread\debugthread.h">
<Filter>Header Files\Thread</Filter>
</QtMoc>
<QtMoc Include="dialogin.hpp">
<Filter>Header Files</Filter>
<QtMoc Include="Thread\Logthread.h">
<Filter>Header Files\Thread</Filter>
</QtMoc>
<QtUic Include="dialogin.ui">
<Filter>Form Files</Filter>
</QtUic>
<QtMoc Include="workthread.h">
<Filter>Header Files</Filter>
<QtMoc Include="Thread\savethread.h">
<Filter>Header Files\Thread</Filter>
</QtMoc>
<QtMoc Include="CaptureThreadBasler.h">
<Filter>Header Files</Filter>
<QtMoc Include="Thread\syncworkthread.h">
<Filter>Header Files\Thread</Filter>
</QtMoc>
<QtMoc Include="savethread.h">
<Filter>Header Files</Filter>
<QtMoc Include="Thread\threadReceive.h">
<Filter>Header Files\Thread</Filter>
</QtMoc>
<QtMoc Include="CaptureThreadHIK.h">
<Filter>Header Files</Filter>
<QtMoc Include="Thread\workthread.h">
<Filter>Header Files\Thread</Filter>
</QtMoc>
<CustomBuild Include="threadSend.h">
<Filter>Header Files</Filter>
</CustomBuild>
<QtMoc Include="camera_glue.h">
<Filter>Header Files</Filter>
<QtMoc Include="Ui\alarmdialog.hpp">
<Filter>Header Files\Ui</Filter>
</QtMoc>
<QtUic Include="camera_glue.ui">
<Filter>Form Files</Filter>
</QtUic>
<QtMoc Include="change_shift.h">
<Filter>Header Files</Filter>
<QtMoc Include="Ui\dialogin.hpp">
<Filter>Header Files\Ui</Filter>
</QtMoc>
<QtUic Include="change_shift.ui">
<Filter>Form Files</Filter>
</QtUic>
<QtMoc Include="output_statistic.h">
<Filter>Header Files</Filter>
<QtMoc Include="Ui\dialogsetup.hpp">
<Filter>Header Files\Ui</Filter>
</QtMoc>
<QtUic Include="output_statistic.ui">
<Filter>Form Files</Filter>
</QtUic>
<QtMoc Include="Logthread.h">
<Filter>Header Files</Filter>
<QtMoc Include="Ui\dialogsetuppasswd.hpp">
<Filter>Header Files\Ui</Filter>
</QtMoc>
<QtMoc Include="Cleanthread.h">
<Filter>Header Files</Filter>
<QtMoc Include="Ui\plcsetup.hpp">
<Filter>Header Files\Ui</Filter>
</QtMoc>
<QtMoc Include="threadReceive.h">
<Filter>Header Files</Filter>
<QtMoc Include="Ui\camera_glue.h">
<Filter>Header Files\Ui</Filter>
</QtMoc>
<QtMoc Include="exportData.h">
<Filter>Header Files</Filter>
<QtMoc Include="Ui\change_shift.h">
<Filter>Header Files\Ui</Filter>
</QtMoc>
<QtMoc Include="SyncWorkThread.h">
<Filter>Header Files</Filter>
<QtMoc Include="Ui\output_statistic.h">
<Filter>Header Files\Ui</Filter>
</QtMoc>
</ItemGroup>
<ItemGroup>
@ -279,8 +267,40 @@
<ClInclude Include="FtpManager.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="threadSendTCP.h">
<Filter>Header Files</Filter>
<ClInclude Include="Thread\threadSend.h">
<Filter>Header Files\Thread</Filter>
</ClInclude>
<ClInclude Include="Thread\threadSendTCP.h">
<Filter>Header Files\Thread</Filter>
</ClInclude>
<ClInclude Include="Thread\threadSendMqtt.h">
<Filter>Header Files\Thread</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<QtUic Include="Ui\alarmdialog.ui">
<Filter>Form Files</Filter>
</QtUic>
<QtUic Include="Ui\camera_glue.ui">
<Filter>Form Files</Filter>
</QtUic>
<QtUic Include="Ui\change_shift.ui">
<Filter>Form Files</Filter>
</QtUic>
<QtUic Include="Ui\dialogin.ui">
<Filter>Form Files</Filter>
</QtUic>
<QtUic Include="Ui\dialogsetup.ui">
<Filter>Form Files</Filter>
</QtUic>
<QtUic Include="Ui\dialogsetuppasswd.ui">
<Filter>Form Files</Filter>
</QtUic>
<QtUic Include="Ui\output_statistic.ui">
<Filter>Form Files</Filter>
</QtUic>
<QtUic Include="Ui\plcsetup.ui">
<Filter>Form Files</Filter>
</QtUic>
</ItemGroup>
</Project>

@ -2,23 +2,16 @@
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<QTDIR>C:\Qt\5.15.2\msvc2019_64</QTDIR>
<LocalDebuggerEnvironment>PATH=$(QTDIR)\bin%3bD:\Qt\5.15.2\msvc2019_64\bin%3b$(PATH)</LocalDebuggerEnvironment>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
<LocalDebuggerEnvironment>PATH=$(QTDIR)\bin%3b$(SOLUTIONDIR)runtime%3b$(QTDIR)\bin%3bD:\Qt\5.15.0\msvc2019_64\bin%3b$(PATH)</LocalDebuggerEnvironment>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<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>
<QtLastBackgroundBuild>2024-10-04T06:46:34.3746998Z</QtLastBackgroundBuild>
</PropertyGroup>
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<QtLastBackgroundBuild>2024-05-17T01:16:05.4290511Z</QtLastBackgroundBuild>
<QtLastBackgroundBuild>2024-10-04T06:46:35.5916473Z</QtLastBackgroundBuild>
</PropertyGroup>
</Project>

Binary file not shown.

@ -1,11 +1,14 @@
#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
@ -14,15 +17,15 @@ bool PLCDevice::init_plc(PLCDevice* PLCptr)
const char* comport = g_sys_conf.ComPort.data();
qDebug() << "COM:" << comport;
//连接PLC
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
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
uint8_t data;
int ret = modbus_read_bits(PLCptr->g_modbus, 30000, 1, &data);
if (PLCptr->g_modbus && ret == -1) {
int ret = modbus_read_bits(g_modbus, 30000, 1, &data);
if (g_modbus && ret == -1) {
PLCptr->g_plc_ok = false;
}
else {
@ -32,153 +35,6 @@ 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)
@ -252,19 +108,3 @@ 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,36 +1,20 @@
#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);
};

@ -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 = 10;
const unsigned int timeout_ms = 100;
Ready = true;
while (!boTerminated_)
{

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

@ -10,11 +10,6 @@ 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;
@ -45,7 +40,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++;
@ -225,7 +220,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;
@ -291,10 +286,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, 10);
nRet = MV_CC_GetImageForBGR(CamHandle, g_pImage_buf, nDataSize, &stFrameInfo, 100);
if (MV_OK == nRet)
{
m_cntGrabbedImages++;

@ -37,6 +37,7 @@ 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];
@ -47,10 +48,8 @@ void CleanWorkThread::doWork()
LPCWSTR strDriver = (LPCWSTR)iDriver.utf16();
ULARGE_INTEGER freeDiskSpaceAvailable, totalDiskSpace, totalFreeDiskSpace;
qint64 gb = (1024 * 1024 * 1024);
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");
//QString dir("D:/image");
QString dir(g_conf_path.save_pics_path + "/ALL");
if (delSelection == 2)
{
@ -61,9 +60,6 @@ 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;
@ -71,9 +67,6 @@ 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;
}

@ -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);//XML发送信号函数
void sendDataToExport(QString filePath);
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 (IsALL && b_save)
bool b_save = cv::imwrite(file_name, image);
if (b_save)
{
//sendDataToExport(QString::fromStdString(file_name));
sendDataToExport(QString::fromLocal8Bit(QByteArray::fromRawData(file_name.c_str(), file_name.size())));

@ -25,7 +25,6 @@ extern SyncQueue<_UDPSendInfo>* UDP_Info_queue;
#endif
#ifdef __TCPSend
extern SyncQueue<_TCPSendInfo>* TCP_Info_queue;
extern threadSendTCP tcpSendThread;
#endif
#ifdef __ExportData
extern ExportDataThread exportDataThread;
@ -33,7 +32,6 @@ extern ExportDataThread exportDataThread;
extern PLCDevice* m_PLCDevice;
extern bool g_debug_mode;
bool IsALL = false;//是否是全存
SyncWorkThread::~SyncWorkThread()
{
stop();
@ -43,12 +41,11 @@ SyncWorkThread::~SyncWorkThread()
wait();
}
void SyncWorkThread::init(SyncQueue<std::vector<std::pair<int, cv::Mat>>>* image_ptr, ASyncQueue<bool>* result_ptr[], int MergeToCamId)
void SyncWorkThread::init(SyncQueue<std::vector<std::pair<int, cv::Mat>>>* image_ptr, ASyncQueue<bool>* result_ptr)
{
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;
}
@ -68,20 +65,19 @@ 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(image_h * g_sys_conf.shoot[0], image_w * work_camera_nums, CV_8UC3);//640*work_camera_nums
cv::Mat merge_image = cv::Mat::zeros(512 * work_camera_nums, 640 * g_sys_conf.shoot[0], CV_8UC3);
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];
@ -124,11 +120,11 @@ void SyncWorkThread::run()
{
cv::cvtColor(image, image, CV_BGR2RGB); //灰度图像转为彩色图像
}
cv::resize(image, image, cv::Size(image_w, image_h * unit_count));
cv::resize(image, image, cv::Size(640, 512 * 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);
@ -141,6 +137,7 @@ 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();
@ -153,9 +150,7 @@ 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);
@ -175,19 +170,16 @@ 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] = "1";
ng_reason_maps[1] = "0";
ng_reason_maps[2] = "0";
ng_reason_maps[3] = "0";
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";
for (int index = 0; index < unit_count; index++) {
if (vec_results[index].size() < local_SysConf.no[local_camera_number][index])
{
@ -200,28 +192,27 @@ void SyncWorkThread::run()
IsNG = false;
ngReason = 0;
}
// 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 (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 (unit_count >= 2) {
image1 = vec_out[(result_index[i]) % 2].clone();
@ -256,6 +247,7 @@ void SyncWorkThread::run()
#endif
}
result_index[i]++;
if (!IsNG)
{
if (!g_debug_mode)
@ -263,42 +255,36 @@ void SyncWorkThread::run()
#ifdef SYNC_CAMERA
emit event_ok(local_camera_number);
#endif
#ifndef IS_CAM_NG_OK_DATA_MERGED
local_g_result_queue[local_camera_number]->put(true);
#endif
local_g_result_queue->put(true);
}
}
else
{
IsALL = false;
if (!g_debug_mode)
{
#ifdef SYNC_CAMERA
emit event_ng(local_camera_number);
#endif
#ifndef IS_CAM_NG_OK_DATA_MERGED
local_g_result_queue[local_camera_number]->put(false);
#else
local_g_result_queue->put(false);
IsNGForAll = TRUE;
#endif
}
if ((local_SysConf.save == 2) || (local_SysConf.save == 1))
{
for (int index = 0; index < unit_count; index++)
{
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));
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/" +
@ -307,14 +293,15 @@ 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)
{
@ -325,33 +312,6 @@ 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
@ -374,28 +334,15 @@ void SyncWorkThread::run()
#endif
j++;
}
#ifdef IS_CAM_NG_OK_DATA_MERGED
if (IsNGForAll)
{
local_g_result_queue[MergeToCamId]->put(false);
/*to do something*/
}
else
{
local_g_result_queue[MergeToCamId]->put(true);
}
#endif
// emit display_check_total(local_camera_number, ++(frame_total[local_camera_number]));
}
}
catch (const std::exception& e) {
// 注意std::exception通常不捕获由运行时错误引发的异常
// 但这里是为了演示catch块的结构
std::cerr << __FUNCTION__<<"捕获到异常: " << e.what() << std::endl;
}
catch (...) {
// 使用省略号(...)可以捕获所有类型的异常,这是一种通用的捕获方式
std::cerr << "捕获到未知类型的异常" << std::endl;
catch (cv::Exception& e)
{
const char* err_msg = e.what();
std::cout << "exception caught: " << err_msg << std::endl;
}
}

@ -22,10 +22,6 @@ 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)
@ -34,16 +30,15 @@ public:
}
~SyncWorkThread();
void init(SyncQueue<std::vector<std::pair<int, cv::Mat>>>* image_ptr, ASyncQueue<bool>* result_ptr[], int MergeToCamId);
void init(SyncQueue<std::vector<std::pair<int, cv::Mat>>>* image_ptr, ASyncQueue<bool>* result_ptr);
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,51 +25,40 @@ void threadSend::stop()
void threadSend::run()
{
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;
}
}
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;
}
}

@ -0,0 +1,97 @@
#include "threadSendMqtt.h"
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <stdio.h>
#include <qtcpsocket.h>
// 相关头文件
#include <QFile> // 文件操作
#include <QJsonObject> // JSON对象
#include <QJsonArray> // JSON数组
#include <QJsonDocument> // JSON文档
#include <QJsonParseError> // JSON异常捕捉
void threadSendMqtt::init(SyncQueue<_MqttSendInfo>* p_MQTT_Info_queue, std::string ip_, int port_) {
ip = QString::fromStdString(ip_);
port = port_;
qDebug() << "Mqtt ip:" << ip << "| Mqtt port:" << port;
Local_MQTT_Info_queue = p_MQTT_Info_queue;
}
void threadSendMqtt::start_work()
{
//start(HighestPriority);
start();
}
void threadSendMqtt::stop()
{
isLoop = false;
wait();
delete m_client;
}
bool threadSendMqtt::connectTCP() {
m_client = new QMqttClient(this);
m_client->setHostname(ip);
m_client->setPort(port);
//m_client->setUsername(userName);
//m_client->setPassword(userPassword);
m_client->connectToHost();
//connect(m_client, &QMqttClient::stateChanged, this, &MainWindow::updateLogStateChange);
connect(m_client, &QMqttClient::connected, this, [this](void) {qDebug() << "Mqtt connected";});
connect(m_client, &QMqttClient::disconnected, this, [this](void) {qDebug() << "Mqtt disconnected"; });
connect(m_client, SIGNAL(messageSent(qint32)), this, SLOT(MQTT_DATASEND_SUCCESS(qint32)));//消息发送成功提示的槽函数绑定
connect(m_client, &QMqttClient::messageReceived, this, [this](const QByteArray &message, const QMqttTopicName &topic) {
const QString content = QDateTime::currentDateTime().toString()
+ QLatin1String(" Received Topic: ")
+ topic.name()
+ QLatin1String(" Message: ")
+ message
+ QLatin1Char('\n');
//ui->editLog->insertPlainText(content);
});
connect(m_client, &QMqttClient::pingResponseReceived, this, [this]() {
const QString content = QDateTime::currentDateTime().toString()
+ QLatin1String(" PingResponse")
+ QLatin1Char('\n');
//ui->editLog->insertPlainText(content);
});
//connect(ui->lineEditHost, &QLineEdit::textChanged, m_client, &QMqttClient::setHostname);
//connect(ui->spinBoxPort, QOverload<int>::of(&QSpinBox::valueChanged), this, &MainWindow::setClientPort);
return true;
}
void threadSendMqtt::run()
{
if (!connectTCP())
qDebug() << "Mqtt connect error!";
while (isLoop) {
_MqttSendInfo TCPSendInfo;
Local_MQTT_Info_queue->take(TCPSendInfo);
num++;
sendData(&TCPSendInfo, num);
}
}
void threadSendMqtt::sendData(_MqttSendInfo* TCPSendInfo, int Num) {
QJsonObject addressObject;
// 方式二:赋值
addressObject["street"] = "123 Main St.";
addressObject["city"] = "Anytown";
addressObject["country"] = "USA";
if (m_client->state() == QMqttClient::Connected) {
QJsonDocument jsonDoc(addressObject);
QByteArray jsonBytes = jsonDoc.toJson();
auto result = m_client->publish(QMqttTopicName("topic"), jsonBytes, 0, true);
}
}

@ -0,0 +1,56 @@
#pragma once
#include <QDebug>
#include <QDateTime>
#include <iostream>
#include <QThread>
#include <QtMqtt/qmqttclient.h>
#include "common.h"
#include "SyncQueue.h"
class _MqttSendInfo
{
public:
int MsgID;
QString timecost;
_MqttSendInfo()
{
}
};
class threadSendMqtt : public QThread {
public:
QString ip;
int port;
int num = 0;
threadSendMqtt(QObject* o = nullptr) :QThread(o)
{
isLoop = true;
}
~threadSendMqtt()
{
stop();
_MqttSendInfo TCPSendInfo;
Local_MQTT_Info_queue->put(TCPSendInfo);
quit();
wait();
}
void stop();
bool connectTCP();
protected:
void run();
public:
void init(SyncQueue<_MqttSendInfo>* p_MQTT_Info_queue, std::string ip_, int port_);
void start_work();
void sendData(_MqttSendInfo* TCPSendInfo, int Num);
public:
SyncQueue<_MqttSendInfo>* Local_MQTT_Info_queue;
std::atomic_bool isLoop = { 0 };
QMqttClient* m_client = NULL;
};

@ -0,0 +1,60 @@
#include "threadSendTCP.h"
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <stdio.h>
#include <qtcpsocket.h>
#pragma comment(lib, "ws2_32.lib")
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;
}
void threadSendTCP::start_work()
{
//start(HighestPriority);
start();
}
void threadSendTCP::stop()
{
isLoop = false;
// wait();
delete mySocket;
}
bool threadSendTCP::connectTCP() {
mySocket = new QTcpSocket();
// 取消已有的连接
mySocket->abort();
// 连接服务器
mySocket->connectToHost(ip, port);
if (!mySocket->waitForConnected(30000)) {
qDebug() << "connect failed!";
return false;
}
qDebug() << "connect successfully!";
return true;
}
void threadSendTCP::run()
{
if (!connectTCP())
qDebug() << "TCP connect error!";
while (isLoop) {
_TCPSendInfo TCPSendInfo;
Local_TCP_Info_queue->take(TCPSendInfo);
num++;
sendData(&TCPSendInfo, num);
//mySocket->write("Hello! here is tcp client!\n");
//mySocket->flush();
}
}
void threadSendTCP::sendData(_TCPSendInfo* TCPSendInfo, int Num) {
std::string fileName = TCPSendInfo->pics_name + ", " + QString::number(Num).toStdString();
mySocket->write(fileName.c_str());
mySocket->write("\n");
mySocket->flush();
}

@ -1,5 +1,4 @@
#pragma once
#include <QWidget>
#include <QDebug>
#include <QDateTime>
#include <iostream>
@ -7,21 +6,15 @@
#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 = "";
}
};
@ -45,9 +38,8 @@ public:
wait();
}
void stop();
#ifdef __TCPClient
bool connectTCP();
#endif
protected:
void run();
@ -55,21 +47,9 @@ 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 };
#if defined(__TCPServer) || defined(__TCPClient)
QTcpSocket* mySocket = NULL;
#endif
#ifdef __TCPServer
QTcpServer *tcpServer = NULL;
QAbstractSocket::SocketState ClientStatus;
#endif
QTcpSocket* mySocket;
};

@ -161,10 +161,10 @@ void WorkThread::run()
bool IsNG = false;
int ngReason = 0;
QMap<int, QString> ng_reason_maps;
ng_reason_maps[0] = "1";
ng_reason_maps[1] = "0";
ng_reason_maps[2] = "0";
ng_reason_maps[3] = "0";
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";
for (int index = 0; index < unit_count; index++)
{
if (vec_results[index].size() < local_SysConf.no[local_camera_number][index])
@ -256,36 +256,32 @@ void WorkThread::run()
{
for (int index = 0; index < unit_count; index++)
{
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));
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));
}
}
}
@ -321,13 +317,9 @@ void WorkThread::run()
#endif
}
}
catch (const std::exception& e) {
// 注意std::exception通常不捕获由运行时错误引发的异常
// 但这里是为了演示catch块的结构
std::cerr << __FUNCTION__<<"捕获到异常: " << e.what() << std::endl;
}
catch (...) {
// 使用省略号(...)可以捕获所有类型的异常,这是一种通用的捕获方式
std::cerr << "捕获到未知类型的异常" << std::endl;
catch (cv::Exception& e)
{
const char* err_msg = e.what();
std::cout << "exception caught: " << err_msg << std::endl;
}
}

@ -62,7 +62,7 @@ DialogSetup::DialogSetup(QWidget* parent) : QDialog(parent) {
if (!dirinfo->exists()) {
// 如果文件夹信息不存在
delete dirinfo, dirinfo = nullptr;
g_conf_path.config_path = DEFAULT_CONFPATH_PATH;
g_conf_path.config_path = "D:/conf";
}
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 = DEFAULT_CONFPATH_PATH;
g_conf_path.config_path = "D:/conf";
}
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 = DEFAULT_PIC_SAVE_PATH;
QString dirPath = "D:/image";
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 = DEFAULT_CONFPATH_PATH;
dirName = "D:/conf";
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 = DEFAULT_CONFPATH_PATH;
dirName = "D:/conf";
}
//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 = DEFAULT_MODEL_PATH;
dirName = "D:/model";
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 = DEFAULT_MODEL_PATH;
g_sys_conf.model_path = "D:/model";
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 = DEFAULT_PIC_SAVE_PATH;
dirName = "D:/image";
else
dirName = g_conf_path.save_pics_path;
//ui.comboBox_save_pics_path->addItem(dirName);
@ -756,29 +756,18 @@ 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));
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());
sprintf(buf, "TcpPort=%d\n", g_sys_conf.TcpPort);
cfg_file.write(buf, strlen(buf));
}
cfg_file.close();

@ -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.jpg";
image_path = model_path + "/" + "alg_jd.bmp";
}
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.jpg";
image_path = "D:/model/alg_jd.bmp";
}
std::ifstream classNamesFile(classesFile.c_str());
@ -53,6 +53,12 @@ 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; //判断测试图片是否正常读取
@ -111,10 +117,9 @@ 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,9 +2,8 @@
#include <opencv2/opencv.hpp>
#define NumberOfSupportedCameras 3
//双软件
#define NumberOfIdentityCameras 8
#define NumberOfSupportedCameras 4
#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,*m_PLCTCPDevice;
PLCDevice* m_PLCDevice;
bool g_plc_dialog_open; //是否打开plc配置对话框
QDateTime g_ts_start;
@ -67,7 +67,9 @@ SyncQueue<_UDPSendInfo>* UDP_Info_queue;
#endif
#ifdef __TCPSend
SyncQueue<_TCPSendInfo>* TCP_Info_queue;
#endif
#ifdef __MQTTSend
SyncQueue<_MqttSendInfo>* MQTT_Info_queue;
#endif
bool flag = false;
SyncQueue<_XMLExportDataInfo>* export_XMLData_Info_queue;
@ -114,53 +116,47 @@ Cigarette::Cigarette(QWidget* parent)
InitPtrMat();
read_conf(g_conf_path);
if (!g_conf_path.config_path.isEmpty()) {//判断conf路径是否存在 空 isEmpty=1不空 isEmpty=0
if (!g_conf_path.config_path.isEmpty()) {
// 如果非空
QDir* dirinfo = new QDir(g_conf_path.config_path);
if (!dirinfo->exists()) {
// 如果文件夹信息不存在
delete dirinfo, dirinfo = nullptr;
g_conf_path.config_path = DEFAULT_CONFPATH_PATH;
g_conf_path.config_path = "D:/conf";
}
delete dirinfo, dirinfo = nullptr;
}
else
{
#ifdef __DEBUGPATH
g_conf_path.config_path = "../conf/conf.txt";
#else
g_conf_path.config_path = DEFAULT_CONFPATH_PATH;
#endif
}
g_conf_path.config_path = "D:/conf";
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);//Cigarette退出系统了或这个类崩溃了清除Qt所有线程
connect(hThread, &QThread::finished, clogWorkThread, &CLog::deleteLater);//Qt类结束清除日志类
connect(this, &Cigarette::sengMsgToClog, clogWorkThread, &CLog::recMegFromCigarette);// sengMsgToClog 写日志的信号recMegFromCigarette 写日志操作
#ifdef LOG_RECORD
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);
hThread->start();
emit sengMsgToClog("Application Start.");
//初始化队列
//保存队列
#endif
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 __MQTTSend
MQTT_Info_queue = new SyncQueue<_MqttSendInfo>(Queue_Size);
MQTT_Info_queue->name = "MQTT Info queue";
#endif
#ifdef __ExportData
export_XMLData_Info_queue = new SyncQueue<_XMLExportDataInfo>(Queue_Size);
export_XMLData_Info_queue->name = "Export Data Info queue";
@ -168,7 +164,6 @@ 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");
@ -176,26 +171,20 @@ 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;
}
@ -213,7 +202,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
@ -236,14 +225,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]);//display 显示到界面
OpenWithUserID[i] = 0xff;
production_number[i] = 0;
lcdNumber_total_mat[i]->display(production_number[i]);
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);
@ -273,51 +262,45 @@ 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();//初始化
#ifdef __TCPSend
saveThread.init();
#ifdef __ExportData
connect(&sync_work_thread, &SyncWorkThread::sendDataToCompress, &exportDataThread, &ExportDataThread::GetDataFromSaveThread);
#endif
connect(&saveThread, &SaveThread::sendDataToExport, &exportDataThread, &ExportDataThread::GetDataFromSaveThread);
#endif
saveThread.start_work();
#ifdef __UDPSend
sThread.init(UDP_Info_queue, g_sys_conf.MonitorIP, g_sys_conf.MonitorPort);
sThread.start_work();
rThread = new threadReceive();
rThread->init(g_sys_conf.MonitorIP, g_sys_conf.MonitorPort);
connect(rThread, &threadReceive::sendMsgToCigratte, this, &Cigarette::recMsgFromUdp);
rThread->start_work();
rThread.init(g_sys_conf.MonitorIP, g_sys_conf.MonitorPort);
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();
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 __MQTTSend
std::string MqttServerIp = g_sys_conf.TcpIP;
int MqttServerPort = g_sys_conf.TcpPort;
MqttSendThread.init(MQTT_Info_queue, MqttServerIp, MqttServerPort);
MqttSendThread.start_work();
#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);
#ifdef __ExportData
exportDataThread.init();
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");
@ -344,27 +327,26 @@ 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 = DEFAULT_MODEL_PATH;
g_sys_conf.model_path = DEFAULT_MODEL_PATH;
model_path = "D:/model";
g_sys_conf.model_path = "D:/model";
}
else
model_path = g_sys_conf.model_path;
@ -382,15 +364,14 @@ 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);
@ -459,40 +440,35 @@ 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()));//SIGNAL(timeout())周期性触发SLOT(handleTimeout())周期为start(1000);
connect(m_pTimer, SIGNAL(timeout()), this, SLOT(handleTimeout()));
m_pTimer->start(1000);
m_delay = new QTimer(this);//换班防连击
connect(m_delay, SIGNAL(timeout()), this, SLOT(enable_shift()));
#ifdef __UDPSend
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()));
//定时自动清理照片
#ifdef CLEAR_THREAD
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()));//
clean_pTimer->start(5000);
#endif
#ifdef __MQTTSend
mqtt_pTimer = new QTimer(this);
connect(mqtt_pTimer, SIGNAL(timeout()), this, SLOT(MqttMsgSend()));
mqtt_pTimer->start(3600000);
#endif
//心跳检测
heartbeat_pTimer = new QTimer(this);
connect(heartbeat_pTimer, SIGNAL(timeout()), this, SLOT(heartbeat()));
heartbeat_pTimer->start(5000);
connect(ui.label_alarm, SIGNAL(QlabelDoubleClick()), this, SLOT(OnCancelAlarm()));//报警标签双击消警
//无参对有参需要利用信号转发器QSignalMapper(this)
//信号转发器
image_lable_DBsignalMapper0 = new QSignalMapper(this);
image_lable_DBsignalMapper1 = new QSignalMapper(this);
image_lable_TPsignalMapper0 = new QSignalMapper(this);
@ -501,14 +477,11 @@ 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);//此句执行后map()=>mapped(int);相当于无参变有参
pTimer_Cam_signalMapper->setMapping(m_pTimer_Cam_mat[i], i);
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);
@ -532,8 +505,6 @@ 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)));
@ -576,11 +547,9 @@ 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,7 +570,7 @@ Cigarette::~Cigarette()
{
emit sengMsgToClog("Application exited.");
Exit();
exit(-1);
//exit(-1);
}
void Cigarette::start_work()
@ -648,8 +617,6 @@ 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
@ -666,8 +633,6 @@ 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)
{
@ -702,8 +667,6 @@ 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
@ -756,12 +719,15 @@ void Cigarette::Exit()
delete g_save_queue;
#ifdef __UDPSend
sThread.stop();
rThread->stop();
delete rThread;
rThread.stop();
#endif
#ifdef __TCPSend
tcpSendThread.stop();
TcpSendThread.stop();
#endif
#ifdef __MQTTSend
MqttSendThread.stop();
#endif
#ifdef __ExportData
@ -774,10 +740,6 @@ void Cigarette::Exit()
m_PLCDevice->disconnect_plc();
delete m_PLCDevice;
}
if (m_PLCTCPDevice) {
m_PLCTCPDevice->disconnect_plc();
delete m_PLCTCPDevice;
}
qApp->quit();
this->close();
@ -1051,7 +1013,7 @@ void Cigarette::OnToolButtonCamReleasedHub(int Num)
QMessageBox::information(NULL, QStringLiteral("权限检查"), QStringLiteral("请先点击解锁按钮,进入管理员模式"), QMessageBox::Ok);
}
}
//重连相机
void Cigarette::ReconnectCamHub(int Num)
{
//close
@ -1064,6 +1026,7 @@ void Cigarette::ReconnectCamHub(int Num)
}
}
}
void Cigarette::OpenCamTimeoutHub(int Num) //重新打开相机
{
//open
@ -1080,14 +1043,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)//画框Esc清除参数
if (event->key() == Qt::Key_Escape && event->isAutoRepeat() == false)
{
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];
@ -1593,13 +1556,7 @@ void Cigarette::admin_timeout()
}
}
//心跳检测
void Cigarette::heartbeat()
{
int ret = m_PLCDevice->write_bit_2_plc(g_modbus_conf.heart, 1);
}
void Cigarette::handleTimeout()//获取时间读取PLC产量、剔除数检测相机状态读取PLC报警信息
void Cigarette::handleTimeout()
{
QDateTime ts_start = QDateTime::currentDateTime();
QTime time = QTime::currentTime();
@ -1920,7 +1877,6 @@ void Cigarette::handleTimeout()//获取时间读取PLC产量、剔除数
ui.label_alarm->setStyleSheet(tr("background-color: rgb(0, 170, 0);"));
ui.label_alarm->setText(QStringLiteral("无报警"));
}
#ifdef __UDPSend
QString str;
str = QString("alarm") + '_' + QString::number(alarm_info.alarm_code);
@ -2106,8 +2062,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);//5秒
m_delay->setSingleShot(true);
m_delay->start(5000);
Sleep(500);
for (int i = 0; i < NumberOfSupportedCameras; i++)
{
@ -2149,11 +2105,7 @@ 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;
@ -2185,11 +2137,7 @@ 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;
@ -2220,15 +2168,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()) {//从头读到尾完成后conf_file.eof()==TRUE
while (!conf_file.eof()) {
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") {
@ -2636,22 +2584,6 @@ 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);
}
}
}
@ -2713,10 +2645,6 @@ 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();
@ -2911,7 +2839,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)));
@ -3217,11 +3145,11 @@ bool Cigarette::ControlCamOpenOrClose(int Num, bool OpenOrClose)
else if (SingleCamInfo[Num].CamClass == HIKClassID)
{
qDebug() << "open for hik";
int nRet = MV_OK;//海康内部定义MV_OK = 0x0000000;
int nRet = MV_OK;
void* camhandle;
nRet = MV_CC_CreateHandle(&camhandle, HIKCamera::stDeviceList.pDeviceInfo[SingleCamInfo[Num].unfiltered_num]);
HIKCamHandle[Num] = camhandle;
nRet = MV_CC_OpenDevice(camhandle);//打开相机成功返回MV_OK
nRet = MV_CC_OpenDevice(camhandle);
if (nRet)
{
MV_CC_CloseDevice(camhandle);
@ -3233,7 +3161,6 @@ 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)
{
@ -3327,7 +3254,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;
@ -3341,7 +3268,6 @@ 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()));
@ -3439,7 +3365,7 @@ void Cigarette::EnumerateCameras(SingleCamInfoStruct* TempSingleCamInfoStruct, b
Pylon::CInstantCameraArray cameras(filtered);
Pylon::CTlFactory& tlFactory = Pylon::CTlFactory::GetInstance();
for (int i = 0; i < min(filtered, NumberOfIdentityCameras); i++)
for (int i = 0; i < min(filtered, NumberOfSupportedCameras); i++)
{
SingleCamInfoStruct CamInfo;
//cameras[i].Attach(tlFactory.CreateDevice(BaslerCamera::devices[i]));
@ -3470,7 +3396,7 @@ void Cigarette::EnumerateCameras(SingleCamInfoStruct* TempSingleCamInfoStruct, b
int hik_cnt = 0;
int unfiltered = 0;
unfiltered = HIKCamera::Enumerate();
for (int i = 0; i < min(unfiltered, NumberOfIdentityCameras); i++)
for (int i = 0; i < min(unfiltered, NumberOfSupportedCameras); i++)
{
MV_CC_DEVICE_INFO* pDeviceInfo = HIKCamera::stDeviceList.pDeviceInfo[i];
std::string manufacture;
@ -3533,7 +3459,7 @@ void Cigarette::EnumerateCameras(SingleCamInfoStruct* TempSingleCamInfoStruct, b
int balluff_cnt = 0;
unfiltered = BalluffCamera::Enumerate();
for (int i = 0; i < min(unfiltered, NumberOfIdentityCameras); i++)
for (int i = 0; i < min(unfiltered, NumberOfSupportedCameras); i++)
{
Device* pDev = BalluffCamera::devMgr[i];
if (!pDev->isInUse()) {
@ -3634,7 +3560,7 @@ void Cigarette::EnableDebugMode()
}
g_debug_mode = true;
}
//非调试模式
void Cigarette::DisableDebugMode()
{
for (int i = 0; i < NumberOfSupportedCameras; i++)
@ -3687,12 +3613,13 @@ void Cigarette::DisableDebugMode()
g_debug_mode = false;
}
#ifdef CLEAR_THREAD
void Cigarette::CleanThreadStart()
{
QThread* handleThread = new QThread();
CleanWorkThread* cleanWorkThread = new CleanWorkThread();
cleanWorkThread->moveToThread(handleThread);//依附到handleThread线程
cleanWorkThread->moveToThread(handleThread);
connect(handleThread, &QThread::started, cleanWorkThread, &CleanWorkThread::startWork);
connect(cleanWorkThread, &CleanWorkThread::workStart, cleanWorkThread, &CleanWorkThread::setSel);
@ -3715,81 +3642,57 @@ void Cigarette::CleanThreadStartAuto()
connect(handleThread, &QThread::finished, handleThread, &QThread::deleteLater);
handleThread->start();
}
#endif
void Cigarette::record_output_statistic(qint64 quantity, int Kick[NumberOfSupportedCameras], int shift)
{
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];
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);
}
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();
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;
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();
}
}
last_shift = shift;
}
void Cigarette::MqttMsgSend()
{
_MqttSendInfo MqttSendInfo;
MQTT_Info_queue->put(MqttSendInfo);
}
#ifdef __UDPSend
void Cigarette::recMsgFromUdp(QString data)
{
@ -3891,7 +3794,9 @@ void Cigarette::recMsgFromUdp(QString data)
else if (data == "CLEARNIMAGE")
{
emit sengMsgToClog("Clean images.");
#ifdef CLEAR_THREAD
CleanThreadStart();
#endif
}
else if (data == "DEBUGEN")
{

@ -35,6 +35,7 @@
#include "threadReceive.h"
#include "threadSendTCP.h"
#include "Cleanthread.h"
#include "threadSendMqtt.h"
#include <QtWidgets/QMainWindow>
#include <QTimer>
@ -117,20 +118,18 @@ private slots:
void OnMouse(QMouseEvent* event);
void OnKey(QKeyEvent* event);
void handleTimeout(); //定时任务,每秒运行一次
void op_timeout(); //操作员剩余时间
void admin_timeout(); //管理员权限剩余时间
void op_timeout(); //操作员剩余时间
void admin_timeout(); //管理员权限剩余时间
void EnableDebugMode();
void DisableDebugMode();
void OnCancelAlarm(); //双击消警
void OnCancelAlarm(); //双击消警
void on_pushButton_reset_released();//复位
void OnOp();
void OnExit();
void OnRestart();
void OnAdmin();
void heartbeat();//心跳检测
#ifdef __DEBUG
void TestImg();
void TestImgs();
@ -143,7 +142,7 @@ private:
PlcSetup* dialog_plc_setup;
std::vector<PlcItem> m_plc_items;
public:
QTimer* m_pTimer_Cam_mat[NumberOfSupportedCameras]; //相机重启定时器
QTimer* m_pTimer_Cam_mat[NumberOfSupportedCameras]; //相机重启定时器
QLabel* label_cap_speed_mat[NumberOfSupportedCameras];
QLabel* cam_status_mat[NumberOfSupportedCameras];
QLabel* cam_work_mat[NumberOfSupportedCameras];
@ -168,14 +167,6 @@ public:
};
widget_info display_lable_info[NumberOfSupportedCameras][2];
widget_info rotate_info[NumberOfSupportedCameras];
#ifdef SYNC_CAMERA
SyncWorkThread sync_work_thread;
#else
WorkThread work_thread[NumberOfSupportedCameras];
#endif
DebugThread debug_thread[NumberOfSupportedCameras];
struct export_info {
int cameraId = -1;
int totalCheckNum = 0;
@ -190,17 +181,19 @@ public:
};
export_info exportData[NumberOfSupportedCameras];
SaveThread saveThread;
void record_output_statistic(qint64 cur_quantity, int Kick[NumberOfSupportedCameras], int shift);
QTimer* m_pTimer;
QTimer* m_delay; //换班防止连击
QTimer* m_sendMsg_delay; // 停止工作后发送最新数据给远程端
QTimer* m_op_delay; //操作员权限剩余时间
QTimer* m_admin_delay; //操作员权限剩余时间
QTimer* clean_pTimer; //定时清理任务
QTimer* heartbeat_pTimer; //心跳检测
QTimer* m_delay; //换班防止连击
QTimer* m_sendMsg_delay; //停止工作后发送最新数据给远程端
QTimer* m_op_delay; //操作员权限剩余时间
QTimer* m_admin_delay; //管理员权限剩余时间
#ifdef CLEAR_THREAD
QTimer* clean_pTimer; //定时清理任务
#endif
#ifdef __MQTTSend
QTimer* mqtt_pTimer; //定时MQTT发送
#endif
QSignalMapper* image_lable_DBsignalMapper0;
QSignalMapper* image_lable_DBsignalMapper1;
QSignalMapper* image_lable_TPsignalMapper0;
@ -213,26 +206,38 @@ public:
int production_number[NumberOfSupportedCameras];
int OpenWithUserID[NumberOfSupportedCameras];
int ok[NumberOfSupportedCameras], ng[NumberOfSupportedCameras];
#ifdef __UDPSend
private:
#ifdef SYNC_CAMERA
SyncWorkThread sync_work_thread;
#else
WorkThread work_thread[NumberOfSupportedCameras];
#endif
DebugThread debug_thread[NumberOfSupportedCameras];
SaveThread saveThread;
#ifdef __UDPSend
threadSend sThread;
threadReceive* rThread;
threadReceive rThread;
#endif
//TCP数据传输
#ifdef __TCPSend
private:
threadSendTCP tcpSendThread;
threadSendTCP TcpSendThread;
#endif
public slots://槽函数:接收信号
#ifdef __MQTTSend
threadSendMqtt MqttSendThread;
#endif
public slots:
void CleanThreadStartAuto();
#ifdef __UDPSend
void recMsgFromUdp(QString data);
#endif
//void ClogThreadStart();
signals://信号函数:发信号
#ifdef __MQTTSend
void MqttMsgSend();
#endif
signals:
#ifdef LOG_RECORD
void sengMsgToClog(QString);
#endif
void sendMsgToExportData();
};

@ -6,8 +6,7 @@
#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;
@ -32,19 +31,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_list数据
va_end(args);
return str;
}
//画框:胶点范围检测
void DrawSelectRects(cv::Mat input, DisplayLabelConf& t_DisplayLabelConf, int Cnt)
{
if (t_DisplayLabelConf.Flag[Cnt] & DisplayLabel_Type_Bit) {
@ -76,11 +75,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;
@ -121,7 +120,7 @@ bool CheckSelectRects(
}
return false;
}
//获取路径下的所有文件放到files里。例子void Cigarette::TestImgs()
void getFiles(std::string path, std::vector<std::string>& files)
{
//文件句柄
@ -141,7 +140,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());
@ -169,7 +168,7 @@ char* LPWSTR2LPSTR(LPWSTR lpwszStrIn)
return pszOut;
}
//从string s的位置start开始向后找找到第一个等于x的位置返回其位置
//从string s的位置pos开始向后找找到第一个等于x的位置返回其位置
//找到,返回找到的位置,找不到返回-1
int __find(const std::string s, const int start, const char x) {
if (start >= s.length())return -1;

@ -5,56 +5,41 @@
#include "basecamera.h"
#include "QtCore\qdatetime.h"
//#define __DEBUGPATH //修改debug时候的路径
//#define __DEBUG //debug信息输出功能
#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 __DEBUG //debug信息输出功能
#define LOG_RECORD //log日志功能
#define CLEAR_THREAD //定时清理线程
//#define __UDPSend //网络发送功能
//#define __TCPSend // TCP发送
#define __MQTTSend // MQTT发送
#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文件校验
//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 DRAW_RECT // 鼠标画框功能
//#define __ExportData // 输出检测数据到XML文档
#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:/Release/conf_path2.txt"//小盒
//#define CONFPATH "D:/Release/conf_path3.txt"//条盒
#define CONFPATH "D:/conf/conf_path.txt"
//#define CONFIGURE_FILE "D:/conf/conf.txt"
// 相机旋转角度配置文件
#define ROTATE_FILE "rotate.txt"
#define MODBUS_CONFIGURE_FILE "modbus.txt"
@ -128,12 +113,8 @@ public:
//MonitorPort+NumberOfSupportedCameras为图像端口
//MonitorPort+NumberOfSupportedCameras*2为发送命令端口,也就是FeedbackPort
//MonitorPort+NumberOfSupportedCameras*2+1为接受命令端口
std::string TcpIP; // TCP服务器端ip地址
int TcpPort; // TCP服务器端端口号
std::string FtpIP; // FTP服务器端ip地址
int FtpPort; // FTP服务器端端口号
std::string FtpUserName; // FTP服务器登录账号
std::string FtpUserPwd; // FTP服务器登录密码
std::string TcpIP; // TCP服务器端ip地址
int TcpPort; // TCP服务器端端口号
SysConf()
{
@ -170,11 +151,6 @@ public:
FeedbackPort = MonitorPort + NumberOfSupportedCameras * 2;
TcpIP = "192.168.1.126";
TcpPort = 8888;
FtpIP = "192.168.1.126";
FtpPort = 111;
FtpUserName = "111";
FtpUserPwd = "111";
}
};
@ -204,7 +180,7 @@ public:
int debug; //调试模式PLC产生模拟的line4信号
int reset; //复位
int alarm; //报警
int heart; //心跳
ModbusConf()
{
for (int i = 0; i < NumberOfSupportedCameras; i++) {
@ -219,7 +195,6 @@ public:
debug = 0; //调试模式PLC产生模拟的line4信号
reset = 0; //复位
alarm = 0; //报警
heart = 0; //心跳
}
};

@ -1,13 +1,6 @@
#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>
@ -20,12 +13,9 @@ 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++)
{
@ -40,65 +30,19 @@ 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(&ip, &port, &username, &userpwd))
if (!ConnectFtp())
qDebug() << "First connect FTP failed because " << GetLastError();
*/
readyToSendZip = false;
listToZip.clear();
tmpListToZip.clear();
lastTimeStamp.clear();
zipTimeStamp.clear();
hftp = NULL;
hint = NULL;
}
void ExportDataThread::init(string ip_, int port_, string username_, string userpwd_)
void ExportDataThread::init()
{
//初始化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()
@ -111,105 +55,83 @@ void ExportDataThread::stop()
b_quit = true;
_XMLExportDataInfo data;
export_XMLData_Info_queue->put(data);
//InternetCloseHandle(hftp);
//InternetCloseHandle(hint);
InternetCloseHandle(hftp);
InternetCloseHandle(hint);
}
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";
bool ExportDataThread::ConnectFtp() {
// FTP地址
string ftpServer = "192.168.1.170";
/* 端口号一般为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, ip_->c_str(), *port_, username_->c_str(), userpwd_->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);
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();
@ -310,138 +232,25 @@ int ExportDataThread::insertXMLNode(const char* xmlPath, _XMLExportDataInfo& dat
void ExportDataThread::run()
{
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;
for (int index = 0; index < NumberOfSupportedCameras; index++) {
pDocument[index]->~XMLDocument();
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);
}
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;
flag = false;
for (int index = 0; index < NumberOfSupportedCameras; index++) {
pDocument[index]->~XMLDocument();
}
}
@ -469,7 +278,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();
@ -486,25 +295,20 @@ 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(&ip, &port, &username, &userpwd))
if (!ConnectFtp())
qDebug() << "connect FTP failed because " << GetLastError();
}
}
@ -517,47 +321,16 @@ 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, bool Ng) {
void ExportDataThread::GetDataFromSaveThread(QString filePath) {
QString 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);
}
remotePath = filePath.mid(filePath.indexOf("image") - 1);
ConnectServer(filePath, remotePath);
}
//*****************************************已经调试好,没有理清逻辑前不要动**********************

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

@ -8,49 +8,29 @@
#pragma comment(lib,"CryptoToolLib.lib")
#include "CryptoToolLib.h"
#endif
//隐藏控制窗口
//#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
HANDLE hMutex = NULL;
hMutex = CreateMutex(nullptr, TRUE, L"CigratteShanghai");
if ((GetLastError() == ERROR_ALREADY_EXISTS) || (hMutex == NULL)) {
QMessageBox::warning(nullptr, "Error", "An instance of the application is already running.");
CloseHandle(hMutex);
hMutex = NULL;
a.closeAllWindows();
return 0;
}
#if defined LICENSE_VERIFY
if (!VerifyLicense())
{
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();
@ -58,5 +38,12 @@ int main(int argc, char* argv[])
w.show();
//w.showFullScreen();
splash.finish(&w);
return a.exec();
a.exec();
if (hMutex != NULL) {
CloseHandle(hMutex);
hMutex = NULL;
}
return 0;
}

@ -1,205 +0,0 @@
#include "threadSendTCP.h"
#include <WinSock2.h>
#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()
{
//start(HighestPriority);
start();
}
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();
}
#ifdef __TCPClient
bool threadSendTCP::connectTCP() {
mySocket = new QTcpSocket();
// 取消已有的连接
mySocket->abort();
// 连接服务器
mySocket->connectToHost(ip, port);
if (!mySocket->waitForConnected(100)) {
qDebug() << "connect failed!";
return false;
}
qDebug() << "connect successfully!";
return true;
}
#endif
void threadSendTCP::run()
{
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;
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

@ -36,7 +36,7 @@
<QtBuildConfig>debug</QtBuildConfig>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'" Label="QtSettings">
<QtInstall>5.15.2_msvc2019_64</QtInstall>
<QtInstall>5.15.0</QtInstall>
<QtModules>core;gui;widgets</QtModules>
<QtBuildConfig>release</QtBuildConfig>
</PropertyGroup>

@ -2,7 +2,7 @@
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup />
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<QtLastBackgroundBuild>2023-05-12T00:20:05.9334497Z</QtLastBackgroundBuild>
<QtLastBackgroundBuild>2024-04-07T16:40:53.3929255Z</QtLastBackgroundBuild>
</PropertyGroup>
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<QtLastBackgroundBuild>2023-05-12T00:20:07.0175398Z</QtLastBackgroundBuild>

Loading…
Cancel
Save