2024-03-26 10:33:00 +08:00
|
|
|
|
#include "ScannerCtrl.h"
|
|
|
|
|
#include "../config/ConfigManager.h"
|
|
|
|
|
#include "../Toast.h"
|
|
|
|
|
#include "../LanguageManager.h"
|
|
|
|
|
#include "../SystemInfo.h"
|
|
|
|
|
#include "RTC5Scanner.h"
|
|
|
|
|
#include "../Logger.h"
|
|
|
|
|
#include "../global.h"
|
|
|
|
|
#include "../PLC/SignalService.h"
|
|
|
|
|
#include "ScannerPair.h"
|
|
|
|
|
#include "../utils/StringHelper.h"
|
|
|
|
|
#include "../Remote/RemoteClient.h"
|
|
|
|
|
#include "../utils/TimeHelper.h"
|
2024-05-15 13:38:34 +08:00
|
|
|
|
#include "../DataManage/ClientInfo.h"
|
|
|
|
|
|
2024-03-26 10:33:00 +08:00
|
|
|
|
|
|
|
|
|
ScannerCtrl::ScannerCtrl()
|
|
|
|
|
:m_print_thread(INVALID_HANDLE_VALUE)
|
|
|
|
|
, m_RedPrintTestThread(INVALID_HANDLE_VALUE)
|
|
|
|
|
, m_PressureCtrlFlag(false)
|
|
|
|
|
, m_PressureThread(INVALID_HANDLE_VALUE)
|
|
|
|
|
, m_HeatingMotionThread(INVALID_HANDLE_VALUE)
|
|
|
|
|
, m_HeatingMotionFlag(false)
|
2024-05-22 15:58:54 +08:00
|
|
|
|
, m_ShowFinishReport(false)
|
|
|
|
|
, m_StopThread(INVALID_HANDLE_VALUE)
|
|
|
|
|
, m_StopFlag(false)
|
2024-03-26 10:33:00 +08:00
|
|
|
|
{
|
|
|
|
|
InitializeCriticalSection(&m_LayerTestCs);
|
|
|
|
|
//m_PowderEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
|
|
|
|
|
m_DownSkinStopFlag = 1;
|
|
|
|
|
m_IsDownSkinContinue = false;
|
|
|
|
|
time(&m_LastSendFinishReportTime);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ScannerCtrl::~ScannerCtrl()
|
|
|
|
|
{
|
|
|
|
|
m_PressureCtrlFlag = false;
|
|
|
|
|
if (m_print_thread!= INVALID_HANDLE_VALUE) {
|
|
|
|
|
BaseCtrl::SetState(BaseCtrl::STOP);
|
|
|
|
|
if (WaitForSingleObject(m_print_thread, 5000)==WAIT_TIMEOUT) {
|
|
|
|
|
TerminateThread(m_print_thread, 1);
|
|
|
|
|
}
|
|
|
|
|
CloseHandle(m_print_thread);
|
|
|
|
|
m_print_thread = INVALID_HANDLE_VALUE;
|
|
|
|
|
}
|
|
|
|
|
WaitForSingleObject(m_PressureThread, 1000);
|
|
|
|
|
//if (m_UpScannerPair)delete m_UpScannerPair;
|
|
|
|
|
//if (m_DownScannerPair)delete m_DownScannerPair;
|
|
|
|
|
|
|
|
|
|
DeleteCriticalSection(&m_LayerTestCs);
|
|
|
|
|
|
|
|
|
|
for (unsigned int i = 0; i < m_scan.size(); i++)
|
|
|
|
|
{
|
|
|
|
|
delete m_scan[i];
|
|
|
|
|
}
|
|
|
|
|
m_scan.clear();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//CloseHandle(m_PowderEvent);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool ScannerCtrl::Init() {
|
2024-05-22 15:58:54 +08:00
|
|
|
|
// m_UpScannerPair = new ScannerPair();
|
|
|
|
|
//m_DownScannerPair = new ScannerPair();
|
2024-03-26 10:33:00 +08:00
|
|
|
|
m_RunCfg = ConfigManager::GetInstance()->GetRunCfg();
|
|
|
|
|
m_MachineCfg = ConfigManager::GetInstance()->GetMachineCfg();
|
|
|
|
|
m_Machine = ConfigManager::GetInstance()->GetMachine();
|
|
|
|
|
m_IOCfgWrapper = ConfigManager::GetInstance()->GetIoCfgWrapper();
|
|
|
|
|
m_ExtCfg = ConfigManager::GetInstance()->GetExtCfg();
|
|
|
|
|
m_CoverCfg = ConfigManager::GetInstance()->GetCoverCfg();
|
|
|
|
|
m_PowderEstimateCfg = ConfigManager::GetInstance()->GetPowderEstimateCfg();
|
|
|
|
|
m_AlarmCfgWrapper = ConfigManager::GetInstance()->GetAlarmCfg();
|
|
|
|
|
m_RecoatCheckCfg = ConfigManager::GetInstance()->GetRecoatCheckCfg();
|
2024-05-22 15:58:54 +08:00
|
|
|
|
m_InfraredTempCfg = ConfigManager::GetInstance()->GetInfraredTempCfg();
|
2024-03-26 10:33:00 +08:00
|
|
|
|
map<int, ScannerControlCfg*>* scannerControlCfgsMap = ConfigManager::GetInstance()->GetScannerControlCfg();
|
|
|
|
|
bool rel = false;
|
|
|
|
|
unsigned int card_num = 0;
|
|
|
|
|
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (!RTC5Scanner::PreInit(card_num))
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2024-03-26 10:33:00 +08:00
|
|
|
|
int difSize = Scanner::m_CurrentSerio.size() - scannerControlCfgsMap->size();
|
|
|
|
|
if (difSize > 0) {
|
|
|
|
|
int flag = 0;
|
|
|
|
|
for (map<int, unsigned int>::iterator s = Scanner::m_CurrentSerio.begin(); s != Scanner::m_CurrentSerio.end(); s++) {
|
|
|
|
|
bool find = false;
|
|
|
|
|
for (map<int, ScannerControlCfg*>::iterator scc = scannerControlCfgsMap->begin(); scc != scannerControlCfgsMap->end(); scc++)
|
|
|
|
|
{
|
|
|
|
|
ScannerControlCfg* cfg = scc->second;
|
|
|
|
|
if (cfg->m_SerialNo == s->second)
|
|
|
|
|
{
|
|
|
|
|
find = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!find && flag < difSize)
|
|
|
|
|
{
|
|
|
|
|
ScannerControlCfg* cfg = new ScannerControlCfg();
|
|
|
|
|
cfg->m_SeqNo = scannerControlCfgsMap->size() + 1;
|
|
|
|
|
cfg->m_CardName = "Laser" + to_string(cfg->m_SeqNo);
|
|
|
|
|
cfg->m_ControlNo = s->first;
|
2024-05-30 11:18:10 +08:00
|
|
|
|
cfg->m_ControlType = m_MachineCfg->m_ScanControl->GetValue();
|
2024-03-26 10:33:00 +08:00
|
|
|
|
cfg->m_SerialNo = s->second;
|
|
|
|
|
cfg->m_HadMatch = false;
|
|
|
|
|
cfg->m_IsEnable = true;
|
|
|
|
|
cfg->Init();
|
2024-05-22 15:58:54 +08:00
|
|
|
|
//m_Machine->InitScanParamBeforeFind(&cfg->m_ScanCfgWrapper);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
ConfigManager::GetInstance()->GetScannerControlCfgDao()->Add(cfg);
|
|
|
|
|
ConfigManager::GetInstance()->GetScannerControlCfgDao()->Maintain(cfg);
|
|
|
|
|
ConfigManager::GetInstance()->GetScannerControlCfgs()->push_back(cfg);
|
|
|
|
|
(*scannerControlCfgsMap)[cfg->m_SeqNo] = cfg;
|
|
|
|
|
flag++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (card_num == 0)
|
|
|
|
|
{
|
2024-05-22 15:58:54 +08:00
|
|
|
|
g_log->TraceError(g_LngManager->Log_NoScannerCtrl->ShowText());
|
|
|
|
|
m_InitErrorInfos.push_back(g_LngManager->Log_NoScannerCtrl->ShowText());
|
2024-05-30 11:18:10 +08:00
|
|
|
|
|
|
|
|
|
//for (int i = 0; i < 4; ++i) { //wxxtest
|
|
|
|
|
// Scanner* scanner = new RTC5Scanner(nullptr, i);
|
|
|
|
|
// m_scan.push_back(scanner);
|
|
|
|
|
//}
|
2024-03-26 10:33:00 +08:00
|
|
|
|
return false;
|
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
|
|
|
|
|
int index = 0;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
for (map<int, ScannerControlCfg*>::iterator sit = scannerControlCfgsMap->begin(); sit != scannerControlCfgsMap->end(); sit++) {
|
|
|
|
|
ScannerControlCfg* cfg = sit->second;
|
|
|
|
|
if (m_IOCfgWrapper->m_LaserIOMap.find(cfg->m_SeqNo) != m_IOCfgWrapper->m_LaserIOMap.end()) {
|
|
|
|
|
cfg->m_LaserRed = m_IOCfgWrapper->m_LaserIOMap[cfg->m_SeqNo]->m_LaserRed;
|
|
|
|
|
cfg->m_LaserStart = m_IOCfgWrapper->m_LaserIOMap[cfg->m_SeqNo]->m_LaserStart;
|
|
|
|
|
cfg->m_LaserEnable = m_IOCfgWrapper->m_LaserIOMap[cfg->m_SeqNo]->m_LaserEnable;
|
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
Scanner* scanner = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
scanner = new RTC5Scanner(cfg,index++);
|
|
|
|
|
|
2024-03-26 10:33:00 +08:00
|
|
|
|
|
|
|
|
|
if (scanner->Init())
|
|
|
|
|
{
|
|
|
|
|
ConfigManager::GetInstance()->GetMatchScannerControlCfg()->push_back(cfg);
|
|
|
|
|
m_scan.push_back(scanner);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
delete scanner;
|
|
|
|
|
scanner = NULL;
|
|
|
|
|
char buffer[256];
|
|
|
|
|
sprintf_s(buffer, sizeof(buffer), _(u8"振镜卡 %d 初始化失败").c_str(), cfg->m_SeqNo);
|
|
|
|
|
g_log->TraceError(buffer);
|
|
|
|
|
m_InitErrorInfos.push_back(buffer);
|
|
|
|
|
}
|
|
|
|
|
LaserParam* param = new LaserParam();
|
|
|
|
|
g_SystemInfo->m_StateBean.laserParams.push_back(param);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (m_scan.empty())
|
|
|
|
|
{
|
2024-05-22 15:58:54 +08:00
|
|
|
|
g_log->TraceError(g_LngManager->Log_NewScannerAsCfgError->ShowText());
|
|
|
|
|
m_InitErrorInfos.push_back(g_LngManager->Log_NewScannerAsCfgError->ShowText());
|
2024-03-26 10:33:00 +08:00
|
|
|
|
rel = false;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
if (m_scan.size() == 4)
|
|
|
|
|
{
|
|
|
|
|
m_scan[0]->SetPairScan(m_scan[1]);
|
|
|
|
|
m_scan[1]->SetPairScan(m_scan[0]);
|
|
|
|
|
m_scan[2]->SetPairScan(m_scan[3]);
|
|
|
|
|
m_scan[3]->SetPairScan(m_scan[2]);
|
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
else if (m_scan.size() == 8) {
|
|
|
|
|
m_scan[0]->SetPairScan(m_scan[1]);
|
|
|
|
|
m_scan[1]->SetPairScan(m_scan[0]);
|
|
|
|
|
m_scan[2]->SetPairScan(m_scan[3]);
|
|
|
|
|
m_scan[3]->SetPairScan(m_scan[2]);
|
|
|
|
|
m_scan[4]->SetPairScan(m_scan[5]);
|
|
|
|
|
m_scan[5]->SetPairScan(m_scan[4]);
|
|
|
|
|
m_scan[6]->SetPairScan(m_scan[7]);
|
|
|
|
|
m_scan[7]->SetPairScan(m_scan[6]);
|
|
|
|
|
}
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
|
2024-03-26 10:33:00 +08:00
|
|
|
|
//#endif
|
|
|
|
|
|
|
|
|
|
return rel;
|
|
|
|
|
}
|
|
|
|
|
DWORD WINAPI ScannerCtrl::PrintProc(thisClass* _this)
|
|
|
|
|
{
|
|
|
|
|
if (_this != nullptr) {
|
|
|
|
|
_this->PrintRun();
|
|
|
|
|
_this->CtrlIoWhenExit();
|
|
|
|
|
if (!BaseCtrl::IsPauseStanBy()) {
|
|
|
|
|
_this->m_IOCfgWrapper->m_PrintDoorLock->SetActive(false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScannerCtrl::PrintRun()
|
|
|
|
|
{
|
|
|
|
|
bool startAfterPause = false;
|
|
|
|
|
if (BaseCtrl::IsPauseStanBy()) {
|
|
|
|
|
startAfterPause = true;
|
|
|
|
|
}
|
|
|
|
|
if (!startAfterPause) {
|
|
|
|
|
m_job_controller->GetJob()->m_TaskId = StringHelper::GenerateUUID();
|
|
|
|
|
}
|
|
|
|
|
BaseCtrl::SetState(BaseCtrl::PREPRINT);
|
|
|
|
|
BaseCtrl::SetPauseState(BaseCtrl::NoPause);
|
|
|
|
|
BaseCtrl::SetPreState(BaseCtrl::CheckIO);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
m_IOCfgWrapper->m_PrintDoorLock->SetActive(true);
|
|
|
|
|
|
2024-05-22 15:58:54 +08:00
|
|
|
|
/*IOCfg* servoMotor = m_IOCfgWrapper->m_ServoMotor;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
if (!servoMotor->IsActive()) {
|
|
|
|
|
servoMotor->SetActive(true);
|
2024-05-22 15:58:54 +08:00
|
|
|
|
g_Toast->AddToast(new ToastBean(g_LngManager->Toast_ServoPowering->ShowText(), 3000, ImVec4(1, 0.4f, 0, 1)));
|
2024-03-26 10:33:00 +08:00
|
|
|
|
Sleep(3000);
|
2024-05-22 15:58:54 +08:00
|
|
|
|
}*/
|
2024-03-26 10:33:00 +08:00
|
|
|
|
|
|
|
|
|
SignalService& alarmService = SignalService::GetInstance();
|
|
|
|
|
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (!m_Machine->CheckPrintMoldReady() && !g_isDebug) {
|
|
|
|
|
g_Toast->AddToast(new ToastBean(u8"执行失败:缸体未在打印位装载", 3000, Toast::COLOR_RED));
|
|
|
|
|
BaseCtrl::SetState(BaseCtrl::STANDBY);
|
|
|
|
|
return;
|
|
|
|
|
}
|
2024-03-26 10:33:00 +08:00
|
|
|
|
|
|
|
|
|
//检测振镜检测红光
|
|
|
|
|
vector<ScannerControlCfg*>* laserCfgs = ConfigManager::GetInstance()->GetMatchScannerControlCfg();
|
2024-05-22 15:58:54 +08:00
|
|
|
|
for (size_t laserIndex = 0; laserIndex < laserCfgs->size(); laserIndex++) {
|
2024-03-26 10:33:00 +08:00
|
|
|
|
ScannerControlCfg* laserCfg = (*laserCfgs)[laserIndex];
|
|
|
|
|
if (laserCfg->m_LaserRed && laserCfg->m_LaserRed->IsActive()) {
|
|
|
|
|
laserCfg->m_LaserRed->SetActive(false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-28 13:28:07 +08:00
|
|
|
|
if (!m_RunCfg->m_IsDebugMode->GetValue()) {
|
2024-03-26 10:33:00 +08:00
|
|
|
|
if (!ReadyPrint(startAfterPause)) {
|
|
|
|
|
BaseCtrl::SetState(BaseCtrl::STANDBY);
|
|
|
|
|
return;
|
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (m_IOCfgWrapper->m_Heating && m_IOCfgWrapper->m_Heating->IsActive())
|
2024-03-26 10:33:00 +08:00
|
|
|
|
{
|
2024-05-22 15:58:54 +08:00
|
|
|
|
TempStat ts;
|
|
|
|
|
int count = 0;
|
|
|
|
|
float platformTemp = 0.0f;
|
|
|
|
|
float platformTempSettingValue = 0.0f;
|
|
|
|
|
while (BaseCtrl::IsPrePrint()) {
|
|
|
|
|
if (!m_IOCfgWrapper->m_Heating->IsActive()) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
EnterCriticalSection(&g_SystemInfo->m_InfoCs);
|
|
|
|
|
platformTemp = g_SystemInfo->m_PlatformTemp;
|
|
|
|
|
platformTempSettingValue = g_SystemInfo->m_PlatformTempSettingValue;
|
|
|
|
|
LeaveCriticalSection(&g_SystemInfo->m_InfoCs);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if ((platformTempSettingValue - platformTemp) < 3.0f) {
|
|
|
|
|
break;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
else {
|
|
|
|
|
if ((count % 20) == 0) {
|
|
|
|
|
g_Toast->AddToast(new ToastBean(u8"正在等待基板预热", 3000, Toast::COLOR_ORANGE));
|
|
|
|
|
}
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
count++;
|
|
|
|
|
if (count > 100000)count = 0;
|
|
|
|
|
Sleep(500);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
}
|
|
|
|
|
if (!BaseCtrl::IsPrePrint()) {
|
2024-03-26 10:33:00 +08:00
|
|
|
|
BaseCtrl::SetState(BaseCtrl::STANDBY);
|
|
|
|
|
return;
|
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (alarmService.CheckAlarmAfterDeoxygen())
|
|
|
|
|
{
|
|
|
|
|
BaseCtrl::SetState(BaseCtrl::STANDBY);
|
|
|
|
|
return;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!m_job_controller->GetJob()->m_IsAutoCtrl) {
|
|
|
|
|
BaseCtrl::SetPreState(BaseCtrl::WaitConfirm);
|
|
|
|
|
bool isconfirm = false;
|
|
|
|
|
while (BaseCtrl::IsPrePrint())
|
|
|
|
|
{
|
|
|
|
|
if (BaseCtrl::GetPreState() == CancelConfirm) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (BaseCtrl::GetPreState() == SummitConfirm) {
|
|
|
|
|
isconfirm = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
Sleep(300);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!isconfirm) {
|
|
|
|
|
BaseCtrl::SetState(BaseCtrl::STANDBY);
|
|
|
|
|
BaseCtrl::SetPreState(BaseCtrl::NonePre);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (!m_job_controller->GetJob()->m_IsAutoCtrl && m_job_controller->GetJob()->m_AutoHeatingScanner) {
|
|
|
|
|
BaseCtrl::SetPreState(BaseCtrl::AutoHeatingScanner);
|
|
|
|
|
if (m_IOCfgWrapper->m_Heating) {
|
|
|
|
|
m_IOCfgWrapper->m_Heating->SetActive(true);
|
|
|
|
|
}
|
|
|
|
|
Sleep(500);
|
|
|
|
|
m_MachineCtrl->StopLaser(true);
|
|
|
|
|
if (!m_IOCfgWrapper->m_Laser->IsActive()) {
|
|
|
|
|
m_IOCfgWrapper->m_Laser->SetActive(true);
|
|
|
|
|
Sleep(10000);
|
|
|
|
|
}
|
|
|
|
|
vector<ScannerControlCfg*>* laserCfgs = ConfigManager::GetInstance()->GetMatchScannerControlCfg();
|
|
|
|
|
for (size_t laserIndex = 0; laserIndex < laserCfgs->size(); laserIndex++) {
|
|
|
|
|
ScannerControlCfg* laserCfg = (*laserCfgs)[laserIndex];
|
|
|
|
|
if (laserCfg->m_LaserRed && !laserCfg->m_LaserRed->IsActive()) {
|
|
|
|
|
laserCfg->m_LaserRed->SetActive(true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Sleep(500);
|
|
|
|
|
for (size_t scanIndex = 0; scanIndex < m_scan.size(); ++scanIndex) {
|
|
|
|
|
Scanner* scanner = m_scan[scanIndex];
|
|
|
|
|
scanner->StartHeatingScannerTest();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (size_t scanIndex = 0; scanIndex < m_scan.size(); ++scanIndex) {
|
|
|
|
|
Scanner* scanner = m_scan[scanIndex];
|
|
|
|
|
scanner->WaitHeatingScanner();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (size_t laserIndex = 0; laserIndex < laserCfgs->size(); laserIndex++) {
|
|
|
|
|
ScannerControlCfg* laserCfg = (*laserCfgs)[laserIndex];
|
|
|
|
|
if (laserCfg->m_LaserRed && laserCfg->m_LaserRed->IsActive()) {
|
|
|
|
|
laserCfg->m_LaserRed->SetActive(false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-26 10:33:00 +08:00
|
|
|
|
BaseCtrl::SetPreState(BaseCtrl::PreFinished);
|
|
|
|
|
if (!BaseCtrl::IsPrePrint()) {
|
|
|
|
|
BaseCtrl::SetState(BaseCtrl::STANDBY);
|
|
|
|
|
BaseCtrl::SetPreState(BaseCtrl::NonePre);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
StopHeatingMotion(true);
|
|
|
|
|
|
|
|
|
|
m_MachineCtrl->StartLaser(true);
|
|
|
|
|
//m_gc->StartLaser(true);
|
|
|
|
|
if (!BaseCtrl::IsPrePrint()) {
|
|
|
|
|
BaseCtrl::SetState(BaseCtrl::STANDBY);
|
|
|
|
|
BaseCtrl::SetPreState(BaseCtrl::NonePre);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
g_SystemInfo->m_AutoPrintCtrlState = AutoPrint;
|
|
|
|
|
m_job_controller->GetJob()->m_BeginPrintTime = GetTickCount64();
|
|
|
|
|
if (m_job_controller->GetJob()->m_FirstStartTime == 0L)m_job_controller->GetJob()->m_FirstStartTime = GetTickCount64();
|
|
|
|
|
JobBean* jobBean = m_job_controller->GetJob()->GetJobbean();
|
|
|
|
|
jobBean->m_TaskID = m_job_controller->GetJob()->m_TaskId;
|
|
|
|
|
m_job_controller->GetJob()->UpdateJobBeanWhenStart();
|
|
|
|
|
|
|
|
|
|
if (!jobBean->m_IsContinue) {
|
|
|
|
|
g_SystemInfo->LockInfo();
|
|
|
|
|
jobBean->m_StartMoldPos = g_SystemInfo->m_MoldMainPos;
|
|
|
|
|
g_SystemInfo->UnlockInfo();
|
|
|
|
|
jobBean->m_FirstStartIndex = m_job_controller->GetJob()->GetStartIndex();
|
|
|
|
|
}
|
|
|
|
|
g_log->m_LogDao->LogJobStart(jobBean);
|
|
|
|
|
if (m_ScannerPowerClient)m_ScannerPowerClient->SetJobId(jobBean->m_Id);
|
|
|
|
|
|
|
|
|
|
BaseCtrl::SetState(BaseCtrl::PRINTING);
|
|
|
|
|
for (size_t i = 0; i < m_scan.size(); i++)
|
|
|
|
|
{
|
|
|
|
|
m_scan[i]->SetAutoUpdateScanInfo(false);
|
|
|
|
|
m_scan[i]->ResetDefocus();
|
|
|
|
|
m_scan[i]->m_IsOrderSeqV2 = m_job_controller->GetJob()->GetMetaData()->m_IsScanOrderSeqV2;
|
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
m_InfraredTemp->m_LogFlag = true;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
Sleep(500);
|
|
|
|
|
DispatchDataBlock();
|
|
|
|
|
|
|
|
|
|
Sleep(100);
|
2024-05-22 15:58:54 +08:00
|
|
|
|
m_InfraredTemp->m_LogFlag = false;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
for (size_t i = 0; i < m_scan.size(); i++)
|
|
|
|
|
{
|
|
|
|
|
m_scan[i]->SetAutoUpdateScanInfo(true);
|
|
|
|
|
m_scan[i]->ResetDefocus();
|
|
|
|
|
}
|
|
|
|
|
if (m_ServoManager)m_ServoManager->ResetLogServo();
|
|
|
|
|
if (BaseCtrl::IsFinish()) {
|
|
|
|
|
g_SystemInfo->m_AutoPrintCtrlState = NoAuto;
|
|
|
|
|
if (m_RemoteClient)m_RemoteClient->SetNeedSendFinish(true);
|
|
|
|
|
m_ShowFinishReport = true;
|
|
|
|
|
CtrlWhenStop();
|
|
|
|
|
m_job_controller->GetJob()->UpdateJobBeanWhenStop();
|
|
|
|
|
g_SystemInfo->m_StateBean.layerIndex = 0;
|
|
|
|
|
m_IOCfgWrapper->m_PrintDoorLock->SetActive(false);
|
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
else if (BaseCtrl::IsPause()) {
|
2024-03-26 10:33:00 +08:00
|
|
|
|
m_job_controller->GetJob()->GetJobbean()->m_IsContinue = true;
|
|
|
|
|
m_job_controller->GetJob()->GetJobbean()->m_PrintSecond = m_job_controller->GetJob()->GetJobbean()->m_PrintSecond + (int)m_job_controller->GetJob()->GetJobbean()->m_EveryPrintedTime;
|
2024-05-28 13:28:07 +08:00
|
|
|
|
if (m_RunCfg->m_PrintRestEnable->GetValue()) {
|
2024-03-26 10:33:00 +08:00
|
|
|
|
g_SystemInfo->m_AutoPrintCtrlState = AutoPause;
|
|
|
|
|
m_job_controller->GetJob()->m_AutoPauseTime = GetTickCount64();
|
|
|
|
|
}
|
|
|
|
|
BaseCtrl::SetState(BaseCtrl::STANDBY_PAUSE);
|
|
|
|
|
}
|
|
|
|
|
else if (BaseCtrl::IsStop()) {
|
|
|
|
|
m_job_controller->GetJob()->UpdateJobBeanWhenStop();
|
|
|
|
|
g_SystemInfo->m_StateBean.layerIndex = 0;
|
|
|
|
|
CtrlWhenStop();
|
|
|
|
|
m_IOCfgWrapper->m_PrintDoorLock->SetActive(false);
|
|
|
|
|
BaseCtrl::SetState(BaseCtrl::STANDBY_STOP);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
BaseCtrl::SetState(BaseCtrl::STANDBY);
|
|
|
|
|
}
|
|
|
|
|
BaseCtrl::SetPreState(BaseCtrl::NonePre);
|
|
|
|
|
CtrlIoWhenExit();
|
2024-05-22 15:58:54 +08:00
|
|
|
|
g_log->m_LogDao->DeleteImageAfterPrint();
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool ScannerCtrl::ReadyPrint(bool startAfterPause)
|
|
|
|
|
{
|
|
|
|
|
//DWORD startTick = GetTickCount64();
|
|
|
|
|
unsigned int deoxytime = 0;
|
|
|
|
|
bool rel = false;
|
|
|
|
|
rel=m_PurifierClient->HandleReadyPrint(startAfterPause, deoxytime);
|
|
|
|
|
//DWORD stoptick = GetTickCount64();
|
|
|
|
|
|
|
|
|
|
FileProcessor* job = m_job_controller->GetJob();
|
|
|
|
|
if (job) {
|
|
|
|
|
job->GetJobbean()->m_DeoxygenSecond = deoxytime;
|
|
|
|
|
}
|
|
|
|
|
return rel;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScannerCtrl::StopRedTest()
|
|
|
|
|
{
|
|
|
|
|
PrintState printStateTemp = BaseCtrl::GetState();
|
|
|
|
|
BaseCtrl::SetState(BaseCtrl::STOP);
|
|
|
|
|
EnterCriticalSection(&m_LayerTestCs);
|
|
|
|
|
if (m_RedPrintTestThread != INVALID_HANDLE_VALUE) {
|
|
|
|
|
for (size_t scanIndex = 0; scanIndex < m_scan.size(); ++scanIndex) {
|
|
|
|
|
Scanner* scanner = m_scan[scanIndex];
|
|
|
|
|
scanner->StopWork();
|
|
|
|
|
}
|
|
|
|
|
if (WaitForSingleObject(m_RedPrintTestThread, 1000) == WAIT_TIMEOUT) {
|
|
|
|
|
TerminateThread(m_RedPrintTestThread, 0);
|
|
|
|
|
}
|
|
|
|
|
CloseHandle(m_RedPrintTestThread);
|
|
|
|
|
m_RedPrintTestThread = INVALID_HANDLE_VALUE;
|
|
|
|
|
}
|
|
|
|
|
LeaveCriticalSection(&m_LayerTestCs);
|
|
|
|
|
BaseCtrl::SetState(printStateTemp);
|
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < m_scan.size();i++) {
|
|
|
|
|
m_scan[i]->Clean();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DWORD WINAPI ScannerCtrl::RedPrintTestProc(thisClass* _this)
|
|
|
|
|
{
|
|
|
|
|
if (_this)
|
|
|
|
|
{
|
|
|
|
|
_this->DispatchTestDataBlock();
|
|
|
|
|
EnterCriticalSection(&_this->m_LayerTestCs);
|
|
|
|
|
if (_this->m_RedPrintTestThread != INVALID_HANDLE_VALUE) {
|
|
|
|
|
CloseHandle(_this->m_RedPrintTestThread);
|
|
|
|
|
_this->m_RedPrintTestThread = INVALID_HANDLE_VALUE;
|
|
|
|
|
}
|
|
|
|
|
LeaveCriticalSection(&_this->m_LayerTestCs);
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool ScannerCtrl::BeginWork()
|
|
|
|
|
{
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (m_StopFlag)
|
|
|
|
|
{
|
|
|
|
|
ToastBean* bean = new ToastBean(_(u8"系统正在停止中,请稍后再开始").c_str(), 3000);
|
|
|
|
|
g_Toast->AddToast(bean);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2024-03-26 10:33:00 +08:00
|
|
|
|
StopRedTest();
|
|
|
|
|
for (size_t i = 0; i < m_scan.size(); i++) {
|
|
|
|
|
m_scan[i]->StopDebugTest();
|
|
|
|
|
}
|
|
|
|
|
if (m_scan.size() == 0)
|
|
|
|
|
{
|
2024-05-22 15:58:54 +08:00
|
|
|
|
ToastBean* bean = new ToastBean(g_LngManager->Log_NoScannerCtrl->ShowText(), 3000);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
g_Toast->AddToast(bean);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
//是否达到打印条件
|
|
|
|
|
/*if (m_AlarmCfgWrapper->m_CoverBreak)m_AlarmCfgWrapper->m_CoverBreak->m_IsAlarm = false;
|
|
|
|
|
if(m_AlarmCfgWrapper->m_MoldMotionTransferAlarm)m_AlarmCfgWrapper->m_MoldMotionTransferAlarm->m_IsAlarm = false;
|
|
|
|
|
if (m_AlarmCfgWrapper->m_PowderMotionTransferAlarm)m_AlarmCfgWrapper->m_PowderMotionTransferAlarm->m_IsAlarm = false;
|
|
|
|
|
*/
|
|
|
|
|
SignalService::GetInstance().ResetRelateCoverAlarm();
|
|
|
|
|
if (!m_job_controller || !m_job_controller->GetJob()) {
|
2024-05-22 15:58:54 +08:00
|
|
|
|
ToastBean* bean = new ToastBean(g_LngManager->Toast_NoTaskPrint->ShowText(), 3000);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
g_Toast->AddToast(bean);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!g_isDebug) {
|
|
|
|
|
vector<string> ei;
|
|
|
|
|
m_job_controller->GetJob()->GetMetaData()->GetErrorInfo(ei);
|
|
|
|
|
if (!ei.empty()) {
|
|
|
|
|
g_Toast->AddToast(new ToastBean(ei[0], 5000, Toast::COLOR_RED));
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (m_scan.size() == 1)
|
2024-03-26 10:33:00 +08:00
|
|
|
|
{
|
|
|
|
|
Scanner* sc = m_scan[0];
|
|
|
|
|
if (!sc) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
vector<MetaData::Part*>& partVec = m_job_controller->GetJob()->GetMetaData()->GetPartVec();
|
2024-03-26 10:33:00 +08:00
|
|
|
|
CorrectParamCfg* correctCfg = &sc->GetConfig()->m_ScanCfgWrapper.m_CorrectParamCfg;
|
|
|
|
|
char buffer[1024];
|
|
|
|
|
bool hasOutLimit = false;
|
|
|
|
|
for (size_t i = 0; i < partVec.size(); ++i)
|
|
|
|
|
{
|
|
|
|
|
MetaData::Part* part = partVec[i];
|
|
|
|
|
if (!part->print_enable)continue;
|
|
|
|
|
|
2024-05-22 15:58:54 +08:00
|
|
|
|
double corxmin = (part->dimensions->xmin + part->partPosBean.m_XOffset);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
double corxmax = (part->dimensions->xmax + part->partPosBean.m_XOffset);
|
2024-05-22 15:58:54 +08:00
|
|
|
|
double corymin = (part->dimensions->ymin + part->partPosBean.m_YOffset);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
double corymxn = (part->dimensions->ymax + part->partPosBean.m_YOffset);
|
|
|
|
|
if (corxmin<correctCfg->m_xmeasure_min || corxmax>correctCfg->m_xmeasure_max) {
|
2024-05-22 15:58:54 +08:00
|
|
|
|
sprintf_s(buffer, sizeof(buffer), g_LngManager->Toast_CheckDataOutRangeX->ShowText(), part->name.c_str());
|
2024-03-26 10:33:00 +08:00
|
|
|
|
hasOutLimit = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (corymin<correctCfg->m_ymeasure_min || corymxn>correctCfg->m_ymeasure_max) {
|
2024-05-22 15:58:54 +08:00
|
|
|
|
sprintf_s(buffer, sizeof(buffer), g_LngManager->Toast_CheckDataOutRangeY->ShowText(), part->name.c_str());
|
2024-03-26 10:33:00 +08:00
|
|
|
|
hasOutLimit = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (hasOutLimit) {
|
|
|
|
|
ToastBean* bean = new ToastBean(buffer, 5000, Toast::COLOR_RED);
|
|
|
|
|
g_Toast->AddToast(bean);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!SignalService::GetInstance().CheckAlarmBeforeDeoxygen())
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-28 13:28:07 +08:00
|
|
|
|
if (!m_RunCfg->m_HadSetBasePlatformPoint->GetValue() && !m_RunCfg->m_IsDebugMode->GetValue()) {
|
2024-05-22 15:58:54 +08:00
|
|
|
|
ToastBean* bean = new ToastBean(u8"请先执行基板缸平面位置确定", 5000, Toast::COLOR_RED);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
g_Toast->AddToast(bean);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-22 15:58:54 +08:00
|
|
|
|
float fh = m_job_controller->GetJob()->GetJobPrintHigh();
|
|
|
|
|
float ah = m_MachineCtrl->GetAllowPrintHigh();
|
|
|
|
|
if (!g_isDebug && (fh > ah))
|
|
|
|
|
{
|
|
|
|
|
char buffer[512];
|
|
|
|
|
sprintf_s(buffer, sizeof(buffer), u8"需要打印的高度:%.3f 超过了 允许的打印高度:%.3f", fh, ah);
|
|
|
|
|
ToastBean* bean = new ToastBean(string(buffer), 5000, Toast::COLOR_RED);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
g_Toast->AddToast(bean);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (!BaseCtrl::IsStandBy()) {
|
|
|
|
|
ToastBean* bean = new ToastBean(g_LngManager->Toast_CheckStanby->ShowText(), 3000);
|
|
|
|
|
g_Toast->AddToast(bean);
|
|
|
|
|
return false;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
|
2024-03-26 10:33:00 +08:00
|
|
|
|
m_IOCfgWrapper->SetAutoCtrlHeating(false);
|
|
|
|
|
|
|
|
|
|
m_print_thread = AtlCreateThread(PrintProc, this);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool ScannerCtrl::PauseWork()
|
|
|
|
|
{
|
|
|
|
|
m_PauseMsg = "";
|
|
|
|
|
SignalService::GetInstance().ResetRelateCoverAlarm();
|
|
|
|
|
if (!m_job_controller || !m_job_controller->GetJob()) {
|
2024-05-22 15:58:54 +08:00
|
|
|
|
ToastBean* bean = new ToastBean(g_LngManager->Toast_NoPauseTask->ShowText(), 3000);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
g_Toast->AddToast(bean);
|
2024-05-22 15:58:54 +08:00
|
|
|
|
m_PauseMsg = g_LngManager->Toast_NoPauseTask->ShowText();
|
2024-03-26 10:33:00 +08:00
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
m_job_controller->GetJob()->m_IsAutoCtrl = false;
|
|
|
|
|
g_SystemInfo->m_AutoPrintCtrlState = NoAuto;
|
|
|
|
|
if (BaseCtrl::IsStandBy()) {
|
2024-05-22 15:58:54 +08:00
|
|
|
|
m_PauseMsg = g_LngManager->Toast_StanbyPauseError->ShowText();
|
2024-03-26 10:33:00 +08:00
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
BaseCtrl::SetState(BaseCtrl::PAUSE);
|
|
|
|
|
BaseCtrl::SetPreState(BaseCtrl::NonePre);
|
2024-05-22 15:58:54 +08:00
|
|
|
|
g_Toast->AddToast(new ToastBean(g_LngManager->Toast_PausingTask->ShowText(), 3000, Toast::COLOR_ORANGE));
|
|
|
|
|
g_log->TraceInfo(u8"暂停任务");
|
2024-03-26 10:33:00 +08:00
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScannerCtrl::PauseAuto()
|
|
|
|
|
{
|
|
|
|
|
SignalService::GetInstance().ResetRelateCoverAlarm();
|
2024-05-22 15:58:54 +08:00
|
|
|
|
|
2024-03-26 10:33:00 +08:00
|
|
|
|
if (!m_job_controller || !m_job_controller->GetJob()) {
|
2024-05-22 15:58:54 +08:00
|
|
|
|
ToastBean* bean = new ToastBean(g_LngManager->Toast_NoPauseTask->ShowText(), 3000);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
g_Toast->AddToast(bean);
|
2024-05-22 15:58:54 +08:00
|
|
|
|
return;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
|
2024-03-26 10:33:00 +08:00
|
|
|
|
m_job_controller->GetJob()->m_IsAutoCtrl = true;
|
|
|
|
|
if (BaseCtrl::IsStandBy()) {
|
2024-05-22 15:58:54 +08:00
|
|
|
|
return;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
|
|
|
|
BaseCtrl::SetState(BaseCtrl::PAUSE);
|
|
|
|
|
BaseCtrl::SetPreState(BaseCtrl::NonePre);
|
2024-05-22 15:58:54 +08:00
|
|
|
|
g_Toast->AddToast(new ToastBean(g_LngManager->Toast_PausingTask->ShowText(), 3000, Toast::COLOR_ORANGE));
|
|
|
|
|
g_log->TraceInfo(u8"自动暂停任务");
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool ScannerCtrl::StopWork()
|
|
|
|
|
{
|
|
|
|
|
m_StopMsg = "";
|
|
|
|
|
SignalService::GetInstance().ResetRelateCoverAlarm();
|
|
|
|
|
if (!m_job_controller || !m_job_controller->GetJob()) {
|
2024-05-22 15:58:54 +08:00
|
|
|
|
ToastBean* bean = new ToastBean(g_LngManager->Toast_NoStopTask->ShowText(), 3000);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
g_Toast->AddToast(bean);
|
2024-05-22 15:58:54 +08:00
|
|
|
|
m_StopMsg = g_LngManager->Toast_NoStopTask->ShowText();
|
2024-03-26 10:33:00 +08:00
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
m_job_controller->GetJob()->m_IsAutoCtrl = false;
|
|
|
|
|
g_SystemInfo->m_AutoPrintCtrlState = NoAuto;
|
|
|
|
|
BaseCtrl::SetPauseState(BaseCtrl::NoPause);
|
|
|
|
|
if (BaseCtrl::IsStandBy()) {
|
|
|
|
|
m_job_controller->GetJob()->SetStartIndex(0);
|
|
|
|
|
m_job_controller->GetJob()->GetJobbean()->m_IsContinue = false;
|
|
|
|
|
CtrlWhenStop();
|
|
|
|
|
m_job_controller->GetJob()->UpdateJobBeanWhenStop();
|
|
|
|
|
BaseCtrl::SetState(BaseCtrl::STANDBY_STOP);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BaseCtrl::SetState(BaseCtrl::STOP);
|
|
|
|
|
for (size_t i = 0; i < m_scan.size(); i++) {
|
|
|
|
|
m_scan[i]->StopWork();
|
|
|
|
|
}
|
|
|
|
|
BaseCtrl::SetPreState(BaseCtrl::NonePre);
|
2024-05-22 15:58:54 +08:00
|
|
|
|
g_Toast->AddToast(new ToastBean(g_LngManager->Toast_StoppingTask->ShowText(), 3000, Toast::COLOR_ORANGE));
|
|
|
|
|
g_log->TraceKeyInfo(g_LngManager->Toast_StoppingTask->ShowText());
|
2024-03-26 10:33:00 +08:00
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool ScannerCtrl::IsTestLayerEnable()
|
|
|
|
|
{
|
|
|
|
|
return (m_RedPrintTestThread == INVALID_HANDLE_VALUE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScannerCtrl::TestLayer()
|
|
|
|
|
{
|
|
|
|
|
if (m_RedPrintTestThread != INVALID_HANDLE_VALUE)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if (m_scan.size() == 0)
|
|
|
|
|
{
|
2024-05-22 15:58:54 +08:00
|
|
|
|
ToastBean* bean = new ToastBean(g_LngManager->Log_NoScannerCtrl->ShowText(), 3000);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
g_Toast->AddToast(bean);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_RedPrintTestThread = AtlCreateThread(RedPrintTestProc, this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScannerCtrl::CtrlIoWhenExit() {
|
|
|
|
|
|
|
|
|
|
m_PurifierClient->ResetSlowWind();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScannerCtrl::CtrlWhenStop()
|
|
|
|
|
{
|
|
|
|
|
m_MachineCtrl->StopLaser(true);
|
|
|
|
|
if (BaseCtrl::IsFinish()) {
|
|
|
|
|
m_IOCfgWrapper->SetAutoCtrlHeating(true);
|
|
|
|
|
m_PurifierClient->HandlePrintFinish();
|
|
|
|
|
|
2024-05-28 13:28:07 +08:00
|
|
|
|
if (m_RunCfg->m_IsAutoReleasePressureWhenFinish->GetValue()) {
|
2024-03-26 10:33:00 +08:00
|
|
|
|
m_PressureCtrlFlag = true;
|
|
|
|
|
m_PressureThread = AtlCreateThread(ReleasePressureProc, this);
|
|
|
|
|
}
|
2024-05-28 13:28:07 +08:00
|
|
|
|
if (m_RunCfg->m_AutoShutdownPower->GetValue()) {
|
2024-03-26 10:33:00 +08:00
|
|
|
|
m_IOCfgWrapper->m_Laser->SetActive(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
m_PurifierClient->HandlePrintStop();
|
|
|
|
|
CtrlIoWhenExit();
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-15 13:38:34 +08:00
|
|
|
|
//void ScannerCtrl::GetInitErrorInfos(vector<string>& vec)
|
|
|
|
|
//{
|
|
|
|
|
// for (size_t i = 0; i < m_InitErrorInfos.size(); ++i) {
|
|
|
|
|
// vec.push_back(m_InitErrorInfos[i]);
|
|
|
|
|
// }
|
|
|
|
|
//}
|
2024-03-26 10:33:00 +08:00
|
|
|
|
|
2024-04-08 13:43:56 +08:00
|
|
|
|
string ScannerCtrl::GetInitErrorInfos()
|
|
|
|
|
{
|
|
|
|
|
string msg;
|
|
|
|
|
for (size_t i = 0; i < m_InitErrorInfos.size(); ++i) {
|
|
|
|
|
msg += (m_InitErrorInfos[i])+"";
|
|
|
|
|
}
|
|
|
|
|
return msg;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2024-03-26 10:33:00 +08:00
|
|
|
|
void ScannerCtrl::DispatchDataBlock()
|
|
|
|
|
{
|
|
|
|
|
if (!m_job_controller)return;
|
|
|
|
|
FileProcessor* job = m_job_controller->GetJob();
|
|
|
|
|
if (job == NULL) {
|
2024-05-22 15:58:54 +08:00
|
|
|
|
g_Toast->AddToast(new ToastBean(g_LngManager->Toast_NoTaskPrint->ShowText(), 3000));
|
2024-03-26 10:33:00 +08:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
MetaData* job_meta_data = job->GetMetaData();
|
|
|
|
|
if (job_meta_data == NULL)return;
|
|
|
|
|
|
|
|
|
|
size_t layerindex = job->GetStartIndex();
|
|
|
|
|
|
2024-05-22 15:58:54 +08:00
|
|
|
|
m_Camera->SetDemandCatpure(true);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
bool nodebug = !g_isDebug;
|
|
|
|
|
|
|
|
|
|
//job->UpdateJobBeanWhenStart();
|
|
|
|
|
JobBean* jobBean = job->GetJobbean();
|
2024-05-22 15:58:54 +08:00
|
|
|
|
// g_log->m_LogDao->LogJobStart(jobBean);
|
|
|
|
|
g_log->m_LogDao->LogImageBeforePrint(jobBean->m_Id, jobBean->m_IsContinue);
|
|
|
|
|
vector<MetaData::Layer*>& layers = job_meta_data->GetLayersVec();
|
2024-03-26 10:33:00 +08:00
|
|
|
|
//unsigned int memorySize = GetMemorySize();
|
|
|
|
|
g_SystemInfo->m_StateBean.maxLayerIndex = job->GetLayerCount();
|
|
|
|
|
g_SystemInfo->m_StateBean.layerThick = job->GetLayerThickness();
|
|
|
|
|
|
|
|
|
|
uint32_t startPos = jobBean->m_StartMoldPos;
|
|
|
|
|
uint32_t firstStartIndex = jobBean->m_FirstStartIndex;
|
|
|
|
|
int fix = 0;
|
|
|
|
|
if (firstStartIndex < layers.size())
|
|
|
|
|
{
|
|
|
|
|
fix = startPos - layers[firstStartIndex]->z;
|
|
|
|
|
}
|
|
|
|
|
for (size_t i = 0; i < layers.size(); i++) {
|
|
|
|
|
layers[i]->realZ = layers[i]->z + fix;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
job_meta_data->CalcRealPower();
|
|
|
|
|
|
|
|
|
|
job_meta_data->ReCalcEvaTime();
|
|
|
|
|
g_SystemInfo->m_StateBean.jobCostMil = job_meta_data->GetEvaTime();
|
|
|
|
|
|
|
|
|
|
//if (job->m_StartTime == 0L)job->m_StartTime = GetTickCount64();
|
|
|
|
|
bool isbreak = false;
|
|
|
|
|
|
2024-05-22 15:58:54 +08:00
|
|
|
|
char showBuffer[512];
|
2024-03-26 10:33:00 +08:00
|
|
|
|
map<int, Scanner*> scanMap;
|
|
|
|
|
for (size_t scanIndex = 0; scanIndex < m_scan.size(); ++scanIndex) {
|
|
|
|
|
Scanner* scanner = m_scan[scanIndex];
|
|
|
|
|
scanner->m_JobStartTime = job->m_FirstStartTime;
|
|
|
|
|
scanMap[scanner->GetConfig()->m_SeqNo] = scanner;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_DownSkinStopFlag = 1;
|
|
|
|
|
m_IsDownSkinContinue = false;
|
|
|
|
|
|
|
|
|
|
bool isCoverFirst = true;
|
2024-05-22 15:58:54 +08:00
|
|
|
|
short lastPowderGrid = 0;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
|
|
|
|
|
int linearAccDis = 0;
|
|
|
|
|
float lastLinearPos = 0.0f;
|
|
|
|
|
for (; layerindex < layers.size(); layerindex++) {//遍历层
|
|
|
|
|
bool hasDownSkin = false;
|
|
|
|
|
if (BaseCtrl::IsStop() || BaseCtrl::IsPause()) {
|
|
|
|
|
if (BaseCtrl::IsStop()) {
|
|
|
|
|
job->SetStartIndex(0);
|
|
|
|
|
}
|
|
|
|
|
if (BaseCtrl::IsPause()) {
|
|
|
|
|
job->SetStartIndex(layerindex);
|
|
|
|
|
}
|
|
|
|
|
isbreak = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!job_meta_data->LoadLayerByIndex(layerindex)) continue;
|
|
|
|
|
job_meta_data->CalcRemainTime(layerindex);
|
|
|
|
|
g_SystemInfo->m_StateBean.layerIndex = layerindex;
|
|
|
|
|
g_SystemInfo->m_StateBean.jobProgress = (float)layerindex / (float)g_SystemInfo->m_StateBean.maxLayerIndex;
|
|
|
|
|
MetaData::Layer* layer = layers[layerindex];
|
|
|
|
|
bool hasPrintPart = false;
|
2024-05-22 15:58:54 +08:00
|
|
|
|
for (size_t jLayerIndex = layerindex; jLayerIndex < layers.size(); jLayerIndex++) {
|
|
|
|
|
MetaData::Layer* jlayer = layers[jLayerIndex];
|
|
|
|
|
if (jlayer->data_blocks.empty())continue;
|
|
|
|
|
bool dbbreak = false;
|
|
|
|
|
for (size_t blockIndex = 0; blockIndex < jlayer->data_blocks.size(); ++blockIndex) {
|
|
|
|
|
MetaData::DataBlock* jdatablock = jlayer->data_blocks[blockIndex];
|
|
|
|
|
if (!jdatablock)continue;
|
|
|
|
|
MetaData::Part* part = job_meta_data->GetPart(jdatablock->references->part);
|
|
|
|
|
if (part) {
|
|
|
|
|
if (part->print_enable) {
|
|
|
|
|
hasPrintPart = true;
|
|
|
|
|
dbbreak = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (dbbreak)break;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
|
|
|
|
if (!hasPrintPart)break;
|
|
|
|
|
|
2024-05-22 15:58:54 +08:00
|
|
|
|
// if (!g_isDebug) {
|
|
|
|
|
int ptickcount = 0;
|
|
|
|
|
while (m_MachineCtrl->IsCovering() && IsStart() && !g_isDebug) {
|
|
|
|
|
ptickcount++;
|
|
|
|
|
Sleep(20);
|
|
|
|
|
}
|
2024-03-26 10:33:00 +08:00
|
|
|
|
|
2024-05-22 15:58:54 +08:00
|
|
|
|
InfraredTempLog log;
|
|
|
|
|
if (m_InfraredTemp && m_InfraredTemp->IsConnect())
|
|
|
|
|
{
|
|
|
|
|
//time(&log.m_InsertTime);
|
|
|
|
|
time(&log.m_PreInsertTime);
|
|
|
|
|
log.m_JobId = jobBean->m_Id;
|
|
|
|
|
log.m_LayerIndex = layerindex;
|
|
|
|
|
log.m_PartCount = job->GetComponentCount();
|
|
|
|
|
vector<InfraredTemp::PartTempStat> pts;
|
|
|
|
|
m_InfraredTemp->GetPartTemp(pts);
|
|
|
|
|
for (int ifIndex = 0; ifIndex < pts.size(); ifIndex++) {
|
|
|
|
|
InfraredTempLog::ITPair itPair;
|
|
|
|
|
itPair.PreCover = pts[ifIndex].maxTemp;
|
|
|
|
|
//itPair.Pid = pts[ifIndex].pid;
|
|
|
|
|
log.m_Temps.push_back(itPair);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-05-28 18:07:35 +08:00
|
|
|
|
if (m_InfraredTempCfg->m_TempCtrlType->GetValue() == InfraredTempCfg::WAIT_TEMP) {
|
2024-05-22 15:58:54 +08:00
|
|
|
|
while (IsStart()) {
|
|
|
|
|
if (!m_InfraredTemp->IsOverChillDown())
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
2024-05-28 18:07:35 +08:00
|
|
|
|
if (m_InfraredTempCfg->m_TempCtrlType->GetValue() != InfraredTempCfg::WAIT_TEMP)
|
2024-05-22 15:58:54 +08:00
|
|
|
|
{
|
2024-03-26 10:33:00 +08:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
Sleep(100);
|
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
pts.clear();
|
|
|
|
|
m_InfraredTemp->GetPartTemp(pts);
|
|
|
|
|
for (int ifIndex = 0; ifIndex < pts.size(); ifIndex++) {
|
|
|
|
|
if (ifIndex < log.m_Temps.size())
|
|
|
|
|
{
|
|
|
|
|
log.m_Temps[ifIndex].WaitMax = pts[ifIndex].maxTemp;
|
|
|
|
|
}
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-22 15:58:54 +08:00
|
|
|
|
pts.clear();
|
|
|
|
|
m_InfraredTemp->GetPartTemp(pts);
|
|
|
|
|
for (int ifIndex = 0; ifIndex < pts.size(); ifIndex++) {
|
|
|
|
|
if (ifIndex < log.m_Temps.size())
|
|
|
|
|
{
|
|
|
|
|
log.m_Temps[ifIndex].PreCover = pts[ifIndex].maxTemp;
|
|
|
|
|
}
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
}
|
2024-03-26 10:33:00 +08:00
|
|
|
|
|
2024-05-22 15:58:54 +08:00
|
|
|
|
AxisLog* lc = NULL;
|
|
|
|
|
if (m_ServoManager) {
|
|
|
|
|
lc = new AxisLog(jobBean->m_Id, layerindex, m_CoverCfg->m_CoverDirection);
|
|
|
|
|
if (m_ServoManager)m_ServoManager->StartLog(lc);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool isSlowWindSet = false;
|
|
|
|
|
if (m_ExtCfg->m_AutoCoverSlowWind && m_PurifierClient->IsWindActive())
|
|
|
|
|
{
|
|
|
|
|
m_AlarmCfgWrapper->m_WindOverLimitAlarm->m_Shielding = true;
|
|
|
|
|
Sleep(100);
|
|
|
|
|
|
2024-05-28 13:28:07 +08:00
|
|
|
|
if (m_RunCfg->m_LogDebugInfo->GetValue())g_log->TraceInfo(u8"层%d开始铺粉降风速", layerindex + 1);
|
2024-05-22 15:58:54 +08:00
|
|
|
|
m_PurifierClient->SetCoverWind(true);
|
|
|
|
|
isSlowWindSet = true;
|
|
|
|
|
int windcount = 0;
|
|
|
|
|
while (IsStart() && windcount < 300) {
|
|
|
|
|
if (m_PurifierClient->IsCoverWindSlow()) {
|
2024-03-26 10:33:00 +08:00
|
|
|
|
break;
|
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
windcount++;
|
|
|
|
|
Sleep(100);
|
|
|
|
|
}
|
2024-05-28 13:28:07 +08:00
|
|
|
|
if (m_RunCfg->m_UseCoverWindSignal->GetValue())
|
2024-05-22 15:58:54 +08:00
|
|
|
|
{
|
|
|
|
|
m_PurifierClient->ResetSlwoWindSignal(true);
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-03-26 10:33:00 +08:00
|
|
|
|
|
2024-05-22 15:58:54 +08:00
|
|
|
|
bool isOK = true;
|
|
|
|
|
int retry = m_RecoatCheckCfg->m_RetryTimes;
|
|
|
|
|
float layerThick = layer->layer_thickness;
|
|
|
|
|
|
|
|
|
|
g_SystemInfo->LockInfo();
|
|
|
|
|
int32_t premoldPos = g_SystemInfo->m_MoldMainPos;
|
|
|
|
|
g_SystemInfo->UnlockInfo();
|
|
|
|
|
|
|
|
|
|
float layerYmin = FLT_MAX;
|
|
|
|
|
float layerYmax = -FLT_MAX;
|
|
|
|
|
for (map<int, MetaData::Part*>::iterator pit = layer->parts.begin(); pit != layer->parts.end(); pit++) {
|
|
|
|
|
MetaData::Part* tempPart = pit->second;
|
|
|
|
|
if (!tempPart->print_enable)continue;
|
|
|
|
|
if (layerYmin > tempPart->layerDimensions->ymin)layerYmin = tempPart->layerDimensions->ymin;
|
|
|
|
|
if (layerYmax < tempPart->layerDimensions->ymax)layerYmax = tempPart->layerDimensions->ymax;
|
|
|
|
|
}
|
2024-03-26 10:33:00 +08:00
|
|
|
|
|
2024-05-28 13:28:07 +08:00
|
|
|
|
if (m_RunCfg->m_LogDebugInfo->GetValue())g_log->TraceInfo(u8"层%d开始铺粉", layerindex + 1);
|
2024-05-22 15:58:54 +08:00
|
|
|
|
do {
|
|
|
|
|
if (BaseCtrl::IsStop() || BaseCtrl::IsPause()) {
|
|
|
|
|
if (BaseCtrl::IsStop()) {
|
|
|
|
|
job->SetStartIndex(0);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (BaseCtrl::IsPause()) {
|
|
|
|
|
job->SetStartIndex(layerindex);
|
|
|
|
|
}
|
|
|
|
|
isbreak = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
2024-03-26 10:33:00 +08:00
|
|
|
|
|
2024-05-22 15:58:54 +08:00
|
|
|
|
m_MachineCtrl->ResetCoverFinishedCanPrint();
|
|
|
|
|
|
2024-05-28 13:28:07 +08:00
|
|
|
|
if (m_RunCfg->m_SmartCoverEnable->GetValue()) {
|
2024-05-22 15:58:54 +08:00
|
|
|
|
m_MachineCtrl->ExecuteDataSizeY(ceil(layerYmin) * 1000, ceil(layerYmax) * 1000);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
short powderGrid = ceil((float)layer->powder / m_PowderEstimateCfg->m_PowderPerGrid);
|
|
|
|
|
if (isCoverFirst) {
|
|
|
|
|
m_MachineCtrl->ExecuteCover(layerThick, powderGrid, false, isCoverFirst);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
if (isCoverFirst) {
|
2024-05-22 15:58:54 +08:00
|
|
|
|
isCoverFirst = !isCoverFirst;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
m_MachineCtrl->ExecuteCover(layerThick, powderGrid, false, lastPowderGrid == 0);
|
|
|
|
|
}
|
2024-03-26 10:33:00 +08:00
|
|
|
|
|
2024-05-22 15:58:54 +08:00
|
|
|
|
lastPowderGrid = powderGrid;
|
|
|
|
|
Sleep(500);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
|
2024-05-22 15:58:54 +08:00
|
|
|
|
while (!m_MachineCtrl->IsCoverFinishedCanPrint() && !g_isDebug && IsStart()) {
|
|
|
|
|
if (m_MachineCtrl->IsCoverFinishedCanPrint()) {
|
|
|
|
|
break;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
Sleep(10);
|
|
|
|
|
}
|
2024-03-26 10:33:00 +08:00
|
|
|
|
|
2024-05-22 15:58:54 +08:00
|
|
|
|
/*while (m_MachineCtrl->IsCovering() && !g_isDebug && IsStart()) {
|
|
|
|
|
if (!m_MachineCtrl->IsCovering()) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
Sleep(10);
|
|
|
|
|
}*/
|
|
|
|
|
Sleep(100);
|
|
|
|
|
|
|
|
|
|
m_MachineCtrl->ResetCoverFinishedCanPrint();
|
|
|
|
|
if (m_RecoatCheck == nullptr || !m_RecoatCheckCfg->m_Enable || (layerindex < m_RecoatCheckCfg->m_CheckLayerIndex) || m_CoverCfg->IsNoCover())
|
|
|
|
|
break;
|
|
|
|
|
if (layer->powder == 0)break;
|
|
|
|
|
unsigned char* img = nullptr;
|
|
|
|
|
int width = 0, height = 0;
|
|
|
|
|
isOK = m_RecoatCheck->CheckWP2(job_meta_data, layerindex);
|
|
|
|
|
if (!isOK) {
|
|
|
|
|
layerThick = 0.0f;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
break;
|
|
|
|
|
} while (!isOK && retry--);
|
2024-05-28 13:28:07 +08:00
|
|
|
|
if (m_RunCfg->m_LogDebugInfo->GetValue())g_log->TraceInfo(u8"层%d铺粉完成", layerindex + 1);
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (isSlowWindSet && m_PurifierClient->IsWindActive())
|
|
|
|
|
{
|
|
|
|
|
m_PurifierClient->SetCoverWind(false);
|
|
|
|
|
int windcount = 0;
|
|
|
|
|
while (IsStart() && windcount < 300) {
|
|
|
|
|
if (m_PurifierClient->IsCoverWindRecover()) {
|
2024-03-26 10:33:00 +08:00
|
|
|
|
break;
|
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
windcount++;
|
|
|
|
|
Sleep(100);
|
|
|
|
|
}
|
2024-05-28 13:28:07 +08:00
|
|
|
|
if (m_RunCfg->m_UseCoverWindSignal->GetValue())
|
2024-05-22 15:58:54 +08:00
|
|
|
|
{
|
|
|
|
|
m_PurifierClient->ResetSlwoWindSignal(false);
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-05-28 13:28:07 +08:00
|
|
|
|
if (m_RunCfg->m_LogDebugInfo->GetValue())g_log->TraceInfo(u8"层%d风速已经恢复", layerindex + 1);
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (m_AlarmCfgWrapper->m_WindOverLimitAlarm && m_AlarmCfgWrapper->m_WindOverLimitAlarm->m_Shielding) {
|
|
|
|
|
m_AlarmCfgWrapper->m_WindOverLimitAlarm->m_Shielding = false;
|
|
|
|
|
}
|
|
|
|
|
//ResetEvent(m_PowderEvent);
|
|
|
|
|
if (m_ServoManager && lc) {
|
|
|
|
|
//AxisLog* lc = new AxisLog(jobBean->m_Id, layerindex, m_CoverCfg->m_CoverDirection);
|
|
|
|
|
m_ServoManager->StopLog(lc);
|
|
|
|
|
g_log->m_LogDao->AddAxisLog(lc);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (m_InfraredTemp && m_InfraredTemp->IsConnect())
|
|
|
|
|
{
|
|
|
|
|
time(&log.m_AftInserTime);
|
|
|
|
|
vector<InfraredTemp::PartTempStat> pts;
|
|
|
|
|
m_InfraredTemp->GetPartTemp(pts);
|
|
|
|
|
for (int ifIndex = 0; ifIndex < pts.size(); ifIndex++) {
|
|
|
|
|
if (ifIndex < log.m_Temps.size())
|
2024-03-26 10:33:00 +08:00
|
|
|
|
{
|
2024-05-22 15:58:54 +08:00
|
|
|
|
log.m_Temps[ifIndex].AftCover = pts[ifIndex].maxTemp;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
m_InfraredTemp->ResetPrintMax();
|
2024-05-28 18:07:35 +08:00
|
|
|
|
if (m_InfraredTempCfg->m_TempCtrlType->GetValue() == InfraredTempCfg::COVERED_WAIT) {
|
2024-05-22 15:58:54 +08:00
|
|
|
|
m_InfraredTemp->ResetWaitFlag();
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
}
|
2024-03-26 10:33:00 +08:00
|
|
|
|
|
2024-05-28 13:28:07 +08:00
|
|
|
|
if (m_RunCfg->m_CoverLayerDelay->GetValue() != 0)
|
2024-05-22 15:58:54 +08:00
|
|
|
|
{
|
|
|
|
|
uint64_t tb = GetTickCount64();
|
|
|
|
|
while (true)
|
2024-03-26 10:33:00 +08:00
|
|
|
|
{
|
2024-05-22 15:58:54 +08:00
|
|
|
|
Sleep(300);
|
|
|
|
|
uint64_t tt = GetTickCount64();
|
|
|
|
|
unsigned int difs = tt - tb;
|
2024-05-28 13:28:07 +08:00
|
|
|
|
if (difs > (m_RunCfg->m_CoverLayerDelay->GetValue() * 1000))
|
2024-03-26 10:33:00 +08:00
|
|
|
|
{
|
2024-05-22 15:58:54 +08:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (BaseCtrl::IsStop() || BaseCtrl::IsPause()) {
|
|
|
|
|
if (BaseCtrl::IsStop()) {
|
|
|
|
|
job->SetStartIndex(0);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (BaseCtrl::IsPause()) {
|
|
|
|
|
job->SetStartIndex(layerindex);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
isbreak = true;
|
|
|
|
|
break;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
}
|
2024-03-26 10:33:00 +08:00
|
|
|
|
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (BaseCtrl::IsStop() || BaseCtrl::IsPause()) {
|
|
|
|
|
if (BaseCtrl::IsStop()) {
|
|
|
|
|
job->SetStartIndex(0);
|
|
|
|
|
}
|
|
|
|
|
if (BaseCtrl::IsPause()) {
|
|
|
|
|
job->SetStartIndex(layerindex);
|
|
|
|
|
}
|
|
|
|
|
m_MachineCtrl->MoldMoveUp(layer->layer_thickness, false);
|
|
|
|
|
isbreak = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (m_Camera->IsConnect()) {
|
|
|
|
|
if (m_Camera->GenLogImage()) {
|
|
|
|
|
LogImage image;
|
|
|
|
|
time(&image.m_InsertTime);
|
|
|
|
|
image.m_JobId = jobBean->m_Id;
|
|
|
|
|
image.m_LayerIndex = layerindex;
|
|
|
|
|
image.m_Type = LogImage::COVERED;
|
|
|
|
|
image.m_Image = m_Camera->GetLogImage();
|
|
|
|
|
image.m_ImageLength = m_Camera->GetLogImageSize();
|
|
|
|
|
g_log->m_LogDao->AddImage(image);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
}
|
2024-03-26 10:33:00 +08:00
|
|
|
|
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (m_InfraredTemp && m_InfraredTemp->IsConnect()) {
|
|
|
|
|
IFImage* ifImage = new IFImage();
|
|
|
|
|
time(&ifImage->m_InsertTime);
|
|
|
|
|
ifImage->m_JobId = jobBean->m_Id;
|
|
|
|
|
ifImage->m_LayerIndex = layerindex;
|
|
|
|
|
ifImage->m_Type = IFImage::COVERED;
|
|
|
|
|
m_InfraredTemp->InitLog(ifImage);
|
|
|
|
|
g_log->m_LogDao->AddIFImage(ifImage);
|
|
|
|
|
delete ifImage;
|
|
|
|
|
}
|
|
|
|
|
// }
|
2024-03-26 10:33:00 +08:00
|
|
|
|
|
|
|
|
|
linearAccDis -= (layer->powder == 0 ? 0 : layer->layer_thickness);
|
2024-05-22 15:58:54 +08:00
|
|
|
|
float linearTheoryPos = lastLinearPos - (layer->powder == 0 ? 0 : layer->layer_thickness);
|
2024-05-28 13:28:07 +08:00
|
|
|
|
float layerJudgeValue = m_RunCfg->m_LayerLinearPosAlarmOffset->GetValue();
|
2024-03-26 10:33:00 +08:00
|
|
|
|
g_SystemInfo->LockInfo();
|
|
|
|
|
float nowDis = g_SystemInfo->m_EnvState.m_LinearActDistance;
|
2024-05-22 15:58:54 +08:00
|
|
|
|
int32_t nowPDis = g_SystemInfo->m_EnvState.m_LinearActPulse * g_SystemInfo->m_EnvState.m_LineEncPulseEqu;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
int32_t moldPos = g_SystemInfo->m_MoldMainPos;
|
|
|
|
|
g_SystemInfo->UnlockInfo();
|
2024-05-22 15:58:54 +08:00
|
|
|
|
|
2024-03-26 10:33:00 +08:00
|
|
|
|
if (abs(nowDis - linearTheoryPos) > layerJudgeValue) {
|
|
|
|
|
char buffer[256];
|
2024-05-22 15:58:54 +08:00
|
|
|
|
sprintf_s(buffer, sizeof(buffer), u8"%zu层光栅位置为%.3f mm,理论值应为%.3f mm", layerindex + 1, nowDis / 1000.0f, linearTheoryPos / 1000.0f);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
m_AlarmCfgWrapper->m_LayerLinearPosAlarm->m_AlarmInfo = string(buffer);
|
|
|
|
|
SignalService::GetInstance().SetAlarm(m_AlarmCfgWrapper->m_LayerLinearPosAlarm, true);
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-28 13:28:07 +08:00
|
|
|
|
if (abs(layer->realZ - moldPos) > m_RunCfg->m_MoldServoPosWarnOffset->GetValue()) {
|
2024-03-26 10:33:00 +08:00
|
|
|
|
char buffer[256];
|
2024-05-22 15:58:54 +08:00
|
|
|
|
sprintf_s(buffer, sizeof(buffer), u8"%zu层的理论伺服位置为%.3f mm,当前值为%.3f mm", layerindex + 1, (float)layer->realZ / 1000.0f, (float)moldPos / 1000.0f);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
m_AlarmCfgWrapper->m_MoldServoPosWarn->m_AlarmInfo = string(buffer);
|
|
|
|
|
SignalService::GetInstance().SetAlarm(m_AlarmCfgWrapper->m_MoldServoPosWarn, true);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
SignalService::GetInstance().SetAlarm(m_AlarmCfgWrapper->m_MoldServoPosWarn, false);
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-28 13:28:07 +08:00
|
|
|
|
if (abs(linearAccDis - nowPDis) > m_RunCfg->m_PrintLinearAccDevAlarmOffset->GetValue()) {
|
2024-03-26 10:33:00 +08:00
|
|
|
|
char buffer[256];
|
2024-05-22 15:58:54 +08:00
|
|
|
|
sprintf_s(buffer, sizeof(buffer), u8"%zu层的理论光栅位置为%.3f mm,当前值为%.3f mm", layerindex + 1, (float)linearAccDis / 1000.0f, (float)nowPDis / 1000.0f);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
m_AlarmCfgWrapper->m_PrintLinnearAccDevAlarm->m_AlarmInfo = string(buffer);
|
|
|
|
|
SignalService::GetInstance().SetAlarm(m_AlarmCfgWrapper->m_PrintLinnearAccDevAlarm, true);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
SignalService::GetInstance().SetAlarm(m_AlarmCfgWrapper->m_PrintLinnearAccDevAlarm, false);
|
|
|
|
|
}
|
|
|
|
|
lastLinearPos = nowDis;
|
|
|
|
|
// unsigned int scan_field_num = job_meta_data->GetNumOfScanField();
|
|
|
|
|
|
2024-05-28 13:28:07 +08:00
|
|
|
|
if (m_RunCfg->m_LogDebugInfo->GetValue())
|
2024-05-22 15:58:54 +08:00
|
|
|
|
{
|
|
|
|
|
g_log->TraceInfo(u8"层%d准备扫描", layerindex + 1);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
sprintf_s(showBuffer, sizeof(showBuffer), u8"层%d准备扫描\n", layerindex + 1);
|
|
|
|
|
OutputDebugString(showBuffer);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
map<int, Scanner*> useScanner;
|
|
|
|
|
for (int times = 0; times < layer->scan_times && !BaseCtrl::IsStop(); times++) {
|
|
|
|
|
for (size_t blockIndex = 0; blockIndex < layer->data_blocks.size(); ++blockIndex) {
|
|
|
|
|
MetaData::DataBlock* datablock = layer->data_blocks[blockIndex];
|
|
|
|
|
if (!datablock)continue;
|
|
|
|
|
MetaData::Part* part = job_meta_data->GetPart(datablock->references->part);
|
|
|
|
|
if (part) {
|
|
|
|
|
if (!part->print_enable) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
BPBinary::BinDataBlock* pdb = job_meta_data->GetDataBlock(datablock);
|
|
|
|
|
MetaData::ParameterSet* paramSet = job_meta_data->GetParameterSet(datablock->references->process);
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (!paramSet) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if (datablock->cno == 0)continue;
|
2024-05-28 13:28:07 +08:00
|
|
|
|
if (paramSet->set_type.find("Down") != string::npos && m_RunCfg->m_DownSkinStopTimes->GetValue() > 0) {
|
2024-03-26 10:33:00 +08:00
|
|
|
|
hasDownSkin = true;
|
2024-05-28 13:28:07 +08:00
|
|
|
|
if ((m_DownSkinStopFlag % (m_RunCfg->m_DownSkinStopTimes->GetValue() + 1)) == 0) {
|
2024-03-26 10:33:00 +08:00
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
float laserPower = paramSet->laser_set->laser_real_power;
|
|
|
|
|
if (laserPower == 0.0f) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!pdb)
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-22 15:58:54 +08:00
|
|
|
|
Scanner* scanner = scanMap[datablock->cno];
|
2024-03-26 10:33:00 +08:00
|
|
|
|
if (!scanner)continue;
|
2024-05-22 15:58:54 +08:00
|
|
|
|
scanner->AddDataBlock(pdb, part, paramSet, datablock->order, datablock->scanTime);
|
|
|
|
|
useScanner[datablock->cno] = scanner;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Scanner::ResetScaningLimit();
|
|
|
|
|
|
|
|
|
|
for (auto sc : useScanner) {
|
|
|
|
|
sc.second->BeginWork();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (auto sc : useScanner) {
|
|
|
|
|
sc.second->WaitFinish();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Scanner::ResetScaningLimit();
|
|
|
|
|
//OutputDebugString("end\n");
|
|
|
|
|
}
|
2024-05-28 13:28:07 +08:00
|
|
|
|
if (m_RunCfg->m_LogDebugInfo->GetValue())
|
2024-05-22 15:58:54 +08:00
|
|
|
|
{
|
|
|
|
|
g_log->TraceInfo(u8"层%d扫描完成", layerindex + 1);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sprintf_s(showBuffer, sizeof(showBuffer), u8"层%d扫描完成\n", layerindex + 1);
|
|
|
|
|
OutputDebugString(showBuffer);
|
|
|
|
|
|
2024-03-26 10:33:00 +08:00
|
|
|
|
jobBean->m_PrintedLayerIndex = layerindex;
|
|
|
|
|
g_SystemInfo->LockInfo();
|
2024-05-22 15:58:54 +08:00
|
|
|
|
jobBean->m_MoldPos = g_SystemInfo->m_MoldMainPos / 1000.0f;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
g_SystemInfo->UnlockInfo();
|
|
|
|
|
time(&jobBean->m_StopTime);
|
|
|
|
|
g_log->m_LogDao->UpdateJobAfterPrintLayer(jobBean);
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (m_Camera->IsConnect()) {
|
2024-03-26 10:33:00 +08:00
|
|
|
|
if (m_Camera->GenLogImage()) {
|
|
|
|
|
LogImage image;
|
|
|
|
|
time(&image.m_InsertTime);
|
|
|
|
|
image.m_JobId = jobBean->m_Id;
|
|
|
|
|
image.m_LayerIndex = layerindex;
|
|
|
|
|
image.m_Type = LogImage::PRINTED;
|
|
|
|
|
image.m_Image = m_Camera->GetLogImage();
|
|
|
|
|
image.m_ImageLength = m_Camera->GetLogImageSize();
|
|
|
|
|
g_log->m_LogDao->AddImage(image);
|
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
}
|
|
|
|
|
if (m_InfraredTemp && m_InfraredTemp->IsConnect())
|
|
|
|
|
{
|
|
|
|
|
time(&log.m_FinishedTime);
|
|
|
|
|
vector<InfraredTemp::PartTempStat> pts;
|
|
|
|
|
m_InfraredTemp->GetPartTemp(pts);
|
|
|
|
|
for (int ifIndex = 0; ifIndex < pts.size(); ifIndex++) {
|
|
|
|
|
if (ifIndex < log.m_Temps.size())
|
|
|
|
|
{
|
|
|
|
|
//log.m_Temps[ifIndex].AftCover = 20 + ifIndex;
|
|
|
|
|
log.m_Temps[ifIndex].PrintMax = pts[ifIndex].printMaxTemp;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
g_log->m_LogDao->AddInfraredTempLog(log);
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-28 13:28:07 +08:00
|
|
|
|
if (m_RunCfg->m_LogDebugInfo->GetValue())g_log->TraceInfo(u8"层%d扫描图像记录完成", layerindex + 1);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
m_IsDownSkinContinue = hasDownSkin;
|
|
|
|
|
if (m_IsDownSkinContinue)m_DownSkinStopFlag++;
|
|
|
|
|
else m_DownSkinStopFlag = 1;
|
|
|
|
|
|
2024-05-30 11:18:10 +08:00
|
|
|
|
if (m_MachineCfg->m_IsIntelli->GetValue()) {
|
2024-03-26 10:33:00 +08:00
|
|
|
|
|
|
|
|
|
vector<ScannerStatus*> scannerStatus;
|
|
|
|
|
vector<FocusStatus*> focusStatus;
|
|
|
|
|
for (size_t scanIndex = 0; scanIndex < m_scan.size(); ++scanIndex) {
|
|
|
|
|
m_scan[scanIndex]->UpdateScannerInfo();
|
2024-05-22 15:58:54 +08:00
|
|
|
|
m_scan[scanIndex]->CheckAlarm();
|
2024-03-26 10:33:00 +08:00
|
|
|
|
ScannerStatus* sstatus = new ScannerStatus();
|
2024-05-15 13:38:34 +08:00
|
|
|
|
ScanStateXYSCT sxy;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
m_scan[scanIndex]->GetXYScanState(&sxy, sstatus->m_InsertTime);
|
|
|
|
|
sstatus->m_ScanTempX = sxy.m_X.m_GalvanometerScannerTemp;
|
|
|
|
|
sstatus->m_ScanServoTempX = sxy.m_X.m_ServoBoardTemp;
|
|
|
|
|
sstatus->m_ScanTempY = sxy.m_Y.m_GalvanometerScannerTemp;
|
|
|
|
|
sstatus->m_ScanServoTempY = sxy.m_Y.m_ServoBoardTemp;
|
|
|
|
|
sstatus->m_ScanId = m_scan[scanIndex]->GetConfig()->m_SeqNo;
|
|
|
|
|
sstatus->m_JobId = jobBean->m_Id;
|
|
|
|
|
sstatus->m_LayerIndex = layerindex;
|
|
|
|
|
sstatus->m_ActualPositionX = sxy.m_X.m_ActualPosition;
|
|
|
|
|
sstatus->m_SetPositionX = sxy.m_X.m_SetPosition;
|
|
|
|
|
sstatus->m_PositionErrorX = sxy.m_X.m_PositionError;
|
|
|
|
|
sstatus->m_ActualPositionY = sxy.m_Y.m_ActualPosition;
|
|
|
|
|
sstatus->m_SetPositionY = sxy.m_Y.m_SetPosition;
|
|
|
|
|
sstatus->m_PositionErrorY = sxy.m_Y.m_PositionError;
|
|
|
|
|
sstatus->m_LowStateX = sxy.m_X.m_LowState;
|
|
|
|
|
sstatus->m_LowStateY = sxy.m_Y.m_LowState;
|
|
|
|
|
sstatus->m_HighStateX = sxy.m_X.m_HighState;
|
|
|
|
|
sstatus->m_HighStateY = sxy.m_Y.m_HighState;
|
|
|
|
|
scannerStatus.push_back(sstatus);
|
|
|
|
|
|
|
|
|
|
if (m_scan[scanIndex]->GetConfig()->m_ScanCfgWrapper.m_CorrectParamCfg.m_IsDynamicFocus) {
|
|
|
|
|
FocusStatus* fs = new FocusStatus();
|
|
|
|
|
fs->m_ScanId = m_scan[scanIndex]->GetConfig()->m_SeqNo;
|
|
|
|
|
fs->m_JobId = jobBean->m_Id;
|
|
|
|
|
fs->m_LayerIndex = layerindex;
|
|
|
|
|
time(&fs->m_InsertTime);
|
|
|
|
|
fs->m_ScanServoTemp = sxy.m_Focus.m_ServoBoardTemp;
|
|
|
|
|
fs->m_PDSupplyVoltage = sxy.m_Focus.m_PDSupplyVoltage;
|
|
|
|
|
fs->m_DSPCoreSupplyVoltage = sxy.m_Focus.m_DSPCoreSupplyVoltage;
|
|
|
|
|
fs->m_DSPIOVoltage = sxy.m_Focus.m_DSPIOVoltage;
|
|
|
|
|
fs->m_AnalogSectionVoltage = sxy.m_Focus.m_AnalogSectionVoltage;
|
|
|
|
|
fs->m_ADConverterSupplyVoltage = sxy.m_Focus.m_ADConverterSupplyVoltage;
|
|
|
|
|
fs->m_PDSupplyCurrent = sxy.m_Focus.m_PDSupplyCurrent;
|
|
|
|
|
fs->m_LowState = sxy.m_Focus.m_LowState;
|
|
|
|
|
fs->m_HighState = sxy.m_Focus.m_HighState;
|
|
|
|
|
fs->m_StopEven = sxy.m_Focus.m_StopEven;
|
|
|
|
|
focusStatus.push_back(fs);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
g_log->m_LogDao->LogScannerStatus(scannerStatus);
|
|
|
|
|
for (size_t ssindex = 0; ssindex < scannerStatus.size(); ssindex++) {
|
|
|
|
|
delete scannerStatus[ssindex];
|
|
|
|
|
}
|
|
|
|
|
scannerStatus.clear();
|
|
|
|
|
if (!focusStatus.empty()) {
|
|
|
|
|
g_log->m_LogDao->LogFocusStatus(focusStatus);
|
|
|
|
|
for (size_t ssindex = 0; ssindex < focusStatus.size(); ssindex++) {
|
|
|
|
|
delete focusStatus[ssindex];
|
|
|
|
|
}
|
|
|
|
|
focusStatus.clear();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (m_InfraredTemp && m_InfraredTemp->IsConnect()) {
|
|
|
|
|
IFImage* ifImage = new IFImage();
|
|
|
|
|
time(&ifImage->m_InsertTime);
|
|
|
|
|
ifImage->m_JobId = jobBean->m_Id;
|
|
|
|
|
ifImage->m_LayerIndex = layerindex;
|
|
|
|
|
ifImage->m_Type = IFImage::PRINTED;
|
|
|
|
|
m_InfraredTemp->InitLog(ifImage);
|
|
|
|
|
g_log->m_LogDao->AddIFImage(ifImage);
|
|
|
|
|
delete ifImage;
|
|
|
|
|
}
|
2024-03-26 10:33:00 +08:00
|
|
|
|
if (m_RunCfg->m_PrintLayerDelay != 0)
|
|
|
|
|
{
|
|
|
|
|
uint64_t tb = GetTickCount64();
|
|
|
|
|
while (true)
|
|
|
|
|
{
|
|
|
|
|
Sleep(300);
|
|
|
|
|
uint64_t tt = GetTickCount64();
|
|
|
|
|
unsigned int difs = tt - tb;
|
2024-05-28 13:28:07 +08:00
|
|
|
|
if (difs > (m_RunCfg->m_PrintLayerDelay->GetValue() * 1000))
|
2024-03-26 10:33:00 +08:00
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (BaseCtrl::IsStop() || BaseCtrl::IsPause()) {
|
|
|
|
|
if (BaseCtrl::IsStop()) {
|
|
|
|
|
job->SetStartIndex(0);
|
|
|
|
|
}
|
|
|
|
|
if (BaseCtrl::IsPause()) {
|
|
|
|
|
job->SetStartIndex(layerindex + 1);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!isbreak) {
|
|
|
|
|
job->SetFinished(true);
|
|
|
|
|
time(&jobBean->m_StopTime);
|
|
|
|
|
jobBean->m_IsFinished = true;
|
2024-05-22 15:58:54 +08:00
|
|
|
|
jobBean->m_PrintedLayerIndex = layerindex - 1;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
g_log->m_LogDao->UpdateJobAfterPrintLayer(jobBean);
|
|
|
|
|
BaseCtrl::SetFinish();
|
|
|
|
|
g_SystemInfo->m_StateBean.jobProgress = 1.0f;
|
|
|
|
|
job->GetMetaData()->SetRemainTime(0);
|
|
|
|
|
g_SystemInfo->m_StateBean.remainMil = 0;
|
|
|
|
|
//jobBean->m_StopTime = 0;
|
|
|
|
|
jobBean->m_IsFinished = false;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
if (BaseCtrl::IsPause())
|
|
|
|
|
{
|
|
|
|
|
time(&jobBean->m_LastPauseTime);
|
|
|
|
|
g_log->m_LogDao->UpdateJobPauseTime(jobBean);
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
m_Camera->SetDemandCatpure(false);
|
2024-05-28 13:28:07 +08:00
|
|
|
|
if (m_RunCfg->m_LogDebugInfo->GetValue())g_log->TraceInfo(u8"退出打印流程", layerindex + 1);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void ScannerCtrl::DispatchTestDataBlock()
|
|
|
|
|
{
|
|
|
|
|
for (size_t i = 0; i < m_RedTestDBS.size(); i++) {
|
|
|
|
|
delete m_RedTestDBS[i];
|
|
|
|
|
m_RedTestDBS[i] = NULL;
|
|
|
|
|
}
|
|
|
|
|
m_RedTestDBS.clear();
|
|
|
|
|
if (!m_job_controller)return;
|
|
|
|
|
FileProcessor* job = m_job_controller->GetJob();
|
|
|
|
|
if (job == NULL) {
|
2024-05-22 15:58:54 +08:00
|
|
|
|
g_Toast->AddToast(new ToastBean(g_LngManager->Toast_NoTaskPrint->ShowText(), 3000));
|
2024-03-26 10:33:00 +08:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
//SetDefocus(0);
|
|
|
|
|
MetaData* job_meta_data = job->GetMetaData();
|
|
|
|
|
if (job_meta_data == NULL)return;
|
|
|
|
|
job_meta_data->CalcRealPower();
|
|
|
|
|
bool nodebug = !g_isDebug;
|
|
|
|
|
|
|
|
|
|
vector<MetaData::Layer*> layers = job_meta_data->GetLayersVec();
|
|
|
|
|
unsigned int layerindex = job->GetPreviewLayerIndex();
|
|
|
|
|
//unsigned int memorySize = GetMemorySize();
|
|
|
|
|
if (layerindex >= layers.size())return;
|
2024-05-22 15:58:54 +08:00
|
|
|
|
|
2024-03-26 10:33:00 +08:00
|
|
|
|
if (!job_meta_data->LoadLayerByIndex(layerindex)) return;
|
|
|
|
|
MetaData::Layer* layer = job_meta_data->GetLayer(layerindex);
|
|
|
|
|
//MetaData::Layer* layer = job_meta_data->GetPreviewLayer();
|
|
|
|
|
map<int, Scanner*> useScanner;
|
|
|
|
|
map<int, Scanner*> scanMap;
|
|
|
|
|
|
|
|
|
|
for (size_t scanIndex = 0; scanIndex < m_scan.size(); ++scanIndex) {
|
|
|
|
|
Scanner* scanner = m_scan[scanIndex];
|
|
|
|
|
scanMap[scanner->GetConfig()->m_SeqNo] = scanner;
|
|
|
|
|
m_scan[scanIndex]->Clean();
|
|
|
|
|
}
|
|
|
|
|
for (size_t i = 0; i < m_scan.size(); i++)
|
|
|
|
|
{
|
|
|
|
|
m_scan[i]->SetAutoUpdateScanInfo(false);
|
|
|
|
|
m_scan[i]->m_IsOrderSeqV2 = m_job_controller->GetJob()->GetMetaData()->m_IsScanOrderSeqV2;
|
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-03-26 10:33:00 +08:00
|
|
|
|
for (size_t blockIndex = 0; blockIndex < layer->data_blocks.size(); ++blockIndex) {
|
2024-05-22 15:58:54 +08:00
|
|
|
|
|
2024-03-26 10:33:00 +08:00
|
|
|
|
if (BaseCtrl::IsStop()) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
MetaData::DataBlock* datablock = layer->data_blocks[blockIndex];
|
|
|
|
|
if (!datablock)continue;
|
|
|
|
|
MetaData::Part* part = job_meta_data->GetPart(datablock->references->part);
|
|
|
|
|
if (part) {
|
|
|
|
|
if (!part->print_enable) continue;
|
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
BPBinary::BinDataBlock* pdb = job_meta_data->GetPreviewDataBlock(datablock);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
if (!pdb)continue;
|
|
|
|
|
MetaData::ParameterSet* paramSet = job_meta_data->GetParameterSet(datablock->references->process);
|
|
|
|
|
if (!paramSet)continue;
|
|
|
|
|
if (paramSet->laser_set->laser_power == 0.0f)
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (datablock->cno == 0)continue;
|
|
|
|
|
Scanner* scanner = scanMap[datablock->cno];
|
2024-03-26 10:33:00 +08:00
|
|
|
|
if (!scanner)continue;
|
2024-05-22 15:58:54 +08:00
|
|
|
|
|
2024-03-26 10:33:00 +08:00
|
|
|
|
BPBinary::BinDataBlock* pbindb = new BPBinary::BinDataBlock;
|
|
|
|
|
pdb->Copy(pbindb);
|
|
|
|
|
m_RedTestDBS.push_back(pbindb);
|
2024-05-22 15:58:54 +08:00
|
|
|
|
|
|
|
|
|
scanner->AddDataBlock(pbindb, part, paramSet, datablock->order, datablock->scanTime);
|
|
|
|
|
useScanner[datablock->cno] = scanner;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
|
2024-03-26 10:33:00 +08:00
|
|
|
|
Scanner::ResetScaningLimit();
|
|
|
|
|
for (auto scanner : useScanner)
|
|
|
|
|
scanner.second->BeginWork();
|
|
|
|
|
|
|
|
|
|
for (auto scanner : useScanner)
|
|
|
|
|
scanner.second->WaitFinish();
|
|
|
|
|
|
|
|
|
|
Scanner::ResetScaningLimit();
|
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < m_RedTestDBS.size(); i++) {
|
|
|
|
|
delete m_RedTestDBS[i];
|
|
|
|
|
}
|
|
|
|
|
m_RedTestDBS.clear();
|
2024-05-22 15:58:54 +08:00
|
|
|
|
|
|
|
|
|
|
2024-03-26 10:33:00 +08:00
|
|
|
|
for (size_t i = 0; i < m_scan.size(); i++)
|
|
|
|
|
{
|
|
|
|
|
m_scan[i]->SetAutoUpdateScanInfo(true);
|
2024-05-22 15:58:54 +08:00
|
|
|
|
//m_scan[i]->m_IsOrderSeqV2 = m_job_controller->GetJob()->GetMetaData()->m_IsScanOrderSeqV2;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void ScannerCtrl::ModelScan(void)
|
|
|
|
|
{
|
|
|
|
|
if (m_RedPrintTestThread != INVALID_HANDLE_VALUE)
|
|
|
|
|
return;
|
|
|
|
|
m_RedPrintTestThread = AtlCreateThread(ModelScanProc, this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScannerCtrl::StopModelScan(void)
|
|
|
|
|
{
|
|
|
|
|
PrintState printStateTemp = BaseCtrl::GetState();
|
|
|
|
|
BaseCtrl::SetState(BaseCtrl::STOP);
|
|
|
|
|
EnterCriticalSection(&m_LayerTestCs);
|
|
|
|
|
if (m_RedPrintTestThread != INVALID_HANDLE_VALUE) {
|
|
|
|
|
for (size_t scanIndex = 0; scanIndex < m_scan.size(); ++scanIndex) {
|
|
|
|
|
Scanner* scanner = m_scan[scanIndex];
|
|
|
|
|
scanner->StopWork();
|
|
|
|
|
}
|
|
|
|
|
if (WaitForSingleObject(m_RedPrintTestThread, 1000) == WAIT_TIMEOUT) {
|
|
|
|
|
TerminateThread(m_RedPrintTestThread, 0);
|
|
|
|
|
}
|
|
|
|
|
CloseHandle(m_RedPrintTestThread);
|
|
|
|
|
m_RedPrintTestThread = INVALID_HANDLE_VALUE;
|
|
|
|
|
}
|
|
|
|
|
LeaveCriticalSection(&m_LayerTestCs);
|
|
|
|
|
BaseCtrl::SetState(printStateTemp);
|
|
|
|
|
for (size_t i = 0; i < m_scan.size(); i++) {
|
|
|
|
|
m_scan[i]->Clean();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DWORD WINAPI ScannerCtrl::ModelScanProc(thisClass* _this)
|
|
|
|
|
{
|
|
|
|
|
if (_this)
|
|
|
|
|
{
|
|
|
|
|
ExtCfg* stc = ConfigManager::GetInstance()->GetExtCfg();
|
|
|
|
|
if (stc->m_model_scan_mode == 0) {}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
//_this->m_gc->StartLaser(true);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
else {
|
|
|
|
|
//_this->m_gc->StopLaser(true);
|
|
|
|
|
if (!_this->m_IOCfgWrapper->m_Laser->IsActive()) {
|
|
|
|
|
_this->m_IOCfgWrapper->m_Laser->SetActive(true);
|
2024-05-22 15:58:54 +08:00
|
|
|
|
Sleep(_this->m_ExtCfg->m_AftLaserPowerWaitSecond * 1000);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
|
|
|
|
vector<ScannerControlCfg*>* laserCfgs = ConfigManager::GetInstance()->GetMatchScannerControlCfg();
|
|
|
|
|
for (size_t lrIndex = 0; lrIndex < laserCfgs->size(); lrIndex++) {
|
|
|
|
|
ScannerControlCfg* laserCfg = (*laserCfgs)[lrIndex];
|
|
|
|
|
if (laserCfg->m_LaserRed && !laserCfg->m_LaserRed->IsActive()) {
|
|
|
|
|
laserCfg->m_LaserRed->SetActive(true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
g_Toast->AddToast(new ToastBean(g_LngManager->Toast_StartScan->ShowText(), 2000, ImVec4(0, 1, 0, 1)));
|
|
|
|
|
|
2024-03-26 10:33:00 +08:00
|
|
|
|
_this->DispatchModelDataBlock(stc->m_model_scan_part_id, stc->m_model_scan_type, stc->m_model_laser_power, stc->m_model_laser_speed);
|
|
|
|
|
EnterCriticalSection(&_this->m_LayerTestCs);
|
|
|
|
|
if (_this->m_RedPrintTestThread != INVALID_HANDLE_VALUE) {
|
|
|
|
|
CloseHandle(_this->m_RedPrintTestThread);
|
|
|
|
|
_this->m_RedPrintTestThread = INVALID_HANDLE_VALUE;
|
|
|
|
|
}
|
|
|
|
|
LeaveCriticalSection(&_this->m_LayerTestCs);
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScannerCtrl::DispatchModelDataBlock(int partId, string scanType, float power, float speed)
|
|
|
|
|
{
|
|
|
|
|
for (size_t i = 0; i < m_ModeTestDBS.size(); i++) {
|
|
|
|
|
delete m_ModeTestDBS[i];
|
|
|
|
|
}
|
|
|
|
|
m_ModeTestDBS.clear();
|
|
|
|
|
|
|
|
|
|
if (!m_job_controller)return;
|
|
|
|
|
FileProcessor* job = m_job_controller->GetJob();
|
|
|
|
|
if (job == NULL) {
|
2024-05-22 15:58:54 +08:00
|
|
|
|
g_Toast->AddToast(new ToastBean(g_LngManager->Toast_NoTaskPrint->ShowText(), 3000));
|
2024-03-26 10:33:00 +08:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MetaData* job_meta_data = job->GetMetaData();
|
|
|
|
|
if (job_meta_data == NULL)return;
|
|
|
|
|
job_meta_data->CalcRealPower();
|
|
|
|
|
bool nodebug = !g_isDebug;
|
|
|
|
|
|
|
|
|
|
vector<MetaData::Part*> parts = job_meta_data->GetPartVec();
|
|
|
|
|
if (partId > parts.size())
|
2024-05-22 15:58:54 +08:00
|
|
|
|
{
|
|
|
|
|
g_Toast->AddToast(new ToastBean(_(u8"零件ID异常").c_str(), 3000, Toast::COLOR_RED));
|
2024-03-26 10:33:00 +08:00
|
|
|
|
return;
|
2024-05-22 15:58:54 +08:00
|
|
|
|
}
|
2024-03-26 10:33:00 +08:00
|
|
|
|
|
|
|
|
|
if (scanType != "Border" && scanType != "Hatching")
|
2024-05-22 15:58:54 +08:00
|
|
|
|
{
|
|
|
|
|
g_Toast->AddToast(new ToastBean(_(u8"数据类型异常").c_str(), 3000, Toast::COLOR_RED));
|
2024-03-26 10:33:00 +08:00
|
|
|
|
return;
|
2024-05-22 15:58:54 +08:00
|
|
|
|
}
|
2024-03-26 10:33:00 +08:00
|
|
|
|
|
|
|
|
|
vector<MetaData::Layer*> layers = job_meta_data->GetLayersVec();
|
|
|
|
|
size_t layerindex = job->GetStartIndex();
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (layerindex >= layers.size())
|
|
|
|
|
{
|
|
|
|
|
g_Toast->AddToast(new ToastBean(_(u8"选择层数异常").c_str(), 3000, Toast::COLOR_RED));
|
|
|
|
|
return;
|
|
|
|
|
}
|
2024-03-26 10:33:00 +08:00
|
|
|
|
|
|
|
|
|
map<int, Scanner*> useScanner;
|
2024-05-22 15:58:54 +08:00
|
|
|
|
|
2024-03-26 10:33:00 +08:00
|
|
|
|
map<int, Scanner*> scanMap;
|
|
|
|
|
for (size_t scanIndex = 0; scanIndex < m_scan.size(); ++scanIndex) {
|
|
|
|
|
Scanner* scanner = m_scan[scanIndex];
|
|
|
|
|
scanMap[scanner->GetConfig()->m_SeqNo] = scanner;
|
2024-05-22 15:58:54 +08:00
|
|
|
|
m_scan[scanIndex]->Clean();
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!job_meta_data->LoadLayerByIndex(layerindex)) return;
|
|
|
|
|
MetaData::Layer* layer = job_meta_data->GetLayer(layerindex);
|
|
|
|
|
|
|
|
|
|
vector<MetaData::ParameterSet*> params;
|
|
|
|
|
|
2024-05-22 15:58:54 +08:00
|
|
|
|
|
2024-03-26 10:33:00 +08:00
|
|
|
|
for (size_t blockIndex = 0; blockIndex < layer->data_blocks.size(); ++blockIndex) {
|
|
|
|
|
if (BaseCtrl::IsStop()) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MetaData::DataBlock* datablock = layer->data_blocks[blockIndex];
|
|
|
|
|
if (!datablock)continue;
|
|
|
|
|
if (datablock->references->part != partId)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MetaData::Part* part = job_meta_data->GetPart(datablock->references->part);
|
|
|
|
|
if (part) {
|
|
|
|
|
if (!part->print_enable) continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MetaData::ParameterSet* ps = job_meta_data->GetParameterSet(datablock->references->process);
|
|
|
|
|
if (ps->laser_set->laser_power == 0.0f)
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if (scanType == "Border") {
|
2024-05-22 15:58:54 +08:00
|
|
|
|
bool isApply = true;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
switch (m_ExtCfg->m_model_border_type) {
|
|
|
|
|
case ExtCfg::All_Border: {
|
|
|
|
|
if (ps->set_type.find("Border") == ps->set_type.npos) {
|
2024-05-22 15:58:54 +08:00
|
|
|
|
isApply = false;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
|
|
|
|
}break;
|
|
|
|
|
case ExtCfg::Border: {
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (ps->set_type != "Border" && ps->set_type != "InBorder" && ps->set_type != "InBorderJ" &&
|
|
|
|
|
ps->set_type != "BorderDown" && ps->set_type != "DownBorder" && ps->set_type != "DownBorderJ" &&
|
|
|
|
|
ps->set_type != "BorderUp" && ps->set_type != "UpBorder" && ps->set_type != "UpBorderJ")isApply = false;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}break;
|
|
|
|
|
case ExtCfg::BorderAdditional: {
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (ps->set_type != "BorderAdditional" && ps->set_type != "InBorderAd" && ps->set_type != "InBorderAdJ" &&
|
|
|
|
|
ps->set_type != "BorderAdditionalDown" && ps->set_type != "DownBorderAd" && ps->set_type != "DownBorderAdJ" &&
|
|
|
|
|
ps->set_type != "BorderAdditionalUp" && ps->set_type != "UpBorderAd" && ps->set_type != "UpBorderAdJ")isApply = false;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}break;
|
|
|
|
|
case ExtCfg::BorderBlocked: {
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (ps->set_type != "BorderBlocked" && ps->set_type != "BorderBlockedDown" && ps->set_type != "BorderBlockedUp")isApply = false;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}break;
|
|
|
|
|
case ExtCfg::BorderSupport: {
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (ps->set_type != "BorderSupport" && ps->set_type != "SupportBorder" && ps->set_type != "BorderAdditionalSupport")isApply = false;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}break;
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (!isApply)
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
if (ps->set_type != "Hatching" && ps->set_type != "InHatching")
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-22 15:58:54 +08:00
|
|
|
|
|
2024-03-26 10:33:00 +08:00
|
|
|
|
BPBinary::BinDataBlock* pdb = job_meta_data->GetDataBlock(datablock);
|
|
|
|
|
if (!pdb)continue;
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (datablock->cno == 0)continue;
|
|
|
|
|
Scanner* scanner = scanMap[datablock->cno];
|
2024-03-26 10:33:00 +08:00
|
|
|
|
if (!scanner)continue;
|
2024-05-22 15:58:54 +08:00
|
|
|
|
|
2024-03-26 10:33:00 +08:00
|
|
|
|
BPBinary::BinDataBlock* pbindb = new BPBinary::BinDataBlock;
|
|
|
|
|
pdb->Copy(pbindb);
|
|
|
|
|
m_ModeTestDBS.push_back(pbindb);
|
|
|
|
|
|
|
|
|
|
MetaData::ParameterSet* newParam = new MetaData::ParameterSet();
|
|
|
|
|
newParam->laser_speed = speed;
|
|
|
|
|
newParam->laser_set->laser_diameter = ps->laser_set->laser_diameter;
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (m_ExtCfg->m_model_scan_mode == 1)
|
|
|
|
|
{
|
|
|
|
|
newParam->laser_set->laser_power = 1.0;
|
|
|
|
|
newParam->laser_set->laser_real_power = 1.0;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
newParam->laser_set->laser_power = power;
|
|
|
|
|
newParam->laser_set->laser_real_power = scanner->GetConfig()->m_ScanCfgWrapper.m_PowerCompensateCfg.CalcPowerCompensate(power);
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-26 10:33:00 +08:00
|
|
|
|
params.push_back(newParam);
|
2024-05-22 15:58:54 +08:00
|
|
|
|
scanner->AddDataBlock(pbindb, part, newParam, datablock->order, datablock->scanTime);
|
|
|
|
|
useScanner[datablock->cno] = scanner;
|
|
|
|
|
}
|
|
|
|
|
for (size_t i = 0; i < m_scan.size(); i++)
|
|
|
|
|
{
|
|
|
|
|
m_scan[i]->SetAutoUpdateScanInfo(false);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
Sleep(300);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
Scanner::ResetScaningLimit();
|
|
|
|
|
for (auto scanner : useScanner)
|
|
|
|
|
scanner.second->BeginWork();
|
|
|
|
|
|
|
|
|
|
for (auto scanner : useScanner)
|
|
|
|
|
scanner.second->WaitFinish();
|
|
|
|
|
|
|
|
|
|
Scanner::ResetScaningLimit();
|
|
|
|
|
for (size_t i = 0; i < params.size(); i++) {
|
|
|
|
|
delete params[i];
|
|
|
|
|
}
|
|
|
|
|
params.clear();
|
|
|
|
|
for (size_t i = 0; i < m_ModeTestDBS.size(); i++) {
|
|
|
|
|
delete m_ModeTestDBS[i];
|
|
|
|
|
}
|
|
|
|
|
m_ModeTestDBS.clear();
|
2024-05-22 15:58:54 +08:00
|
|
|
|
for (size_t i = 0; i < m_scan.size(); i++)
|
|
|
|
|
{
|
|
|
|
|
m_scan[i]->SetAutoUpdateScanInfo(true);
|
|
|
|
|
}
|
2024-03-26 10:33:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DWORD WINAPI ScannerCtrl::ReleasePressureProc(thisClass* _this)
|
|
|
|
|
{
|
|
|
|
|
if (_this) {
|
|
|
|
|
_this->m_IOCfgWrapper->SetSystemCtrlPressure(false);
|
|
|
|
|
Sleep(100);
|
|
|
|
|
uint64_t tflag = GetTickCount64();
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (_this->m_IOCfgWrapper->m_PressureRelease)_this->m_IOCfgWrapper->m_PressureRelease->SetActive(true);
|
|
|
|
|
else _this->m_IOCfgWrapper->m_PrintAirEvacuation->SetActive(true);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
while (true && _this->m_PressureCtrlFlag) {
|
|
|
|
|
|
|
|
|
|
uint64_t tnow = GetTickCount64();
|
2024-05-28 13:28:07 +08:00
|
|
|
|
if ((tnow - tflag) > (_this->m_RunCfg->m_ReleasePressureSeconds->GetValue() * 1000)) {
|
2024-03-26 10:33:00 +08:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-28 13:28:07 +08:00
|
|
|
|
if (g_SystemInfo->m_EnvState.m_PrintPressureAnalog <= _this->m_RunCfg->m_ReleasePressureTargeValue->GetValue()) {
|
2024-03-26 10:33:00 +08:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
Sleep(500);
|
|
|
|
|
}
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (_this->m_IOCfgWrapper->m_PressureRelease)_this->m_IOCfgWrapper->m_PressureRelease->SetActive(false);
|
|
|
|
|
else _this->m_IOCfgWrapper->m_PrintAirEvacuation->SetActive(false);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
CloseHandle(_this->m_PressureThread);
|
|
|
|
|
_this->m_PressureThread = INVALID_HANDLE_VALUE;
|
|
|
|
|
_this->m_IOCfgWrapper->SetSystemCtrlPressure(true);
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool ScannerCtrl::IsHeatingScannerEnable()
|
|
|
|
|
{
|
|
|
|
|
bool rel = false;
|
|
|
|
|
for (size_t scanIndex = 0; scanIndex < m_scan.size(); ++scanIndex) {
|
|
|
|
|
Scanner* scanner = m_scan[scanIndex];
|
|
|
|
|
|
2024-05-15 13:38:34 +08:00
|
|
|
|
if (scanner && scanner->GetConfig() && scanner->GetConfig()->m_ScanCfgWrapper.m_ScanTestCfg.m_IsAutoHeatingScanner)
|
2024-03-26 10:33:00 +08:00
|
|
|
|
{
|
|
|
|
|
rel = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return rel;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void ScannerCtrl::StartHeatingMotion()
|
|
|
|
|
{
|
|
|
|
|
if (!m_IOCfgWrapper->m_Heating) return;
|
2024-05-28 13:28:07 +08:00
|
|
|
|
if (!m_RunCfg->m_UseHeatingMotion->GetValue())return;
|
2024-03-26 10:33:00 +08:00
|
|
|
|
if (BaseCtrl::IsStart())return;
|
|
|
|
|
if (BaseCtrl::IsPause())return;
|
|
|
|
|
if (BaseCtrl::IsStop())return;
|
|
|
|
|
if (m_HeatingMotionThread != INVALID_HANDLE_VALUE)return;
|
|
|
|
|
m_HeatingMotionFlag = true;
|
|
|
|
|
m_HeatingMotionThread = AtlCreateThread(HeatingMotionProc, this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScannerCtrl::StopHeatingMotion(bool iswait)
|
|
|
|
|
{
|
|
|
|
|
m_HeatingMotionFlag = false;
|
|
|
|
|
if (iswait) {
|
|
|
|
|
while (true) {
|
|
|
|
|
if (m_HeatingMotionThread == INVALID_HANDLE_VALUE) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
Sleep(200);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DWORD WINAPI ScannerCtrl::HeatingMotionProc(ScannerCtrl* _this)
|
|
|
|
|
{
|
|
|
|
|
if (_this) {
|
|
|
|
|
_this->HeatingMotionRun();
|
|
|
|
|
CloseHandle(_this->m_HeatingMotionThread);
|
|
|
|
|
_this->m_HeatingMotionThread = INVALID_HANDLE_VALUE;
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScannerCtrl::HeatingMotionRun()
|
|
|
|
|
{
|
|
|
|
|
uint64_t tflag = GetTickCount64();
|
|
|
|
|
Sleep(500);
|
|
|
|
|
while (m_HeatingMotionFlag) {
|
|
|
|
|
int count = 0;
|
2024-05-28 13:28:07 +08:00
|
|
|
|
while (m_HeatingMotionFlag && count < 10 && m_RunCfg->m_UseHeatingMotion->GetValue()) {
|
2024-03-26 10:33:00 +08:00
|
|
|
|
Sleep(100);
|
|
|
|
|
count++;
|
|
|
|
|
}
|
2024-05-28 13:28:07 +08:00
|
|
|
|
if (!m_HeatingMotionFlag || !m_RunCfg->m_UseHeatingMotion->GetValue() || !m_IOCfgWrapper->m_Heating->IsActive()) {
|
2024-03-26 10:33:00 +08:00
|
|
|
|
m_HeatingMotionFlag = false;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (BaseCtrl::IsStart()) {
|
|
|
|
|
m_HeatingMotionFlag = false;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (m_MachineCtrl->IsCovering())continue;
|
|
|
|
|
uint64_t tnow = GetTickCount64();
|
2024-05-28 13:28:07 +08:00
|
|
|
|
if (tnow - tflag > (m_RunCfg->m_HeatingMotionPeriodSecond->GetValue() * 1000))
|
2024-03-26 10:33:00 +08:00
|
|
|
|
{
|
2024-05-28 13:28:07 +08:00
|
|
|
|
m_MachineCtrl->MoldMoveDown(m_RunCfg->m_HeatingMotionDistance->GetValue(),true);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
Sleep(500);
|
2024-05-28 13:28:07 +08:00
|
|
|
|
m_MachineCtrl->MoldMoveUp(m_RunCfg->m_HeatingMotionDistance->GetValue(),true);
|
2024-03-26 10:33:00 +08:00
|
|
|
|
Sleep(500);
|
|
|
|
|
tflag = tnow;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScannerCtrl::RemoveScanner(int seq)
|
|
|
|
|
{
|
|
|
|
|
for (vector<Scanner*>::iterator it = m_scan.begin(); it != m_scan.end();) {
|
|
|
|
|
Scanner* s = (*it);
|
|
|
|
|
if (s->GetConfig()->m_SeqNo == seq)
|
|
|
|
|
{
|
|
|
|
|
delete s;
|
|
|
|
|
it = m_scan.erase(it);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
it++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//void ScannerCtrl::DrawFinishReport()
|
|
|
|
|
//{
|
|
|
|
|
// if (!m_ShowFinishReport)return;
|
|
|
|
|
//
|
|
|
|
|
// if (m_RemoteClient->IsNeedSendFinish())
|
|
|
|
|
// {
|
|
|
|
|
// time_t tnow;
|
|
|
|
|
// time(&tnow);
|
|
|
|
|
// if (tnow - m_LastSendFinishReportTime > 5) {
|
|
|
|
|
// m_RemoteClient->SendStateChangeMsg();
|
|
|
|
|
// m_LastSendFinishReportTime = tnow;
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// ImGui::OpenPopup(_(u8"打印报告").c_str());
|
|
|
|
|
// if (ImGui::BeginPopupModal(_(u8"打印报告").c_str(), NULL, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize)) {
|
|
|
|
|
// ImGui::Text(_(u8"任务 %s 已打印完成").c_str(), m_job_controller->GetJob()->GetJobTitle().c_str());
|
|
|
|
|
// ImGui::Text(_(u8"任务开始时间:%s").c_str(), TimeHelper::Time2Str(m_job_controller->GetJob()->GetJobbean()->m_StartTime).c_str());
|
|
|
|
|
// ImGui::Text(_(u8"任务结束时间:%s").c_str(), TimeHelper::Time2Str(m_job_controller->GetJob()->GetJobbean()->m_StopTime).c_str());
|
|
|
|
|
// int ss = m_job_controller->GetJob()->GetJobbean()->m_StopTime - m_job_controller->GetJob()->GetJobbean()->m_StartTime;
|
|
|
|
|
// int h = ss / 60 / 60;
|
|
|
|
|
// int m = (ss / 60) % 60;
|
|
|
|
|
// ImGui::Text(_(u8"耗时:%d小时%d分钟").c_str(), h, m);
|
|
|
|
|
//
|
|
|
|
|
// m_PurifierClient->DrawFinishReportRel();
|
|
|
|
|
// int ft = m_PurifierClient->GetFilterUseTime();
|
|
|
|
|
// if (ft > m_RunCfg->m_PurifierFilterNotifyHour) {
|
|
|
|
|
// ImGui::TextColored(Toast::COLOR_ORANGE, _(u8"注意:滤芯已使用%d小时").c_str(), ft);
|
|
|
|
|
// }
|
|
|
|
|
// ImGui::Separator();
|
|
|
|
|
// if (ImGui::Button(_(u8"确定").c_str(), ImVec2(120, 0))) {
|
|
|
|
|
// BaseCtrl::SetStandBy();
|
|
|
|
|
// m_RemoteClient->SetNeedSendAlarm(false);
|
|
|
|
|
// m_ShowFinishReport = false;
|
|
|
|
|
// m_job_controller->GetJob()->GetJobbean()->m_StopTime = 0;
|
|
|
|
|
// m_job_controller->GetJob()->GetJobbean()->m_IsFinished = false;
|
|
|
|
|
// ImGui::CloseCurrentPopup();
|
|
|
|
|
// }
|
|
|
|
|
// ImGui::EndPopup();
|
|
|
|
|
// }
|
2024-05-09 12:49:18 +08:00
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void ScannerCtrl::CallFunc(const ReadData& rd) {
|
|
|
|
|
|
2024-05-22 15:58:54 +08:00
|
|
|
|
FUNCNAME func = (FUNCNAME)ConverType::TryToI(rd.nameKey);
|
2024-05-09 12:49:18 +08:00
|
|
|
|
switch (func) {
|
|
|
|
|
case BEGINWORK:
|
|
|
|
|
BeginWork();
|
|
|
|
|
break;
|
|
|
|
|
case PAUSEWORK:
|
|
|
|
|
PauseWork();
|
|
|
|
|
break;
|
|
|
|
|
case PAUSEAUTO:
|
|
|
|
|
PauseAuto();
|
|
|
|
|
break;
|
|
|
|
|
case STOPWORK:
|
|
|
|
|
StopWork();
|
|
|
|
|
break;
|
|
|
|
|
case STOPREDTEST:
|
|
|
|
|
StopRedTest();
|
|
|
|
|
break;
|
|
|
|
|
case TESTLAYER:
|
|
|
|
|
TestLayer();
|
|
|
|
|
break;
|
|
|
|
|
case REMOVESCANNER:
|
2024-05-22 15:58:54 +08:00
|
|
|
|
RemoveScanner(ConverType::TryToI(rd.strValue));
|
2024-05-09 12:49:18 +08:00
|
|
|
|
break;
|
|
|
|
|
case STARTHEATINGMOTION:
|
|
|
|
|
StartHeatingMotion();
|
|
|
|
|
break;
|
|
|
|
|
case STOPHEATINGMOTION:
|
2024-05-22 15:58:54 +08:00
|
|
|
|
StopHeatingMotion((bool)ConverType::TryToI(rd.strValue));
|
2024-05-09 12:49:18 +08:00
|
|
|
|
break;
|
2024-05-15 13:38:34 +08:00
|
|
|
|
case STARTDEBUGTEST:
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (!ConverType::IsToI(rd.strValue) || ConverType::TryToI(rd.strValue) >= m_scan.size()) {
|
|
|
|
|
printf("%d index is out of range...\n",__LINE__);
|
|
|
|
|
break;
|
|
|
|
|
}
|
2024-05-15 13:38:34 +08:00
|
|
|
|
m_scan[stoi(rd.strValue)]->StartDebugTest();
|
|
|
|
|
break;
|
|
|
|
|
case STOPDEBUGTEST:
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (!ConverType::IsToI(rd.strValue) || ConverType::TryToI(rd.strValue) >= m_scan.size()) {
|
|
|
|
|
printf("%d index is out of range...\n", __LINE__);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
m_scan[ConverType::TryToI(rd.strValue)]->StopDebugTest();
|
2024-05-15 13:38:34 +08:00
|
|
|
|
break;
|
|
|
|
|
case STARTHEATINGSCANNERTEST:
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (!ConverType::IsToI(rd.strValue) || ConverType::TryToI(rd.strValue) >= m_scan.size()) {
|
|
|
|
|
printf("%d index is out of range...\n", __LINE__);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
m_scan[ConverType::TryToI(rd.strValue)]->StartHeatingScannerTest();
|
2024-05-15 13:38:34 +08:00
|
|
|
|
break;
|
|
|
|
|
case STOPHEATINGSCANNERTEST:
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (!ConverType::IsToI(rd.strValue) || ConverType::TryToI(rd.strValue) >= m_scan.size()) {
|
|
|
|
|
printf("%d index is out of range...\n", __LINE__);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
m_scan[ConverType::TryToI(rd.strValue)]->StopHeatingScannerTest();
|
2024-05-15 13:38:34 +08:00
|
|
|
|
break;
|
|
|
|
|
case STARTGETSCANINFO:
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (!ConverType::IsToI(rd.strValue) || ConverType::TryToI(rd.strValue) >= m_scan.size()) {
|
|
|
|
|
printf("%d index is out of range...\n", __LINE__);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
m_scan[ConverType::TryToI(rd.strValue)]->StartGetScanInfo();
|
2024-05-15 13:38:34 +08:00
|
|
|
|
break;
|
|
|
|
|
case STOPGETSCANINFO:
|
2024-05-22 15:58:54 +08:00
|
|
|
|
if (!ConverType::IsToI(rd.strValue) || ConverType::TryToI(rd.strValue) >= m_scan.size()) {
|
|
|
|
|
printf("%d index is out of range...\n", __LINE__);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
m_scan[ConverType::TryToI(rd.strValue)]->StopGetScanInfo();
|
2024-05-15 13:38:34 +08:00
|
|
|
|
break;
|
2024-05-09 12:49:18 +08:00
|
|
|
|
default:
|
|
|
|
|
printf("参数不对...\n");
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-15 13:38:34 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ScannerCtrl::SendToClients() {
|
|
|
|
|
list<Item> lst;
|
2024-05-15 17:59:04 +08:00
|
|
|
|
lst.emplace_back(Item{ "IsTestLayerEnable", to_string(IsTestLayerEnable()), iBOOL });
|
|
|
|
|
lst.emplace_back(Item{ "IsHeatingScannerEnable", to_string(IsHeatingScannerEnable()), iBOOL });
|
|
|
|
|
lst.emplace_back(Item{ "InitErrorInfos", GetInitErrorInfos(), iSTRING });
|
2024-05-15 13:38:34 +08:00
|
|
|
|
int count = m_scan.size();
|
|
|
|
|
lst.emplace_back(Item{ "ScanCount", to_string(count), iINT});
|
|
|
|
|
for (int i = 0; i < count; ++i) {
|
|
|
|
|
lst.emplace_back(Item{ "IsDebugEnable_"+to_string(i), to_string(m_scan[i]->IsDebugEnable()), iBOOL});
|
|
|
|
|
lst.emplace_back(Item{ "IsHeatingScannerTest_"+to_string(i), to_string(m_scan[i]->IsHeatingScannerTest()), iBOOL});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
auto iter = Scanner::m_CurrentSerio.begin();
|
|
|
|
|
while (iter != Scanner::m_CurrentSerio.end()) {
|
|
|
|
|
lst.emplace_back(Item{ to_string(iter->first), to_string(iter->second), iUINT });
|
|
|
|
|
++iter;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ClientWrapper::Instance()->PushAllClient(WriteData(SCANCTRLPARAM,lst));
|
2024-05-22 15:58:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void ScannerCtrl::StopWorkManual()
|
|
|
|
|
{
|
|
|
|
|
if (m_StopFlag)return;
|
|
|
|
|
m_StopFlag = true;
|
|
|
|
|
m_StopThread = AtlCreateThread(StopWorkProc, this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DWORD WINAPI ScannerCtrl::StopWorkProc(ScannerCtrl* _this)
|
|
|
|
|
{
|
|
|
|
|
if (_this) {
|
|
|
|
|
_this->m_StopMsg = "";
|
|
|
|
|
SignalService::GetInstance().ResetRelateCoverAlarm();
|
|
|
|
|
if (!_this->m_job_controller || !_this->m_job_controller->GetJob()) {
|
|
|
|
|
ToastBean* bean = new ToastBean(g_LngManager->Toast_NoStopTask->ShowText(), 3000);
|
|
|
|
|
g_Toast->AddToast(bean);
|
|
|
|
|
_this->m_StopMsg = g_LngManager->Toast_NoStopTask->ShowText();
|
|
|
|
|
CloseHandle(_this->m_StopThread);
|
|
|
|
|
_this->m_StopThread = INVALID_HANDLE_VALUE;
|
|
|
|
|
_this->m_StopFlag = false;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
_this->m_job_controller->GetJob()->m_IsAutoCtrl = false;
|
|
|
|
|
g_SystemInfo->m_AutoPrintCtrlState = NoAuto;
|
|
|
|
|
BaseCtrl::SetPauseState(BaseCtrl::NoPause);
|
|
|
|
|
|
|
|
|
|
if (BaseCtrl::IsStandBy()) {
|
|
|
|
|
BaseCtrl::SetState(BaseCtrl::STOP);
|
|
|
|
|
_this->m_job_controller->GetJob()->SetStartIndex(0);
|
|
|
|
|
_this->m_job_controller->GetJob()->GetJobbean()->m_IsContinue = false;
|
|
|
|
|
_this->CtrlWhenStop();
|
|
|
|
|
_this->m_job_controller->GetJob()->UpdateJobBeanWhenStop();
|
|
|
|
|
BaseCtrl::SetState(BaseCtrl::STANDBY_STOP);
|
|
|
|
|
CloseHandle(_this->m_StopThread);
|
|
|
|
|
_this->m_StopThread = INVALID_HANDLE_VALUE;
|
|
|
|
|
_this->m_StopFlag = false;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BaseCtrl::SetState(BaseCtrl::STOP);
|
|
|
|
|
for (size_t i = 0; i < _this->m_scan.size(); i++) {
|
|
|
|
|
_this->m_scan[i]->StopWork();
|
|
|
|
|
}
|
|
|
|
|
BaseCtrl::SetPreState(BaseCtrl::NonePre);
|
|
|
|
|
g_Toast->AddToast(new ToastBean(g_LngManager->Toast_StoppingTask->ShowText(), 3000, Toast::COLOR_ORANGE));
|
|
|
|
|
g_log->TraceKeyInfo(g_LngManager->Toast_StoppingTask->ShowText());
|
|
|
|
|
|
|
|
|
|
CloseHandle(_this->m_StopThread);
|
|
|
|
|
_this->m_StopThread = INVALID_HANDLE_VALUE;
|
|
|
|
|
_this->m_StopFlag = false;
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
2024-05-09 12:49:18 +08:00
|
|
|
|
}
|