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.

1423 lines
56 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.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(;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 = "@00WD0507000150*";
StrOff = "@00WD0507000051*";
LogStr = "轨道1 上料请求";
}
else
{
StrOn = "@00WD050800025C*";
StrOff = "@00WD050800005E*";
LogStr = "轨道2 上料请求";
}
Ret = true;
}
else if(WorkStep==_ETrack_Step_Throw_Edge)//去边框
{
if(_ETrackType_Track_1 == TrackType)
{
StrOn = "@00WD050900105E*";
StrOff = "@00WD050900005F*";
LogStr = "轨道1去边框请求";
}
else
{
StrOn = "@00WD0510002055*";
StrOff = "@00WD0510000057*";
LogStr = "轨道2去边框请求";
}
Ret = true;
}
else if(WorkStep==_ETrack_Step_Reset_Load_Request)//复位上料机所有请求信号
{
StrOn = "@00WD0506000151*";
StrOff = "@00WD0506000050*";
LogStr = "复位上料机所有请求信号";
Ret = true;
}
if(Ret)
{
gLogMgr->WriteDebugLog("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