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.cpp

1780 lines
52 KiB
C++

#include "StdAfx.h"
#include "Program_SZ_XL.h"
#include "Propertie.h"
#include "PropertieMgr.h"
#include "AuthorityMgr.h"
#include "DeviceState.h"
#include "MsgBox.h"
#include "CommonFlowMgr.h"
#include "AuthorityMgr.h"
#include "FileMgr.h"
#include "DxfReadMgr.h"
#include "WorkFileMgr.h"
#include "MarkAreaMgr.h"
#include "LogMgr.h"
#include "MotionCard_PCI1245.h"
#include "ProgramCutMgr.h"
#include "GlobalFunction.h"
//#include "SuperDogMgr.h"
#define CUT_PAR_DIR "\\CutPar\\"
#define PLC_READ_MSG_LEN 12 //接收PLC 数据的长度(字节)
#define BUF_LEN 100
//读取上料机plc 消息的线程(无限循环)
UINT ReadLoadPlcMsgThread(LPVOID pParam)
{
CProgram_SZ_XL *WorkFlow = (CProgram_SZ_XL *)pParam;
WorkFlow->ReadLoadPlcMsg();
return 0;
}
CProgram_SZ_XL *gProgram_SZ_XL = new CProgram_SZ_XL;
CProgram_SZ_XL::CProgram_SZ_XL(void)
{
m_TrackComPort1 = 1;//轨道1 串口号
m_TrackComPort2 = 2;//轨道2 串口号
m_LoadComPort = 3;//上料机串口号
m_ComBaudRate = 115200;//通信波特率
m_MotorXLoadCoord = 0;//X 轴上料坐标
m_MotorXUnLoadCoord = 0;//X 轴下料坐标
m_MotorX2LoadCoord = 0;//X2 轴上料坐标
m_MotorX2UnLoadCoord = 0;//X2 轴下料坐标
m_MotorXWaitCoord = 0;//X轴等待坐标
m_bLoadDeviceSuc = false;
m_bSelMarkMode = false;//选择加工模式
m_bAutoWorkMode = true;//自动工作模式
m_bStopReadMsg = false;//是否暂停读取plc 消息
m_bLoadCOMLockerFlg = false;//发送消息锁定flg
m_Track1DangerCoordStart = -1000;//轨道1 的危险范围start
m_Track1DangerCoordEnd = 180;//轨道1 的危险范围end
m_Track1SafeCoord = 280;//轨道1 的安全坐标
m_Track2DangerCoordStart = 30;//轨道2 的危险范围start
m_Track2DangerCoordEnd = 1000;//轨道2 的危险范围end
m_Track2SafeCoord = -90;//轨道2 的安全坐标
m_bShieldLoad = false;//屏蔽上料
m_bShieldMarking = false;//屏蔽加工过程
m_bShieldUnLoad = false;//屏蔽下料
m_LoadCmdDelay = 1000;//发送上料请求上升沿的时间ms
m_LoadCmdRevDelay = 100;//发送后间隔这个时间去读取反馈ms
m_StopStepUnloadTimes = 5;//连续点多少次可以强制停止unload
m_LoadCmdSendTims = 5;//发送给上料plc 的cmd尝试的次数
m_PlcCmdSendDelay = 500;//plc指令发送后延时ms
m_bCheckUnloadState = true;//是否检查下料机状态
}
CProgram_SZ_XL::~CProgram_SZ_XL(void)
{
}
CMFCPropertyGridProperty *CProgram_SZ_XL::CreatGridProperty()
{
CPropertieMgr &PropertieMgr = gDevicePropertieMgr;
CString PropertyName;//属性名称
CString Description;//描述
CString Path = _T("PGM_SW_XL");//存储路径
CString Name;
//-------------------------------------------------------------------------------//
PropertyName = _T("双轨设备");
CMFCPropertyGridProperty* pGroup = new CMFCPropertyGridProperty(PropertyName);
//-------------------------------------------------------------------------------//
if (gAuthorityMgr->CheckAuthority(_ADMIN))
{
PropertyName = _T("固定缩放比率");
CMFCPropertyGridProperty* pGroup1 = new CMFCPropertyGridProperty(PropertyName);
{
//添加属性变量映射
Name = _T("m_Jig1Scale_x");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_Jig1Scale.x);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("治具1X");
Description = _T("治具1X(放缩比率)");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_Jig1Scale.x, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_Jig1Scale_y");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_Jig1Scale.y);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("治具1Y");
Description = _T("治具1Y(放缩比率)");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_Jig1Scale.y, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_Jig3Scale_x");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_Jig3Scale.x);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("治具3X");
Description = _T("治具3X(放缩比率)");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_Jig3Scale.x, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_Jig3Scale_y");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_Jig3Scale.y);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("治具3Y");
Description = _T("治具3Y(放缩比率)");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_Jig3Scale.y, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
pGroup->AddSubItem(pGroup1);
}
if (gAuthorityMgr->CheckAuthority(_FACTORY))
{
PropertyName = _T("基础设置");
CMFCPropertyGridProperty* pGroup1 = new CMFCPropertyGridProperty(PropertyName);
{
//添加属性变量映射
Name = _T("m_ServerIP");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_ServerIP);
pPropertie->SetType(_PROP_TYPE_STRING);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("副机IP");
Description = _T("副机的IP地址");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_ServerIP, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_ServerPort");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_ServerPort);
pPropertie->SetType(_PROP_TYPE_INT);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("副机端口");
Description = _T("副机监听的端口号");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_ServerPort, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_bCheckUnloadState");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_bCheckUnloadState);
pPropertie->SetType(_PROP_TYPE_BOOL);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("检查下料机信号");
Description = _T("是否检查下料机信号");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_bCheckUnloadState, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_TrackComPort1");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_TrackComPort1);
pPropertie->SetType(_PROP_TYPE_INT);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("轨道1 串口号");
Description = _T("轨道1 串口号");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_TrackComPort1, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_TrackComPort2");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_TrackComPort2);
pPropertie->SetType(_PROP_TYPE_INT);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("轨道2 串口号");
Description = _T("轨道2 串口号");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_TrackComPort2, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_PlcCmdSendDelay");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_PlcCmdSendDelay);
pPropertie->SetType(_PROP_TYPE_INT);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("发送后延时");
Description = _T("plc指令发送后延时ms");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_PlcCmdSendDelay, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_LoadComPort");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_LoadComPort);
pPropertie->SetType(_PROP_TYPE_INT);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("上料机串口号");
Description = _T("上料机通信用串口号");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_LoadComPort, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_LoadCmdRevDelay");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_LoadCmdRevDelay);
pPropertie->SetType(_PROP_TYPE_INT);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("上料反馈延时");
Description = _T("发送上料请求后等待反馈信号的时间ms");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_LoadCmdRevDelay, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_LoadCmdDelay");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_LoadCmdDelay);
pPropertie->SetType(_PROP_TYPE_INT);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("上料信号延时");
Description = _T("发送上料请求上升沿的时间ms");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_LoadCmdDelay, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_LoadCmdSendTims");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_LoadCmdSendTims);
pPropertie->SetType(_PROP_TYPE_INT);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("上料信号尝试次数");
Description = _T("发送上料请求后不成功的话反复尝试次数");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_LoadCmdSendTims, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_StopStepUnloadTimes");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_StopStepUnloadTimes);
pPropertie->SetType(_PROP_TYPE_INT);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("Unload 停止次数");
Description = _T("连续点多少次可以强制停止unload");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_StopStepUnloadTimes, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
pGroup->AddSubItem(pGroup1);
}
if (gAuthorityMgr->CheckAuthority(_FACTORY))
{
PropertyName = _T("调试功能");
CMFCPropertyGridProperty* pGroup1 = new CMFCPropertyGridProperty(PropertyName);
{
//添加属性变量映射
Name = _T("m_bShieldLoad");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_bShieldLoad);
pPropertie->SetType(_PROP_TYPE_BOOL);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("屏蔽上料");
Description = _T("跳过上料步骤");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_bShieldLoad, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_bShieldMarking");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_bShieldMarking);
pPropertie->SetType(_PROP_TYPE_BOOL);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("屏蔽加工过程");
Description = _T("跳过加工步骤");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_bShieldMarking, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_bShieldUnLoad");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_bShieldUnLoad);
pPropertie->SetType(_PROP_TYPE_BOOL);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("屏蔽下料过程");
Description = _T("跳过下料步骤");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_bShieldUnLoad, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
pGroup->AddSubItem(pGroup1);
}
if (gAuthorityMgr->CheckAuthority(_FACTORY))
{
PropertyName = _T("位置管理");
CMFCPropertyGridProperty* pGroup1 = new CMFCPropertyGridProperty(PropertyName);
{
//添加属性变量映射
Name = _T("m_Track2Offset_x");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_Track2Offset.x);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("轨道2抓取偏移X");
Description = _T("轨道2相对轨道1 的偏移量X");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_Track2Offset.x, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_Track2Offset_y");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_Track2Offset.y);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("轨道2抓取偏移Y");
Description = _T("轨道2相对轨道1 的偏移量Y");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_Track2Offset.y, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_NPOffset1_x");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_NPCatchOffset1.x);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("治具2抓取偏移X");
Description = _T("轨道1上治具2相对治具1位置偏移量X");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_NPCatchOffset1.x, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_NPOffset1_y");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_NPCatchOffset1.y);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("治具2抓取偏移Y");
Description = _T("轨道1上治具2相对治具1位置偏移量Y");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_NPCatchOffset1.y, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_NPOffset2_x");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_NPCatchOffset2.x);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("治具4抓取偏移X");
Description = _T("轨道2上治具4相对治具3位置偏移量X");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_NPCatchOffset2.x, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_NPOffset2_y");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_NPCatchOffset2.y);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("治具4抓取偏移Y");
Description = _T("轨道2上治具4相对治具3位置偏移量Y");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_NPCatchOffset2.y, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_MotorXWaitCoord");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_MotorXWaitCoord);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("X轴等待坐标");
Description = _T("X轴等待坐标");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_MotorXWaitCoord, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_MotorXLoadCoord");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_MotorXLoadCoord);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("X1 轴上料坐标");
Description = _T("X1 轴上料坐标");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_MotorXLoadCoord, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_MotorXUnLoadCoord");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_MotorXUnLoadCoord);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("X1 轴下料坐标");
Description = _T("X1 轴下料坐标");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_MotorXUnLoadCoord, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_MotorXLoadZJCoord");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_MotorXLoadZJCoord);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("X1送回治具");
Description = _T("X1接送回的空治具坐标");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_MotorXLoadZJCoord, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_MotorXThrowCoord");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_MotorXThrowCoord);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("X1去边框");
Description = _T("X1去边框坐标");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_MotorXThrowCoord, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_MotorX2LoadCoord");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_MotorX2LoadCoord);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("X2 轴上料坐标");
Description = _T("X2 轴上料坐标");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_MotorX2LoadCoord, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_MotorX2UnLoadCoord");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_MotorX2UnLoadCoord);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("X2 轴下料坐标");
Description = _T("X2 轴下料坐标");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_MotorX2UnLoadCoord, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_MotorX2LoadZJCoord");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_MotorX2LoadZJCoord);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("X2送回治具");
Description = _T("X2接送回的空治具坐标");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_MotorX2LoadZJCoord, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_MotorX2ThrowCoord");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_MotorX2ThrowCoord);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("X2去边框");
Description = _T("X2去边框坐标");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_MotorX2ThrowCoord, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
pGroup->AddSubItem(pGroup1);
}
if (gAuthorityMgr->CheckAuthority(_FACTORY))
{
PropertyName = _T("轨道1 Y 轴区域设置");
CMFCPropertyGridProperty* pGroup1 = new CMFCPropertyGridProperty(PropertyName);
{
//添加属性变量映射
Name = _T("m_Track1DangerCoordStart");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_Track1DangerCoordStart);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("危险范围start");
Description = _T("危险范围start");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_Track1DangerCoordStart, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_Track1DangerCoordEnd");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_Track1DangerCoordEnd);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("危险范围end");
Description = _T("危险范围end");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_Track1DangerCoordEnd, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_Track1SafeCoord");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_Track1SafeCoord);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("安全坐标");
Description = _T("安全坐标");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_Track1SafeCoord, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
pGroup->AddSubItem(pGroup1);
}
if (gAuthorityMgr->CheckAuthority(_FACTORY))
{
PropertyName = _T("轨道2 Y 轴区域设置");
CMFCPropertyGridProperty* pGroup1 = new CMFCPropertyGridProperty(PropertyName);
{
//添加属性变量映射
Name = _T("m_Track2DangerCoordStart");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_Track2DangerCoordStart);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("危险范围start");
Description = _T("危险范围start");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_Track2DangerCoordStart, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_Track2DangerCoordEnd");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_Track2DangerCoordEnd);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("危险范围end");
Description = _T("危险范围end");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_Track2DangerCoordEnd, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_Track2SafeCoord");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_Track2SafeCoord);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("安全坐标");
Description = _T("安全坐标");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_Track2SafeCoord, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
pGroup->AddSubItem(pGroup1);
}
if (gAuthorityMgr->CheckAuthority(_ADMIN))
{
PropertyName = _T("加工振镜偏移");
CMFCPropertyGridProperty* pGroup1 = new CMFCPropertyGridProperty(PropertyName);
{
//添加属性变量映射
Name = _T("m_Track1MarkOffset_x");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_Jig1MarkOffset.x);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("治具1振镜偏移X");
Description = _T("治具1的切割偏移X(振镜)");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_Jig1MarkOffset.x, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_Track1MarkOffset_y");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_Jig1MarkOffset.y);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("治具1振镜偏移Y");
Description = _T("治具1的切割偏移Y(振镜)");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_Jig1MarkOffset.y, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_Track2MarkOffset_x");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_Jig3MarkOffset.x);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("治具3振镜偏移X");
Description = _T("治具3的切割偏移X(振镜)");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_Jig3MarkOffset.x, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
{
//添加属性变量映射
Name = _T("m_Track2MarkOffset_y");//变量名字
CPropertie *pPropertie = new CPropertie;
pPropertie->SetpVal((void*)&m_Jig3MarkOffset.y);
pPropertie->SetType(_PROP_TYPE_DOUBLE);
pPropertie->SetpModule(this);
pPropertie->SetPath(Path);
pPropertie->SetName(Name);
pPropertie->WriteRead(true);//读取保存的属性
//添加属性显示
PropertyName = _T("治具3振镜偏移Y");
Description = _T("治具3的切割偏移Y(振镜)");
CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_Jig3MarkOffset.y, Description);
//p->AllowEdit(FALSE);//不可修改
pGroup1->AddSubItem(p);
PropertieMgr.Insert(p, pPropertie);
}
pGroup->AddSubItem(pGroup1);
}
return pGroup;
}
void CProgram_SZ_XL::Ini()
{
//设置串口参数
gTrackWorkFlow1.SetComPar(m_TrackComPort1, m_ComBaudRate);
gTrackWorkFlow2.SetComPar(m_TrackComPort2, m_ComBaudRate);
//启动WorkFlow 管理线程
gTrackWorkFlow1.WorkFlowStart();
gTrackWorkFlow2.WorkFlowStart(false);
CFileMgr FileMgr;
CString DirPath;
FileMgr.GetFullFilePath(DirPath, CUT_PAR_DIR);
//创建目录
if (!FileMgr.IsDirectoryExists(DirPath))
{
FileMgr.CreatDir(DirPath);
}
//读取加工次数
gTrackWorkFlow1.ReadRecordTimesFromFile();
gTrackWorkFlow2.ReadRecordTimesFromFile();
//初始化上料机通信串口
InitLoadDeviceCom();
}
//退出软件时
void CProgram_SZ_XL::OnExitApp()
{
//复位上料机和下料机的请求信号
ResetLoadUnloadSignal();
}
CTrackWorkFlow* CProgram_SZ_XL::GetTrackWorkFlow(ETrackType TrackType)
{
if (TrackType == _ETrackType_Track_1)
return &gTrackWorkFlow1;
else
return &gTrackWorkFlow2;
}
//获取另外一个轨道的对象
CTrackWorkFlow* CProgram_SZ_XL::GetOtherTrackWorkFlow(ETrackType TrackType)
{
if (TrackType == _ETrackType_Track_1)
return &gTrackWorkFlow2;
else
return &gTrackWorkFlow1;
}
//初始化设备
void CProgram_SZ_XL::InitDevice()
{
if (IsbAutoWorking())
{
CMsgBox MsgBox;
MsgBox.Show("自动运行中,不能初始化设备!");
return;
}
//检查下料机状态
if (m_bCheckUnloadState && gMotionCard_PCI1245->CheckUnloadState() == false)
{
CMsgBox MsgBox;
MsgBox.Show("下料机在轨道上,不能初始化设备!");
return;
}
if (gCommonFlowMgr->InitDevice())
{
//初始化上料机plc 通信
OpenPlcCtrl();
//复位上料机和下料机的请求信号
ResetLoadUnloadSignal();
}
}
//复位上料机和下料机的请求信号
void CProgram_SZ_XL::ResetLoadUnloadSignal()
{
//取消下料请求
CancelUnloadRequest(_ETrackType_Track_1);
Sleep(500);
CancelUnloadRequest(_ETrackType_Track_2);
//复位上料机所有请求信号
SendMsgToLoadDevice(_ETrackType_Track_1, _ETrack_Step_Reset_Load_Request, false);
}
//是否处于自动运行中
bool CProgram_SZ_XL::IsbAutoWorking()
{
return (gTrackWorkFlow1.IsbAutoWorking() || gTrackWorkFlow2.IsbAutoWorking());
}
//开始自动加工
void CProgram_SZ_XL::StartAutoWork(ETrackType TrackType)
{
#ifdef _USE_LAIPU_SUPERDOG
if (gEncryptionMgr->CheckLockState() == false)
{
return;
}
#endif
CDeviceState &DeviceState = CDeviceState::GetInstance();
if (!DeviceState.IsDeviceIni())
{
CMsgBox MsgBox;
MsgBox.Show("设备未初始化!");
return;
}
CTrackWorkFlow *pTrackWorkFlow = GetTrackWorkFlow(TrackType);
if (pTrackWorkFlow->StartAutoWork())
{
if (IsbAutoWorking())
gTrackWorkFlow1.SendAutoStartFlg(true);//打开风机
else
gTrackWorkFlow1.SendAutoStartFlg(false);//关闭风机
}
}
void CProgram_SZ_XL::StopAutoWork()
{
gTrackWorkFlow1.StopAutoWork();
gTrackWorkFlow2.StopAutoWork();
}
//手动操作
void CProgram_SZ_XL::ManualOperation(ETrackType TrackType, ETrackWorkStep TrackWorkStep)
{
CDeviceState &DeviceState = CDeviceState::GetInstance();
if (!DeviceState.IsDeviceIni())
{
CMsgBox MsgBox;
MsgBox.Show("设备未初始化!");
return;
}
if (TrackWorkStep != _ETrack_Step_Load_End)
{
if (gAuthorityMgr->CheckAuthority(_FACTORY, true) == false)//手动操作需要厂家权限
return;
}
CTrackWorkFlow *pTrackWorkFlow = GetTrackWorkFlow(TrackType);
pTrackWorkFlow->ManualOperation(TrackWorkStep);
}
double CProgram_SZ_XL::GetMoveCoord(ETrackType TrackType, ETrackWorkStep WorkStep)
{
double Coord = 0;
switch (WorkStep)
{
case _ETrack_Step_Load://上料
if (TrackType == _ETrackType_Track_1)
Coord = m_MotorXLoadCoord;
else
Coord = m_MotorX2LoadCoord;
break;
case _ETrack_Step_Throw_Edge://去边框
if (TrackType == _ETrackType_Track_1)
Coord = m_MotorXThrowCoord;
else
Coord = m_MotorX2ThrowCoord;
break;
case _ETrack_Step_To_Wait_Pos://等待位置
Coord = m_MotorXWaitCoord;
break;
case _ETrack_Step_Unload://下料
if (TrackType == _ETrackType_Track_1)
Coord = m_MotorXUnLoadCoord;
else
Coord = m_MotorX2UnLoadCoord;
break;
case _ETrack_Step_WaitBack://等送回治具
if (TrackType == _ETrackType_Track_1)
Coord = m_MotorXLoadZJCoord;
else
Coord = m_MotorX2LoadZJCoord;
break;
default:
break;
}
return Coord;
}
//获取轨道单独的切割偏移量
Dbxy CProgram_SZ_XL::GetTrackMarkOffset(ETrackType TrackType)
{
Dbxy MarkOffset;
if (TrackType == _ETrackType_Track_1)
MarkOffset = m_Jig1MarkOffset;
else
MarkOffset = m_Jig3MarkOffset;
return MarkOffset;
}
/*
Dbxy CProgram_SZ_XL::GetTrackMarkPosOffset(ETrackType TrackType)
{
Dbxy MarkOffset;
if (TrackType == _ETrackType_Track_1)
MarkOffset = m_Track1MarkPosOffset;
else
MarkOffset = m_Track2MarkPosOffset;
return MarkOffset;
}*/
//打开,夹紧载盘/真空
void CProgram_SZ_XL::ProductCarrierOpenClose(ETrackType TrackType, bool bOpen)
{
CTrackWorkFlow *pTrackWorkFlow = GetTrackWorkFlow(TrackType);
if (pTrackWorkFlow->IsbAutoWorking() == false)//自动过程不能手动操作
{
pTrackWorkFlow->ProductCarrierOpenClose(bOpen);
Sleep(100);
pTrackWorkFlow->VacSorbOnOff(!bOpen);
}
}
//获取当前加工的数量
int CProgram_SZ_XL::GetCutProductCnt(ETrackType TrackType)
{
CTrackWorkFlow *pTrackWorkFlow = GetTrackWorkFlow(TrackType);
return pTrackWorkFlow->GetCutProductCnt();
}
ETrackWorkStep CProgram_SZ_XL::GetCurTrackWorkStep(ETrackType TrackType)
{
CTrackWorkFlow *pTrackWorkFlow = GetTrackWorkFlow(TrackType);
return pTrackWorkFlow->GetCurTrackWorkStep();
}
//获取另外一个轨道的工作状态
ETrackWorkStep CProgram_SZ_XL::GetOtherTrackWorkStep(ETrackType TrackType)
{
CTrackWorkFlow*pTrackWorkFlow = GetOtherTrackWorkFlow(TrackType);
return pTrackWorkFlow->GetCurTrackWorkStep();
}
//获取轨道Y 轴的坐标范围(危险区域/安全坐标)
void CProgram_SZ_XL::GetTrackMotorYCoord(ETrackType TrackType, double &DangerCoordStart, double &DangerCoordEnd, double &SafeCoord)
{
if (TrackType == _ETrackType_Track_1)
{
DangerCoordStart = m_Track1DangerCoordStart;//危险范围start
DangerCoordEnd = m_Track1DangerCoordEnd;//危险范围end
SafeCoord = m_Track1SafeCoord;//安全坐标
}
else
{
DangerCoordStart = m_Track2DangerCoordStart;//危险范围start
DangerCoordEnd = m_Track2DangerCoordEnd;//危险范围end
SafeCoord = m_Track2SafeCoord;//安全坐标
}
}
//移动Y 轴到安全坐标
void CProgram_SZ_XL::MoveMotorYToSafePos(ETrackType TrackType)
{
CTrackWorkFlow *pTrackWorkFlow = GetTrackWorkFlow(TrackType);
pTrackWorkFlow->MoveMotorYToSafePos();
}
//取消下料请求
void CProgram_SZ_XL::CancelUnloadRequest(ETrackType TrackType)
{
CTrackWorkFlow *pTrackWorkFlow = GetTrackWorkFlow(TrackType);
pTrackWorkFlow->CancelUnloadRequest();
}
//设置当前循环后停止
void CProgram_SZ_XL::SetbCircleStop(ETrackType TrackType, bool bStop)
{
CTrackWorkFlow *pTrackWorkFlow = GetTrackWorkFlow(TrackType);
pTrackWorkFlow->SetbCircleStop(bStop);
}
bool CProgram_SZ_XL::GetbCircleStop(ETrackType TrackType)
{
CTrackWorkFlow *pTrackWorkFlow = GetTrackWorkFlow(TrackType);
return pTrackWorkFlow->GetbCircleStop();
}
#if 1
//保存dxf 对应的切割参数
void CProgram_SZ_XL::SaveCutPar()
{
CString FilePath;
if (GetDxfParFilePath("par", FilePath))
{
CWorkFileMgr WorkFileMgr;
WorkFileMgr.SaveCutParFile(FilePath);
//保存一个同名的area 文件
CString AreaFilePath;
GetDxfParFilePath("are", AreaFilePath);
CFile file(AreaFilePath, CFile::modeReadWrite | CFile::modeCreate);
CArchive ar(&file, CArchive::store);
gMarkAreaMgr->SaveOrLoadExt(ar);
}
}
//读取dxf 对应的切割参数
void CProgram_SZ_XL::ReadCutPar()
{
CString FilePath;
if (GetDxfParFilePath("par", FilePath))
{
CWorkFileMgr WorkFileMgr;
WorkFileMgr.ReadWorkFile(FilePath);
//调出对应的area 文件
CString AreaFilePath;
GetDxfParFilePath("are", AreaFilePath);
CFile file;
if (file.Open(AreaFilePath, CFile::modeRead))
{
CArchive ar(&file, CArchive::load);
gMarkAreaMgr->SaveOrLoadExt(ar);
gLogMgr->WriteDebugLog("OpenArea:" + AreaFilePath);
file.Close();
}
}
else
{
gCommonFlowMgr->ResetProductOffset();
}
}
bool CProgram_SZ_XL::GetDxfParFilePath(CString Suffix, CString &FilePath)
{
CString OpenFileName = gProgramCutMgr->GetCurOpenFileName();
if (OpenFileName != "")
{
CString Path = CUT_PAR_DIR;
Path += OpenFileName;
Path += "." + Suffix;
CFileMgr FileMgr;
FileMgr.GetFullFilePath(FilePath, Path);
return true;
}
return false;
}
void CProgram_SZ_XL::ResetRecordTimes(ETrackType TrackType)
{
CMsgBox MsgBox;
if (MsgBox.ConfirmOkCancel("加工次数清零?"))
{
CTrackWorkFlow *pTrackWorkFlow = GetTrackWorkFlow(TrackType);
pTrackWorkFlow->ResetRecordTimes();
}
}
#endif
#if 1//上料相关功能
void CProgram_SZ_XL::ReadLoadPlcMsg()
{
while (!gExitApp)
{
if (gExitApp)
break;
ETrackWorkStep Track1WorkStep = gTrackWorkFlow1.GetCurTrackWorkStep();
ETrackWorkStep Track2WorkStep = gTrackWorkFlow2.GetCurTrackWorkStep();
bool ReadMsg = false;
if (Track1WorkStep == _ETrack_Step_Load || Track1WorkStep == _ETrack_Step_Throw_Edge || Track1WorkStep == _ETrack_Step_Unload\
|| Track2WorkStep == _ETrack_Step_Load || Track2WorkStep == _ETrack_Step_Throw_Edge || Track2WorkStep == _ETrack_Step_Unload)
{
ReadMsg = true;
}
if (m_bStopReadMsg)
{
Sleep(100);
continue;
}
Sleep(300);
if (ReadMsg)//只有load/unload 和去边框时才读取
{
ReadLoadPlcMsgExt();
}
}
}
//读取上料PLC 的状态
void CProgram_SZ_XL::ReadLoadPlcMsgExt()
{
char Buf[BUF_LEN];
/* CString Str = ("@00RD0512000151*");//查询指令
int len = CreatBuf(Buf,Str);
m_LoadDeviceCOM.WriteBuf(Buf,len);
Sleep(100); */
//读取反馈
memset(Buf, 0, BUF_LEN);
int rcvLen = m_LoadDeviceCOM.Read(Buf, BUF_LEN);
//m_LoadDeviceCOM.ReadBuf(Buf,BUF_LEN);
if (rcvLen > 1)
{
CString RecvStr(Buf);
AnalyzeRecvLoadMsg(RecvStr);
}
}
//分析收到上料机的PLC 消息
void CProgram_SZ_XL::AnalyzeRecvLoadMsg(CString &RecvStr)
{
CString LogStr1, LogStr2;
bool ret = false;
if (gTrackWorkFlow1.GetCurTrackWorkStep() == _ETrack_Step_Unload)//只有unload 中收到信号才算
{
if (RecvStr.Find("$(KL1D1)#", 0) != -1)//轨道1 下料完成
{
if (gProgram_SZ_XL->GetbCircleStop(_ETrackType_Track_1) || (!gTrackWorkFlow1.IsbAutoWorking()))//当前循环停止或手动下料
{
gTrackWorkFlow1.SetbCircleStop(false);
GetFrame()->m_DlgSW_XL_Flow.ResetCircleStopCheck(_ETrackType_Track_1);//自动恢复check 状态
CString Log = "轨道1 Circle Stop.";
gLogMgr->WriteDebugLog(Log);
gTrackWorkFlow1.StopAutoWork();//停止自动运行
}
else
{
gTrackWorkFlow1.SetCurTrackWorkStep(_ETrack_Step_Unload_End);
}
LogStr1 = "轨道1 下料完成";
}
if (RecvStr.Find("$(KL1E)#", 0) != -1)//轨道1 下料错误
{
gTrackWorkFlow1.SetCurTrackWorkStep(_ETrack_Step_Unload_Err);
LogStr1 = "轨道1 下料错误";
}
if (RecvStr.Find("$(KL7D1)#", 0) != -1)//轨道1拉出载具完成
{
gTrackWorkFlow1.m_bPullJigOut = true;
LogStr1 = "轨道1载具拉出";
}
if (RecvStr.Find("$(KL1D9)#", 0) != -1)//轨道1可推出
{
gTrackWorkFlow1.m_bPushJigReady = true;
LogStr1 = "轨道1载具可推出";
}
if (RecvStr.Find("$(KL9E)#", 0) != -1)//轨道1不可推出
{
gTrackWorkFlow1.m_bPushJigReady = false;
LogStr1 = "轨道1载具不可推出--from下料机";
gTrackWorkFlow1.SetCurTrackWorkStep(_ETrack_Step_Unload_Err);
}
ret = true;
}
if (gTrackWorkFlow2.GetCurTrackWorkStep() == _ETrack_Step_Unload)//只有load 中收到信号才算
{
if (RecvStr.Find("$(KL2D1)#", 0) != -1)//轨道2 下料完成
{
if (gProgram_SZ_XL->GetbCircleStop(_ETrackType_Track_2) || (!gTrackWorkFlow2.IsbAutoWorking()) )//当前循环停止
{
gTrackWorkFlow2.SetbCircleStop(false);
GetFrame()->m_DlgSW_XL_Flow.ResetCircleStopCheck(_ETrackType_Track_2);//自动恢复check 状态
CString Log = "轨道1 Circle Stop.";
gLogMgr->WriteDebugLog(Log);
gTrackWorkFlow2.StopAutoWork();//停止自动运行
}
else
{
gTrackWorkFlow2.SetCurTrackWorkStep(_ETrack_Step_Unload_End);
}
LogStr1 = "轨道2 下料完成";
}
if (RecvStr.Find("$(KL2E)#", 0) != -1)//轨道2 下料错误
{
gTrackWorkFlow2.SetCurTrackWorkStep(_ETrack_Step_Unload_Err);
LogStr1 = "轨道2 下料错误";
}
if (RecvStr.Find("$(KL8D1)#", 0) != -1)//轨道1拉出载具完成
{
//gTrackWorkFlow2.SetCurTrackWorkStep(_ETrack_Step_PulledOut);
gTrackWorkFlow2.m_bPullJigOut = true;
LogStr1 = "轨道2载具拉出";
}
if (RecvStr.Find("$(KL1D10)#", 0) != -1)//轨道1拉出载具完成
{
gTrackWorkFlow2.m_bPushJigReady = true;
LogStr1 = "轨道2载具可推出";
}
if (RecvStr.Find("$(KL10E)#", 0) != -1)//轨道1拉出载具完成
{
gTrackWorkFlow2.m_bPushJigReady = false;
LogStr1 = "轨道2载具不可推出--from下料机";
gTrackWorkFlow2.SetCurTrackWorkStep(_ETrack_Step_Unload_Err);
}
ret = true;
}
if (gTrackWorkFlow1.GetCurTrackWorkStep() == _ETrack_Step_Load)//只有load 中收到信号才算
{
if (RecvStr.Find("$(KL3D1)#", 0) != -1)//轨道1 上料完成
{
gTrackWorkFlow1.SetCurTrackWorkStep(_ETrack_Step_Load_End);
LogStr1 = "轨道1 上料完成";
}
if (RecvStr.Find("$(KL3E)#", 0) != -1)//轨道1 上料错误
{
gTrackWorkFlow1.SetCurTrackWorkStep(_ETrack_Step_Load_Err);
LogStr1 = "轨道1 上料错误";
}
ret = true;
}
if (gTrackWorkFlow2.GetCurTrackWorkStep() == _ETrack_Step_Load)
{
if (RecvStr.Find("$(KL4D1)#", 0) != -1)//轨道2 上料完成
{
gTrackWorkFlow2.SetCurTrackWorkStep(_ETrack_Step_Load_End);
LogStr1 = "轨道2 上料完成";
}
if (RecvStr.Find("$(KL4E)#", 0) != -1)//轨道2 上料完成
{
gTrackWorkFlow2.SetCurTrackWorkStep(_ETrack_Step_Load_Err);
LogStr1 = "轨道2 上料错误";
}
ret = true;
}
if (gTrackWorkFlow1.GetCurTrackWorkStep() == _ETrack_Step_Throw_Edge)
{
if (RecvStr.Find("$(KL5D1)#", 0) != -1)//轨道1 去边框完成(01000000)
{
gTrackWorkFlow1.SetCurTrackWorkStep(_ETrack_Step_Throw_Edge_End);
LogStr1 = "轨道1 去边框完成";
}
if (RecvStr.Find("$(KL5E)#", 0) != -1)//轨道1 去边框完成(01000000)
{
gTrackWorkFlow1.SetCurTrackWorkStep(_ETrack_Step_Throw_Edge_Err);
LogStr1 = "轨道1 去边框错误";
}
ret = true;
}
if (gTrackWorkFlow2.GetCurTrackWorkStep() == _ETrack_Step_Throw_Edge)
{
if (RecvStr.Find("$(KL6D1)#", 0) != -1)//轨道2 去边框完成(10000000)
{
gTrackWorkFlow2.SetCurTrackWorkStep(_ETrack_Step_Throw_Edge_End);
LogStr1 = "轨道2 去边框完成";
}
if (RecvStr.Find("$(KL6E)#", 0) != -1)//轨道2 去边框完成(10000000)
{
gTrackWorkFlow2.SetCurTrackWorkStep(_ETrack_Step_Throw_Edge_Err);
LogStr1 = "轨道2 去边框错误";
}
ret = true;
}
/*
else if(RecvStr.Find("@00RD00000C25*",0) != -1)//轨道1 上料完成//轨道2 上料完成(00001100)
{
if(gTrackWorkFlow1.GetCurTrackWorkStep()==_ETrack_Step_Load)
{
gTrackWorkFlow1.SetCurTrackWorkStep(_ETrack_Step_Load_End);
Sleep(500);
LogStr1 = "轨道1 上料完成";
}
if(gTrackWorkFlow2.GetCurTrackWorkStep()==_ETrack_Step_Load)
{
gTrackWorkFlow2.SetCurTrackWorkStep(_ETrack_Step_Load_End);
LogStr2 = "轨道2 上料完成";
}
ret = true;
}
else if(RecvStr.Find("@00RD0000845A*",0) != -1)//轨道1 上料完成//轨道2 去边框完成(10000100)
{
if(gTrackWorkFlow1.GetCurTrackWorkStep()==_ETrack_Step_Load)
{
gTrackWorkFlow1.SetCurTrackWorkStep(_ETrack_Step_Load_End);
Sleep(500);
LogStr1 = "轨道1 上料完成";
}
if(gTrackWorkFlow2.GetCurTrackWorkStep()==_ETrack_Step_Throw_Edge)
{
gTrackWorkFlow2.SetCurTrackWorkStep(_ETrack_Step_Throw_Edge_End);
LogStr2 = "轨道2 去边框完成";
}
ret = true;
}
else if(RecvStr.Find("@00RD0000485A*",0) != -1)//轨道1 去边框完成//轨道2 上料完成(01001000)
{
if(gTrackWorkFlow1.GetCurTrackWorkStep()==_ETrack_Step_Throw_Edge)
{
gTrackWorkFlow1.SetCurTrackWorkStep(_ETrack_Step_Throw_Edge_End);
Sleep(500);
LogStr1 = "轨道1 去边框完成";
}
if(gTrackWorkFlow2.GetCurTrackWorkStep()==_ETrack_Step_Load)
{
gTrackWorkFlow2.SetCurTrackWorkStep(_ETrack_Step_Load_End);
LogStr2 = "轨道2 上料完成";
}
ret = true;
}*/
if (ret)
{
gLogMgr->WriteDebugLog(RecvStr);
if (LogStr1 != "")
{
gLogMgr->WriteDebugLog(LogStr1);
}
if (LogStr2 != "")
{
gLogMgr->WriteDebugLog(LogStr2);
}
}
}
#include <mutex>
mutex IniTex;
//初始化上料机通信串口
void CProgram_SZ_XL::InitLoadDeviceCom()
{
IniTex.lock();
static bool bThreadStart = false;
//打开上料机plc 通信用串口
if (!bThreadStart)
{
if (m_LoadDeviceCOM.Open(m_LoadComPort, "115200,n,8,1"))
{
CString LogStr;
LogStr.Format(_T("上料机通信串口 %d 打开成功"), m_LoadComPort);
gLogMgr->WriteDebugLog(LogStr);
if (OpenPlcCtrl())
{
m_bLoadDeviceSuc = true;
if (!bThreadStart)
{
bThreadStart = true;
//启动读取plc 消息的线程
AfxBeginThread(ReadLoadPlcMsgThread, this);
}
}
}
else
{
CString LogStr;
LogStr.Format(_T("上料机通信串口 %d 打开失败"), m_LoadComPort);
gLogMgr->WriteDebugLog(LogStr);
}
}
IniTex.unlock();
}
//开机发送一次,检查通信是否正常
bool CProgram_SZ_XL::OpenPlcCtrl()
{
return true;
char Buf[BUF_LEN];
CString Str = ("@00SC0252*");
int len = CreatBuf(Buf, Str);
m_LoadDeviceCOM.WriteBuf(Buf, len);
Sleep(m_LoadCmdRevDelay);
//读取反馈
memset(Buf, 0, BUF_LEN);
m_LoadDeviceCOM.ReadBuf(Buf, BUF_LEN);
Str = ("@00SC0050*");
if (CompareBuf(Buf, Str))
{
gLogMgr->WriteDebugLog("OpenPlcCtrl Suc Rev = " + Str);
return true;
}
gLogMgr->WriteDebugLog("OpenPlcCtrl Err 失败");
return false;
}
//把str 的内容放到Buf
int CProgram_SZ_XL::CreatBuf(char *Buf, CString str)
{
int len = str.GetLength();
int k = 0;
for (;k < len;k++)
{
Buf[k] = str[k];
}
Buf[k++] = char(13);
Buf[k++] = char(10);
return k;
}
//比较buf 的内容是否和str 相等
bool CProgram_SZ_XL::CompareBuf(char *Buf, CString str)
{
int len = str.GetLength();
for (int k = 0;k < len;k++)
{
if (Buf[k] != str[k])
return false;
}
return true;
}
//获取发送字符串
bool CProgram_SZ_XL::GetLoadCmdStr(ETrackType TrackType, ETrackWorkStep WorkStep, CString &StrOn, CString &StrOnRev, CString &StrOff, CString &StrOffRev)
{
CString LogStr;
bool Ret = false;
if (WorkStep == _ETrack_Step_Load)//上料
{
if (_ETrackType_Track_1 == TrackType)
{
StrOn = "$(KL3)#";
StrOff = "@00WD0507000051*";
LogStr = "轨道1 上料请求";
}
else
{
StrOn = "$(KL4)#";
StrOff = "@00WD050800005E*";
LogStr = "轨道2 上料请求";
}
Ret = true;
}
else if (WorkStep == _ETrack_Step_Throw_Edge)//去边框
{
if (_ETrackType_Track_1 == TrackType)
{
StrOn = "$(KL5)#";
StrOff = "@00WD050900005F*";
LogStr = "轨道1去边框请求";
}
else
{
StrOn = "$(KL6)#";
StrOff = "@00WD0510000057*";
LogStr = "轨道2去边框请求";
}
Ret = true;
}
else if (WorkStep == _ETrack_Step_Unload)//下料
{
if (_ETrackType_Track_1 == TrackType)
{
StrOn = "$(KL1)#";
StrOff = "@00WD050900005F*";
LogStr = "轨道1下料请求";
}
else
{
StrOn = "$(KL2)#";
StrOff = "@00WD0510000057*";
LogStr = "轨道2下料请求";
}
Ret = true;
}
else if (WorkStep == _ETrack_Step_WaitBack)//等待送回载具
{
if (_ETrackType_Track_1 == TrackType)
{
StrOn = "$(KL7)#";
StrOff = "@00WD050900005F*";
LogStr = "轨道1可送回治具";
}
else
{
StrOn = "$(KL8)#";
StrOff = "@00WD0510000057*";
LogStr = "轨道2可送回治具";
}
Ret = true;
}
if (Ret)
{
// gLogMgr->WriteDebugLog("Str1 = "+StrOn);
//gLogMgr->WriteDebugLog("Str2 = "+StrOff);
gLogMgr->WriteDebugLog(LogStr);
}
return Ret;
}
//发送消息给上料机(bCheckRev 是否检查反馈信号) 弃用
//发送消息给plc(bCheckRev 是否检查反馈信号)
mutex SendMutex;
bool CProgram_SZ_XL::SendMsgToLoadDevice(ETrackType TrackType, ETrackWorkStep WorkStep, bool bCheckRev)
{
if (!m_bLoadDeviceSuc)
{
CMsgBox MsgBox;
MsgBox.Show("上料机通信 失败");
return false;
}
lock_guard<mutex> lock(SendMutex);
while (m_bLoadCOMLockerFlg)//等待
{
Sleep(100);
}
m_bStopReadMsg = true;//暂停读取
Sleep(400);
m_bLoadCOMLockerFlg = true;//锁定
bool Ret = false;
CString StrOn, StrOnRev;
CString StrOff, StrOffRev;
if (GetLoadCmdStr(TrackType, WorkStep, StrOn, StrOnRev, StrOff, StrOffRev))
{
char Buf[BUF_LEN];
int len = CreatBuf(Buf, StrOn);
m_LoadDeviceCOM.WriteBuf(Buf, len);
gLogMgr->WriteDebugLog("SendMsgToLoadDevice: "+StrOn);
/* Sleep(100);
m_LoadDeviceCOM.WriteBuf(Buf,len);//再发一次
Sleep(m_LoadCmdDelay);//等待plc 检测到上升沿的时间
len = CreatBuf(Buf,StrOff);
m_LoadDeviceCOM.WriteBuf(Buf,len);
Sleep(100);
m_LoadDeviceCOM.WriteBuf(Buf,len); //再发一次*/
Ret = true;
}
m_bLoadCOMLockerFlg = false;//解锁
m_bStopReadMsg = false;//恢复读取
return Ret;
}
//发送消息并检查反馈(发送SendMsg 并检查反馈信号是否为RevMsg)
bool CProgram_SZ_XL::SendMsgToLoadPlc(CString &SendMsg, CString &RevMsg)
{
return true;
}
#endif