📄 maxoncomdlg.cpp
字号:
/************************************打开串口2*******************************/
if(!m_mscomm2.GetPortOpen())
m_mscomm2.SetPortOpen(TRUE);
//else
// AfxMessageBox("Cannot Open Serial Port 2!");
/****************************Programmed Position Mode************************/
UpdateData(TRUE); //读取运动参数
str0 = "s r0x24 0\r"; //Disable the amplifier.
//"\r": Carriage return character
m_mscomm2.SetOutput(COleVariant(str0));
Sleep(50);
str1 = "s r0xc8 256\r"; //Value = 256, Relative move, trapezoidal profile
m_mscomm2.SetOutput(COleVariant(str1));
Sleep(50);
m_dDistance = atof(m_sDistance);
m_sDistance.Format("%.0f\r",m_dDistance);
str2 = "s r0xca "; //Relative move distance.
strcpy(str_temp,str2);
strcat(str_temp,m_sDistance);
m_mscomm2.SetOutput(COleVariant(str_temp));
Sleep(50);
m_dVelocity = atof(m_sVelocity);
m_sVelocity.Format("%.0f\r",m_dVelocity);
str3 = "s r0xcb "; //Trajectory maximum velocity.
strcpy(str_temp,str3);
strcat(str_temp,m_sVelocity);
m_mscomm2.SetOutput(COleVariant(str_temp));
Sleep(50);
m_dAcceleration = atof(m_sAcceleration);
m_sAcceleration.Format("%.0f\r",m_dAcceleration);
str4 = "s r0xcc "; //Trajectory maximum acceleration.
strcpy(str_temp,str4);
strcat(str_temp,m_sAcceleration);
m_mscomm2.SetOutput(COleVariant(str_temp));
Sleep(50);
m_dDeceleration = atof(m_sDeceleration);
m_sDeceleration.Format("%.0f\r",m_dDeceleration);
str5 = "s r0xcd "; //Trajectory maximum deceleration.
strcpy(str_temp,str5);
strcat(str_temp,m_sDeceleration);
m_mscomm2.SetOutput(COleVariant(str_temp));
Sleep(50);
}
void CMaxoncomDlg::OnBtnDisable() //去使能
{
KillTimer(1);
m_sCurrent_Rt.Format("%d",0);
m_sDeceleration_Rt.Format("%d",0);
UpdateData(false);
// TODO: Add your control notification handler code here
/*************************************打开串口2******************************/
if(!m_mscomm2.GetPortOpen())
m_mscomm2.SetPortOpen(TRUE);
//else
// AfxMessageBox("Cannot Open Serial Port 2!");
/***********************************去使能放大器******************************/
str10 = "s r0x24 0\r"; //t 0, abort a move in progress. 《ASCII_ProgrammersGuide》的第29/78页。
m_mscomm2.SetOutput(COleVariant(str10));
Sleep(100);
/*************************************关闭串口2******************************/
if(m_mscomm2.GetPortOpen())
m_mscomm2.SetPortOpen(FALSE);
}
BEGIN_EVENTSINK_MAP(CMaxoncomDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CMaxoncomDlg)
ON_EVENT(CMaxoncomDlg, IDC_MSCOMM1, 1 /* OnComm */, OnOnCommMscomm1, VTS_NONE)
ON_EVENT(CMaxoncomDlg, IDC_MSCOMM2, 1 /* OnComm */, OnOnCommMscomm2, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
void CMaxoncomDlg::OnOnCommMscomm1()
{
// TODO: Add your control notification handler code here
}
void CMaxoncomDlg::OnOnCommMscomm2()
{
// TODO: Add your control notification handler code here
/********************************循环采集串口2数据*****************************/
VARIANT variant_inp;
COleSafeArray safearray_inp;
//LONG len,k;
//BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
if(m_mscomm2.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp = m_mscomm2.GetInput(); //读缓冲区
safearray_inp = variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
}
strtemp0 = rxdata[0];
strtemp1 = rxdata[1];
strtemp2 = rxdata[2];
}
void CMaxoncomDlg::OnBtnStop() //“停止”按钮
{
// TODO: Add your control notification handler code here
/***********************************取消电机运动*****************************/
str8 = "t 0\r"; //t 0, abort a move in progress. 《ASCII_ProgrammersGuide》的第29/78页。
m_mscomm2.SetOutput(COleVariant(str8));
Sleep(50);
/**********************************去使能放大器******************************/
str10 = "s r0x24 0\r"; //s r0x24 0: Disable the amplifier.
m_mscomm2.SetOutput(COleVariant(str10));
Sleep(50);
KillTimer(1); //关闭定时器1
/***********************************关闭串口2********************************/
if(m_mscomm2.GetPortOpen())
m_mscomm2.SetPortOpen(FALSE);
}
void CMaxoncomDlg::OnBtnStart() //“运转”按钮
{
// TODO: Add your control notification handler code here
KillTimer(1);
/*************************************打开串口2******************************/
if(!m_mscomm2.GetPortOpen())
m_mscomm2.SetPortOpen(TRUE);
//else
// AfxMessageBox("Cannot Open Serial Port 2!");
/*************************************电机运转*******************************/
str6 = "s r0x24 21\r"; //s r0x24 21: In servo mode, the position loop is driven by the trajectory generator.
m_mscomm2.SetOutput(COleVariant(str6));
Sleep(50);
str6 = "t 1\r"; //t 1, initiate a move. 《ASCII_ProgrammersGuide》的第19/78页。
m_mscomm2.SetOutput(COleVariant(str6));
Sleep(50);
/**********************************采集串口2数据*****************************/
VARIANT variant_inp;
COleSafeArray safearray_inp;
//LONG len,k;
//BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
if(m_mscomm2.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp = m_mscomm2.GetInput(); //读缓冲区
safearray_inp = variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
}
for(;;)
{
if((rxdata[0] == 111) & (rxdata[1] == 107)) //ok的ASCII码
break;
}
Sleep(50);
m_dDistance_Rt = 0;
m_dCurrent_Rt = 0;
SetTimer(1,100,NULL);
}
void CMaxoncomDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(positionorcurrent == TRUE) //检测距离
{
str0 = "g r0x32\r"; //Read actual position.
m_mscomm2.SetOutput(COleVariant(str0));
//m_mscomm2.GetInput();
//Sleep(50);
for(;;)
{
if(rxdata[0] == 118) //v的ASCII码是118。
{
if(m_dDistance > 0)
{
m_dDistance_Rt = m_dDistance_Rt + rxdata[2]; //正向运转时计算运动距离
}
else
{
m_dDistance_Rt = m_dDistance_Rt - rxdata[2]; //反向运转时计算运动距离
}
m_sDistance_Rt.Format("%.2f",m_dDistance_Rt);
m_sCurrent_Rt.Format("%.2f",m_dCurrent_Rt/100);
UpdateData(FALSE);
//str0 = "g r0x18\r"; //速度
//m_mscomm2.SetOutput(COleVariant(str0));
//Sleep(50);
if(abs(m_dDistance_Rt) >= abs(m_dDistance))
{
KillTimer(1); //关闭定时器1
/***********************************取消电机运动******************************/
str8 = "t 0\r"; //t 0, abort a move in progress. 《ASCII_ProgrammersGuide》的第29/78页。
m_mscomm2.SetOutput(COleVariant(str8));
//Sleep(50);
/***********************************去使能放大器******************************/
str10 = "s r0x24 0\r"; //s r0x24 0: Disable the amplifier.
m_mscomm2.SetOutput(COleVariant(str10));
//Sleep(50);
//AfxMessageBox("m_dDistance_Rt >= m_dDistance");
//KillTimer(1);
}
}
positionorcurrent = FALSE;
break;
}
}
else //检测电流
{
str0 = "g r0x0c\r"; //Read actual current output from the amplifier.
m_mscomm2.SetOutput(COleVariant(str0));
for(;;)
{
if(rxdata[0] == 118) //v的ASCII码是118。
{
m_dCurrent_Rt = rxdata[2];
m_sCurrent_Rt.Format("%.4f",m_dCurrent_Rt/100);
UpdateData(FALSE);
positionorcurrent = TRUE;
break;
}
else if(abs(m_dDistance_Rt) >= abs(m_dDistance))
{
KillTimer(1); //关闭定时器1
/***********************************取消电机运动******************************/
str8 = "t 0\r"; //t 0, abort a move in progress. 《ASCII_ProgrammersGuide》的第29/78页。
m_mscomm2.SetOutput(COleVariant(str8));
//Sleep(50);
/***********************************去使能放大器******************************/
str10 = "s r0x24 0\r"; //s r0x24 0: Disable the amplifier.
m_mscomm2.SetOutput(COleVariant(str10));
//Sleep(50);
}
}
}
CDialog::OnTimer(nIDEvent);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -