EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(四):板载IO与总线扩展IO的编码器与脉冲配置的应用

XPCIE1032H功能简介

XPCIE1032H是一款基于PCI Express的EtherCAT总线运动控制卡,可选6-64轴运动控制,支持多路高速数字输入输出,可轻松实现多轴同步控制和高速数据传输。

XPCIE1032H集成了强大的运动控制功能,结合MotionRT7运动控制实时软核,解决了高速高精应用中,PC Windows开发的非实时痛点,指令交互速度比传统的PCI/PCIe快10倍。

在这里插入图片描述

XPCIE1032H支持PWM,PSO功能,板载16进16出通用IO口,其中输出口全部为高速输出口,可配置为4路PWM输出口或者16路高速PSO硬件比较输出口。输入口含有8路高速输入口,可配置为4路高速色标锁存或两路编码器输入。

XPCIE1032H搭配MotionRT7实时内核,使用本地LOCAL接口连接,通过高速的核内交互,可以做到更快速的指令交互,单条指令与多条指令一次性交互时间可以达到3-5us左右。

在这里插入图片描述
➜XPCIE1032H与MotionRT7实时内核的配合具有以下优势:

在这里插入图片描述

1.支持多种上位机语言开发,所有系列产品均可调用同一套API函数库;

2.借助核内交互,可以快速调用运动指令,响应时间快至微秒级,比传统PCI/PCIe快10倍;

3.解决传统PCI/PCIe运动控制卡在Windows环境下控制系统的非实时性问题;

4.支持一维/二维/三维PSO(高速硬件位置比较输出),适用于视觉飞拍、精密点胶和激光能量控制等应用;

5.提供高速输入接口,便于实现位置锁存;

6.支持EtherCAT总线和脉冲输出混合联动、混合插补。

在这里插入图片描述

➜使用XPCIE1032H和MotionRT7进行项目开发时,通常需要进行以下步骤:

1.安装驱动程序,识别XPCIE1032H;

2.打开并执行文件“MotionRT710.exe”,配置参数和运行运动控制实时内核;

3.使用ZDevelop软件连接到控制器,进行参数监控。连接时请使用PCI/LOCAL方式,并确保ZDevelop软件版本在3.10以上;

4.完成控制程序开发,通过LOCAL链接方式连接到运动控制卡,实现实时运动控制。

在这里插入图片描述

➜与传统PCI/PCIe卡和PLC的测试数据结果对比:
在这里插入图片描述

我们可以从测试对比结果看出,XPCIE1032H运动控制卡配合实时运动控制内核MotionRT7,在LOCAL链接(核内交互)的方式下,指令交互的效率是非常稳定,当测试数量从1w增加到10w时,单条指令交互时间与多条指令交互时间波动不大,非常适用于高速高精的应用。

XPCIE1032H控制卡安装

  • 关闭计算机电源。
  • 打开计算机机箱,选择一条空闲的XPCIE卡槽,用螺丝刀卸下相应的挡板条。
  • 将运动控制卡插入该槽,拧紧挡板条上的固定螺丝。

XPCIE1032H驱动安装与建立连接参考往期文章EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(一):驱动安装与建立连接。

一、C#语言进行运动控制开发

在这里插入图片描述
到正运动技术官网的下载中心选择需要的平台库文件。
在这里插入图片描述

解压下载的安装包找到 “Zmcaux.cs” , “zauxdll.dll” , “zmotion.dll” 放入到项目文件中。

1、“Zmcaux.cs”放在项目根目录文件中,与bin目录同级。

在这里插入图片描述

2、“zauxdll.dll”,“zmotion.dll”放在bin -> Debug。

在这里插入图片描述

用vs打开新建的项目文件,在右边的解决方案资源管理器中点击显示所有,选中项目,右键“添加”->“现有项”,选中zmcaux.cs文件添加进在项目中。

在这里插入图片描述

双击Form1.cs里面的Form1,出现代码编辑界面,在文件开头写入using cszmcaux,并声明控制器句柄g_handle。

在这里插入图片描述
在这里插入图片描述

二、相关PC函数介绍

相关PC函数介绍详情可参考“ZMotion PC函数库编程手册 V2.1.1”。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、XPCIE1032H板载IO的编码器与脉冲配置

1、XPCIE1032H的IO接口规格如下
在这里插入图片描述

2、IO端子定义如下
在这里插入图片描述

在这里插入图片描述

注意事项:

⊙只能使用24V编码器,编码器0和编码器1的脉冲输入最高频率为500kHz,可以接高速编码器,其它的为普通输入,脉冲最高频率10kHz,只能接手轮之类的低速编码器。

⊙脉冲输出和编码器输入后的编号为默认的轴号,通过ATYPE指令切换IO口是否为通用IO(目标轴的ATYPE=0为通用IO,ATYPE=1为脉冲输出,ATYPE=3为编码器输入,ATYPE=4为脉冲输出+编码器输入)。

3、输入口做编码器配置

XPCIE1032H板载2路24V的单端编码器输入。(本例以采用IN4-6连接编码器来说明)。

首先按接线图进行接线,接线完成后,因为其中IN4为EA1、IN5为EB1、IN6为EZ1,对应的编码器轴号为1。所以通过上位机把轴1的轴类型设置为3(正交编码器)配置后,IN即可作为编码器输入信号使用。

在这里插入图片描述

(1)配置流程图如下。

在这里插入图片描述

(2)例程相关代码。

a.通过轴号读取轴类型。

private void C_Move_Axis_TextChanged(object sender, EventArgs e)
{
    if (g_handle == (IntPtr)0)
    {
        return;
    }
    int ret = 0;
    int m_atype = 0;
    m_axisnum = Convert.ToInt32(C_Move_Axis.Text);
    ret += zmcaux.ZAux_Direct_GetAtype(g_handle, m_axisnum, ref m_atype);
    if (ret == 0)
    {
        C_AxisType.Text = m_atype.ToString();
    }
}

b.通过轴号设置轴类型。

private void button1_Click (object sender, EventArgs e)
{
    if (g_handle == (IntPtr)0)
    {
        return;
    }
    int ret = 0;
    int m_atype1 = 0;
    m_atype1 = Convert.ToInt32(C_AxisType1.Text);
    m_axisnum = Convert.ToInt32(C_Move_Axis.Text);
    zmcaux.ZAux_Direct_SetAtype(g_handle, m_axisnum, m_atype1);
}

4、输出口做脉冲配置

XPCIE032H板载4路单端脉冲输出。(本例以采用OUT8和OUT9连接驱动器来说明)。

首先按接线图进行接线,接线完成后,因为OUT8为DIR3,OUT9为PUL3,对应的脉冲驱动器轴号为3。所以得通过上位机把轴3的轴类型设置为1(脉冲方向方式的步进或伺服)配置。

注意:驱动器根据规格可接E24V或E5V。

在这里插入图片描述

(1)配置流程图如下。

在这里插入图片描述

(2)例程相关代码。

a.通过轴号读取轴类型。

private void C_Move_Axis_TextChanged(object sender, EventArgs e)
{
    if (g_handle == (IntPtr)0)
    {
        return;
    }
    int ret = 0;
    int m_atype = 0;
    m_axisnum = Convert.ToInt32(C_Move_Axis.Text);
    ret += zmcaux.ZAux_Direct_GetAtype(g_handle, m_axisnum, ref m_atype);
    if (ret == 0)
    {
        C_AxisType.Text = m_atype.ToString();
    }
}


==b.通过轴号设置轴类型。==

private void button1_Click (object sender, EventArgs e)
{
    if (g_handle == (IntPtr)0)
    {
        return;
    }
    int ret = 0;
    int m_atype1 = 0;
    m_atype1 = Convert.ToInt32(C_AxisType1.Text);
    m_axisnum = Convert.ToInt32(C_Move_Axis.Text);
    zmcaux.ZAux_Direct_SetAtype(g_handle, m_axisnum, m_atype1);
}

b.通过轴号设置轴类型。

private void button1_Click (object sender, EventArgs e)
{
    if (g_handle == (IntPtr)0)
    {
        return;
    }
    int ret = 0;
    int m_atype1 = 0;
    m_atype1 = Convert.ToInt32(C_AxisType1.Text);
    m_axisnum = Convert.ToInt32(C_Move_Axis.Text);
    zmcaux.ZAux_Direct_SetAtype(g_handle, m_axisnum, m_atype1);
}

四、EtherCAT扩展的编码器与脉冲配置

1、EIO16084扩展模块

EIO16084扩展模块是EtherCAT总线控制器使用的扩展模块,可扩展数字量IO和脉冲轴这两类资源,当控制器本体上资源不够的时候,EtherCAT总线控制器可连接多个EIO扩展模块进行资源扩展,可查看控制器的IO最大扩展点数和最大扩展轴数,支持IO的远程扩展。

在这里插入图片描述

每个EIO扩展模块在扩展接线完成后,不需要进行进行二次开发,只需使用指令在EtherCAT主站控制器配置唯一的IO地址和轴地址,配置完成即可访问。

IO地址编号通过总线指令NODE_IO来设置,控制器上程序只需通过IO编号就可以访问到扩展模块上的资源。轴地址的配置使用“AXIS_ADDRESS”指令映射绑定轴号,绑定完成通过BASE或AXIS指令指定轴号。

2、EIO24088扩展模块

EIO24088总线扩展模块是EtherCAT总线控制器使用的扩展模块,当数字 IO、脉冲轴资源不够需要扩展增加的时候,控制器可通过EtherCAT总线连接多个 EtherCAT扩展模块进行扩展。控制器可通过映射编号直接访问EIO24088的IO资源和轴资源。

在这里插入图片描述

当控制器的IO或轴资源不够的时候,需要增加扩展模块,控制器可以同时连接多个扩展模块,EIO系列扩展模块通过EtherCAT总线连接,每个扩展模块有唯一的地址,从0开始。

EIO24088轴扩展时,为总线转脉冲,将脉冲型驱动器接入到EIO24088扩展模块上的脉冲轴接口上。
EIO24088带两个EtherCAT总线接口,接线时注意EtherCAT IN连接主控制器或上级模块,EtherCAT OUT连接驱动设备或下一级扩展板,IN和OUT口不可混用。

注意:EIO系列带轴的扩展模块的使用方法相同,仅是扩展资源数量的区别。下面以EIO16084扩展模块为例,来对EIO系列扩展模块进行使用说明。

3、EtherCAT扩展模块接线参考

EIO16084数字量扩展模块为单电源供电,主电源就可以给IO供电,主电源采用24V直流电源。

EIO16084扩展模块在扩展接线完成后,不需要进行进行二次开发,只需手动在 EtherCAT主站控制器配置唯一的IO地址,配置完成即可访问。IO地址编号通过总线指令NODE_IO来设置,控制器上程序只需通过IO编号就可以访问到扩展模块上的资源。

接线时注意EtherCAT IN连接上一级模块,EtherCAT OUT连接下一级模块,IN 和OUT口不可混用。

EIO扩展模块接线参考示例(以ZMC432举例)。

在这里插入图片描述

上图涉及的编号概念如下:总线相关指令参数会用到如下编号。

(1)槽位号(slot)

槽位号是指控制器上总线接口的编号,EtherCAT总线槽位号为0。

(2)设备号(node)

设备号是指一个槽位上连接的所有设备的编号,从0开始,按设备在总线上的连接顺序自动编号,可以通过“NODE_COUNT(slot)”指令查看总线上连接的设备总数。

(3)驱动器编号

控制器会自动识别出槽位上的驱动器,编号从0开始,按驱动器在总线上的连接顺序自动编号。
驱动器编号与设备号不同,只给槽位上的驱动器设备编号,其他设备忽略,映射轴号时将会用到驱动器编号。

4、EIO16084接口规格

在这里插入图片描述

接口说明如下表:
在这里插入图片描述

由上表可知脉冲轴接口可配置为差分脉冲输出和差分编码器输入。

5、脉冲轴接口

EIO16084提供4个本地差分脉冲轴接口,每个接口为标准DB26母座。

注意:如果4个本地差分脉冲轴接口还不能满足使用需求,可以把EIO16084更换为EIO24088。EIO24088提供8个本地差分脉冲轴接口,每个接口为标准DB26母座。

接口定义如下。
在这里插入图片描述

6、轴接口配置为编码器

(1)接线参考

与长春凯尔科技,2500线增量式编码器接线参考示例:
在这里插入图片描述

接好线后,还要通过上位机的数据字典写入来配置总线轴的真实轴类型。真实轴类型设置是由数据字典6011h配置。(参考下表的参数,按轴号依次设置,第一个驱动器设置数据字典6011h+0800h,第二个驱动器设置6011h+1800h,以此类推,每个驱动器加800h,其他参数同理)。

在这里插入图片描述

上位机的数据字典写入:ZAux_BusCmd_SDOWrite(连接句柄,槽位号,节点编号,对象字典编号,对象字典子编号,数据类型,写入的数据值)。

(2)例程相关代码

通过设备号和槽位号进行SDO写入。

private void C_Sdo_Write_Click(object sender, EventArgs e)
{
    if (g_handle == (IntPtr)0)
    {
        MessageBox.Show("未链接到控制器!", "提示");
        return;
    }
    int ret = 0;
    uint m_sdo_node1 = Convert.ToUInt32(C_SdoNode0.Text);
    uint m_sdo_index1 = Convert.ToUInt32(C_SdoReg0.Text);
    uint m_sdo_sub1 = Convert.ToUInt32(C_SdoIsub0.Text);
    uint m_sdo_type1 = Convert.ToUInt32(C_SdoType0.SelectedIndex.ToString()) + 1;
    int m_sdo_data1 = Convert.ToInt32(C_Sdodata0.Text);
    if (Bus_type == 0)
    {
        ret = zmcaux.ZAux_BusCmd_SDOWrite(g_handle, 0, m_sdo_node1, m_sdo_index1, m_sdo_sub1, m_sdo_type1, m_sdo_data1);
        if (ret != 0)
        {
            MessageBox.Show("写入失败");
            return;
        }
    }
    else
    {
        MessageBox.Show("非ETHERCAT模块");
        return;
    }
}

7、轴接口配置为脉冲轴

(1)接线参考

与松下A5/A6伺服驱动器接线参考示例:

在这里插入图片描述

接好线后,还要通过PC函数库的数据字典写入接口来配置总线轴的真实轴类型。真实轴类型设置是由数据字典6011h配置。(参考下表的参数,按轴号依次设置,第一个驱动器设置数据字典6011h+0800h,第二个驱动器设置6011h+1800h,以此类推,每个驱动器加800h,其他参数同理)。
在这里插入图片描述

PC函数库的数据字典写入接口:ZAux_BusCmd_SDOWrite(连接句柄,槽位号,节点编号,对象字典编号,对象字典子编号,数据类型,写入的数据值)。

(2)例程相关代码

通过设备号和槽位号进行SDO写入。

private void C_Sdo_Write_Click(object sender, EventArgs e)
{
    if (g_handle == (IntPtr)0)
    {
        MessageBox.Show("未链接到控制器!", "提示");
        return;
    }
    int ret = 0;
    uint m_sdo_node1 = Convert.ToUInt32(C_SdoNode0.Text);
    uint m_sdo_index1 = Convert.ToUInt32(C_SdoReg0.Text);
    uint m_sdo_sub1 = Convert.ToUInt32(C_SdoIsub0.Text);
    uint m_sdo_type1 = Convert.ToUInt32(C_SdoType0.SelectedIndex.ToString()) + 1;
    int m_sdo_data1 = Convert.ToInt32(C_Sdodata0.Text);
    if (Bus_type == 0)
    {
        ret = zmcaux.ZAux_BusCmd_SDOWrite(g_handle, 0, m_sdo_node1, m_sdo_index1, m_sdo_sub1, m_sdo_type1, m_sdo_data1);
        if (ret != 0)
        {
            MessageBox.Show("写入失败");
            return;
        }
    }
    else
    {
        MessageBox.Show("非ETHERCAT模块");
        return;
    }
}

五、例程说明

1、C#例程界面如下。

在这里插入图片描述

2、例程简易流程图。

在这里插入图片描述

3、要想通过上位机操控控制器,就必须先链接控制器。例如通过LOCAL链接方式的链接按钮的消息响应函数来链接控制器。

通过LOCAL链接方式的链接控制器。

private void button4_Click(object sender, EventArgs e)
{
    if (g_handle == (IntPtr)0)
    {
        C_Close_Card_Click(sender, e);
    }
    zmcaux.ZAux_FastOpen(5, comboBox1.Text, 1000, out g_handle);
    if (g_handle != (IntPtr)0)
    {
        this.Text = "已链接";
        timer1.Enabled = true;
    }
    else
    {
        MessageBox.Show("链接失败,请选择正确的LOCAL!");
    }
}

链接成功后,例程左上角会显示已链接。如果链接失败,还弹出“链接失败,请选择正确的LOCAL!”的弹窗。

在这里插入图片描述
在这里插入图片描述

4、EtherCAT总线初始化。先将EtherCAT总线初始化程序下载到控制器中,PC再调用下面的总线初始化函数,即可完成总线初始化。

PC函数库中的“单个.bas文件生成ZAR并且下载到控制器运行”接口:ZAux_BasDown(连接句柄,BAS文件名带路径,下载模式)。

单个.bas文件生成ZAR并且下载到控制器运行。

private void C_Download_Click(object sender, EventArgs e)
{
    if (g_handle == (IntPtr)0)
    {
        MessageBox.Show("未链接到控制器!", "提示");
    }
    else
    {
        int ret = 0;
        string strFilePath;
        OpenFileDialog openFileDialog1 = new OpenFileDialog();
        openFileDialog1.InitialDirectory = "\\";
        openFileDialog1.Filter = "配置文件(*.bas)|*.bas";
        openFileDialog1.RestoreDirectory = true;
        openFileDialog1.FilterIndex = 1;
        if (openFileDialog1.ShowDialog() == DialogResult.OK)            //打开配置文件
        {
            strFilePath = openFileDialog1.FileName;
            C_BasFile.Text = strFilePath;
            ret = zmcaux.ZAux_BasDown(g_handle, strFilePath, 1);            //下载到ROM
            if (ret != 0)
            {
                MessageBox.Show("文件下载失败!", "提示");
            }
            g_InitStatus = -1;
            g_basflag = true;
        }
    }
}

如果总线初始化还没有成功,例程的初始化状态就会显示未完成,节点数量和轴数量都会显示0。总线初始化成功后,例程的初始化状态就会显示初始化完成。并显示节点数量和轴数量。

在这里插入图片描述
在这里插入图片描述

注意:初始化过程中若产生硬限位报警,可在轴参数窗口将硬限位FWD_IN和REV_IN的映射编号指向-1,表示不映射,需要接入限位开关时再去修改FWD_IN和REV_IN。

5、设置查看的轴号。就是修改全局变量m_axisnum,并且使用修改后的全局变量m_axisnum去读取轴参数,然后把轴参数显示在例程上。

private void C_Move_Axis_TextChanged(object sender, EventArgs e)
{
    if (g_handle == (IntPtr)0)
    {
        return;
}
    int ret = 0;
    float[] f_AxisPara = new float[10];
    int m_atype = 0;
    m_axisnum = Convert.ToInt32(C_Move_Axis.Text);
    ret += zmcaux.ZAux_Direct_GetUnits(g_handle, m_axisnum, ref f_AxisPara[0]);
    ret += zmcaux.ZAux_Direct_GetSpeed(g_handle, m_axisnum, ref f_AxisPara[1]);
    ret += zmcaux.ZAux_Direct_GetAccel(g_handle, m_axisnum, ref f_AxisPara[2]);
    ret += zmcaux.ZAux_Direct_GetAtype(g_handle, m_axisnum, ref m_atype);
    if (ret == 0)
    {
        C_AxisType.Text = m_atype.ToString();
        C_AxisUnits.Text = f_AxisPara[0].ToString();
        C_AxisSpeed.Text = f_AxisPara[1].ToString();
        C_AxisAcc.Text = f_AxisPara[2].ToString();
    }
}

6、修改轴类型是使用PC函数库中的设置轴类型接口:ZAux_Direct_SetAtype(控制器连接句柄,轴号,轴类型)。

private void button1_Click (object sender, EventArgs e)
{
    if (g_handle == (IntPtr)0)
    {
        return;
    }
    int ret = 0;
    int m_atype1 = 0;
    m_atype1 = Convert.ToInt32(C_AxisType1.Text);
    m_axisnum = Convert.ToInt32(C_Move_Axis.Text);
    zmcaux.ZAux_Direct_SetAtype(g_handle, m_axisnum, m_atype1);
}

7、轴运动和停止。正转和反转是使用了PC函数库中的单轴持续运动接口:ZAux_Direct_Single_Vmove(控制器连接句柄,轴号,方向)。停止是使用了PC函数库中的单轴运动停止接口:ZAux_Direct_Single_Cancel(控制器连接句柄,轴号,模式)。

a.单轴持续运动。

private void C_Button_Fwd_Click(object sender, EventArgs e)
{
    if (g_handle == (IntPtr)0)
    {
        MessageBox.Show("未链接到控制器!", "提示");
        return;
    }
    int ret = 0;
    ret=zmcaux.ZAux_Direct_SetUnits(g_handle,m_axisnum,Convert.ToSingle(C_AxisUnits.Text));
    ret=zmcaux.ZAux_Direct_SetSpeed(g_handle,m_axisnum,Convert.ToSingle(C_AxisSpeed.Text));
    ret=zmcaux.ZAux_Direct_SetAccel(g_handle,m_axisnum,Convert.ToSingle(C_AxisAcc.Text));
    ret = zmcaux.ZAux_Direct_Single_Vmove(g_handle, m_axisnum, 1);
}

b.单轴运动停止。

private void C_Button_Stop_Click(object sender, EventArgs e)
{
    if (g_handle == (IntPtr)0)
    {
        MessageBox.Show("未链接到控制器!", "提示");
        return;
    }
    int ret = 0;
    ret = zmcaux.ZAux_Direct_Single_Cancel(g_handle, m_axisnum, 2);
}

8、读取和设置扩展的脉冲轴的真实轴类型。

总线初始化后,拓展的总线轴的轴类型为65(EtherCAT周期位置模式),但实际由于是脉冲型驱动器,轴类型并不是65,真实轴类型的读取和配置需要使用PC函数库的数据字典读取和写入接口。

扩展的脉冲轴的真实轴类型设置通过数据字典6011h设置,(参考下表的参数,按轴号依次设置,第一个驱动器设置数据字典6011h+0800h,第二个驱动器设置6011h+1800h,以此类推,每个驱动器加800h,其他参数同理)。

在这里插入图片描述

(1)PC函数库中的数据字典读取的接口:

ZAux_BusCmd_SDORead(连接句柄,槽位号,节点编号,对象字典编号,对象字典子编号,数据类型,读取的数据值)。
例如:下图中的6和7轴的轴类型都显示65(EtherCAT周期位置模式),但是通过使用PC函数库中的数据字典读取的接口来读取6011h和6011h+1*800h,得知6轴和7轴的真实轴类型并不一样。
在这里插入图片描述

a.轴6。注意:24593是由16进制的6011h转换成10进制得来的。

在这里插入图片描述

b.轴7。注意:26641是由16进制的6011h+1*800h转换成10进制得来的。

在这里插入图片描述

轴6的真实轴类型是7(脉冲方向方式步进或伺服+EZ信号输入),轴7的真实轴类型是0(虚拟轴)。

通过设备号和槽位号进行SDO读取。

private void C_Sdo_Read_Click(object sender, EventArgs e)
{
    if (g_handle == (IntPtr)0)
    {
        MessageBox.Show("未链接到控制器!", "提示");
        return;
    }
    int ret = 0;
    uint m_sdo_node2 = Convert.ToUInt32(C_SdoNode1.Text);
    uint m_sdo_index2 = Convert.ToUInt32(C_SdoReg1.Text);
    uint m_sdo_sub2 = Convert.ToUInt32(C_SdoIsub1.Text);
    uint m_sdo_type2 = Convert.ToUInt32(C_SdoType1.SelectedIndex.ToString()) + 1;
    int m_sdo_data2 = 0;
    if (Bus_type == 0)
    {
        ret = zmcaux.ZAux_BusCmd_SDORead(g_handle, 0, m_sdo_node2, m_sdo_index2, m_sdo_sub2, m_sdo_type2, ref m_sdo_data2);
        if (ret != 0)
        {
            MessageBox.Show("读取失败");
            return;
        }
        C_Sdodata1.Text = m_sdo_data2.ToString();
    }
    else
    {
        MessageBox.Show("非ETHERCAT模块");
        return;
    }
}

(2)PC函数库中的数据字典写入的接口:

ZAux_BusCmd_SDOWrite(连接句柄,槽位号,节点编号,对象字典编号,对象字典子编号,数据类型,写入的数据值)。
例如:下图是6轴的轴参数和使用PC函数库中的数据字典读取的接口来读取6011h得知的真实轴类型。

在这里插入图片描述

注意:24593是由16进制的6011h转换成10进制得来的。

从图得知轴6的真实轴类型是7(脉冲方向方式步进或伺服+EZ信号输入),所以命令位置和反馈位置是一样的。接下来我们将要使用PC函数库中的数据字典写入的接口把轴6的真实轴类型修改为4(脉冲方向输出+正交编码器输入)。

在这里插入图片描述

写入后重新读取真实轴类型。

在这里插入图片描述

发现真实轴类型已经修改为4(脉冲方向输出+正交编码器输入)了。再看看轴6的参数,会发现命令位置和反馈位置不一样了,那是因为轴6没接编码器,所以反馈位置变为了0。

在这里插入图片描述

通过设备号和槽位号进行SDO写入。

private void C_Sdo_Write_Click(object sender, EventArgs e)
{
    if (g_handle == (IntPtr)0)
    {
        MessageBox.Show("未链接到控制器!", "提示");
        return;
    }
    int ret = 0;
    uint m_sdo_node1 = Convert.ToUInt32(C_SdoNode0.Text);
    uint m_sdo_index1 = Convert.ToUInt32(C_SdoReg0.Text);
    uint m_sdo_sub1 = Convert.ToUInt32(C_SdoIsub0.Text);
    uint m_sdo_type1 = Convert.ToUInt32(C_SdoType0.SelectedIndex.ToString()) + 1;
    int m_sdo_data1 = Convert.ToInt32(C_Sdodata0.Text);
    if (Bus_type == 0)
    {
        ret = zmcaux.ZAux_BusCmd_SDOWrite(g_handle, 0, m_sdo_node1, m_sdo_index1, m_sdo_sub1, m_sdo_type1, m_sdo_data1);
        if (ret != 0)
        {
            MessageBox.Show("写入失败");
            return;
        }
    }
    else
    {
        MessageBox.Show("非ETHERCAT模块");
        return;
    }
}

9、视频讲解。

编码器与脉冲配置的应用

本次,正运动技术EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(四):板载IO与总线扩展IO的编码器与脉冲配置的应用,就分享到这里。完整代码下载地址以及更多精彩内容请关注“正运动小助手”公众号。

本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/216088.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自动化框架错误排查:本地全通过,pipline上大部分报错

现象: 最近经过一次切环境和验证码部分的代码重构,果不其然,我们的自动化框架就出错了 我在本地修改调试,并在堡垒机上全部跑过 但在pipline上则大部分报错 进一步排查 这么多case报错,而且报错log都一模一样,推断是底层出错 我在堡垒机上使用命令行来跑case,发现与…

vue 修改 this.$confirm 的文字样式、自定义样式

通常使用 confirm 确认框时&#xff0c;一般这样写&#xff1a; <template><el-button type"text" click"open">点击打开 Message Box</el-button> </template><script>export default {methods: {open() {this.$confirm(此…

14、pytest像用参数一样使用fixture

官方实例 # content of test_fruit.py import pytestclass Fruit:def __init__(self, name):self.name nameself.cubed Falsedef cube(self):self.cubed Trueclass FruitSalad:def __init__(self, *fruit_bowl):self.fruit fruit_bowlself._cube_fruit()def _cube_fruit(s…

揭秘预付费电表怎么无线收费——方便快捷收费

【摘要】针对目前市场上普遍以Ic卡作为售电介质的预付费售电系统存在的问题&#xff0c;介绍了一种新型的无线预付费售电系统及其构成&#xff0c;并给出了整个系统设计的完整方案。整个系统包括用户终端和电力管理系统端&#xff0c;它们之间通过双工通信可以将用户用电信息和…

科普类软文怎么写才能提高用户接受度?媒介盒子分享

科普类软文以干货为主&#xff0c;可以给用户带来实用价值&#xff0c;但是相应会比较枯燥。如何才能把科普内容讲得专业又有趣&#xff0c;从而提高用户接受度呢&#xff1f;媒介盒子接下来就分享三大技巧&#xff1a; 一、 联系产品选题 科普类软文想要写好就需要做好选题&…

如何使用Node.js快速创建本地HTTP服务器并实现异地远程访问

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…

吉祥物虚拟人IP:如何持续为品牌年轻化营销赋能

如今&#xff0c;「得年轻人者&#xff0c;得天下」逐渐成为各品牌营销的一个共识&#xff0c;年轻化营销则成为品牌吸引和留存用户的手段。在数字化时代&#xff0c;品牌也不再满足于通过产品带动用户共情&#xff0c;而是突破传统的、单向的吉祥物打造模式&#xff0c;推陈出…

微信小程序交互(弹框)

1.wx.showToast(Object object) 显示消息提示框 属性类型默认值必填说明最低版本titlestring是提示的内容iconstringsuccess否图标 合法值说明最低版本success显示成功图标&#xff0c;此时 title 文本最多显示 7 个汉字长度error显示失败图标&#xff0c;此时 title 文本最多…

开关电源调试时,常见的10个问题:

1、变压器饱和 变压器饱和现象 在高压或低压输入下开机(包含轻载&#xff0c;重载&#xff0c;容性负载)&#xff0c;输出短路&#xff0c;动态负载&#xff0c;高温等情况下&#xff0c;通过变压器(和开关管)的电流呈非线性增长&#xff0c;当出现此现象时&#xff0c;电流的…

关于工业级交换机的分类,你知道多少?

工业级交换机是指专为工业控制领域设计的以太网交换设备。工业级交换机具备电信级的性能特征&#xff0c;能够在恶劣的工作环境下持久耐用。我们的产品系列非常广泛&#xff0c;可以灵活配置各种不同类型的端口&#xff0c;以满足工业领域的多样化使用需求。该产品具有宽温设计…

mysql数据导入时数据太大(2006 - MySQL server has gone away)——笔记

打开mysql的安装路径&#xff0c;找到my.ini文件 my.ini打开后修改max_allowed_packet的值变成32或者更大 max_allowed_packet32M修改之后重启mysql

2.4 API 开发和集成

文章目录 API 开发和集成API 的概念和作用API 开发基础API 集成API 鉴权和安全API 文档和测试微服务和 API 网关云服务和 API 集成未来趋势和发展实验实验一&#xff1a; 通过api post方式传入 json实验二&#xff1a;通过api将所需数据传入 API 开发和集成 API 的概念和作用介…

树问题的总结(一)

1.树是什么&#xff1f; 树结构里的节点存在父子顺序结构&#xff0c;会有兄弟节点存在。这是数组结构不具备的。 最长用的二叉树&#xff1a;即每个父节点&#xff0c;有两个子节点&#xff1a;左孩子|右孩子 一般涉及到的概念&#xff1a; 深度 高度 2.树的种类…

C++继承(详解)

一、继承的概念 1.1、继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象程序设计的层次结…

MVCC是如何保证隔离性的

之前提到了MVCC可以一定程度上避免幻读&#xff0c;那具体MVCC是咋工作的呢&#xff1f; 需要介绍两个机制&#xff1a;read view和聚簇索引的两个隐藏列 read view 这个就是我们理解的快照&#xff0c;有四个字段&#xff0c;本事务id、活跃事务id列表&#xff08;包含自己&…

【一周AI简讯】亚马逊推出企业级生成式AI聊天机器人,英伟达黄仁勋称AI将在5年内赶超人类

亚马逊推出企业级生成式AI聊天机器人Amazon Q 周二&#xff0c;亚马逊的云计算部门亚马逊网络服务 (AWS)推出了 Amazon Q&#xff0c;这是一款生成式 AI 聊天机器人。与 ChatGPT 和 Bard 不同&#xff0c;Amazon Q 并不基于单一的 AI 模型。相反&#xff0c;它在一个名为 Bedr…

如何使用cpolar+Plex在Windows系统上搭建私人媒体影音站点公网可访问

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频&#xff0c;已经算是生活中稀松平常的场景了&#xff0c;特别是各…

Jupyter Notebook中设置Cell主题

1. 获取本机Jupyter的配置目录 C:\Users\Administrator>jupyter --data-dir C:\Users\Administrator\AppData\Roaming\jupyter2. 进入获取的目录&#xff0c;创建指定路径 C:\Users\Administrator>cd C:\Users\Administrator\AppData\Roaming\jupyter C:\Users\Adminis…

你的AI生成物侵权了吗?

你的AI生成物侵权了吗&#xff1f; 本文目录&#xff1a; 一、前置背景 1.1、什么是版权 1.2、什么是作品 1.3、什么是创作 1.4、什么是肖像权 1.5、什么是名誉 二、AI生成的作品是否具备版权&#xff1f;如果具备&#xff0c;版权应该属于谁&#xff1f; 三、AI 学习时…

Keil5创建基于标准库的工程

1&#xff0c;首先&#xff0c;打开Keil5软件&#xff0c;选择工程&#xff0c;新建项目&#xff08;下图第一个&#xff09; 选择一个专门的工程文件&#xff0c;然后在下面新建一个工程。 在后面要用到F103C8T6最小系统板。 这里弹出的是Keil软件新建工程的小组手&#xff0…