You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
TwoLaserHead-PushJig/LaiPuLaser/Program_SZ_XL_TrackWorkFlow...

1850 lines
42 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "StdAfx.h"
#include "Program_SZ_XL_TrackWorkFlow.h"
#include "GlobalFunction.h"
#include "CommonFlowMgr.h"
#include "ProductMgr.h"
#include "ProgramCutMgr.h"
#include "WorkCmdContainer.h"
#include "Program_SZ_XL.h"
#include "MotionCard_PCI1245.h"
#include "WorkCmdMoveMotor.h"
#include "WorkCmdInvoker.h"
#include "WorkCmdWaitMotorStop.h"
#include "WorkCmdSetMotorSpeed.h"
#include "ObjComponentMgr.h"
#include "LogMgr.h"
#include "MsgBox.h"
#include "WorkTime.h"
#include "FileMgr.h"
#include "Motor.h"
#include "ClientMgr.h"
#include "SocketMgr.h"
#include <thread>
#define PLC_READ_MSG_LEN 12 //接收PLC 数据的长度(字节)
#define TRACK_NAME_1 "轨道1"
#define TRACK_NAME_2 "轨道2"
int gStopTimes = 0;
//当前锁定的轨道
ETrackType gCurLockTrackType = _ETrackType_NULL;
CTrackWorkFlow gTrackWorkFlow1(TRACK_NAME_1);//轨道1 的流程管理
CTrackWorkFlow gTrackWorkFlow2(TRACK_NAME_2);//轨道2 的流程管理
#define TRACK1_RECORD_FILE "\\CutPar\\TrackRecord1.txt"
#define TRACK2_RECORD_FILE "\\CutPar\\TrackRecord2.txt"
CCommPortMgr CTrackWorkFlow::m_TrackCOM;//通信用的串口管理
//工作流程控制线程(无限循环)
UINT WorkFlowCtrlThread(LPVOID pParam)
{
CTrackWorkFlow *WorkFlow = (CTrackWorkFlow *)pParam;
WorkFlow->WorkFlowCtrl();
return 0;
}
//读取plc 消息的线程(无限循环)
UINT ReadPlcMsgThread(LPVOID pParam)
{
CTrackWorkFlow *WorkFlow = (CTrackWorkFlow *)pParam;
WorkFlow->ReadPlcMsg();
return 0;
}
//执行一个步骤的线程(执行一次)
UINT ExecuteStepThread(LPVOID pParam)
{
AfxSocketInit();
CTrackWorkFlow *WorkFlow = (CTrackWorkFlow *)pParam;
WorkFlow->ExecuteCurStep();
return 0;
}
CTrackWorkFlow::CTrackWorkFlow(CString Name)
{
m_TrackName = Name;
m_ProductIdx = 0;//轨道对应产品工位的编号
//轨道的类型
if (m_TrackName == TRACK_NAME_1)
m_TrackType = _ETrackType_Track_1;
else
m_TrackType = _ETrackType_Track_2;
m_ComPort = 1;//通信用串口号
m_ComBaudRate = 115200;//通信用波特率
SetCurTrackWorkStep(_ETrack_Step_Stop);//当前的工作步骤
m_OldWorkStep = _ETrack_Step_Stop;//之前的工作步骤
m_bStopReadMsg = false;//是否暂停读取plc 消息
m_bAutoWorking = false;//是否在自动加工
m_bLoadProduct = false;//轨道上是否load 了产品
m_ReadMsgDelay = 200;
m_CutProductCnt = 0;//切割产品的数量
m_bCircleStop = false;//当前循环后停止
}
CTrackWorkFlow::~CTrackWorkFlow(void)
{
}
//设置串口参数
void CTrackWorkFlow::SetComPar(int Port, int BaudRate)
{
m_ComPort = Port;//通信用串口号
m_ComBaudRate = BaudRate;//通信用波特率
}
#if 1
//启动工作流程管理
void CTrackWorkFlow::WorkFlowStart(bool bOpenCom /*= true*/)
{
//启动WorkFlow 控制线程
AfxBeginThread(WorkFlowCtrlThread, this);
//打开plc 通信用串口
if (bOpenCom&&m_TrackCOM.Open(m_ComPort, m_ComBaudRate))
{
//启动读取plc 消息的线程
AfxBeginThread(ReadPlcMsgThread, this);
}
else
{
CString LogStr;
LogStr.Format(_T("TrackCOM %d 打开失败"), m_ComPort);
gLogMgr->WriteDebugLog(LogStr);
}
}
//工作流程控制
void CTrackWorkFlow::WorkFlowCtrl()
{
while (!gExitApp)
{
if (gExitApp)
return;
Sleep(200);
if (m_CurWorkStep == m_OldWorkStep)//无变化
continue;
/*//进入下料函数,设置 步骤为_ETrack_Step_Unload时,不执行
if (m_OldWorkStep == _ETrack_Step_Throw_Edge_End&&m_CurWorkStep == _ETrack_Step_Unload)
{
m_OldWorkStep = m_CurWorkStep;//记录当前步骤
continue;
}*/
if (m_OldWorkStep == _ETrack_Step_Unload)//unload 结束步骤时
{
//取消下料请求
CancelUnloadRequest();
gStopTimes = 0;
}
m_OldWorkStep = m_CurWorkStep;//记录当前步骤
//在新线程中执行
if (m_CurWorkStep== _ETrack_Step_Throw_Edge_End)
m_pthread = AfxBeginThread(ExecuteStepThread, this); //m_pthread只记录下料
else
AfxBeginThread(ExecuteStepThread, this);
}
}
//执行当前步骤
void CTrackWorkFlow::ExecuteCurStep()
{
if (gExitApp)
return;
switch (m_CurWorkStep)
{
case _ETrack_Step_Load_End://上料完成
MoveToWaitPos();//移动到等待位置
break;
case _ETrack_Step_Mark_Waiting://等待加工
CatchMarkNewly();//抓取定位
break;
case _ETrack_Step_Catch_mark_End://等待加工
MarkProcess();//尝试启动加工
break;
case _ETrack_Step_Mark_End://加工完成
ThrowEdge();//去边框
break;
case _ETrack_Step_Throw_Edge_End://去边框完成
UnLoad();//下料
break;
case _ETrack_Step_Unload_End://下料完成
Load();//上料
break;
case _ETrack_Step_Load_Err://下料错误
{
auto fErr = [&] {
gTrackWorkFlow1.RadAlamOnOff(true);
AfxMessageBox("下料错误,请检查治具!");
gTrackWorkFlow1.RadAlamOnOff(false);
};
thread t1(fErr);
t1.detach();
//解除锁定
if (m_TrackType == gCurLockTrackType)
gCurLockTrackType = _ETrackType_NULL;
//退出自动状态
StopAutoWork();
}
case _ETrack_Step_Catch_mark_Err://抓取定位错误
case _ETrack_Step_Mark_Err://切割过程错误
case _ETrack_Step_Unload_Err://下料错误
case _ETrack_Step_Throw_Edge_Err://去边框错误
{
//解除锁定
if (m_TrackType == gCurLockTrackType)
gCurLockTrackType = _ETrackType_NULL;
//退出自动状态
StopAutoWork();
}
break;
default:
break;
}
}
void CTrackWorkFlow::SetCurTrackWorkStep(ETrackWorkStep Step)
{
if (m_CurWorkStep == _ETrack_Step_Load || m_CurWorkStep == _ETrack_Step_Throw_Edge)
{
if (Step == _ETrack_Step_Unload_End)
{
gLogMgr->WriteDebugLog("Canot Set Track_Step_Unload_End");
return;
}
}
m_CurWorkStep = Step;
}
#endif
#if 1
//启动自动加工
bool CTrackWorkFlow::StartAutoWork()
{
if (m_bAutoWorking)
{
if (m_CurWorkStep == _ETrack_Step_Unload)
{
if (gStopTimes < gProgram_SZ_XL->GetStopStepUnloadTimes())//连续点n 次可以强制停止
{
CMsgBox MsgBox;
MsgBox.Show("下料未完成不能停止!");
CString str;
str.Format("StopTimes = %ld", gStopTimes);
gLogMgr->WriteDebugLog(str);
gStopTimes++;
return false;
}
}
//停止自动加工
StopAutoWork();
return true;
}
gStopTimes = 0;//重新计数
//检测是否有定位mark
Dbxy MarkPt1;
Dbxy MarkPt2;
if (!gObjComponentMgr->GetTwoMarkPt(MarkPt1, MarkPt2))//获取定位点
{
CMsgBox MsgBox;
MsgBox.Show("没有加工图形!");
return false;
}
//设置自动运行状态
m_bAutoWorking = true;
if (gProgram_SZ_XL->IsbAutoWorkMode())//半自动模式不要自动开始
{
//如果load 了产品
/*if (m_bLoadProduct)
{*/
CMsgBox MsgBox;
if (MsgBox.ConfirmOkCancel("确定:继续切割,取消:重新上料"))
SetCurTrackWorkStep(_ETrack_Step_Mark_Waiting);
else
SetCurTrackWorkStep(_ETrack_Step_Unload_End);
/*}
else
{
SetCurTrackWorkStep(_ETrack_Step_Unload_End);//直接上料
}*/
}
else
{
SetCurTrackWorkStep(_ETrack_Step_Load);
}
CString Log = m_TrackName + " 开始自动运行";
gLogMgr->WriteDebugLog(Log);
return true;
}
//停止自动加工
void CTrackWorkFlow::StopAutoWork()
{
CString Log = m_TrackName + " 停止自动运行";
gLogMgr->WriteDebugLog(Log);
m_bAutoWorking = false;
SetCurTrackWorkStep(_ETrack_Step_Stop);
//取消下料请求
CancelUnloadRequest();
if ((!gTrackWorkFlow1.m_bAutoWorking)&&(!gTrackWorkFlow2.m_bAutoWorking))
{
SendMsgToPlc(_ETrack_PlcCmd_Auto_End, false);
}
}
#endif
#if 1
//手动操作
void CTrackWorkFlow::ManualOperation(ETrackWorkStep TrackWorkStep)
{
//自动加工时不能手动操作(手动触发Load_End 例外)
if (m_bAutoWorking && TrackWorkStep != _ETrack_Step_Load_End)
{
CString Log = m_TrackName + " 自动运行中";
gLogMgr->WriteDebugLog(Log);
return;
}
//手动触发Load_End 在自动模式下无效
if (TrackWorkStep == _ETrack_Step_Load_End && gProgram_SZ_XL->IsbAutoWorkMode())
return;
if (TrackWorkStep == _ETrack_Step_Load_End)
{
//夹紧载盘
ProductCarrierOpenClose(false);
}
SetCurTrackWorkStep(TrackWorkStep);
}
#endif
#if 1
//读取串口消息
void CTrackWorkFlow::ReadPlcMsg()
{
while (!gExitApp)
{
if (gExitApp)
break;
if (m_bStopReadMsg)
{
Sleep(100);
continue;
}
ReadPlcMsgExt();
}
}
void CTrackWorkFlow::ReadPlcMsgExt()
{
Sleep(m_ReadMsgDelay);
char buf[PLC_READ_MSG_LEN];
memset(buf, 0, sizeof(buf));
int ReadBytes = m_TrackCOM.Read(buf, PLC_READ_MSG_LEN);
//分析命令内容
if (ReadBytes > 0)
{
AnalyzeRecvPlcCmd(buf, PLC_READ_MSG_LEN);
}
}
//解析反馈指令
void CTrackWorkFlow::AnalyzeRecvPlcCmd(char *buf, int len)
{
//找到# 的位置
int IdxEnd = -1;
for (int k = 0; k < len; k++)
{
if (buf[k] == '#')
{
IdxEnd = k;
/*CString s;
s.Format(_T("Idx # = %d"), IdxEnd);
gLogMgr->WriteDebugLog(s);*/
break;
}
}
if (IdxEnd < 0)//没找到
return;
if (IdxEnd != len - 1)
buf[IdxEnd + 1] = '\0';
CString PlcMsg(buf);
//gLogMgr->WriteDebugLog("ReadPlcMsg==>" + PlcMsg);
int IdxK = -1;//第一个K 的位置
for (int k = 0; k < IdxEnd; k++)
{
if (buf[k] == 'K')
{
IdxK = k;
break;
}
}
if (IdxK < 0)
return;
CString logstrH = "ReadPlcMsg:" + PlcMsg + " ==>";
CString logstrT = "未解析的指令!";
/*
if (PlcMsg.Find("$(KQ3D1)#") != -1 || PlcMsg.Find("$(KQ4D1)#") != -1)//下料完成
{
logstrT = "轨道下料完成!";
if (m_CurWorkStep == _ETrack_Step_Unload)//只有下料状态才响应下料完成信号
{
if (m_bCircleStop)//当前循环停止
{
m_bCircleStop = false;//只停止一次
GetFrame()->m_DlgSW_XL_Flow.ResetCircleStopCheck(m_TrackType);//自动恢复check 状态
CString Log = m_TrackName + " 停止自动运行!";
gLogMgr->WriteDebugLog(Log);
StopAutoWork();//停止自动运行
}
else
{
SetCurTrackWorkStep(_ETrack_Step_Unload_End);
}
}
}
if (PlcMsg.Find("$(KQ3E)#") != -1 || PlcMsg.Find("$(KQ4E)#") != -1)//下料错误
{
logstrT = "轨道下料错误!";
SetCurTrackWorkStep(_ETrack_Step_Unload_Err);
gLogMgr->WriteDebugLog("ReadPlcMsg==>_ETrack_Step_Unload_Err");
}
*/
///-------------------------轨道1-------------------------------------///
if (gTrackWorkFlow1.m_CurWorkStep == _ETrack_Step_Unload)//只有下料状态才响应下料完成信号
{
if (PlcMsg.Find("$(KQ3D1)#") != -1)//下料完成
{
logstrT = "轨道1下料完成!";
if (gTrackWorkFlow1.m_bCircleStop)//当前循环停止
{
gTrackWorkFlow1.m_bCircleStop = false;//只停止一次
GetFrame()->m_DlgSW_XL_Flow.ResetCircleStopCheck(m_TrackType);//自动恢复check 状态
CString Log = "轨道1 停止自动运行!";
gLogMgr->WriteDebugLog(Log);
gTrackWorkFlow1.StopAutoWork();//停止自动运行
}
else
{
gTrackWorkFlow1.SetCurTrackWorkStep(_ETrack_Step_Unload_End);
}
}
if (PlcMsg.Find("$(KQ3E)#") != -1)//下料错误
{
logstrT = "轨道1下料错误!";
gTrackWorkFlow1.SetCurTrackWorkStep(_ETrack_Step_Unload_Err);
}
}
if (PlcMsg.Find("$(KQ5D1)#") != -1)//推出治具完成
{
gTrackWorkFlow1.m_bPushJigOut = true;
logstrT = "轨道1推出治具完成!";
gLogMgr->WritePlcTimeLog(logstrH + logstrT);
//gLogMgr->WriteDebugLog("ReadPlcMsg [$(KQ5D1)#] ==>轨道1推出治具完成");
}
if (PlcMsg.Find("$(KQ5E)#") != -1)//治具未到位
{
gTrackWorkFlow1.m_bJigOK = false;
logstrT = "轨道1治具未到位!";
//gLogMgr->WriteDebugLog("ReadPlcMsg [$(KQ5E)#] ==>轨道1治具未到位");
}
if (PlcMsg.Find("$(KQ7D1)#") != -1)//治具到位
{
gTrackWorkFlow1.m_bJigOK = true;
logstrT = "轨道1治具到位!";
//gLogMgr->WriteDebugLog("ReadPlcMsg [$(KQ7D1)#]==>轨道1治具到位");
}
///------------------------轨道2-------------------------------------///
if (gTrackWorkFlow2.m_CurWorkStep == _ETrack_Step_Unload)//只有下料状态才响应下料完成信号
{
if (PlcMsg.Find("$(KQ4D1)#") != -1)//下料完成
{
logstrT = "轨道2下料完成!";
if (gTrackWorkFlow2.m_bCircleStop)//当前循环停止
{
gTrackWorkFlow2.m_bCircleStop = false;//只停止一次
GetFrame()->m_DlgSW_XL_Flow.ResetCircleStopCheck(m_TrackType);//自动恢复check 状态
CString Log = "轨道2 停止自动运行!";
gLogMgr->WriteDebugLog(Log);
gTrackWorkFlow2.StopAutoWork();//停止自动运行
}
else
{
gTrackWorkFlow2.SetCurTrackWorkStep(_ETrack_Step_Unload_End);
}
}
if (PlcMsg.Find("$(KQ4E)#") != -1)//下料错误
{
logstrT = "轨道2下料错误!";
gTrackWorkFlow2.SetCurTrackWorkStep(_ETrack_Step_Unload_Err);
}
}
if (PlcMsg.Find("$(KQ6D1)#") != -1)//推出治具完成
{
gTrackWorkFlow2.m_bPushJigOut = true;
logstrT = "轨道2推出治具完成!";
gLogMgr->WritePlcTimeLog(logstrH + logstrT);
//gLogMgr->WriteDebugLog("ReadPlcMsg [$(KQ6D1)#] ==>轨道2推出治具完成");
}
if (PlcMsg.Find("$(KQ6E)#") != -1)//治具未到位
{
gTrackWorkFlow2.m_bJigOK = false;
logstrT = "轨道2治具未到位!";
//gLogMgr->WriteDebugLog("ReadPlcMsg [$(KQ6E)#] ==>轨道2治具未到位");
}
if (PlcMsg.Find("$(KQ8D1)#") != -1)//治具到位
{
gTrackWorkFlow2.m_bJigOK = true;
logstrT = "轨道2治具到位!";
//gLogMgr->WriteDebugLog("ReadPlcMsg [$(KQ8D1)#]==>轨道2治具到位");
}
gLogMgr->WriteDebugLog(logstrH + logstrT);
}
#endif
#if 1
//获取发送给plc 的字符串
CString CTrackWorkFlow::GetSendPlcMsgStr(ETrackPlcCmd PlcCmd)
{
CString log;
CString msg = "$(KQ";
if (PlcCmd == _ETrack_PlcCmd_Open_Product)//打开载盘
{
if (m_TrackType == _ETrackType_Track_1)
{
msg += "G";
log = "SendPlcMsg: $(KQG)# ==>轨道1 打开载盘";
}
else
{
msg += "I";
log = "SendPlcMsg: $(KQI)# ==>轨道2 打开载盘";
}
}
if (PlcCmd == _ETrack_PlcCmd_Close_Product)//夹紧载盘
{
if (m_TrackType == _ETrackType_Track_1)
{
msg += "F";
log = "SendPlcMsg: $(KQF)# ==> 轨道1 夹紧载盘";
}
else
{
msg += "H";
log = "SendPlcMsg: $(KQH)# ==>轨道2 夹紧载盘";
}
}
if (PlcCmd == _ETrack_PlcCmd_Vac_Sorb_On)//真空吸附开
{
if (m_TrackType == _ETrackType_Track_1)
{
msg += "9";
log = "SendPlcMsg: $(KQ9)# ==>轨道1 真空吸附开";
}
else
{
msg += "B";
log = "SendPlcMsg: $(KQB)# ==>轨道2 真空吸附开";
}
}
if (PlcCmd == _ETrack_PlcCmd_Vac_Sorb_Off)//真空吸附关
{
if (m_TrackType == _ETrackType_Track_1)
{
msg += "A";
log = "SendPlcMsg: $(KQA)# ==>轨道1 真空吸附关";
}
else
{
msg += "C";
log = "SendPlcMsg: $(KQC)# ==>轨道2 真空吸附关";
}
}
if (PlcCmd == _ETrack_PlcCmd_Auto_Start)//自动开始(绿灯)
{
msg += "5";
log = "SendPlcMsg: $(KQ5)# ==>自动开始";
}
if (PlcCmd == _ETrack_PlcCmd_Auto_End)//自动结束(黄灯)
{
msg += "6";
log = "SendPlcMsg: $(KQ6)# ==> 自动结束";
}
if (PlcCmd == _ETrack_PlcCmd_Unload)//下料
{
if (m_TrackType == _ETrackType_Track_1)
{
msg += "3";
log = "SendPlcMsg: $(KQ3)# ==>轨道1 下料";
}
else
{
msg += "4";
log = "SendPlcMsg: $(KQ4)# ==>轨道1 下料";
}
}
if (PlcCmd == _ETrack_PlcCmd_Push_Jig_Out)//推治具
{
if (m_TrackType == _ETrackType_Track_1)
{
msg += "J";
log = "SendPlcMsg: $(KQJ)# ==>轨道1 推出治具";
}
else
{
msg += "K";
log = "SendPlcMsg: $(KQK)# ==>轨道2 推出治具";
}
gLogMgr->WritePlcTimeLog(log);
}
if (PlcCmd == _ETrack_PlcCmd_Check_Jig_In)//检测轨道治具
{
if (m_TrackType == _ETrackType_Track_1)
{
msg += "L";
log = "SendPlcMsg: $(KQL)# ==>轨道1 检测治具";
}
else
{
msg += "M";
log = "SendPlcMsg: $(KQM)# ==>轨道2 检测治具";
}
}
if (PlcCmd == _ETrack_PlcCmd_Cancel_Unload)//取消请求下料
{
if (m_TrackType == _ETrackType_Track_1)
{
msg += "D";
log = "SendPlcMsg: $(KQD)# ==>轨道1 取消请求下料";
}
else
{
msg += "E";
log = "SendPlcMsg: $(KQE)# ==>轨道2 取消请求下料";
}
}
if (PlcCmd == _ETrack_PlcCmd_Red_Alam_On)//红灯蜂鸣器开
{
msg += "1";
log = "SendPlcMsg: $(KQ1)# ==>红灯蜂鸣器开";
}
if (PlcCmd == _ETrack_PlcCmd_Red_Alam_Off)//红灯蜂鸣器开
{
msg += "2";
log = "SendPlcMsg: $(KQ2)# ==>红灯蜂鸣器关";
}
gLogMgr->WriteDebugLog(log);
msg += ")#\r\n";
return msg;
}
//发送指令给PLC (bStopReadMsg 是否暂停读取PLC 消息)
bool CTrackWorkFlow::SendMsgToPlc(ETrackPlcCmd PlcCmd, bool bStopReadMsg)
{
if (bStopReadMsg)
{
m_bStopReadMsg = true;//暂停读取
Sleep(100);
}
CString Msg = GetSendPlcMsgStr(PlcCmd);
if (m_TrackCOM.IsOpen())
{
char * buf = Msg.GetBuffer();
int len = Msg.GetLength();
m_TrackCOM.ClearCache();
m_TrackCOM.WriteBuf(buf, len);//发送
//gLogMgr->WriteDebugLog("SendMsgToPlc==>" + Msg);
}
else
{
gLogMgr->WriteDebugLog("Plc 串口连接失败!");
return false;
}
//等待PLC 反馈信号
bool Ret = true;
//Ret = WaitPlcRevMsg(PlcCmd);
if (bStopReadMsg)
{
m_bStopReadMsg = false;//恢复读取
}
Sleep(gProgram_SZ_XL->GetPlcCmdSendDelay());
return Ret;
}
//打开/夹紧载盘
void CTrackWorkFlow::ProductCarrierOpenClose(bool bOpen)
{
m_bCarrierOpen = bOpen;
ETrackPlcCmd PlcCmd;
if (bOpen)
PlcCmd = _ETrack_PlcCmd_Open_Product;
else
PlcCmd = _ETrack_PlcCmd_Close_Product;
SendMsgToPlc(PlcCmd, false);
}
//真空吸附
void CTrackWorkFlow::VacSorbOnOff(bool bOn)
{
ETrackPlcCmd PlcCmd;
if (bOn)
PlcCmd = _ETrack_PlcCmd_Vac_Sorb_On;
else
PlcCmd = _ETrack_PlcCmd_Vac_Sorb_Off;
SendMsgToPlc(PlcCmd, false);
}
bool CTrackWorkFlow::PushJigOut()
{
/*if (gLogMgr->IsDebuging())
{
return true;
}*/
ETrackPlcCmd PlcCmd;
PlcCmd = _ETrack_PlcCmd_Push_Jig_Out;
m_bPushJigOut = false;
SendMsgToPlc(PlcCmd, false);
/*//强制等待10秒再检测是否推出完成
Sleep(10000);
*/
int MaxCheckTimes = 150;
int cnt = 0;
while ((!m_bPushJigOut) && (cnt < MaxCheckTimes));
{
Sleep(200);
cnt++;
}
if (cnt == MaxCheckTimes)
{
gTrackWorkFlow1.RadAlamOnOff(true);
AfxMessageBox("推出治具超时!");
gTrackWorkFlow1.RadAlamOnOff(false);
return false;
}
return true;
}
bool CTrackWorkFlow::IsJigOK()
{
#ifdef CUSTOM_TXD_2_XL
return true;
#endif
if (gLogMgr->IsDebuging())
{
return true;
}
if (!gCommonFlowMgr->m_bCheckJig)
{
return true;
}
//return true;
ETrackPlcCmd PlcCmd;
PlcCmd = _ETrack_PlcCmd_Check_Jig_In;
m_bJigOK = false;
SendMsgToPlc(PlcCmd, false);
int cnt = 0;
while (cnt < 20 && (!m_bJigOK))
{
Sleep(100);
cnt++;
}
if (cnt == 20)
{
gTrackWorkFlow1.RadAlamOnOff(true);
AfxMessageBox(m_TrackName + " 治具未到位!");
gTrackWorkFlow1.RadAlamOnOff(false);
return false;
}
return true;
}
//红灯蜂鸣器
void CTrackWorkFlow::RadAlamOnOff(bool bOn)
{
ETrackPlcCmd PlcCmd;
if (bOn)
PlcCmd = _ETrack_PlcCmd_Red_Alam_On;
else
PlcCmd = _ETrack_PlcCmd_Red_Alam_Off;
SendMsgToPlc(PlcCmd, false);
}
//通知plc 自动开始或结束
void CTrackWorkFlow::SendAutoStartFlg(bool bStart)
{
if (m_TrackType == _ETrackType_Track_1)//用轨道1 串口控制
{
ETrackPlcCmd PlcCmd;
if (bStart)
PlcCmd = _ETrack_PlcCmd_Auto_Start;
else
PlcCmd = _ETrack_PlcCmd_Auto_End;
SendMsgToPlc(PlcCmd, false);
}
}
//取消下料请求
void CTrackWorkFlow::CancelUnloadRequest()
{
gLogMgr->WriteDebugLog(m_TrackName + " CancelUnloadRequest");
SendMsgToPlc(_ETrack_PlcCmd_Cancel_Unload, false);
}
#endif
#if 1
//移动到位置
void CTrackWorkFlow::MoveToPos(ETrackWorkStep WorkStep)
{
double Coord = gProgram_SZ_XL->GetMoveCoord(m_TrackType, WorkStep);
/*if (abs(Coord)<0.005) //加了等待送回空治具的位置;初始为0;避免撞坏东西
return;*/
CString MotorStr = (m_TrackType == _ETrackType_Track_1) ? (MOTOR_X) : (MOTOR_X2);
CMotor &Motor = *(CMotor::GetMotor(MotorStr));
CWorkCmdContainer CmdContainer;
//设置电机速度
{
CWorkCmdSetMotorSpeed *pCmd = new CWorkCmdSetMotorSpeed();
if (m_TrackType == _ETrackType_Track_1)
pCmd->SetbSetMotorX();
else
pCmd->SetbSetMotorX2();
pCmd->SetSpeedType(_SpeedType_Move);
CmdContainer.AddCmd(pCmd);
}
//移动
{
CWorkCmdMoveMotor *pCmd = new CWorkCmdMoveMotor(Motor, Coord);
pCmd->SetMoveFlg(false);//移动到坐标
CmdContainer.AddCmd(pCmd);
}
//等待移动结束
{
CWorkCmdWaitMotorStop *pCmd = new CWorkCmdWaitMotorStop();
if (m_TrackType == _ETrackType_Track_1)
pCmd->SetbWaitMotorX();
else
pCmd->SetbWaitMotorX2();
CmdContainer.AddCmd(pCmd);
}
CWorkCmdInvoker WorkInvoker;//工作调度者
WorkInvoker.Excute(CmdContainer);
Motor.NotifyObservers();
}
bool CTrackWorkFlow::IsTrackIdle()
{
return (m_CurWorkStep != _ETrack_Step_Catch_mark)&&(m_CurWorkStep != _ETrack_Step_Marking);
}
void CTrackWorkFlow::KillCurWorkThread()
{
if (m_pthread)
{
TerminateThread(m_pthread->m_hThread, 0);
}
}
//上料
void CTrackWorkFlow::Load()
{
SetCurTrackWorkStep(_ETrack_Step_Load);
//平台移动到上料位置
if (gProgram_SZ_XL->IsbAutoWorkMode())//自动模式
{
//夹紧载盘
ProductCarrierOpenClose(false);
MoveToPos(_ETrack_Step_Load);
}
else//手动模式移动到unload 的位置
{
MoveToPos(_ETrack_Step_Unload);
}
CString Log = m_TrackName + " Load";
gLogMgr->WriteDebugLog(Log);
if (gProgram_SZ_XL->IsbShieldLoad())//屏蔽上料
{
if (m_bAutoWorking)//自动生产中
{
SetCurTrackWorkStep(_ETrack_Step_Load_End);
}
else
{
SetCurTrackWorkStep(_ETrack_Step_Load_Stop);
}
return;
}
if (gProgram_SZ_XL->IsbAutoWorkMode())//自动模式
{
if (!IsJigOK())
{
SetCurTrackWorkStep(_ETrack_Step_Load_Err);
Log = m_TrackName + " Load Err";
gLogMgr->WriteDebugLog(Log);
return;
}
//发送上料信号给上料机
if (gProgram_SZ_XL->SendMsgToLoadDevice(m_TrackType, _ETrack_Step_Load, true) == false)
{
SetCurTrackWorkStep(_ETrack_Step_Load_Err);
Log = m_TrackName + " Load Err";
gLogMgr->WriteDebugLog(Log);
return;
}
}
if (m_bAutoWorking)//自动生产中
{
//等待PLC 上料完成
while (!gExitApp)
{
if (m_CurWorkStep == _ETrack_Step_Load_End)
break;
Sleep(200);
}
Log = m_TrackName + " Load End";
gLogMgr->WriteDebugLog(Log);
}
else//半自动模式直接上料结束
{
SetCurTrackWorkStep(_ETrack_Step_Load_Stop);
Log = m_TrackName + " Load Stop";
gLogMgr->WriteDebugLog(Log);
}
}
//移动到等待位置
void CTrackWorkFlow::MoveToWaitPos()
{
CString Log = m_TrackName + " MoveToWaitPos";
gLogMgr->WriteDebugLog(Log);
SetCurTrackWorkStep(_ETrack_Step_To_Wait_Pos);
MoveToPos(_ETrack_Step_To_Wait_Pos);
if (m_bAutoWorking)
{
SetCurTrackWorkStep(_ETrack_Step_Mark_Waiting);
Log = m_TrackName + " Mark Waiting";
gLogMgr->WriteDebugLog(Log);
m_bLoadProduct = true;//轨道上是否load 了产品
}
else
{
SetCurTrackWorkStep(_ETrack_Step_Stop);
}
}
//切换平台XY 组编号
#include "CameraHawkvis.h"
void CTrackWorkFlow::ChangePlatXYGroupIdx()
{
int idx = (m_TrackType == _ETrackType_Track_1) ? 0 : 1;
gMotionCard_PCI1245->SetCurGpIdx(idx);
gCameraHawkvis->SwitchCamera(idx);//换轨道时,相机切换.
}
//抓取定位,并计算偏移和旋转
void CTrackWorkFlow::CatchMark()
{
if (!gObjComponentMgr->GetTwoMarkPt(Dbxy(), Dbxy()))//获取定位点
{
CMsgBox MsgBox;
MsgBox.Show("没有加工图形!");
return;
}
//只有无锁定状态才能CatchMark
if (gCurLockTrackType != _ETrackType_NULL)
{
m_OldWorkStep = _ETrack_Step_NULL;//强制改变之前的状态
return;
}
SetCurTrackWorkStep(_ETrack_Step_Catch_mark);
gCurLockTrackType = m_TrackType;//锁定当前轨道
//收集未移动前的数据
gClientMgr->SendCmd_CollectData();
//gMarkAreaMgr->CollectOrgWorkData(gProgram_SZ_XL->IsbSelMarkMode());
thread t1(&CMarkAreaMgr::CollectOrgWorkData, gMarkAreaMgr, gProgram_SZ_XL->IsbSelMarkMode());
t1.detach();
CString Log = m_TrackName + " CatchMark";
gLogMgr->WriteDebugLog(Log);
//真空吸附
ProductCarrierOpenClose(false);
VacSorbOnOff(true);
bool Ret = true;
Ret = IsJigOK();
if (gProgram_SZ_XL->IsbShieldMarking() == false)//屏蔽加工过程
{
//切换平台XY 组编号
ChangePlatXYGroupIdx();
CProduct &Product = gProductMgr->GetProduct(m_ProductIdx);
//start----------料片2复制料片1信息------------start
CProduct Product2 = Product;
Product2.SetbNewAddProduct(true);
//end----------料片2复制料片1信息并偏移----------------end
///--------------------抓取治具1上料片的定位点--------------------///
//将数据移动到当前product 的基准点上
Dbxy BasePt = Product.GetProductBasePt();
//轨道2 要偏移基准点
if (m_TrackType == _ETrackType_Track_2)
{
Dbxy Track2Offset = gProgram_SZ_XL->GetTrack2Offset();
BasePt.x += Track2Offset.x;
BasePt.y += Track2Offset.y;
//Product2.SetBasePt(BasePt);//发给副机的需记录因为接收到Product2才移动数据
}
//移动obj
gProgramCutMgr->MoveObjData(BasePt);
//移动area
//计算所有obj 的中心点
gObjComponentMgr->CalAllObjCenterPt();
Dbxy AllObjCenterPt = gObjComponentMgr->GetAllObjCenterPt();
gMarkAreaMgr->MoveAllAreaToTargetPt(AllObjCenterPt);
Product.ResetRealMarkPt();
//识别定位点1
if (Ret)
{
gCommonFlowMgr->CameraCatchTwoMark(Product);//只抓取一个点
}
if (!Product.IsSetRealMarkPt1())
{
Ret = false;
}
//识别定位点3
Dbxy MarkPt3;
if (Ret&&gObjComponentMgr->GetMark3Pt(MarkPt3))
{
Ret = gCommonFlowMgr->CameraCatchMark3(Product);
}
//识别定位点2
if (Ret)
{
gCommonFlowMgr->CameraCatchTwoMark(Product);//只抓取一个点
}
if (!Product.IsMarkReady())//mark 识别错误
{
Ret = false;
}
///Start--------------------抓取治具2上料片的定位点--------------------///
Dbxy Product2MarkPt3;
if (gClientMgr->IsbDisableServer())//屏蔽副机,则不抓取
goto CatchProduct2Finished;
Product2.ResetRealMarkPt();
//识别定位点1
if (Ret)
{
gCommonFlowMgr->CameraCatchTwoMark(Product2);//只抓取一个点
if (!Product2.IsSetRealMarkPt1())
{
Ret = false;
}
}
//识别定位点3
if (gObjComponentMgr->GetMark3Pt(Product2MarkPt3) && Ret)
{
Ret = gCommonFlowMgr->CameraCatchMark3(Product2);
}
//识别定位点2
if (Ret)
{
gCommonFlowMgr->CameraCatchTwoMark(Product2);//只抓取一个点
}
if (!Product2.IsMarkReady())//mark 识别错误
{
Ret = false;
}
else
{
gClientMgr->SendCmd_ProductInfo(Product2);
}
///End--------------------抓取治具2上料片的定位点--------------------End///
CatchProduct2Finished:
//抓取失败时/非自动状态时
if (Ret == false || m_bAutoWorking == false)
{
VacSorbOnOff(false);//真空放开
//解除锁定
gCurLockTrackType = _ETrackType_NULL;
}
}
if (m_bAutoWorking)
{
if (Ret == false)
{
SetCurTrackWorkStep(_ETrack_Step_Catch_mark_Err);
}
else
{
SetCurTrackWorkStep(_ETrack_Step_Catch_mark_End);
}
}
else
{
//数据移动回默认的位置(防止area 移位)
gProgramCutMgr->MoveObjData(Dbxy(0, 0));
gMarkAreaMgr->MoveAllAreaToTargetPt(Dbxy(0, 0));
SetCurTrackWorkStep(_ETrack_Step_Stop);
//解除锁定
if (m_TrackType == gCurLockTrackType)
{
gCurLockTrackType = _ETrackType_NULL;
}
}
if (m_CurWorkStep != _ETrack_Step_Catch_mark_End)//异常停止时
{
//数据移动回默认的位置(防止area 移位)
gProgramCutMgr->MoveObjData(Dbxy(0, 0));
gMarkAreaMgr->MoveAllAreaToTargetPt(Dbxy(0, 0));
}
//恢复报警状态
gTrackWorkFlow1.RadAlamOnOff(false);
}
void CTrackWorkFlow::CatchMarkNewly()
{
if (!gObjComponentMgr->GetTwoMarkPt(Dbxy(), Dbxy()))//获取定位点
{
CMsgBox MsgBox;
MsgBox.Show("没有加工图形!");
return;
}
//只有无锁定状态才能CatchMark
if (gCurLockTrackType != _ETrackType_NULL)
{
m_OldWorkStep = _ETrack_Step_NULL;//强制改变之前的状态
return;
}
gCurLockTrackType = m_TrackType;//锁定当前轨道
//收集未移动前的数据
gClientMgr->SendCmd_CollectData();
//gMarkAreaMgr->CollectOrgWorkData(gProgram_SZ_XL->IsbSelMarkMode());
thread t1(&CMarkAreaMgr::CollectOrgWorkData, gMarkAreaMgr, gProgram_SZ_XL->IsbSelMarkMode());
t1.detach();
SetCurTrackWorkStep(_ETrack_Step_Catch_mark);
CString Log = m_TrackName + " CatchMark";
gLogMgr->WriteDebugLog(Log);
//真空吸附
ProductCarrierOpenClose(false);
VacSorbOnOff(true);
bool Ret = true;
Ret = IsJigOK();
if (gProgram_SZ_XL->IsbShieldMarking() == false)//屏蔽加工过程
{
//切换平台XY 组编号
ChangePlatXYGroupIdx();
CProduct &Product = gProductMgr->GetProduct(m_ProductIdx);
gObjComponentMgr->GetTwoMarkPt(Product.o_TheoryMarkPt1, Product.o_TheoryMarkPt2);
gObjComponentMgr->GetMark3Pt(Product.o_TheoryMarkPt3);
//start----------料片2复制料片1信息------------start
CProduct Product2 = Product;
Product2.SetbNewAddProduct(true);
//end----------料片2复制料片1信息并偏移----------------end
///--------------------抓取治具1上料片的定位点--------------------///
//将数据移动到当前product 的基准点上
Dbxy BasePt(0,0);
//Product.SetBasePt(BasePt);
//轨道2 要偏移基准点
if (m_TrackType == _ETrackType_Track_2)
{
Dbxy Track2Offset = gProgram_SZ_XL->GetTrack2Offset();
BasePt.x = Track2Offset.x;
BasePt.y = Track2Offset.y;
}
Product.SetBasePt(BasePt);
/* //移动obj
gProgramCutMgr->MoveObjData(BasePt);
//移动area
//计算所有obj 的中心点
gObjComponentMgr->CalAllObjCenterPt();
Dbxy AllObjCenterPt = gObjComponentMgr->GetAllObjCenterPt();
gMarkAreaMgr->MoveAllAreaToTargetPt(AllObjCenterPt);*/
Product.ResetRealMarkPt();
//识别定位点1
if (Ret)
{
gCommonFlowMgr->CameraCatchTwoMark(Product);//只抓取一个点
}
if (!Product.IsSetRealMarkPt1())
{
Ret = false;
}
//识别定位点3
Dbxy MarkPt3;
if (Ret&&gObjComponentMgr->GetMark3Pt(MarkPt3))
{
Ret = gCommonFlowMgr->CameraCatchMark3(Product);
}
//识别定位点2
if (Ret)
{
gCommonFlowMgr->CameraCatchTwoMark(Product);//只抓取一个点
}
if (!Product.IsMarkReady())//mark 识别错误
{
Ret = false;
}
///Start--------------------抓取治具2上料片的定位点--------------------///
Dbxy JigOft = gCommonFlowMgr->GetNPOffset();
Product2.SetBasePt(JigOft + BasePt);
Dbxy Product2MarkPt3;
if (gClientMgr->IsbDisableServer())//屏蔽副机,则不抓取
goto CatchProduct2Finished;
Product2.ResetRealMarkPt();
//识别定位点1
if (Ret)
{
gCommonFlowMgr->CameraCatchTwoMark(Product2);//只抓取一个点
if (!Product2.IsSetRealMarkPt1())
{
Ret = false;
}
}
//识别定位点3
if (gObjComponentMgr->GetMark3Pt(Product2MarkPt3) && Ret)
{
Ret = gCommonFlowMgr->CameraCatchMark3(Product2);
}
//识别定位点2
if (Ret)
{
gCommonFlowMgr->CameraCatchTwoMark(Product2);//只抓取一个点
}
if (!Product2.IsMarkReady())//mark 识别错误
{
Ret = false;
}
else
{
gClientMgr->SendCmd_ProductInfo(Product2);
}
///End--------------------抓取治具2上料片的定位点--------------------End///
CatchProduct2Finished:
//抓取失败时/非自动状态时
if (Ret == false || m_bAutoWorking == false)
{
VacSorbOnOff(false);//真空放开
//解除锁定
gCurLockTrackType = _ETrackType_NULL;
}
}
if (m_bAutoWorking)
{
if (Ret == false)
{
SetCurTrackWorkStep(_ETrack_Step_Catch_mark_Err);
}
else
{
SetCurTrackWorkStep(_ETrack_Step_Catch_mark_End);
}
}
else
{
//数据移动回默认的位置(防止area 移位)
gProgramCutMgr->MoveObjData(Dbxy(0, 0));
gMarkAreaMgr->MoveAllAreaToTargetPt(Dbxy(0, 0));
SetCurTrackWorkStep(_ETrack_Step_Stop);
//解除锁定
if (m_TrackType == gCurLockTrackType)
{
gCurLockTrackType = _ETrackType_NULL;
}
}
if (m_CurWorkStep != _ETrack_Step_Catch_mark_End)//异常停止时
{
//数据移动回默认的位置(防止area 移位)
gProgramCutMgr->MoveObjData(Dbxy(0, 0));
gMarkAreaMgr->MoveAllAreaToTargetPt(Dbxy(0, 0));
}
//恢复报警状态
gTrackWorkFlow1.RadAlamOnOff(false);
}
//加工过程
void CTrackWorkFlow::MarkProcess()
{
if (m_bAutoWorking)
{
//自动状态需要在CatchMark 锁定当前轴才能进入
if (gCurLockTrackType != m_TrackType)
return;
}
else
{
//非自动状态只有无锁定时才能进入
if (gCurLockTrackType != _ETrackType_NULL)
return;
}
gCurLockTrackType = m_TrackType;//锁定
CString Log = m_TrackName + " MarkProcess";
gLogMgr->WriteDebugLog(Log);
if (gProgram_SZ_XL->IsbShieldMarking() == false)//屏蔽加工过程
{
//切换平台XY 组编号
ChangePlatXYGroupIdx();
#if 1
CProduct &Product = gProductMgr->GetProduct(m_ProductIdx);
if (!Product.IsMarkReady())
{
CString Log = m_TrackName + " 没有识别定位!";
gLogMgr->WriteDebugLog(Log);
return;
}
if (!IsJigOK())
{
CString Log = m_TrackName + " 未检测到治具!";
gLogMgr->WriteDebugLog(Log);
return;
}
gWorkTime.StartRecordTime();//计时开始
//设置当前的工作步骤
SetCurTrackWorkStep(_ETrack_Step_Marking);
//XY 组切换
MarkProcessExt();
#endif
//数据移动回默认的位置
gProgramCutMgr->MoveObjData(Dbxy(0, 0));
gMarkAreaMgr->MoveAllAreaToTargetPt(Dbxy(0, 0));
}
gCurLockTrackType = _ETrackType_NULL;//解锁
VacSorbOnOff(false);//真空放开
if (m_bAutoWorking)
{
SetCurTrackWorkStep(_ETrack_Step_Mark_End);
Log = m_TrackName + " Mark End";
gLogMgr->WriteDebugLog(Log);
}
else
{
SetCurTrackWorkStep(_ETrack_Step_Mark_Stop);
Log = m_TrackName + " Mark Stop";
gLogMgr->WriteDebugLog(Log);
}
m_CutProductCnt++;//切割产品的数量
WriteRecordTimesToFile();
gWorkTime.StopRecordTime();//停止计时
}
bool CTrackWorkFlow::MarkProcessExt()
{
//设置该轨道加工偏移
Dbxy MarkOffset = gProgram_SZ_XL->GetTrackMarkOffset(m_TrackType);
gCommonFlowMgr->SetAdjustOffsetAll(MarkOffset);
//记录当前正在切割的轨道
gProgram_SZ_XL->SetCurMarkingTrack(m_TrackType);
CProduct &Product = gProductMgr->GetProduct(m_ProductIdx);
bool Ret;
//启动切割
if (!gProgram_SZ_XL->IsbSelMarkMode())//全部加工时自动选择所有obj
gObjComponentMgr->SelAllObj();
Ret = gProgramCutMgr->StartWork(Product, true);
//仿射参数重置
Product.ResetAffinePars();
//清空指令集
CWorkCmdContainer &CmdContainer = CWorkCmdContainer::GetInstance();//指令集
CmdContainer.Clear();
//取消选择状态
gObjComponentMgr->NotSelAllObj();
return Ret;
}
//去边框
void CTrackWorkFlow::ThrowEdge()
{
SetCurTrackWorkStep(_ETrack_Step_Throw_Edge);
//通知plc 上料
CString Log = m_TrackName + " Throw Edge";
gLogMgr->WriteDebugLog(Log);
if (gProgram_SZ_XL->IsbShieldLoad())//屏蔽上料
{
if (m_bAutoWorking)//自动生产中
SetCurTrackWorkStep(_ETrack_Step_Throw_Edge_End);
else
SetCurTrackWorkStep(_ETrack_Step_Stop);
return;
}
if (gProgram_SZ_XL->IsbAutoWorkMode())//自动模式
{
//平台移动到上料位置
MoveToPos(_ETrack_Step_Load);
if (gProgram_SZ_XL->SendMsgToLoadDevice(m_TrackType, _ETrack_Step_Throw_Edge, true) == false)
{
SetCurTrackWorkStep(_ETrack_Step_Throw_Edge_Err);
Log = m_TrackName + " Throw Edge Err";
gLogMgr->WriteDebugLog(Log);
return;
}
if (m_bAutoWorking)//自动生产中
{
//等待上料完成
while (!gExitApp)
{
if (m_CurWorkStep == _ETrack_Step_Throw_Edge_End)
break;
Sleep(200);
}
Log = m_TrackName + " Throw Edge End";
gLogMgr->WriteDebugLog(Log);
}
else
{
SetCurTrackWorkStep(_ETrack_Step_Throw_Edge_Stop);
Log = m_TrackName + " Load Stop";
gLogMgr->WriteDebugLog(Log);
}
}
else
{
SetCurTrackWorkStep(_ETrack_Step_Throw_Edge_End);
Log = m_TrackName + " Throw Edge End";
gLogMgr->WriteDebugLog(Log);
}
}
//下料
void CTrackWorkFlow::UnLoad()
{
//设置当前步骤
SetCurTrackWorkStep(_ETrack_Step_Unload);
//检查下料机的状态
if (gProgram_SZ_XL->IsbCheckUnloadState())
{
//如果另外一个轨道没有在下料下料机在轨道上的时候判断为unload错误
if (gMotionCard_PCI1245->CheckUnloadState() == false)
{
//获取另外一个轴的状态
ETrackWorkStep OtherTrackWorkStep = gProgram_SZ_XL->GetOtherTrackWorkStep(m_TrackType);
if (OtherTrackWorkStep != _ETrack_Step_Unload)
{
SetCurTrackWorkStep(_ETrack_Step_Unload_Err);
CMsgBox MsgBox;
MsgBox.Show("下料机位置异常!");
return;
}
}
}
//平台移动到下料位置
MoveToPos(_ETrack_Step_Unload);
//自动打开载盘
ProductCarrierOpenClose(true);
//通知下料
CString Log = m_TrackName + " UnLoad";
gLogMgr->WriteDebugLog(Log);
if (gProgram_SZ_XL->IsbShieldUnLoad())//屏蔽下料
{
if (m_bAutoWorking)//自动运行中
SetCurTrackWorkStep(_ETrack_Step_Unload_End);
else
SetCurTrackWorkStep(_ETrack_Step_Stop);
return;
}
//如果另外一个轴在unload ,要等待其unload 完成
if (gProgram_SZ_XL->IsbAutoWorkMode())
{
while (!gExitApp)
{
Sleep(200);
//获取另外一个轴的状态
ETrackWorkStep OtherTrackWorkStep = gProgram_SZ_XL->GetOtherTrackWorkStep(m_TrackType);
if (OtherTrackWorkStep != _ETrack_Step_Unload)
{
break;
}
}
}
if (m_bAutoWorking)//自动运行中
{
if (gProgram_SZ_XL->IsbAutoWorkMode())//自动模式
{
//通知下料机下料
if (gProgram_SZ_XL->SendMsgToLoadDevice(m_TrackType, _ETrack_Step_Unload, true) == false)
{
SetCurTrackWorkStep(_ETrack_Step_Unload_Err);
Log = m_TrackName + " unload Err";
gLogMgr->WriteDebugLog(Log);
return;
}
//等待拉走载具
CString str = "轨道1";
if (m_TrackType == _ETrackType_Track_2)
str = "轨道2";
CString logstr;
logstr.Format("等待[%s]拉走载具.", str);
gLogMgr->WriteDebugLog(logstr);
m_bPullJigOut = false;
int cnt = 0;
while (!m_bPullJigOut&&cnt < 400)
{
Sleep(300);
cnt++;
}
if (cnt == 400)
{
SetCurTrackWorkStep(_ETrack_Step_Unload_Err);
Log = m_TrackName + " 拉出治具 超时!";
gLogMgr->WriteDebugLog(Log);
AfxMessageBox("拉出治具超时!请手动下料!");
return;
}
Sleep(30000);
//平台移动到 送回空治具的位置
MoveToPos(_ETrack_Step_WaitBack);
gProgram_SZ_XL->SendMsgToLoadDevice(m_TrackType, _ETrack_Step_WaitBack, true);//告诉下料机,我已到位
m_bLoadProduct = false;//轨道上是否load 了产品
}
else//手动模式直接跳过下料步骤
{
SetCurTrackWorkStep(_ETrack_Step_Unload_End);
}
}
else
{
if (AfxMessageBox("确认手动下料?", MB_YESNO) != IDYES)
{
SetCurTrackWorkStep(_ETrack_Step_NULL);
return;
}
//通知下料机下料
if (gProgram_SZ_XL->SendMsgToLoadDevice(m_TrackType, _ETrack_Step_Unload, true) == false)
{
SetCurTrackWorkStep(_ETrack_Step_Unload_Err);
Log = m_TrackName + " unload Err";
gLogMgr->WriteDebugLog(Log);
return;
}
//等待拉走载具
CString str = "轨道1";
if (m_TrackType == _ETrackType_Track_2)
str = "轨道2";
CString logstr;
logstr.Format("等待[%s]拉走载具.", str);
gLogMgr->WriteDebugLog(logstr);
m_bPullJigOut = false;
int cnt = 0;
while (!m_bPullJigOut&&cnt < 400)
{
Sleep(300);
cnt++;
}
if (cnt == 400)
{
SetCurTrackWorkStep(_ETrack_Step_Unload_Err);
Log = m_TrackName + " 拉出治具 超时!";
gLogMgr->WriteDebugLog(Log);
AfxMessageBox("拉出治具超时!请手动下料!");
return;
}
Sleep(30000);
//平台移动到 送回空治具的位置
MoveToPos(_ETrack_Step_WaitBack);
gProgram_SZ_XL->SendMsgToLoadDevice(m_TrackType, _ETrack_Step_WaitBack, true);//告诉下料机,我已到位
m_bLoadProduct = false;//轨道上是否load 了产品
}
}
/*
//下料
void CTrackWorkFlow::UnLoad()
{
//设置当前步骤
SetCurTrackWorkStep(_ETrack_Step_Unload);
//检查下料机的状态
if (gProgram_SZ_XL->IsbCheckUnloadState())
{
//如果另外一个轨道没有在下料下料机在轨道上的时候判断为unload错误
if (gMotionCard_PCI1245->CheckUnloadState() == false)
{
//获取另外一个轴的状态
ETrackWorkStep OtherTrackWorkStep = gProgram_SZ_XL->GetOtherTrackWorkStep(m_TrackType);
if (OtherTrackWorkStep != _ETrack_Step_Unload)
{
SetCurTrackWorkStep(_ETrack_Step_Unload_Err);
CMsgBox MsgBox;
MsgBox.Show("下料机位置异常!");
return;
}
}
}
//平台移动到下料位置
MoveToPos(_ETrack_Step_Unload);
//自动打开载盘
ProductCarrierOpenClose(true);
//通知下料
CString Log = m_TrackName + " UnLoad";
gLogMgr->WriteDebugLog(Log);
if (gProgram_SZ_XL->IsbShieldUnLoad())//屏蔽下料
{
if (m_bAutoWorking)//自动运行中
SetCurTrackWorkStep(_ETrack_Step_Unload_End);
else
SetCurTrackWorkStep(_ETrack_Step_Stop);
return;
}
//如果另外一个轴在unload ,要等待其unload 完成
if (gProgram_SZ_XL->IsbAutoWorkMode())
{
//int cnt = 0;
while (!gExitApp)
{
Sleep(500);
//获取另外一个轴的状态
ETrackWorkStep OtherTrackWorkStep = gProgram_SZ_XL->GetOtherTrackWorkStep(m_TrackType);
if ((OtherTrackWorkStep != _ETrack_Step_Unload))//||cnt>10)
{
break;
}
//cnt++;
}
}
auto FunctionUnload = [&]()
{
//通知下料机到下料 接载具位
m_bPushJigReady = false;
if (gProgram_SZ_XL->SendMsgToLoadDevice(m_TrackType, _ETrack_Step_Unload, true) == false)
{
SetCurTrackWorkStep(_ETrack_Step_Unload_Err);
Log = m_TrackName + " unload Err";
gLogMgr->WriteDebugLog(Log);
return;
}
//等待下料机到可推出载具位
CString str = "轨道1";
if (m_TrackType == _ETrackType_Track_2)
str = "轨道2";
CString logstr;
logstr.Format("等待[下料机] 运动至[%s]下载具位.", str);
gLogMgr->WriteDebugLog(logstr);
while ((!m_bPushJigReady) )
{
Sleep(300);
}
/ *if (cnt == 400)
{
Log = m_TrackName + " [下料机] 运动至下载具位 超时!";
gLogMgr->WriteDebugLog(Log);
gTrackWorkFlow1.RadAlamOnOff(true);
AfxMessageBox(m_TrackName + " [下料机] 运动至下载具位超时!请手动下料!");
gTrackWorkFlow1.RadAlamOnOff(false);
SetCurTrackWorkStep(_ETrack_Step_Unload_Err);
return;
}* /
if (!PushJigOut())//推出治具
{
SetCurTrackWorkStep(_ETrack_Step_Unload_Err);
return;
}
if (gProgram_SZ_XL->SendMsgToLoadDevice(m_TrackType, _ETrack_Step_PushOut_Finished, true) == false)
{
SetCurTrackWorkStep(_ETrack_Step_Unload_Err);
Log = m_TrackName + " unload Err";
gLogMgr->WriteDebugLog(Log);
return;
}
//平台移动到 送回空治具的位置
MoveToPos(_ETrack_Step_WaitBack);
gProgram_SZ_XL->SendMsgToLoadDevice(m_TrackType, _ETrack_Step_WaitBack, true);//告诉下料机,我已到可回治具位
m_bLoadProduct = false;//轨道上是否load 了产品
};
if (m_bAutoWorking)//自动运行中
{
if (gProgram_SZ_XL->IsbAutoWorkMode())//自动模式
{
FunctionUnload();
}
else//手动模式直接跳过下料步骤
{
SetCurTrackWorkStep(_ETrack_Step_Unload_End);
}
}
else
{
if (AfxMessageBox("确认手动下料?", MB_YESNO) != IDYES)
{
SetCurTrackWorkStep(_ETrack_Step_NULL);
return;
}
FunctionUnload();
}
}
*/
//移动Y 轴到安全区域
void CTrackWorkFlow::MoveMotorYToSafePos()
{
return;
double DangerCoordStart;//危险范围start
double DangerCoordEnd;//危险范围end
double SafeCoord;//安全坐标
gProgram_SZ_XL->GetTrackMotorYCoord(m_TrackType, DangerCoordStart, DangerCoordEnd, SafeCoord);
//获取当前的Y 轴坐标
CMotor &MotorY = *(CMotor::GetMotor(MOTOR_Y));
double CoordY = gMotionCard_PCI1245->GetMotorCoord(MotorY);
if (DangerCoordStart <= CoordY && CoordY <= DangerCoordEnd)
{
gLogMgr->WriteDebugLog("Move MotorY To Safe Coord");
gCurLockTrackType = m_TrackType;//锁定当前轨道
//移动Y 轴到安全坐标
CWorkCmdContainer CmdContainer;
//设置电机速度
{
CWorkCmdSetMotorSpeed *pCmd = new CWorkCmdSetMotorSpeed();
pCmd->SetbSetMotorY();
pCmd->SetSpeedType(_SpeedType_Move);
CmdContainer.AddCmd(pCmd);
}
//移动
{
CWorkCmdMoveMotor *pCmd = new CWorkCmdMoveMotor(MotorY, SafeCoord);
pCmd->SetMoveFlg(false);//移动到坐标
CmdContainer.AddCmd(pCmd);
}
//等待移动结束
{
CWorkCmdWaitMotorStop *pCmd = new CWorkCmdWaitMotorStop();
pCmd->SetbWaitMotorY();
CmdContainer.AddCmd(pCmd);
}
CWorkCmdInvoker WorkInvoker;//工作调度者
WorkInvoker.Excute(CmdContainer);
MotorY.NotifyObservers();
//解除锁定
gCurLockTrackType = _ETrackType_NULL;
}
else
{
gLogMgr->WriteDebugLog("MotorY At Safe Coord");
}
}
CString CTrackWorkFlow::GetRecordFilePath()
{
CString Path = (m_TrackType == _ETrackType_Track_1) ? (TRACK1_RECORD_FILE) : (TRACK2_RECORD_FILE);
CString FilePath;
CFileMgr FileMgr;
FileMgr.GetFullFilePath(FilePath, Path);
return FilePath;
}
//加工次数次数写入到文件
void CTrackWorkFlow::WriteRecordTimesToFile()
{
CString FilePath = GetRecordFilePath();
CFile file(FilePath, CFile::modeReadWrite | CFile::modeCreate);
CArchive ar(&file, CArchive::store);
ar << m_CutProductCnt;
}
void CTrackWorkFlow::ReadRecordTimesFromFile()
{
CString FilePath = GetRecordFilePath();
CFile file;
if (file.Open(FilePath, CFile::modeRead))
{
CArchive ar(&file, CArchive::load);
ar >> m_CutProductCnt;
}
}
void CTrackWorkFlow::ResetRecordTimes()
{
m_CutProductCnt = 0;
WriteRecordTimesToFile();
}
#endif