//将上位机设置的PID参数更新到控制器
private int PidParaSet()
{ float TempFloat = 0;
float TempDpos = 0, TempMpos = 0;
bool TempInt = false;
MyFullClosedLoop CloseLoop = new MyFullClosedLoop();
String CompareStr = "闭环已开";
String TempStr = IsClosedLoop.Text;
//打开全闭环去控制轴运动
if (TempStr == CompareStr)
{ //获取轴位置,如果DPOS和MPOS相差太大不能打开脉冲闭环,保证安全
zmcaux.ZAux_Direct_GetDpos(g_handle, int.Parse(AxisId.Text), ref TempDpos);
zmcaux.ZAux_Direct_GetMpos(g_handle, int.Parse(AxisId.Text), ref TempMpos);
if ((TempDpos - TempMpos) > 4 || (TempDpos - TempMpos < -4))
{ Console.WriteLine("规划位置和反馈位置相差太大,无法启动闭环功能!!!!"); return -1;
}
//更新比例增益
CloseLoop.ZAux_Direct_SetPGain(g_handle, int.Parse(AxisId.Text), float.Parse(text_ParaP.Text));
//更新积分增益
CloseLoop.ZAux_Direct_SetIGain(g_handle, int.Parse(AxisId.Text), float.Parse(text_ParaI.Text));
//更新微分增益
CloseLoop.ZAux_Direct_SetDGain(g_handle, int.Parse(AxisId.Text), float.Parse(text_ParaD.Text));
//更新速度前馈增益
CloseLoop.ZAux_Direct_SetVffGain(g_handle, int.Parse(AxisId.Text), float.Parse(text_ParaVF.Text));
//更新加速度前馈增益
CloseLoop.ZAux_Direct_SetAffGain(g_handle, int.Parse(AxisId.Text), float.Parse(text_ParaAF.Text));
//更新速度增益
CloseLoop.ZAux_Direct_SetOvGain(g_handle, int.Parse(AxisId.Text), float.Parse(text_ParaOV.Text));
//注意:在打开servo之前打开encoder_servo后要完成一次atype由0变为4的切换,否则会报axis:0 config not support Servo.
//1、先打开axis_enable 和 encoder_servo
zmcaux.ZAux_Direct_SetAxisEnable(g_handle, int.Parse(AxisId.Text), 1); CloseLoop.ZAux_Direct_SetEncoderServo(g_handle, int.Parse(AxisId.Text), 1);
Thread.Sleep(20);
CloseLoop.ZAux_Direct_GetEncoderServo(g_handle, int.Parse(AxisId.Text), ref TempInt);
if (TempInt)
{ //2、完成一次Atype由0变为4的切换
zmcaux.ZAux_Direct_SetAtype(g_handle, int.Parse(AxisId.Text), 0);
Thread.Sleep(20);
zmcaux.ZAux_Direct_SetAtype(g_handle, int.Parse(AxisId.Text), 4);
//3、打开Servo
CloseLoop.ZAux_Direct_SetServo(g_handle, int.Parse(AxisId.Text), 1);
Thread.Sleep(10);
CloseLoop.ZAux_Direct_GetServo(g_handle, int.Parse(AxisId.Text), ref TempInt);
if (TempInt)
{ Console.WriteLine("闭环参数配置完成, 轴全闭环功能打开成功。"); }
else
{ Console.WriteLine("轴闭环开关Servo打开失败, 导致脉冲全闭环开启失败!!!"); return -1;
}
}
else
{ Console.WriteLine("轴编码器闭环EncoderServo打开失败, 导致脉冲全闭环开启失败!!!"); return -1;
}
}
else
{ //关闭全闭环的功能
//1、关闭EncoderServo
CloseLoop.ZAux_Direct_SetEncoderServo(g_handle, int.Parse(AxisId.Text), 0);
Thread.Sleep(20);
CloseLoop.ZAux_Direct_GetEncoderServo(g_handle, int.Parse(AxisId.Text), ref TempInt);
if (TempInt)
{ Console.WriteLine("轴EncoderServo关闭失败!!!"); return -1;
}
//2、关闭EncoderServo后需要完成ATYPE的切换,保证完全关闭闭环功能
zmcaux.ZAux_Direct_SetAtype(g_handle, int.Parse(AxisId.Text), 0);
Thread.Sleep(10);
zmcaux.ZAux_Direct_SetAtype(g_handle, int.Parse(AxisId.Text), 4);
//3、关闭Servo
CloseLoop.ZAux_Direct_SetServo(g_handle, int.Parse(AxisId.Text), 0);
Thread.Sleep(20);
CloseLoop.ZAux_Direct_GetServo(g_handle, int.Parse(AxisId.Text), ref TempInt);
if (TempInt)
{ Console.WriteLine("轴Servo关闭失败!!!"); return -1;
}
}
return 0;
}