📄 beihangdlg.cpp
字号:
}
void CBeihangDlg::OnButtonZPause()
{
// TODO: Add your control notification handler code here
unsigned short Curren_Axis=1,Status;long sit;
short rtn=GT_GetSts(&Status);
if(!(Status&1))
{rtn=GT_AbptStp();
if(rtn==-1)//DLL_SngAxis_eStop(Curren_Axis))
{
AfxMessageBox("Z轴停车失败");
}
else
{
rtn=GT_GetAtlPos(&sit);
GetSystemTime(&t2);
ltime=(t2.wDay-t1.wDay)*3600*24+(t2.wHour-t1.wHour)*3600+\
(t2.wMinute-t1.wMinute)*60+t2.wSecond-t1.wSecond\
+(t2.wMilliseconds-t1.wMilliseconds)/1000.0;
m_dblZCurPos-=m_ZObjPos;
m_dblZCurPos+=((int)(curspeed*ltime*10))/10.;
m_ZObjPos=0;
curspeed=0;
// m_dblZCurPos+=params.atlzpos();
GT_ClrSts();
UpdateData(0);
}
}
}
void CBeihangDlg::OnButtonZZero()
{
// TODO: Add your control notification handler code here
m_dblZCurPos=0;
UpdateData(0);
}
void CBeihangDlg::OnButtonRZero()
{
// TODO: Add your control notification handler code here
m_dblRCurPos=0;
UpdateData(0);
}
void CBeihangDlg::OnButtonZero()
{
// TODO: Add your control notification handler code here
//DLL_SetZero(2);
long ctime,t;
zerosit=-1;
// m_ZObjPos=-m_dblZCurPos;
m_dblRCurPos=-m_dblConRStart;
m_dblZCurPos=-m_dblConZStart;
OnBtnZGoto();
time(&ctime);t=ctime;
while(t<ctime+etime)
time(&t);
// m_dblRObjPos=-m_dblRCurPos;
OnButtonRGoto();
m_dblRCurPos=0;
m_dblZCurPos=0;
m_ZObjPos=0;
m_dblRObjPos=0;
m_dblConRStart=0;
m_dblConZStart=0;
UpdateData(0);
zerosit=1;
}
void CBeihangDlg::OnButtonClear()
{
// TODO: Add your control notification handler code here
//DLL_SetZero(2);
runinfocnt=0;
m_dblRCurPos=0;
m_dblZCurPos=0;
m_dblConRStart=0;
m_dblConZStart=0;
UpdateData(0);
}
int CBeihangDlg::OnButtonScanStart()
{ bBreak=0;
tasknum=1;
if (SetTimer(1,200,NULL))
{
flag=0;
return 1;
}
pv->draw();
return 0;
}
void CBeihangDlg::OnButtonScanConEnd()
{
// TODO: Add your control notification handler code here
flag=1;
KillTimer(2);double temp;
unsigned short Curren_Axis=2;
if(!DLL_SngAxis_eStop(Curren_Axis))
{
AfxMessageBox("R轴停车失败");
}
else
{
GetSystemTime(&t2);
ltime=(t2.wDay-t1.wDay)*3600*24+(t2.wHour-t1.wHour)*3600+\
(t2.wMinute-t1.wMinute)*60+t2.wSecond-t1.wSecond\
+(t2.wMilliseconds-t1.wMilliseconds)/1000.0;
temp=abs(((int)(curspeedr*ltime*10))/10.);
}
Curren_Axis=1;
if(!DLL_SngAxis_eStop(Curren_Axis))
{
AfxMessageBox("Z轴停车失败");
}
else
{
// UpdateData();
}
if(m_dblConRStart<0)
temp=-temp;
params.axisRrun(60,-m_dblConRStart+temp);
long time_start,time_temp;
time(&time_start); time_temp=0;
while((double)(time_temp-time_start)<(abs(temp)/60+1))
time(&time_temp);
m_dblConRStart=0;
m_dblRCurPos=0;
//sign*=-1;
UpdateData(0);
}
void CBeihangDlg::OnButtonScanEnd()
{
// TODO: Add your control notification handler code here
flag=1;
unsigned short Curren_Axis=1;
if(!DLL_SngAxis_eStop(Curren_Axis))
{
AfxMessageBox("Z轴停车失败");
}
else
{
m_dblZCurPos+=params.atlzpos();
UpdateData();
}
}
int CBeihangDlg::OnBtnScanconStart()
{tasknum=2;
bBreak=0;
runinfocnt=0;
UpdateData(true);
RFinFlag=0;
RRunFlag=0;
ZFinFlag=0;
ZRunFlag=0;
double m_dblZStepDis=m_dblConZStep;
nArrAxisZ.RemoveAll();
nArrAxisR.RemoveAll();
nArrAxisZ.SetSize(0);
nArrAxisR.SetSize(0);
nArrAxisZ.Add(m_dblConZStart);
nArrAxisR.Add(m_dblConRStart);
int m_nZSngStepNo=(int)(abs(m_dblConZDis/m_dblConZStep));
for (int j=1;j<=m_nScanNumber*2;j++)
{
for(int i=1;i<=m_nZSngStepNo;i++)
{ sign*=-1;
m_dblConRDistance=sign * m_dblConRDistance;
nArrAxisR.Add(m_dblConRDistance);
nArrAxisZ.Add(m_dblZStepDis);
}
sign*=-1;
nArrAxisR.Add(sign * m_dblConRDistance);
nArrAxisZ.Add(0);
m_dblZStepDis=-1 * m_dblZStepDis;
}
m_nTwoConTimes=0;
m_nTwoNo=nArrAxisR.GetSize();
int cc=m_nTwoNo;
CArray<int,int> *p=(CArray<int,int> *)&nArrAxisZ;
int c=m_nTwoNo;
if (SetTimer(2,200,NULL))
return 1;
return 0;
}
HANDLE hSyncEvent,hSubThread;//信号量和线程句柄
bool stopflag;
void CBeihangDlg::OnDestroy()
{
// Close the servo and close the card
short rtn;
stopflag=true;
if(hSyncEvent)
SetEvent(hSyncEvent); //唤醒中断线程
if(hSubThread)
CloseHandle(hSubThread); //关闭中断线程
for(unsigned short i=1;i<3;i++) {
rtn=GT_Axis(i);// /error(rtn);
rtn=GT_AbptStp();
rtn=GT_AxisOff();// error(rtn);
}
rtn=GT_Close(); //err(rtn);
pv->draw();
// KillTimer(1);
CDialog::OnDestroy();
}
/*void CBeihangDlg::OnAxisMotion()
{
MessageBox("These routin illustrate how to make the axis run and how to respond\
interrupt with background command.");
#define MAX_SIZE 500
PBACKGROUND_COMMAND pBackCmd;
PGENERAL_COMMAND pCmd;
//指定要为多少种中断设置后台命令
BgCmdSet.Count=1; //要为两种中断设置后台命令
//分别为每个中断设置命令数组,对同一个中断允许设多条命令
pBackCmd=BgCmdSet.BackgroundCommand;
pBackCmd->InterruptMask=0x04; //指定中断原因
pBackCmd->CommandCount=1; //产生本中断时要执行的命令数量
//分别填充每一条命令
//第一条命令
pCmd=pBackCmd->GenCommand;
pCmd->usCommand= Intr_GT_GetAtlPos; //设定命令类型字
pCmd->OutputLength=0; //该命令执行时,需要向DSP输出多少个字长度的数据
pCmd->InputLength=2; //该命令执行时,需要从DSP输入多少个字长度的数据
pCmd->in.lData=5000; //输入数据
pCmd->out.lData=0; //输出数据
//将命令缓冲传给设备ISR
short rtn=GT_SetBgCommandSet(&BgCmdSet,MAX_SIZE); // err(rtn);
//之后释放内存
}*/
double sit[500][2];
static unsigned long count=0;
DWORD WINAPI CBeihangDlg::intproc(LPVOID param)
{ CBeihangDlg* pd=(CBeihangDlg*)param;
double ltime,temp;
unsigned short Status=0;
short rtn;
for(int i=0;i<500;i++)
{
sit[i][0]=0;sit[i][1]=0;
}
ResetEvent(hSyncEvent);
rtn=GT_CaptProb();
while(1)
{//waiting for interrupt happen
WaitForSingleObject(hSyncEvent,INFINITE);
if(!pd->bBreak)
{if(runinfocnt==0)
{sit[0][0]=pd->m_dblZCurPos;
sit[0][1]=pd->m_dblRCurPos;
}
GetSystemTime(&t2);
if(stopflag) break;
//add your code for handling intrerrupt event here
/*very important!!!!!!!
*very important!!!!!!!!*/
//error(rtn);
rtn=GT_ExInpt(&Status);
if(Status&0x1&&brun==1)
{
//pgv->draw();
pd->pv->draw();
brun=0;
break;
}
ltime=(t2.wDay-t1.wDay)*3600*24+(t2.wHour-t1.wHour)*3600+\
(t2.wMinute-t1.wMinute)*60+t2.wSecond-t1.wSecond\
+(t2.wMilliseconds-t1.wMilliseconds)/1000.0;
if(!Status&0x01&&runinfocnt<100)
{ if(pd->bstop)
{GT_Axis(1);
GT_AbptStp();
GT_Axis(2);
GT_AbptStp();
if(pd->tasknum==1)
pd->KillTimer(1);
else if(pd->tasknum==2)
pd->KillTimer(2);
pd->bBreak=1;
goto jmp;
}
temp=abs(((int)(pd->curspeed*ltime*10))/10.);
if(temp>.2)
{if(*pcuraxis==1)
{
sit[runinfocnt+1][0]=pd->m_dblZCurPos+temp;
sit[runinfocnt+1][1]=pd->m_dblRCurPos;
}
else
{
sit[runinfocnt+1][0]=pd->m_dblZCurPos;
sit[runinfocnt+1][1]=pd->m_dblRCurPos+temp;
}
//reset event state
Beep(262,100);
Beep(288,100);
Beep(320,100);
ResetEvent(hSyncEvent);
if(runinfocnt>100)
break;
else if(abs(sit[runinfocnt+1][0]-sit[runinfocnt][0])>.2||\
abs(sit[runinfocnt+1][1]-sit[runinfocnt][1])>10)
runinfocnt++;
}
}
}
jmp:;
}
rtn=GT_SetIntSyncEvent(NULL);
if(rtn) AfxMessageBox("Some function return a error!");
//close Synchronize Event Handle
CloseHandle(hSyncEvent);
ExitThread(0);
return 0;
}
void CBeihangDlg::SetGTTimer()
{
//Create Sync event
hSyncEvent=CreateEvent(NULL,true,false,NULL);
if(hSyncEvent==INVALID_HANDLE_VALUE)
{
AfxMessageBox("Create Synchnorize Event fail\n");
return ;
}
short rtn;
//将应用程序的事件与底层中断相关连
rtn=GT_SetIntSyncEvent(hSyncEvent); // err(rtn);
//设置中断时间
rtn=GT_SetIntrTm(500);
//rtn=GT_EvntIntr();// err(rtn);
//中断模式为事件中断
rtn=GT_TmrIntr(); // err(rtn);
//中断模式设为时间中断
//开设中断服务线程
stopflag=false;
DWORD idSubThread;
hSubThread=CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)CBeihangDlg::intproc, // the route handling interrupt
this,//the parameter of intproc
0,
&idSubThread);
//.......wait for interrupt----I do it in timer
}
void CBeihangDlg::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
if(nChar==VK_CONTROL&&bstop)
{flag=1;
unsigned short Curren_Axis=1;
if(!DLL_SngAxis_eStop(Curren_Axis))
{
AfxMessageBox("Z轴停车失败");
}
else
{
//m_dblZCurPos+=params.atlzpos();
// UpdateData();
}
Curren_Axis=2;
if(!DLL_SngAxis_eStop(Curren_Axis))
{
AfxMessageBox("R轴停车失败");
}
else
{
//m_dblZCurPos+=params.atlzpos();
// UpdateData();
}
}
CDialog::OnChar(nChar, nRepCnt, nFlags);
}
void CBeihangDlg::OnOK()
{
// TODO: Add your message handler code here and/or call default
if(!DLL_SngAxis_eStop(1))
{
AfxMessageBox("Z轴停车失败");
}
if(!DLL_SngAxis_eStop(2))
{
AfxMessageBox("R轴停车失败");
}
CDialog::OnCancel();
}
void CBeihangDlg::OnFailureStop()
{
// TODO: Add your message handler code here and/or call default
CWnd* p=this->GetDlgItem(IDC_BUTTON3);
if(bstop==1)
{ bstop=0;
p->SetWindowText("缺陷纪录");
}
else
{ bstop=1;
p->SetWindowText("缺陷停止");
}
}
void CBeihangDlg::OnCANCEL()
{
// TODO: Add your message handler code here and/or call default
KillTimer(2);
if(!DLL_SngAxis_eStop(2))
{
AfxMessageBox("R轴停车失败");
}
if(!DLL_SngAxis_eStop(1))
{
AfxMessageBox("Z轴停车失败");
}
CDialog::OnCancel();
}
void CBeihangDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
if(nChar==VK_CONTROL&&bstop)
{flag=1;
unsigned short Curren_Axis=1;
if(!DLL_SngAxis_eStop(Curren_Axis))
{
AfxMessageBox("Z轴停车失败");
}
else
{
//m_dblZCurPos+=params.atlzpos();
// UpdateData();
}
Curren_Axis=2;
if(!DLL_SngAxis_eStop(Curren_Axis))
{
AfxMessageBox("R轴停车失败");
}
else
{
//m_dblZCurPos+=params.atlzpos();
// UpdateData();
}
}
CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -