实例介绍
【实例简介】PCI运动控制卡开发
【实例截图】
【核心代码】
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace Demo { public partial class Form1 : Form { public Form1() { InitializeComponent(); } #region 全局参数声明代码部分 CtrlCard g_CtrlCard = new CtrlCard(); //驱动类全局参数 Int32 m_addmode = 0;//默认运动模式为T型 const Int32 MAXAXI = 4;//最大轴号 const Int32 MaxOUT = 31;//最大输出端口号 const Int32 MaxIN = 34;//最大输入端口号 static bool manual = false;//默认为禁用手轮 Int32 g_AxiNo = 1;//默认参数界面为X轴 Int32 g_ZeroAxi = 1;//单轴回零轴号 bool m_StopFlag = false; Int32 m_dir = 0; //基本运动参数 int[] m_nStartv = new int[MAXAXI], m_nSpeed = new int[MAXAXI], m_nAcc = new int[MAXAXI], m_nRatio = new int[MAXAXI], m_nDec = new int[MAXAXI], m_nPulse = new int[MAXAXI]; //复合运动参数 int[] m_nStartv1 = new int[MAXAXI], m_nSpeed1 = new int[MAXAXI], m_nVAcc = new int[MAXAXI]; double[] m_nTAcc = new double[MAXAXI]; int m_moveMode = 0; //特殊运动界面 int[] m_SpePulse = new int[MAXAXI]; int m_reg = 0; int m_relation = 0; int m_mainAxiKeep = 0; int m_SignalStatus = 0; int m_mainAxiStatus = 0; public struct SelectInfo { public Int32[] selectAxi;//被选中的轴号 public Int32 AxiNo;//被选中的轴数 public Int32 MinAxi;//被选中的最小轴号 } SelectInfo m_SelectInfo;//轴选择信息结构体 struct Para//系统参数结构体 { public Int32 m_pulsemode;//脉冲模式 public Int32 m_Lmtdp;//正负限位有效电平 public Int32 m_Stop0effective;//stop0是否有效 public Int32 m_Stop0dp;//stop0有效电平 public Int32 m_Stop1effective;//stop1是否有效 public Int32 m_Stop1dp;//stop1有效电平 public Int32 m_Stop2effective;//stop2是否有效 public Int32 m_Stop2dp;//stop2有效电平 public Int32 m_Alarmeffective;//stop2是否有效 public Int32 m_Alarmdp;//stop2有效电平 public Int32 m_Circleeffective;//可变环形是否有效 public Int32 m_Inposeffective;//到位信号是否有效 public Int32 m_Inposdp;//到位信号有效电平 } Para[] m_para = new Para[MAXAXI];//默认四个轴 public struct Zero//系统参数结构体 { public Int32 m_dir; public Int32 m_stop0; public Int32 m_lmt; public Int32 m_stop1; public Int32 m_bkRange; public Int32 m_ZRange; public Int32 m_Off; public Int32 m_StartV; public Int32 m_SearchV; public Int32 m_Speed; public Int32 m_Acc; public Int32 m_ZSpeed; } Zero[] m_ZeroPara = new Zero[MAXAXI];//默认四个轴 #endregion #region 基本界面代码部分 //界面初始化 private void Form1_Load(object sender, EventArgs e) { StartV_X.Text = "1000"; StartV_Y.Text = "1000"; StartV_Z.Text = "1000"; StartV_A.Text = "1000"; Speed_X.Text = "3000"; Speed_Y.Text = "3000"; Speed_Z.Text = "3000"; Speed_A.Text = "3000"; Acc_X.Text = "1500"; Acc_Y.Text = "1500"; Acc_Z.Text = "1500"; Acc_A.Text = "1500"; Dec_X.Text = "1500"; Dec_Y.Text = "1500"; Dec_Z.Text = "1500"; Dec_A.Text = "1500"; PulseX.Text = "10000"; PulseY.Text = "10000"; PulseZ.Text = "10000"; PulseA.Text = "10000"; StartV_X1.Text = "1000"; StartV_Y1.Text = "1000"; StartV_Z1.Text = "1000"; StartV_A1.Text = "1000"; Speed_X1.Text = "3000"; Speed_Y1.Text = "3000"; Speed_Z1.Text = "3000"; Speed_A1.Text = "3000"; TAccX.Text = "0.1"; TAccY.Text = "0.1"; TAccZ.Text = "0.1"; TAccA.Text = "0.1"; VAccX.Text = "300"; VAccY.Text = "300"; VAccZ.Text = "300"; VAccA.Text = "300"; for (int i = 0; i < MAXAXI; i )//保存 { m_para[i].m_Stop0effective = 1; m_para[i].m_Stop0dp = 0; //回零参数 m_ZeroPara[i].m_dir = 0; m_ZeroPara[i].m_stop0 = 0; m_ZeroPara[i].m_lmt = 0; m_ZeroPara[i].m_stop1 = -1; m_ZeroPara[i].m_bkRange = 2000; m_ZeroPara[i].m_ZRange = 400; m_ZeroPara[i].m_Off = 200; m_ZeroPara[i].m_StartV = 100; m_ZeroPara[i].m_SearchV = 500; m_ZeroPara[i].m_Speed = 200; m_ZeroPara[i].m_Acc = 100; m_ZeroPara[i].m_ZSpeed = 2000; m_nRatio[i] = 5; } this.ActiveControl = this.Title;//设置焦点 Int32 cardno = g_CtrlCard.Init_Board(); if (cardno <= 0) { MessageBox.Show("控制卡初始化失败!", "提示"); if (cardno == 0) { MessageBox.Show("没有安装ADT8948A1卡!", "提示"); } if (cardno == -1) { MessageBox.Show("没有安装端口驱动程序!", "提示"); } if (cardno == -2) { MessageBox.Show("PCI桥故障!", "提示"); } } else { MessageBox.Show("运动控制卡可以使用!", "提示"); //获取运动控制卡数量 ToolStripStatusLabel2.Text = Convert.ToString(cardno); //获取库函数版本号 Int32 LibVer; LibVer = Demo.adt8948A1m.adt8948_get_lib_vision(out LibVer); ToolStripStatusLabel3.Text = Convert.ToString(LibVer); //默认联动选中 Pmove.Checked = true; //插入卡号索引 for (int i = 0; i < cardno; i ) { CardIndex.Items.Insert(i, Convert.ToString(i)); } CardIndex.Text = "0"; Motion1.Checked = true; relative.Checked = true; } //默认四个运动轴都被选中 CheckAll.Checked = true; CheckAll.Text = "反选"; CheckAxiX.Checked = true; CheckAxiY.Checked = true; CheckAxiZ.Checked = true; CheckAxiA.Checked = true; } //全选 private void CheckAll_CheckedChanged(object sender, EventArgs e) { if (CheckAll.Checked) { CheckAll.Text = "反选"; CheckAxiX.Checked = true; CheckAxiY.Checked = true; CheckAxiZ.Checked = true; CheckAxiA.Checked = true; } else { CheckAll.Text = "全选"; CheckAxiX.Checked = false; CheckAxiY.Checked = false; CheckAxiZ.Checked = false; CheckAxiA.Checked = false; } } //立即停止 private void BtnStop_Click(object sender, EventArgs e) { m_StopFlag = true; for (int i = 1; i <= MAXAXI; i ) { g_CtrlCard.StopRun(i, 0); } } //减速停止 private void BtnDecStop_Click(object sender, EventArgs e) { m_StopFlag = true; for (int i = 1; i <= MAXAXI; i ) { g_CtrlCard.StopRun(i, 1); } } //位置清零 private void BtnClear_Click(object sender, EventArgs e) { for (int i = 1; i <= MAXAXI; i ) { g_CtrlCard.Setup_Pos(i, 0, 0); g_CtrlCard.Setup_Pos(i, 0, 1); } } //卡号切换 private void CardIndex_SelectedIndexChanged(object sender, EventArgs e) { CtrlCard.g_cardIndex = Convert.ToInt32(CardIndex.Text); } //固定线速度 private void BtnVector_CheckedChanged(object sender, EventArgs e) { if(BtnVector.Checked == true) { g_CtrlCard.Setup_VectorSpeed(1); //采用固定线速度 } else { g_CtrlCard.Setup_VectorSpeed(1); } } //主定时器 private void Timer1_Tick(object sender, EventArgs e) { Int32 log = 0, act = 0, spd = 0; Int32 i = 0, Value = 0; Label[] Log = { LogPosX, LogPosY, LogPosZ, LogPosA }; Label[] Act = { ActPosX, ActPosY, ActPosZ, ActPosA }; Label[] Speed = { RunSpeedX, RunSpeedY, RunSpeedZ, RunSpeedA }; //检测限位、stop0和stop1信号 CheckBox[] lmt1 = { LNT1X, LNT1Y, LNT1Z, LNT1A }; CheckBox[] lmt2 = { LNT2X, LNT2Y, LNT2Z, LNT2A }; CheckBox[] Stop0 = { Stop0X, Stop0Y, Stop0Z, Stop0A }; CheckBox[] Stop1 = { Stop1X, Stop1Y, Stop1Z, Stop1A }; CheckBox[] Stop2 = { Stop2X, Stop2Y, Stop2Z, Stop2A }; Label[] StopInfo = { StopInfoX, StopInfoY, StopInfoZ, StopInfoA }; for (i = 0; i < MAXAXI; i ) { g_CtrlCard.Get_CurrentInf(i 1, out log, out act, out spd); adt8948A1m.adt8948_get_stopdata(CtrlCard.g_cardIndex, i 1, out Value); Log[i].Text = Convert.ToString(log);//逻辑位置 Act[i].Text = Convert.ToString(act);//实际位置 Speed[i].Text = Convert.ToString(spd*m_nRatio[i]);//运行速度 StopInfo[i].Text = Convert.ToString(Value);//运行速度 if (g_CtrlCard.Read_Input((i - 1) * 6) == 0)//正限位 { lmt1[i].Checked = true; } else { lmt1[i].Checked = false; } if (g_CtrlCard.Read_Input((i - 1) * 6 1) == 0)//负限位 { lmt2[i].Checked = true; } else { lmt2[i].Checked = false; } if (g_CtrlCard.Read_Input((i - 1) * 6 2) == 0)//stop0 { Stop0[i].Checked = true; } else { Stop0[i].Checked = false; } if (g_CtrlCard.Read_Input((i - 1) * 6 3) == 0)//stop1 { Stop1[i].Checked = true; } else { Stop1[i].Checked = false; } if (g_CtrlCard.Read_Input((i - 1) * 6 4) == 0)//stop2 { Stop2[i].Checked = true; } else { Stop2[i].Checked = false; } } } //刷新轴的选中状态 public void RefreshSelectInfo() { m_nStartv[0] = Convert.ToInt32(this.StartV_X.Text); m_nStartv[1] = Convert.ToInt32(this.StartV_Y.Text); m_nStartv[2] = Convert.ToInt32(this.StartV_Z.Text); m_nStartv[3] = Convert.ToInt32(this.StartV_A.Text); m_nSpeed[0] = Convert.ToInt32(this.Speed_X.Text); m_nSpeed[1] = Convert.ToInt32(this.Speed_Y.Text); m_nSpeed[2] = Convert.ToInt32(this.Speed_Z.Text); m_nSpeed[3] = Convert.ToInt32(this.Speed_A.Text); m_nAcc[0] = Convert.ToInt32(this.Acc_X.Text); m_nAcc[1] = Convert.ToInt32(this.Acc_Y.Text); m_nAcc[2] = Convert.ToInt32(this.Acc_Z.Text); m_nAcc[3] = Convert.ToInt32(this.Acc_A.Text); m_nDec[0] = Convert.ToInt32(this.Dec_X.Text); m_nDec[1] = Convert.ToInt32(this.Dec_Y.Text); m_nDec[2] = Convert.ToInt32(this.Dec_Z.Text); m_nDec[3] = Convert.ToInt32(this.Dec_A.Text); m_nPulse[0] = Convert.ToInt32(this.PulseX.Text); m_nPulse[1] = Convert.ToInt32(this.PulseY.Text); m_nPulse[2] = Convert.ToInt32(this.PulseZ.Text); m_nPulse[3] = Convert.ToInt32(this.PulseA.Text); if (AddMode1.Checked == true) { m_addmode = 0; } if (AddMode2.Checked == true) { m_addmode = 1; } if (AddMode3.Checked == true) { m_addmode = 2; } //初始状态没有轴被选中 m_SelectInfo.AxiNo = 0; m_SelectInfo.selectAxi = new Int32[MAXAXI]; if (CheckAxiX.Checked == true) { m_SelectInfo.AxiNo = 1; m_SelectInfo.selectAxi[m_SelectInfo.AxiNo - 1] = 1; } if (CheckAxiY.Checked == true) { m_SelectInfo.AxiNo = 1; m_SelectInfo.selectAxi[m_SelectInfo.AxiNo - 1] = 2; } if (CheckAxiZ.Checked == true) { m_SelectInfo.AxiNo = 1; m_SelectInfo.selectAxi[m_SelectInfo.AxiNo - 1] = 3; } if (CheckAxiA.Checked == true) { m_SelectInfo.AxiNo = 1; m_SelectInfo.selectAxi[m_SelectInfo.AxiNo - 1] = 4; } //获取最小轴号信息 m_SelectInfo.MinAxi = 100; for (int i = 0; i < m_SelectInfo.AxiNo; i ) { if (m_SelectInfo.selectAxi[i] < m_SelectInfo.MinAxi) { m_SelectInfo.MinAxi = m_SelectInfo.selectAxi[i]; } } } //启用手轮 private void CheckManual_CheckedChanged(object sender, EventArgs e) { if (!manual)//禁用手轮驱动 { CheckManual.Text = "启用手动驱动"; manual = true; for (int i = 1; i <= MAXAXI; i ) { Demo.adt8948A1m.adt8948_manual_disable(CtrlCard.g_cardIndex, i); } } else//启用手轮驱动 { CheckManual.Text = "禁用手动驱动"; manual = false; if (m_bManualContinue.Checked == true)//手动连续 { ManulCmove(); } else { ManulPmove(); } } } //手轮驱动函数 public void ManulPmove() { RefreshSelectInfo(); if (CheckAxiX.Checked == true) { g_CtrlCard.Setup_Speed(1, m_nStartv[0], m_nSpeed[0], m_nAcc[0], m_nDec[0], m_nRatio[0],m_addmode);//设置速度 g_CtrlCard.Manu_Pmove(1, m_nPulse[0]);//发送脉冲 } if (CheckAxiY.Checked == true) { g_CtrlCard.Setup_Speed(2, m_nStartv[1], m_nSpeed[1], m_nAcc[1], m_nDec[1], m_nRatio[1], m_addmode);//设置速度 g_CtrlCard.Manu_Pmove(2, m_nPulse[1]);//发送脉冲 } if (CheckAxiZ.Checked == true) { g_CtrlCard.Setup_Speed(3, m_nStartv[2], m_nSpeed[2], m_nAcc[2], m_nDec[2], m_nRatio[2], m_addmode);//设置速度 g_CtrlCard.Manu_Pmove(3, m_nPulse[2]);//发送脉冲 } if (CheckAxiA.Checked == true) { g_CtrlCard.Setup_Speed(4, m_nStartv[3], m_nSpeed[3], m_nAcc[3], m_nDec[3], m_nRatio[3], m_addmode);//设置速度 g_CtrlCard.Manu_Pmove(4, m_nPulse[3]);//发送脉冲 } } //手轮连续运动函数 public void ManulCmove() { RefreshSelectInfo(); if (CheckAxiX.Checked == true) { g_CtrlCard.Setup_Speed(1, m_nStartv[0], m_nSpeed[0], m_nAcc[0], m_nDec[0], m_nRatio[0], m_addmode);//设置速度 g_CtrlCard.Manu_Continue(1);//连续运动 } if (CheckAxiY.Checked == true) { g_CtrlCard.Setup_Speed(2, m_nStartv[1], m_nSpeed[1], m_nAcc[1], m_nDec[1], m_nRatio[1], m_addmode);//设置速度 g_CtrlCard.Manu_Continue(2);//连续运动 } if (CheckAxiZ.Checked == true) { g_CtrlCard.Setup_Speed(3, m_nStartv[2], m_nSpeed[2], m_nAcc[2], m_nDec[2], m_nRatio[2], m_addmode);//设置速度 g_CtrlCard.Manu_Continue(3);//连续运动 } if (CheckAxiA.Checked == true) { g_CtrlCard.Setup_Speed(4, m_nStartv[3], m_nSpeed[3], m_nAcc[3], m_nDec[3], m_nRatio[3], m_addmode);//设置速度 g_CtrlCard.Manu_Continue(4);//连续运动 } } //启动 private void Start_Click(object sender, EventArgs e) { if (Pmove.Checked == true) { Motion_Pmove();//联动 } if (Cmove.Checked == true) { Motion_Cmove();//连续运动 } if (LineInp.Checked == true) { Motion_LineInp();//插补 } if (ArcInp.Checked == true) { Motion_ArcInp();//圆弧插补 } if (CInp.Checked == true) { Motion_CInp();//连续插补 } } //联动函数 public void Motion_Pmove() { RefreshSelectInfo(); if (CheckAxiX.Checked == true) { g_CtrlCard.Setup_Speed(1, m_nStartv[0], m_nSpeed[0], m_nAcc[0], m_nDec[0], m_nRatio[0], m_addmode);//设置速度 g_CtrlCard.Axis_Pmove(1, m_nPulse[0]);//发送脉冲 } if (CheckAxiY.Checked == true) { g_CtrlCard.Setup_Speed(2, m_nStartv[1], m_nSpeed[1], m_nAcc[1], m_nDec[1], m_nRatio[1], m_addmode);//设置速度 g_CtrlCard.Axis_Pmove(2, m_nPulse[1]);//发送脉冲 } if (CheckAxiZ.Checked == true) { g_CtrlCard.Setup_Speed(3, m_nStartv[2], m_nSpeed[2], m_nAcc[2], m_nDec[2], m_nRatio[2], m_addmode);//设置速度 g_CtrlCard.Axis_Pmove(3, m_nPulse[2]);//发送脉冲 } if (CheckAxiA.Checked == true) { g_CtrlCard.Setup_Speed(4, m_nStartv[3], m_nSpeed[3], m_nAcc[3], m_nDec[3], m_nRatio[3], m_addmode);//设置速度 g_CtrlCard.Axis_Pmove(4, m_nPulse[3]);//发送脉冲 } } //连续运动函数 public void Motion_Cmove() { RefreshSelectInfo(); if (CheckAxiX.Checked == true) { g_CtrlCard.Setup_Speed(1, m_nStartv[0], m_nSpeed[0], m_nAcc[0], m_nDec[0], m_nRatio[0], m_addmode);//设置速度 g_CtrlCard.Axis_Cmove(1, 0);//连续运动 } if (CheckAxiY.Checked == true) { g_CtrlCard.Setup_Speed(2, m_nStartv[1], m_nSpeed[1], m_nAcc[1], m_nDec[1], m_nRatio[1], m_addmode);//设置速度 g_CtrlCard.Axis_Cmove(2, 0);//连续运动 } if (CheckAxiZ.Checked == true) { g_CtrlCard.Setup_Speed(3, m_nStartv[2], m_nSpeed[2], m_nAcc[2], m_nDec[2], m_nRatio[2], m_addmode);//设置速度 g_CtrlCard.Axis_Cmove(3, 0);//连续运动 } if (CheckAxiA.Checked == true) { g_CtrlCard.Setup_Speed(4, m_nStartv[3], m_nSpeed[3], m_nAcc[3], m_nDec[3], m_nRatio[3], m_addmode);//设置速度 g_CtrlCard.Axis_Cmove(4, 0);//连续运动 } } //直线插补函数 public void Motion_LineInp() { RefreshSelectInfo(); Int32 axi = m_SelectInfo.MinAxi; switch (m_SelectInfo.AxiNo) { case 2: g_CtrlCard.Setup_Speed(axi, m_nStartv[axi - 1], m_nSpeed[axi - 1], m_nAcc[axi - 1], m_nDec[axi - 1], m_nRatio[axi - 1], m_addmode);//设置速度 g_CtrlCard.Interp_Move2(m_SelectInfo.selectAxi[0], m_SelectInfo.selectAxi[1], m_nPulse[0], m_nPulse[1]); break; case 3: g_CtrlCard.Setup_Speed(axi, m_nStartv[axi - 1], m_nSpeed[axi - 1], m_nAcc[axi - 1], m_nDec[axi - 1], m_nRatio[axi - 1], m_addmode);//设置速度 g_CtrlCard.Interp_Move3(m_SelectInfo.selectAxi[0], m_SelectInfo.selectAxi[1], m_SelectInfo.selectAxi[2], m_nPulse[0], m_nPulse[1], m_nPulse[2]); break; default: MessageBox.Show("请选择正确的插补轴!", "提示"); break; } } //圆弧插补函数 public void Motion_ArcInp() { RefreshSelectInfo(); Int32 Value; //在这里说明:圆弧插补只能用手动的直线加/减速驱动,不能使用S曲线加/减速驱动以及自动减速 if (m_addmode == 2) { MessageBox.Show("不能选择S曲线加减速类型!", "提示"); return; } Int32 axi = m_SelectInfo.MinAxi; switch (m_SelectInfo.AxiNo) { case 2: g_CtrlCard.Setup_Speed(axi, m_nStartv[axi - 1], m_nSpeed[axi - 1], m_nAcc[axi - 1], m_nDec[axi - 1], m_nRatio[axi - 1], m_addmode);//设置速度 if(m_nStartv[axi - 1] < m_nSpeed[axi - 1]) { g_CtrlCard.Set_DecMode(axi, 0, 1); //中间的0:对称加减速 后面的1:说明是手动减速 } //两轴圆弧加速度的脉冲数:先算出短轴每象限的脉冲数,这样乘8就能算出整个圆的脉冲数 Value = Convert.ToInt32((System.Math.Sqrt(m_nPulse[0] * m_nPulse[0] m_nPulse[1] * m_nPulse[1]) / 1.414) * 8); g_CtrlCard.Set_DecPos(axi, Value, m_nStartv[axi - 1], m_nSpeed[axi - 1], m_nAcc[axi - 1]); g_CtrlCard.Interp_Arc(m_SelectInfo.selectAxi[0], m_SelectInfo.selectAxi[1], 0, 0, m_nPulse[0], m_nPulse[1]); //顺时针CW圆弧插补函数(0, 0,)表示圆弧插补的终点位置,后面是圆心位置 break; default: MessageBox.Show("请选择正确的插补轴!", "提示"); break; } } //连续插补函数 public void Motion_CInp() { RefreshSelectInfo(); Int32 nstate1, nstate2, axi; if (m_addmode == 2) { MessageBox.Show("不能选择S曲线加减速类型!", "提示"); return; } axi = m_SelectInfo.MinAxi; switch (m_SelectInfo.AxiNo) { case 2: g_CtrlCard.Setup_Speed(axi, m_nStartv[axi - 1], m_nSpeed[axi - 1], m_nAcc[axi - 1], m_nDec[axi - 1], m_nRatio[axi - 1], m_addmode);//设置速度 g_CtrlCard.Set_DecMode(axi, 0, 1); //中间的0:对称加减速 后面的1:说明是手动减速 g_CtrlCard.Set_DecPos(axi, m_nPulse[axi - 1] / 4, m_nStartv[axi - 1], m_nSpeed[axi - 1], m_nAcc[axi - 1]); g_CtrlCard.ForbidDec(); //-----------------第一段---------------- g_CtrlCard.Interp_Move2(m_SelectInfo.selectAxi[0], m_SelectInfo.selectAxi[1], m_nPulse[0] / 4, m_nPulse[1] / 4); while (true) { if (m_StopFlag) { m_StopFlag = false; return; } g_CtrlCard.Get_ErrorInf(m_SelectInfo.selectAxi[0], out nstate1); //nstate1错误状态的指针 为0时就说明没有错误 if (nstate1 != 0) { goto err; } g_CtrlCard.Get_AllowInpStatus(out nstate2); // nstate2: 0:不允许写入 1:允许写入 if (nstate2 != 0) { break; } System.Threading.Thread.Sleep(1000); Application.DoEvents(); } //-----------------第二段---------------- g_CtrlCard.Interp_Move2(m_SelectInfo.selectAxi[0], m_SelectInfo.selectAxi[1], m_nPulse[0] / 4, m_nPulse[1] / 4); while (true) { if (m_StopFlag) { m_StopFlag = false; return; } g_CtrlCard.Get_ErrorInf(m_SelectInfo.selectAxi[0], out nstate1); //nstate1错误状态的指针 为0时就说明没有错误 if (nstate1 != 0) { goto err; } g_CtrlCard.Get_AllowInpStatus(out nstate2); // nstate2: 0:不允许写入 1:允许写入 if (nstate2 != 0) { break; } Application.DoEvents(); } //-----------------第三段---------------- g_CtrlCard.Interp_Move2(m_SelectInfo.selectAxi[0], m_SelectInfo.selectAxi[1], m_nPulse[0] / 4, m_nPulse[1] / 4); while (true) { if (m_StopFlag) { m_StopFlag = false; return; } g_CtrlCard.Get_ErrorInf(m_SelectInfo.selectAxi[0], out nstate1); //nstate1错误状态的指针 为0时就说明没有错误 if (nstate1 != 0) { goto err; } g_CtrlCard.Get_AllowInpStatus(out nstate2); // nstate2: 0:不允许写入 1:允许写入 if (nstate2 != 0) { break; } Application.DoEvents(); } //-------------最后一段------------------ g_CtrlCard.AllowDec(); g_CtrlCard.Interp_Move2(m_SelectInfo.selectAxi[0], m_SelectInfo.selectAxi[1], m_nPulse[0] / 4, m_nPulse[1] / 4); while (true) { if (m_StopFlag) { m_StopFlag = false; return; } g_CtrlCard.Get_ErrorInf(m_SelectInfo.selectAxi[0], out nstate1); //nstate1错误状态的指针 为0时就说明没有错误 if (nstate1 != 0) { goto err; } g_CtrlCard.Get_AllowInpStatus(out nstate2); // nstate2: 0:不允许写入 1:允许写入 if (nstate2 != 0) { return; } Application.DoEvents(); } err: MessageBox.Show("error", "提示"); break; default: MessageBox.Show("请选择正确的插补轴!", "提示"); break; } } #endregion #region 复合界面代码部分 //复合运动 private void BtnStart2_Click(object sender, EventArgs e) { if (Motion1.Checked == true) //单轴运动 { if (relative.Checked)//相对运动 { Axi_RelativeMove(); } else//绝对运动 { Axi_AbsMove(); } } if (Motion2.Checked == true) //插补运动 { if (relative.Checked)//相对运动 { Inp_RelativeMove(); } else//绝对运动 { Inp_AbsMove(); } } if (Motion3.Checked == true) //圆弧插补运动 { if (relative.Checked)//相对运动 { Arc_RelativeMove(); } else//绝对运动 { Arc_AbsMove(); } } } //刷新复合运动的参数 public void RefreshPara1() { m_nStartv1[0] = Convert.ToInt32(this.StartV_X1.Text); m_nStartv1[1] = Convert.ToInt32(this.StartV_Y1.Text); m_nStartv1[2] = Convert.ToInt32(this.StartV_Z1.Text); m_nStartv1[3] = Convert.ToInt32(this.StartV_A1.Text); m_nSpeed1[0] = Convert.ToInt32(this.Speed_X1.Text); m_nSpeed1[1] = Convert.ToInt32(this.Speed_Y1.Text); m_nSpeed1[2] = Convert.ToInt32(this.Speed_Z1.Text); m_nSpeed1[3] = Convert.ToInt32(this.Speed_A1.Text); m_nTAcc[0] = Convert.ToDouble(this.TAccX.Text); m_nTAcc[1] = Convert.ToDouble(this.TAccY.Text); m_nTAcc[2] = Convert.ToDouble(this.TAccZ.Text); m_nTAcc[3] = Convert.ToDouble(this.TAccA.Text); m_nVAcc[0] = Convert.ToInt32(this.VAccX.Text); m_nVAcc[1] = Convert.ToInt32(this.VAccY.Text); m_nVAcc[2] = Convert.ToInt32(this.VAccZ.Text); m_nVAcc[3] = Convert.ToInt32(this.VAccA.Text); m_nPulse[0] = Convert.ToInt32(this.PulseX.Text); m_nPulse[1] = Convert.ToInt32(this.PulseY.Text); m_nPulse[2] = Convert.ToInt32(this.PulseZ.Text); m_nPulse[3] = Convert.ToInt32(this.PulseA.Text); if (Style1.Checked == true) { m_moveMode = 0; } if (Style2.Checked == true) { m_moveMode = 1; } if (Dir1.Checked == true) { m_dir = 0; } if (Dir2.Checked == true) { m_dir = 1; } //初始状态没有轴被选中 m_SelectInfo.AxiNo = 0; m_SelectInfo.selectAxi = new Int32[MAXAXI]; if (CheckAxiX.Checked == true) { m_SelectInfo.AxiNo = 1; m_SelectInfo.selectAxi[m_SelectInfo.AxiNo - 1] = 1; } if (CheckAxiY.Checked == true) { m_SelectInfo.AxiNo = 1; m_SelectInfo.selectAxi[m_SelectInfo.AxiNo - 1] = 2; } if (CheckAxiZ.Checked == true) { m_SelectInfo.AxiNo = 1; m_SelectInfo.selectAxi[m_SelectInfo.AxiNo - 1] = 3; } if (CheckAxiA.Checked == true) { m_SelectInfo.AxiNo = 1; m_SelectInfo.selectAxi[m_SelectInfo.AxiNo - 1] = 4; } //获取最小轴号信息 m_SelectInfo.MinAxi = 100; for (int i = 0; i < m_SelectInfo.AxiNo; i ) { if (m_SelectInfo.selectAxi[i] < m_SelectInfo.MinAxi) { m_SelectInfo.MinAxi = m_SelectInfo.selectAxi[i]; } } } //单轴相对运动函数 public void Axi_RelativeMove() { RefreshPara1(); if (CheckAxiX.Checked == true) { g_CtrlCard.Symmetry_RelativeMove(1, m_nPulse[0], m_nStartv1[0], m_nSpeed1[0], m_nTAcc[0], m_nVAcc[0], m_moveMode); } if (CheckAxiY.Checked == true) { g_CtrlCard.Symmetry_RelativeMove(2, m_nPulse[1], m_nStartv1[1], m_nSpeed1[1], m_nTAcc[1], m_nVAcc[1], m_moveMode); } if (CheckAxiZ.Checked == true) { g_CtrlCard.Symmetry_RelativeMove(3, m_nPulse[2], m_nStartv1[2], m_nSpeed1[2], m_nTAcc[2], m_nVAcc[2], m_moveMode); } if (CheckAxiA.Checked == true) { g_CtrlCard.Symmetry_RelativeMove(4, m_nPulse[3], m_nStartv1[3], m_nSpeed1[3], m_nTAcc[3], m_nVAcc[3], m_moveMode); } } //单轴绝对运动函数 public void Axi_AbsMove() { RefreshPara1(); if (CheckAxiX.Checked == true) { g_CtrlCard.Symmetry_AbsoluteMove(1, m_nPulse[0], m_nStartv1[0], m_nSpeed1[0], m_nTAcc[0], m_nVAcc[0], m_moveMode); } if (CheckAxiY.Checked == true) { g_CtrlCard.Symmetry_AbsoluteMove(2, m_nPulse[1], m_nStartv1[1], m_nSpeed1[1], m_nTAcc[1], m_nVAcc[1], m_moveMode); } if (CheckAxiZ.Checked == true) { g_CtrlCard.Symmetry_AbsoluteMove(3, m_nPulse[2], m_nStartv1[2], m_nSpeed1[2], m_nTAcc[2], m_nVAcc[2], m_moveMode); } if (CheckAxiA.Checked == true) { g_CtrlCard.Symmetry_AbsoluteMove(4, m_nPulse[3], m_nStartv1[3], m_nSpeed1[3], m_nTAcc[3], m_nVAcc[3], m_moveMode); } } //插补相对运动函数 public void Inp_RelativeMove() { RefreshPara1(); Int32 axi = m_SelectInfo.MinAxi; switch (m_SelectInfo.AxiNo) { case 2://两轴插补 g_CtrlCard.Symmetry_RelativeLine2(m_SelectInfo.selectAxi[0], m_SelectInfo.selectAxi[1], m_nPulse[0], m_nPulse[1], m_nStartv1[axi - 1], m_nSpeed1[axi - 1], m_nTAcc[axi - 1], m_nVAcc[axi - 1], m_moveMode); break; case 3://三轴插补 g_CtrlCard.Symmetry_RelativeLine3(m_SelectInfo.selectAxi[0], m_SelectInfo.selectAxi[1], m_SelectInfo.selectAxi[2], m_nPulse[0], m_nPulse[1], m_nPulse[2], m_nStartv1[axi - 1], m_nSpeed1[axi - 1], m_nTAcc[axi - 1], m_nVAcc[axi - 1], m_moveMode); break; default: MessageBox.Show("请选择正确的插补轴!", "提示"); break; } } //插补绝对运动函数 public void Inp_AbsMove() { RefreshPara1(); Int32 axi = m_SelectInfo.MinAxi; switch (m_SelectInfo.AxiNo) { case 2://两轴插补 g_CtrlCard.Symmetry_AbsoluteLine2(m_SelectInfo.selectAxi[0], m_SelectInfo.selectAxi[1], m_nPulse[0], m_nPulse[1], m_nStartv1[axi - 1], m_nSpeed1[axi - 1], m_nTAcc[axi - 1], m_nVAcc[axi - 1], m_moveMode); break; case 3://三轴插补 g_CtrlCard.Symmetry_AbsoluteLine3(m_SelectInfo.selectAxi[0], m_SelectInfo.selectAxi[1], m_SelectInfo.selectAxi[2], m_nPulse[0], m_nPulse[1], m_nPulse[2], m_nStartv1[axi - 1], m_nSpeed1[axi - 1], m_nTAcc[axi - 1], m_nVAcc[axi - 1], m_moveMode); break; default: MessageBox.Show("请选择正确的插补轴!"); break; } } //圆弧相对运动 public void Arc_RelativeMove() { RefreshPara1(); Int32 axi = m_SelectInfo.MinAxi; switch (m_SelectInfo.AxiNo) { case 2://两轴插补 g_CtrlCard.Symmetry_Relativearc(m_SelectInfo.selectAxi[0], m_SelectInfo.selectAxi[1],0, 0, m_nPulse[0], m_nPulse[1], m_dir,m_nStartv1[axi - 1], m_nSpeed1[axi - 1], m_nTAcc[axi - 1], m_nVAcc[axi - 1], m_moveMode); break; default: MessageBox.Show("请选择正确的插补轴!"); break; } } //圆弧绝对运动 public void Arc_AbsMove() { RefreshPara1(); Int32 axi = m_SelectInfo.MinAxi; switch (m_SelectInfo.AxiNo) { case 2://两轴插补 g_CtrlCard.Symmetry_AbsoluteArc(m_SelectInfo.selectAxi[0], m_SelectInfo.selectAxi[1], 0, 0, m_nPulse[0], m_nPulse[1], m_dir, m_nStartv1[axi - 1], m_nSpeed1[axi - 1], m_nTAcc[axi - 1], m_nVAcc[axi - 1], m_moveMode); break; default: MessageBox.Show("请选择正确的插补轴!"); break; } } #endregion #region IO界面代码部分 //输出全关 private void BtnAllClose_Click(object sender, EventArgs e) { CheckBox[] TOutput ={ OUT0, OUT1, OUT2, OUT3, OUT4, OUT5, OUT6, OUT7, OUT8, OUT9, OUT10, OUT11, OUT12, OUT13, OUT14, OUT15, OUT16, OUT17, OUT18, OUT19, OUT20, OUT21, OUT22, OUT23, OUT24, OUT25, OUT26, OUT27, OUT28, OUT29, OUT30, OUT31 }; int i; for (i = 0; i <= MaxOUT; i ) { TOutput[i].Checked = false; g_CtrlCard.Write_Output(i, 0); //关闭输出 } } //输出全开 private void BtnAllOpen_Click(object sender, EventArgs e) { CheckBox[] TOutput ={ OUT0, OUT1, OUT2, OUT3, OUT4, OUT5, OUT6, OUT7, OUT8, OUT9, OUT10, OUT11, OUT12, OUT13, OUT14, OUT15, OUT16, OUT17, OUT18, OUT19, OUT20, OUT21, OUT22, OUT23, OUT24, OUT25, OUT26, OUT27, OUT28, OUT29, OUT30, OUT31 }; int i; for (i = 0; i <= MaxOUT; i ) { TOutput[i].Checked = true; g_CtrlCard.Write_Output(i, 1); //打开输出 } } //输入检测函数 public void CheckInput() { CheckBox[] TInput = { INO, IN1, IN2, IN3, IN4, IN5, IN6, IN7, IN8, IN9, IN10, IN11, IN12, IN13, IN14, IN15, IN16, IN17, IN18, IN19, IN20, IN21, IN22, IN23, IN24, IN25, IN26, IN27, IN28, IN29, IN30, IN31, IN32, IN33, IN34 }; int Value, i; for (i = 0; i <= MaxIN; i ) { Value = g_CtrlCard.Read_Input(i); //读取输入点 if (Value == 0) { TInput[i].Checked = true; } else { TInput[i].Checked = false; } } } //输出检测函数 public void CheckOutput() { CheckBox[] TOutput ={ OUT0, OUT1, OUT2, OUT3, OUT4, OUT5, OUT6, OUT7, OUT8, OUT9, OUT10, OUT11, OUT12, OUT13, OUT14, OUT15, OUT16, OUT17, OUT18, OUT19, OUT20, OUT21, OUT22, OUT23, OUT24, OUT25, OUT26, OUT27, OUT28, OUT29, OUT30, OUT31 }; int i; for (i = 0; i <= MaxOUT; i ) { if (TOutput[i].Checked == true) { g_CtrlCard.Write_Output(i, 1); } else { g_CtrlCard.Write_Output(i, 0); } } } //IO定时器 private void Timer2_Tick(object sender, EventArgs e) { CheckOutput(); CheckInput(); } //进入IO界面时打开IO计时器 private void TabPage6_Enter(object sender, EventArgs e) { Timer2.Enabled = true; } //离开IO界面的时候关闭IO计时器 private void TabPage6_Leave(object sender, EventArgs e) { Timer2.Enabled = false; } #endregion #region 位置锁存界面代码部分 private void BtnLockMode_Click(object sender, EventArgs e) { for (int i = 1; i <= MAXAXI; i ) { g_CtrlCard.Setup_LockPosition(i, Convert.ToInt32((RLAct.Checked)), Convert.ToInt32((RLHigh.Checked))); } MessageBox.Show("设置成功!", "提示"); } private void BtnLockPos_Click(object sender, EventArgs e) { int status = 0; int[] pos = new int[MAXAXI]; if (RLSignalX.Checked == true) { g_CtrlCard.Get_LockStatus(1, out status); } if (RLSignalY.Checked == true) { g_CtrlCard.Get_LockStatus(2, out status); } if (RLSignalZ.Checked == true) { g_CtrlCard.Get_LockStatus(3, out status); } if (RLSignalA.Checked == true) { g_CtrlCard.Get_LockStatus(4, out status); } for (int i = 1; i <= MAXAXI; i ) { if (status == 1) { g_CtrlCard.Get_LockPosition(i, out pos[i - 1]); } } MessageBox.Show("锁存的位置 " " X:" Convert.ToString(pos[0]) " Y:" Convert.ToString(pos[1]) " Z:" Convert.ToString(pos[2]) " A:" Convert.ToString(pos[3])); } #endregion #region 参数界面代码部分 //更新参数 public void RefreshParaSet() { if (pulseMode1.Checked) { m_para[g_AxiNo - 1].m_pulsemode = 0;//脉冲 脉冲 } else { m_para[g_AxiNo - 1].m_pulsemode = 1;//脉冲 方向 } if (LimitP1.Checked) { m_para[g_AxiNo - 1].m_Lmtdp = 0;//限位低电平有效 } else { m_para[g_AxiNo - 1].m_Lmtdp = 1;//限位高电平有效 } if (Stop01.Checked) { m_para[g_AxiNo - 1].m_Stop0effective = 0;//Stop0无效 } else { m_para[g_AxiNo - 1].m_Stop0effective = 1;//Stop0有效 } if (Stop02.Checked) { m_para[g_AxiNo - 1].m_Stop0dp = 0;//Stop0低电平有效 } if (Stop03.Checked) { m_para[g_AxiNo - 1].m_Stop0dp = 1;//Stop0高电平有效 } if (Stop11.Checked) { m_para[g_AxiNo - 1].m_Stop1effective = 0;//Stop1无效 } else { m_para[g_AxiNo - 1].m_Stop1effective = 1;//Stop1有效 } if (Stop12.Checked) { m_para[g_AxiNo - 1].m_Stop1dp = 0;//Stop1低电平有效 } if (Stop13.Checked) { m_para[g_AxiNo - 1].m_Stop1dp = 1;//Stop1高电平有效 } if (Stop21.Checked) { m_para[g_AxiNo - 1].m_Stop2effective = 0;//Stop2无效 } else { m_para[g_AxiNo - 1].m_Stop2effective = 1;//Stop2有效 } if (Stop22.Checked) { m_para[g_AxiNo - 1].m_Stop2dp = 0;//Stop2低电平有效 } if (Stop23.Checked) { m_para[g_AxiNo - 1].m_Stop2dp = 1;//Stop2高电平有效 } if (Circle1.Checked) { m_para[g_AxiNo - 1].m_Circleeffective = 0;//可变环形无效 } else { m_para[g_AxiNo - 1].m_Circleeffective = 1;//可变环形有效 } if (Inpos1.Checked) { m_para[g_AxiNo - 1].m_Inposeffective = 0;//到位信号无效 } else { m_para[g_AxiNo - 1].m_Inposeffective = 1;//到位信号有效 } if (Inpos2.Checked) { m_para[g_AxiNo - 1].m_Inposdp = 0;//到位信号低电平有效 } if (Inpos3.Checked) { m_para[g_AxiNo - 1].m_Inposdp = 1;//到位信号高电平有效 } if (Alarm1.Checked) { m_para[g_AxiNo - 1].m_Alarmeffective = 0;//报警信号无效 } else { m_para[g_AxiNo - 1].m_Alarmeffective = 1;//报警信号有效 } if (Alarm2.Checked) { m_para[g_AxiNo - 1].m_Alarmdp = 0;//报警信号低电平有效 } if (Alarm3.Checked) { m_para[g_AxiNo - 1].m_Alarmdp = 1;//报警信号高电平有效 } m_nRatio[g_AxiNo - 1] = Convert.ToInt32(BeiLv.Text); } public void LoadParaEx() { if (m_para[g_AxiNo - 1].m_pulsemode == 1) { pulseMode2.Checked = true; } else { pulseMode1.Checked = true; } if (m_para[g_AxiNo - 1].m_Lmtdp == 0) { LimitP1.Checked = true; } else { LimitP2.Checked = true; } if (m_para[g_AxiNo - 1].m_Stop0effective == 0) { Stop01.Checked = true; } else { if (m_para[g_AxiNo - 1].m_Stop0dp == 0) { Stop02.Checked = true; } else { Stop03.Checked = true; } } if (m_para[g_AxiNo - 1].m_Stop1effective == 0) { Stop11.Checked = true; } else { if (m_para[g_AxiNo - 1].m_Stop1dp == 0) { Stop12.Checked = true; } else { Stop13.Checked = true; } } if (m_para[g_AxiNo - 1].m_Stop2effective == 0) { Stop21.Checked = true; } else { if (m_para[g_AxiNo - 1].m_Stop2dp == 0) { Stop22.Checked = true; } else { Stop23.Checked = true; } } if (m_para[g_AxiNo - 1].m_Circleeffective == 0) { Circle1.Checked = true; } else { Circle2.Checked = true; } if (m_para[g_AxiNo - 1].m_Inposeffective == 0) { Inpos1.Checked = true; } else { if (m_para[g_AxiNo - 1].m_Inposdp == 0) { Inpos2.Checked = true; } else { Inpos3.Checked = true; } } if (m_para[g_AxiNo - 1].m_Alarmeffective == 0) { Alarm1.Checked = true; } else { if (m_para[g_AxiNo - 1].m_Alarmdp == 0) { Alarm2.Checked = true; } else { Alarm3.Checked = true; } } BeiLv.Text = Convert.ToString(m_nRatio[g_AxiNo - 1]); } private void BtnSure_Click(object sender, EventArgs e) { RefreshParaSet(); g_CtrlCard.Setup_PulseMode(g_AxiNo, m_para[g_AxiNo - 1].m_pulsemode); g_CtrlCard.Setup_LimitMode(g_AxiNo, 0, m_para[g_AxiNo - 1].m_Lmtdp); g_CtrlCard.Setup_Stop0Mode(g_AxiNo, m_para[g_AxiNo - 1].m_Stop0effective, m_para[g_AxiNo - 1].m_Stop0dp); g_CtrlCard.Setup_Stop1Mode(g_AxiNo, m_para[g_AxiNo - 1].m_Stop1effective, m_para[g_AxiNo - 1].m_Stop1dp); g_CtrlCard.Setup_Stop2Mode(g_AxiNo, m_para[g_AxiNo - 1].m_Stop2effective, m_para[g_AxiNo - 1].m_Stop2dp); g_CtrlCard.Setup_AlarmMode(g_AxiNo, m_para[g_AxiNo - 1].m_Alarmeffective, m_para[g_AxiNo - 1].m_Alarmdp); g_CtrlCard.SetCircle_Mode(g_AxiNo, m_para[g_AxiNo - 1].m_Circleeffective); g_CtrlCard.Inpos_Mode(g_AxiNo, m_para[g_AxiNo - 1].m_Inposeffective, m_para[g_AxiNo - 1].m_Inposdp); adt8948A1m.adt8948_set_range(CtrlCard.g_cardIndex, g_AxiNo, 8000000 / m_nRatio[g_AxiNo - 1]); MessageBox.Show("设置成功!", "提示"); } //索引轴改变 private void AxiIndex_SelectedIndexChanged(object sender, EventArgs e) { if (AxiIndex.Text == "X轴") { g_AxiNo = 1; LoadParaEx(); } if (AxiIndex.Text == "Y轴") { g_AxiNo = 2; LoadParaEx(); } if (AxiIndex.Text == "Z轴") { g_AxiNo = 3; LoadParaEx(); } if (AxiIndex.Text == "A轴") { g_AxiNo = 4; LoadParaEx(); } } //进入Tab5界面就刷新当前参数 private void TabPage5_Enter(object sender, EventArgs e) { LoadParaEx(); } #endregion #region 特殊运动界面代码部分 //参数刷新 public void RefreshParaSpe() { m_SpePulse[0] = Convert.ToInt32(this.EPX.Text); m_SpePulse[1] = Convert.ToInt32(this.EPY.Text); m_SpePulse[2] = Convert.ToInt32(this.EPZ.Text); m_SpePulse[3] = Convert.ToInt32(this.EPA.Text); if (Rcomp1.Checked == true) { m_reg = 0; } if (Rcomp2.Checked == true) { m_reg = 1; } if (RBig.Checked == true) { m_relation = 0; } if (RSmall.Checked == true) { m_relation = 1; } if (RMainStop.Checked == true) { m_mainAxiKeep = 0; } if (RMainKeep.Checked == true) { m_mainAxiKeep = 1; } if (RMoveKeep.Checked == true) { m_SignalStatus = 0; } if (RMovePulse.Checked == true) { m_SignalStatus = 1; } if (RMStop.Checked == true) { m_mainAxiStatus = 0; } if (RMKeep.Checked == true) { m_mainAxiStatus = 1; } //初始状态没有轴被选中 m_SelectInfo.AxiNo = 0; m_SelectInfo.selectAxi = new Int32[MAXAXI]; if (m_bX.Checked == true) { m_SelectInfo.AxiNo = 1; m_SelectInfo.selectAxi[m_SelectInfo.AxiNo - 1] = 1; } if (m_bY.Checked == true) { m_SelectInfo.AxiNo = 1; m_SelectInfo.selectAxi[m_SelectInfo.AxiNo - 1] = 2; } if (m_bZ.Checked == true) { m_SelectInfo.AxiNo = 1; m_SelectInfo.selectAxi[m_SelectInfo.AxiNo - 1] = 3; } if (m_bA.Checked == true) { m_SelectInfo.AxiNo = 1; m_SelectInfo.selectAxi[m_SelectInfo.AxiNo - 1] = 4; } //获取最小轴号信息 m_SelectInfo.MinAxi = 100; for (int i = 0; i < m_SelectInfo.AxiNo; i ) { if (m_SelectInfo.selectAxi[i] < m_SelectInfo.MinAxi) { m_SelectInfo.MinAxi = m_SelectInfo.selectAxi[i]; } } } //位置比较运动 private void BtnCmpMove_Click(object sender, EventArgs e) { //刷新各运动参数 RefreshParaSpe(); Int32 axi; axi = m_SelectInfo.MinAxi; switch (m_SelectInfo.AxiNo) { case 2: g_CtrlCard.Setup_Pmove1(m_SelectInfo.selectAxi[0], m_SelectInfo.selectAxi[1], m_SpePulse[0], m_SpePulse[1], m_reg, m_relation); break; case 3: g_CtrlCard.Setup_Pmove2(m_SelectInfo.selectAxi[0], m_SelectInfo.selectAxi[1], m_SelectInfo.selectAxi[2], m_SpePulse[0], m_SpePulse[1], m_SpePulse[2], m_reg, m_relation); break; case 4: g_CtrlCard.Setup_Pmove3(m_SelectInfo.selectAxi[0], m_SelectInfo.selectAxi[1], m_SelectInfo.selectAxi[2], m_SelectInfo.selectAxi[3], m_SpePulse[0], m_SpePulse[1], m_SpePulse[2], m_SpePulse[3], m_reg, m_relation); break; } } //位置比较停止 private void BtnCmpStop_Click(object sender, EventArgs e) { RefreshParaSpe(); //刷新各运动参数 RefreshParaSpe(); Int32 axi; axi = m_SelectInfo.MinAxi; switch (m_SelectInfo.AxiNo) { case 2: g_CtrlCard.Setup_Stop1(m_SelectInfo.selectAxi[0], m_SelectInfo.selectAxi[1], m_SpePulse[0], m_reg, m_relation, m_mainAxiKeep); break; case 3: g_CtrlCard.Setup_Stop2(m_SelectInfo.selectAxi[0], m_SelectInfo.selectAxi[1], m_SelectInfo.selectAxi[2], m_SpePulse[0], m_reg, m_relation, m_mainAxiKeep); break; case 4: g_CtrlCard.Setup_Stop3(m_SelectInfo.selectAxi[0], m_SpePulse[0], m_reg, m_relation, m_mainAxiKeep); break; } } //信号式随动 private void BtnInMove_Click(object sender, EventArgs e) { //刷新各运动参数 RefreshParaSpe(); Int32 axi; axi = m_SelectInfo.MinAxi; switch (m_SelectInfo.AxiNo) { case 2: g_CtrlCard.Set_InMove1(m_SelectInfo.selectAxi[0], m_SelectInfo.selectAxi[1], m_SpePulse[0], m_SpePulse[1],0, m_SignalStatus); break; case 3: g_CtrlCard.Set_InMove2(m_SelectInfo.selectAxi[0], m_SelectInfo.selectAxi[1], m_SelectInfo.selectAxi[2], m_SpePulse[0], m_SpePulse[1], m_SpePulse[2], 0, m_SignalStatus); break; case 4: g_CtrlCard.Set_InMove3(m_SelectInfo.selectAxi[0], m_SelectInfo.selectAxi[1], m_SelectInfo.selectAxi[2], m_SelectInfo.selectAxi[3], m_SpePulse[0], m_SpePulse[1], m_SpePulse[2], m_SpePulse[3], 0, m_SignalStatus); break; } } //信号式随停 private void BtnInStop_Click(object sender, EventArgs e) { RefreshParaSpe(); //刷新各运动参数 RefreshParaSpe(); Int32 axi; axi = m_SelectInfo.MinAxi; switch (m_SelectInfo.AxiNo) { case 2: g_CtrlCard.Set_InStop1(m_SelectInfo.selectAxi[0], m_SelectInfo.selectAxi[1], 0, m_mainAxiStatus); break; case 3: g_CtrlCard.Set_InStop2(m_SelectInfo.selectAxi[0], m_SelectInfo.selectAxi[1], m_SelectInfo.selectAxi[2], 0, m_mainAxiStatus); break; case 4: g_CtrlCard.Set_InStop3(m_SelectInfo.selectAxi[0], 0, m_mainAxiStatus); break; } } //步进单步命令 private void BtnStepCmd_Click(object sender, EventArgs e) { g_CtrlCard.Inp_StepMove(); } //步进插补 private void BtnInpStep_Click(object sender, EventArgs e) { //刷新各运动参数 RefreshParaSpe(); Int32 axi; axi = m_SelectInfo.MinAxi; if (CSignalMode.Checked == true) { switch (m_SelectInfo.AxiNo) { case 2: g_CtrlCard.Inp_Signal2(m_SelectInfo.selectAxi[0], m_SelectInfo.selectAxi[1], m_SpePulse[0], m_SpePulse[1]); break; case 3: g_CtrlCard.Inp_Signal3(m_SelectInfo.selectAxi[0], m_SelectInfo.selectAxi[1], m_SelectInfo.selectAxi[2], m_SpePulse[0], m_SpePulse[1], m_SpePulse[2]); break; default: MessageBox.Show("请选择正确的插补轴!"); break; } } else { switch (m_SelectInfo.AxiNo) { case 2: g_CtrlCard.Inp_Command2(m_SelectInfo.selectAxi[0], m_SelectInfo.selectAxi[1], m_SpePulse[0], m_SpePulse[1]); break; case 3: g_CtrlCard.Inp_Command3(m_SelectInfo.selectAxi[0], m_SelectInfo.selectAxi[1], m_SelectInfo.selectAxi[2], m_SpePulse[0], m_SpePulse[1], m_SpePulse[2]); break; default: MessageBox.Show("请选择正确的插补轴!"); break; } } } //步进插补停止 private void BtnStepStop_Click(object sender, EventArgs e) { for(int i=1;i<MAXAXI 1;i ) { g_CtrlCard.Inp_Stop(i); } } #endregion #region 回原点界面代码部分 //改变轴号后加载数据 public void LoadZeroParaEx() { if (m_ZeroPara[g_ZeroAxi - 1].m_dir == 1)//方向 { ZeroDir2.Checked = true; } else { ZeroDir1.Checked = true; } if (m_ZeroPara[g_ZeroAxi - 1].m_stop0 == 1)//stop0 { ZeroStop02.Checked = true; } else { ZeroStop01.Checked = true; } if (m_ZeroPara[g_ZeroAxi - 1].m_lmt == 1)//Lmt { ZeroLmt2.Checked = true; } else { ZeroLmt1.Checked = true; } if (m_ZeroPara[g_ZeroAxi - 1].m_stop1 == -1)//stop1 { ZeroStop11.Checked = true; } else if (m_ZeroPara[g_ZeroAxi - 1].m_stop1 == 0) { ZeroStop12.Checked = true; } else { ZeroStop13.Checked = true; } ZeroAcc.Text = Convert.ToString(m_ZeroPara[g_ZeroAxi - 1].m_Acc); ZeroStartV.Text = Convert.ToString(m_ZeroPara[g_ZeroAxi - 1].m_StartV); ZeroSearchV.Text = Convert.ToString(m_ZeroPara[g_ZeroAxi - 1].m_SearchV); ZeroHomeSpeed.Text = Convert.ToString(m_ZeroPara[g_ZeroAxi - 1].m_Speed); ZeroZspeed.Text = Convert.ToString(m_ZeroPara[g_ZeroAxi - 1].m_ZSpeed); ZeroBackRange.Text = Convert.ToString(m_ZeroPara[g_ZeroAxi - 1].m_bkRange); ZeroZRange.Text = Convert.ToString(m_ZeroPara[g_ZeroAxi - 1].m_ZRange); ZeroOff.Text = Convert.ToString(m_ZeroPara[g_ZeroAxi - 1].m_Off); } //回零轴号切换 private void ZeroAxi_SelectedIndexChanged(object sender, EventArgs e) { if (ZeroAxi.Text == "X轴") { g_ZeroAxi = 1; LoadZeroParaEx(); } if (ZeroAxi.Text == "Y轴") { g_ZeroAxi = 2; LoadZeroParaEx(); } if (ZeroAxi.Text == "Z轴") { g_ZeroAxi = 3; LoadZeroParaEx(); } if (ZeroAxi.Text == "A轴") { g_ZeroAxi = 4; LoadZeroParaEx(); } } //当前轴参数生效 private void button1_Click(object sender, EventArgs e) { if (ZeroDir1.Checked) { m_ZeroPara[g_ZeroAxi - 1].m_dir = 0;//负向 } else { m_ZeroPara[g_ZeroAxi - 1].m_dir = 1;//正向 } if (ZeroStop01.Checked) { m_ZeroPara[g_ZeroAxi - 1].m_stop0 = 0;//低电平有效 } else { m_ZeroPara[g_ZeroAxi - 1].m_stop0 = 1;//高电平有效 } if (ZeroLmt1.Checked) { m_ZeroPara[g_ZeroAxi - 1].m_lmt = 0;//低电平停止 } else { m_ZeroPara[g_ZeroAxi - 1].m_lmt = 1;//高电平停止 } if (ZeroStop11.Checked) { m_ZeroPara[g_ZeroAxi - 1].m_stop1 = -1;//无效 } if (ZeroStop12.Checked) { m_ZeroPara[g_ZeroAxi - 1].m_stop1 = 0;//低电平有效 } if (ZeroStop13.Checked) { m_ZeroPara[g_ZeroAxi - 1].m_stop1 = 1;//高电平有效 } m_ZeroPara[g_ZeroAxi - 1].m_Acc = Convert.ToInt32(ZeroAcc.Text); m_ZeroPara[g_ZeroAxi - 1].m_StartV = Convert.ToInt32(ZeroStartV.Text); m_ZeroPara[g_ZeroAxi - 1].m_SearchV = Convert.ToInt32(ZeroSearchV.Text); m_ZeroPara[g_ZeroAxi - 1].m_Speed = Convert.ToInt32(ZeroHomeSpeed.Text); m_ZeroPara[g_ZeroAxi - 1].m_ZSpeed = Convert.ToInt32(ZeroZspeed.Text); m_ZeroPara[g_ZeroAxi - 1].m_bkRange = Convert.ToInt32(ZeroBackRange.Text); m_ZeroPara[g_ZeroAxi - 1].m_ZRange = Convert.ToInt32(ZeroZRange.Text); m_ZeroPara[g_ZeroAxi - 1].m_Off = Convert.ToInt32(ZeroOff.Text); MessageBox.Show("当前轴参数生效!", "提示"); } //单轴回零 private void btn_AxiZero_Click(object sender, EventArgs e) { Int32 retnX = -1; retnX = adt8948A1m.adt8948_SetHomeMode_Ex(CtrlCard.g_cardIndex, g_ZeroAxi, m_ZeroPara[g_ZeroAxi - 1].m_dir, m_ZeroPara[g_ZeroAxi - 1].m_stop0, m_ZeroPara[g_ZeroAxi - 1].m_lmt, m_ZeroPara[g_ZeroAxi - 1].m_stop1, m_ZeroPara[g_ZeroAxi - 1].m_bkRange, m_ZeroPara[g_ZeroAxi - 1].m_ZRange, m_ZeroPara[g_ZeroAxi - 1].m_Off);//设置回零模式 retnX = adt8948A1m.adt8948_SetHomeSpeed_Ex(CtrlCard.g_cardIndex, g_ZeroAxi, m_ZeroPara[g_ZeroAxi - 1].m_StartV, m_ZeroPara[g_ZeroAxi - 1].m_SearchV, m_ZeroPara[g_ZeroAxi - 1].m_Speed, m_ZeroPara[g_ZeroAxi - 1].m_Acc, m_ZeroPara[g_ZeroAxi - 1].m_ZSpeed); //设置回零速度 retnX = adt8948A1m.adt8948_HomeProcess_Ex(CtrlCard.g_cardIndex, g_ZeroAxi); //启动回零 if (retnX < 0 || retnX > 20) { MessageBox.Show("回零失败!", "提示"); } while (true) { Application.DoEvents(); retnX = adt8948A1m.adt8948_GetHomeStatus_Ex(CtrlCard.g_cardIndex, g_ZeroAxi); Return0Status.Text = "回原点状态:" Convert.ToString(retnX); if (retnX < 0 || retnX > 20) { MessageBox.Show("回零失败!", "提示"); return; } if (retnX == 0) { MessageBox.Show("回零成功!", "提示"); return; } } } //所有轴回零 private void btn_AllZero_Click(object sender, EventArgs e) { Int32 retnX = -1, retnY = -1, retnZ = -1, retnA = -1; retnX = adt8948A1m.adt8948_SetHomeMode_Ex(CtrlCard.g_cardIndex, 1, m_ZeroPara[0].m_dir, m_ZeroPara[0].m_stop0, m_ZeroPara[0].m_lmt, m_ZeroPara[0].m_stop1, m_ZeroPara[0].m_bkRange, m_ZeroPara[0].m_ZRange, m_ZeroPara[0].m_Off);//设置回零模式 retnX = adt8948A1m.adt8948_SetHomeSpeed_Ex(CtrlCard.g_cardIndex, 1, m_ZeroPara[0].m_StartV, m_ZeroPara[0].m_SearchV, m_ZeroPara[0].m_Speed, m_ZeroPara[0].m_Acc, m_ZeroPara[0].m_ZSpeed); //设置回零速度 retnY = adt8948A1m.adt8948_SetHomeMode_Ex(CtrlCard.g_cardIndex, 2, m_ZeroPara[1].m_dir, m_ZeroPara[1].m_stop0, m_ZeroPara[1].m_lmt, m_ZeroPara[1].m_stop1, m_ZeroPara[1].m_bkRange, m_ZeroPara[1].m_ZRange, m_ZeroPara[1].m_Off);//设置回零模式 retnY = adt8948A1m.adt8948_SetHomeSpeed_Ex(CtrlCard.g_cardIndex, 2, m_ZeroPara[1].m_StartV, m_ZeroPara[1].m_SearchV, m_ZeroPara[1].m_Speed, m_ZeroPara[1].m_Acc, m_ZeroPara[1].m_ZSpeed); //设置回零速度 retnZ = adt8948A1m.adt8948_SetHomeMode_Ex(CtrlCard.g_cardIndex, 3, m_ZeroPara[2].m_dir, m_ZeroPara[2].m_stop0, m_ZeroPara[2].m_lmt, m_ZeroPara[2].m_stop1, m_ZeroPara[2].m_bkRange, m_ZeroPara[2].m_ZRange, m_ZeroPara[2].m_Off);//设置回零模式 retnZ = adt8948A1m.adt8948_SetHomeSpeed_Ex(CtrlCard.g_cardIndex, 3, m_ZeroPara[2].m_StartV, m_ZeroPara[2].m_SearchV, m_ZeroPara[2].m_Speed, m_ZeroPara[2].m_Acc, m_ZeroPara[2].m_ZSpeed); //设置回零速度 retnA = adt8948A1m.adt8948_SetHomeMode_Ex(CtrlCard.g_cardIndex, 4, m_ZeroPara[3].m_dir, m_ZeroPara[3].m_stop0, m_ZeroPara[3].m_lmt, m_ZeroPara[3].m_stop1, m_ZeroPara[3].m_bkRange, m_ZeroPara[3].m_ZRange, m_ZeroPara[3].m_Off);//设置回零模式 retnA = adt8948A1m.adt8948_SetHomeSpeed_Ex(CtrlCard.g_cardIndex, 4, m_ZeroPara[3].m_StartV, m_ZeroPara[3].m_SearchV, m_ZeroPara[3].m_Speed, m_ZeroPara[3].m_Acc, m_ZeroPara[3].m_ZSpeed); //设置回零速度 retnX = adt8948A1m.adt8948_HomeProcess_Ex(CtrlCard.g_cardIndex, 1); //启动回零 retnY = adt8948A1m.adt8948_HomeProcess_Ex(CtrlCard.g_cardIndex, 2); //启动回零 retnZ = adt8948A1m.adt8948_HomeProcess_Ex(CtrlCard.g_cardIndex, 3); //启动回零 retnA = adt8948A1m.adt8948_HomeProcess_Ex(CtrlCard.g_cardIndex, 4); //启动回零 if (retnX < 0 || retnX > 20) { MessageBox.Show("回零失败!", "提示"); return; } if (retnY < 0 || retnY > 20) { MessageBox.Show("回零失败!", "提示"); return; } if (retnZ < 0 || retnZ > 20) { MessageBox.Show("回零失败!", "提示"); return; } if (retnA < 0 || retnA > 20) { MessageBox.Show("回零失败!", "提示"); return; } while (true) { Application.DoEvents(); retnX = adt8948A1m.adt8948_GetHomeStatus_Ex(CtrlCard.g_cardIndex, 1); retnX = adt8948A1m.adt8948_GetHomeStatus_Ex(CtrlCard.g_cardIndex, 2); retnX = adt8948A1m.adt8948_GetHomeStatus_Ex(CtrlCard.g_cardIndex, 3); retnX = adt8948A1m.adt8948_GetHomeStatus_Ex(CtrlCard.g_cardIndex, 4); //Return0Status.Text = "回原点状态:" Convert.ToString(retnX); if (retnX == 0 && retnY == 0 && retnZ == 0 && retnA == 0) { MessageBox.Show("回零成功!", "提示"); return; } else if (retnX < 0 || retnX > 20) { MessageBox.Show("X回零失败!", "提示"); return; } else if (retnY < 0 || retnY > 20) { MessageBox.Show("Y回零失败!", "提示"); return; } else if (retnZ < 0 || retnZ > 20) { MessageBox.Show("Z回零失败!", "提示"); return; } else if (retnY < 0 || retnY > 20) { MessageBox.Show("A回零失败!", "提示"); return; } } } //进入界面时的操作 private void tabPage13_Enter(object sender, EventArgs e) { LoadZeroParaEx(); } #endregion //关闭界面时保存参数 private void Form1_FormClosed(object sender, FormClosedEventArgs e) { } }//End Form1 }//End Demo
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论