#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" #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_Jig2Scale_x");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_Jig2Scale.x); pPropertie->SetType(_PROP_TYPE_DOUBLE); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("治具2X"); Description = _T("治具2X方向缩放比例"); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_Jig2Scale.x, Description); //p->AllowEdit(FALSE);//不可修改 pGroup1->AddSubItem(p); PropertieMgr.Insert(p, pPropertie); } { //添加属性变量映射 Name = _T("m_Jig2Scale_y");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_Jig2Scale.y); pPropertie->SetType(_PROP_TYPE_DOUBLE); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("治具2Y"); Description = _T("治具2Y方向缩放比例"); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_Jig2Scale.y, Description); //p->AllowEdit(FALSE);//不可修改 pGroup1->AddSubItem(p); PropertieMgr.Insert(p, pPropertie); } { //添加属性变量映射 Name = _T("m_Jig4Scale_x");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_Jig4Scale.x); pPropertie->SetType(_PROP_TYPE_DOUBLE); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("治具4X"); Description = _T("治具4X方向缩放比例"); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_Jig4Scale.x, Description); //p->AllowEdit(FALSE);//不可修改 pGroup1->AddSubItem(p); PropertieMgr.Insert(p, pPropertie); } { //添加属性变量映射 Name = _T("m_Jig4Scale");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_Jig4Scale.y); pPropertie->SetType(_PROP_TYPE_DOUBLE); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("治具4Y"); Description = _T("治具4Y方向缩放比例"); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_Jig4Scale.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_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_NetPath");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_NetPath); pPropertie->SetType(_PROP_TYPE_STRING); pPropertie->SetpModule(this); pPropertie->SetPath(Path); pPropertie->SetName(Name); pPropertie->WriteRead(true);//读取保存的属性 //添加属性显示 PropertyName = _T("网盘盘符"); Description = _T("将客户端TempMarkData文件夹,映射到本地的盘符.(只需填W,不用带符号)"); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_NetPath, 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_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_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); } 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_Jig2MarkOffset_x");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_Jig2MarkOffset.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的切割偏移X"); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_Jig2MarkOffset.x, Description); //p->AllowEdit(FALSE);//不可修改 pGroup1->AddSubItem(p); PropertieMgr.Insert(p, pPropertie); } { //添加属性变量映射 Name = _T("m_Jig2MarkOffset_y");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_Jig2MarkOffset.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的切割偏移Y"); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_Jig2MarkOffset.y, Description); //p->AllowEdit(FALSE);//不可修改 pGroup1->AddSubItem(p); PropertieMgr.Insert(p, pPropertie); } { //添加属性变量映射 Name = _T("m_Jig4MarkOffset_x");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_Jig4MarkOffset.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的切割偏移X"); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_Jig4MarkOffset.x, Description); //p->AllowEdit(FALSE);//不可修改 pGroup1->AddSubItem(p); PropertieMgr.Insert(p, pPropertie); } { //添加属性变量映射 Name = _T("m_Jig4MarkOffset_y");//变量名字 CPropertie *pPropertie = new CPropertie; pPropertie->SetpVal((void*)&m_Jig4MarkOffset.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的切割偏移Y"); CMFCPropertyGridProperty* p = new CMFCPropertyGridProperty(PropertyName, (_variant_t)m_Jig4MarkOffset.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(); 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) { 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_To_Wait_Pos://等待位置 Coord = m_MotorXWaitCoord; break; case _ETrack_Step_Unload://下料 if(TrackType == _ETrackType_Track_1) Coord = m_MotorXUnLoadCoord; else Coord = m_MotorX2UnLoadCoord; break; break; default: break; } return Coord; } //获取轨道单独的切割偏移量 Dbxy CProgram_SZ_XL::GetTrackMarkOffset(ETrackType TrackType) { Dbxy MarkOffset; /*if(TrackType == _ETrackType_Track_1) MarkOffset = m_Track1MarkOffset; else MarkOffset = m_Track2MarkOffset;*/ if (gServer->m_RcvCurTrackIndex == 0) { MarkOffset = m_Jig2MarkOffset; } else { MarkOffset = m_Jig4MarkOffset; } return MarkOffset; } //打开,夹紧载盘/真空 void CProgram_SZ_XL::ProductCarrierOpenClose(ETrackType TrackType,bool bOpen) { CTrackWorkFlow *pTrackWorkFlow = GetTrackWorkFlow(TrackType); if(pTrackWorkFlow->IsbAutoWorking()==false)//自动过程不能手动操作 { pTrackWorkFlow->ProductCarrierOpenClose(bOpen); Sleep(500); 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); } #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(1) { if(gExitApp) break; ETrackWorkStep Track1WorkStep = gTrackWorkFlow1.GetCurTrackWorkStep(); ETrackWorkStep Track2WorkStep = gTrackWorkFlow2.GetCurTrackWorkStep(); bool ReadMsg = false; if(Track1WorkStep ==_ETrack_Step_Load || Track1WorkStep ==_ETrack_Step_Throw_Edge ||Track2WorkStep ==_ETrack_Step_Load || Track2WorkStep ==_ETrack_Step_Throw_Edge) { ReadMsg = true; } if(m_bStopReadMsg) { Sleep(100); continue; } Sleep(300); if(ReadMsg)//只有load 和去边框时才读取 { 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); m_LoadDeviceCOM.ReadBuf(Buf,BUF_LEN); Buf[14]='\0'; CString RecvStr(Buf); AnalyzeRecvCmd(RecvStr); } //分析收到上料PLC 消息 void CProgram_SZ_XL::AnalyzeRecvCmd(CString &RecvStr) { CString LogStr1,LogStr2; bool ret = false; if(RecvStr.Find("@00RD00000452*",0) != -1)//轨道1 上料完成(00000100) { if(gTrackWorkFlow1.GetCurTrackWorkStep()==_ETrack_Step_Load)//只有load 中收到信号才算 { gTrackWorkFlow1.SetCurTrackWorkStep(_ETrack_Step_Load_End); LogStr1 = "轨道1 上料完成"; } ret = true; } else if(RecvStr.Find("@00RD0000085E*",0) != -1)//轨道2 上料完成(00001000) { if(gTrackWorkFlow2.GetCurTrackWorkStep()==_ETrack_Step_Load) { gTrackWorkFlow2.SetCurTrackWorkStep(_ETrack_Step_Load_End); LogStr1 = "轨道2 上料完成"; } ret = true; } else if(RecvStr.Find("@00RD00004052*",0) != -1)//轨道1 去边框完成(01000000) { if(gTrackWorkFlow1.GetCurTrackWorkStep()==_ETrack_Step_Throw_Edge) { gTrackWorkFlow1.SetCurTrackWorkStep(_ETrack_Step_Throw_Edge_End); LogStr1 = "轨道1 去边框完成"; } ret = true; } else if(RecvStr.Find("@00RD0000805E*",0) != -1)//轨道2 去边框完成(10000000) { if(gTrackWorkFlow2.GetCurTrackWorkStep()==_ETrack_Step_Throw_Edge) { gTrackWorkFlow2.SetCurTrackWorkStep(_ETrack_Step_Throw_Edge_End); 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); } } } //初始化上料机通信串口 void CProgram_SZ_XL::InitLoadDeviceCom() { //打开上料机plc 通信用串口 if(m_LoadDeviceCOM.Open(m_LoadComPort,"115200,e,7,2")) { CString LogStr; LogStr.Format(_T("上料机通信串口 %d 打开成功"),m_LoadComPort); gLogMgr->WriteDebugLog(LogStr); if(OpenPlcCtrl()) { m_bLoadDeviceSuc = true; //启动读取plc 消息的线程 AfxBeginThread(ReadLoadPlcMsgThread,this); } } else { CString LogStr; LogStr.Format(_T("上料机通信串口 %d 打开失败"),m_LoadComPort); gLogMgr->WriteDebugLog(LogStr); } } //开机发送一次,检查通信是否正常 bool CProgram_SZ_XL::OpenPlcCtrl() { 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(;kWriteDebugLog("Str1 = "+StrOn); gLogMgr->WriteDebugLog("Str2 = "+StrOff); gLogMgr->WriteDebugLog(LogStr); } return Ret; } //发送消息给上料机(bCheckRev 是否检查反馈信号) bool CProgram_SZ_XL::SendMsgToLoadDevice(ETrackType TrackType,ETrackWorkStep WorkStep,bool bCheckRev) { if(!m_bLoadDeviceSuc) { //CMsgBox MsgBox; //MsgBox.Show("上料机通信 失败"); gLogMgr->WriteDebugLog("上料机通信失败"); return false; } 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); 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