问题描述:
我在项目是 当我点击了 加工按钮后,程序运行,此时接收到了安全回路被触发,然后我想点击界面上的停止按钮,无法点击,此时程序处于假死的状态,一直在运行我项目中的while循环,导致我无法进行其他操作。
代码如下:
//
if (CheckInputByObjectName(_T("光栅触发安全回路")) || CheckInputByObjectName(_T("安全门触发安全回路")) || CheckInputByObjectName(_T("设备急停")))
{
AfxMessageBox(_T("非调试状态下---触发了安全回路,请按复位按钮"));
while (!m_bWorkstationStopFlag)
{
MSG msg;
if (PeekMessage(&msg, (HWND)NULL, 0, 0, PM_REMOVE))
{
::SendMessage(msg.hwnd, msg.message, msg.wParam, msg.lParam);
}
// 收到设备复位信号,表示 解除了安全回路触发
if (CheckInputByObjectName(_T("设备复位")))
{
if (CheckInputByObjectName(_T("光栅触发安全回路")) || CheckInputByObjectName(_T("安全门触发安全回路")) || CheckInputByObjectName(_T("设备急停")))
{
AfxMessageBox(_T("非调试状态下---又一次触发了安全回路,请按复位按钮"));
}
else
{
//轴上使能
for (int i = 0; i < 8; i++)
{
m_ctrlGTS800Card.AxisOffGTS800Device(i + 1);
}
Sleep(2000);
for (int i = 0; i < 8; i++)
{
m_ctrlGTS800Card.AxisOnGTS800Device(i + 1);
}
m_bDeviceEmergencyStopFlag = false;
pDlg->m_DlgCoordinate2PathShow.OnBnClickedButton1(); //设备状态清除按钮
break;
}
}
}
//
if (m_bWorkstationStopFlag)
{
AfxMessageBox(_T("接收到了 手动停止标志"));
return;
}
}
//检查设备归零是否成功
{
if (!m_bWorkReturnZeroFlag)
{
AfxMessageBox(_T("请重新归零---当前为非调试状态下"));
return;
}
}
//
如果上边的程序中没有MSG msg;那几行代码,就会出现问题,无法进行其他操作。
MSG msg;
if (PeekMessage(&msg, (HWND)NULL, 0, 0, PM_REMOVE))
{
::SendMessage(msg.hwnd, msg.message, msg.wParam, msg.lParam);
}
在 UINT ThreadCheckBoot(LPVOID hWnd) 线程中的操作如下:
UINT ThreadCheckBoot(LPVOID hWnd)
{
THREAD_INFO* pThreadInfo = (THREAD_INFO*)hWnd;
pThreadInfo->bFlag = TRUE;
//
long lvalue = 0;
bool bflag = false;
bool bflag2 = false;
//
bool bLightFlag = false;
//
bool bTimeFlag = false;
//
bool protectDoorStopFlag = false;
//
while (pThreadInfo->bFlag)
{
if (pDlg->m_bLsWelderChk)
{
pThreadInfo->bFlag = FALSE;
pDlg->PostMessage(THREAD_AUTO_START_MARK, 0, 0);
}
else
{
if (pDlg->CheckInputByObjectName(_T("设备停止")))
{
pDlg->DeviceAlarmStatus();
AfxMessageBox(_T("接收到停止信号"));
pThreadInfo->bFlag = FALSE;
pDlg->PostMessage(TECH_CHECK_AUTO_MARK_END1, 0, 0);
}
else if (!pDlg->IsDeviceAxisAlarmAndDisable())
{
pDlg->DeviceAlarmStatus();
AfxMessageBox(_T("接收到轴报警或轴掉使能信号"));
pThreadInfo->bFlag = FALSE;
pDlg->PostMessage(TECH_CHECK_AUTO_MARK_END1, 0, 0);
}
else if (pDlg->CheckWorkstationEmergencyStopSignal())
{
pDlg->DeviceAlarmStatus();
AfxMessageBox(_T("接收到急停信号"));
pThreadInfo->bFlag = FALSE;
pDlg->PostMessage(TECH_CHECK_AUTO_MARK_END1, 0, 0);
}
else if (pDlg->IsLaserAlarm())
{
pDlg->DeviceAlarmStatus();
AfxMessageBox(_T("接收到激光器报警信号"));
pThreadInfo->bFlag = FALSE;
pDlg->PostMessage(TECH_CHECK_AUTO_MARK_END1, 0, 0);
}
else if (pDlg->IsCoolWaterAlarm())
{
pDlg->DeviceAlarmStatus();
AfxMessageBox(_T("接收到冷水机报警信号"));
pThreadInfo->bFlag = FALSE;
pDlg->PostMessage(TECH_CHECK_AUTO_MARK_END1, 0, 0);
}
else
{
if (!pDlg->IsReceiveLightSignal())
{
if (!pDlg->IsReceiveDoorLockSignal())
{
bLightFlag = false;
bool bStartSignal1Flag = false;
bool bStartSignal2Flag = false;
//表示当前启用双路启动信号
if (pDlg->m_DeviceControlSelectItemPara.m_bEnableDoubleStartInpSignalChk)
{
if (pDlg->CheckInputByObjectName(_T("设备启动")))
{
/*if (pDlg->m_bEnableShowTooltipChk)
{
AfxMessageBox(_T("1---收到了设备启动 信号"));
}*/
if (bflag)
{
bStartSignal1Flag = true;
}
}
else
{
bflag = true;
}
if (pDlg->CheckInputByObjectName(_T("设备启动2")))
{
/*if (pDlg->m_bEnableShowTooltipChk)
{
AfxMessageBox(_T("2---收到了 设备启动2 信号"));
}*/
if (bflag2)
{
bStartSignal2Flag = true;
}
}
else
{
bflag2 = true;
}
}
//表示当前启用单路启动信号
else
{
if (pDlg->CheckInputByObjectName(_T("设备启动")))
{
if (bflag)
{
bStartSignal1Flag = true;
bStartSignal2Flag = true;
}
}
else
{
bflag = true;
}
}
//if (pDlg->CheckInputByObjectName(_T("设备启动")))
if(bStartSignal1Flag && bStartSignal2Flag)
{
//
if (pDlg->m_bEnableShowTooltipChk)
{
AfxMessageBox(_T("将要开始执行门关闭动作"));
}
if (!pDlg->ExcuteProtectDoorCloseOperation(protectDoorStopFlag)) // 保护门 关闭到位信号
{
return 0;
}
//
if (pDlg->m_bEnableShowTooltipChk)
{
AfxMessageBox(_T("将要 解除 安全回路屏蔽"));
}
Sleep(1000);
pDlg->OutputPortByObjectName(_T("安全回路屏蔽"),false); // 不屏蔽
//
if (pDlg->CheckInputByObjectName(_T("光栅触发安全回路")) || !pDlg->CheckInputByObjectName(_T("安全门触发安全回路")) || pDlg->CheckInputByObjectName(_T("设备急停")))
{
pDlg->DeviceAlarmStatus();
//关闭激光、关闭保护气
pDlg->CloseLaserQfGzOutput();
// 看到底是哪个信号
pDlg->IsSafeReturn();
pThreadInfo->bFlag = FALSE;
pDlg->PostMessage(TECH_CHECK_AUTO_MARK_END1, 0, 0);
}
//
if (bflag)
{
if (pDlg->m_bHaveGjFlag)
{
if (pDlg->CheckInputByObjectName(_T("有无工件")))
{
//
bool bRealtimeLoadDocSuccessFlag = false;
if (pDlg->m_ManMovePara.m_bEnableMultiDocTriggerMadeChk)
{
pDlg->RealtimeLoadActiveDoc(bRealtimeLoadDocSuccessFlag);
}
else
{
bRealtimeLoadDocSuccessFlag = true;
}
if (bRealtimeLoadDocSuccessFlag)
{
//
pDlg->m_bDeviceWeldingFlag = true;
pThreadInfo->bFlag = FALSE;
pDlg->PostMessage(THREAD_AUTO_START_MARK, 0, 0);
return 0;
}
else
{
AfxMessageBox(_T("当前多文档加载失败,请检查 配置参数 是否正确"));
}
}
else
{
bflag = false;
AfxMessageBox(_T("当前启用了检测 有无工件 功能,未检测到工件 ,无法加工,确认有工件后,再启动......"));
}
}
else
{
//
bool bRealtimeLoadDocSuccessFlag = false;
if (pDlg->m_ManMovePara.m_bEnableMultiDocTriggerMadeChk)
{
pDlg->RealtimeLoadActiveDoc(bRealtimeLoadDocSuccessFlag);
}
else
{
bRealtimeLoadDocSuccessFlag = true;
}
if (bRealtimeLoadDocSuccessFlag)
{
//
pDlg->m_bDeviceWeldingFlag = true;
pThreadInfo->bFlag = FALSE; //
pDlg->PostMessage(THREAD_AUTO_START_MARK, 0, 0); // <---
return 0;
}
else
{
AfxMessageBox(_T("当前多文档加载失败,请检查 配置参数 是否正确"));
}
}
}
}
}
else
{
pDlg->DeviceAlarmStatus();
AfxMessageBox(_T("当前门磁没有闭合,请检查"));
pDlg->DeviceRunStatus();
}
}
else
{
if (!bLightFlag)
{
bLightFlag = true;
}
}
}
}
//
Sleep(100);
}
return 0;
}
注意:在解除安全回路屏蔽后,要延时 1 秒,让硬件有个反应时间。
用到的一些函数实现如下:
void CWelderGuoDlg::CloseLaserQfGzOutput(void)
{
OutputPortByObjectName(_T("开关激光"), false);
if (pDlg->m_DeviceControlSelectItemPara.m_bEnableDoubleLaserChannelChk)
{
pDlg->OutputPortByObjectName(_T("开关激光2"), false);
}
OutputPortByObjectName(_T("保护气阀"), false);
if (pDlg->m_DeviceControlSelectItemPara.m_bEnableDoubleGasChannelChk)
{
pDlg->OutputPortByObjectName(_T("保护气阀2"), false);
}
pDlg->OutputPortByObjectName(_T("风刀阀"), false);
}
bool CWelderGuoDlg::IsSafeReturn()
{
if (CheckInputByObjectName(_T("光栅触发安全回路")) || CheckInputByObjectName(_T("安全门触发安全回路")) || CheckInputByObjectName(_T("设备急停")))
{
if (CheckInputByObjectName(_T("光栅触发安全回路")))
{
AfxMessageBox(_T("光栅触发安全回路 停止"));
return false;
}
if (CheckInputByObjectName(_T("安全门触发安全回路")))
{
AfxMessageBox(_T("安全门触发安全回路 停止"));
return false;
}
if (CheckInputByObjectName(_T("设备急停")))
{
AfxMessageBox(_T("设备急停 触发安全回路 停止"));
return false;
}
}
return true;
}
bool CWelderGuoDlg::ExcuteProtectDoorCloseOperation(bool& protectDoorStopFlag)
{
//===============================================================
if (pDlg->m_DeviceControlSelectItemPara.m_bEnableDoorControlChk)
{
if (pDlg->m_bEnableShowTooltipChk)
{
AfxMessageBox(_T("当前启用门控,开始执行门关闭"));
}
if (pDlg->m_DeviceControlSelectItemPara.m_bEnableDoubleProtectDoorChk)
{
//门关闭动作发生
pDlg->OutputPortByObjectName(_T("保护门开"), false);
pDlg->OutputPortByObjectName(_T("保护门关"), true);
//门关闭动作发生
pDlg->OutputPortByObjectName(_T("保护门开2"), false);
pDlg->OutputPortByObjectName(_T("保护门关2"), true);
}
else
{
//门关闭动作发生
pDlg->OutputPortByObjectName(_T("保护门开"), false);
pDlg->OutputPortByObjectName(_T("保护门关"), true);
}
//
if (pDlg->m_bEnableShowTooltipChk)
{
AfxMessageBox(_T("当前启用门控,等待门关闭到位"));
}
//
while (true)
{
//
MSG msg;
if (PeekMessage(&msg, (HWND)NULL, 0, 0, PM_REMOVE))
{
::SendMessage(msg.hwnd, msg.message, msg.wParam, msg.lParam);
}
//
if (pDlg->CheckInputByObjectName(_T("设备停止")) || pDlg->m_bWorkstationStopFlag)
{
if (pDlg->m_DeviceControlSelectItemPara.m_bEnableDoubleProtectDoorChk)
{
//门暂停
pDlg->OutputPortByObjectName(_T("保护门开"), false);
pDlg->OutputPortByObjectName(_T("保护门关"), false);
//门暂停
pDlg->OutputPortByObjectName(_T("保护门开2"), false);
pDlg->OutputPortByObjectName(_T("保护门关2"), false);
}
else
{
//门暂停
pDlg->OutputPortByObjectName(_T("保护门开"), false);
pDlg->OutputPortByObjectName(_T("保护门关"), false);
}
return false;
}
else
{
if (!protectDoorStopFlag)
{
if (pDlg->IsReceiveLightSignal())
{
pDlg->DeviceAlarmStatus();
if (pDlg->m_DeviceControlSelectItemPara.m_bEnableDoubleProtectDoorChk)
{
//门暂停
pDlg->OutputPortByObjectName(_T("保护门开"), false);
pDlg->OutputPortByObjectName(_T("保护门关"), false);
//门暂停
pDlg->OutputPortByObjectName(_T("保护门开2"), false);
pDlg->OutputPortByObjectName(_T("保护门关2"), false);
}
else
{
//门暂停
pDlg->OutputPortByObjectName(_T("保护门开"), false);
pDlg->OutputPortByObjectName(_T("保护门关"), false);
}
protectDoorStopFlag = true;
}
else
{
//检测门关闭是否到位
if (pDlg->m_DeviceControlSelectItemPara.m_bEnableDoubleProtectDoorChk)
{
if (pDlg->CheckInputByObjectName(_T("门关到位")) && !pDlg->CheckInputByObjectName(_T("门开到位")) && pDlg->CheckInputByObjectName(_T("门关到位2")) && !pDlg->CheckInputByObjectName(_T("门开到位2")))
{
break;
}
}
else
{
if (pDlg->CheckInputByObjectName(_T("门关到位")) && !pDlg->CheckInputByObjectName(_T("门开到位")))
{
break;
}
}
}
}
else
{
if (pDlg->CheckInputByObjectName(_T("设备启动")))
{
//
protectDoorStopFlag = false;
//门关闭动作发生
if (pDlg->m_DeviceControlSelectItemPara.m_bEnableDoubleProtectDoorChk)
{
pDlg->OutputPortByObjectName(_T("保护门开"), false);
pDlg->OutputPortByObjectName(_T("保护门关"), true);
pDlg->OutputPortByObjectName(_T("保护门开2"), false);
pDlg->OutputPortByObjectName(_T("保护门关2"), true);
}
else
{
pDlg->OutputPortByObjectName(_T("保护门开"), false);
pDlg->OutputPortByObjectName(_T("保护门关"), true);
}
//
}
}
}
}
}
else
{
if (pDlg->m_bEnableShowTooltipChk)
{
AfxMessageBox(_T("当前没有启用门控"));
}
}
//===============================================================
if (!pDlg->m_bWorkstationStopFlag)
{
/*if (pDlg->m_bEnableShowTooltipChk)
{
AfxMessageBox(_T("当前启用门控,门关闭到位正常"));
}*/
return true;
}
/*if (pDlg->m_bEnableShowTooltipChk)
{
AfxMessageBox(_T("当前启用门控,门关闭到位异常"));
}*/
return false;
}
bool CWelderGuoDlg::ExcuteProtectDoorOpenOperation()
{
if (!pDlg->m_DeviceControlSelectItemPara.m_bEnableDoorControlChk)
{
return true;
}
if (pDlg->m_DeviceControlSelectItemPara.m_bEnableDoubleProtectDoorChk)
{
//保护门开 动作
pDlg->OutputPortByObjectName(_T("保护门开"), true);
pDlg->OutputPortByObjectName(_T("保护门关"), false);
//保护门开 动作
pDlg->OutputPortByObjectName(_T("保护门开2"), true);
pDlg->OutputPortByObjectName(_T("保护门关2"), false);
}
else
{
//保护门开 动作
pDlg->OutputPortByObjectName(_T("保护门开"), true);
pDlg->OutputPortByObjectName(_T("保护门关"), false);
}
//
bool bDoorOpenOverTimeFlag = false;
//
DWORD dwStartTimeT = GetTickCount();
//
while (true)
{
//
MSG msg;
if (PeekMessage(&msg, (HWND)NULL, 0, 0, PM_REMOVE))
{
::SendMessage(msg.hwnd, msg.message, msg.wParam, msg.lParam);
}
//
bDoorOpenOverTimeFlag = false;
//
//检测保护门开 是否到位
if (pDlg->m_DeviceControlSelectItemPara.m_bEnableDoubleProtectDoorChk)
{
if (pDlg->CheckInputByObjectName(_T("门开到位")) && !pDlg->CheckInputByObjectName(_T("门关到位")) && pDlg->CheckInputByObjectName(_T("门开到位2")) && !pDlg->CheckInputByObjectName(_T("门关到位2")))
{
break;
}
}
else
{
if (pDlg->CheckInputByObjectName(_T("门开到位")) && !pDlg->CheckInputByObjectName(_T("门关到位")))
{
break;
}
}
//
if (GetTickCount() - dwStartTimeT >= 10000)
{
bDoorOpenOverTimeFlag = true;
break;
}
}
//
//
if (bDoorOpenOverTimeFlag)
{
AfxMessageBox(_T("保护门打开到位超时,出错!!!"));
return false;
}
return true;
}
启用双开门形式的保护门:(双门)
启用门控:(单门)
在焊接完成结束后要进行安全回路屏蔽:
pDlg->OutputPortByObjectName(_T("安全回路屏蔽"), true); // 屏蔽
//延时500ms
Sleep(500);
//
if (!ExcuteProtectDoorOpenOperation()) // 门开
{
return;
}
轴上使能的方法如下:
void CWelderGuoDlg::OnBnClickedEnableAllAxis()
{
//m_bWorkReturnZeroFlag = false;
// //m_ctrlGTS800Card.InitialSystemConfig();
//for (int i = 0; i < 8; i++)
//{
// m_ctrlGTS800Card.ClearStatusGTS800Device(i + 1);
//}
//Sleep(2000);
//for (int i = 0; i < 8; i++)
//{
// m_ctrlGTS800Card.AxisOnGTS800Device(i + 1);
//}
TODO: 在此添加控件通知处理程序代码
/// 轴上使能方法2: 推荐使用///
GetDlgItem(IDC_ENABLE_ALL_AXIS)->EnableWindow(0);
//先将使能断开,然后再上使能
for (int i = 0; i < 8; i++)
{
m_ctrlGTS800Card.AxisOffGTS800Device(i + 1);
}
Sleep(2000);
for (int i = 0; i < 8; i++)
{
m_ctrlGTS800Card.AxisOnGTS800Device(i + 1);
}
m_bDeviceEmergencyStopFlag = false;
m_bWorkReturnZeroFlag = false;
pDlg->m_DlgCoordinate2PathShow.OnBnClickedButton1(); //设备状态清除按钮
GetDlgItem(IDC_ENABLE_ALL_AXIS)->EnableWindow(1);
//
}
保护门开:
void CWelderGuoDlg::OnBnClickedBtnProtectDoorOpen()
{
// TODO: 在此添加控件通知处理程序代码
if (m_bDeviceRunningFlag)
{
AfxMessageBox(_T("当前设备处于运行状态,请停止后,再执行!"));
return;
}
//
if (!(MessageBox(_T("是否要打开保护门?"), _T("提示"), MB_YESNO) == IDYES))
{
return;
}
//
if (!ExcuteProtectDoorOpenOperation()) // 门开
{
AfxMessageBox(_T("执行 保护门开 失败"));
return;
}
}