首页 新闻 工控搜 论坛 厂商论坛 产品 方案 厂商 人才 文摘 下载 展览
中华工控网首页
  P L C | 变频器与传动 | 传感器 | 现场检测仪表 | 工控软件 | 人机界面 | 运动控制
  D C S | 工业以太网 | 现场总线 | 显示调节仪表 | 数据采集 | 数传测控 | 工业安全
  电 源 | 嵌入式系统 | PC based | 机柜箱体壳体 | 低压电器 | 机器视觉
强实时运动控制内核MotionRT750(十一):C#实现CAD导图和小线段速度前瞻优化
深圳市正运动技术有限公司
收藏本文     查看收藏

强实时运动控制内核MotionRT750

MotionRT750是正运动技术首家自主自研的x86架构Windows系统或Linux系统下独占确定CPU的强实时运动控制内核。

正运动实时控制内核MotionRT750.webp

该方案采用独占确定CPU内核技术实现超强性能的强实时运动控制。它将核心的运动控制、机器人算法、数控(CNC)及机器视觉等强实时的任务,集中运行在1-2个专用CPU核上。与此同时,其余CPU核则专注于处理Windows/Linux相关的非实时任务。

此外集成MotionRT750 Runtime实时层与操作系统非实时层,并利用高速共享内存进行数据交互,显著提升了运动控制与上层应用间的通信效率及函数执行速度,最终实现更稳定、更高效的智能装备控制,确保了运动控制任务的绝对实时性与系统稳定性,特别适用于半导体、电子装备等高速高精的应用场合。

强实时运动控制内核MotionRT750应用.webp

MotionRT750应用优势:

1.跨平台兼容性:支持Windows/Linux系统,适配不同等级CPU。

2.开发灵活性:提供多语言编程接口,便于二次开发与功能定制。

3.实时性提升:通过CPU内核独占机制与高效LOCAL接口,实现2-3us指令交互周期,较传统PCI/PCIe方案提速近20倍。

4.扩展能力强化:多卡多EtherCAT通道架构支持254轴运动控制及500usEtherCAT周期。

5.系统稳定性:32轴125us EtherCAT冗余架构消除单点故障风险,保障连续生产。

6.安全可靠性:不惧Windows系统崩溃影响,蓝屏时仍可维持急停与安全停机功能有效,确保产线安全运行。

7.功能扩展性:实时内核支持C语言程序开发,方便功能拓展与实时代码提升效率。

MotionRT750视频介绍可点击→正运动强实时运动控制内核MotionRT750

更多关于MotionRT750的详情介绍与使用点击→强实时运动控制内核MotionRT750(一):驱动安装、内核配置与使用。

超实时EtherCAT运动控制卡XPCIE6032H

XPCIE6032H运动控制卡集成6路独立EtherCAT主站接口。整卡最高可支持254轴运动控制;125usEtherCAT通讯周期时,两个端口配置冗余最高可支持32轴运动控制。6个EtherCAT主站各通道独立工作,多EtherCAT主站互不影响。

XPCIE6032H运动控制卡~1.webp

超实时EtherCAT运动控制卡XPCIE6032H结构图.webp

      XPCIE6032H视频介绍可点击→全球首创!PCIe 6路高性能EtherCAT运动控制卡XPCIE6032H

XPCIE6032H运动控制卡面向半导体设备、精密3C电子、生物医疗仪器、新能源装备、人形机器人及激光加工等高速高精场景,为固晶机、贴片机、分选机、锂电切叠一体机、高速异形插件设备等自动化装备提供核心运动控制支持。

XPCIE6032H硬件特性:

1.EtherCAT通讯周期可到125us(需要主机性能与实时性足够)。

2.板卡集成6路独立的EtherCAT主站接口,最多可支持254轴运动控制。

3.搭载运动控制实时内核MotionRT750。

4.相较于传统的PCI/PCIe、网口等通讯方式,速度可提升10-100倍以上。

5.板载16路高速输入,16路高速输出。

6.板载4路高速锁存,4路通用PWM输出。

更多关于XPCIE6032H的详情介绍与使用点击→全球首创!PCIe超实时6通道EtherCAT运动控制卡上市!

超实时EtherCAT运动控制卡XPCIE2032H

XPCIE2032H集成2路独立EtherCAT接口。整卡最高可支持至254轴运动控制;125usEtherCAT通讯周期时,单接口最高可支持32轴运动控制。2个EtherCAT主站各通道独立工作,多EtherCAT主站互不影响。

超实时EtherCAT运动控制卡XPCIE2032H.webp

双EtherCAT主站端口可任意设置为以下通道,且两个端口也设置为不同类型通道:

● 高速通道-EtherCAT通讯周期125us

● 常规通道-EtherCAT通讯周期250us-8ms

超实时EtherCAT运动控制卡XPCIE2032H双主站端口~1.webp

超实时EtherCAT运动控制卡XPCIE2032H架构图.webp

XPCIE2032H视频介绍可点击→高速高精运动控制!PCIe超实时2通道EtherCAT运动控制卡上市!

XPCIE2032H硬件特性:

1.EtherCAT通讯周期可到125us(需要主机性能与实时性足够)。

2.板卡集成2路独立的EtherCAT主站接口,最多可支持254轴运动控制。

3.搭载运动控制实时内核MotionRT750。

4.相较于传统的PCI/PCIe、网口等通讯方式,速度可提升10-100倍以上。

5.板载8路高速输入,16路高速输出。

6.板载4路高速锁存,4路通用PWM输出。

更多关于XPCIE2032H的详情介绍与使用点击→高速高精运动控制!PCIe超实时2通道EtherCAT运动控制卡上市!

PCIe EtherCAT实时运动控制卡XPCIE1032H

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

PCIe EtherCAT实时运动控制卡XPCIE1032H.webp

PCIe EtherCAT实时运动控制卡XPCIE1032H结构.webp

XPCIE1032H视频介绍可点击→高性能PCIe EtherCAT运动控制卡 | XPCIE1032H_

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

MotionRT7运动控制实时软核.webp

XPCIE1032H硬件特性:

1.6-64轴EtherCAT总线+脉冲可选,其中4路单端500KHz脉冲输出。

2.16轴EtherCAT同步周期500us,支持多卡联动。

3.板载16点通用输入,16点通用输出,其中8路高速输入和16路高速输出。

4.通过EtherCAT总线,可扩展到512个隔离输入或输出口。

5.支持PWM输出、精准输出、PSO硬件位置比较输出、视觉飞拍等。

6.支持直线插补、圆弧插补、连续轨迹加工(速度前瞻)。

7.支持电子凸轮、电子齿轮、位置锁存、同步跟随、虚拟轴、螺距补偿等功能。

8.支持30+机械手模型正逆解模型算法,比如SCARA、Delta、UVW、4轴/5轴 RTCP...

更多关于XPCIE1032H详情点击“不止10倍提速!PCIe EtherCAT实时运动控制卡XPCIE1032H 等您评测!”查看。

C#实现CAD解析及如何对小线段轨迹进行运动前瞻

CAD具有绘图效率高速度快精度高便于交流等优点,所以得到了广泛的应用。CAD伴随着整个PC基础工业的突飞猛进,正迅速而深刻地影响着设计和绘图的基本方法。

但是在实际应用过程中,如果CAD导图的轨迹是较为复杂的异形轨迹,那么结果会导出来大量小线段。这时候要保证机台加工高效平稳,需要通过运动前瞻算法对轨迹进行一定程度的平滑,并且在拐弯点合理降速,曲线段整体也要合理降速,保证各分轴速度连续不出现速度突变。

01 CAD图纸解析

正运动技术提供开放的ZmotionCadEx库,可导入DXF、Ai、Plt、Dst图纸,可以生成运动坐标数据转G代码、zbasic运动指令,或直接PC函数执行运动。

CAD1.png

CAD2.png

02 开启控制器的运动前瞻                                

之前推文也有介绍过,控制器的运动前瞻主要通过Corner_mode进行设置。

1.CornerMode功能前瞻设置说明

第一,它可对指令进行整体规划,即对各段速度进行整体规划,再配合指令段内的加减速控制,可以使机床保持高速运行提高效率,使负载运动更加流畅,告别停停走走,系统通过Merge速度融合功能实现

第二,它可保证在高速运行的基础上为了限制机械冲击和过切等,进行减速识别,通过提前识别轨迹变化,从而按照安全的减速度提前减速,系统通过减速/停止融合功能、抑制冲击功能实现

综上所述,速度前瞻功能既可提升整机效率,也可减少冲击增加柔性,降低零部件磨损,增加设备使用寿命。

(1)拐角减速

拐角减速功能解决的问题是:当指令间夹角过大时,如果仍以较大速度运行,会在夹角处产生较大的机械冲击,轨迹偏离。

图片3.webp

控制器会对指令间轨迹变化的夹角进行提前识别,比较其与减速/停止角的大小关系,提前决定是否进行减速,保证在指令连接处平稳过渡。

           

运动轨迹段数.webp

如图,OA过渡AB段位置时角度小于减速角度则,S1-S2段不进行减速AB过渡BC段时角度大于减速角度则进行减速处理过渡过程如S2-S3段BC过渡CD段角度大于停止角度速度需要降到零如S3-S4段位置处理。执行效果如下:

①未开启拐角减速

1.webp

②开启拐角减速

→达到减速角度,未达到停止角度,部分减速。

2.webp

→达到停止角度,完全减速。

3.webp

(2)小圆限速

小圆限速功能用于处理,在运行轨迹中可能运行圆弧轨迹拟合成的小圆,由于角度偏转较大导致出现轨迹偏转,因此在这种位置需要进行速度限制的处理。开启小圆限速,小圆半径超过限速半径的时候不会对速度限制,小圆半径小于限速半径的时候则会开始对速度进行限制。

(3)自动倒角

自动倒角功能一般是用于拐角处按照一定的倒角半径进行轨迹的弧度化处理使速度变化更平滑。如图所示:

①未开启倒角

4.webp

②开启倒角

5.webp

设置CORNER_MODE主要用到了下面几个函数接口:

1.png

2.png

222.png

333.png

444.png

2.适用于小线段应用的新平滑指令

针对连续小线段应用,可以开启zsmooth_mode平滑速度曲线模式,效果显著。

(1)启用平滑速度曲线模式

zsmooth_start()   zsmooth_end()

上述两个basic指令是用于开启和关闭新的平滑模式,这两个指令都是进入缓冲的,记得一定要调用zsmooth_end指令,否则可能导致最后几个小运动段位于等待状态。可以提前先调用一次zsmooth_end,以防上次没有正常关闭。

在PC程序里调用的话可以用Execute函数发送字符串,注意,zsmooth_start()是作用于某个轴的,如果前面没有base指令的话,就要用axis指令指定轴号,用法应该是 zsmooth_start() axis(xxx),而不是zsmooth_start(xxx)。下图execute示例主轴为轴0。

平滑1.png

平滑2.png

开启新的平滑模式后,zsmooth的效果就非常强。数值越大越平滑,但如果小线段点间隔过大,并且zsmooth也很大,可能会造成运动轨迹变形。如果出现变形,要么减小zsmooth,或者减少小线段的间隔。
 

(2)设置CORNER_ACCEL

CA.png

CORNER_ACCEL类似之前的小圆限速,默认值0不生效,设置数值后替换FULL_SP_RADIUS。

用于在曲率较大的地方去合理降速。这个拐弯加速度的大致理解为v = sqrt(a * r),这个a就是拐弯加速度。

(3)设置JERK

JERK.png

JERK用来控制加加速度大小,可以让合成速度的不平滑处更平滑,也会约束空跑阶段的加速度大小。默认值0不生效,设置值后替换SRAMP。


 

C#使用ZTrackSmooth库的连续平滑函数

03

在cad导出小线段数组后,可以通过ZTrackSmooth.dll库中提供的ZTS_ContinueSmoothAndSpeed函数进行运动前瞻规划,它的作用主要是通过给定参数用样条方式去连续平滑轨迹,并且在拐弯点和曲线段合理降速。

使用ZTrackSmooth库的连续平滑函数.png

其中pDataPoints是传入的cad导出的小线段数组,通过设定对应参数后会

pSmoothPoints :平滑过后的坐标点集

parryLmtSp:输出每个店限速(mm/s),对应每条线段,用movelimit运行,<=0就不用设置// parryForceSp:输出的每段force_speed运行速度

然后根据输出结果按照流程使用对应函数下发给控制器执行。

指令1.png

指令2.png

指令3.png

其它传参为平滑时候所需要的参数,他们作用如下:
 

disErr : 参考误差系数(设置越大,拐点处轨迹误差越大,默认可输入1)

用来控制高级平滑算法平滑后的轨迹与原轨迹之间最大参考误差,当此参数设置越大,平滑后的轨迹距离原轨迹的最大误差也越大,同时平滑效果越好,运动时的速度可以达到更快,曲率大的地方过弯速度可以更快,反之则是相反的效果。

同一段轨迹:

·此参数是设置为1.0

参数设1.0~1.webp

·此参数设3.0

参数设3.0~1.webp

splineDisPrecision :样条最小线段的参考长度(设置的越小,样条拆分越细)默认可输入0.1

用来平滑高级平滑后的轨迹是原来离散点的参考倍数,默认0.1即可,代表10倍。

此参数设置的倍数,平滑后的轨迹越密集,最小设置为4倍(0.25),最大建议不要设置超过20(0.05)。

·设置为4倍:

参数设4.0.webp

·设置为10倍:

参数设为10倍~1.webp

plimitR :限速半径数组,不同的限速半径对应不同的限速值

plimitRSp : 限速半径速度数组,和限速半径数组对应

limitRCnt: 限速半径的个数

用来根据曲率半径对应的限制速度进行曲线段限速,和控制器底层的小圆限速区别在于:

小圆限速只需要设置最大限速半径,限制速度和最小速度,然后根据实际圆速度=限制速度*实际半径/限速最大半径进行线性限速;

该函数可以通过设置分段限速,应对上面小圆限速效果不好的时候,更可以根据实际机台效果进行设置,比如设置限速半径和对应限速值为:

表格.png


 

04 控制器速度前瞻和C#连续平滑函数共同使用

上面介绍的两种方式也可以一起使用,效果会更加明显,下面是一些推荐参数设置,可供参考测试:

测试轨迹(导入原始图形为PLT图形):

41.webp

运动前瞻未设置的速度波形(VP_SPEED为合成速度,MSPEED为各轴分速度):

42.webp

推荐参数设置1

不使用C#平滑函数,使用控制器内置的限速和平滑模式,关闭连续倒角平滑。

① 前瞻模式corner_mode=2+8+16+32=58

② 减速角度=15

③ 停止限速=45

④ 平滑半径Zsmooth=2(根据实际轨迹误差设置)

⑤ 连续倒角平滑zsmooth_start不开启

⑥ 小圆限速半径300  (根据实际机台效果去设置)

⑦ 小圆限速最小值50  (根据实际机台效果去设置)

43.webp

44.webp

推荐参数设置2

不使用C#平滑函数,使用控制器内置的限速和平滑模式,关闭连续倒角平滑。

① 前瞻模式corner_mode=2+8+16+32=58

② 减速角度=15

③ 停止限速=45

④ 平滑半径ZSmooth=2(根据实际轨迹误差设置)

⑤ 连续倒角平滑zsmooth_start开启

⑥ 各轴的corner_accel设置合理 例如2000,2000,2000

此参数设置之后,替代小圆限速,此参数设置越大,拐弯时限速值越高。

45.webp

46.webp

推荐参数设置3

开启使用C#平滑函数,并使用控制器内置的限速和平滑模式,关闭连续倒角平滑。

① 前瞻模式corner_mode=2+8+16+32=58

② 减速角度=15

③ 停止限速=45

④ 平滑半径Zsmooth=2 (根据实际轨迹误差设置)

⑤ 连续倒角平滑zsmooth_start不开启

⑥ 小圆限速半径300   (根据实际机台效果去设置)

⑦ 小圆限速最小值50  (根据实际机台效果去设置)

⑧ 误差系数Diserr=1  (根据实际机台效果去设置)

47.webp

48.webp

推荐参数设置4

开启使用C#平滑函数,并使用控制器内置的限速和平滑模式,关闭连续倒角平滑。

① 前瞻模式corner_mode=2+8+16+32=58

② Pr12 减速角度=15

③ 停止限速=45

④ 平滑半径Zsmooth=2(根据实际轨迹误差设置)

⑤ 连续倒角平滑zsmooth_start开启

⑥ 误差系数Diserr=1 (根据实际机台效果去设置)

⑦ 各轴的corner_accel设置合理 例如2000,2000,2000

此参数设置之后,取代小圆限速。

49.webp

50.webp


 

C#例程实现小线段速度前瞻优化

01 例程界面如下

例程界面如下.webp

02 初始化连接到控制器

//链接private void btn_Connet_Click(object sender, EventArgs e)
{
    if (G_CardHandle == (IntPtr)0)
    {
       btn_Close_Click(sender, e);
    }
    zmcaux.ZAux_OpenEth("127.0.0.1",out G_CardHandle);
    if (G_CardHandle != (IntPtr)0)
    {
       this.Text = "已链接";
    }
    else
    {
       MessageBox.Show("链接失败,请选择正确的LOCAL!");
    }
}

03 CAD导入图形

//CAD图形导入
private void BTN_IMPORT_Click(object sender, EventArgs e)
{
    if (G_CadHandle == (IntPtr)0)
    {
        if (ZmotionCad.ZMotionCadArray_OpenEth("127.0.0.1", out G_CadHandle) != 0)
        {
            MessageBox.Show("控制器连接失败");
            return;
        }
    }
    OpenFileDialog openFileDialog1 = new OpenFileDialog();
    openFileDialog1.InitialDirectory = "\\";
    openFileDialog1.Filter = "DXF File(*.dxf)|*.dxf|PLT File(*.PLT)|*.PLT|AI File(*.AI)|*.AI|DST File(*.DST)|*.DST";
    openFileDialog1.RestoreDirectory = true;
    openFileDialog1.FilterIndex = 1;
    if (openFileDialog1.ShowDialog() == DialogResult.OK)            //打开配置文件
    {
        strFilePath = openFileDialog1.FileName;
        int iret = ZmotionCad.ZMotionCadArray_ImportVectGraph(strFilePath, 1024, 1, m_refDistance);
        iret = ZmotionCad.ZMotionCadArray_GetVectNum(ref ZCad_ArrayLen);           //导入数据
        ZCad_ArrayInfo = new ZmotionCad.Struct_ZCad_Array[ZCad_ArrayLen];
        iret = ZmotionCad.ZMotionCadArray_GetVectArray(ref ZCad_ArrayInfo[0], ZCad_ArrayLen);         //获取图形数据
        iret = ZmotionCad.ZMotionCadArray_IfCloseVect(false);             //是否只处理封闭轨迹
        //合并相连线
        iret = ZmotionCad.ZMotionCadArray_MergeSeg(0.5, If_Choose);
        Get_Array();
        float Image_Left, Image_bottom, Image_Width, Image_Height;
        Image_Left = 0;
        Image_bottom = 0;
        Image_Width = 0;
        Image_Height = 0;
        iret = ZmotionCad.ZMotionCadArray_GetRange(ref Image_Left, ref Image_bottom, ref Image_Width, ref Image_Height, 0.05);
        if (Image_Width < 0.0001 && Image_Height < 0.0001)
        {
            Image_Left = (float)0.0;
            Image_bottom = (float)0.0;
            Image_Width = (float)100.0;
            Image_Height = (float)100.0;
        }
        double ObjectPixHeight, ObjectPixWidth;
        if (Image_Width * PicHeight <= Image_Height * PicWidth)
        {
            ObjectPixHeight = PicHeight;
            ObjectPixWidth = ObjectPixHeight * Image_Width / Image_Height;
        }
        else
        {
            ObjectPixWidth = PicWidth;
            ObjectPixHeight = ObjectPixWidth * Image_Height / Image_Width;
        }
        //缩放比例
        double dScale = 0.0;
        dScale = ObjectPixHeight / Image_Height;
        m_dUnitsPerMm = dScale * 1;
        //偏移
        m_dTranX = (MyPicture.Width - ObjectPixWidth) / 2 - Image_Left * dScale;
        m_dTranY = (MyPicture.Height - ObjectPixHeight) / 2 - Image_bottom * dScale;
        Show_Picture();
        If_ImportArray = true;
    }
}

04 绘制图形


05 点击启动,进行控制器前瞻参数设置

private void BTN_RUN_Click(object sender, EventArgs e)
{
    if (If_ImportArray == false)
    {
        MessageBox.Show("未导入加载图形");
        return;
    }
    Maxspeed = Convert.ToSingle(T_Speed.Text);
    Accel = Convert.ToSingle(T_Accel.Text);
    Decel = Convert.ToSingle(T_Decel.Text);
    Sramp = Convert.ToSingle(T_Sramp.Text);
    Lspeed = Convert.ToSingle(T_LSpeed.Text);
    Corner_Mode = Convert.ToInt32(T_CornerMode.Text);
    LimitR = Convert.ToSingle(T_LimitR.Text);
    Limitminspeed = Convert.ToSingle(T_MinSpeed.Text);
    Zsmooth = Convert.ToSingle(T_Zsmooth.Text);
    DecelAngle = Convert.ToSingle(T_DecelAngle.Text);
    StopAngle = Convert.ToSingle(T_StopAngle.Text);
    diserr = Convert.ToSingle(T_diserr.Text);       
    SplineDis = Convert.ToSingle(T_SplineDis.Text);
    cornerAccel = Convert.ToSingle(T_CornerAcc.Text);        
    HighJerk = Convert.ToSingle(T_HighJerk.Text);          
    FitErr = Convert.ToDouble(T_FitErr.Text);
    AxisXnum = Convert.ToInt16(T_AxisXNum.Text);
    AxisYnum = Convert.ToInt16(T_AxisYNum.Text);
    //初始化参数
    zmcaux.ZAux_Direct_SetSpeed(G_CardHandle, AxisXnum, Maxspeed);
    zmcaux.ZAux_Direct_SetAccel(G_CardHandle, AxisXnum, Accel);
    zmcaux.ZAux_Direct_SetDecel(G_CardHandle, AxisXnum, Decel);
    zmcaux.ZAux_Direct_SetSramp(G_CardHandle, AxisXnum, Sramp);
    zmcaux.ZAux_Direct_SetLspeed(G_CardHandle, AxisXnum, Lspeed);
    zmcaux.ZAux_Direct_SetMerge(G_CardHandle, AxisXnum, 1);
    zmcaux.ZAux_Direct_SetCornerMode(G_CardHandle, AxisXnum, Corner_Mode);
    zmcaux.ZAux_Direct_SetFullSpRadius(G_CardHandle, AxisXnum, LimitR);
    StringBuilder cmdbuffack = new StringBuilder(2048);
    zmcaux.ZAux_Execute(G_CardHandle, "SPLIMIT_RADIUS("+ AxisXnum.ToString() +") = " + Limitminspeed.ToString(), cmdbuffack, 2048);
    zmcaux.ZAux_Direct_SetZsmooth(G_CardHandle, AxisXnum, Zsmooth);
    zmcaux.ZAux_Direct_SetDecelAngle(G_CardHandle, AxisXnum, (float)((DecelAngle/180)*Math.PI));
    zmcaux.ZAux_Direct_SetStopAngle(G_CardHandle, AxisXnum, (float)((DecelAngle / 180) * Math.PI));
    zmcaux.ZAux_Direct_SetStartMoveSpeed(G_CardHandle, AxisXnum, Maxspeed );
    zmcaux.ZAux_Direct_SetEndMoveSpeed(G_CardHandle, AxisXnum, Maxspeed );
          
    MoveThread = new Thread(new ThreadStart(Thread_Move));
    MoveThread.Start();
}

06 轨迹运行线程,开始解析CAD小线段轨迹

//轨迹运行线程
private void Thread_Move()
{
    double Pos_x1, Pos_x2, Pos_z1, Pos_y1, Pos_y2, Pos_z2;
    double Pos_x1_2, Pos_x2_2, Pos_z1_2, Pos_y1_2, Pos_y2_2, Pos_z2_2;
    bool ifsplit = false;
    bool ifdownZ = false;
    for (int i = 0; i < ZCad_ArrayLen; i++)                //遍历数组
    {
        Pos_x1 = ZCad_ArrayInfo[i].x1;
        Pos_x2 = ZCad_ArrayInfo[i].x2;
        Pos_z1 = ZCad_ArrayInfo[i].z1;
        Pos_y1 = ZCad_ArrayInfo[i].y1;
        Pos_y2 = ZCad_ArrayInfo[i].y2;
        Pos_z2 = ZCad_ArrayInfo[i].z2;              
        ifsplit = false;
        if((If_Choose == true) && (ZCad_ArrayInfo[i].m_nChoose  == 0)) continue; 
        switch (ZCad_ArrayInfo[i].m_nItemtype)
        {
            case ZmotionCad.ZCAD_ITEMTYPE_VECT:        //此处开始是曲线类型 
                break;
            case ZmotionCad.ZCAD_ITEMTYPE_VECTPoint:   //点
                if (ZCad_ArrayInfo[i].m_nEmptyMove != 0)
                //if ((ZCad_ArrayInfo[i].m_nInVectFrist == 1))              //是否轨迹起点起始
                {
                    StartPos(Pos_x1, Pos_y1);     //空移到起点
                    OriginalPos.Clear();          //清空记录cad点位
                    SavePos(Pos_x1, Pos_y1);      //把起点存下来
                }
                SavePos(Pos_x2, Pos_y2);       //记录过程点                     
                if (i + 1 < ZCad_ArrayLen)
                {
                    Pos_x1_2 = ZCad_ArrayInfo[i + 1].x1;
                    Pos_x2_2 = ZCad_ArrayInfo[i + 1].x2;
                    Pos_z1_2 = ZCad_ArrayInfo[i + 1].z1;
                    Pos_y1_2 = ZCad_ArrayInfo[i + 1].y1;
                    Pos_y2_2 = ZCad_ArrayInfo[i + 1].y2;
                    Pos_z2_2 = ZCad_ArrayInfo[i + 1].z2;
                    //判断下个点是否空移点
                    if ((ZCad_ArrayInfo[i + 1].m_nInVectFrist == 1) )             //下条运动为空移点
                    {
                        DownSmoothPos();//下发轨迹
                     }
                }
                break;
            case ZmotionCad.ZCAD_ITEMTYPE_VECTArc:     //圆、圆弧
                break;
            default:
                break;
        }
    }
    while (true)
    {
        int idle = 0;
        zmcaux.ZAux_Direct_GetIfIdle(G_CardHandle, AxisXnum, ref idle);
        if (idle != 0) break;
    }
    zmcaux.ZAux_Direct_Single_Cancel(G_CardHandle, AxisRnum, 2);
}
//移动到轨迹起点
private void StartPos(double Xpos, double Ypos)
{
    //缓冲区有剩余
    while(true)
    {
        int showbuff = 0;
        zmcaux.ZAux_Direct_GetRemain_LineBuffer(G_CardHandle, AxisXnum, ref showbuff);
        if (showbuff > 128) break;
    }
    StringBuilder cmdbuffack = new StringBuilder(2048);
    if (ifopenzsmoothmode == true)
    {
        zmcaux.ZAux_Execute(G_CardHandle, "ZSMOOTH_START()AXIS(" + AxisXnum.ToString() + ")", cmdbuffack, 2048);
    }
    //空移到起点
    zmcaux.ZAux_Direct_SetForceSpeed(G_CardHandle, AxisXnum, Maxspeed);
    zmcaux.ZAux_Direct_MoveAbsSp(G_CardHandle, 2, new int[] { AxisXnum, AxisYnum}, new float[] { Convert.ToSingle(Xpos), Convert.ToSingle(Ypos)});       
    while (true)
    {
        int idle = 0;
        zmcaux.ZAux_Direct_GetIfIdle(G_CardHandle, AxisXnum, ref idle);
        if (idle != 0) break;
    }
}

07 对提取出的CAD轨迹数组使用连续平滑函数,并下发给控制器执行


教学视频请点击→

强实时运动控制内核MotionRT750(十一):C#实现CAD导图和小线段速度前瞻优化

二维码.webp

正运动技术专注于运动控制技术研究和通用运动控制软硬件产品的研发,是国家级高新技术企业。正运动技术汇集了来自华为、中兴等公司的优秀人才,在坚持自主创新的同时,积极联合各大高校协同运动控制基础技术的研究,是国内工控领域发展最快的企业之一,也是国内少有、完整掌握运动控制核心技术和实时工控软件平台技术的企业。主要业务有:运动控制卡_运动控制器_EtherCAT运动控制卡_EtherCAT控制器_运动控制系统_视觉控制器__运动控制PLC_运动控制_机器人控制器_视觉定位_XPCIe/XPCI系列运动控制卡等等。


 

状 态: 离线

公司简介
产品目录

公司名称: 深圳市正运动技术有限公司
联 系 人: 戴德弟
电  话: 0755-32976042
传  真: 0755-2606 6955
地  址: 深圳市宝安区西乡洲石路阳光工业园A1栋5楼
邮  编: 518100
主  页:
 
该厂商相关技术文摘:
紧凑型网络运动控制卡ECI1808/ECI1A08
自主自研运动控制集成开发平台RTSys(二):EtherCAT总线快速配置
机器视觉运动控制一体机在导热硅脂涂胶的应用
EtherCAT运动控制器配套用手持示教器ZHD301X快速入门
便携式手持示教器ZHD301X
强实时运动控制内核MotionRT750(十):运动控制中的微调轨迹动态补偿
机器视觉运动控制一体机在大功率共模电感多面AI外观缺陷检测应用
MotionRT750 SoftMotion:XPCIE1032H超高速运动控制卡在AOI检测设备上的应用
强实时运动控制内核MotionRT750(九):内置C语言的自定义机械手模型实现
NEPCON ASIA 2025:解锁行业新机遇,我们在深圳等您
开放式激光振镜运动控制器在旋转飞行打标中的应用
更多文摘...
立即发送询问信息在线联系该技术文摘厂商:
用户名: 密码: 免费注册为中华工控网会员
请留下您的有效联系方式,以方便我们及时与您联络

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 不良信息举报
工控网客服热线:0755-86369299
版权所有 中华工控网 Copyright©2022 Gkong.com, All Rights Reserved