📄 pmacctrldlg.cpp
字号:
GetDlgItem(IDC_SA_EDIT)->EnableWindow(FALSE);
GetDlgItem(IDC_SB_EDIT)->EnableWindow(FALSE);
GetDlgItem(IDC_EX_EDIT)->EnableWindow(FALSE);
GetDlgItem(IDC_EY_EDIT)->EnableWindow(FALSE);
GetDlgItem(IDC_EZ_EDIT)->EnableWindow(FALSE);
GetDlgItem(IDC_EA_EDIT)->EnableWindow(FALSE);
GetDlgItem(IDC_EB_EDIT)->EnableWindow(FALSE);
GetDlgItem(IDC_SR_EDIT)->EnableWindow(TRUE);
GetDlgItem(IDC_SANG_EDIT)->EnableWindow(TRUE);
GetDlgItem(IDC_SCPX_EDIT)->EnableWindow(TRUE);
GetDlgItem(IDC_SCPY_EDIT)->EnableWindow(TRUE);
GetDlgItem(IDC_SCPZ_EDIT)->EnableWindow(TRUE);
GetDlgItem(IDC_ER_EDIT)->EnableWindow(TRUE);
GetDlgItem(IDC_EANG_EDIT)->EnableWindow(TRUE);
GetDlgItem(IDC_ECPX_EDIT)->EnableWindow(TRUE);
GetDlgItem(IDC_ECPY_EDIT)->EnableWindow(TRUE);
GetDlgItem(IDC_ECPZ_EDIT)->EnableWindow(TRUE);
UpdateData(TRUE);
m_SrEdit = 0; m_ErEdit = 0;
m_SangEdit = 0; m_EangEdit = 0;
m_ScpxEdit = 0; m_EcpxEdit = 0;
m_ScpyEdit = 0; m_EcpyEdit = 0;
m_ScpzEdit = 0; m_EcpzEdit = 0;
UpdateData(FALSE);
}
}
// ============================="默认"按钮-函数================================
// 对应于"菜单-默认数据"
// =============================================================================
void CPmacCtrlDlg::OnDefault()
{
CPmacCtrlDlg::OnFileDefault();
}
// ============================="保存"按钮-函数================================
void CPmacCtrlDlg::OnSave()
{
CPmacCtrlDlg::OnFileSave();
}
// ============================="确定"按钮-函数================================
// 对应于"控制-数据处理"
// =============================================================================
void CPmacCtrlDlg::OnConfirm()
{
CPmacCtrlDlg::OnCtrlProcess();
}
// ============================="退出"按键-函数================================
void CPmacCtrlDlg::OnExit()
{
CPmacCtrlDlg::OnFileExit();
}
// ============================="初始化PMAC"-按钮================================
void CPmacCtrlDlg::OnInitial()
{
CPmacCtrlDlg::OnCtrlInitial();
}
// ============================="机床归零"-按钮================================
void CPmacCtrlDlg::OnZero()
{
CPmacCtrlDlg::OnCtrlZero();
}
// ============================="零点偏移"-按钮================================
void CPmacCtrlDlg::OnExcursion()
{
CPmacCtrlDlg::OnCtrlExcursion();
}
// ============================="文件下载"按键-函数================================
void CPmacCtrlDlg::OnLoadfile()
{
CPmacCtrlDlg::OnCtrlLoadfile();
}
// ============================="执行程序"-按钮================================
void CPmacCtrlDlg::OnExecute()
{
CPmacCtrlDlg::OnCtrlExecute();
}
// ============================="显示构型图例"-函数================================
void CPmacCtrlDlg::OnShowBUTTON()
{
CPmacCtrlDlg::OnCtrlOutputphoto();
}
// ============================="输出构型参数"-函数================================
void CPmacCtrlDlg::OnOutputpara()
{
CPmacCtrlDlg::OnCtrlOutputpara();
}
// ============================="查看插补数据"-函数================================
void CPmacCtrlDlg::OnViewInterpolation()
{
CPmacCtrlDlg::OnCtrlViewInterpolation();
}
// ============================="查看逆解数据"-函数================================
void CPmacCtrlDlg::OnViewInvkine()
{
CPmacCtrlDlg::OnCtrlViewInvkine();
}
// ============================="加载NC代码"按钮-函数================================
void CPmacCtrlDlg::OnLoadnc()
{
CPmacCtrlDlg::OnCtrlLoadnc();
}
// ============================="自动运行"按钮-函数================================
void CPmacCtrlDlg::OnAutoexecute()
{
CPmacCtrlDlg::OnCtrlAutoexecute();
}
// =============="Linear Interpolation"==============
void CPmacCtrlDlg::OnCtrlInterpolationL()
{
double Vmax = 200, Amax = 500; // unit: mm/s, mm/s2;
double dt = 0.02; // unit: s;
double dx, dy, dz, da, db, dmax;
double ta, tr, tt, T;
double vx, vy, vz, wa, wb, ax, ay, az, ea, eb;
double Inx, Iny, Inz, Ina, Inb, Ing;
UpdateData(TRUE);
dx = m_ExEdit - m_SxEdit;
dy = m_EyEdit - m_SyEdit;
dz = m_EzEdit - m_SzEdit;
da = m_EaEdit*pi/180 - m_SaEdit*pi/180;
db = m_EbEdit*pi/180 - m_SbEdit*pi/180;
dmax = max(max(fabs(dx),fabs(dy)),fabs(dz));
ta = Vmax/Amax;
tr = dmax/Vmax - ta;
tt = tr + 2*ta;
vx = dx/(ta+tr); ax = vx/ta;
vy = dy/(ta+tr); ay = vy/ta;
vz = dz/(ta+tr); az = vz/ta;
wa = da/(ta+tr); ea = wa/ta;
wb = db/(ta+tr); eb = wb/ta;
FILE *fp1, *fp2;
FILE *fp;
fp1 = fopen(BASEDIR+FILEINTPL, "w+");
fp2 = fopen(BASEDIR+FILEINVKL, "w+");
fp = fopen(BASEDIR+FILEPMACL, "w+");
fprintf(fp1, "*************插补数据*************\n");
fprintf(fp1, "-----------------------------------------------------------\n");
fprintf(fp2, "*************逆解数据*************\n");
fprintf(fp2, "-----------------------------------------------------------\n");
fprintf(fp, "\nOPEN PROG 10\nCLEAR\nABS\nF10\nLINEAR\n");
for(int i=0; i<tt/dt+1; i++)
{
T = i*dt;
if(T < ta)
{
Inx = m_SxEdit + 0.5*ax*T*T;
Iny = m_SyEdit + 0.5*ay*T*T;
Inz = m_SzEdit + 0.5*az*T*T;
Ina = m_SaEdit + 0.5*ea*T*T;
Inb = m_SbEdit + 0.5*eb*T*T;
Ing = 0;
fprintf(fp1, "X %.3f Y %.3f Z %.3f A %.3f B %.3f G %.3f\n", Inx,Iny,Inz,Ina,Inb,Ing);
if(m_Structure == 0)
CPmacCtrlDlg::OnCtrlInvkineA(Inx, Iny, Inz, Ina, Inb, Ing);
else if(m_Structure == 1)
CPmacCtrlDlg::OnCtrlInvkineB(Inx, Iny, Inz, Ina, Inb, Ing);
else if(m_Structure == 2)
CPmacCtrlDlg::OnCtrlInvkineC(Inx, Iny, Inz, Ina, Inb, Ing);
else if(m_Structure == 3)
CPmacCtrlDlg::OnCtrlInvkineD(Inx, Iny, Inz, Ina, Inb, Ing);
else
CPmacCtrlDlg::OnCtrlInvkineE(Inx, Iny, Inz, Ina, Inb, Ing);
if(dl1 > 180 || dl2 > 180 || dl3 > 180 || dl4 > 180 || dl5 > 180 || dl6 > 180)
goto quota;
fprintf(fp2, "X %.3f Y %.3f Z %.3f U %.3f V %.3f W %.3f\n", -dl6,-dl5,-dl2,-dl1,-dl4,-dl3);
fprintf(fp, "X %.3f Y %.3f Z %.3f U %.3f V %.3f W %.3f\n", -dl6,-dl5,-dl2,-dl1,-dl4,-dl3);
}
else if(T < (tt-ta))
{
Inx = m_SxEdit + 0.5*ax*T*T + vx*(T-ta);
Iny = m_SyEdit + 0.5*ay*T*T + vy*(T-ta);
Inz = m_SzEdit + 0.5*az*T*T + vz*(T-ta);
Ina = m_SaEdit + 0.5*ea*T*T + wa*(T-ta);
Inb = m_SbEdit + 0.5*eb*T*T + wb*(T-ta);
Ing = 0;
fprintf(fp1, "X %.3f Y %.3f Z %.3f A %.3f B %.3f G %.3f\n", Inx,Iny,Inz,Ina,Inb,Ing);
if(m_Structure == 0)
CPmacCtrlDlg::OnCtrlInvkineA(Inx, Iny, Inz, Ina, Inb, Ing);
else if(m_Structure == 1)
CPmacCtrlDlg::OnCtrlInvkineB(Inx, Iny, Inz, Ina, Inb, Ing);
else if(m_Structure == 2)
CPmacCtrlDlg::OnCtrlInvkineC(Inx, Iny, Inz, Ina, Inb, Ing);
else if(m_Structure == 3)
CPmacCtrlDlg::OnCtrlInvkineD(Inx, Iny, Inz, Ina, Inb, Ing);
else
CPmacCtrlDlg::OnCtrlInvkineE(Inx, Iny, Inz, Ina, Inb, Ing);
if(dl1 > 180 || dl2 > 180 || dl3 > 180 || dl4 > 180 || dl5 > 180 || dl6 > 180)
goto quota;
fprintf(fp2, "X %.3f Y %.3f Z %.3f U %.3f V %.3f W %.3f\n", -dl6,-dl5,-dl2,-dl1,-dl4,-dl3);
fprintf(fp, "X %.3f Y %.3f Z %.3f U %.3f V %.3f W %.3f\n", -dl6,-dl5,-dl2,-dl1,-dl4,-dl3);
}
else
{
Inx = m_ExEdit - 0.5*ax*(tt-T)*(tt-T);
Iny = m_EyEdit - 0.5*ay*(tt-T)*(tt-T);
Inz = m_EzEdit - 0.5*az*(tt-T)*(tt-T);
Ina = m_EaEdit - 0.5*ea*(tt-T)*(tt-T);
Inb = m_EbEdit - 0.5*eb*(tt-T)*(tt-T);
Ing = 0;
fprintf(fp1, "X %.3f Y %.3f Z %.3f A %.3f B %.3f G %.3f\n", Inx,Iny,Inz,Ina,Inb,Ing);
if(m_Structure == 0)
CPmacCtrlDlg::OnCtrlInvkineA(Inx, Iny, Inz, Ina, Inb, Ing);
else if(m_Structure == 1)
CPmacCtrlDlg::OnCtrlInvkineB(Inx, Iny, Inz, Ina, Inb, Ing);
else if(m_Structure == 2)
CPmacCtrlDlg::OnCtrlInvkineC(Inx, Iny, Inz, Ina, Inb, Ing);
else if(m_Structure == 3)
CPmacCtrlDlg::OnCtrlInvkineD(Inx, Iny, Inz, Ina, Inb, Ing);
else
CPmacCtrlDlg::OnCtrlInvkineE(Inx, Iny, Inz, Ina, Inb, Ing);
if(dl1 > 180 || dl2 > 180 || dl3 > 180 || dl4 > 180 || dl5 > 180 || dl6 > 180)
goto quota;
fprintf(fp2, "X %.3f Y %.3f Z %.3f U %.3f V %.3f W %.3f\n", -dl6,-dl5,-dl2,-dl1,-dl4,-dl3);
fprintf(fp, "X %.3f Y %.3f Z %.3f U %.3f V %.3f W %.3f\n", -dl6,-dl5,-dl2,-dl1,-dl4,-dl3);
}
}
fprintf(fp,"CLOSE\n");
goto normal;
quota: AfxMessageBox("给出轨迹参数超出机床的运动空间,请更改参数!");
normal: fclose(fp1);
fclose(fp2);
fclose(fp);
UpdateData(FALSE);
}
// ================="Circle Interpolation"=================
void CPmacCtrlDlg::OnCtrlInterpolationC()
{
double dt = 0.03, tt, T, rad = pi/180;
double AngVel = 200*rad;
double Xd[3] = {1, 0, 0}, Yd[3] = {0, 1, 0}; // Orientation;
double R, Ang, CInx, CIny, CInz, CIna, CInb, CIng;
UpdateData(TRUE);
R = m_SrEdit;
tt = (m_EangEdit - m_SangEdit)/AngVel;
FILE *fp1, *fp2;
FILE *fp;
fp1 = fopen(BASEDIR + FILEINTPC, "w+");
fp2 = fopen(BASEDIR + FILEINVKC, "w+");
fp = fopen(BASEDIR + FILEPMACC, "w+");
fprintf(fp1, "*************插补数据*************\n");
fprintf(fp1, "-----------------------------------------------------------\n");
fprintf(fp2, "*************逆解数据*************\n");
fprintf(fp2, "-----------------------------------------------------------\n");
fprintf(fp, "\nOPEN PROG 10\nCLEAR\nABS\nF10\nLINEAR\n");
for(int i=0; i<tt/dt+1; i++)
{
T = i*dt;
Ang = T*AngVel + m_SangEdit;
CInx = m_ScpxEdit + R*Xd[0]*cos(Ang) + R*Yd[0]*sin(Ang);
CIny = m_ScpyEdit + R*Xd[1]*cos(Ang) + R*Yd[1]*sin(Ang);
CInz = m_ScpzEdit + R*Xd[2]*cos(Ang) + R*Yd[2]*sin(Ang);
CIna = 0;
CInb = 0;
CIng = 0;
fprintf(fp1, "X %.3f Y %.3f Z %.3f A %.3f B %.3f G %.3f\n", CInx,CIny,CInz,CIna,CInb,CIng);
if(m_Structure == 0)
CPmacCtrlDlg::OnCtrlInvkineA(CInx, CIny, CInz, CIna, CInb, CIng);
else if(m_Structure == 1)
CPmacCtrlDlg::OnCtrlInvkineB(CInx, CIny, CInz, CIna, CInb, CIng);
else if(m_Structure == 2)
CPmacCtrlDlg::OnCtrlInvkineC(CInx, CIny, CInz, CIna, CInb, CIng);
else if(m_Structure == 3)
CPmacCtrlDlg::OnCtrlInvkineD(CInx, CIny, CInz, CIna, CInb, CIng);
else
CPmacCtrlDlg::OnCtrlInvkineE(CInx, CIny, CInz, CIna, CInb, CIng);
if(dl1 > 180 || dl2 > 180 || dl3 > 180 || dl4 > 180 || dl5 > 180 || dl6 > 180)
goto quota;
fprintf(fp2, "X %.3f Y %.3f Z %.3f U %.3f V %.3f W %.3f\n", -dl6,-dl5,-dl2,-dl1,-dl4,-dl3);
fprintf(fp, "X %.3f Y %.3f Z %.3f U %.3f V %.3f W %.3f\n", -dl6,-dl5,-dl2,-dl1,-dl4,-dl3);
}
fprintf(fp,"CLOSE\n");
goto normal;
quota: AfxMessageBox("给出轨迹参数超出机床的运动空间,请更改参数!");
normal: fclose(fp1);
fclose(fp2);
fclose(fp);
UpdateData(FALSE);
}
// ================="Helix Interpolation"=================
void CPmacCtrlDlg::OnCtrlInterpolationH()
{
double dt = 0.03, tt, T, rad = pi/180;
double AngVel = 200*rad;
double Xd[3] = {1, 0, 0}, Yd[3] = {0, 1, 0}; // Orientation;
double R, Ang, Xv, Yv, Zv;
double HInx, HIny, HInz, HIna, HInb, HIng;
UpdateData(TRUE);
tt = (m_EangEdit - m_SangEdit)/AngVel;
Xv = (m_EcpxEdit - m_ScpxEdit)/tt;
Yv = (m_EcpyEdit - m_ScpyEdit)/tt;
Zv = (m_EcpzEdit - m_ScpzEdit)/tt;
FILE *fp1, *fp2;
FILE *fp;
fp1 = fopen(BASEDIR + FILEINTPH, "w+");
fp2 = fopen(BASEDIR + FILEINVKH, "w+");
fp = fopen(BASEDIR + FILEPMACH, "w+");
fprintf(fp1, "*************插补数据*************\n");
fprintf(fp1, "-----------------------------------------------------------\n");
fprintf(fp2, "*************逆解数据*************\n");
fprintf(fp2, "-----------------------------------------------------------\n");
fprintf(fp, "\nOPEN PROG 10\nCLEAR\nABS\nF10\nLINEAR\n");
for(int i=0; i<tt/dt+1; i++)
{
T = i*dt;
R = m_SrEdit + T*((m_ErEdit - m_SrEdit)/tt);
Ang = T*AngVel + m_SangEdit;
HInx = m_ScpxEdit + R*Xd[0]*cos(Ang) + R*Yd[0]*sin(Ang) + Xv*T;
HIny = m_ScpyEdit + R*Xd[1]*cos(Ang) + R*Yd[1]*sin(Ang) + Yv*T;
HInz = m_ScpzEdit + R*Xd[2]*cos(Ang) + R*Yd[2]*sin(Ang) + Zv*T;
HIna = 0;
HInb = 0;
HIng = 0;
fprintf(fp1, "X %.3f Y %.3f Z %.3f A %.3f B %.3f G %.3f\n", HInx,HIny,HInz,HIna,HInb,HIng);
if(m_Structure == 0)
CPmacCtrlDlg::OnCtrlInvkineA(HInx, HIny, HInz, HIna, HInb, HIng);
else if(m_Structure == 1)
CPmacCtrlDlg::OnCtrlInvkineB(HInx, HIny, HInz, HIna, HInb, HIng);
else if(m_Structure == 2)
CPmacCtrlDlg::OnCtrlInvkineC(HInx, HIny, HInz, HIna, HInb, HIng);
else if(m_Structure == 3)
CPmacCtrlDlg::OnCtrlInvkineD(HInx, HIny, HInz, HIna, HInb, HIng);
else
CPmacCtrlDlg::OnCtrlInvkineE(HInx, HIny, HInz, HIna, HInb, HIng);
if(dl1 > 180 || dl2 > 180 || dl3 > 180 || dl4 > 180 || dl5 > 180 || dl6 > 180)
goto quota;
fprin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -