MSG msg; 在MFC项目中的具体实际应用

问题描述:

我在项目是 当我点击了 加工按钮后,程序运行,此时接收到了安全回路被触发,然后我想点击界面上的停止按钮,无法点击,此时程序处于假死的状态,一直在运行我项目中的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;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值