硬件介绍
PCIE464运动控制卡是正运动推出的一款EtherCAT总线+脉冲型、PCIE接口式的运动控制卡,可选6-64轴运动控制,支持多路高速数字输入输出,可轻松实现多轴同步控制和高速数据传输。
PCIE464运动控制卡适合于多轴点位运动、插补运动、轨迹规划、手轮控制、编码器位置检测、IO控制、位置锁存等功能的应用。
PCIE464运动控制卡适用于3C电子加工、检测设备、半导体设备、SMT加工、激光加工、光通讯设备、锂电及光伏设备、以及非标自动化设备等高速高精应用场合。
PCIE4系列控制卡的应用程序可以使用VC,VB,VS,C++,C#等软件开发,程序运行时需要动态库zmotion.dll,调试时可以将RTSys软件同时连接控制器,从而方便调试、方便观察。
接线参考
1、IN数字量输入接口
数字输入分布在J400(IN0-IN7)和X400(IN8-IN39)信号接口中。
2、OUT数字量输出接口
数字输出分布在 J400(OUT0-7)和 X400(OUT8-OUT39)信号接口中。
3、编码器输入接口
J400包含一个差分脉冲输出接口,一个差分编码器反馈,通过转接板接入。其中IN2-7有单端编码器轴的功能,只支持24V编码器输入。
C#语言进行项目开发
1、在VS2010菜单“文件”→“新建”→“项目”,启动创建项目向导。
2、选择开发语言为“Visual C#”和.NET Framework 4以及Windows窗体应用程序。
3、找到厂家提供的光盘资料里面的C#函数库,路径如下(32位库为例)。
1)进入厂商提供的光盘资料找到“04PC函数”文件夹,并点击进入。
2)选择“函数库2.1”文件夹。
3)选择“Windows平台”文件夹。
4)根据需要选择对应的函数库,这里选择32位库。
5)解压C#压缩包,里面有C#对应的函数库。
6)函数库具体路径如下。
4.将厂商提供的C#的库文件以及相关文件复制到新建的项目中。
1)将zmcaux.cs文件复制到新建的项目里面中。
2)将zauxdll.dll和zmotion.dll文件放入bin\debug文件夹中。
5.双击Form1.cs里面的Form1,出现代码编辑界面,在文件开头写入using cszmcaux,并声明控制器句柄g_handle。
6、至此,项目新建完成,可进行C#项目开发。
PC函数介绍
1.PC函数手册可在光盘资料查看,具体路径如下。
2.链接控制卡,获取链接句柄。
3.读取单个I/O信号。
4.批量读取I/O信号。
5.设置单个输出口。
6.批量设置输出口。
7.读取单轴编码器反馈位置。
8.批量读取编码器反馈位置,BASIC字符串为MPOS。
9.自定义函数封装指令。
单个或批量读取IO和编码器数据
1.链接控制器获取句柄,上位机操作通过获取到的句柄来操作控制器。
//连接PCIe控制卡,控制卡卡号缺省从0开始
int ret = zmcaux.ZAux_OpenPci(0, out g_handle);
if (g_handle != (IntPtr)0)
{
MessageBox.Show("控制卡链接成功!" , "提示");
timer_GetData.Enabled = true; //开启定时器或在单独线程里实时读取I/O信号
}
else
{
MessageBox.Show("控制卡链接失败,请检测PCI卡号!" , "警告");
}
2.开启定时器实时读取I/O信号。
//定时器刷新I/O和轴反馈数据
private void timer_GetData_Tick(object sender, EventArgs e)
{
uint[] instate = new uint[4];
uint[] opstate = new uint[4];
float[] mpos = new float[4];
for (int i = 0; i < 4; i++)
{
zmcaux.ZAux_Direct_GetIn(g_handle, i, ref instate[i]); //读取单个IN
zmcaux.ZAux_Direct_GetOp(g_handle, i, ref opstate[i]); //读取单个OUT
zmcaux.ZAux_Direct_GetMpos(g_handle, i, ref mpos[i]); //读取单轴反馈位置MPOS
}
IN0.Checked = (instate[0] == 1);
IN1.Checked = (instate[1] == 1);
IN2.Checked = (instate[2] == 1);
IN3.Checked = (instate[3] == 1);
OP0.Checked = (opstate[0] == 1);
OP1.Checked = (opstate[1] == 1);
OP2.Checked = (opstate[2] == 1);
OP3.Checked = (opstate[3] == 1);
MPOS0.Text = mpos[0].ToString();
MPOS1.Text = mpos[1].ToString();
MPOS2.Text = mpos[2].ToString();
MPOS3.Text = mpos[3].ToString();
int[] inputs = new int[4];
uint[] outputs = new uint[4];
float[] allmpos = new float[8];
zmcaux.ZAux_Direct_GetInMulti(g_handle, 16, 31, inputs); //批量读取输入IN16-31
zmcaux.ZAux_Direct_GetOutMulti(g_handle, 16, 31, outputs); //批量读取输出OUT16-31
zmcaux.ZAux_Direct_GetAllAxisPara(g_handle, "MPOS", 8, allmpos);//批量读取轴反馈位置MPOS 0-7
InputGroup1631.Text = inputs[0].ToString("X4");
}
3.单个或批量设置OP输出口。
//单个输出口状态切换函数
private void OP0_CheckedChanged(object sender, EventArgs e)
{
if (g_handle == (IntPtr)0)
{
MessageBox.Show("未链接到控制卡!", "提示");
return;
}
if (OP0.Checked)
{
zmcaux.ZAux_Direct_SetOp(g_handle,0, 1);
OP0.Text = "out0 打开";
}
else
{
zmcaux.ZAux_Direct_SetOp(g_handle, 0, 0);
OP0.Text = "out0 关闭";
}
}
//批量切换输出口状态函数
private void OutputGroup03_CheckedChanged(object sender, EventArgs e)
{
if (g_handle == (IntPtr)0)
{
MessageBox.Show("未链接到控制卡!", "提示");
return;
}
uint[] iostate = new uint[4];
if (OutputGroup03.Checked)
{
iostate[0] = 0xF; //以二进制组合OUT,十六进制0xF即OUT0-3全部置1
zmcaux.ZAux_Direct_SetOutMulti(g_handle, 0, 3, iostate);
OutputGroup03.Text = "全部置ON";
OP0.Checked = true;
OP1.Checked = true;
OP2.Checked = true;
OP3.Checked = true;
}
else
{
iostate[0] = 0x0;
zmcaux.ZAux_Direct_SetOutMulti(g_handle, 0, 3, iostate);
OutputGroup03.Text = "全部置OFF";
OP0.Checked = false;
OP1.Checked = false;
OP2.Checked = false;
OP3.Checked = false;
}
}
4.若想验证通过函数获取的IO状态和数据是否准确,可以使用正运动的调试软件RTSys连接到控制卡。
通过工具→输入口/输出口观察当前控制卡的实时IO状态,通过轴参数窗口观察各轴的反馈位置MPOS,并与C#获取的数据进行对比。
5.自定义函数封装,单条命令批量获取需要的部分I/O和部分轴数据。
通过组合不同的Basic命令字符串,中间以英文逗号字符隔开,一次性下发读取所需的数据,如:
(1)获取某个输入信号,对应Basic命令字符串为:IN(输入口序号);
(2)获取某个输出信号,对应Basic命令字符串为:OP(输入口序号);
(3)获取某轴反馈位置,对应Basic命令字符串为:MPOS(轴号);
其他参数也可以使用此方式,具体Basic字符串可参考PC手册“轴参数指令表”。
举例说明,需要单条命令获取输入0,输入3,输出1,输出4,轴2和轴5的反馈数据,则需要通过ZAux_Execute函数下发字符串:
“?IN(0),IN(3),OP(1),OP(4),MPOS(2),MPOS(5)”;
其中,英文 “?” 字符和“PRINT”字符为同一含义,表示读取后续参数的值;参数字符不用区分大小写。
private void getData_Click(object sender, EventArgs e)
{
//通过Execute函数发送Basic字符串组合实现一次性读取多个参数
if (g_handle == (IntPtr)0)
{
MessageBox.Show("未链接到控制卡!", "提示");
return;
}
string pszCommand; //发送的Basic命令字符串
StringBuilder psResponse = new StringBuilder(1024); //接收返回的字符串
uint uiResponseLength = 1024; //接收返回的字符长度,不能小于接收的字符串长度
pszCommand = "?IN(4),IN(5),OP(4),OP(5),MPOS(4),MPOS(5)";//读取数据Basic字符串,共6个数据
zmcaux.ZAux_Execute(g_handle, pszCommand, psResponse, uiResponseLength);
string psResponseResult = "";
psResponseResult += psResponse;
string[] parts = psResponseResult.Split('\t'); //这里以空格对字符串分割
IN4.Checked = Convert.ToInt32(parts[0]) == 1;
IN5.Checked = Convert.ToInt32(parts[1]) == 1;
OP4.Checked = Convert.ToInt32(parts[2]) == 1;
OP5.Checked = Convert.ToInt32(parts[3]) == 1;
MPOS4.Text = parts[4];
MPOS5.Text = parts[5];
}
调试软件RTSys命令与输出窗口的在线命令,与上述封装函数为相同的功能。
本次,正运动技术PCIe EtherCAT实时运动控制卡PCIE464的IO与编码器读写应用,就分享到这里。
更多精彩内容请关注“正运动小助手”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师。
本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。