Commit eeab6aad 张东亮
2 个父辈 d84cf652 6468db47
......@@ -11,6 +11,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LoadCSVLibrary", "source\Lo
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XLRStore", "source\XLRStoreClient\XLRStore.csproj", "{0D2542F5-DD62-4352-82D0-383D9A045E74}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HuichuanLibrary", "source\HuichuanLibrary\HuichuanLibrary.csproj", "{C9575C5E-9D4B-4B4F-BE41-926652B8985F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
......@@ -33,6 +35,10 @@ Global
{0D2542F5-DD62-4352-82D0-383D9A045E74}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0D2542F5-DD62-4352-82D0-383D9A045E74}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0D2542F5-DD62-4352-82D0-383D9A045E74}.Release|Any CPU.Build.0 = Release|Any CPU
{C9575C5E-9D4B-4B4F-BE41-926652B8985F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C9575C5E-9D4B-4B4F-BE41-926652B8985F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C9575C5E-9D4B-4B4F-BE41-926652B8985F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C9575C5E-9D4B-4B4F-BE41-926652B8985F}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
......
......@@ -55,10 +55,6 @@
<Reference Include="halcondotnet">
<HintPath>..\..\dll\halcondotnet.dll</HintPath>
</Reference>
<Reference Include="HuichuanLibrary, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\dll\HuichuanDLL\HuichuanLibrary.dll</HintPath>
</Reference>
<Reference Include="log4net, Version=2.0.12.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
<HintPath>..\..\packages\log4net.2.0.12\lib\net45\log4net.dll</HintPath>
</Reference>
......@@ -188,6 +184,10 @@
<Project>{43cdd09e-fcf3-4960-a01d-3bbfe9933122}</Project>
<Name>Common</Name>
</ProjectReference>
<ProjectReference Include="..\HuichuanLibrary\HuichuanLibrary.csproj">
<Project>{c9575c5e-9d4b-4b4f-be41-926652b8985f}</Project>
<Name>HuichuanLibrary</Name>
</ProjectReference>
<ProjectReference Include="..\LoadCVSLibrary\LoadCSVLibrary.csproj">
<Project>{064bebf5-8faa-4ea2-a5f3-a06e6e7d9251}</Project>
<Name>LoadCSVLibrary</Name>
......
此文件的差异太大,无法显示。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace HuichuanLibrary
{
public partial class FrmHuiChuanTest : Form
{
public FrmHuiChuanTest()
{
InitializeComponent();
}
private List<Label> DILabelList = new List<Label>();
private List<Label> DOLabelList = new List<Label>();
private List<Label> groupIOList = new List<Label>();
private void FrmHuiChuanTest_Load(object sender, EventArgs e)
{
DILabelList = new List<Label>();
DILabelList.Add(lblDI0);
DILabelList.Add(lblDI1);
DILabelList.Add(lblDI2);
DILabelList.Add(lblDI3);
DILabelList.Add(lblDI4);
DILabelList.Add(lblDI5);
DILabelList.Add(lblDI6);
DILabelList.Add(lblDI7);
DILabelList.Add(lblDI8);
DILabelList.Add(lblDI9);
DILabelList.Add(lblDI10);
DILabelList.Add(lblDI11);
DILabelList.Add(lblDI12);
DILabelList.Add(lblDI13);
DILabelList.Add(lblDI14);
DILabelList.Add(lblDI15);
for(int i = 0; i < DILabelList.Count; i++)
{
DILabelList[i].Text = "DI_" + i;
}
DOLabelList.Add(lblDO0);
DOLabelList.Add(lblDO1);
DOLabelList.Add(lblDO2);
DOLabelList.Add(lblDO3);
DOLabelList.Add(lblDO4);
DOLabelList.Add(lblDO5);
DOLabelList.Add(lblDO6);
DOLabelList.Add(lblDO7);
DOLabelList.Add(lblDO8);
DOLabelList.Add(lblDO9);
DOLabelList.Add(lblDO10);
DOLabelList.Add(lblDO11);
DOLabelList.Add(lblDO12);
DOLabelList.Add(lblDO13);
DOLabelList.Add(lblDO14);
DOLabelList.Add(lblDO15);
for (int i = 0; i < DOLabelList.Count; i++)
{
DOLabelList[i].Text = "DO_" + i;
}
groupIOList = new List<Label>();
//groupIOList.Add(lblGroup7);
//groupIOList.Add(lblGroup6);
//groupIOList.Add(lblGroup5);
//groupIOList.Add(lblGroup4);
//groupIOList.Add(lblGroup3);
//groupIOList.Add(lblGroup2);
//groupIOList.Add(lblGroup1);
//groupIOList.Add(lblGroup0);
groupIOList.Add(lblGroup0);
groupIOList.Add(lblGroup1);
groupIOList.Add(lblGroup2);
groupIOList.Add(lblGroup3);
groupIOList.Add(lblGroup4);
groupIOList.Add(lblGroup5);
groupIOList.Add(lblGroup6);
groupIOList.Add(lblGroup7);
FormStatus(false);
timerIO.Start();
timerMain.Start();
lblAdSts.Text ="状态说明:\r\n"+
"Bit0 ,负载电压故障,0:正常,1:未接入外部电源\r\n" +
"Bit1 ,模拟芯片连接错误,0:正常,1:数字版与模拟板通讯错误\r\n" +
"Bit2:通道故障\r\n" +
"Bit3:通道上溢\r\n" +
"Bit4:通道下溢\r\n" +
"Bit5:通道超上限\r\n" +
"Bit6:通道超下限\r\n" +
"Bit7:通道断线\r\n";
HCLogUtil.logBox = richTextBox1;
}
private void btnInitBoard_Click(object sender, EventArgs e)
{
bool result = HCBoardManager.OpenCard(1);
if (result)
{
cmbAxisIndex.Items.Clear();
List<int> axisList = HCBoardManager.AxisList;
foreach(int i in axisList)
{
cmbAxisIndex.Items.Add(i);
}
if (axisList.Count > 0)
{
cmbAxisIndex.SelectedIndex = 0;
}
else
{
tabControl1.TabPages.RemoveAt(0);
}
}
}
private short GetAxisNo()
{
short axisNo = Convert.ToInt16(cmbAxisIndex.SelectedIndex); //实时读取轴选择
return axisNo;
}
private void btnCloseBoard_Click(object sender, EventArgs e)
{
//轴状态监控定时器
axStsMonitor_timer.Enabled = false;
timerIO.Stop();
bool result = HCBoardManager.CloseCard();
}
private void FrmHuiChuanTest_FormClosing(object sender, FormClosingEventArgs e)
{
timerMain.Stop();
HCLogUtil.logBox = null;
}
private void btnSuddenStop_Click(object sender, EventArgs e)
{
HCBoardManager.EmgStop();
}
private void btnCancelStop_Click(object sender, EventArgs e)
{
HCBoardManager.CancelEmg();
}
private void btnSetValue_Click(object sender, EventArgs e)
{
//【1】更新轴号
ushort tAxisNo = Convert.ToUInt16(cmbAxisIndex.SelectedIndex); //实时读取轴选择
//【2】获取电子齿轮分子分母
int Motor_Revolution = Convert.ToInt32(txtMotorRevolution.Text); //电子齿轮分子:电机分辨率
int Shaft_Revolution = Convert.ToInt32(txtShaftRevolution.Text); //电子齿轮分母:一圈脉冲数
HCBoardManager.SetEcatSdo(tAxisNo, Motor_Revolution, Shaft_Revolution);
}
private void btnServerOn_Click(object sender, EventArgs e)
{
short axisNo= Convert.ToInt16(cmbAxisIndex.SelectedIndex); //实时读取轴选择
HCBoardManager.ServoOn(axisNo);
}
private void btnServerOff_Click(object sender, EventArgs e)
{
short axisNo = Convert.ToInt16(cmbAxisIndex.SelectedIndex); //实时读取轴选择
HCBoardManager.ServoOff(axisNo);
}
private void btnStartHome_Click(object sender, EventArgs e)
{
//【1】更新轴号
short axisNo = Convert.ToInt16(cmbAxisIndex.SelectedIndex); //实时读取轴选择
//【2】写入回原参数
short homeMethod = Convert.ToInt16(txtHomeType.Text);
int offset = Convert.ToInt32(txtHomeOffset.Text);
uint highVel = Convert.ToUInt32(txtHomeHSpeed.Text);
uint lowVel = Convert.ToUInt32(txtHomeLSpeed.Text);
uint acc = Convert.ToUInt32(txtHomeAcc.Text);
uint overtime = Convert.ToUInt32(txtHomeTimeOut.Text);
short posSrc = Convert.ToInt16(txtScrPos.Text);
HCBoardManager.StartHomeMove(axisNo, highVel, lowVel, acc, homeMethod, offset, overtime, posSrc);
}
private void btnStopHome_Click(object sender, EventArgs e)
{
HCBoardManager.StopHomeMove(GetAxisNo());
}
private void btnHomeStatus_Click(object sender, EventArgs e)
{
short value = HCBoardManager.GetHomeStatus(GetAxisNo());
string homesstr = HCBoardManager.AxisHomeSts(value);
lblhomeSts.Text = homesstr;
}
private void btnExitHome_Click(object sender, EventArgs e)
{
HCBoardManager.FinishHome(GetAxisNo());
}
private void btnStartTimer_Click(object sender, EventArgs e)
{
if (cmbAxisIndex.Items.Count == 0) //如果轴号为空
{
MessageBox.Show("轴号为空!");
return;
}
StsTimeStatus(true);
}
private void StsTimeStatus(bool enable)
{
axStsMonitor_timer.Enabled = false;
btnStopTimer.Enabled = false;
btnStartTimer.Enabled = !enable;
}
private void btnStopTimer_Click(object sender, EventArgs e)
{
StsTimeStatus(false);
}
private void btnPtpMove_Click(object sender, EventArgs e)
{
short axisNo = GetAxisNo();
//【2】读取界面设置
double ptpVel = Convert.ToDouble(txtPtpVel.Text);
double ptpAcc = Convert.ToDouble(txtPtpAcc.Text);
double ptpDec = Convert.ToDouble(txtPtpDec.Text);
double ptpPos = Convert.ToDouble(txtPtpPos.Text);
HCBoardManager.AbsMove(axisNo, ptpPos, ptpVel, ptpAcc, ptpDec);
}
private void btnRelMove_Click(object sender, EventArgs e)
{
short axisNo = GetAxisNo();
//【2】读取界面设置
double ptpVel = Convert.ToDouble(txtPtpVel.Text);
double ptpAcc = Convert.ToDouble(txtPtpAcc.Text);
double ptpDec = Convert.ToDouble(txtPtpDec.Text);
double ptpPos = Convert.ToDouble(txtPtpPos.Text);
HCBoardManager.RelMove(axisNo, ptpPos, ptpVel, ptpAcc, ptpDec);
}
private void btnAxisStop_Click(object sender, EventArgs e)
{
HCBoardManager.AxisStop(GetAxisNo());
}
private void btnJOGj_MouseDown(object sender, MouseEventArgs e)
{
short axisNo = GetAxisNo();
//【2】
//负向运动,速度为负,要对速度取负值
double tgtVel = (-1) * Math.Abs(Convert.ToDouble(txtJogSpeed.Text));
HCBoardManager.SpeedMove(axisNo, tgtVel);
btnJOGj.BackColor = Color.Green;
}
private void btnJOGj_MouseUp(object sender, MouseEventArgs e)
{
short axisNo = GetAxisNo();
HCBoardManager.AxisStop(axisNo);
btnJOGj.BackColor = Color.White;
}
private void btnJOGAdd_MouseDown(object sender, MouseEventArgs e)
{
short axisNo = GetAxisNo();
//【2】
//正向运动,速度为正,要对速度取绝对值
double tgtVel = Math.Abs(Convert.ToDouble(txtJogSpeed.Text));
HCBoardManager.SpeedMove(axisNo, tgtVel);
btnJOGAdd.BackColor = Color.Green;
}
private void btnJOGAdd_MouseUp(object sender, MouseEventArgs e)
{
short axisNo = GetAxisNo();
HCBoardManager.AxisStop(axisNo);
btnJOGAdd.BackColor = Color.White;
}
private void ShowlbSts(Label lbl, int value)
{
if (value.Equals(1))
{
lbl.BackColor = Color.Lime;
}
else if (value.Equals(0))
{
lbl.BackColor = Color.LightGray;
}
else
{
lbl.BackColor = this.BackColor;
}
}
private void axStsMonitor_timer_Tick(object sender, EventArgs e)
{
if (btnStartTimer.Visible && HCBoardManager.CardInitOk() && HCBoardManager.AxisList.Count > 0)
{
btnStartTimer.Enabled = false;
ReadAxisStatus();
}
}
private void ReadAxisStatus()
{
//【1】更新轴号
short axisNo = GetAxisNo();
short modeValue = HCBoardManager.GetAxisPrfMode(axisNo);
if (modeValue<0)
{
return;
}
else
{
string mode = HCBoardManager.AxisPrfMode(modeValue);
lblAxisPrfMode.Text = mode;
}
//【2】读取轴状态,如果读取出错将关闭此定时器
AxisSts sts = HCBoardManager.GetAxisSts(axisNo);
if (sts.ServoOn < 0)
{
axStsMonitor_timer.Stop();
}
//【3】更新界面显示
ShowlbSts(lblALM, sts.ALM); //报警信号
ShowlbSts(lblWARN, sts.WARN); //警告信号
ShowlbSts(lblEMG, sts.EMG);//急停信号
ShowlbSts(lblSvOn, sts.ServoOn); //使能信号
ShowlbSts(lblBUSY, sts.BUSY); //轴忙信号
ShowlbSts(lblINP, sts.INP); //轴到位信号
if (sts.ORG < 0)
{
axStsMonitor_timer.Stop();
}
ShowlbSts(lblPEL, sts.PEL); //正限位信号
ShowlbSts(lblORG, sts.ORG); //原点信号
ShowlbSts(lblNEL, sts.NEL); //负限位信号
//label59.Text = ConvertDecimalToBinary(nTimerAxSts[0]); //轴状态是按bit进行解读,因此这里将AxSts转换为二进制bit进行显示
lblAxPrfPos.Text = HCBoardManager.GetAxisPrfPos(axisNo).ToString();
lblAxPrfVel.Text = HCBoardManager.GetAxisPrfVel(axisNo).ToString();
//label62.Text = nTimerAxPrfAcc[0].ToString();
lblAxEncPos.Text = HCBoardManager.GetAxisCurrPos(axisNo).ToString();
lblAxEncVel.Text = HCBoardManager.GetAxisCurrVel(axisNo).ToString();
lblAxEncAcc.Text = HCBoardManager.GetAxisCurrAcc(axisNo).ToString();
//label65.Text = nTimerAxEncAcc[0].ToString();
short value = HCBoardManager.GetHomeStatus(GetAxisNo());
string homesstr = HCBoardManager.AxisHomeSts(value);
lblhomeSts.Text = homesstr;
//txtFuzai.Text = HCBoardManager.GetAxisLoadRate(axisNo);
btnSearch_Click(null,null);
btnSearchNj_Click(null, null);
}
private void btnSetBitDO_Click(object sender, EventArgs e)
{
short bitNo =(short) numBitIndex.Value;
HCBoardManager.SetBitDO(bitNo, 1);
}
private void btnCloseBit_Click(object sender, EventArgs e)
{
short bitNo = (short)numBitIndex.Value;
HCBoardManager.SetBitDO(bitNo, 0);
}
private void btnGetBitDo_Click(object sender, EventArgs e)
{
short bitNo = (short)numBitIndex.Value;
short value = HCBoardManager.GetBitDO(bitNo);
lblBitResult.Text = "DO_" + bitNo + "=" + value;
}
private void btnGetBitDI_Click(object sender, EventArgs e)
{
short bitNo = (short)numBitIndex.Value;
short value = HCBoardManager.GetBitDI(bitNo);
lblBitResult.Text = "DI_" + bitNo + "=" + value;
}
private string GetLabelIOValue(Label label)
{
if (label.BackColor.Equals(Color.Lime))
{
return "1";
}
else
{
return "0";
}
}
private void btnSetGroupDo_Click(object sender, EventArgs e)
{
short groupNo = (short)numGroupIndex.Value;
string value = "";
for (int i = 0; i < groupIOList.Count; i++)
{
value = GetLabelIOValue(groupIOList[i])+value;
}
short tValue = Convert.ToInt16(value, 2);
HCBoardManager.SetGroupDO(groupNo, tValue);
}
private void ShowIO(Label label,short value)
{
if (value.Equals((short)1))
{
label.BackColor = Color.Lime;
}
else if(value.Equals((short)0))
{
label.BackColor = Color.LightGray;
}
else
{
label.BackColor = Color.White;
}
}
private void btnGetGroupDo_Click(object sender, EventArgs e)
{
short groupNo = (short)numGroupIndex.Value;
lblGroupResult.Text = "<<组" + groupNo + "的DO值";
short tValue = HCBoardManager.GetGroupDO(groupNo);
List<short> gList = HCBoardManager.GetIOValue(tValue);
for (int i = 0; i < gList.Count; i++)
{
short v = gList[i];
ShowIO(groupIOList[i], v);
}
//string value = Convert.ToString(tValue,2).PadLeft(8,'0');
//for (int i = 0; i < groupIOList.Count; i++)
//{
// string v = value.Substring( i, 1);
// //groupIOList[i].Text = "DO_" + i;
// if (v.Equals("1"))
// {
// groupIOList[i].BackColor = Color.Lime;
// }
// else
// {
// groupIOList[i].BackColor = Color.LightGray;
// }
//}
}
private void btnGetGroupDI_Click(object sender, EventArgs e)
{
short groupNo = (short)numGroupIndex.Value;
lblGroupResult.Text = "<<组" + groupNo + "的DI值";
short tValue = HCBoardManager.GetGroupDI(groupNo);
List<short> gList = HCBoardManager.GetIOValue(tValue);
for (int i = 0; i < gList.Count; i++)
{
short v = gList[i];
ShowIO(groupIOList[i], v);
}
//string value = Convert.ToString(tValue, 2).PadLeft(8, '0');
//for (int i = 0; i < groupIOList.Count; i++)
//{
// string v = value.Substring(i, 1);
// //groupIOList[i].Text = "DI_" + i;
// if (v.Equals("1"))
// {
// groupIOList[i].BackColor = Color.Lime;
// }
// else
// {
// groupIOList[i].BackColor = Color.LightGray;
// }
//}
}
private void btnStartGetIO_Click(object sender, EventArgs e)
{
timerIO.Start();
}
private void btnStopGetDO_Click(object sender, EventArgs e)
{
timerIO.Stop();
}
private void timerIO_Tick(object sender, EventArgs e)
{
if (groupBox1.Visible && HCBoardManager.CardInitOk())
{
btnStartGetIO.Enabled = false;
if (radioButton1.Checked)
{
int groupLength = 8;
int diGroupCount = DILabelList.Count / groupLength;
for (short i = 0; i < diGroupCount; i++)
{
short groupValue = HCBoardManager.GetGroupDI(i);
List<short> vList = HCBoardManager.GetIOValue(groupValue);
for(int index = 0; index < vList.Count; index++)
{
ShowIO(DILabelList[i * 8 + index], vList[index]);
}
}
int doGroupCount = DOLabelList.Count / groupLength;
for(short i = 0; i < doGroupCount; i++)
{
short groupValue = HCBoardManager.GetGroupDO(i);
List<short> vList = HCBoardManager.GetIOValue(groupValue);
for (int index = 0; index < vList.Count; index++)
{
ShowIO(DOLabelList[i * 8 + index], vList[index]);
}
}
}
else
{
for (short i = 0; i < DILabelList.Count; i++)
{
short value = HCBoardManager.GetBitDI(i);
ShowIO(DILabelList[i], value);
}
for (short i = 0; i < DOLabelList.Count; i++)
{
short value = HCBoardManager.GetBitDO(i);
ShowIO(DOLabelList[i], value);
}
}
}
}
private void lblGroup0_Click(object sender, EventArgs e)
{
Label label = (Label)sender;
if (label.BackColor.Equals(Color.LightGray))
{
label.BackColor = Color.Lime ;
}
else
{
label.BackColor = Color.LightGray;
}
}
private void btnClearAxSts_Click(object sender, EventArgs e)
{
short axisNo = Convert.ToInt16(cmbAxisIndex.SelectedIndex); //实时读取轴选择
HCBoardManager.ClearAxisSts(axisNo);
}
private void btnReadSts_Click(object sender, EventArgs e)
{
ReadAxisStatus();
}
private void btnClearLog_Click(object sender, EventArgs e)
{
HCLogUtil.ClearLog();
}
private void btnExit_Click(object sender, EventArgs e)
{
HCBoardManager.CloseCard();
this.Close();
}
private void timerMain_Tick(object sender, EventArgs e)
{
if (HCBoardManager.CardInitOk())
{
lblBoradInfo.ForeColor = Color.Green ;
lblBoradInfo.Text = "板卡初始化完成:" + "轴数量[" + HCBoardManager.tResource.axNum + "],DI数量[" + HCBoardManager.tResource.diNum + "],DO数量[" + HCBoardManager.tResource.doNum + "]";
if (!btnInitBoard.Enabled.Equals(false))
{
FormStatus(true );
}
if (chbAuto.Checked)
{
ReadAdValue();
}
}
else
{
lblBoradInfo.ForeColor = Color.Red;
lblBoradInfo.Text = "板卡未初始化完成";
if (!btnInitBoard.Enabled.Equals(true ))
{
FormStatus(false );
}
}
}
private void FormStatus(bool isOk)
{
btnInitBoard.Enabled = !isOk;
groupBox1.Enabled = isOk;
groupBox2.Enabled = isOk;
groupBox3.Enabled = isOk;
groupBox4.Enabled = isOk;
groupBox6.Enabled = isOk;
groupBox7.Enabled = isOk;
groupBox8.Enabled = isOk;
groupBox9.Enabled = isOk;
groupBox10.Enabled = isOk;
groupBox11.Enabled = isOk;
btnSuddenStop.Enabled = isOk;
btnCancelStop.Enabled = isOk;
timerIO.Enabled = isOk;
axStsMonitor_timer.Enabled = isOk;
groupBox5.Enabled = isOk;
}
private void btnAdGet_Click(object sender, EventArgs e)
{
if (!HCBoardManager.CardInitOk())
{
MessageBox.Show("板卡未初始化完成!");
return;
}
ReadAdValue();
//txtAdSts1.Text = ConSts(HCBoardManager.GetAdSts(0));
//txtAdSts2.Text = ConSts(HCBoardManager.GetAdSts(1));
//txtAdSts3.Text = ConSts(HCBoardManager.GetAdSts(2));
//txtAdSts4.Text = ConSts(HCBoardManager.GetAdSts(3));
}
private void ReadAdValue()
{
if (!HCBoardManager.CardInitOk())
{
return;
}
txtAd1.Text = HCBoardManager.GetAdVal(0).ToString();
txtAd2.Text = HCBoardManager.GetAdVal(1).ToString();
txtAd3.Text = HCBoardManager.GetAdVal(2).ToString();
txtAd4.Text = HCBoardManager.GetAdVal(3).ToString();
}
private string ConSts(short input)
{
string output = Convert.ToString(input, 2).ToString().PadLeft(8, '0');
return output;
}
private void btnSearch_Click(object sender, EventArgs e)
{
short axisNo = GetAxisNo();
//txtFuzai.Text = HCBoardManager.GetAxisLoadRate(axisNo).ToString();
}
private void btnSearchNj_Click(object sender, EventArgs e)
{
short axisNo = GetAxisNo();
txtNuiju.Text = HCBoardManager.GetAxActTorq(axisNo).ToString();
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="axStsMonitor_timer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>378, 17</value>
</metadata>
<metadata name="timerIO.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>545, 17</value>
</metadata>
<metadata name="timerMain.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>641, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAA8AMDAQAAEABABoBgAA9gAAACgoEAABAAQAyAQAAF4HAAAgIBAAAQAEAOgCAAAmDAAAGBgQAAEA
BADoAQAADg8AABAQEAABAAQAKAEAAPYQAAAwMAAAAQAIAKgOAAAeEgAAKCgAAAEACACoCwAAxiAAACAg
AAABAAgAqAgAAG4sAAAYGAAAAQAIAMgGAAAWNQAAEBAAAAEACABoBQAA3jsAADAwAAABACAAqCUAAEZB
AAAoKAAAAQAgAGgaAADuZgAAICAAAAEAIACoEAAAVoEAABgYAAABACAAiAkAAP6RAAAQEAAAAQAgAGgE
AACGmwAAKAAAADAAAABgAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAIAAAACA
gACAAAAAgACAAICAAACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAAwMDAAP///wAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAA/lAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAA
D///8AAAAAAAAAAAAAAAAAAAAAAAAAAE7////0AAAAAAAAAAAAAAAAAEZHZGBABP/////+AAQkJWZkAA
AAAAAAAG6+t3YAD///////8AB7brd2AAAAAAAAAHvtt0AA/////////kAEd77UAAAAAAAAAGt3ZgBO//
////////ACRnvlAAAAAAAAAHd0QAT///////////8EBHdmAAAAAAAAAEZ2QA////7uvb7v///kAkR0AA
AAAAAAAEdAAf///r69e+vb7///AAZ0AAAAAAAAAGUATv//vtvr2+t72+//9AB0AAAAAAAAAEAC///r6+
t76+vbe+7//gBCAAAAAAAAAABO//7t6+fX2+vre3vv//AAAAAAAAAAAAD///3r69t76+vb69vv//5AAA
AAAAAAAA///+vt5+3r7b69t723///wAAAAAAAAAP///3576+vre+vXvr23////AAAAAAAAD////73n19
7t6+vNvrdr7///8AAAAAAA7////t7r7ne+vtd9vr237////wAAAABP/////r7evt536+vr6+t7f////+
cAAAb//////r7r7evt7X1769vr3/////8AABD/////99fu5+7r7r7X6+t7f/////8AAAAP/////n7t7u
7Xfr6+vX233/////AAAAAA/////t7u7e7u3n7evr577////wAAAAAAD////+7u7u7t6+2+vr69////8A
AAAAAAAP///+3u7+7ufud33tt7////AAAAAAAAAA///+7u/u7e7evt6+vu///wAAAAAAAAAAD///7u7u
7u7N7r7evf//8AAAAAAAAAAEBP///u7u7ud9576+v//+QEAAAAAAAAAGcE7//u7u7t7r7efe7//wR0AA
AAAAAAAGe0D///7u7n5+fr6///8AfVAAAAAAAAALfXAP///u3n19vt7///BOt2AAAAAAAAAHd75A////
/u7u7v///kB3vrAAAAAAAAAE3rdwD///////////8ke+3kAAAAAAAAAE6+17ZP//////////AHvte3AA
AAAAAAAE6+vrcA/////////wRd63fVAAAAAAAAAG7XfXdgH///////8Aduvtd2AAAAAAAAAAVkdGVkAP
//////AGVkdGVgAAAAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAA
AAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAD///////8AAP///n///wAA///8P///AAD///gf//8AAP//8A///wAA///gB///AAD8AAAAAD8AAPwA
AAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/
AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPgAAAAAHwAA8AAAAAAPAADgAAAAAAcAAMAA
AAAAAwAAgAAAAAABAACAAAAAAAEAAMAAAAAAAwAA4AAAAAAHAADwAAAAAA8AAPgAAAAAHwAA/AAAAAA/
AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwA
AAAAPwAA/AAAAAA/AAD8AAAAAD8AAPwAAAAAPwAA/AAAAAA/AAD//+AH//8AAP//8A///wAA///4H///
AAD///w///8AAP///n///wAA////////AAAoAAAAKAAAAFAAAAABAAQAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//
AADAwMAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF
cAAAAAAAAAAAAAAAAAAAAAAAAH/3AAAAAAAAAAAAAAAAAAAAAAAH//9wAAAAAAAAAAAAAAAAQAAAAH//
//cAAAAABAAAAAAABHt2VkAH/////3AFa3t2AAAAAAAAfXt2AH//////9wBGd9VAAAAAAAC3dkQH////
////cAR7dgAAAAAAAGezAH/////////3BGZ2AAAAAAAAdkQH///uvr3u//9wBWcAAAAAAABkAH//++2+
vVvu//cERgAAAAAAAAQH//7et9vr29vv/3AEAAAAAAAAAH//6+e+t7e+t77/9wAAAAAAAAAH//7r1313
fb69tu//cAAAAAAAAH///m53e+t7e3vr7//3AAAAAAAH///uvtftfX3r22u+//9wAAAAAH///+vte+vr
6+vr6+7///cAAAAH////3nfu3u3r3r69tv///nAAAH/////r7evr6+vre9e+////9wAAf////75+7u3u
fn3rfbf////3AAAH////7e7t7uvtvrvr6////3AAAAB////u3u7t7ud+3r2+///3AAAAAAf//+7u7u7u
ve2+d37//3AAAAAAAH///u7v7u7r7evbf//3AAAAAAAAB///7u/t7Xfuvn7v/3AAAAAAAABAf//u7u7u
frd9vv/3BAAAAAAAAHdH//7u7n5+3tfv/3C3QAAAAAAAvVB//+7u1+vr7v/3C3cAAAAAAAB9e0f//+7n
7e7//3B96wAAAAAAALfeYH/////////3C+vmAAAAAAAAfr63R////////3B9e+ZAAAAAAAC3fXdwf///
///3C3fetwAAAAAAAGdnt2QH/////3BHZ7dnAAAAAAAAAAAAAAB////3AAAAAAAAAAAAAAAAAAAAAAf/
/3AAAAAAAAAAAAAAAAAAAAAAAH/3AAAAAAAAAAAAAAAAAAAAAAAAB3AAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////8AAAD//+f//wAAAP//w///AAAA//+B//8A
AAD//wD//wAAAPgAAAAfAAAA+AAAAB8AAAD4AAAAHwAAAPgAAAAfAAAA+AAAAB8AAAD4AAAAHwAAAPgA
AAAfAAAA+AAAAB8AAAD4AAAAHwAAAPgAAAAfAAAA+AAAAB8AAADwAAAADwAAAOAAAAAHAAAAwAAAAAMA
AACAAAAAAQAAAIAAAAABAAAAwAAAAAMAAADgAAAABwAAAPAAAAAPAAAA+AAAAB8AAAD4AAAAHwAAAPgA
AAAfAAAA+AAAAB8AAAD4AAAAHwAAAPgAAAAfAAAA+AAAAB8AAAD4AAAAHwAAAPgAAAAfAAAA+AAAAB8A
AAD4AAAAHwAAAP//AP//AAAA//+B//8AAAD//8P//wAAAP//5///AAAA//////8AAAAoAAAAIAAAAEAA
AAABAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICA
gAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AADAwMAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAG7gAAAAAAAAAAAAAAAAAADv/kAAAAAAAAAAAABARABO///gBARAAAAAAABH63tg
7////kZ3vrQAAAAAC+13Tv/////mt9dwAAAAAAfbdO///////gbr5AAAAABL5k7/7ut37v/iXXAAAAAA
DnDv/td729vv/kZ0AAAAAAZO/+vr6+vr6//lYAAAAAAA7/7r69t7e7v//gAAAAAATv/77efn13fbfv/k
AAAAAO//7ee+vbe9vr7//gAAAE7//+vt537uvr23///hAADv//933r7Xvbe3t////gAA7///5+7n7n7X
fXb///4AAA///+3u3u2+vr6+///mAAAA7//u7u7u7t69vv/+AAAAAA7//u/u7Xvr7c7/4AAAAAAA7/7u
7u7tfr3v/gAAAAAAB27/7+7ufuvu7+R0AAAAAEtw7/7u3r197/5GcAAAAAAO1U7//u7u7//gfrQAAAAA
S31w7//////+e11wAAAAAAfr607/////4WvtdAAAAABGd9dw7////kbm63AAAAAAAAQAAA7//+AABAAA
AAAAAAAAAAAA7/4AAAAAAAAAAAAAAAAAAA7nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA///////+f////D////gf//AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD+AA
AAfAAAADgAAAAYAAAAHAAAAD4AAAB/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD//4
H////D////5///////8oAAAAGAAAADAAAAABAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
gAAAgAAAAICAAIAAAACAAIAAgIAAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AADAwMAA////AAAA
AAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAAAAAf+cAAAAAAAAAQkYF7/9gBgYAAAAGvrdv///3vr5AAAAA
7mX/////R31AAAAAtl/+7r7v87cAAAAEd//b69vb/2dAAAAAT/7r6+vrf+cAAAAC/+vr7be3vv9wAAB/
/+3r5969vv/wAAf//33N6+t76///YAD//+3u5+3rt///cAB//+7u3te+3v/xAAAE//7u7u6+vv8gAAAA
f/7u7r197vYAAAAEZP/u7u6+/1ZAAAAA53/+7t7v925AAAAEt2H/////R74AAAAE7eZ////wft5AAAAA
BAQA//9wBAQAAAAAAAAAf/QAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAP//////5////8P//+AA
B//gAAf/4AAH/+AAB//gAAf/4AAH/+AAB//AAAP/gAAB/4AAAf/AAAP/4AAH/+AAB//gAAf/4AAH/+AA
B//gAAf/4AAH///D////5////////ygAAAAQAAAAIAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAMDA
wAD///8AAAAADnAAAAAAAADufgAAAAAFZH/+RkQAAG6+///k5AAARu/ut/d2AABO+9vr3+QAB+7u7b6+
9+Du/+2+vrf/537/7u7Xe/9+Dn/u7uvt/uAAR/7t6+/gAABn7u7u97YAAE5u///m5gAABlDv9wZQAAAA
AH7uAAAAAAAADnAAAAD+f////D///8AD///AA///wAP//8AD//+AAf//AAD//wAA//+AAf//wAP//8AD
///AA///wAP///w////+f///KAAAADAAAABgAAAAAQAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAEAgEABAQEAAgICAANDQ0AEQkGABISEgAUFBQAGRkZAB0dHQAnFg4AKBYOAC4aEQA9IhYAJSUlACws
LAAxMTEAODg4AD4+PgBFJxkAUy8fAFozIQBlOSUAcD8qAHJAKgB2QywAeUQtAEBAQABFRUUASEhIAFNT
UwBXV1cAXV1dAGFhYQBlZWUAampqAG5ubgBycnIAeHh4AH5+fgCHTDIAiEwyAMlTLgDLVTAAzVkzAMxZ
NADMXDoA0Fw2ANNgOADUYjoA1WQ8ANhnPgDYaD8AsWRCANVnQgDaaUAA3GxDANhrRADdbUQA3nBGANF2
TgDXclAA3ntXAOBxRgDhc0kA4XRKAON2TADkd00A5HhNAOh8TwDme1AA5nxSAOh9UQDpf1QA5IFVAOuA
UwDoglYA7IJVAOmCWADthlkA7IdcAO2IXQDwh1kA8ohZAPGKXADyjF8A9IxeAN2LbwDdi3AA3ZJ6AO6L
YADvjGIA8Y1hAPSOYQDxj2QA9JBiAPGRZgD0kmYA8pNoAPOWawD0lWoA9JZsAPSYbgDml3kA9ZpxAPWd
dQD2n3gA9aB5APaifQD2poEA9qeEAPeohAD3q4gA962LAPCqjgD3ro0A97CPAPexkAD3tZYA+LCQAPiz
lAD4tJYA+LaZAPi5nQDotKMA6LWmAPi7oAD4vaIA+b6kAPG/rAD5wKYA+cKqAPnFrQDsxbkA+cawAPnJ
tAD5zLcA+s25APrPvAD60L0A2traANzc2wDc3NwA+tTDAPrWxgD72McA+tfIAPvZyQD7280A+93PAPzd
zwD73dAA/OTZAP3p4AD46+cA++/pAPzw6wD98uwA/fbyAP39/QAAAAAALwMAAFAEAABwBgAAkAkAALAK
AADPDAAA8A4AAP8gEgD/PjEA/1xRAP96cQD/l5EA/7axAP/U0QD///8AAAAAAC8ADgBQABcAcAAhAJAA
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
AA78AAAAAD8ADvwAAAAAPwAO/AAAAAA/AA78AAAAAD8ADvwAAAAAPwAO/AAAAAA/AA78AAAAAD8ADvgA
AAAAHwAO8AAAAAAPAA7gAAAAAAcADsAAAAAAAwAOgAAAAAABAA6AAAAAAAEADsAAAAAAAwAO4AAAAAAH
AA7wAAAAAA8ADvgAAAAAHwAO/AAAAAA/AA78AAAAAD8ADvwAAAAAPwAO/AAAAAA/AA78AAAAAD8ADvwA
AAAAPwAO/AAAAAA/AA78AAAAAD8ADvwAAAAAPwAO/AAAAAA/AA78AAAAAD8ADvwAAAAAPwAO/AAAAAA/
AA7//+AH//8ADv//8A///wAO///4H///AA7///w///8ADv///n///wAO////////AA4oAAAAKAAAAFAA
AAABAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUFBQAMBwQACgoKAA4ODgAcDwoAHBAKABAQ
EAAeHh4ALRkQACkpKQAuLi4AMDAwADY2NgA6OjoAPT09AEUnGQBjNyQAYzgkAGQ4JABtPSgAcT8pAHJA
KgBCQkIARkZGAElJSQBOTk4AV1dXAFlZWQBdXV0AYWFhAGVlZQBoaGgAbGxsAHl5eQB+fn4AiU0zAJBR
NQCYVjgAp14+AKlfPgCqYD8AyVMuAMlULwDMVzEAz1s1ANJfOADTYDkA1WQ8ANloPwCuYkAAsmRCALVm
QwC2ZkQAxW9JANVnQQDZaUAA3GxCANhrRADdbkQA0GlJAN9wRQDXc1IA335aAOBxRwDgckkA4nRJAON3
TADjeE4A5XlNAOF/UwDnfVIA4X9UAOd+VADpflEA6YFWAOyCVQDphFcA6oNYAOmEWQDthlgA7YleAPKI
WgD0ilsA8IpdAPKMXgDeknkA6YpjAO2LYADyjmEA9I5hAPCPZAD0kGMA8pFmAPSSZQDxkmgA9JNoAPOU
aQD0lWoA9JZsAPSYbgD0mnEA9ZxzAPWddQD2n3gA9aF7APWifAD2pH4A6Z+EAOCdiQD2pYEA9qmGAPar
iAD3ro0A97GRAPe0lgD4tpgA97ibAPi5ngD3u6EA97yiAPi7oAD4vaIA+b6kAPnApwD4w6sA+cStAO3G
uQD5xrAA+ciyAPnJtAD5zbgA+tC+APTOwAD608EA+dXFAPvZyQD72swA+9zNAPzi1gD86N8A/Pn3APr6
+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
AAAsAC8ASwBQAGkAcACHAJAApQCwAMQAzwDhAPAA8BH/APIx/wD0Uf8A9nH/APeR/wD5sf8A+9H/AP//
/wAAAAAAGwAvAC0AUAA/AHAAUgCQAGMAsAB2AM8AiADwAJkR/wCmMf8AtFH/AMJx/wDPkf8A3LH/AOvR
/wD///8AAAAAAAgALwAOAFAAFQBwABsAkAAhALAAJgDPACwA8AA+Ef8AWDH/AHFR/wCMcf8AppH/AL+x
/wDa0f8A////AAAAAAAAAAAXFwAAAAAAAAAAAAAAAAAXFxcXAAAAAAAAAAACAwMBFyQkFwEDAwIAAAAA
AxAFFyQkJCQXBRADAAAAAAMFFyIYCwgRIRcFAwAAAAABFyITDQwJBwYhFwEAAAAXFyQbExIPDAoHESQX
FwAXFyQkFRYWFA8MCggkJBcXFxckJBodHBkUDgwLJCQXFwAXFyQeIB8dFhINGCQXFwAAAAEXIyAgHRYT
EyIXAQAAAAADBBcjHhoVGyIXBQMAAAAAAxAEFyQkJCQXBRADAAAAAAIDAwEXJCQXAQMDAgAAAAAAAAAA
FxcXFwAAAAAAAAAAAAAAAAAXFwAAAAAAAAD+fwAA/D8AAMADAADAAwAAwAMAAMADAACAAQAAAAAAAAAA
AACAAQAAwAMAAMADAADAAwAAwAMAAPw/AAD+fwAAKAAAADAAAABgAAAAAQAgAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAABAAAABQAAABAAAAAlAAAARgAAAHEAAACaAAAAvgAAAL4AAACaAAAAcAAA
AEYAAAAlAAAAEAAAAAUAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAABAAA
AAUAAAAFAAAABgAAAAYAAAAGAAAABgAAAAYAAAALAAAAFQAAACoAAABKAAAAdAAAAKIAAADNAAAA+gAA
APoAAADNAAAAogAAAHQAAABKAAAAKQAAABUAAAAKAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAA
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
Qf+HTDL/WzMh/y4aEf8DAgH/HR0d/9ra2f/9/f3//v79//39/f/+/v3//v79//7+/f/9/f3//f39//7+
/f/+/v3//f39//7+/v/+/v3//f39//39/f/9/f3/2NjY/xwcG/8EAgH/LhoR/1szIf+ITDL/sWRB/9F2
Tv9wPyn/AAAA/wAAAL4AAAB/AAAAQQAAABgAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAHAAA
AP9lOSX/sGRB/4ZLMf9aMiH/LhoR/wMCAf8fHx//2tra//7+/f/+/v7//v79//7+/f/77ej/8L+r/+aW
ef/ee1f/2GtE/9VnQf/XcU//3Ipv/+i0o//46eX//f39//7+/f/9/f3//v7+/9jY2P8dHR3/AwIB/y4Z
EP9aMiH/hkwx/7FkQf9lOSX/AAAA/wAAAL8AAACAAAAAQQAAABgAAAAGAAAAAAAAAAAAAAAAAAAAAAAA
AAEAAAALAAAAJgAAAP9TLx7/h0wx/1oyIf8uGhD/BAIB/x8fH//Z2dn//v7+//7+/v/+/v7//O/q/++q
jv/keE7/4HFG/91tQ//aakD/2GY+/9VjO//SXzj/0Fw1/81ZMv/MWjX/3ZF6//jq5v/+/v3//v7+//7+
/v/Y2Nf/HR0d/wMCAf8uGRD/WjIh/4dMMv9TLx//AAAA/wAAAMEAAACCAAAAQgAAABgAAAAGAAAAAAAA
AAAAAAAAAAAAAQAAAAUAAAAVAAAAOAAAAP89Ihb/WjMh/y4aEf8EAgH/HR0d/9ra2v/+/v7//v79//7+
/f/51sb/7Ihd/+h8T//leUz/4nVJ/+BxR//dbkT/2mtB/9hnP//VYzz/0l85/9BcNf/NWTL/ylUw/8xd
O//sxLj//v7+//7+/v/+/v7/2NjY/xwcG/8DAgH/LhkQ/1ozIf89Ihb/AAAA/wAAAMYAAACHAAAARQAA
ABkAAAAGAAAAAAAAAAAAAAABAAAABQAAABAAAAAqAAAAVwAAAP8nFg7/LhoR/wMCAf8fHx//2tra//7+
/v/+/v7//v79//rNuf/wh1n/7YNV/+qAU//ofVD/5XlO/+N2S//hckj/3m9F/9trQv/YZz//1WQ8/9Jf
Of/QXDb/zVkz/8pVL//JUy//57Sk//7+/v/+/v7//v7+/9jY2P8eHh3/AwIB/y4aEf8nFg7/AAAA/wAA
AM8AAACRAAAATAAAABwAAAAGAAAAAAAAAAEAAAAFAAAADwAAACUAAABJAAAAfgAAAP8QCQX/BAIB/x8f
H//Z2dn//f39//39/f/+/v3/+9jI//SMXf/yilv/74dZ/+2FV//rglX/6H5S/+Z7T//jd0z/4XNJ/95w
Rv/ba0P/2Gc//9VkPP/TYDn/0Fw2/81ZM//KVTD/yVMv/+zEuP/+/v3//v79//39/f/X19f/Hh4d/wQC
Af8QCQX/AAAA/wAAANoAAAChAAAAXAAAACYAAAAKAAAAAQAAAAUAAAAPAAAAJAAAAEYAAAB0AAAAqAAA
AP8AAAD/HR0d/9ra2v/+/v7//v79//7+/f/98ev/9JNo//OMXv/zjV7/8o1f//GKXf/uhlr/64NX/+l/
VP/me1D/5HhN/+FzSv/ecEb/22xD/9hnP//WZDz/02A5/9BcNv/NWTP/ylUw/8xdO//46ub//v7+//39
/f/+/v3/2NjY/xwcHP8AAAD/AAAA/wAAAOYAAAC3AAAAdAAAADgAAAAVAAAABQAAAA8AAAAkAAAARgAA
AHIAAACiAAAA0gAAAP8fHx//2trZ//39/f/9/f3//f39//7+/f/4t5n/841f//SOYP/0j2L/9I9i//OP
Yv/xjF//7ohc/+yEWf/pgFX/5nxS/+R4Tv/hdEr/3nBG/9tsQ//ZaED/1mQ8/9NgOf/QXDb/zVkz/8tV
MP/dkXr//v39//39/f/9/f3//v79/9jY2P8eHh7/AAAA/wAAAPEAAADPAAAAlQAAAFYAAAApAAAADwAA
ACAAAABCAAAAbwAAAKAAAADPAAAA+x8fH//Z2dn//v79//7+/f/+/v3//v79//3x6//0kWT/849h//SR
ZP/0kmX/9JJm//STZv/zkWX/8Y1i/+6JXv/shlr/6YFW/+Z9Uv/jeU7/4XRK/95wR//bbEP/2WhA/9Zk
PP/TYDn/0Fw2/81ZMv/MWTX/+Orl//39/f/+/v3//v79//39/f/X19f/Hh4e/wAAAP4AAADlAAAAtwAA
AHwAAABGAAAAIAAAADQAAABjAAAAmAAAAMwAAAD6HR0d/9ra2v/+/v7//v79//7+/v/+/v7//v7+//rN
uP/0kGL/9JJl//SUaP/0lWr/9JVr//SWa//0lWr/85No//GPZP/ui2D/64dc/+mCV//mfVP/43lO/+B0
Sv/ecEf/22xD/9loQP/WZDz/0mA5/9BcNf/NWTL/6LSj//7+/v/+/v7//v7+//7+/v/+/v7/2NjY/xwc
HP8AAAD8AAAA2AAAAKAAAABmAAAANQAAAEMAAAB5AAAAugAAAPofHx/+2tra//7+/v/+/v7//v7+//7+
/v/+/v7//v7+//ixkf/0k2f/9JZr//WYb//1mnH/9Zpx//Wacf/1mXD/9Jhv//SWbP/xkWf/74xi/+yH
Xf/pglj/5n1T/+N5T//hdEr/3nBH/9xsQ//ZaD//1WQ8/9JfOf/QXDX/3Ypv//7+/f/+/v7//v7+//7+
/v/+/v7//f39/9jY2P8dHR3/AAAA+wAAAL8AAAB7AAAAQwAAAEEAAACNAAAA9h8fH//Z2dn//v7+//39
/f/9/f3//v7+//7+/f/+/v7//v7+//ahe//0lmz/9Ztx//Wedv/1n3j/9aB5//Wgef/1n3j/9Z11//Wb
cv/0mG7/8pJp/++NY//siF3/6YJY/+Z9U//jeU7/4XRK/95wRv/bbEP/2Gc//9VjPP/SXzj/13JQ//7+
/f/+/v7//v7+//7+/v/+/v7//f39//39/f/X19f/HR0d/wAAAPYAAACOAAAAQQAAAFQAAADvHR0d/9ra
2v/9/f3//v7+//39/f/9/f3//f39//39/f/+/v3//f39//Wbcv/1m3L/9aB5//akf//2poL/9qeD//an
g//2pYH/9aN9//Wgef/1nXX/9Jlw//KTaf/vjWL/64dc/+iBV//mfVL/43hO/+FzSf/eb0b/22tC/9dn
Pv/VYzv/1WdB//39/f/+/v3//v79//39/f/9/f3//f39//39/f/9/f3/2NjY/xwcHP8AAADvAAAAVAAA
AEMAAADrHh4e/tvb2//+/v7//v7+//7+/v/+/v3//v7+//7+/v/+/v7//v79//aed//1oHn/9qeD//es
iv/3r47/97CQ//ewkP/3roz/9qqI//angv/2onz/9Z52//SZcP/ykmj/7oxh/+uHXP/pgVb/5nxS/+R4
Tf/hc0n/3m9G/9prQf/YZj7/2GtE//7+/f/+/v3//v79//7+/v/+/v7//f39//7+/v/9/f3/2tra/x0d
Hf4AAADqAAAAQQAAAAwAAABGAAAA6yAgIP7a2tr//v7+//39/f/9/f3//v79//7+/f/+/v7//f39//eq
iP/2pYH/966N//i1l//4uJz/+Lqe//i6nf/4t5n/97KT//etjP/2p4T/9aJ8//Wddf/0l27/8ZFm/+6L
YP/rhVr/6YBV/+Z7UP/kd0z/4XJI/91uRP/aakD/3ntX//39/f/+/v3//v79//7+/f/+/v3//f39//39
/f/Z2dn/Hx8f/gAAAOsAAABIAAAADAAAAAMAAAAMAAAARQAAAO0gICD+29vb//39/f/9/f3//v79//7+
/f/+/v3//v79//i9ov/2qoj/97WX//i+o//4wqr/+cSt//nEq//4wKf/+Luf//e0lv/3rYz/9qaC//Wg
ef/1m3L/85Vr//CPZP/uiV7/64RY/+l/U//me0//43ZL/99xRv/dbUP/5pZ5//7+/f/+/v3//v79//7+
/f/+/v3//f39/9nZ2f8fHx//AAAA7wAAAFQAAAASAAAABAAAAAAAAAADAAAADAAAAEUAAADrHh4e/tvb
2//+/v7//v7+//7+/v/+/v7//v79//vXx//3r47/+Lyg//nGr//5zLj/+s+7//nNuf/5ybP/+MOr//i7
oP/3s5T/9qqI//ajfv/1nXX/9Jhu//OTaP/wjWL/7ohc/+uDV//pflL/5XlO/+J1Sf/gcUb/8b+r//7+
/f/+/v3//v79//7+/v/+/v7/2tra/x0dHf8AAADzAAAAcQAAACMAAAAJAAAAAQAAAAAAAAAAAAAAAwAA
AA0AAABJAAAA7CAgIP/a2tr//v79//7+/f/+/v3//v79//308P/4tJb/+MCm//nMuP/61MP/+tfH//rW
xf/60b7/+cm0//jAp//4t5r/966N//amgf/1n3j/9Zlw//SVav/zkWX/8Yxf/+6HWv/rglX/6H1Q/+V4
TP/keE7/++3o//39/f/+/v3//v7+//7+/f/Z2dn/Hx8f/wAAAPgAAACeAAAASgAAABsAAAAGAAAAAAAA
AAAAAAAAAAAAAAAAAAQAAAASAAAAVQAAAP8gICD/29vb//7+/f/+/v3//f39//7+/f/60L3/+MCn//rO
u//62Mn/+9zP//vbzf/61sX/+c25//nErP/4up7/97CQ//eng//2oHn/9Zpx//WWa//0k2b/9I9i//GK
Xf/uhVj/64BT/+h8T//vqo3//v79//39/f/9/f3//v7+/9ra2v8fHx//AAAA/wAAAMwAAACFAAAARAAA
ABgAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAJAAAAIwAAAP8AAAD/Hh4e/9vb2//+/v7//v79//7+
/v/99vL/+cOq//nLt//618f/+93P//vcz//618f/+s+7//nFrf/4up7/97CQ//enhP/1oHn/9Zpx//SV
a//0kmb/9JBj//ONX//wiFr/7YNV/+yIXf/87+r//v7+//7+/f/+/v3/2tra/x0dHf8AAAD/AAAA/wAA
AMEAAACBAAAAQgAAABgAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAGwAAAP9EJhn/EgoG/yAg
IP/a2tr//v7+//7+/v/+/v7//Ong//nFrv/50L3/+tfH//vYyf/61MP/+cy4//nDq//4uZz/96+P//an
g//1oHn/9Zpw//SVav/0kmX/9I9i//ONX//yi1z/8IdZ//nWxv/+/v7//v7+//7+/f/Z2dn/Hx8f/xMK
B/9FJxn/AAAA/wAAAL4AAACAAAAAQQAAABgAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAGAAA
AP9yQCr/sWRB/xEJBv8gICD/29vb//7+/f/+/v7//v7+//zj2P/4xa7/+cu3//nOu//5zLj/+cav//i+
pP/3tZf/9qyK//akf//1nnb/9Zhu//SUaP/0kWP/9I5g//OMXf/zjF7/+s25//7+/f/+/v7//v79/9ra
2f8fHx//EQoG/7JlQv9yQCr/AAAA/wAAAL4AAAB/AAAAQQAAABgAAAAGAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAGAAAAGAAAAP93Qyz/6INW/7FkQf8SCgb/Hh4e/9vb2//+/v7//v7+//7+/v/86eD/+cKq//jA
p//4v6b/+Lug//e1mP/3ro3/9qeD//Wgev/1mnH/9JVq//SSZf/0j2H/841f//WUaP/72Mj//v7+//7+
/v/+/v7/2tra/x0dHf8TCwf/smVC/+iCVv93Qyz/AAAA/wAAAL4AAAB/AAAAQQAAABgAAAAGAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAGAAAAGAAAAP95RC3/8IdZ/+eCVv+wY0H/EgoG/yAgIP/a2tr//v7+//7+
/f/+/v7//fby//rQvf/3tJX/9q6O//aqiP/2pYH/9aB5//Wbcv/0lmz/9JJm//SPYv/0kWT/+LeZ//3x
6//+/v3//v7+//7+/v/Z2dn/IB8f/xMLB/+yZEL/54JW//CHWf95RC3/AAAA/wAAAL4AAAB/AAAAQQAA
ABgAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAGAAAAP96RS3/84la//CHWf/nglb/sWRB/xEK
Bv8gICD/29vb//7+/f/+/v7//v7+//7+/f/99PD/+9fH//m+o//3q4j/9p53//Wbcv/2oXv/+LGR//rN
uP/98ev//v79//7+/f/9/f3//v7+/9ra2v8gIB//EgoG/7JlQv/nglb/8IdZ//OJWv95RC3/AAAA/wAA
AL4AAAB/AAAAQQAAABgAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAGAAAAP96RS3/84la//OJ
Wv/wh1n/6INW/7FkQf8SCgb/Hh4e/9vb2//+/v7//v79//39/f/+/v3//v79//7+/f/9/f3//v79//39
/f/+/v7//v7+//7+/v/+/v3//f39//7+/f/9/f3/2tra/x0dHf8TCgf/smVC/+iCVv/wh1n/84la//OJ
Wv95RC3/AAAA/wAAAL0AAAB/AAAAQQAAABgAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAGAAA
AP96RS3/84la//OJWv/ziVr/8IdZ/+eCVv+wY0H/EgoG/yAgIP/a2tr//v7+//39/f/+/v3//v7+//7+
/f/+/v7//v7+//7+/f/+/v7//v7+//7+/v/+/v3//f39//7+/v/Z2dn/Hx8f/xMKB/+yZEL/54JW//CH
Wf/ziVr/84la//OJWv95RC3/AAAA/wAAALkAAAB9AAAAQAAAABgAAAAGAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAFAAAAFgAAAP96RS3/84la//OJWv/ziVr/84la//CHWf/nglb/sWRB/xEJBv8gICD/29vb//7+
/f/+/v3//v7+//7+/f/+/v3//v7+//39/f/+/v3//v79//7+/v/+/v7//f39/9ra2v8gHx//EQoG/7Jl
Qv/nglb/8IdZ//OJWv/ziVr/84la//OJWv95RC3/AAAA/wAAAKwAAABzAAAAOwAAABYAAAAFAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAEAAAAEgAAAP96RS3/84la//OJWv/ziVr/84la//OJWv/wh1n/6INW/7Fk
Qf8SCgb/Hh4e/9vb2//+/v3//v79//7+/f/+/v3//v79//39/f/+/v7//v79//7+/v/+/v3/2trZ/x0d
Hf8TCwf/smVC/+iCVv/wh1n/84la//OJWv/ziVr/84la//OJWv95RC3/AAAA/wAAAI0AAABfAAAAMQAA
ABIAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAADAAAAP89Ihb/ekUt/3pFLf96RS3/ekUt/3pF
Lf95RC3/d0Ms/3JAKv9EJhn/AAAA/yAgIP/a2tr//v7+//39/f/9/f3//v79//39/f/+/v3//v7+//7+
/v/Z2dn/Hx8f/wAAAP9FJxn/ckAq/3dDLP95RC3/eUQt/3lELf95RC3/eUQt/3lELf88Ihb/AAAA/wAA
AF8AAABAAAAAIQAAAAwAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABgAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8gICD/29vb//39/f/9/f3//v7+//39
/f/9/f3//v7+/9ra2v8fHx//AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAADEAAAAhAAAAEQAAAAYAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA
AAYAAAAMAAAAEgAAABYAAAAXAAAAGAAAABgAAAAYAAAAGAAAABgAAAAbAAAAIwAAAFUAAADsHh4e/tvb
2//+/v7//v7+//7+/v/+/v7/2tra/h0dHf8AAADrAAAAVAAAACMAAAAbAAAAGAAAABgAAAAYAAAAGAAA
ABgAAAAYAAAAGAAAABgAAAAXAAAAFgAAABIAAAAMAAAABgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAEAAAADAAAABAAAAAUAAAAFAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAACQAA
ABIAAABJAAAA6yAgIP7a2tr//v7+//39/f/Z2dn/Hx8f/gAAAOoAAABIAAAAEgAAAAkAAAAGAAAABgAA
AAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAFAAAABQAAAAQAAAADAAAAAQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAQAAAAQAAAANAAAARQAAAO0gICD+29vb/tra2v4fHx/+AAAA7AAAAEQAAAANAAAABAAA
AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAADAAAAEIAAADqHh4e/h0dHf4AAADpAAAAQQAA
AAwAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAkAAAA9AAAA6QAA
AOgAAAA7AAAACQAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAIAAAAFAAAANAAAADMAAAAFAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD//wAO/AAAAAAH
AA74AAAAAAMADvAAAAAAAQAO8AAAAAABAA7wAAAAAAEADvAAAAAAAQAO8AAAAAABAA7wAAAAAAEADvAA
AAAAAQAO8AAAAAABAA7wAAAAAAEADvAAAAAAAQAO4AAAAAABAA7AAAAAAAEADoAAAAAAAQAOAAAAAAAA
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
/f/9/f3//f39//39/f/9/f3//f39//7+/f/9/f3//f39//r6+v9lZWX/AgEB/y4aEP9kOCX/mVY4/8Vv
Sf+nXj7/AAAA/wAAALgAAABsAAAAKgAAAAoAAAABAAAAAAAAAAAAAAAAAAAABAAAABoAAAD/kFE1/5hW
OP9jNyT/LRkQ/wIBAf9oaGj/+/v7//7+/v/+/v3//fr4//TOwP/pn4T/335a/9hrRP/VZ0H/13NS/96S
ef/txbj//Pn3//7+/f/9/f3/+/v7/2VlZf8CAQH/LRkQ/2M3JP+YVjj/kFE1/wAAAP8AAAC5AAAAbAAA
ACoAAAAKAAAAAQAAAAAAAAAAAAAAAQAAAAkAAAAnAAAA/209KP9jOCT/LRkQ/wIBAf9oaGj/+/v7//7+
/f/+/v7/+NXG/+qKY//idUn/33BF/9xsQv/ZaD//1mQ8/9JfOP/PWzX/zFcx/9BpSf/tx7v//v79//7+
/v/7+/v/ZWVl/wIBAP8tGRD/Yzgk/209KP8AAAD/AAAAvQAAAG4AAAAqAAAACgAAAAEAAAAAAAAAAQAA
AAUAAAAXAAAAQgAAAP9FJxn/LRkQ/wIBAf9nZ2f//Pz8//7+/v/9/Pz/97uh/+yCVP/pfVD/5XpN/+J1
Sv/gcUf/3W1E/9lpQP/VZDz/0l85/89bNf/MVzH/yVMv/+Cdif/9/Pz//v7+//v7+/9lZWX/AgEB/y0Z
EP9FJxn/AAAA/wAAAMQAAAB2AAAALgAAAAoAAAABAAAAAAAAAAUAAAATAAAAMwAAAGwAAAD/HBAK/wIB
Af9oaGj/+/v7//7+/f/+/v3/+b6k//KKW//vhlj/7INW/+l/U//me0//43dM/+BySP/dbkX/2WlA/9Zl
PP/TYDn/z1s1/8xXMf/JUy7/4J2J//7+/f/+/v3/+/v6/2ZmZf8CAQH/HBAK/wAAAP8AAADRAAAAhwAA
ADkAAAAOAAAAAQAAAAUAAAATAAAAMAAAAGEAAACeAAAA/wAAAP9nZ2f/+/v7//7+/f/+/v3/+9rK//OM
Xv/zjF7/8oxe//CJXP/thVj/6YBV/+d8Uf/keE3/4HNJ/91uRf/aaUH/1mU9/9NgOf/PWzb/zFcx/8lU
L//tx7v//v79//39/f/7+/v/ZWVl/wAAAP8AAAD/AAAA4AAAAKEAAABSAAAAHAAAAAUAAAASAAAAMAAA
AGAAAACZAAAA0gAAAP9oaGj/+/v7//39/f/9/f3//fv5//Wcc//zjmD/9I9h//SPY//zj2L/8Itf/+2H
W//qglf/531S/+R4Tv/gc0r/3W9F/9pqQf/WZT3/02A5/89bNv/MVzH/0GlJ//z59//9/f3//v79//v7
+/9lZWX/AAAA/wAAAPAAAADCAAAAeQAAADgAAAATAAAAKgAAAFoAAACVAAAAzwAAAPxoaGj/+/v7//7+
/v/+/v7//v79//vYyP/0j2H/9JFk//SSZv/0k2f/9JNo//OSZv/wjWL/7Yhd/+qDWP/nflP/43hO/+Bz
Sv/dbkX/2mpB/9ZlPf/TYDn/z1s1/8xXMf/txbj//f39//7+/v/+/v3/+/v6/2VlZf8AAAD+AAAA4QAA
AKUAAABgAAAAKgAAAEIAAACBAAAAxwAAAPxnZ2f/+/v7//7+/v/+/v7//v7+//7+/v/4tpj/9JJl//SV
av/0l23/9Jhu//WYbv/0l23/85Rq//CPZf/til//6oRZ/+d+VP/jeU7/4HNK/91vRf/aaUH/1mU9/9Jf
Of/PWzX/35J5//7+/f/+/v7//v7+//7+/v/7+/v/ZWVl/wAAAP0AAADOAAAAhQAAAEIAAABIAAAAoAAA
APpoaGj/+/v7//7+/v/+/v3//v7+//7+/v/+/v7/9qJ8//SWbP/1m3L/9Z11//Wed//1nnf/9Z11//Wb
cv/0l27/8ZFn/+6LYP/qhFr/535U/+N5T//gc0r/3W5F/9ppQf/WZDz/0l84/9dzUv/9/f3//v7+//7+
/v/+/v7//f39//v7+/9lZWX/AAAA+wAAAKMAAABIAAAAYQAAAPRnZ2f/+/v7//7+/v/9/f3//f39//39
/f/+/v3//f39//Wacv/1nHT/9aJ8//algP/2poL/9qaC//akf//1oXv/9Z12//SZb//xkmj/7Ytg/+mE
Wf/nflP/43hO/+BzSf/dbkX/2WlA/9VkPP/VZ0H//f39//7+/f/9/f3//f39//39/f/9/f3/+vr6/2Vl
Zf8AAAD0AAAAYQAAAEwAAADxaGho/vv7+//+/v7//v7+//7+/f/+/v7//v7+//7+/f/2n3j/9qN9//ar
iP/3r4//97GR//exkf/3roz/9qmG//akf//1n3f/9Jlw//GRZ//til//6oNY/+d9Uv/keE3/4XJJ/91t
RP/ZaD//2GtE//39/f/+/v3//v79//7+/v/9/f3//v7+//v7+/9nZ2f+AAAA8AAAAEsAAAAKAAAATgAA
APFpaWn++/v7//39/f/9/f3//v7+//7+/f/9/f3/962M//aqh//3tJb/+Lqf//i9ov/4vKH/97ib//ey
k//2q4n/9qR+//Wddf/0l23/8I9k/+2IXf/qglf/53xR/+N3TP/fcUf/3GxC/99+Wv/9/f3//v79//7+
/f/+/v3//f39//v7+/9oaGj+AAAA8gAAAFIAAAALAAAAAgAAAAoAAABOAAAA8WhoaP78/Pz//f39//7+
/v/+/v3//v79//nErP/3sJD/+L6j//nGr//5ybT/+ciy//jDq//4u6D/97KT//aphv/1oXv/9Zpx//OU
af/wjWH/7Ydb/+qAVf/ne0//4nVK/99wRf/pn4T//f39//7+/f/+/v3//v7+//v7+/9nZ2f/AAAA9QAA
AGcAAAATAAAAAwAAAAAAAAACAAAACgAAAFAAAADxaWlp//v7+//+/v3//v7+//7+/f/84tb/97WX//nF
rv/60L7/+tXE//rTwf/5zbj/+MOr//i4nP/3ro3/9qR///WddP/0l2z/85Jm//CLX//thVj/6n9T/+Z6
Tv/idEj/9M/A//39/f/+/v7//v79//v7+/9oaGj/AAAA+QAAAJMAAAAyAAAADAAAAAEAAAAAAAAAAAAA
AAIAAAAOAAAAWwAAAP9paWn//Pz8//7+/f/+/v3//fv6//nBp//5x7H/+tbF//vczv/72sz/+tPB//nI
sv/5vaL/97GR//amgv/2nnf/9Zhu//STaP/zj2P/8Ilc/+yDVv/pflH/6Ypj//36+P/9/f3//v79//v7
+/9oaGj/AAAA/wAAAMkAAABxAAAAKwAAAAoAAAABAAAAAAAAAAAAAAAAAAAABQAAAB8AAAD/AQAA/2ho
aP/7+/v//v79//7+/v/86N//+cSt//rTwv/73M7/+9zO//rVxP/5yrT/+L2j//exkf/2p4P/9Z53//WY
bv/0k2f/9JBj//KNXv/vh1n/7IJU//jVx//+/v3//v79//v7+/9nZ2f/AQEA/wAAAP8AAAC6AAAAbQAA
ACoAAAAKAAAAAQAAAAAAAAAAAAAAAAAAAAMAAAAXAAAA/3E/Kf8MBwT/aWlp//v7+//+/v7//v7+//vc
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
AEsAAAAKAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAACAAAACQAAAEgAAADwAAAA7wAAAEYAAAAJAAAAAgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAEAAAAFAAAAPwAAAD0AAAAFAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAA//AA7wAAAAA/8ADvAAAAAB/wAO4AAAAAH/
AA7gAAAAAP8ADuAAAAAA/wAO4AAAAAD/AA7gAAAAAP8ADuAAAAAA/wAO4AAAAAD/AA7gAAAAAP8ADsAA
AAAA/wAOgAAAAAD/AA6AAAAAAP8ADgAAAAAA/wAOAAAAAAD/AA4AAAAAAP8ADgAAAAAA/wAOAAAAAAD/
AA4AAAAAAP8ADgAAAAAA/wAOAAAAAAD/AA4AAAAAAP8ADoAAAAAA/wAOwAAAAAD/AA7gAAAAAP8ADuAA
AAAA/wAO4AAAAAD/AA7gAAAAAP8ADuAAAAAA/wAO4AAAAAD/AA7gAAAAAP8ADuAAAAAA/wAO4AAAAAH/
AA7gAAAAAf8ADvAAAAAB/wAO+AAAAAf/AA7//gB///8ADv//AP///wAO//+B////AA4oAAAAIAAAAEAA
AAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAA
AAEAAAABAAAAAQAAAAIAAAAHAAAAGwAAAEgAAACIAAAAxQAAAMUAAACHAAAARwAAABsAAAAHAAAAAgAA
AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABgAA
AA0AAAARAAAAEwAAABMAAAATAAAAGAAAACoAAABUAAAAkQAAANINDQ39DAwM/QAAANIAAACQAAAAUwAA
ACoAAAAYAAAAEwAAABMAAAATAAAAEwAAABMAAAARAAAADQAAAAYAAAABAAAAAAAAAAAAAAAAAAAAAAAA
AAYAAAAZAAAANwAAAEoAAABQAAAAUAAAAFQAAABhAAAAfwAAAKwAAADcDQ0N/cLCwv/BwcH/DAwM/QAA
ANwAAACsAAAAfwAAAGEAAABUAAAAUAAAAFAAAABQAAAAUAAAAEoAAAA3AAAAGQAAAAYAAAAAAAAAAAAA
AAAAAAABAAAADQAAADcAAAB4AAAAogAAAK4AAACwAAAAtgAAAMMAAADYAAAA7g0NDf7CwsL//f39//39
/f/BwcH/DAwM/gAAAO4AAADYAAAAwwAAALYAAACwAAAArwAAAK8AAACuAAAAogAAAHgAAAA3AAAADQAA
AAEAAAAAAAAAAAAAAAEAAAARAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8NDQ3/wsLC//39
/f/9/f3//f39//39/f/BwcH/DAwM/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAogAA
AEoAAAARAAAAAQAAAAAAAAAAAAAAAQAAABMAAAD/84la/+6GWP/be1H/r2NB/3A/Kf8tGRD/Dg4N/8PD
wv/+/v3//v79//7+/f/9/f3//v7+//7+/v/BwcH/Dg0N/y0ZEP9wPyn/sGNB/9t8Uf/uhlj/84la/wAA
AP8AAACuAAAAUAAAABMAAAABAAAAAAAAAAAAAAABAAAAEwAAAP/uhlj/23tR/7BjQf9wPyn/LRkQ/w4O
Df/Dw8P//v7+//7+/f/+/v3//v79//39/f/+/v7//v7+//39/f/BwcH/Dg0M/y0ZEP9xPyn/sGNB/9t8
Uf/uhlj/AAAA/wAAAK8AAABQAAAAEwAAAAEAAAAAAAAAAAAAAAEAAAATAAAA/9t8Uf+wY0H/cUAp/y0Z
EP8ODg3/w8PC//7+/f/9/f3//v79//7+/f/9/f3//f39//7+/f/+/v3//f39//39/f/BwcH/Dg0N/y0Z
EP9xQCr/sGNB/9t8Uf8AAAD/AAAArwAAAFAAAAATAAAAAQAAAAAAAAAAAAAAAgAAABgAAAD/r2NB/3A/
Kf8tGRD/Dg4N/8PDw//+/v7//v79//nm3v/trZT/4YNh/9lrRP/VZkD/13ZW/+GeiP/14Nn//v79//7+
/f/BwcH/Dg0N/y0ZEP9wPyn/sGNB/wAAAP8AAACwAAAAUAAAABMAAAABAAAAAAAAAAAAAAAHAAAAKgAA
AP9wPyn/LRkQ/w4ODf/Dw8P//v7+//36+P/ztZr/53tO/+J1Sf/ecEX/22tB/9ZlPf/SXzn/zlo0/8tW
Mf/fmYT//Pn3//7+/v/BwcH/Dg0M/y0ZEP9wPyn/AAAA/wAAALYAAABUAAAAEwAAAAEAAAAAAAAABQAA
ABsAAABUAAAA/y0ZEP8ODg3/w8PC//7+/v/9+vn/9qiG/+6FV//qgFP/53tQ/+N2S//fcUf/22tC/9dm
Pf/SYDn/zlo0/8pVL//Xf2T//Pn3//7+/f/BwcH/Dg0M/y0ZEP8AAAD/AAAAwwAAAGEAAAAYAAAAAgAA
AAUAAAAZAAAARwAAAJAAAAD/Dg4N/8PDw//+/v7//v79//i7oP/zjF3/8oxe/++IWv/rg1b/531S/+R3
Tf/fcUj/22xD/9dmPv/TYDn/zlo0/8pVMP/fmYT//v79//39/f/BwcH/Dg0N/wAAAP8AAADYAAAAfwAA
ACoAAAAGAAAAGAAAAEYAAACKAAAA0g0NDf/Dw8L//f39//39/f/86uL/9I5g//SPYv/0kGP/849j/++K
Xv/shVn/6H9U/+R4Tv/fckj/22xD/9dmPv/TYDn/z1s1/8tWMf/14Nn//f39//7+/f/BwcH/DAwM/wAA
AO4AAACsAAAAUwAAABkAAAA6AAAAgQAAAM4NDQ39w8PD//7+/v/+/v7//v7+//i+pP/0kWT/9JNo//SV
af/0lWr/85Nn/++NYv/shlv/6H9V/+N5Tv/fckj/22xD/9dmPv/TYDn/zlo0/+GeiP/+/v3//v7+//7+
/v/BwcH/DAwM/gAAANsAAACJAAAAOgAAAFAAAAC1DQ0N/cPDw//+/v7//v7+//7+/v/+/v7/9qR///SW
a//1mnH/9Ztz//Wbc//1mnH/9JZs//CPZf/sh13/54BV/+N5T//fckj/22xD/9dmPv/SXzj/13dW//7+
/f/+/v7//v7+//39/f/BwcH/DAwM/QAAALkAAABRAAAAcA0NDfrDw8P//v7+//39/f/+/v3//v79//39
/f/1mnH/9Z52//ajfv/2pYH/9qWA//aifP/1nnb/9Jhv//CQZv/rh13/539V/+N4Tv/fckj/22tC/9Zl
Pf/VZkD//f39//39/f/+/v3//f39//39/f/BwcH/DAwM+gAAAHAAAABVDQ0N9sPDw//+/v7//f39//7+
/v/+/v7//v79//agev/2p4P/96+P//eyk//3spL/962M//ang//2oHn/9Jlv//CPZP/rhlv/6H5U/+R3
Tf/gcUf/2mpB/9lsRf/+/v3//v79//7+/v/9/f3//f39/8PDw/8NDQ32AAAAVAAAAAgAAABWDQ0N9sPD
w//9/f3//v79//7+/f/+/v3/97KT//exkf/4vaL/+cGo//jAp//4up7/97GR//ang//1nnb/85Zs/++N
Yf/rhFn/531S/+N2S//eb0X/4YNh//7+/f/+/v3//v79//39/f/CwsL/DQ0N+AAAAF8AAAAJAAAAAQAA
AAgAAABXDQ0N98PDw//+/v3//v79//7+/f/6zrr/+Lqd//nKtP/60L7/+c67//nGr//4up7/962M//ai
fP/1mXD/85Jn/++KXv/rg1b/53xQ/+J1Sf/trZT//v79//7+/v/+/v3/wsLC/w0NDfsAAACFAAAAGgAA
AAIAAAAAAAAAAQAAAAkAAABgDQ0N/8TEw//+/v3//v79//3w6v/4vaP/+tG+//vazP/72cr/+s+7//nB
p//3spL/9qWA//Wbc//0lWr/849j/++IW//rgVT/53tP//nm3v/9/f3//v7+/8PDwv8NDQ3/AAAAxAAA
AFUAAAATAAAAAQAAAAAAAAAAAAAAAgAAABoAAAD/FREQ/8TEw//+/v7//v7+//vZyf/5zbn/+9rM//vb
zP/60L7/+cKp//ezk//2pYH/9Ztz//SVaf/0kGP/8oxe/+6FV//ztZr//v7+//7+/f/Dw8P/FREQ/wAA
AP8AAACxAAAAUQAAABMAAAABAAAAAAAAAAAAAAABAAAAEwAAAP+hWjv/FREQ/8TEw//+/v3//vz7//rT
wf/5zbn/+tG+//nKtP/4vaL/96+P//ajfv/1mnH/9JNo//SPYf/zjF3/9qmG//36+f/+/v7/w8PC/xUR
EP+iWzz/AAAA/wAAAK8AAABQAAAAEwAAAAEAAAAAAAAAAAAAAAEAAAATAAAA/+yFWP+hWzv/FREQ/8TE
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
rEGAAKxBgACsQYAArEHAAaxB/D+sQQ==
</value>
</data>
</root>
\ No newline at end of file
using log4net;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace HuichuanLibrary
{
public partial class HCBoardManager
{
private static Int32 nCardNo = 0; // 默认要打开的卡号
private static UInt64 nCardHandle = 0; // 卡句柄
private static bool CardIsOk = false;
public static List<int> AxisList = new List<int>();
public static ImcApi.TRsouresNum tResource = new ImcApi.TRsouresNum();//实例化板卡外设硬件资源
private static string DeviceConfigPath = "";
private static string SystemConfigPath = "";
/// <summary>
/// 初始化配置信息,初始化板卡之前,先初始化配置
/// </summary>
/// <param name="deviceConfigPath">设备配置文件</param>
/// <param name="systemConfigPath">系统配置文件</param>
/// <param name="logName">日志名称</param>
public static void InitConfig(string deviceConfigPath="",string systemConfigPath="", string logName = "RollingLogFileAppender")
{
if (deviceConfigPath.Equals(""))
{
DeviceConfigPath = ".\\device_config.xml";
}
else
{
DeviceConfigPath = deviceConfigPath;
}
if (systemConfigPath.Equals(""))
{
SystemConfigPath = ".\\system_config.xml";
}
else
{
SystemConfigPath = systemConfigPath;
}
HCLogUtil.LOGGER = LogManager.GetLogger(logName);
HCErrorCode.LoadConfig();
}
private static string BoardName()
{
return " HCH[" + nCardNo + "][" + nCardHandle + "] ";
}
#region 板卡操作,初始化,关闭,急停
private static bool IsInScanECAT = false;
private static System.Timers.Timer scanEcatTimer = null;
private static DateTime startTime = DateTime.Now;
public static string CardMsg = "板卡还未初始化";
/// <summary>
/// 初始化板卡
/// </summary>
/// <param name="blockFlag">是否阻塞,1=阻塞,0=不阻塞</param>
/// <returns>true=成功</returns>
public static bool OpenCard(int blockFlag=0)
{
try
{
if (CardIsOk)
{
return true;
}
if (IsInScanECAT)
{
return false;
}
if (scanEcatTimer == null)
{
scanEcatTimer = new System.Timers.Timer();
scanEcatTimer.AutoReset = true;
scanEcatTimer.Interval = 500;
scanEcatTimer.Elapsed += ScanEcatTimer_Elapsed;
scanEcatTimer.Enabled = false;
}
if (!File.Exists(DeviceConfigPath))
{
HCLogUtil.error("InitCard FAIL,DeviceConfigPath 【" + DeviceConfigPath + "】not exists");
return false;
}
if (!File.Exists(SystemConfigPath))
{
HCLogUtil.error("InitCard FAIL, SystemConfigPath【" + SystemConfigPath + "】not exists");
return false;
}
startTime = DateTime.Now;
//【1】获取卡
Int32 nCardNum = 0;
UInt32 ret = ImcApi.IMC_GetCardsNum(ref nCardNum);
if (ret != 0)
{
ShowErrorLog(" GetCardsNum FAIL, ",ret);
return false;
}
else
{
if (nCardNum <= 0)
{
ShowErrorLog(" Not Find Card");
return false;
}
else
{
ShowLog("GetCardsNum = " + nCardNum + ", 将默认打开第0号卡");
}
}
//【2】打开卡句柄
ret = ImcApi.IMC_OpenCardHandle(nCardNo, ref nCardHandle);
if (ret != 0)
{
ShowErrorLog(" OpenCardHandle FAIL, ",ret);
return false;
}
else
{
ShowLog("OpenCardHandle OK");
}
//【3】下载设备参数
ret = ImcApi.IMC_DownLoadDeviceConfig(nCardHandle, DeviceConfigPath);
if (ret != 0)
{
ShowErrorLog(" DownLoadDeviceConfig FAIL, " + ",请检查是否有" + DeviceConfigPath + "文件", ret );
return false;
}
else
{
ShowLog("DownLoadDeviceConfig OK");
}
//【4】启动主站
ShowLog("Begin ScanCardECAT... ...IsInScanECAT=true");
IsInScanECAT = true;
uint masterStatus = 0;
ret = ImcApi.IMC_GetECATMasterSts(nCardHandle, ref masterStatus);
if (ret != 0)
{
ShowErrorLog(" GetECATMasterSts FAIL, ",ret);
return false;
}
else
{
if (masterStatus != ImcApi.EC_MASTER_OP)
{
// [2020 - 12 - 03 16:32:37,124][1]INFO HCH[0][0] GetCardsNum = 1, 将默认打开第0号卡
// [2020 - 12 - 03 16:32:37, 126][1]INFO HCH[0][479296224] OpenCardHandle OK
// [2020 - 12 - 03 16:32:37,537][1]INFO HCH[0][479296224] DownLoadDeviceConfig OK
// [2020 - 12 - 03 16:32:37,537][1]INFO HCH[0][479296224] Begin ScanCardECAT... ...
//[2020 - 12 - 03 16:33:02,925][1]INFO HCH[0][479296224] ScanCardECAT OK
// [2020 - 12 - 03 16:33:03,107][1]INFO HCH[0][479296224] DownLoadSystemConfig OK
// [2020 - 12 - 03 16:33:03,111][1]INFO HCH[0][479296224] Axis[22],DI[592],DO[528]
ret = ImcApi.IMC_ScanCardECAT(nCardHandle, blockFlag);
if (ret != 0)
{
ShowErrorLog(" ScanCardECAT FAIL, ",ret);
return false;
}
}
}
if (blockFlag == 1)// 默认阻塞式启动EtherCAT
{
ShowLog("ScanCardECAT OK");
//【5】下载系统参数
if (!LoadSystemConfig())
{
IsInScanECAT = false;
return false;
}
//【6】扫描卡内资源,初始化ComboBox
return GetCardResource();
}
else
{
CardMsg = "ECAT总线扫描和配置中................";
scanEcatTimer.Enabled = true;
ShowLog("start scanEcatTimer ...............");
return false;
}
}
catch (Exception ex)
{
ShowErrorLog(ex.ToString());
}
return false;
}
private static bool LoadSystemConfig()
{
//【5】下载系统参数
uint ret = ImcApi.IMC_DownLoadSystemConfig(nCardHandle, SystemConfigPath);
if (ret != 0)
{
ShowErrorLog(" DownLoadSystemConfig FAIL, " + ",请检查是否有" + SystemConfigPath + "文件,", ret );
return false;
}
else
{
ShowLog("DownLoadSystemConfig OK");
}
return true;
}
private static bool GetCardResource()
{
IsInScanECAT = false;
tResource = new ImcApi.TRsouresNum();//实例化板卡外设硬件资源
//【6】扫描卡内资源,初始化ComboBox
uint ret = ImcApi.IMC_GetCardResource(nCardHandle, ref tResource);
if (ret != 0)
{
ShowErrorLog(" GetCardResource FAIL, ",ret);
return false;
}
else
{
ShowLog("Axis [" + tResource.axNum + "],DI [" + tResource.diNum + "],DO [" + tResource.doNum + "]");
//轴
AxisList = new List<int>();
if (tResource.axNum > 0)
{
for (int i = 0; i < tResource.axNum; i++)
{
AxisList.Add(i);
}
}
CardMsg = "板卡初始化完成";
CardIsOk = true;
TimeSpan span = DateTime.Now - startTime;
ShowLog("OpenCard end ," + Convert.ToDateTime(span.ToString()).ToString("HH:mm:ss"));
return true;
}
}
private static void ScanEcatTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
uint pStatus = 0;
uint ret = ImcApi.IMC_GetECATMasterSts(nCardHandle, ref pStatus);
if (ret != 0)
{
ShowErrorLog(" GetECATMasterSts FAIL, ",ret );
}
else if (pStatus.Equals(6))
{
scanEcatTimer.Stop();
ShowLog(" GetECATMasterSts OK, pStatus= " + pStatus + " ");
ShowLog("ScanCardECAT OK");
//【5】下载系统参数
if (!LoadSystemConfig())
{
IsInScanECAT = false;
return;
}
//【6】扫描卡内资源,初始化ComboBox
GetCardResource();
return;
}
else
{
ShowLog(" GetECATMasterSts OK, pStatus= " + pStatus + " ");
}
//判断是否超时
TimeSpan span = DateTime.Now - startTime;
if (span.TotalMinutes > 2)
{
CardMsg = "ECAT总线连接失败,超时未进入OP模式";
ShowErrorLog(CardMsg + ",停止主站状态查询");
IsInScanECAT = false;
scanEcatTimer.Stop();
}
}
/// <summary>
/// 关闭板卡
/// </summary>
/// <returns></returns>
public static bool CloseCard()
{
UInt32 ret = ImcApi.IMC_CloseCard(nCardHandle);
if (ret != 0)
{
ShowErrorLog("CloseCard FAIL, ",ret);
return false;
}
else
{
CardIsOk = false;
ShowLog("CloseCard OK");
//return true;
}
ret = ImcApi.IMC_CloseCardHandle(nCardHandle);
if (ret != 0)
{
ShowErrorLog("CloseCardHandle FAIL, ",ret);
return false;
}
else
{
CardIsOk = false;
ShowLog("CloseCardHandle OK");
return true;
}
}
/// <summary>
/// 板卡是否已经初始化OK
/// </summary>
/// <param name="isShowLog">未初始化完成时是否打印日志</param>
/// <returns>true=OK</returns>
public static bool CardInitOk(bool isShowLog = false)
{
if (CardIsOk)
{
return true;
}
else
{
if (isShowLog)
{
ShowErrorLog(" 板卡未初始化完成");
}
return false;
}
}
/// <summary>
/// 紧急停止
/// </summary>
/// <returns></returns>
public static bool EmgStop()
{
if (!CardInitOk())
{
return false ;
}
//取反标志为0时触发急停
UInt32 ret = ImcApi.IMC_SetEmgTrigLevelInv(nCardHandle, 0);
if (ret != 0)
{
ShowErrorLog(" EmgStop FAIL, ",ret);
return false;
}
else
{
ShowLog("EmgStop OK");
return true;
}
}
/// <summary>
/// 取消急停
/// </summary>
/// <returns></returns>
public static bool CancelEmg()
{
if (!CardInitOk())
{
return false;
}
//取反标志为1时取消急停
UInt32 ret = ImcApi.IMC_SetEmgTrigLevelInv(nCardHandle, 1);
if (ret != 0)
{
ShowErrorLog(" CancelEmg FAIL, ",ret);
return false;
}
else
{
ShowLog("CancelEmg OK");
return true;
}
}
#endregion
#region IO控制
/// <summary>
/// 按位设置DO的值
/// </summary>
/// <param name="bitNo">DO索引,从0开始</param>
/// <param name="bitValue">DO值</param>
/// <returns></returns>
public static bool SetBitDO(short bitNo, short bitValue)
{
if (!CardInitOk())
{
return false;
}
//安装点位写Do
UInt32 ret = ImcApi.IMC_SetEcatDoBit(nCardHandle, bitNo, bitValue);
if (ret != 0)
{
ShowErrorLog(" bitNo["+bitNo+"]bitValue["+bitValue+ "] IMC_SetEcatDoBit FAIL, ",ret);
return false;
}
return true;
}
/// <summary>
/// 按位获取DO的值
/// </summary>
/// <param name="bitNo">DO索引,从0开始</param>
/// <returns></returns>
public static short GetBitDO(short bitNo)
{
if (!CardInitOk())
{
return 0;
}
short bitValue = 0;
UInt32 ret = ImcApi.IMC_GetEcatDoBit(nCardHandle, bitNo, ref bitValue);
if (ret != 0)
{
ShowErrorLog(" bitNo[" + bitNo + "] IMC_GetEcatDoBit FAIL, ",ret);
return 0;
}
return bitValue;
}
/// <summary>
/// 按位获取DI的值
/// </summary>
/// <param name="bitNo">DI索引,从0开始</param>
/// <returns></returns>
public static short GetBitDI(short bitNo)
{
if (!CardInitOk())
{
return 0;
}
short bitValue = 0;
UInt32 ret = ImcApi.IMC_GetEcatDiBit(nCardHandle, bitNo, ref bitValue);
if (ret != 0)
{
ShowErrorLog(" bitNo[" + bitNo + "] IMC_GetEcatDiBit, ",ret);
return 0;
}
return bitValue;
}
public static bool SetGroupDO(short groupNo, short groupValue)
{
if (!CardInitOk())
{
return false ;
}
UInt32 ret = ImcApi.IMC_SetEcatGrpDo(nCardHandle, groupNo, groupValue);
if (ret != 0)
{
ShowErrorLog(" groupNo[" + groupNo + "] IMC_SetEcatGrpDo FAIL, ",ret);
return false;
}
return true;
}
public static short GetGroupDO(short groupNo)
{
if (!CardInitOk())
{
return 0;
}
Int16 groupValue = 0;
UInt32 ret = ImcApi.IMC_GetEcatGrpDo(nCardHandle, groupNo, ref groupValue);
if (ret != 0)
{
ShowErrorLog(" groupNo[" + groupNo + "] IMC_GetEcatGrpDo FAIL, ",ret);
return 0;
}
return groupValue;
}
public static short GetGroupDI(short groupNo)
{
if (!CardInitOk())
{
return 0;
}
Int16 groupValue = 0;
UInt32 ret = ImcApi.IMC_GetEcatGrpDi(nCardHandle, groupNo, ref groupValue);
if (ret != 0)
{
ShowErrorLog(" groupNo[" + groupNo + "] IMC_GetEcatGrpDi FAIL, ",ret);
return 0;
}
return groupValue;
}
public static bool CloseAllDO()
{
if (!CardInitOk())
{
return false;
}
int groupCount = tResource.doNum / 8;
for (short i = 0; i < groupCount; i++)
{
SetGroupDO(i, 0);
}
return true;
}
public static List<short> GetIOValue(short groupValue )
{
List<short> groupList = new List<short>();
string value = Convert.ToString(groupValue, 2).PadLeft(8, '0');
for (int i = 0; i < 8; i++)
{
string v = value.Substring(i, 1);
//groupIOList[i].Text = "DO_" + i;
if (v.Equals("1"))
{
groupList.Insert(0,1);
}
else
{
groupList.Insert(0, 0);
}
}
return groupList;
}
#endregion
#region AD/DA控制
/// <summary>
/// 模拟量IO值获取 获取EtherCAT 第 adNo号的ad值
/// </summary>
/// <param name="adNo">ad的通道:0~配置个数</param>
/// <returns>获取AD的输入值</returns>
public static short GetAdVal(short adNo)
{
if (!CardInitOk())
{
return 0;
}
Int16 adVal = 0;
UInt32 ret = ImcApi.IMC_GetEcatAdVal(nCardHandle, adNo, ref adVal);
if (ret != 0)
{
ShowErrorLog(" adNo[" + adNo + "] IMC_GetEcatAdVal FAIL, ",ret);
return 0;
}
return adVal;
}
/// <summary>
/// 获取EtherCAT 第 adNo号的状态
/// </summary>
/// <param name="adNo">ad的通道:0~配置个数</param>
/// <returns>获取AD的状态值</returns>
public static short GetAdSts(short adNo)
{
if (!CardInitOk())
{
return 0;
}
Int16 adSts = 0;
UInt32 ret = ImcApi.IMC_GetEcatAdSts(nCardHandle, adNo, ref adSts);
if (ret != 0)
{
ShowErrorLog(" adNo[" + adNo + "] IMC_GetEcatAdSts FAIL, ",ret);
return 0;
}
return adSts;
}
public static AdStsInfo GetAdStsInfo(short sts)
{
//【3】更新界面显示
AdStsInfo stsInfo = new AdStsInfo();
stsInfo.VoltageSts = ((sts & 0x01) == 0x01) ? 1 : 0; //负载电压故障
stsInfo.ConnectSts = ((sts & 0x02) == 0x02) ? 1 : 0; //模拟芯片连接错误
stsInfo.NoSts = ((sts & 0x04) == 0x04) ? 1 : 0; //通道故障
stsInfo.Overflow = ((sts & 0x08) == 0x08) ? 1 : 0; //通道上溢
stsInfo.Underflow = ((sts & 0x10) == 0x10) ? 1 : 0; //通道下溢
stsInfo.PEL = ((sts & 0x20) == 0x20) ? 1 : 0; //通道超上限
stsInfo.NEL = ((sts & 0x40) == 0x40) ? 1 : 0;//通道超下限
stsInfo.OffLine = ((sts & 0x80) == 0x80) ? 1 : 0;//通道断线
return stsInfo;
}
#endregion
private static void ShowErrorLog(string msg,UInt32 ret=0)
{
if (ret > 0)
{
CardMsg = BoardName() +msg+ HCErrorCode.GetCodeMsg(ret);
}
else
{
CardMsg = BoardName() + msg;
}
Console.WriteLine(CardMsg);
HCLogUtil.error(CardMsg);
}
private static void ShowLog(string msg )
{
Console.WriteLine(BoardName() + msg);
HCLogUtil.info(BoardName() + msg);
}
private static void DebugLog(string msg, UInt32 ret = 0)
{
if (ret != 0)
{
msg += " ,ret=" + ret;
}
Console.WriteLine(BoardName() + msg);
HCLogUtil.debug(BoardName() + msg);
}
}
public class AdStsInfo
{
/// <summary>
/// Bit0 ,负载电压故障,0:接入外部电源,1:未接入外部电源
/// </summary>
public int VoltageSts= -1;
/// <summary>
/// Bit1 ,模拟芯片连接错误,0:数字版与模拟板通讯正常,1:数字版与模拟板通讯错误
/// </summary>
public int ConnectSts = -1;
/// <summary>
/// Bit2:通道故障
/// </summary>
public int NoSts = -1;
/// <summary>
/// Bit3:通道上溢
/// </summary>
public int Overflow = -1;
/// <summary>
/// Bit4:通道下溢
/// </summary>
public int Underflow = -1;
/// <summary>
/// Bit5:通道超上限
/// </summary>
public int PEL = -1;
/// <summary>
/// Bit6:通道超下限
/// </summary>
public int NEL = -1;
/// <summary>
/// Bit7:通道断线
/// </summary>
public int OffLine = -1;
public string ToStr()
{
return "VoltageSts=" + VoltageSts + ",ConnectSts=" + ConnectSts + ",NoSts=" + NoSts + ",Overflow=" + Overflow + ",Underflow=" + Underflow
+ ",PEL=" + PEL + ",NEL=" + NEL + ",OffLine=" + OffLine;
}
}
public class AxisSts
{
/// <summary>
/// 轴报警信号
/// </summary>
public int ALM = -1;
/// <summary>
/// 轴警告信号
/// </summary>
public int WARN = -1;
/// <summary>
/// 轴急停信号
/// </summary>
public int EMG = -1;
/// <summary>
/// 轴伺服使能信号
/// </summary>
public int ServoOn = -1;
/// <summary>
/// 轴忙碌状态
/// </summary>
public int BUSY = -1;
/// <summary>
/// 轴到位信号
/// </summary>
public int INP = -1;
/// <summary>
/// 正限位信号
/// </summary>
public int PEL = -1;
/// <summary>
/// 原点信号
/// </summary>
public int ORG = -1;
/// <summary>
/// 负限位信号
/// </summary>
public int NEL = -1;
/// <summary>
/// 总线轴标志
/// </summary>
public int ECAT = -1;
public string ToStr()
{
return "ALM=" + ALM + ",WARN=" + WARN + ",EMG=" + EMG + ",ServoOn=" + ServoOn + ",BUSY=" + BUSY + ",INP=" + INP + ",PEL=" + PEL + ",ORG=" + ORG + ",NEL=" + NEL+ ",ECAT=" + ECAT;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HuichuanLibrary
{
partial class HCBoardManager
{
#region 单轴控制
/// <summary>
/// 打开轴
/// </summary>
/// <param name="axisNo">轴号</param>
/// <returns></returns>
public static bool ServoOn(short axisNo)
{
if (!CardInitOk())
{
return false;
}
//【2】上使能
UInt32 ret = ImcApi.IMC_AxServoOn(nCardHandle, axisNo, 1);
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "] ServoOn FAIL,",ret);
return false;
}
else
{
ShowLog(" Axis[" + axisNo + "] ServoOn OK");
return true;
}
}
/// <summary>
/// 关闭轴
/// </summary>
/// <param name="axisNo">轴号</param>
/// <returns></returns>
public static bool ServoOff(short axisNo)
{
if (!CardInitOk())
{
return false;
}
//【2】下使能
UInt32 ret = ImcApi.IMC_AxServoOff(nCardHandle, axisNo, 1);
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "] ServoOff FAIL, ",ret);
return false;
}
else
{
ShowLog(" Axis[" + axisNo + "] ServoOff OK");
return true;
}
}
#region 回零处理
/// <summary>
/// 开始回零
/// </summary>
/// <param name="axisNo">轴号</param>
/// <param name="highVel">回零高速</param>
/// <param name="lowVel">回零低速</param>
/// <param name="acc">回零加速度</param>
/// <param name="homeMethod">回零方法,默认28</param>
/// <param name="offset">回零偏移,默认0</param>
/// <param name="overtime">超时时间,默认120000</param>
/// <param name="posSrc">端子板信号源,默认0</param>
/// <returns></returns>
public static bool StartHomeMove(short axisNo, uint highVel, uint lowVel, uint acc, short homeMethod = 28, int offset = 0, uint overtime = 120000, short posSrc = 0)
{
if (!CardInitOk())
{
return false;
}
//【2】写入回原参数
ImcApi.THomingPara tHomingPara = new ImcApi.THomingPara();
tHomingPara.homeMethod = homeMethod;
tHomingPara.offset = offset;
tHomingPara.highVel = highVel;
tHomingPara.lowVel = lowVel;
tHomingPara.acc = acc;
tHomingPara.overtime = overtime;
tHomingPara.posSrc = posSrc;
HCLogUtil.info("Axis[" + axisNo + "] StartHoming highVel[" + highVel + "],lowVel[" + lowVel + "],acc[" + acc + "],homeMethod[" + homeMethod + "],offset[" + offset + "],overtime[" + overtime + "],posSrc[" + posSrc + "]");
//【3】开始回原
UInt32 ret = ImcApi.IMC_StartHoming(nCardHandle, axisNo, ref tHomingPara);
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "]StartHoming FAIL, ",ret);
return false;
}
else
{
ShowLog(" Axis[" + axisNo + "] StartHoming OK");
return true;
}
}
/// <summary>
/// 停止原点返回
/// </summary>
/// <param name="axisNo">轴号</param>
/// <returns></returns>
public static bool StopHomeMove(short axisNo)
{
if (!CardInitOk())
{
return false;
}
//【2】触发停止回原
UInt32 ret = ImcApi.IMC_StopHoming(nCardHandle, axisNo, 0); //0:表示平滑停止 1:表示急停
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "] StopHoming FAIL, ",ret);
return false; ;
}
else
{
ShowLog(" Axis[" + axisNo + "] StopHoming OK");
return true;
}
}
/// <summary>
/// 获取回原状态
/// </summary>
/// <param name="axisNo">轴号</param>
/// <returns></returns>
public static short GetHomeStatus(short axisNo)
{
if (!CardInitOk())
{
return -1;
}
//【2】获取回原状态
short nHomingStatus = 0;
UInt32 ret = ImcApi.IMC_GetHomingStatus(nCardHandle, axisNo, ref nHomingStatus);
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "] GetHomingStatus FAIL, ",ret);
return -1;
}
else
{
//ShowLog("轴回原状态为" + nHomingStatus.ToString());
return nHomingStatus;
}
}
public static bool FinishHome(short axisNo)
{
if (!CardInitOk())
{
return false;
}
//【2】退出回原模式
UInt32 ret = ImcApi.IMC_FinishHoming(nCardHandle, axisNo);
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "] FinishHoming FAIL, ",ret);
return false;
}
else
{
ShowLog(" Axis[" + axisNo + "] FinishHoming OK!");
return true;
}
}
/// <summary>
/// 判断回零是否完成
/// </summary>
///<param name="axisNo">轴号</param>
/// <returns></returns>
public static bool HomeingIsEnd(short axisNo)
{
//回零状态结束,并且不再忙碌中
AxisSts sts = GetAxisSts(axisNo);
if (sts.BUSY.Equals(0) && sts.INP.Equals(1))
{
short homests = GetHomeStatus(axisNo);
if (homests.Equals(HomeSts_OK))
{
return true;
}
}
return false;
}
#endregion
/// <summary>
/// 判断轴是否在指定的位置
/// </summary>
/// <param name="axisNo">轴号</param>
/// <param name="targetPos">目标位置</param>
/// <param name="maxError">最大误差脉冲值</param>
/// <returns></returns>
public static bool IsInPosition(short axisNo, double targetPos, double maxError = 10)
{
double currP = GetAxisCurrPos(axisNo);
double chazhi = Math.Abs(Math.Abs(currP) - Math.Abs(targetPos));
if (chazhi < maxError)
{
return true;
}
return false;
}
/// <summary>
/// 判断轴是否运动结束,忙碌=0且到位信号=1
/// </summary>
/// <param name="axisNo">轴号</param>
/// <returns></returns>
public static bool MoveIsEnd(short axisNo)
{
AxisSts sts = GetAxisSts(axisNo);
if (sts.BUSY.Equals(0) && sts.INP.Equals(1))
{
return true;
}
return false;
}
/// <summary>
/// 轴绝对运动
/// </summary>
/// <param name="axisNo">轴号</param>
/// <param name="ptpPos">绝对位置</param>
/// <param name="ptpVel">速度</param>
/// <param name="ptpAcc">加速度</param>
/// <param name="ptpDec">减速度</param>
/// <returns></returns>
public static bool AbsMove(short axisNo, double ptpPos, double ptpVel, double ptpAcc, double ptpDec)
{
if (!CardInitOk())
{
return false;
}
if (ptpVel > 0 && ptpAcc > 0 && ptpDec > 0)
{
if (!SetPTPSpeed(axisNo, ptpVel, ptpAcc, ptpDec))
{
return false;
}
}
short ptpType = 0;
return StartPtpMove(axisNo, ptpType, ptpPos);
}
/// <summary>
/// 轴相对运动
/// </summary>
/// <param name="axisNo">轴号</param>
/// <param name="ptpPos">相对位置</param>
/// <param name="ptpVel">速度</param>
/// <param name="ptpAcc">加速度</param>
/// <param name="ptpDec">减速度</param>
/// <returns></returns>
public static bool RelMove(short axisNo, double ptpPos, double ptpVel, double ptpAcc, double ptpDec)
{
if (!CardInitOk())
{
return false;
}
if (ptpVel > 0 && ptpAcc > 0 && ptpDec > 0)
{
if (!SetPTPSpeed(axisNo, ptpVel, ptpAcc, ptpDec))
{
return false;
}
}
short ptpType = 1;
return StartPtpMove(axisNo, ptpType, ptpPos);
}
private static bool StartPtpMove(short axisNo, short ptpType, double ptpPos)
{
//【3】启动PTP
UInt32 ret = ImcApi.IMC_StartPtpMove(nCardHandle, axisNo, ptpPos, ptpType);
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "] ptpPos["+ ptpPos + "] StartPtpMove " + ptpType + " FAIL, ",ret);
return false;
}
else
{
DebugLog(" Axis[" + axisNo + "] ptpPos[" + ptpPos + "] StartPtpMove " + ptpType + " OK",ret);
return true;
}
}
/// <summary>
/// 设置点到点速度
/// </summary>
/// <param name="axisNo">轴号</param>
/// <param name="ptpVel">目标速速</param>
/// <param name="ptpAcc">加速度</param>
/// <param name="ptpDec">减速度</param>
/// <returns></returns>
public static bool SetPTPSpeed(short axisNo, double ptpVel, double ptpAcc, double ptpDec)
{
if (!CardInitOk())
{
return false;
}
UInt32 ret = ImcApi.IMC_SetSingleAxMvPara(nCardHandle, axisNo, ptpVel, ptpAcc, ptpDec);
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "] SetSingleAxMvPara ptpVel [" + ptpVel + "] ptpAcc [" + ptpAcc + "] ptpDec [" + ptpDec + "] FAIL, ",ret);
return false;
}
else
{
DebugLog(" Axis[" + axisNo + "] SetSingleAxMvPara ptpVel [" + ptpVel + "] ptpAcc [" + ptpAcc + "] ptpDec [" + ptpDec + "] OK",ret);
return true;
}
}
/// <summary>
/// 轴停止运动
/// </summary>
/// <param name="axisNo">轴号</param>
/// <returns></returns>
public static bool AxisStop(short axisNo)
{
if (!CardInitOk())
{
return false;
}
//【2】轴停止
UInt32 ret = ImcApi.IMC_AxMoveStop(nCardHandle, axisNo, 1); //StopType=1,立即停止
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "] MoveStop FAIL, ",ret);
return false;
}
else
{
DebugLog(" Axis[" + axisNo + "] MoveStop OK",ret);
return true;
}
}
/// <summary>
/// 设置齿轮比
/// </summary>
/// <param name="axisNo">轴号</param>
/// <param name="Motor_Revolution">电子齿轮分子:电机分辨率</param>
/// <param name="Shaft_Revolution">电子齿轮分母:一圈脉冲数</param>
/// <returns></returns>
public static bool SetEcatSdo(ushort axisNo, int Motor_Revolution, int Shaft_Revolution)
{
if (!CardInitOk())
{
return false;
}
//【3】获取轴号对应的实际地址
short nphyStationId = 0, nphySlotId = 0;
uint abort_code = 0;
UInt32 ret = ImcApi.IMC_GetAxEcatStation(nCardHandle, axisNo, ref nphyStationId, ref nphySlotId);
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "] IMC_GetAxEcatStation FAIL, ",ret);
return false;
}
//【4】设置电子齿轮分子
ret = ImcApi.IMC_SetEcatSdo(nCardHandle, nphyStationId, 0x6091, 0x01, BitConverter.GetBytes(Motor_Revolution), 4, ref abort_code);
if (ret != 0 | abort_code != 0)
{
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "] IMC_SetEcatSdo_1 FAIL, ",ret);
return false;
}
else
{
ShowErrorLog(" Axis[" + axisNo + "] IMC_SetEcatSdo_1 FAIL, ErrorCode=0x" ,abort_code);
return false;
}
}
//【4】设置电子齿轮分母
ret = ImcApi.IMC_SetEcatSdo(nCardHandle, nphyStationId, 0x6091, 0x02, BitConverter.GetBytes(Shaft_Revolution), 4, ref abort_code);
if (ret != 0 | abort_code != 0)
{
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "] IMC_SetEcatSdo_2 FAIL, ",ret);
return false;
}
else
{
ShowErrorLog(" Axis[" + axisNo + "] IMC_SetEcatSdo_2 FAIL, ErrorCode=0x" , abort_code );
return false;
}
}
return true;
}
/// <summary>
/// 轴匀速运动
/// </summary>
/// <param name="axisNo">轴号</param>
/// <param name="targetVel">目标速度</param>
/// <returns></returns>
public static bool SpeedMove(short axisNo, double targetVel)
{
if (!CardInitOk())
{
return false;
}
UInt32 ret = ImcApi.IMC_StartJogMove(nCardHandle, axisNo, targetVel);
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "] speed [" + targetVel + "] StartJogMove FAIL, ",ret);
return false;
}
else
{
ShowLog(" Axis[" + axisNo + "] speed [" + targetVel + "] StartJogMove OK");
return true;
}
}
/// <summary>
/// 获取轴规划模式
/// </summary>
///<param name="axisNo">轴号</param>
/// <returns></returns>
public static short GetAxisPrfMode(short axisNo)
{
if (!CardInitOk())
{
return -1;
}
try
{
Int16[] nTimerAxPrfMode = { 0 };
UInt32 ret = ImcApi.IMC_GetAxPrfMode(nCardHandle, axisNo, nTimerAxPrfMode, 1); //变量需要定义为数组,默认读取1个轴
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "] GetAxPrfMode FAIL, ",ret);
return -1;
}
if (nTimerAxPrfMode.Length > 0)
{
return nTimerAxPrfMode[0];
}
}
catch (Exception ex)
{
ShowErrorLog("" + ex.ToString());
}
return -1;
}
/// <summary>
/// 获取轴状态
/// </summary>
///<param name="axisNo">轴号</param>
/// <returns></returns>
public static AxisSts GetAxisSts(short axisNo)
{
AxisSts sts = new AxisSts();
if (!CardInitOk())
{
return sts;
}
Int32[] nTimerAxSts = { 0 };
UInt32 ret = ImcApi.IMC_GetAxSts(nCardHandle, axisNo, nTimerAxSts, 1);
if (ret != 0 || nTimerAxSts.Length <= 0)
{
ShowErrorLog(" Axis[" + axisNo + "] GetAxSts FAIL, ",ret);
return sts;
}
int axisState = nTimerAxSts[0];
//【3】更新界面显示
sts.ALM = ((axisState & 0x01) == 0x01) ? 1 : 0; //报警信号
sts.ServoOn = ((axisState & 0x02) == 0x02) ? 1 : 0; //使能信号
sts.BUSY = ((axisState & 0x04) == 0x04) ? 1 : 0; //轴忙信号
sts.INP = ((axisState & 0x08) == 0x08) ? 1 : 0; //轴到位信号
sts.EMG = ((axisState & 0x200) == 0x200) ? 1 : 0; //急停信号
sts.WARN = ((axisState & 0x1000) == 0x1000) ? 1 : 0; //警告信号
sts.ECAT = ((axisState & ImcApi.AX_ECAT_BIT) == ImcApi.AX_ECAT_BIT) ? 1 : 0;//总线轴标志
Int16 nTimerAxInput = 0;
ret = ImcApi.IMC_GetAxEcatDigitalInput(nCardHandle, axisNo, ref nTimerAxInput);
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "]GetAxEcatDigitalInput ,",ret);
return sts;
}
sts.NEL = ((nTimerAxInput & 0x01) == 0x01) ? 1 : 0; //负限位信号
sts.PEL = ((nTimerAxInput & 0x02) == 0x02) ? 1 : 0; //正限位信号
sts.ORG = ((nTimerAxInput & 0x04) == 0x04) ? 1 : 0; //原点信号
return sts;
}
/// <summary>
/// 获取轴规划位置
/// </summary>
///<param name="axisNo">轴号</param>
/// <returns></returns>
public static double GetAxisPrfPos(short axisNo)
{
if (!CardInitOk())
{
return -1;
}
double[] nTimerAxPrfPos = { 0 };
UInt32 ret = ImcApi.IMC_GetAxPrfPos(nCardHandle, axisNo, nTimerAxPrfPos, 1);
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "] GetAxPrfPos FAIL, ",ret);
return -1;
}
return nTimerAxPrfPos[0];
}
/// <summary>
/// 获取轴规划速度
/// </summary>
///<param name="axisNo">轴号</param>
/// <returns></returns>
public static double GetAxisPrfVel(short axisNo)
{
if (!CardInitOk())
{
return -1;
}
double[] nTimerAxPrfVel = { 0 };
UInt32 ret = ImcApi.IMC_GetAxPrfVel(nCardHandle, axisNo, nTimerAxPrfVel, 1);
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "] GetAxPrfVel FAIL, ",ret);
return -1;
}
return nTimerAxPrfVel[0];
}
/// <summary>
/// 获取轴反馈位置
/// </summary>
///<param name="axisNo">轴号</param>
/// <returns></returns>
public static double GetAxisCurrPos(short axisNo)
{
if (!CardInitOk())
{
return -1;
}
double[] nTimerAxEncPos = { 0 };
UInt32 ret = ImcApi.IMC_GetAxEncPos(nCardHandle, axisNo, nTimerAxEncPos, 1);
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "] GetAxEncPos FAIL, ",ret);
return -1;
}
return nTimerAxEncPos[0];
}
/// <summary>
///获取轴反馈速度
/// </summary>
///<param name="axisNo">轴号</param>
/// <returns></returns>
public static double GetAxisCurrVel(short axisNo)
{
if (!CardInitOk())
{
return -1;
}
double[] nTimerAxEncVel = { 0 };
UInt32 ret = ImcApi.IMC_GetAxEncVel(nCardHandle, axisNo, nTimerAxEncVel, 1);
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "] GetAxEncVel FAIL, ",ret);
return -1;
}
return nTimerAxEncVel[0];
}
/// <summary>
/// 获取轴反馈加速度
/// </summary>
///<param name="axisNo">轴号</param>
/// <returns></returns>
public static double GetAxisCurrAcc(short axisNo)
{
if (!CardInitOk())
{
return -1;
}
double[] nTimerAxEncAcc = { 0 };
UInt32 ret = ImcApi.IMC_GetAxEncAcc(nCardHandle, axisNo, nTimerAxEncAcc, 1);
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "] GetAxEncAcc FAIL, ",ret);
return -1;
}
return nTimerAxEncAcc[0];
}
/// <summary>
/// 清除轴报警状态
/// </summary>
///<param name="axisNo">轴号</param>
/// <returns></returns>
public static bool ClearAxisSts(short axisNo)
{
if (!CardInitOk())
{
return false;
}
UInt32 ret = ImcApi.IMC_ClrAxSts(nCardHandle, axisNo);
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "] ClrAxSts FAIL, ",ret);
return false;
}
return true;
}
/// <summary>
/// 获取错误码
/// </summary>
/// <param name="axisNo">轴号</param>
/// <returns></returns>
public static short GetAxErrCode(short axisNo)
{
if (!CardInitOk())
{
return -1;
}
short outV = -1;
UInt32 ret = ImcApi.IMC_GetAxErrCode(nCardHandle, axisNo, ref outV);
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "] GetAxEncAcc FAIL, ",ret);
return -1;
}
return outV;
}
/// <summary>
/// 获取轴类型
/// </summary>
/// <param name="axisNo">轴号</param>
/// <returns></returns>
public static string GetAxType(short axisNo)
{
string res = "";
if (!CardInitOk())
{
return res;
}
short pAxType = -1;
short pOutChn = -1;
UInt32 ret = ImcApi.IMC_GetAxType(nCardHandle, axisNo, ref pAxType, ref pOutChn);
res = "轴类型[" + pAxType + "],物理通道[" + pOutChn + "]";
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "] GetAxType FAIL, ",ret);
}
return res;
}
/// <summary>
/// 获取EtherCAT类型轴对应的正向力矩限制
/// </summary>
/// <param name="axisNo">轴号0-31</param>
/// <returns>正向力矩限制</returns>
public static short GetEcatAxPosTorqLmt(short axisNo)
{
if (!CardInitOk())
{
return -1;
}
short outV = -1;
UInt32 ret = ImcApi.IMC_GetEcatAxPosTorqLmt(nCardHandle, axisNo, ref outV);
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "] GetEcatAxPosTorqLmt FAIL, ",ret);
return -1;
}
return outV;
}
/// <summary>
/// 设置EtherCAT类型轴对应的正向力矩限制
/// </summary>
/// <param name="axisNo">轴号0-31</param>
/// <param name="value">正向力矩限制</param>
/// <returns></returns>
public static bool SetEcatAxPosTorqLmt(short axisNo, short value)
{
if (!CardInitOk())
{
return false;
}
UInt32 ret = ImcApi.IMC_SetEcatAxPosTorqLmt(nCardHandle, axisNo, value);
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "][" + value + "] SetEcatAxPosTorqLmt FAIL, ",ret);
return false;
}
return true;
}
/// <summary>
/// 获取EtherCAT类型轴对应的负向力矩限制
/// </summary>
/// <param name="axisNo">轴号0-31</param>
/// <returns>负向力矩限制</returns>
public static short GetEcatAxNegTorqLmt(short axisNo)
{
if (!CardInitOk())
{
return -1;
}
short outV = -1;
UInt32 ret = ImcApi.IMC_GetEcatAxNegTorqLmt(nCardHandle, axisNo, ref outV);
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "] GetEcatAxNegTorqLmt FAIL, ",ret);
return -1;
}
return outV;
}
/// <summary>
/// 设置EtherCAT类型轴对应的负向力矩限制
/// </summary>
/// <param name="axisNo">轴号0-31</param>
/// <param name="value">负向力矩限制</param>
/// <returns></returns>
public static bool SetEcatAxNegTorqLmt(short axisNo, short value)
{
if (!CardInitOk())
{
return false;
}
UInt32 ret = ImcApi.IMC_SetEcatAxNegTorqLmt(nCardHandle, axisNo, value);
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "][" + value + "] SetEcatAxNegTorqLmt FAIL, ",ret);
return false;
}
return true;
}
/// <summary>
/// 获取EtherCAT类型轴对应的最大力矩限制
/// </summary>
/// <param name="axisNo">轴号0-31</param>
/// <returns>最大力矩限制</returns>
public static short GetEcatAxMaxTorqLmt(short axisNo)
{
if (!CardInitOk())
{
return -1;
}
short outV = -1;
UInt32 ret = ImcApi.IMC_GetEcatAxMaxTorqLmt(nCardHandle, axisNo, ref outV);
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "] GetEcatAxMaxTorqLmt FAIL, ",ret);
return -1;
}
return outV;
}
/// <summary>
/// 设置EtherCAT类型轴对应的最大力矩限制
/// </summary>
/// <param name="axisNo">轴号0-31</param>
/// <param name="value">最大力矩限制</param>
/// <returns></returns>
public static bool SetEcatAxMaxTorqLmt(short axisNo, short value)
{
if (!CardInitOk())
{
return false;
}
UInt32 ret = ImcApi.IMC_SetEcatAxMaxTorqLmt(nCardHandle, axisNo, value);
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "][" + value + "] SetEcatAxMaxTorqLmt FAIL, ",ret);
return false;
}
return true;
}
/// <summary>
/// 设置反向间隙
/// HuichuanLibrary.HCBoardManager.SetAxBacklash(MiddleAxis.Config.GetAxisValue(),Config.MiddleAxis_Reverse_Offset, MiddleAxis.Config.HomeLowSpeed,-1);
/// </summary>
/// <param name="axisNo"></param>
/// <param name="wholdCmpVal"></param>
/// <param name="cmpVel"></param>
/// <param name="cmpDir"></param>
/// <returns></returns>
public static bool SetAxBacklash(short axisNo, int wholdCmpVal, int cmpVel, short cmpDir)
{
if (!CardInitOk())
{
return false;
}
var ret = ImcApi.IMC_SetAxBacklash(nCardHandle, axisNo, wholdCmpVal, cmpVel, cmpDir);
if (ret != 0)
{
ShowErrorLog(" Axis[" + axisNo + "][wholdCmpVal:" + wholdCmpVal + "][cmpVel:" + cmpVel + "][cmpDir:" + cmpDir + "] SetAxBacklash FAIL, ErrorCode=0x" + ret.ToString("x8"));
return false;
}
return true;
}
#endregion
#region 轴状态
public static string AxisPrfMode(short axCtrlMode)
{
axCtrlMode = (short)(axCtrlMode & 0xf);
string strCtrlMode = string.Empty;
switch (axCtrlMode)
{
case 0:
strCtrlMode = "0=无模式";
break;
case 1:
strCtrlMode = "1=点对点";
break;
case 2:
strCtrlMode = "2=JOG";
break;
case 3:
strCtrlMode = "3=电子齿轮";
break;
case 4:
strCtrlMode = "4=电子凸轮";
break;
case 5:
strCtrlMode = "5=PVT";
break;
case 6:
strCtrlMode = "6=龙门";
break;
case 7:
strCtrlMode = "7=手轮";
break;
case 9:
strCtrlMode = "8=点位连续";
break;
case 11:
strCtrlMode = "11=插补同步轴";
break;
case 15:
strCtrlMode = "15=回零";
break;
default:
break;
}
return strCtrlMode;
}
public static string AxisHomeSts(short homeStatus)
{
string sStr = "";
switch (homeStatus)
{
case 0:
sStr = "0=正在回零中";
break;
case 1:
sStr = "1=回零中断或者没有开始启动";
break;
case 2:
sStr = "2=回零结束,但没有到设定的目标位置";
break;
case 3:
sStr = "3=回零完成";
break;
case 4:
sStr = "4=回零中发生错误,同时速度不为0";
break;
case 5:
sStr = "5=回零中发生错误,同时速度为0";
break;
default:
break;
}
return sStr;
}
#endregion
/// <summary>
/// 获取轴的负载率
/// </summary>
/// <param name="axisNo"></param>
/// <returns></returns>
public static string GetAxisLoadRate(short axisNo)
{
short pPhyStation_Id = 0;
short pPhySlot_id = 0;
UInt32 ret1 = ImcApi.IMC_GetAxEcatStation(nCardHandle, (ushort)axisNo, ref pPhyStation_Id, ref pPhySlot_id);
ushort index = 0x200b;
ushort subindex = 13;
uint targetsize = 2;
int datasize = 2;
uint resultSize = 0;
uint abortCode = 0;
Byte[] targetData = new Byte[targetsize];
UInt32 ret = ImcApi.IMC_GetEcatSdo(nCardHandle, pPhyStation_Id, index, subindex, targetData, targetsize, ref resultSize, ref abortCode);
if (resultSize > 0)
{
string strFromat = "{0:X2}";
string str = "";
foreach (byte b in targetData)
{
str += string.Format(strFromat, b);
}
int value = Convert.ToInt32(str.Trim().Replace(" ", ""), 16);
HCLogUtil.info($"axisNo={axisNo},pPhyStation_Id={pPhyStation_Id},index={index},subindex= {subindex},abortCode ={abortCode},resultSize={resultSize}, str={str},value={value}" );
return value.ToString();
}
else
{
HCLogUtil.info($"axisNo={axisNo},pPhyStation_Id={pPhyStation_Id},index={index},subindex= {subindex},abortCode ={abortCode},resultSize={resultSize},");
}
return "";
}
/// <summary>
/// 获取轴的扭矩
/// </summary>
/// <param name="axisNo"></param>
/// <returns></returns>
public static short GetAxActTorq(short axisNo)
{
short pActTrq = 0;
UInt32 ret = ImcApi.IMC_GetAxActTorq(nCardHandle, axisNo, ref pActTrq);
HCLogUtil.info($"axisNo={axisNo},pActTrq={pActTrq},");
return pActTrq;
}
/// <summary>
/// 回原点状态:0=正在回零中
/// </summary>
public static short HomeSts_Moveing = 0;
/// <summary>
/// 回原点状态:1=回零中断或者没有开始启动
/// </summary>
public static short HomeSts_NotStart = 1;
/// <summary>
/// 回原点状态:3=回零完成
/// </summary>
public static short HomeSts_OK = 3;
}
}
using log4net;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace HuichuanLibrary
{
public class HCErrorCode
{
private static Dictionary<string, string> CmdMap = new Dictionary<string, string>();
private static Dictionary<string, string> ErrorCodeMap = new Dictionary<string, string>();
public static void LoadConfig(string cmdConfigPath = "", string errCodeConfigPath = "" )
{
if (cmdConfigPath.Equals(""))
{
cmdConfigPath = Application.StartupPath+ @"\huichuan_config\commandDef.txt";
}
if (errCodeConfigPath.Equals(""))
{
errCodeConfigPath = Application.StartupPath + @"\huichuan_config\errorcode.h";
}
LoadCmdConfig(cmdConfigPath);
LoadErrConfig(errCodeConfigPath);
}
public static string GetCodeMsg(UInt32 ret)
{
string str = ret.ToString("x8").PadLeft(8,'0');
string cmdCode = "0x" + str.Substring(0, 4);
string errCode = "0x" + str.Substring(4, 4);
CmdMap.TryGetValue(cmdCode, out string cmdStr);
ErrorCodeMap.TryGetValue(errCode, out string errStr);
string result = " ErrorCode = 0x" + str + ",CMD=" + cmdStr + ",ErrorMsg=" + errStr;
return result;
}
private static void LoadCmdConfig (string cmdPath)
{
try
{
CmdMap = new Dictionary<string, string>();
if (!File.Exists(cmdPath))
{
return;
}
Encoding encoding = Encoding.UTF8;
if (!GetType(cmdPath).Equals(Encoding.UTF8))
{
encoding = Encoding.GetEncoding("gb2312");
}
string[] lines = File.ReadAllLines(cmdPath, encoding);
foreach (string line in lines)
{
if (line.Trim().StartsWith("#define"))
{
string newS = line.Trim().Replace("#define", "").Replace(")","");
string[] array = newS.Trim().Split('(');
if (array.Length >= 2)
{
//#define ID_IMC_GetCardsNum (0x8000)
string cmdName = array[0].Trim();
string cmdCode = array[1].Trim().ToLower();
if(!String.IsNullOrEmpty(cmdName) && (!String.IsNullOrEmpty(cmdCode))){
if (!CmdMap.ContainsKey(cmdCode))
{
CmdMap.Add(cmdCode, cmdName);
}
}
}
}
}
}
catch (Exception ex)
{
HCLogUtil.error("加载:" + cmdPath + "错误:" + ex.ToString());
}
}
private static void LoadErrConfig(string errPath)
{
try
{
ErrorCodeMap = new Dictionary<string, string>();
if (!File.Exists(errPath))
{
return;
}
Encoding encoding = Encoding.UTF8;
if (!GetType(errPath).Equals(Encoding.UTF8))
{
encoding = Encoding.GetEncoding("gb2312");
}
string[] lines = File.ReadAllLines(errPath, encoding);
foreach (string line in lines)
{
if (line.Trim().StartsWith("#define"))
{
string newS = line.Trim().Replace("#define", "").Replace(")", "").Replace("//","/");
string[] array = newS.Trim().Split('(');
if (array.Length >= 2)
{
string[] array2 = array[1].Split('/');
if (array2.Length >= 2)
{
//#define ERR_BGVEL_OUTRANG (0x0010) // 起始速度设置超出范围
string cmdName = array2[0].Trim();
string cmdCode = array2[1].Trim().ToLower();
if (!String.IsNullOrEmpty(cmdName) && (!String.IsNullOrEmpty(cmdCode))){
if (!ErrorCodeMap.ContainsKey(cmdName))
{
ErrorCodeMap.Add(cmdName, cmdCode);
}
}
}
}
}
}
}
catch (Exception ex)
{
HCLogUtil.error("加载:" + errPath + "错误:" + ex.ToString());
}
}
#region 判断编码格式
private static bool IsUTF8Bytes(byte[] data)
{
int charByteCounter = 1; //计算当前正分析的字符应还有的字节数
byte curByte; //当前分析的字节.
for (int i = 0; i < data.Length; i++)
{
curByte = data[i];
if (charByteCounter == 1)
{
if (curByte >= 0x80)
{
//判断当前
while (((curByte <<= 1) & 0x80) != 0)
{
charByteCounter++;
}
//标记位首位若为非0 则至少以2个1开始 如:110XXXXX...........1111110X
if (charByteCounter == 1 || charByteCounter > 6)
{
return false;
}
}
}
else
{
//若是UTF-8 此时第一位必须为1
if ((curByte & 0xC0) != 0x80)
{
return false;
}
charByteCounter--;
}
}
if (charByteCounter > 1)
{
throw new Exception("非预期的byte格式");
}
return true;
}
public static System.Text.Encoding GetType(FileStream fs)
{
byte[] Unicode = new byte[] { 0xFF, 0xFE, 0x41 };
byte[] UnicodeBIG = new byte[] { 0xFE, 0xFF, 0x00 };
byte[] UTF8 = new byte[] { 0xEF, 0xBB, 0xBF }; //带BOM
Encoding reVal = Encoding.Default;
BinaryReader r = new BinaryReader(fs, System.Text.Encoding.Default);
int i;
int.TryParse(fs.Length.ToString(), out i);
byte[] ss = r.ReadBytes(i);
if (IsUTF8Bytes(ss) || (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF))
{
reVal = Encoding.UTF8;
}
else if (ss[0] == 0xFE && ss[1] == 0xFF && ss[2] == 0x00)
{
reVal = Encoding.BigEndianUnicode;
}
else if (ss[0] == 0xFF && ss[1] == 0xFE && ss[2] == 0x41)
{
reVal = Encoding.Unicode;
}
r.Close();
return reVal;
}
public static System.Text.Encoding GetType(string FILE_NAME)
{
FileStream fs = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read);
Encoding r = GetType(fs);
fs.Close();
return r;
}
#endregion
}
}
using log4net;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Runtime.ExceptionServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace HuichuanLibrary
{
public class HCLogUtil
{
public static ILog LOGGER = LogManager.GetLogger("RollingLogFileAppender");
public static ConcurrentDictionary<int, DateTime> lastErrorLogTime = new ConcurrentDictionary<int, DateTime>();
public static System.Windows.Forms.RichTextBox logBox = null;
public static int showCount = 20;
public static bool debug_opened = false;
public static void info(ILog log, string msg)
{
if (log == null)
{
return;
}
log.Info(msg);
AddToBox(msg, Color.Black);
//clear();
}
public static void info(ILog log, string msg, Color color)
{
log.Info(msg);
AddToBox(msg, color);
}
public static void debug(ILog log, string msg, Color color)
{
log.Debug(msg);
if (debug_opened)
{
AddToBox(msg, color);
}
}
public static void debug(ILog log, string msg)
{
log.Debug(msg);
if (debug_opened)
{
AddToBox(msg, Color.Gray);
}
}
public static void error(string errorMsg, int type, int seconds = 10)
{
try
{
if (lastErrorLogTime.ContainsKey(type))
{
TimeSpan span = DateTime.Now - lastErrorLogTime[type];
if (span.TotalSeconds > seconds)
{
lastErrorLogTime[type] = DateTime.Now;
error(LOGGER, errorMsg);
}
}
else
{
lastErrorLogTime.TryAdd(type, DateTime.Now);
error(LOGGER, errorMsg);
}
}
catch (Exception ex)
{
LOGGER.Error(" 打印日志【" + type + "-" + errorMsg + "】出错:" + ex.ToString());
}
}
public static void error(ILog log, string errorMsg, Exception ex = null)
{
if (errorMsg.Trim().Equals("") && (ex == null))
{
return;
}
if (ex == null)
{
log.Error(errorMsg);
}
else
{
log.Error(errorMsg, ex);
}
AddToBox(errorMsg, Color.Red);
}
private static object lockObj = "";
private static void AddToBox(string msg, Color color)
{
if (Monitor.TryEnter(lockObj, 2))
{
try
{
ShowLogPro(msg, color);
}
catch (Exception ex)
{
LOGGER.Error("出错:", ex);
}
finally
{
Monitor.Exit(lockObj);
}
}
else
{
LOGGER.Debug("ShowLogPro【" + msg + "】失败,未得到锁");
}
}
private static List<string> logList = new List<string>();
public static string LastText = "";
[HandleProcessCorruptedStateExceptions]
private static void ShowLogPro(string msg, Color color)
{
try
{
if (logList.Count >= showCount)
{
logList.RemoveAt(0);
}
string text = "";
foreach (string str in logList)
{
text += str;
}
System.DateTime now = System.DateTime.Now;
logList.Add(now.ToLongTimeString() + " " + msg + Environment.NewLine);
if (logBox == null)
{
return;
}
LastText = text;
if (logBox.Visible)
{
logBox.Text = text;
// logBox.Focus(); //使文本框获取焦点
logBox.AppendText(now.ToLongTimeString() + " " + msg + Environment.NewLine); //增加文本
TimeSpan span = DateTime.Now - lastTime;
if (span.TotalSeconds > 3000000)
{
lastTime = DateTime.Now;
logBox.Select(logBox.Text.Length, 0); //设置光标的位置到文本尾
logBox.ScrollToCaret(); //滚动到控件光标处
}
}
}
catch (AccessViolationException e)
{
LOGGER.Error(" ShowLogPro 出错:" + e.ToString());
}
catch (Exception ex)
{
LOGGER.Error("出错:" + ex.ToString());
}
}
private static DateTime lastTime = DateTime.Now;
public static void UpdateLogbox()
{
if (logBox != null && logBox.Visible)
{
logBox.Text = LastText;
TimeSpan span = DateTime.Now - lastTime;
if (span.TotalSeconds > 3000000)
{
lastTime = DateTime.Now;
logBox.Select(logBox.Text.Length, 0); //设置光标的位置到文本尾
logBox.ScrollToCaret(); //滚动到控件光标处
}
}
}
public static void ClearLog()
{
if (logBox != null)
{
LastText = "";
logList.Clear();
logBox.Text = "";
}
}
public static void debug(string msg)
{
debug(LOGGER, msg);
}
public static void error(string errorMsg, Exception ex = null)
{
error(LOGGER, errorMsg, ex);
}
public static void info(string msg)
{
info(LOGGER, msg);
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{C9575C5E-9D4B-4B4F-BE41-926652B8985F}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>HuichuanLibrary</RootNamespace>
<AssemblyName>HuichuanLibrary</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Debug\HuichuanLibrary.xml</DocumentationFile>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="log4net, Version=2.0.12.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
<HintPath>..\..\packages\log4net.2.0.12\lib\net45\log4net.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.Web" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="FrmHuiChuanTest.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmHuiChuanTest.Designer.cs">
<DependentUpon>FrmHuiChuanTest.cs</DependentUpon>
</Compile>
<Compile Include="HCBoardManager.cs" />
<Compile Include="HCBoardManager_Axis.cs" />
<Compile Include="HCErrorCode.cs" />
<Compile Include="ImcApi.cs" />
<Compile Include="HCLogUtil.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<Content Include="device_config.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<EmbeddedResource Include="huichuan_config\commandDef.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="huichuan_config\errorcode.h">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource>
<Content Include="huichuan_x64\IMC_API_x64.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="huichuan_x64\msvcr100.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="huichuan_x64\msvcr100d.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="huichuan_x86\IMC_API_x86.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="huichuan_x86\msvcr100.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="huichuan_x86\msvcr100d.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="system_config.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<Content Include="huichuan_x64\IMC_API_x64.lib">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<Content Include="huichuan_x86\IMC_API_x86.lib">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="FrmHuiChuanTest.resx">
<DependentUpon>FrmHuiChuanTest.cs</DependentUpon>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
\ No newline at end of file
此文件的差异太大,无法显示。
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("HuichuanLibrary")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("HuichuanLibrary")]
[assembly: AssemblyCopyright("Copyright © 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("c9575c5e-9d4b-4b4f-be41-926652b8985f")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
// 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
此文件的差异太大,无法显示。
/*==========================================================================*/
/*---- COMMAND ID DEFINE ---*/
/*==========================================================================*/
/*==========================================================================*/
/*----1.1 板卡的操作以及资源的获取接口 ---*/
/*==========================================================================*/
#define ID_IMC_GetCardsNum (0x8000)
#define ID_IMC_OpenCard (0x8001)
#define ID_IMC_CloseCard (0x8002)
#define ID_IMC_OpenCardHandle (0x8004)
#define ID_IMC_ScanCardECAT (0x8006)
#define ID_IMC_GetECATMasterSts (0x8007)
#define ID_IMC_CloseCardHandle (0x8005)
#define ID_IMC_ScanCard (0x8008)
#define ID_IMC_GetCardSts (0x8009)
#define ID_IMC_GetCardResource (0x8003)
#define ID_IMC_UpLoadDeviceConfig (0x8010)
#define ID_IMC_DownLoadDeviceConfig (0x8011)
#define ID_IMC_DownLoadSystemConfig (0x8012)
#define ID_IMC_GetHwVer (0x8026)
/*==========================================================================*/
/*----1.2 板卡的操作以及资源的获取接口 ---*/
/*==========================================================================*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*----1.2.1 ECAT资源设置接口 ---*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define ID_IMC_SetEcatGrpDiInverse (0x0010)
#define ID_IMC_GetEcatGrpDiInverse (0x0011)
#define ID_IMC_SetEcatGrpDoInverse (0x0012)
#define ID_IMC_GetEcatGrpDoInverse (0x0013)
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*----1.2.2 端子板资源设置接口 ---*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define ID_IMC_GetBoardWorkSts (0x0080)
#define ID_IMC_SetLocalDiFilterTime (0x0081)
#define ID_IMC_GetLocalDiFilterTime (0x0082)
#define ID_IMC_SetLocalHmLmtPrbFilterTime (0x008b)
#define ID_IMC_GetLocalHmLmtPrbFilterTime (0x008c)
#define ID_IMC_SetLocalSpecialIOInverse (0x008d)
#define ID_IMC_GetLocalSpecialIOInverse (0x008e)
#define ID_IMC_SetLocalDiInverse (0x0083)
#define ID_IMC_GetLocalDiInverse (0x0084)
#define ID_IMC_SetLocalDoInverse (0x0085)
#define ID_IMC_GetLocalDoInverse (0x0086)
#define ID_IMC_SetLocalEncDir (0x0087)
#define ID_IMC_GetLocalEncDir (0x0088)
#define ID_IMC_SetLocalPulseMode (0x0089)
#define ID_IMC_GetLocalPulseMode (0x008a)
#define ID_IMC_SetLocalGpoUseType (0x0092)
#define ID_IMC_GetLocalGpoUseType (0x0093)
#define ID_IMC_SetEncFilterPara (0x0094)
#define ID_IMC_GetEncFilterPara (0x0095)
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*----1.2.3 系统参数设置接口 ---*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define ID_IMC_GetHwSysPara (0x0202)
#define ID_IMC_ResetSysPara (0x0222)
#define ID_IMC_GetCalcLoadRatio (0x0203)
#define ID_IMC_GetVersion (0x0204)
#define ID_IMC_WriteUserCode (0x8015)
#define ID_IMC_CheckUserCode (0x8016)
#define ID_IMC_SetEmgStopMode (0x020f)
#define ID_IMC_GetEmgStopMode (0x0215)
#define ID_IMC_SetEmgFilter (0x0210)
#define ID_IMC_GetEmgFilter (0x0211)
#define ID_IMC_SetEmgTrigLevelInv (0x0212)
#define ID_IMC_GetEmgTrigLevelInv (0x0213)
#define ID_IMC_GetEmgDiLevel (0x0214)
#define ID_IMC_SetEmgDoResetFlag (0x0216)
#define ID_IMC_GetEmgDoResetFlag (0x0217)
#define ID_IMC_SetEmgSvOffVelThreshold (0x0218)
#define ID_IMC_GetEmgSvOffVelThreshold (0x0219)
#define ID_IMC_OpenWatchDog (0x0223)
#define ID_IMC_FeedWatchDog (0x0224)
#define ID_IMC_CloseWatchDog (0x0225)
#define ID_IMC_EnableCheckEcatErrCode (0x0226)
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*----1.2.4 轴参数设置接口 ---*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define ID_IMC_SetAxActive (0x0065)
#define ID_IMC_GetAxActive (0x0066)
#define ID_IMC_SetAxMaxMtPara (0x0031)
#define ID_IMC_GetAxMaxMtPara (0x0032)
#define ID_IMC_SetAxEquiv (0x0060)
#define ID_IMC_GetAxEquiv (0x0061)
#define ID_IMC_SetAxBondCfg (0x0041)
#define ID_IMC_GetAxBondCfg (0x0042)
#define ID_IMC_ResetAxBondCfg (0x004f)
#define ID_IMC_SetAxAttriPara (0x0043)
#define ID_IMC_GetAxAttriPara (0x0044)
#define ID_IMC_SetAxSoftLimit (0x0045)
#define ID_IMC_GetAxSoftLimit (0x0046)
#define ID_IMC_SetAxArrivalBand (0x0047)
#define ID_IMC_GetAxArrivalBand (0x0048)
#define ID_IMC_SetAxErrorPos (0x004b)
#define ID_IMC_GetAxErrorPos (0x004c)
#define ID_IMC_SetAxBacklash (0x004d)
#define ID_IMC_GetAxBacklash (0x004e)
#define ID_IMC_AxSafeCheckEnable (0x0050)
#define ID_IMC_AxSafeCheckSts (0x0051)
#define ID_IMC_AxAlarmEnable (0x0052)
#define ID_IMC_AxAlarmDisable (0x0053)
#define ID_IMC_AxSoftLmtsEnable (0x0054)
#define ID_IMC_AxSoftLmtsDisable (0x0055)
#define ID_IMC_AxHwLmtsEnable (0x0056)
#define ID_IMC_AxHwLmtsDisable (0x0057)
#define ID_IMC_AxErrPosEnable (0x0058)
#define ID_IMC_AxErrPosDisable (0x0059)
#define ID_IMC_SetEcatAxProbeMaskBit (0x0030)
#define ID_IMC_GetEcatAxProbeMaskBit (0x0033)
#define ID_IMC_SetupAxGantry (0x0062)
#define ID_IMC_AbortAxGantry (0x0063)
#define ID_IMC_GetAxGantrySts (0x0064)
#define ID_IMC_ClrAxGantrySts (0x0068)
#define ID_IMC_AxSetScrewCompTable (0x2100)
#define ID_IMC_AxGetScrewCompTable (0x2101)
#define ID_IMC_AxEnableScrewComp (0x2103)
#define ID_IMC_AxDisableScrewComp (0x2104)
#define ID_IMC_AxGetScrewCompStatus (0x2105)
#define ID_IMC_AxGetScrewCompValue (0x2106)
/*==========================================================================*/
/*----2.1 ECAT硬件操作接口 ---*/
/*==========================================================================*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*----2.1.1ECAT总线 SDO操作以及状态查询 ---*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define ID_IMC_GetSlaveCurSts (0x8017)
#define ID_IMC_GetSlaveReqSts (0x8018)
#define ID_IMC_GetEcatErrCode (0x8019)
#define ID_IMC_GetAxEcatStation (0x801a)
#define ID_IMC_GetEcatSdo (0x801b)
#define ID_IMC_SetEcatSdo (0x801c)
#define ID_IMC_GetAxEcatPidVid (0x8032)
#define ID_IMC_GetEcatStationPidVid (0x8032)
#define ID_IMC_GetAxSdo (0x8034)
#define ID_IMC_SetAxSdo (0x8033)
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*----2.1.2 ECAT总线 DI/DO操作 ---*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define ID_IMC_SetEcatDoBit (0x0100)
#define ID_IMC_GetEcatDoBit (0x0102)
#define ID_IMC_SetEcatGrpDo (0x0103)
#define ID_IMC_GetEcatGrpDo (0x0104)
#define ID_IMC_GetEcatDiBit (0x0105)
#define ID_IMC_GetEcatGrpDi (0x0106)
#define ID_IMC_GetEcatAdVal (0x0107)
#define ID_IMC_SetEcatDaVal (0x0108)
#define ID_IMC_GetEcatDaVal (0x0109)
#define ID_IMC_GetEcatAdSts (0x001e)
#define ID_IMC_GetEcatDaSts (0x001f)
#define ID_IMC_GetEcatPtVal (0x0113)
/*==========================================================================*/
/*----2.2 端子板硬件操作接口 ---*/
/*==========================================================================*/
#define ID_IMC_GetBoardVersion (0x0152)
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*----2.2.1 端子板DIO操作接口 ---*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define ID_IMC_SetLocalDoBit (0x0140)
#define ID_IMC_GetLocalDoBit (0x0141)
#define ID_IMC_SetLocalDo (0x0142)
#define ID_IMC_GetLocalDo (0x0143)
#define ID_IMC_GetLocalDiBit (0x0144)
#define ID_IMC_GetLocalDi (0x0145)
#define ID_IMC_GetLocalADVal (0x0148)
#define ID_IMC_GetLocalSpecialDi (0x0149)
#define ID_IMC_GetLocalSpecialDiBit (0x014a)
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*----2.2.2 端子板编码器操作接口 ---*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define ID_IMC_GetLocalCntPos (0x0150)
#define ID_IMC_GetLocalCntVel (0x0151)
#define ID_IMC_GetLocalEncPos (0x0146)
#define ID_IMC_GetLocalEncVel (0x0147)
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*----2.2.4 端子板位置比较输出操作接口 ---*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define ID_IMC_CompareSrcConfig (0x0180)
#define ID_IMC_CompareOutputConfig (0x0186)
#define ID_IMC_GetCompareStatus (0x0184)
#define ID_IMC_StopCompareOut (0x0185)
#define ID_IMC_StartCompareOut (0x0187)
#define ID_IMC_CompareManualOutput (0x0181)
#define ID_IMC_LinearCompare (0x0182)
#define ID_IMC_SetCompareData (0x0183)
#define ID_IMC_SetCompareDataType (0x0188)
#define ID_IMC_GetCompareDataType (0x0189)
#define ID_IMC_SetComparePosType (0x018a)
#define ID_IMC_GetComparePosType (0x018b)
#define ID_IMC_SetMultiDimensComparePara (0x018c)
#define ID_IMC_GetMultiDimensComparePara (0x018d)
#define ID_IMC_SetMultiDimensCompareData (0x018e)
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*----2.2.5 端子板PWM输出控制 ---*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define ID_IMC_SetPwmPara (0x0160)
#define ID_IMC_GetPwmPara (0x0161)
#define ID_IMC_SetPwmFrq (0x0162)
#define ID_IMC_SetPwmDuty (0x0163)
#define ID_IMC_SetPwmOnOff (0x0164)
#define ID_IMC_SetPwmOnDelay (0x0165)
#define ID_IMC_SetPwmOffDelay (0x0166)
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*----2.2.6 PSO控制 ---*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define ID_IMC_SetPSOMode0Para (0x0179)
#define ID_IMC_GetPSOMode0Para (0x017a)
#define ID_IMC_StartPSO (0x017b)
#define ID_IMC_StopPSO (0x017c)
/*==========================================================================*/
/*----3 回零操作接口 ---*/
/*==========================================================================*/
#define ID_IMC_StartHomingInUnit (0x000a)
#define ID_IMC_StartHoming (0x000a)
#define ID_IMC_StopHoming (0x000d)
#define ID_IMC_GetHomingStatus (0x000c)
#define ID_IMC_FinishHoming (0x000b)
#define ID_IMC_StartEcatAxCSPHoming (0x0024)
#define ID_IMC_StopEcatAxCSPHoming (0x0025)
#define ID_IMC_GetEcatAxCSPHomingSts (0x0026)
#define ID_IMC_FinishEcatAxCSPHoming (0x0027)
#define ID_IMC_CloseAutoHomingFinish (0x000f)
/*==========================================================================*/
/*----4 状态管理接口 ---*/
/*==========================================================================*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*----4.2 轴状态管理接口 ---*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define ID_IMC_GetAxPrfMode (0x0308)
#define ID_IMC_GetAxSts (0x0300)
#define ID_IMC_ClrAxSts (0x0301)
#define ID_IMC_GetAxPrfPos (0x0302)
#define ID_IMC_GetAxPrfVel (0x0303)
#define ID_IMC_GetAxPrfAcc (0x0304)
#define ID_IMC_GetAxEncPos (0x0305)
#define ID_IMC_GetAxcOrgEncPos (0x030f)
#define ID_IMC_GetAxEncVel (0x0306)
#define ID_IMC_GetAxEncAcc (0x0307)
#define ID_IMC_GetPrfPos (0x0309)
#define ID_IMC_GetAxType (0x030a)
#define ID_IMC_GetMultiAxArrivalSts (0x0310)
#define ID_IMC_AxServoOn (0x0320)
#define ID_IMC_AxServoOff (0x0323)
#define ID_IMC_AxMoveStop (0x0321)
#define ID_IMC_AxStopInBits (0x0322)
#define ID_IMC_SetAxCurPos (0x0330)
#define ID_IMC_SetAxCompenPos (0x0331)
#define ID_IMC_GetAxCompenPos (0x0332)
#define ID_IMC_SetAxCtrlMode (0x0360)
#define ID_IMC_GetAxCtrlMode (0x0361)
#define ID_IMC_PrfAxTorq (0x0362)
#define ID_IMC_GetAxActTorq (0x0363)
#define ID_IMC_SetAxTorqSlope (0x0364)
#define ID_IMC_GetAxTorqSlope (0x0366)
#define ID_IMC_SetAxTgtTorq (0x0367)
#define ID_IMC_GetAxTgtTorq (0x0368)
#define ID_IMC_GetAxErrCode (0x030d)
#define ID_IMC_GetAxEcatDigitalInput (0x0365)
#define ID_IMC_GetAxBacklashCmpVal (0x0369)
#define ID_IMC_SetEcatAxMaxVelLmt (0x0028)
#define ID_IMC_GetEcatAxMaxVelLmt (0x0029)
#define ID_IMC_SetEcatAxPosTorqLmt (0x002a)
#define ID_IMC_GetEcatAxPosTorqLmt (0x002b)
#define ID_IMC_SetEcatAxNegTorqLmt (0x002c)
#define ID_IMC_GetEcatAxNegTorqLmt (0x002d)
#define ID_IMC_SetEcatAxMaxTorqLmt (0x002e)
#define ID_IMC_GetEcatAxMaxTorqLmt (0x002f)
#define ID_IMC_SyncAxPos (0x030e)
#define ID_IMC_SetAxPressFitCtrlWord (0x0370)
#define ID_IMC_GetAxPressFitSts (0x0371)
#define ID_IMC_GetAxAIInputVal (0x0372)
#define ID_IMC_GetAxPressFeedback (0x0373)
#define ID_IMC_SetAxPressTgtVal (0x0374)
#define ID_IMC_StartAxTorqHoming (0x0380)
#define ID_IMC_StopAxTorqHoming (0x0381)
#define ID_IMC_GetAxTorqHomingSts (0x0382)
#define ID_IMC_FinishAxTorqHoming (0x0383)
#define ID_IMC_StartAxCsvPrf (0x0390)
#define ID_IMC_StopAxCsvPrf (0x0391)
#define ID_IMC_EstopAxCsvPrf (0x0392)
#define ID_IMC_UpdateAxCsvPrf (0x0393)
#define ID_IMC_GetAxCsvPrfStatus (0x0394)
/*==========================================================================*/
/*----5 数据采样接口 ---*/
/*==========================================================================*/
#define ID_IMC_ConfigSamplePara (0x0400)
#define ID_IMC_ConfigSampleData (0x0401)
#define ID_IMC_ConfigSampleEnable (0x0402)
#define ID_IMC_GetSampleStatus (0x0403)
#define ID_IMC_GetSampleData (0x0404)
/*==========================================================================*/
/*----6 轴位置捕获接口 ---*/
/*==========================================================================*/
#define ID_IMC_SetAxCaptMode (0x0340)
#define ID_IMC_GetAxCaptMode (0x0341)
#define ID_IMC_GetAxCaptStatus (0x0342)
/*==========================================================================*/
/*----7 运动模式接口 ---*/
/*==========================================================================*/
#define ID_IMC_SetSingleAxMvPara (0x1000)
#define ID_IMC_GetSingleAxMvPara (0x1001)
#define ID_IMC_SetSingleAxVelType (0x1002)
#define ID_IMC_GetSingleAxVelType (0x1003)
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*----7.1 PTP点位模式接口 ---*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define ID_IMC_StartPtpMove (0x1004)
#define ID_IMC_StartMultiPtpMove (0x1009)
#define ID_IMC_UpdatePtpTgtPos (0x1005)
#define ID_IMC_UpdatePtpMvPara (0x1006)
#define ID_IMC_UpdatePtpTgtVel (0x1008)
#define ID_IMC_PauseMove (0x1030)
#define ID_IMC_ResumeMove (0x1031)
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*----7.2 Jog运动模式接口 ---*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define ID_IMC_StartJogMove (0x1010)
#define ID_IMC_StartMultiJogMove (0x1013)
#define ID_IMC_UpdateJogMvPara (0x1011)
#define ID_IMC_UpdateJogTgtVel (0x1012)
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*----7.3 手轮跟随运动模式接口 ---*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define ID_IMC_EnterHandWheelMode (0x1200)
#define ID_IMC_ExitHandWheelMode (0x1201)
#define ID_IMC_SwitchHandWheelRatio (0x1202)
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*----7.4 电子齿轮 ---*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define ID_IMC_GearSetParam (0x1403)
#define ID_IMC_GearGetParam (0x1404)
#define ID_IMC_GearUpdateScale (0x1405)
#define ID_IMC_GearStart (0x1400)
#define ID_IMC_GearStop (0x1401)
#define ID_IMC_GearGetStatus (0x1402)
#define ID_IMC_GearDestroy (0x1408)
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*----7.5 直角坐标系插补运动模式接口 ---*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define ID_IMC_CrdSetMtSys (0x2500)
#define ID_IMC_CrdGetMtSysParam (0x2501)
#define ID_IMC_CrdDeleteMtSys (0x2502)
#define ID_IMC_CrdSetAdvParam (0x2503)
#define ID_IMC_CrdGetAdvParam (0x2504)
#define ID_IMC_CrdSetTrajVel (0x2528)
#define ID_IMC_CrdSetTrajAcc (0x2529)
#define ID_IMC_CrdSetTrajAccAndDec (0x2537)
#define ID_IMC_CrdSetZeroFlag (0x252a)
#define ID_IMC_CrdSetIncMode (0x252d)
#define ID_IMC_CrdUserVelPlan (0x252f)
#define ID_IMC_CrdSetTrajTol (0x2530)
#define ID_IMC_CrdSetTrajTurnCoef (0x2531)
#define ID_IMC_CrdSetFolVelMode (0x253a)
#define ID_IMC_CrdGetFolVelMode (0x2546)
#define ID_IMC_CrdGetTrajVel (0x2541)
#define ID_IMC_CrdGetTrajAccAndDec (0x2542)
#define ID_IMC_CrdGetZeroFlag (0x2543)
#define ID_IMC_CrdGetIncMode (0x2544)
#define ID_IMC_CrdGetUserVelPlan (0x2545)
#define ID_IMC_CrdLineXYZ (0x2505)
#define ID_IMC_CrdLineXY (0x2506)
#define ID_IMC_CrdLineZX (0x2508)
#define ID_IMC_CrdLineYZ (0x2507)
#define ID_IMC_CrdArcThreePoint (0x2509)
#define ID_IMC_Crd3DArcCenerNormal (0x250a)
#define ID_IMC_Crd3DArcRadiusNormal (0x250e)
#define ID_IMC_Crd3DArcAngleNormal (0x2527)
#define ID_IMC_CrdArcCenterXYPlane (0x250b)
#define ID_IMC_CrdArcCenterYZPlane (0x250c)
#define ID_IMC_CrdArcCenterZXPlane (0x250d)
#define ID_IMC_CrdArcRadiusXYPlane (0x250f)
#define ID_IMC_CrdArcRadiusYZPlane (0x2510)
#define ID_IMC_CrdArcRadiusZXPlane (0x2511)
#define ID_IMC_CrdArcAngleXYPlane (0x2524)
#define ID_IMC_CrdArcAngleYZPlane (0x2525)
#define ID_IMC_CrdArcAngleZXPlane (0x2526)
#define ID_IMC_CrdWaitTime (0x2512)
#define ID_IMC_CrdWaitDI (0x2513)
#define ID_IMC_CrdSetDO (0x2514)
#define ID_IMC_CrdPTPMove (0x2515)
#define ID_IMC_CrdSyncMove (0x2516)
#define ID_IMC_CrdEndData (0x2517)
#define ID_IMC_CrdWaitInPos (0x2538)
#define ID_IMC_CrdSetDistanceDO (0x254b)
#define ID_IMC_CrdSetTimeDO (0x254c)
#define ID_IMC_CrdStart (0x2518)
#define ID_IMC_CrdStop (0x2519)
#define ID_IMC_CrdGetStatus (0x251a)
#define ID_IMC_CrdSetRatio (0x251b)
#define ID_IMC_CrdGetRatio (0x251c)
#define ID_IMC_CrdGetPos (0x251d)
#define ID_IMC_CrdGetVel (0x251e)
#define ID_IMC_CrdGetUserID (0x251f)
#define ID_IMC_CrdGetSpace (0x2520)
#define ID_IMC_CrdClrData (0x2521)
#define ID_IMC_CrdClrError (0x2522)
#define ID_IMC_CrdGetTargetPos (0x2523)
#define ID_IMC_CrdGetPausePos (0x2533)
#define ID_IMC_CrdSetSmoothParam (0x252b)
#define ID_IMC_CrdGetSmoothParam (0x252c)
#define ID_IMC_CrdGetArrivalSts (0x2539)
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*----7.6 PTP连续运动模式接口 ---*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define ID_IMC_PTPCAddFixTData (0x1021)
#define ID_IMC_PTPCAddFixVmData (0x1022)
#define ID_IMC_PTPCInterruptData (0x1025)
#define ID_IMC_PTPCStart (0x1020)
#define ID_IMC_PTPCGetSpace (0x1023)
#define ID_IMC_PTPCClrData (0x1024)
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*----7.7 多轴同步运动模式接口 ---*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define ID_IMC_SetupMutiSyncSys (0x2000)
#define ID_IMC_GetMutiSyncSysInfo (0x2011)
#define ID_IMC_DeleteMutiSyncSys (0x2001)
#define ID_IMC_MutiSyncMotion (0x200c)
#define ID_IMC_MutiSyncMotionInRatio (0x200c)
#define ID_IMC_MutiSyncMotionLookaheadInRatio (0x2014)
#define ID_IMC_MutiSyncMotionInAxVelAcc (0x2012)
#define ID_IMC_MutiSyncMotionLookaheadInAxVelAcc (0x2015)
#define ID_IMC_MutiSyncMotionInSynVelAcc (0x2013)
#define ID_IMC_MutiSyncMotionLookaheadInSynVelAcc (0x2016)
#define ID_IMC_MutiSyncMotionInAccDecTime (0x2018)
#define ID_IMC_MutiSyncMotionInRunTime (0x2019)
#define ID_IMC_MutiSyncStart (0x2006)
#define ID_IMC_MutiSyncStop (0x2007)
#define ID_IMC_MutiSyncGetStatus (0x200b)
#define ID_IMC_MutiSyncSetRatio (0x2004)
#define ID_IMC_MutiSyncGetRatio (0x2005)
#define ID_IMC_MutiSyncGetUserID (0x2008)
#define ID_IMC_MutiSyncGetSpace (0x2009)
#define ID_IMC_MutiSyncClrData (0x200a)
#define ID_IMC_MutiSyncClrError (0x2010)
#define ID_IMC_MutiSyncSetType (0x200e)
#define ID_IMC_MutiSyncGetType (0x200f)
#define ID_IMC_MutiSyncGetTrajVel (0x2017)
#define ID_IMC_MutiSyncGetArrivalSts (0x201a)
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*----7.8 多轴插补立即运动模式接口 ---*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define ID_IMC_ImmediateLineMoveInSynVelAcc (0x2900)
#define ID_IMC_ImmediateLineMoveInAxisVelAcc (0x2901)
#define ID_IMC_ImmediateArcThreePointMove (0x2904)
#define ID_IMC_ImmediateArcCenterMove (0x2905)
#define ID_IMC_ImmediateArcRadiusMove (0x2906)
#define ID_IMC_ImmediateArcAngleMove (0x2907)
#define ID_IMC_ImmediateMoveGetVel (0x2908)
#define ID_IMC_ImmediateMoveStop (0x2902)
#define ID_IMC_ImmediateMoveEStop (0x2903)
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*----7.9 周期运动接口 ---*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define ID_IMC_SetCycleMovePara (0x1700)
#define ID_IMC_GetCycleMovePara (0x1701)
#define ID_IMC_StartCycleMove (0x1702)
#define ID_IMC_StopCycleMove (0x1703)
#define ID_IMC_GetCycleMovePrfPos (0x1704)
#define ID_IMC_GetCycleMoveEncPos (0x1705)
#define ID_IMC_SetCycleMoveCurPos (0x1706)
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*----7.10 捆绑PT运动模式接口 ---*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#define ID_IMC_SetupPtPackSys (0x1920)
#define ID_IMC_AddMotionPointPtPack (0x1921)
#define ID_IMC_AddDoPointPtPack (0x1929)
#define ID_IMC_StartPtPack (0x1922)
#define ID_IMC_StopPtPack (0x1923)
#define ID_IMC_GetPtPackRestSpace (0x1924)
#define ID_IMC_GetPtPackStatus (0x1925)
#define ID_IMC_DeletePtPackSys (0x1927)
#define ID_IMC_ClrPtPackData (0x1928)
#define ID_IMC_SetPtPackIncMode (0x192a)
#define ID_IMC_GetPtPackIncMode (0x192b)
#define ID_IMC_EnablePtPackNoDataProtect (0x192c)
#define ID_IMC_DisablePtPackNoDataProtect (0x192d)
#define ID_IMC_GetPtPackNoDataProtectStatus (0x192e)
#define ID_IMC_ClrPtPackError (0x192f)
#define ID_IMC_GetPtPackError (0x1930)
#define ID_IMC_PtPackGetArrivalSts (0x1932)
/*==========================================================================*/
/*----8 事件管理接口 ---*/
/*==========================================================================*/
#define ID_IMC_SetEventIO (0x1600)
#define ID_IMC_GetEventIO (0x1601)
#define ID_IMC_EnableEventIO (0x1602)
#define ID_IMC_DisableEventIO (0x1603)
#define ID_IMC_SetEventDiMotion (0x1610)
#define ID_IMC_GetEventDiMotion (0x1611)
#define ID_IMC_EnableEventDiMotion (0x1612)
#define ID_IMC_DisableEventDiMotion (0x1613)
#define ID_IMC_GetEventDiMotionSts (0x1614)
#define ID_IMC_ClearEventDiMotionSts (0x1615)
#define ID_IMC_SetEventCompareOut (0x1620)
#define ID_IMC_GetEventCompareOut (0x1621)
#define ID_IMC_EnableEventCompareOut (0x1622)
#define ID_IMC_DisableEventCompareOut (0x1623)
#define ID_IMC_SetEventVirtualIOVal (0x1630)
#define ID_IMC_GetEventVirtualIOVal (0x1631)
#define ID_IMC_GetEventVirtualIOUseSts (0x1632)
#define EXE_SUCCESS (0x0000) // 指令成功
#define ERR_TRANSMIT (0x0001) // 指令传输错误
#define ERR_UNKNOWN (0x0002) // 不支持的指令
#define ERR_PARSE (0x0003) // 指令解析错误
#define ERR_BGVEL_OUTRANG (0x0010) // 起始速度设置超出范围
#define ERR_MAXVEL_OUTRANG (0x0011) // 最大速度设置超出范围
#define ERR_MAXACC_OUTRANG (0x0012) // 最大加速度设置超出范围
#define ERR_MAXDEC_OUTRANG (0x0013) // 最大减速度设置超出范围
#define ERR_MAXJERK_OUTRANG (0x0014) // 最大加加速度设置超出范围
#define ERR_STOPDEC_OUTRANG (0x0015) // 平滑停止速度设置超出范围
#define ERR_ESTOPDEC_OUTRANG (0x0016) // 急停速度设置超出范围
#define ERR_VEL_OUTRANG (0x0017) // 运行速度设置超出范围
#define ERR_ACC_OUTRANG (0x0018) // 运行加速度设置超出范围
#define ERR_DEC_OUTRANG (0x0019) // 运行减速度设置超出范围
#define ERR_RATIO_OUTRANG (0x001a) // 倍率设置超出范围
#define ERR_TGTPOS_OUTRANG (0x001b) // 目标位置设置超出范围
#define ERR_INDEX_OUTRANG (0x001c) // 索引号设置超出范围
#define ERR_DIMDL_NUM_OUTRANG (0x001d) // 设置ECAT的DI超出DI模块数量范围
#define ERR_DOMDL_NUM_OUTRANG (0x001e) // 设置ECAT的DO超出DO模块数量范围
#define ERR_AIMDL_NUM_OUTRANG (0x001f) // 设置ECAT的AI超出AI模块数量范围
#define ERR_AOMDL_NUM_OUTRANG (0x0020) // 设置ECAT的AO超出AO模块数量范围
#define ERR_NO_ECAT_DO (0x0021) // ECAT未配置DO模块
#define ERR_NO_ECAT_DI (0x0022) // ECAT未配置DI模块
#define ERR_NO_ECAT_AO (0x0023) // ECAT未配置AO模块
#define ERR_NO_ECAT_AI (0x0024) // ECAT未配置AI模块
#define ERR_NO_ECAT_ENC (0x0025) // ECAT未配置ENC模块
#define ERR_TYPE_PARA (0x0026) // 指令中类型参数错误
#define ERR_OUTCHN_PARA (0x0027) // 输出通道参数错误
#define ERR_ALRM_ENABLE (0x0028) // 报警使能参数非0或1
#define ERR_SOFTLMT_ENABLE (0x0029) // 软限位使能参数非0或1
#define ERR_HWLMT_ENABLE (0x002a) // 硬限位使能参数非0或1
#define ERR_ERRLMT_ENABLE (0x002b) // 跟随误差报警使能参数非0或1
#define ERR_COUNT_OUTRANG (0x002c) // 数量的参数超出规定范围
#define ERR_HOME_FLTTIME (0x002e) // HOME滤波参数错误
#define ERR_LIMIT_FLTTIME (0x002f) // LIMIT滤波参数错误
#define ERR_PROBE_FLTTIME (0x0030) // PROBE滤波参数错误
#define ERR_INVERSE_PARA (0x0031) // 取反参数非0或1
#define ERR_MODE_PARA (0x0032) // 指令中模式参数错误
#define ERR_LEVEL_PARA (0x0033) // 指令电平参数非0或1
#define ERR_SRC_PARA (0x0034) // 指令源参数错误,不在规定范围
#define ERR_TRIG_SNS (0x0035) // 触发电平参数非0或1
#define ERR_CYCTIME (0x0036) // 设置规划周期参数不在规定范围
#define ERR_FLAG_PARA (0x0037) // 标志参数设置非0或1
#define ERR_ONOFF_PARA (0x0038) // 开关参数设置非0或1
#define ERR_SV_ALARM (0x0039) // 伺服报警
#define ERR_SV_OFF (0x003a) // 掉使能报警
#define ERR_TERMINAL_NOLINK (0x003b) // 端子板通讯失败
#define ERR_AX_BUSY (0x003c) // 轴正处于规划中
#define ERR_ST_HOMING (0x003d) // 启动回零错误,该轴配置成了虚轴
#define ERR_SAMPLE_COUNT (0x003e) // 采样数据的个数不对
#define ERR_SAMPLE_BUSY (0x003f) // 采样正忙,不能配置参数
#define ERR_SAMPLE_DATATYPE (0x0040) // 采样数据的类型不存在
#define ERR_SAMPLE_INDEX (0x0041) // 采样数据的下标越界
#define ERR_SAMPLE_DRAW_DATA (0x0042) // 读取采样数据失败
#define ERR_HOMING_AX_TYPE (0x0043) // 回零的轴类型不对,非端子板轴
#define ERR_HOMING_MODE (0x0044) // 回零的模式不对,不在回零范围内
#define ERR_HOMING_POS_SRC (0x0045) // 端子板轴回零的位置来源参数设置不在范围内
#define ERR_HOMING_MAXTIME (0x0046) // 判断回零等待超时最短时间不能小于1s
#define ERR_HOMING_NO_READY (0x0047) // 回零参数未设置好错误
#define ERR_HANDWHEEL_BUSY (0x0048) // 手轮处于忙状态
#define ERR_HANDWHEEL_M_INDEX (0x0049) // 手轮主跟随编码器的序号不在范围内
#define ERR_NO_HANDWHEEL_MODE (0x004a) // 非手轮模式
#define ERR_HANDWHEEL_M_MOVE (0x004b) // 手轮主跟随编码器的在进入手轮前就在运动
#define ERR_COMP_DIMENS (0x004c) // 位置比较的维数错误
#define ERR_COMP_SRC_NO (0x004d) // 位置比较的位置源端口号超出范围
#define ERR_COMP_SRC_TYPE (0x004e) // 位置比较的源类型错误
#define ERR_COMP_PULSE_WIDTH (0x004f) // 位置比较的脉冲输出宽度
#define ERR_COMP_OUTVAL (0x0050) // 位置比较的立即输出值不在范围内
#define ERR_COMP_CTRLMODE (0x0051) // 位置比较输出的控制模式参数设置错误
#define ERR_COMP_INTERVAL (0x0052) // 位置等距比较输出的间距值小于1个pulse
#define ERR_COMP_REPEATTIME (0x0053) // 位置等距比较输出的次数小于1次
#define ERR_COMP_BUSY (0x0054) // 位置比较输出忙
#define ERR_ECAT_CAPT_DISEN (0x0055) // ECAT捕获未使能
#define ERR_PARA_LESS_ZERO (0x0056) // 参数设置小于0
#define ERR_PWM_DUTY_OUTRANG (0x0057) // PWM设置的占空比超限
#define ERR_PWM_FRQ_LESS_ZERO (0x0058) // PWM设置的频率小于0
#define ERR_PWM_NO_RIGHT_MODE (0x0059) // PWM模式错误
#define ERR_BACKLASH_CMPVAL (0x005a) // 反向间隙总补偿量设置小于0
#define ERR_BACKLASH_CMPVEL (0x005b) // 反向间隙补偿量速度小于0
#define ERR_BACKLASH_CMPDIR (0x005c) // 反向间隙补偿方向错误
#define ERR_AX_NO_BOND (0x005d) // 轴未绑定物理输出端
#define ERR_AX_BOND_SAME_CHN (0x005e) // 轴绑定了相同的一个物理轴
#define ERR_LOCAL_DI_FLTTIME (0x005f) // DI滤波参数错误
#define ERR_COUNT_IS_BONDED (0x0060) // 清除的内部计数通道被绑定轴上了
#define ERR_ENC_IS_BONDED (0x0061) // 清除的编码器计数通道被绑定轴上了
#define ERR_AX_IS_MASKED_TO_CRD (0x0062) // 轴已映射至插补坐标系
#define ERR_PRF_IN_WRONG_MODE (0x0063) // 在错误模式下执行
#define ERR_CRD_NOT_EXIST (0x0064) // 坐标系不存在
#define ERR_TOL_OUTRANG (0x0065) // 坐标系精度参数设置错误
#define ERR_CRD_COPLAN_PARA (0x0066) // 坐标系异面过渡参数设置错误
#define ERR_CRD_TURN_PARA (0x0067) // 坐标系拐弯系数设置错误
#define ERR_CRD_TRANSMODE_PARA (0x0068) // 坐标系过渡模式设置错误
#define ERR_CRD_NODATA_PROTECT_PARA (0x0069) // 坐标系数据断流保护参数错误
#define ERR_CRD_ARC_ACC_PARA (0x006a) // 坐标系圆弧变加速参数设置错误
#define ERR_CRD_TRAJ_TYPE_PARA (0x006b) // 坐标系速度规划类型参数设置错误
#define ERR_CRD_FATAL_DATA_ERR (0x006c) // 坐标系压入数据致命错误
#define ERR_CRD_DO_TYPE (0x006d) // 坐标系压入的DO类型错误
#define ERR_CRD_LOOKAHEAD_LEN (0x006f) // 坐标系前瞻长度设置错误
#define ERR_CRD_SGL_FLT_DEPTH (0x0070) // 坐标系单轴滤波参数错误
#define ERR_CRD_SGL_CTRL_TOL (0x0071) // 坐标系单轴控制精度参数错误
#define ERR_CRD_MASK_SAME_AXNO (0x0073) // 坐标系输出轴映射到相同端口错误
#define ERR_CRD_MASK_AXNO_OUTRANG (0x0074) // 坐标系输出轴映射号超出范围
#define ERR_CRD_REPEATED_CREATED (0x0075) // 坐标系重复创建
#define ERR_CRD_CREATE_FAILED (0x0076) // 坐标系创建失败
#define ERR_CRD_BUSY (0x0077) // 坐标系正处于规划中
#define ERR_CRD_SMOOTH_COEF (0x0078) // 坐标系平滑系数设置错误
#define ERR_CRD_BUF_FULL (0x0079) // 坐标系数据缓冲区满
#define ERR_CRD_BUF_DATA_PARA (0x007a) // 坐标系缓冲区指令参数错误
#define ERR_CRD_BUF_DATA_GEOM (0x007b) // 坐标系缓冲区指令几何构造错误
#define ERR_CRD_DOWNLOAD_DATA (0x007c) // 坐标系缓冲区指令下发底层失败
#define ERR_CRD_PAUSE_POS_CHANGE (0x007d) // 坐标系暂停后,位置被改变
#define ERR_FORBID_SVON (0x007e) // 禁止使能报警
#define ERR_AX_CRD_CONFLICT (0x007f) // 单轴和插补运动冲突报警
#define ERR_DIS_ERR (0x0080) // 坐标系输入线段弧长过短
#define ERR_CRD_EXT_AX_CONFLICT (0x0081) // 缓存同步事件设置轴号运动冲突
#define ERR_CRD_RUN_ERR (0x0082) // 坐标系运行报警错误,需要清除才能再次启动或者压入数据
#define ERR_CRD_ARC_DIR_PARA (0x0083) // 坐标系中圆弧运动的方向参数错误
#define ERR_CRD_SYNC_ERROR (0x0084) // 坐标系中同步运动无法完成
#define ERR_CRD_BUF_NOT_EPMTY (0x0085) // 坐标系参数设置未满足缓冲区数据为空要求
#define ERR_CRD_MODE_UNMACHED (0x0086) // 坐标系不匹配的插补模式,如:非用户规划模式
#define ERR_CRD_ALL_BUSY (0x0087) // 坐标系所有均繁忙
#define ERR_AX_NOT_EXIST (0x0088) // 单轴未参与任何一个插补坐标系
#define ERR_CRDIN_GEOM_ERR (0x0089) // 立即插补几何错误
#define ERR_CRD_INLINE (0x008a) // 圆弧三点共线
#define ERR_CRD_NORMAL_TOO_SHORT (0x008b) // 圆弧输入的法向量太短
#define ERR_CRD_RADIUS_TOO_SHORT (0x008c) // 圆弧输入的半径太短
#define ERR_CRD_NORMAL_ANGLE (0x008d) // 圆弧输入的法向量角度错误
#define ERR_CRD_RADIUS_ERR (0x008e) // 特指圆弧半径输入模式下,半径小于首点到末点长度的一半
#define ERR_LENGTH_OUTRANG (0x0090) // 设置的长度单位不在范围
#define ERR_SOFTLMT_POS_LESS_NEG (0x0091) // 软正限位设置比软负限位小错误
#define ERR_SAMPLE_INTERVAL (0x0092) // 数据采样配置间隔参数错误
#define ERR_SAMPLE_TRIG_TYPE (0x0093) // 数据采样配置触发采样类型参数错误
#define ERR_SAMPLE_DELAY_PARA (0x0094) // 数据采样配置启动延时参数错误
#define ERR_SAMPLE_DI_NO (0x0095) // 数据采样配置DI触发端口错误
#define ERR_SAMPLE_DI_LEVEL (0x0096) // 数据采样配置DI触发电平错误
#define ERR_RESET_IS_PERMIT (0x0097) // 系统复位条件不足,检查是否还在使能
#define ERR_GANTRY_IS_USING (0x0098) // 龙门正在使用中
#define ERR_GANTRY_AXNO_CONFLICT (0x009f) // 配置龙门的轴号各组有冲突
#define ERR_GANTRY_ERRORLMT_LESS_ZERO (0x0099) // 龙门主从轴误差极限值小于0
#define ERR_GANTRY_ERROR_OUT_LIMIT (0x009a) // 龙门主从轴误差大于设定极限
#define ERR_GANTRY_SLAVE_FORBID_PRF (0x009b) // 龙门从轴禁止规划
#define ERR_GANTRY_AX_EQU_DIFF (0x009c) // 龙门主从轴的当量不一致
#define ERR_GANTRY_AX_SV_STS_DIFF (0x009d) // 龙门主从轴的伺服状态不一致
#define ERR_ECAT_DA_VAL (0x009e) // ECAT总线的DA值设置范围超限
#define ERR_SYNCMOVE_NOT_EXIST (0x00a0) // 多轴系统未建立
#define ERR_SYNCMOVE_HAVE_EXISTED (0x00a1) // 多轴系统重复创建
#define ERR_SYNCMOVE_COUNT (0x00a2) // 多轴系统轴映射总数量不在范围内
#define ERR_SYNCMOVE_MAP (0x00a3) // 多轴系统轴映射错误
#define ERR_SYNCMOVE_RATIO (0x00a4) // 多轴系统比率设定范围错误
#define ERR_SYNCMOVE_AXNO_REPEATED (0x00a5) // 多轴系统的映射轴有重复
#define ERR_SYNCMOVE_AXNO_OUTRANG (0x00a6) // 多轴系统的映射轴不在系统范围
#define ERR_AX_MULTI_SYNC_CONFLICT (0x00a7) // 多轴系统中的轴与单轴运动冲突
#define ERR_AX_IS_SET_MULTI_PRF (0x00a8) // 当前轴已设置为多轴或插补规划模式,不能再次设置
#define ERR_SYNCMOVE_PAUSE_POS_CHANGE (0x00a9) // 多轴系统暂停后,位置被改变
#define ERR_SYNCMOVE_ALARM (0x00aa) // 多轴系统有报警,不允许启动
#define ERR_HOMING_METHOD (0x00b0) // 回零方式错误
#define ERR_NO_ECAT_SV (0x00b1) // 非ECAT伺服轴
#define ERR_CST_GANTRY_FORBID (0x00b2) // 龙门控制,不允许伺服为转矩模式
#define ERR_CTRL_MODE (0x00b3) // 错误控制模式
#define ERR_TGTTRQ_OUTRANG (0x00b4) // 目标转矩设置超出范围
#define ERR_TRQ_CHANGE_TIME_LESS_ZERO (0x00b5) // 目标转矩的改变时间参数小于0
#define ERR_FORBID_POS_PRF_IN_CST (0x00b6) // 禁止在CST模式下进行位置规划
#define ERR_SV_MODE_PDO_NO_CFG (0x00b7) // ECAT伺服的模式PDO对象未配置
#define ERR_AX_IS_IN_HOMING (0x00b8) // 轴正处于回零状态
#define ERR_HW_ESTP_IS_TRIG (0x00b9) // 硬件急停信号触发
#define ERR_ACT_TORQ_PDO_NO_CFG (0x00ba) // ECAT伺服的实际转矩PDO对象未配置
#define ERR_TOUCH_PROBE_PDO_NO_CFG (0x00bb) // ECAT伺服的探针捕获相关PDO对象未配置
#define ERR_AX_MV_DIR_LIMT_TRIG (0x00bc) // 轴运动方向的限位触发
#define ERR_AX_FOLLOW_ERROR (0x00bd) // 轴跟随误差报警
#define ERR_AX_STATUS_ERROR (0x00be) // 轴状态错误,调用查询轴状态指令获取具体信息
#define ERR_SET_TIME (0x00c0) // 时间类参数设置错误
#define ERR_PVT_LIST (0x00c1) // PVT表参数设置错误
#define ERR_PVT_LOOP (0x00c2) // PVT循环次数参数设置错误
#define ERR_PVT_PARAM (0x00c3) // PVT数据参数输入错误
#define ERR_PVT_TABLE_BUSY (0x00c4) // PVT当前表被占用
#define ERR_PVT_TABLE_INVALID (0x00c5) // PVT当前表类型不匹配
#define ERR_PVT_TABLE_FULL (0x00c6) // PVT表FIFO数据满
#define ERR_PVT_TABLE_NULL (0x00c7) // PVT表数据为NULL
#define ERR_NOT_PVT_MODE (0x00c8) // 非PVT模式下,不能访问
#define ERR_FOL_SCALE (0x00d1) // FOL齿数输入有误
#define ERR_FOL_MASTER_NO (0x00d2) // FOL主轴轴号输入有误
#define ERR_FOL_LMT_POS (0x00d3) // FOL从轴跟随位置有误
#define ERR_PTPC_MOVE_PARAM (0x00d4) // PTP缓存模式运动参数有误
#define ERR_EDVEL_OUTRANG (0x00d5) // 结束速度有问题
#define ERR_FIFO_FULL (0x00d6) // 队列数据满
#define ERR_FIFO_EMPTY (0x00d7) // 队列数据空
#define ERR_FIFO_STPOS_DIFF_CURPOS (0x00d8) // 队列起始位置与当前位置不一致
#define ERR_NOT_HOMING_MODE (0x00d9) // 非回零规划模式
#define ERR_GEAR_UPDATE_SCALE (0x00da) // 电子齿轮更新比例失败
#define ERR_FOL_SLOPE_LEES_ZERO (0x00db) // FOL的主轴离合区值小于0
#define ERR_PROBE_BIT_OUTRANGE (0x00dc) // 设置轴ECAT探针对应bit不在0~31中
#define ERR_ENC_FILTER_DEPTH (0x00e0) // 编码器滤波深度参数错误
#define ERR_ENC_FILTER_COEF (0x00e1) // 编码器滤波系数参数错误
#define ERR_COMPARE_BUF_EMPTY (0x00e2) // 位置比较缓冲区数据为空
#define ERR_COMPARE_DATA_INVERSE (0x00e3) // 位置比较设置的比较数据出现反向
#define ERR_COMPARE_POS_TYPE (0x00e4) // 等距比较数据不允许在绝对位置比较类型下压入
#define ERR_COMPARE_DATA_TYPE (0x00e5) // 等距比较数据不允许在动态数据类型下压入
#define ERR_AX_HW_NOT_EXIST (0x00e6) // 设置的物理轴不存在
#define ERR_TGTPOS_OVER_SOFTLMT (0x00e7) // 目标位置超出了软限位范围
#define ERR_BACKLASH_VAL_NOT_ZERO (0x00e8) // 当前反向间隙补偿的值不为0,不能再次修改设置反向间隙值
#define ERR_WRONG_HOMING_MODE (0x00e9) // 调用错误回零完成指令
#define ERR_AX_COMPEN_BUSY (0x00ea) // 轴补偿进行中
#define ERR_MULTI_COMPARE_UNSUPPORTED (0x00eb) // 多维位置比较不支持错误
#define ERR_WAIT_TIME_PARA (0x00f2) // 等待事件类型参数错误
#define ERR_CYCMV_PARA_NOT_SET (0x00f3) // 周期运动的参数未设置,不能启动
#define ERR_NOT_CYCMV_MODE (0x00f4) // 非周期模式下操作
#define ERR_HOMING_DIR_PARA (0x00f5) // 回零方向参数错误
#define ERR_HOMING_LEVEL_PARA (0x00f6) // 回零触发沿参数错误
#define ERR_CSV_PRF_NOT_START (0x00f7) // CSV规划没有启动
#define ERR_CSV_IN_PRFING (0x00f8) // CSV在规划中,不允许切换到CSP下
#define ERR_NO_TERMINAL_CFG (0x00f9) // 端子板没有配置,不允许访问
#define ERR_OFFSET_PARA (0x00fa) // 偏置参数不在范围
#define ERR_PTP_NOT_PAUSE (0x00fb) // PTP无暂停动作
#define ERR_PTP_STOPPED (0x00fc) // PTP运动已停止,不能调用Pause指令
#define ERR_VERSION_TOO_LOW (0x0100) // dll库版本比控制器版本低
#define ERR_CST_HANDWHEEL_FORBID (0x0101) // 手轮控制,不允许伺服为转矩模式
#define ERR_GANTRY_NOT_SETUP (0x0102) // 龙门关系尚未建立
#define ERR_WATCHDOG_TIME_LESS_ZERO (0x0103) // 看门狗设置时间小于0
#define ERR_MULTI_PTP_AXNUM (0x0104) // 多轴同时启动PTP的个数小于1
#define ERR_MULTI_JOG_AXNUM (0x0105) // 多轴同时启动JOG的个数小于1
#define ERR_WATCHDOG_NOT_OPENED (0x0106) // 看门狗未开启
#define ERR_WRONG_MODE_OPERATIONG (0x0107) // 错误模式下操作
#define ERR_NO_SYS_INT_SIGNAL (0x0108) // 系统中断没有起来,请检查总线是否处于OP状态
#define ERR_GET_SYS_HW_RES (0x0109) // 获取系统硬件资源失败:如端子板资源或ECAT资源
#define ERR_TORQ_SLP_PDO_NO_CFG (0x0110) // ECAT伺服的转矩斜坡PDO对象未配置
#define ERR_TGT_TORQ_PDO_NO_CFG (0x0111) // ECAT伺服的目标转矩PDO对象未配置
#define ERR_PRESS_CTRL_PDO_NO_CFG (0x0112) // ECAT伺服中的压合控制对象未配置(SV510)
#define ERR_PRESS_STS_PDO_NO_CFG (0x0113) // ECAT伺服中的压合状态对象未配置(SV510)
#define ERR_PRESS_VAL_PDO_NO_CFG (0x0114) // ECAT伺服中的压力反馈对象未配置(SV510)
#define ERR_AI1_VOLT_PDO_NO_CFG (0x0115) // ECAT伺服中的电压1输入对象未配置(SV510)
#define ERR_AI2_VOLT_PDO_NO_CFG (0x0116) // ECAT伺服中的电压2输入对象未配置(SV510)
#define ERR_NO_ECAT_PT (0x0117) // ECAT未配置PT模块
#define ERR_PRESS_SETVAL_PDO_NO_CFG (0x0118) // ECAT伺服中的目标压合力设置对象未配置(SV510)
#define ERR_MAXVEL_PDO_NO_CFG (0x0119) // ECAT伺服中的最大速度限制设置对象未配置
#define ERR_POS_TORQ_LMT_PDO_NO_CFG (0x011a) // ECAT伺服中的正向转矩限制设置对象未配置
#define ERR_NEG_TORQ_LMT_PDO_NO_CFG (0x011b) // ECAT伺服中的负向转矩限制设置对象未配置
#define ERR_MAX_TORQ_LMT_PDO_NO_CFG (0x011c) // ECAT伺服中的最大转矩限制设置对象未配置
#define ERR_MPG_NOT_CFG (0x011d) // ECAT的手轮模块没有配置对象
#define ERR_MPG_NOT_ENABLE (0x011e) // ECAT的手轮模块没有使能
#define ERR_EVENT_IO_INTYPE (0x0120) // IO事件的输入类型错误
#define ERR_EVENT_IO_INPORT (0x0121) // IO事件的输入端口错误
#define ERR_EVENT_IO_IN_INVERT (0x0122) // IO事件的输入取反值错误
#define ERR_EVENT_IO_OPERTOR (0x0123) // IO事件的输入操作符错误
#define ERR_EVENT_IO_OUTTYPE (0x0124) // IO事件的输出类型错误
#define ERR_EVENT_IO_OUT_INVERT (0x0125) // IO事件的输出取反值错误
#define ERR_EVENT_IO_OUTPORT (0x0126) // IO事件的输出端口号错误
#define ERR_EVENT_IO_TRIG_TYPE (0x0127) // IO事件的触发类型错误
#define ERR_EVENT_IO_DELAY (0x0128) // IO事件的延时值小于0
#define ERR_EVENT_IO_ACTIVE_TYPE (0x0129) // IO事件的激活类型错误
#define ERR_EVENT_IO_PARA_NO_SET (0x012a) // IO事件的参数没有设置,不能使能
#define ERR_EVENT_DIMT_INTYPE (0x0130) // DI触发运动事件的输入类型错误
#define ERR_EVENT_DIMT_INPORT (0x0131) // DI触发运动事件的输入端口错误
#define ERR_EVENT_DIMT_AXNO (0x0132) // DI触发运动事件的触发轴号超出范围
#define ERR_EVENT_DIMT_DELAY (0x0133) // DI触发运动事件的延时值小于0
#define ERR_EVENT_DIMT_TGTVEL (0x0134) // DI触发运动事件设置的目标速度小于0
#define ERR_EVENT_DIMT_ACC (0x0135) // DI触发运动事件设置的加速度小于0
#define ERR_EVENT_DIMT_DEC (0x0136) // DI触发运动事件设置的减速度小于0
#define ERR_EVENT_DIMT_TGTPOS (0x0137) // DI触发运动事件设置的目标位置超限
#define ERR_EVENT_DIMT_INVERTBIT (0x0138) // DI触发运动事件设置的取反标志非0和1
#define ERR_EVENT_DIMT_MOTION_TYPE (0x0139) // DI触发运动事件设置的运动类型错误
#define ERR_EVENT_DIMT_TRIGGER_TYPE (0x013a) // DI触发运动事件设置的触发类型错误
#define ERR_EVENT_DIMT_PARA_NO_SET (0x013b) // DI触发运动事件的参数没有设置,不能使能
#define ERR_EVENT_CMPOUT_INTYPE (0x0140) // 比较位置输出事件的输入类型错误
#define ERR_EVENT_CMPOUT_PORT (0x0141) // 比较位置输出事件的输出源端口号超出范围
#define ERR_EVENT_CMPOUT_OUTPORT (0x0142) // 比较位置输出事件的输出DO端口超出范围
#define ERR_EVENT_CMPOUT_OUTTYPE (0x0143) // 比较位置输出事件的输出类型错误
#define ERR_EVENT_CMPOUT_OUTVAL (0x0144) // 比较位置输出事件的输出值错误
#define ERR_EVENT_CMPOUT_CMPTYPE (0x0145) // 比较位置输出事件的比较类型参数错误
#define ERR_EVENT_CMPOUT_PLSWIDTH (0x0146) // 比较位置输出事件的脉冲输出脉宽小于0
#define ERR_EVENT_CMPOUT_CMPPOS (0x0147) // 比较位置输出事件的比较位置超出范围
#define ERR_EVENT_VIRTUAL_IO_VAL (0x0148) // 事件虚拟IO的值设置错误
#define ERR_EVENT_VIRTUAL_IO_DISABLE (0x0149) // 事件虚拟被禁用,不能作为输出使用
#define ERR_EVENT_CMPOUT_PARA_NO_SET (0x014a) // 比较位置输出事件的参数没有设置,不能使能
#define ERR_PSO_DIMENS (0x0150) // PSO的维数参数错误
#define ERR_PSO_PULSE_WIDTH (0x0151) // PSO的脉冲输出宽度错误
#define ERR_PSO_SRC_NO (0x0152) // PSO的位置源序号错误
#define ERR_PSO_SRC_TYPE (0x0153) // PSO的位置源类型错误
#define ERR_PSO_SYN_POS (0x0154) // PSO的同步比较输出间距错误
#define ERR_SCREWCMP_DIR (0x0200) // 螺距补偿方向设置错误
#define ERR_SCREWCMP_INTERVAL (0x0201) // 螺距补偿间隔为负
#define ERR_SCREWCMP_TABLE_NUM (0x0202) // 螺距补偿的数据表数量超限
#define ERR_SCREWCMP_ST_BIGGER_END (0x0203) // 螺距补偿的正向补偿起始位置大于终止位置
#define ERR_SCREWCMP_CALC_INTERVAL (0x0204) // 螺距补偿设置的起始和终止位置以及点数计算的间隔距离非整数
#define ERR_BANDPT_COUNT (0x0210) // 绑定PT轴映射总数量不在范围内
#define ERR_BANDPT_AXNO_OUTRANG (0x0211) // 绑定PT轴超过范围
#define ERR_BANDPT_AXNO_REPEATED (0x0212) // 绑定PT轴重复
#define ERR_AX_IS_SET_BANDPT_PRF (0x0213) // 轴已经设成绑定PT模式
#define ERR_BANDPT_NOT_EXIST (0x0214) // 绑定PT系统轴没有建立
#define ERR_BANDPT_BEYOND_MAXCNT (0x0215) // 绑定PT输入数据量超过最大限制
#define ERR_BANDPT_ERR (0x0216) // 绑定PT处于错误状态
//电子凸轮错误
#define ERR_ECAM_TABLE_FULL (0x0250) // 电子凸轮数据表满
#define ERR_ECAM_POS (0x0251) // 凸轮位置错误
#define ERR_ECAM_TABLE_BUSY (0x0252) // 凸轮表被占用
#define ERR_ECAM_TABLE_NULL (0x0253) // 凸轮表无数据
#define ERR_ECAM_EVENT_MASTER_POS (0x0254) // 凸轮表事件输入主轴位置错误
#define ERR_ECAM_LIST_TABLE (0x0255) // 凸轮表list中的表号有误
#define ERR_ECAM_LIST_FULL (0x0256) // 凸轮表list表号已放满
#define ERR_ECAM_MASTER_SLAVE_PARAM (0x0257) // 凸轮表设置参数主从属性参数设置错误
#define ERR_ECAM_TABLE_PARAM (0x0258) // 凸轮表设置参数错误
#define ERR_ECAM_START_CONDITION (0x0259) // 凸轮启动条件参数设置错误
#define ERR_ECAM_NOT_START (0x025a) // 凸轮还未启动
#define ERR_ECAM_ALARM (0x025b) // 凸轮报警
#define ERR_ECAM_LIST_TABLE_NULL (0x025c) // 凸轮list无表
#define ERR_ECAM_LIST_BUSY (0x025d) // 凸轮list被占用
#define ERR_ECAM_LIST_TABLE_DATA_FORMAT (0x025e) // 凸轮list模式中表格式错误
//非标错误
#define ERR_READGCODE_DU (0x7000) // 重复检测
#define ERR_READGCODE_REACH_MAXLINE (0x7001) // 文件行数过多
#define ERR_READGCODE_NO_FILE (0x7002) // 文件不存在
#define ERR_ESTIMATE_INACTIVE (0x7003) // 时间估算未激活
#define ERR_DEVICE (0x8000) // 错误参数输入
#define ERR_INPUT (0x8001) // 错误指针参数输入
#define ERR_CARDNO (0x8002) // 错误卡号
#define ERR_MEM1ALLOC (0x8003) // 分配全局内存1错误
#define ERR_MEM2ALLOC (0x8004) // 分配全局内存2错误
#define ERR_MEM3ALLOC (0x8005) // 分配全局内存3错误
#define ERR_OPENDEV (0x8006) // 打开PCI设备错误
#define ERR_GETDEVATTR (0x8007) // 获取PCI设备属性错误
#define ERR_READ_LEN (0x8008) // 读取数据长度错误
#define ERR_READ_CHECKSUM (0x8009) // 读取校验和错误
#define ERR_WRITE_BLOCK (0x800A) // 写块数据失败
#define ERR_READ_BLOCK (0x800B) // 读块数据失败
#define ERR_BLOCK_FIFO_FULL (0x800C) // 块数据FIFO已经满
#define ERR_OPEN_CHANNEL (0x800D) // 打开数据通道失败
#define ERR_CLOSE_CHANNEL (0x800E) // 关闭数据通道错误
#define ERR_DSP_BUSY (0x800F) // DSP一直处于忙状态
#define ERR_LOCK_ERROR (0x8010) // 获取锁资源失败
#define ERR_WAIT_TIMEOUT (0x8011) // 等待数据超时
#define ERR_EXECUTE (0x8012) // 执行命令错误
#define ERR_PARAMETER (0x8013) // 传入参数错误
#define ERR_OPEN_XML (0x8014) // 打开XML文件失败
#define ERR_CREATE_XML (0x8015) // 创建XML文件失败
#define ERR_MALLOC_MEM (0x8016) // 分配文件内存失败
#define ERR_UNKOWN_AXTYPE (0x8017) // 不能识别的轴类型
#define ERR_CARD_HANDLE (0x8018) // card handle 错误
#define ERR_PARSER_XML (0x8019) // 解析系统参数配置错误
#define ERR_CHECK_USER_CODE (0x801A) // 用户密码校验错误
#define ERR_NOT_ECAT_AX (0x801B) // 非ECAT轴
#define ERR_CARD_NUM_OUTRANG (0x801C) // 扫描板卡数量超限
#define ERR_PCI2ARMWRDATA (0x801D) // PCI向ARM侧写数据异常
#define ERR_PCI2ARMRDDATA (0x801E) // PCI向ARM侧读数据异常
#define ERR_CARD_BUSY (0x801F) // 板卡正上次初始化尚未结束,请稍等
#define ERR_OPEN_CARD_ERR (0x8020) // 开卡创建线程错误
#define ERR_ARM_ECAT_SHM (0x9000) // 共享内存错误
#define ERR_ARM_ECAT_LINK (0x9001) // EtherCat连接错误
#define ERR_ARM_ECAT_INIT_STEP0 (0x9002) // EtherCat初始化阶段STEP0错误
#define ERR_ARM_SCAN_MODULE (0x9003) // EtherCat初始化阶段扫描MODULE错误
#define ERR_ARM_ECAT_INIT_STEP2 (0x9004) // EtherCat初始化阶段STEP2错误
#define ERR_ARM_ECAT_INIT_STEP3 (0x9005) // EtherCat初始化阶段STEP3错误
#define ERR_ARM_INIT_SYNC_DSP (0x9006) // EtherCat配置信息同步到DSP错误
#define ERR_ARM_DEL_MASTER (0x9007) // 删除EtherCat主站状态机错误
#define ERR_ARM_SCAN_SLAVES (0x9008) // 扫描从站设备状态发生错误
#define ERR_ARM_ECAT_SHM_ADDR (0x9009) // 共享内存地址非法
#define ERR_ARM_INUPUT_PARA (0x900A) // 输入参数错误
#define ERR_ARM_ECAT_ENTER_HOME_MODE (0x900B) // EtherCat轴进入回零模式错误
#define ERR_ARM_ECAT_SET_HOME_PAR (0x900C) // 设置EtherCat轴回零参数错误
#define ERR_ARM_ECAT_START_HOME (0x900D) // 设置EtherCat轴开始回零错误
#define ERR_ARM_ECAT_STOP_HOME (0x900E) // 停止EtherCat轴回零错误
#define ERR_ARM_ECAT_GET_HOME_STATUS (0x900F) // 获取EtherCat轴回零状态错误
#define ERR_ARM_ECAT_SET_HOME_FINISH (0x9010) // 设置完成EtherCat轴回零错误
#define ERR_ARM_ECAT_EXIT_HOME_MODE (0x9011) // 退出EtherCat轴回零模式错误
#define ERR_ARM_FILE_BEYOND_MAX (0x9012) // 文件太大,超出buffer长度
#define ERR_ARM_FILE_OPEN (0x9013) // 打开文件失败
#define ERR_ARM_FILE_MMAP (0x9014) // 文件映射失败
#define ERR_ARM_FILE_MUNMMAP (0x9015) // 文件反映射失败
#define ERR_ARM_GET_ECAT_RESOUCE (0x9016) // 获取EtherCat资源失败
#define ERR_ARM_SDO_UPLOAD (0x9017) // 上传EtherCat SDO失败
#define ERR_ARM_SDO_DOWNLOAD (0x9018) // 下载EtherCat SDO失败
#define ERR_ARM_SEND_MSG (0x9019) // 发送消息失败
#define ERR_ARM_EXE_FUN (0x901a) // 执行调用函数异常
#define ERR_ARM_CK_DEV_XML (0x901b) //校验设备配置XML异常
#define ERR_ARM_NOT_EXIST_STATION (0x901c) // 不存在该站点
#define ERR_ARM_SUBBOARD_LINK (0x901d) // 端子板连接错误
#define ERR_ARM_CMP_ENCRY_CHIP (0x901e) // 板卡权限验证不通过
#define NO_ENCRY_CHIP (0x901f) // 板卡没有加密芯片
#define ERR_EEPROM_INFO (0x9020) // 板卡上板载信息有误
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="log4net" version="2.0.12" targetFramework="net461" />
</packages>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?><CardConfig id="0"><System><SysPara><emgMode>1</emgMode><emgFilter>19</emgFilter><emgTrigLevelInv>1</emgTrigLevelInv></SysPara></System><Signal><EcatSignal><DiInverse><Groups><GpMax>74</GpMax><Gp id="0"><data>0</data></Gp><Gp id="1"><data>0</data></Gp><Gp id="2"><data>0</data></Gp><Gp id="3"><data>0</data></Gp><Gp id="4"><data>0</data></Gp><Gp id="5"><data>0</data></Gp><Gp id="6"><data>0</data></Gp><Gp id="7"><data>0</data></Gp><Gp id="8"><data>0</data></Gp><Gp id="9"><data>0</data></Gp><Gp id="10"><data>0</data></Gp><Gp id="11"><data>0</data></Gp><Gp id="12"><data>0</data></Gp><Gp id="13"><data>0</data></Gp><Gp id="14"><data>0</data></Gp><Gp id="15"><data>0</data></Gp><Gp id="16"><data>0</data></Gp><Gp id="17"><data>0</data></Gp><Gp id="18"><data>0</data></Gp><Gp id="19"><data>0</data></Gp><Gp id="20"><data>0</data></Gp><Gp id="21"><data>0</data></Gp><Gp id="22"><data>0</data></Gp><Gp id="23"><data>0</data></Gp><Gp id="24"><data>0</data></Gp><Gp id="25"><data>0</data></Gp><Gp id="26"><data>0</data></Gp><Gp id="27"><data>0</data></Gp><Gp id="28"><data>0</data></Gp><Gp id="29"><data>0</data></Gp><Gp id="30"><data>0</data></Gp><Gp id="31"><data>0</data></Gp><Gp id="32"><data>0</data></Gp><Gp id="33"><data>0</data></Gp><Gp id="34"><data>0</data></Gp><Gp id="35"><data>0</data></Gp><Gp id="36"><data>0</data></Gp><Gp id="37"><data>0</data></Gp><Gp id="38"><data>0</data></Gp><Gp id="39"><data>0</data></Gp><Gp id="40"><data>0</data></Gp><Gp id="41"><data>0</data></Gp><Gp id="42"><data>0</data></Gp><Gp id="43"><data>0</data></Gp><Gp id="44"><data>0</data></Gp><Gp id="45"><data>0</data></Gp><Gp id="46"><data>0</data></Gp><Gp id="47"><data>0</data></Gp><Gp id="48"><data>0</data></Gp><Gp id="49"><data>0</data></Gp><Gp id="50"><data>0</data></Gp><Gp id="51"><data>0</data></Gp><Gp id="52"><data>0</data></Gp><Gp id="53"><data>0</data></Gp><Gp id="54"><data>0</data></Gp><Gp id="55"><data>0</data></Gp><Gp id="56"><data>0</data></Gp><Gp id="57"><data>0</data></Gp><Gp id="58"><data>0</data></Gp><Gp id="59"><data>0</data></Gp><Gp id="60"><data>0</data></Gp><Gp id="61"><data>0</data></Gp><Gp id="62"><data>0</data></Gp><Gp id="63"><data>0</data></Gp><Gp id="64"><data>0</data></Gp><Gp id="65"><data>0</data></Gp><Gp id="66"><data>0</data></Gp><Gp id="67"><data>0</data></Gp><Gp id="68"><data>0</data></Gp><Gp id="69"><data>0</data></Gp><Gp id="70"><data>0</data></Gp><Gp id="71"><data>0</data></Gp><Gp id="72"><data>0</data></Gp><Gp id="73"><data>0</data></Gp></Groups></DiInverse><DoInverse><Groups><GpMax>66</GpMax><Gp id="0"><data>0</data></Gp><Gp id="1"><data>0</data></Gp><Gp id="2"><data>0</data></Gp><Gp id="3"><data>0</data></Gp><Gp id="4"><data>0</data></Gp><Gp id="5"><data>0</data></Gp><Gp id="6"><data>0</data></Gp><Gp id="7"><data>0</data></Gp><Gp id="8"><data>0</data></Gp><Gp id="9"><data>0</data></Gp><Gp id="10"><data>0</data></Gp><Gp id="11"><data>0</data></Gp><Gp id="12"><data>0</data></Gp><Gp id="13"><data>0</data></Gp><Gp id="14"><data>0</data></Gp><Gp id="15"><data>0</data></Gp><Gp id="16"><data>0</data></Gp><Gp id="17"><data>0</data></Gp><Gp id="18"><data>0</data></Gp><Gp id="19"><data>0</data></Gp><Gp id="20"><data>0</data></Gp><Gp id="21"><data>0</data></Gp><Gp id="22"><data>0</data></Gp><Gp id="23"><data>0</data></Gp><Gp id="24"><data>0</data></Gp><Gp id="25"><data>0</data></Gp><Gp id="26"><data>0</data></Gp><Gp id="27"><data>0</data></Gp><Gp id="28"><data>0</data></Gp><Gp id="29"><data>0</data></Gp><Gp id="30"><data>0</data></Gp><Gp id="31"><data>0</data></Gp><Gp id="32"><data>0</data></Gp><Gp id="33"><data>0</data></Gp><Gp id="34"><data>0</data></Gp><Gp id="35"><data>0</data></Gp><Gp id="36"><data>0</data></Gp><Gp id="37"><data>0</data></Gp><Gp id="38"><data>0</data></Gp><Gp id="39"><data>0</data></Gp><Gp id="40"><data>0</data></Gp><Gp id="41"><data>0</data></Gp><Gp id="42"><data>0</data></Gp><Gp id="43"><data>0</data></Gp><Gp id="44"><data>0</data></Gp><Gp id="45"><data>0</data></Gp><Gp id="46"><data>0</data></Gp><Gp id="47"><data>0</data></Gp><Gp id="48"><data>0</data></Gp><Gp id="49"><data>0</data></Gp><Gp id="50"><data>0</data></Gp><Gp id="51"><data>0</data></Gp><Gp id="52"><data>0</data></Gp><Gp id="53"><data>0</data></Gp><Gp id="54"><data>0</data></Gp><Gp id="55"><data>0</data></Gp><Gp id="56"><data>0</data></Gp><Gp id="57"><data>0</data></Gp><Gp id="58"><data>0</data></Gp><Gp id="59"><data>0</data></Gp><Gp id="60"><data>0</data></Gp><Gp id="61"><data>0</data></Gp><Gp id="62"><data>0</data></Gp><Gp id="63"><data>0</data></Gp><Gp id="64"><data>0</data></Gp><Gp id="65"><data>0</data></Gp></Groups></DoInverse><PhyAxGrpDirInv><Groups><GpMax>22</GpMax><Gp id="0"><data>0</data></Gp><Gp id="1"><data>0</data></Gp><Gp id="2"><data>0</data></Gp><Gp id="3"><data>0</data></Gp><Gp id="4"><data>0</data></Gp><Gp id="5"><data>0</data></Gp><Gp id="6"><data>0</data></Gp><Gp id="7"><data>0</data></Gp><Gp id="8"><data>0</data></Gp><Gp id="9"><data>0</data></Gp><Gp id="10"><data>0</data></Gp><Gp id="11"><data>0</data></Gp><Gp id="12"><data>0</data></Gp><Gp id="13"><data>0</data></Gp><Gp id="14"><data>0</data></Gp><Gp id="15"><data>0</data></Gp><Gp id="16"><data>0</data></Gp><Gp id="17"><data>0</data></Gp><Gp id="18"><data>0</data></Gp><Gp id="19"><data>0</data></Gp><Gp id="20"><data>0</data></Gp><Gp id="21"><data>0</data></Gp></Groups></PhyAxGrpDirInv></EcatSignal><LocalSignal><DiInverse><data>0</data></DiInverse><DoInverse><data>0</data></DoInverse><SpecialDiInverses><SpecialDiInverse type="0"><data>0</data></SpecialDiInverse><SpecialDiInverse type="1"><data>0</data></SpecialDiInverse><SpecialDiInverse type="2"><data>0</data></SpecialDiInverse><SpecialDiInverse type="3"><data>0</data></SpecialDiInverse><SpecialDiInverse type="4"><data>0</data></SpecialDiInverse><SpecialDiInverse type="5"><data>0</data></SpecialDiInverse><SpecialDiInverse type="6"><data>0</data></SpecialDiInverse></SpecialDiInverses><DiFilterTimes><DiFilterTime id="0">1</DiFilterTime><DiFilterTime id="1">1</DiFilterTime><DiFilterTime id="2">1</DiFilterTime><DiFilterTime id="3">1</DiFilterTime><DiFilterTime id="4">1</DiFilterTime><DiFilterTime id="5">1</DiFilterTime><DiFilterTime id="6">1</DiFilterTime><DiFilterTime id="7">1</DiFilterTime><DiFilterTime id="8">1</DiFilterTime><DiFilterTime id="9">1</DiFilterTime><DiFilterTime id="10">1</DiFilterTime><DiFilterTime id="11">1</DiFilterTime><DiFilterTime id="12">1</DiFilterTime><DiFilterTime id="13">1</DiFilterTime><DiFilterTime id="14">1</DiFilterTime><DiFilterTime id="15">1</DiFilterTime></DiFilterTimes><homeFltTime>0</homeFltTime><limitFltTime>0</limitFltTime><probeFltTime>0</probeFltTime><LocalEncDirs><LocalEncDir id="0">0</LocalEncDir><LocalEncDir id="1">0</LocalEncDir><LocalEncDir id="2">0</LocalEncDir><LocalEncDir id="3">0</LocalEncDir><LocalEncDir id="4">0</LocalEncDir><LocalEncDir id="5">0</LocalEncDir></LocalEncDirs><LocalPulses><LocalPulse id="0"><LocalPulseMode>0</LocalPulseMode><LocalPulseDirInver>0</LocalPulseDirInver></LocalPulse><LocalPulse id="1"><LocalPulseMode>0</LocalPulseMode><LocalPulseDirInver>0</LocalPulseDirInver></LocalPulse><LocalPulse id="2"><LocalPulseMode>0</LocalPulseMode><LocalPulseDirInver>0</LocalPulseDirInver></LocalPulse><LocalPulse id="3"><LocalPulseMode>0</LocalPulseMode><LocalPulseDirInver>0</LocalPulseDirInver></LocalPulse><LocalPulse id="4"><LocalPulseMode>0</LocalPulseMode><LocalPulseDirInver>0</LocalPulseDirInver></LocalPulse><LocalPulse id="5"><LocalPulseMode>0</LocalPulseMode><LocalPulseDirInver>0</LocalPulseDirInver></LocalPulse></LocalPulses></LocalSignal></Signal><Axises><Axis id="0"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>1</axType><outputChn>0</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="1"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>1</axType><outputChn>1</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="2"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>1</axType><outputChn>2</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="3"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>1</axType><outputChn>3</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="4"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>1</axType><outputChn>4</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="5"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>1</axType><outputChn>5</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="6"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>1</axType><outputChn>6</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="7"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>1</axType><outputChn>7</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="8"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>1</axType><outputChn>8</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="9"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>1</axType><outputChn>9</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="10"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>1</axType><outputChn>10</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="11"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>1</axType><outputChn>11</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="12"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>1</axType><outputChn>12</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="13"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>1</axType><outputChn>13</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="14"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>1</axType><outputChn>14</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="15"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>1</axType><outputChn>15</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="16"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>1</axType><outputChn>16</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="17"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>1</axType><outputChn>17</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="18"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>1</axType><outputChn>18</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="19"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>1</axType><outputChn>19</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="20"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>1</axType><outputChn>20</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="21"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>1</axType><outputChn>21</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="22"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>-1</axType><outputChn>0</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="23"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>-1</axType><outputChn>0</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="24"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>-1</axType><outputChn>0</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="25"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>-1</axType><outputChn>0</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="26"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>-1</axType><outputChn>0</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="27"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>-1</axType><outputChn>0</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="28"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>-1</axType><outputChn>0</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="29"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>-1</axType><outputChn>0</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="30"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>-1</axType><outputChn>0</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis><Axis id="31"><MotionPara><bgVel>0</bgVel><maxVel>52428000</maxVel><maxAcc>500000000</maxAcc><maxDec>500000000</maxDec><maxJerk>499999993495552</maxJerk><stopDec>100000000</stopDec><eStopDec>2000000000</eStopDec></MotionPara><BindCfg><axType>-1</axType><outputChn>0</outputChn><loaclEncSrc>0</loaclEncSrc></BindCfg><AttrPara><arrivalBand>1000</arrivalBand><arrivalTime>20</arrivalTime><errorLmt>1048576</errorLmt><softPosLimitPos>2147483647</softPosLimitPos><softNegLimitPos>-2147483647</softNegLimitPos></AttrPara><SafePara><alarmEn>1</alarmEn><softLmtEn>0</softLmtEn><hwLmtEn>1</hwLmtEn><errorLmtEn>0</errorLmtEn></SafePara></Axis></Axises></CardConfig>
\ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!