精华内容
下载资源
问答
  • PMAC ( Programmable Multi-Axis Controller) 可编程多轴运动控制器,是美国Delta Tau Data System公司推出的PC 机平台上的运动控制器,是一个完全开放的系统。

    一、PMAC概述

    PMAC ( Programmable Multi-Axis Controller) 可编程多轴运动控制器,是美国Delta Tau Data System 公司推出的PC 机平台上的运动控制器,是一个完全开放的系统。它采用了Motorola 公司的高性能信号数字处理器DSP5600作为CPU ,是世界上功能最强大的运动控制器之一。Delta Tau公司已在2016年被欧姆龙收购。

    在整个 PMAC 的系列产品中包括:PMAC(1)系列、PMAC2 系列、Turbo PMAC(1)系列、Turbo PMAC2 系列、MACRO 系列和 UMAC 系列等。

    博主主要使用板为Turbo PMAC Clipper,搭载的是Turbo PMAC2 CPU。Clipper提供4 个控制轴,可输出滤波PWM或16位DAC和脉冲加方向,以及32位通用TTL电平I/O点。标准版本即带有Ethernet、USB和RS232 通讯接口以及内置 I/O, 方便用户进行控制器与上位机的连接, 并可以通过选择轴扩展卡对伺服通道及 I/O端口进行扩展。编码器支持AB相正交信号,正余弦信号与串行信号。
    在这里插入图片描述

    二、PMAC执行软件工具

    PMAC Executive Pro2 Suite是一个创建、管理PMAC程序的开发工具。这套开发工具支持Windows XP与Windows 2000操作系统,套件中包含PMAC PlotPro2,PMAC Tuning Pro2与许多简单易用的配置向导,可以配置所有的PMAC控制器。

    PeWin32 PRO2 的功能十分强大,作为执行程序,它用来帮助同 PMAC 卡进行通讯,下载和运行运动控制程序,监控运动控制卡和伺服电机状态。通过执行程序可以存取所有 PMAC 的特性,用于设置伺服电机,调试和发送在线指令;编写 PLC和运动控制程序,发送指令,动态观测窗口等。

    PeWin32 PRO2 是DELTA TAU公司开发的支持 Microsoft Windows系列的软件工具包。它由以下组件组成:

    • Pewin32Pro2:它是调试和设定PMAC的程序,是软件包的主程序;
    • PmacPlot32Pro2:它可以在运动过程中访问各种内存寄存器,绘制和分析运动中电机
      的各种状态;
    • PmacTuningPro2:可以最优化电机的速度和加速度特性;
    • P1Setup32Pro2:采用向导界面,帮助我们设置I型卡;
    • P2Setup32Pro2:采用向导界面,帮助我们设置II型卡;
    • TurboSetup32Pro2:采用向导界面,帮助我们设置Turbo PMAC卡、UMAC、QMAC、MACRO Station;
    • UmacConfigPro2:识别并配置UMAC的各种组件;

    其中 Pewin32Pro2、PmacPlot32Pro2、PmacTuningPro2三个为主要软件。

    三、下位机程序

    PMAC主要有PLC和PROG运动程序,他们各司其职,开发者应发挥它本来的本领:

    • 问题1 PLC和PROG的区别?
      PLC: 主要负载实时性强的任务,如警报扫描。
      PROG: 主要负责对轨迹要求高的任务,两轴插补画圆等。
    • 问题2 PLCC和PLC的区别?
      PLCC是编译性,速度更快,PLC是解释性,速度较慢

    四、下载安装

    官网软件下载页面,我们可以看到三个下载选项,上面所说的三个主要软件及其他软件都在第三个PMAC Executive Pro2 Suite软件包里面。下载第三个安装即可。
    要注意前两个对应的是另外一种板卡Power PMAC。
    在这里插入图片描述
    安装后目录如下
    要注意PeWin32 PRO2 是工具包。Pewin32Pro2 是工具包里的主要工具。如果不是默认路径安装,第一次在Tool中打开这些工具需要自行查找安装地址进行打开。
    在这里插入图片描述

    五、上位机编程手册PcommServer

    (趁过年还有时间,赶紧码完,码完回去就可以好好休假了。
    要想开发上位机需要看这本手册,介绍了具体函数的定义,当然刚入门最好有相关DEMO比较好学习,在泰道中国官网技术支持中有比较多的配置分享,有C#,C++等语言的上位机DEMO。
    在这里插入图片描述
    主要使用两个函数就能进行相当强大的开发。
    发送:GetResponseEx(),如发送“#1j+, “?”, “Open Prog1”
    读取:GetControlResponseEx(),如获取M变量

    六、推荐上位机开发环境 Microsoft Visual C++ 2019

    Microsoft Visual C++ 2019,Microsoft Visual C++(简称Visual C++、MSVC、VC++或VC)是微软公司的C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。VC++集成了便利的调试工具,特别是集成了微软Windows视窗操作系统应用程序接口(Windows API)、三维动画DirectX API,Microsoft .NET框架。当前最新的版本是Microsoft Visual C++ 2019。安装教程有很多可参考,读者可自行安装。

    七、拓展链接:

    PAMC官网:DELTA TAU
    官网手册:手册大全
    国内相关:中国工控网
    友情链接: 文大侠PMAC教程

    八、参考文献

    [1]欧姆龙.PMAC强化运动控制[EB/OL].https://www.fa.omron.com.cn/info/18120.html,.




    附录(Turbo Clipper卡不用理会这部分):

    (Turbo Clipper卡不用理会这部分)
    (Turbo Clipper卡不用理会这部分)
    (Turbo Clipper卡不用理会这部分)
    一开始博主都下载了,但是也给个方便,如果你是PowerPmac的卡,要弄PDK,而我们看第二个POWER PMAC开发套件介绍,就是支持.NET组件开发的SDK文件。下载安装后目录如下,打开License ,site key为:SL7762DELTA539,来源,以获得授权。
    在这里插入图片描述
    ReadMe.pdf 中说,博主64位win10,故复制 dkeylib32.dll、dkeylib64.dll和clllicfile.lic到windows\system32文件夹,如果开发上位机软件,还需要复制到包含客户端应用程序的本地文件夹和客户端计算机。
    友情链接:https://blog.csdn.net/jackiexzy/article/details/79549359

    用Visual C++打开例程demo

    打开 SDK/sample/C# 目录下的例程之一 GatherToolDemo.sln,如果出现下述情况,那去下载对应开发者包运行安装。没有,重启试试,失败了,还是没有。那么就在项目右键打开属性改目标框架为 .NET Framework 4.6,并且按照指示,保存项目,关闭,重新打开,编译成功,如下图。
    在这里插入图片描述
    在这里插入图片描述
    编译结果,终于成功打开了例程demo。
    在这里插入图片描述

    展开全文
  • Power PMAC运动控制器 —— 学习笔记1

    万次阅读 多人点赞 2019-01-21 22:50:35
    PMAC运动控制卡 学习笔记1说明1. 硬件介绍2. 准备工作3. PMAC与上位机的连接4. 创建自己的伺服控制项目5. 学习途径 说明     &...

        有很多朋友跟博主一样,拿到PMAC控制器后一脸懵逼,技术只给了几个英文手册,便什么都不管了,咨询问题的时候敷衍了事。为了避免更多朋友像博主一样,决定跟大家分享一下Power PMAC运动控制器的使用经验。


        项目结题,分析原因,我发现我们刚拿到控制器时迷茫的原因有三:

    • 其一,没有任何经验,害怕设备损害的害怕心理;
    • 其二,没有人领进门,即使刚开始的时候技术给提供帮助,在一无所知、大脑一片空白的情况下很快就会忘记技术所给你讲过的内容;
    • 其三,手册的内容太多,且为英文,而多数人英语阅读能力有限

            但是,当你了解到整个开发过程后,再回过头来看,发现手册还是最好的老师

                                                        于2019.08.10修


    为了方便大家检索,下面列出学习笔记的目录。

    关于 《Power PMAC运动控制器 —— 学习笔记》 系列,目录如下:

    1. Power PMAC运动控制器——学习笔记1,主要介绍了PMAC与IDE环境的连接以及项目的创建
    2. Power PMAC运动控制器——学习笔记2,主要介绍了电机、EtherCAT网络在IDE中的配置以及基本的运动程序编写知识基础
    3. Power PMAC运动控制器——学习笔记3,主要介绍了PMAC中关于坐标系、轴和运动模式的概念,以及运动程序的编写
    4. Power PMAC运动控制器——学习笔记4,主要介绍了正逆运动学在PMAC中的实现
    5. Power PMAC运动控制器——学习笔记5,主要介绍了PLC程序和子程序的编写
    6. Power PMAC运动控制器——学习笔记6,主要介绍了Power PMAC中Modbus通信的实现以及EtherCAT网络的使能
    7. Power PMAC运动控制器——学习笔记7,主要介绍了Power PMAC配置EtherCAT下的力矩控制

    说明

           博主由于项目需要开始接触PMAC系列运动控制卡 ,奈何资料太少,能找到的资料由于版本不同的原因导致无法使用,本着开源精神,以此记录整个项目过程中Power PMAC的使用,希望能同各路大神交流分享~

    目标:上位机通过Modbus TCP给运动控制卡发送指令实现机械臂的同步控制

    1. 硬件介绍

           PMAC全称Programmable Multi-Axis Controller(可编程多轴运动控制器 ),是美国Delta Tau Data System 公司(现已被欧姆龙收购,说到被收购我就不得不吐槽一下,自从被收购以后技术大牛都走了,遇到技术问题只能用户自己瞎摸索,欧姆龙你上点心好嘛 😂 )推出的运动控制器[^1],功能很强大,号称可实现纳米级控制,同步性不错,尤其是插补功能做的非常好,并且支持多厂商的驱动器、光栅尺等。
           本文主要介绍项目中用到的欧姆龙的CK3M型号,模块化的设计深得我心,可实现单元的扩展,而且单元之间的连接无需工具。规格参数如下图所示:


    性能参数

           系统基本构成如下图所示:

           更多细节就不多介绍了,详情请参考官网

    2. 准备工作

           首先安装PowerPMAC IDE,该IDE环境是基于VS2015开发的,如果你熟悉VS工作环境,那么必然非常容易上手该IDE(如图所示)。


    如果你不清楚环境的使用,可以在工具栏的帮助目录下找到PowerPMAC IDE手册,如下所示:

           在熟悉了IDE环境之后(相当于废话哈哈哈哈,直接上手即可),我们直接开干~
    需要的手册主要有:软件参考手册、用户使用手册,所有文件已在百度云盘共享(失效请留言)。

    3. PMAC与上位机的连接

    • step1 用双绞线电缆建立CK3M与电脑主机的连接,然后给CK3M上电(注意:千万千万千万别接反了,不然稍不留神上万元就没了 😂 )。
    • step2 PMAC默认IP为192.168.0.200,握手成功后我们打开IDE环境,点击:通讯设置->应用,注意要选择设备的IP地址。

      在这里插入图片描述

    ①连接成功后,IDE的标题栏会显示PMAC的版本信息,且由灰色变为绿色。

    在这里插入图片描述

    ②如果连接失败或者连接没反应,我们可以通过<运行>功能ping一下PMAC,查看是否已经握手成功,如果已经握手成功(如下图所示),上位机会收到CK3M的反馈。
    运行:window + R


    在这里插入图片描述

    那么问题可能出在上位机的IP设置上,找到网络适配器设置,选择与PMAC连接的接口,按下图设置,最后单击确定。(注意:更改适配器的设置可能会导致下次网线连接此口时无法进行网络访问,那时需要恢复设置为【自动获得IP地址】),修改完毕后重复step2。如果仍然连接失败,断开网络再试试。 😇

    在这里插入图片描述

    4. 创建自己的伺服控制项目

            创建项目的过程跟VS中project的创建几乎无差,在此不再赘述,参见Power PMAC IDE手册P139。项目目录结构如下:


    在这里插入图片描述

            为防止在调试过程中由于参数设置不当导致伺服电机或驱动器的损坏,我们可以通过设置虚轴的方式进行模拟调试。
            虚轴设置如下:

    //来自官方论坛某大神
    // Activate servo algorithms for motors
    Motor[1].ServoCtrl=1
    Motor[2].ServoCtrl=1
    Motor[3].ServoCtrl=1
    Motor[4].ServoCtrl=1
    Motor[5].ServoCtrl=1
    Motor[6].ServoCtrl=1
    Motor[7].ServoCtrl=1
    Motor[8].ServoCtrl=1
    
    // Write servo output to user shared memory registers
    Motor[1].pDac=Sys.Idata[1].a    // Same as EncTable[1].pEnc
    Motor[2].pDac=Sys.Idata[2].a    // Same as EncTable[2].pEnc
    Motor[3].pDac=Sys.Idata[3].a    // Same as EncTable[3].pEnc
    Motor[4].pDac=Sys.Idata[4].a    // Same as EncTable[4].pEnc
    Motor[5].pDac=Sys.Idata[5].a    // Same as EncTable[5].pEnc
    Motor[6].pDac=Sys.Idata[6].a    // Same as EncTable[6].pEnc
    Motor[7].pDac=Sys.Idata[7].a    // Same as EncTable[7].pEnc
    Motor[8].pDac=Sys.Idata[8].a    // Same as EncTable[8].pEnc
    
    // Encoder conversion table entry to read and integrate this
    EncTable[1].type=1            // 32-bit register read
    EncTable[1].pEnc=Sys.idata[1].a    // Same as Motor[1].pDac
    EncTable[1].pEnc1=Sys.pushm        // Dummy read (not used)
    EncTable[1].index1=0            // No shift right of source data
    EncTable[1].index2=0            // No shift left of source data
    EncTable[1].index3=0            // No accel limiting
    EncTable[1].index4=1            // Single integration
    EncTable[1].PrevDelta=0        // No bias before integration
    EncTable[1].MaxDelta=0        // No velocity limit
    EncTable[1].ScaleFactor=1/65536    // 32 bits -> 16 bits
    
    EncTable[2].type=1            // 32-bit register read
    EncTable[2].pEnc=Sys.idata[2].a    // Same as Motor[2].pDac
    EncTable[2].pEnc1=Sys.pushm        // Dummy read (not used)
    EncTable[2].index1=0            // No shift right of source data
    EncTable[2].index2=0            // No shift left of source data
    EncTable[2].index3=0            // No accel limiting
    EncTable[2].index4=1            // Single integration
    EncTable[2].PrevDelta=0        // No bias before integration
    EncTable[2].MaxDelta=0        // No velocity limit
    EncTable[2].ScaleFactor=1/65536    // 32 bits -> 16 bits
    
    EncTable[3].type=1            // 32-bit register read
    EncTable[3].pEnc=Sys.idata[3].a    // Same as Motor[3].pDac
    EncTable[3].pEnc1=Sys.pushm        // Dummy read (not used)
    EncTable[3].index1=0            // No shift right of source data
    EncTable[3].index2=0            // No shift left of source data
    EncTable[3].index3=0            // No accel limiting
    EncTable[3].index4=1            // Single integration
    EncTable[3].PrevDelta=0        // No bias before integration
    EncTable[3].MaxDelta=0        // No velocity limit
    EncTable[3].ScaleFactor=1/65536    // 32 bits -> 16 bits
    
    EncTable[4].type=1            // 32-bit register read
    EncTable[4].pEnc=Sys.idata[4].a    // Same as Motor[4].pDac
    EncTable[4].pEnc1=Sys.pushm        // Dummy read (not used)
    EncTable[4].index1=0            // No shift right of source data
    EncTable[4].index2=0            // No shift left of source data
    EncTable[4].index3=0            // No accel limiting
    EncTable[4].index4=1            // Single integration
    EncTable[4].PrevDelta=0        // No bias before integration
    EncTable[4].MaxDelta=0        // No velocity limit
    EncTable[4].ScaleFactor=1/65536    // 32 bits -> 16 bits
    
    EncTable[5].type=1            // 32-bit register read
    EncTable[5].pEnc=Sys.idata[5].a    // Same as Motor[5].pDac
    EncTable[5].pEnc1=Sys.pushm        // Dummy read (not used)
    EncTable[5].index1=0            // No shift right of source data
    EncTable[5].index2=0            // No shift left of source data
    EncTable[5].index3=0            // No accel limiting
    EncTable[5].index4=1            // Single integration
    EncTable[5].PrevDelta=0        // No bias before integration
    EncTable[5].MaxDelta=0        // No velocity limit
    EncTable[5].ScaleFactor=1/65536    // 32 bits -> 16 bits
    
    EncTable[6].type=1            // 32-bit register read
    EncTable[6].pEnc=Sys.idata[6].a    // Same as Motor[6].pDac
    EncTable[6].pEnc1=Sys.pushm        // Dummy read (not used)
    EncTable[6].index1=0            // No shift right of source data
    EncTable[6].index2=0            // No shift left of source data
    EncTable[6].index3=0            // No accel limiting
    EncTable[6].index4=1            // Single integration
    EncTable[6].PrevDelta=0        // No bias before integration
    EncTable[6].MaxDelta=0        // No velocity limit
    EncTable[6].ScaleFactor=1/65536    // 32 bits -> 16 bits
    
    EncTable[7].type=1            // 32-bit register read
    EncTable[7].pEnc=Sys.idata[7].a    // Same as Motor[7].pDac
    EncTable[7].pEnc1=Sys.pushm        // Dummy read (not used)
    EncTable[7].index1=0            // No shift right of source data
    EncTable[7].index2=0            // No shift left of source data
    EncTable[7].index3=0            // No accel limiting
    EncTable[7].index4=1            // Single integration
    EncTable[7].PrevDelta=0        // No bias before integration
    EncTable[7].MaxDelta=0        // No velocity limit
    EncTable[7].ScaleFactor=1/65536    // 32 bits -> 16 bits
    
    EncTable[8].type=1            // 32-bit register read
    EncTable[8].pEnc=Sys.idata[8].a    // Same as Motor[8].pDac
    EncTable[8].pEnc1=Sys.pushm        // Dummy read (not used)
    EncTable[8].index1=0            // No shift right of source data
    EncTable[8].index2=0            // No shift left of source data
    EncTable[8].index3=0            // No accel limiting
    EncTable[8].index4=1            // Single integration
    EncTable[8].PrevDelta=0        // No bias before integration
    EncTable[8].MaxDelta=0        // No velocity limit
    EncTable[8].ScaleFactor=1/65536    // 32 bits -> 16 bits
    
    // Read the encoder conversion table result as feedback
    Motor[1].pEnc=EncTable[1].a        // Position loop feedback source
    Motor[1].pEnc2=EncTable[1].a    // Velocity loop feedback source
    Motor[2].pEnc=EncTable[2].a        // Position loop feedback source
    Motor[2].pEnc2=EncTable[2].a    // Velocity loop feedback source
    Motor[3].pEnc=EncTable[3].a        // Position loop feedback source
    Motor[3].pEnc2=EncTable[3].a    // Velocity loop feedback source
    Motor[4].pEnc=EncTable[4].a        // Position loop feedback source
    Motor[4].pEnc2=EncTable[4].a    // Velocity loop feedback source
    Motor[5].pEnc=EncTable[5].a        // Position loop feedback source
    Motor[5].pEnc2=EncTable[5].a    // Velocity loop feedback source
    Motor[6].pEnc=EncTable[6].a        // Position loop feedback source
    Motor[6].pEnc2=EncTable[6].a    // Velocity loop feedback source
    Motor[7].pEnc=EncTable[7].a        // Position loop feedback source
    Motor[7].pEnc2=EncTable[7].a    // Velocity loop feedback source
    Motor[8].pEnc=EncTable[8].a        // Position loop feedback source
    Motor[8].pEnc2=EncTable[8].a    // Velocity loop feedback source
    
    
    // Disable overtravel limit inputs
    // May be needed if there are no physical switches present
    Motor[1].pLimits=0
    Motor[2].pLimits=0
    Motor[3].pLimits=0
    Motor[4].pLimits=0
    Motor[5].pLimits=0
    Motor[6].pLimits=0
    Motor[7].pLimits=0
    Motor[8].pLimits=0
    
    // Disable amplifier enable output
    // May be needed if channel is also connected to real amplifier
    Motor[1].pAmpEnable=0
    Motor[2].pAmpEnable=0
    Motor[3].pAmpEnable=0
    Motor[4].pAmpEnable=0
    Motor[5].pAmpEnable=0
    Motor[6].pAmpEnable=0
    Motor[7].pAmpEnable=0
    Motor[8].pAmpEnable=0
    
    // Disable amplifier fault input
    // May be needed if channel is also connected to real amplifier
    Motor[1].pAmpFault=0
    Motor[2].pAmpFault=0
    Motor[3].pAmpFault=0
    Motor[4].pAmpFault=0
    Motor[5].pAmpFault=0
    Motor[6].pAmpFault=0
    Motor[7].pAmpFault=0
    Motor[8].pAmpFault=0
    
    // Set derivative gain term in servo loop to zero
    // This is a Type 1 servo (single integration); does not need Kd
    Motor[1].Servo.Kvfb=0
    Motor[2].Servo.Kvfb=0
    Motor[3].Servo.Kvfb=0
    Motor[4].Servo.Kvfb=0
    Motor[5].Servo.Kvfb=0
    Motor[6].Servo.Kvfb=0
    Motor[7].Servo.Kvfb=0
    Motor[8].Servo.Kvfb=0
    // Lower proportional gain term from default
    Motor[1].Servo.Kp=1
    Motor[2].Servo.Kp=1
    Motor[3].Servo.Kp=1
    Motor[4].Servo.Kp=1
    Motor[5].Servo.Kp=1
    Motor[6].Servo.Kp=1
    Motor[7].Servo.Kp=1
    Motor[8].Servo.Kp=1
    // Add integral gain to force to zero error
    Motor[1].Servo.Ki=0.01
    Motor[2].Servo.Ki=0.01
    Motor[3].Servo.Ki=0.01
    Motor[4].Servo.Ki=0.01
    Motor[5].Servo.Ki=0.01
    Motor[6].Servo.Ki=0.01
    Motor[7].Servo.Ki=0.01
    Motor[8].Servo.Ki=0.01
    // Set deadband zone to zero
    Motor[1].Servo.BreakPosErr=0
    Motor[2].Servo.BreakPosErr=0
    Motor[3].Servo.BreakPosErr=0
    Motor[4].Servo.BreakPosErr=0
    Motor[5].Servo.BreakPosErr=0
    Motor[6].Servo.BreakPosErr=0
    Motor[7].Servo.BreakPosErr=0
    Motor[8].Servo.BreakPosErr=0
    // Add feedforward to minimize tracking error
    Motor[1].Servo.Kvff=1
    Motor[1].Servo.Kaff=1
    Motor[2].Servo.Kvff=1
    Motor[2].Servo.Kaff=1
    Motor[3].Servo.Kvff=1
    Motor[3].Servo.Kaff=1
    Motor[4].Servo.Kvff=1
    Motor[4].Servo.Kaff=1
    Motor[5].Servo.Kvff=1
    Motor[5].Servo.Kaff=1
    Motor[6].Servo.Kvff=1
    Motor[6].Servo.Kaff=1
    Motor[7].Servo.Kvff=1
    Motor[7].Servo.Kaff=1
    Motor[8].Servo.Kvff=1
    Motor[8].Servo.Kaff=1
    

            我们把上述代码拷贝到PMAC脚本语言目录下的全局变量定义中,如下图所示:


    在这里插入图片描述

            然后开始写入运动程序,在Motion Programs目录下的prog1.pmc文件中写入运动程序代码,此例中我们以两轴电机绘制矩形为例,把代码写进文件并保存。

    /****************************************/
    //By Jack Soong
    //Time:2019.1.21
    &1 //定义坐标系1
    #1->X; //将电机指定给x,y轴
    #2->Y;
    
     open prog 1 
    // --------------------User Code Goes Here------------------------
    linear  //直线mode
    abs	    //绝对值编程
    tm 500  //插补加速参数设置
    ta 100
    ts 200
    dwell 0 Gather.Enable = 2;dwell  0//将数据收集到先前plot设置元素的缓冲区
    X0 Y0;
    X0 Y100;
    X100 Y100;
    X100 Y0;
    X0 Y0;
    dwell 100; //延时
    Gather.Enable = 0;dwell 0  //关闭收集
    close
    /****************************************/
    

            完成上述步骤后,在解决方案名称上右击选择构建并下载所有程序,将程序下载到CK3M中,注意:如果连接实际硬件,需要在配置完电机后先选择映射PowerPMAC变量。


            OK!接下来我们就要让它动起来了,首先打开数据收集功能,在代码中我们已经开启了数据收集并保存到缓存中,这是我们需要在程序真正运行之前打开数据收集界面(位于菜单栏中,即绘图功能),如下图所示。



            在终端中输入"#1…2j/“命令先使能电机,然后用命令”&1 b1 r"运行我们的运动程序,在程序运行过程中,绘图界面上传数据按钮下方的进度条会随着程序的执行过程而有所变化,待进度条满后点击上传数据,并把要绘制的值添加到坐标轴(选中要添加的值,然后点击>>按钮将其添加到绘制栏,如果需要删除,则在绘制栏中选中该选项点击<<即可删除),此处我们以Motion[1].Cmd Position(即电机1的命令位置,换句话说就是理想输出位置)为横坐标,以Motion[2].Cmd Position为纵坐标绘制图形,得到的绘制图形如下,我们可以看到绘制的矩形似乎不太听话 😂 😂 😂,淡定点老铁,所画图形并非方方正正的矩形的原因在于:Power PMAC中有一个状态位(Coord[x].NoBlend)是用来控制各运动点之间是否进行插补的,Coord[x].NoBlend默认为0,即使能Move Blending,因此走出来的矩形并非理想形状,如果设置Coord[x].NoBlend=1那么这个矩形就比较听话啦!


    5. 程序下载流程

    • step1:使用在线指令$$$***save$$$三个指令清零PMAC
    • step2:检查Motor的硬件接口(PS:老是自己变,咱也不知道为啥~)
    • step3:右击项目树主题,选择映射PowerPMAC变量
      在这里插入图片描述
    • step4:选择构建并下载程序
    • step5:记得要保存项目到PMAC,在线指令save

    6. 学习途径

    [1]前文提到的手册:软件参考手册、用户使用手册
    [2]官方视频教程(发布在Youtube,需要怎么访问你懂的,前文提到的5天培训PPT便是该教程配套的)
    [3]泰道官方论坛
    [4]工控论坛PMAC专区
    [5]文大侠博客
    [6]Jackie的储物袋的博客

    后记

            这几周可谓是历经千辛万险,终于有所入门,可离结题还是遥遥无期,虽然困难重重,但是问题的解决总会伴随着慢慢的成就感,越挫越勇才能成就更好的自己~
            第一次写博文,干货不多,只提供给大家一个初步入门的路子,顺便也当做学习笔记了。在此要感谢北京机科国创的李工、欧姆龙技术支持周工以及我的林副总师兄提供的帮助。

            下期预告:Power PMAC中运动程序的编写

    
    	 [1]: https://baike.baidu.com/item/PMAC/1955812?fr=aladdin
     
    
    展开全文
  • 本文主要说明Power PMAC中EtherCAT通信的驱动器下循环力矩模式(CST)的使用,主要通过操作PDO实现,对于循环速度模式(CSV)同上。 第一步:设置System时钟(默认1kHz),EtherCAT下的循环力矩模式建议设置4kHz+,...

    本文主要说明Power PMAC中EtherCAT通信的驱动器下循环力矩模式(CST)的使用,主要通过操作PDO实现,对于循环速度模式(CSV)同上。

    • 第一步:设置System时钟(默认1kHz),EtherCAT下的循环力矩模式建议设置4kHz+,通过Sys.ServoPeriod设置,单位为kHz。注意:ServoPeriod单位为ms,且必须为62.5μs的倍数。

      若轴过多,4kHz+可能出现通信失败,需尝试降低通信频率!!!

      其他相关的几个状态结构有:

      • Sys.ServoPeriod
      • Sys.ServoTime
      • Sys.RtIntPeriod
      • Sys.RtIntTime
      • Sys.RunTime
    • 第二步:添加EtherCAT主站,注意PowerPMAC的Servo clock必须和主站的Cycle Time匹配。
      在这里插入图片描述

    • 第三步:扫描EtherCAT网络
      在这里插入图片描述

    • 第四步:配置从站时钟,分布式时钟默认与主站相同,如自定义可开启【覆写模式】,具体设置参考Power PMAC IDE手册P226。
      在这里插入图片描述

    • 第五步:配置从站PDO,PDO的设置参考DS402,Elmo驱动器ESI默认是位置模式,这里我们选满足三种循环操作模式的两个PDO组合。
      在这里插入图片描述

    • 第六步:设置初始化命令,默认循环位置模式(CSP=8),在此修改默认循环位置后,电机轴的操作模式及硬件接口将会自动配置,但也要检查自动配置信息是否正确。

    模式 模式值
    Cyclic sync position mode 8
    Cyclic sync velocity mode 9
    Cyclic sync torque mode 10

    在这里插入图片描述

    • 第七步,加载映射到PMAC
      在这里插入图片描述

    • 第八步:添加EtherCAT电机(本文未使用轴的方式,直接通过操作PDO实现的电机控制)

    • 第九步:使能EtherCAT
      在这里插入图片描述

    • 第十步:关闭Power PMAC伺服程序,通过Motor[x].ServoCtrl=0实现,赋值为0后,Motor[x].IqCmd将无数据输出,注意,使用Motor[x]结构体时只能在配置有电机轴以后才能使用。

    • 第十一步:查看PMAC Script Language -> Global Includes -> ECATMap.pmh,以此为参照,通过ECAT的IO进行操作(如程序已下载到PMAC中,则可通过宏进行操作)

    //------------------------------------------------------------------------------
    // <auto-generated>
    //     This code was generated by PowerPMAC IDE.
    //     Date: 2/21/2021, Time: 10:43 AM
    //     
    //     Changes to this file may cause incorrect behavior and will be lost if
    //     the code is regenerated.
    // </auto-generated>
    //------------------------------------------------------------------------------
    
    // Slave_1001 [Elmo Drive ] Station Address-1001
    #define Slave_1001_ElmoDrive_1001_Index 0
    
    // Inputs
    #define Slave_1001_ElmoDrive_1001_6064_0_Positionactualvalue ECAT[0].IO[4096].Data
    #define Slave_1001_ElmoDrive_1001_60F4_0_PositionFollowingerroractualvalue ECAT[0].IO[4097].Data
    #define Slave_1001_ElmoDrive_1001_6077_0_Torqueactualvalue ECAT[0].IO[4098].Data
    #define Slave_1001_ElmoDrive_1001_6041_0_Statusword ECAT[0].IO[4099].Data
    #define Slave_1001_ElmoDrive_1001_6061_0_Modeofoperationdisplay ECAT[0].IO[4100].Data
    
    // Outputs
    #define Slave_1001_ElmoDrive_1001_607A_0_TargetPosition ECAT[0].IO[0].Data
    #define Slave_1001_ElmoDrive_1001_60FF_0_TargetVelocity ECAT[0].IO[1].Data
    #define Slave_1001_ElmoDrive_1001_6071_0_TargetTorque ECAT[0].IO[2].Data
    #define Slave_1001_ElmoDrive_1001_6072_0_MaxTorque ECAT[0].IO[3].Data
    #define Slave_1001_ElmoDrive_1001_6040_0_Controlword ECAT[0].IO[4].Data
    #define Slave_1001_ElmoDrive_1001_6060_0_Modeofoperation ECAT[0].IO[5].Data
    
    • 第十二步:通过PDO接口操作电机,命令如下:
    // 设置电机操作模式为循环力矩模式(CST)
    ECAT[0].IO[5].Data = 10
    
    // 设置电机最大力矩,此处对应电机峰值电流大小,单位为mA
    ECAT[0].IO[3].Data = 20500
    
    // 通过控制字使能电机,使能以后驱动器会有电流声
    ECAT[0].IO[4].Data = 6  // 通信前的准备
    ECAT[0].IO[4].Data = 7  // 掉电
    ECAT[0].IO[4].Data = 15 // 使能
    
    // 写入目标力矩,目标力矩的计算参照下文,此处303代表目标转矩为2A
    ECAT[0].IO[2].Data = 303
    

    关于状态字切换,参照该文:传送门

    控制字 control word:

       6------ -------7-------------15-------------7
    通信前的准备    电机去使能       电机使能       电机去使能
    

    Tips:

    1. 通信准备工作 control word=6;
    2. 在进行控制前,先设置操作模式 mode of operation 在使能电机;
    3. 模式切换,先去使能control word =7, 在重新设置模式。
    • 0x6075:电机额定电流,对应驱动器CL[1](单位A),0x6075电流单位为mA
    • 0x6072:Max Torque,对应驱动器PL[1](单位A),0x6072单位为mA
    • 0x6073:Max Current,计算方式为:(0x6072 * 1000)/ 0x6075
    • 0x6071:目标力矩,计算方式为:目标电流(mA) * 1000 / 0x6075
    • 0x6077:实际电流值(mA),对应驱动器的IQ(A)

    本文电机峰值电流为20.5A,连续电流为6.6A,假设目标电流为2A,则下发CST的命令大小应为:
    2000mA1000/6600mA=3032000mA * 1000 / 6600mA = 303

    展开全文
  • Power PMAC运动控制器 —— 学习笔记2

    千次阅读 多人点赞 2019-08-13 13:40:22
    Power PMAC中运动程序的编写说明1.Power PMAC与运动控制器的连接2.Power PMAC中Project的结构树介绍3.运动模式的介绍3.1 相对模式与绝对模式3.2 运动模式(直线、圆弧、样条、PVT)4. 运动程序的语法、结构5. 在线...

    前记:

    1. 在编写程序之前,请务必先熟悉Project的结构树
    2. 硬件务必保证连接无误且稳定,这是程序能正常调试的前提

    0. 说明


        在《Power PMAC运动控制器 学习笔记1》中,有些许错误,在此更正一下,在文章末尾的画矩形的Demo中,所画图形并非方方正正的矩形的原因在于:Power PMAC中有一个状态位(Coord[x].NoBlend)是用来控制各运动点之间是否进行插补的,Coord[x].NoBlend默认为0,即使能Move Blending,因此走出来的矩形并非理想形状,具体细节在后续博文中介绍。

        本教程主要针对PMAC脚本语言进行讲解,如有机会再对C的编写进行详细介绍。在后续的系列中,主要分以下几部分进行讲解:

    1. Power PMAC中运动程序的编写
    2. Power PMAC中正逆运动学的实现
    3. Power PMAC中PLC程序及子程序的编写
    4. Power PMAC与上位机的Modbus通信
    5. 工程Demo讲解

        本文主要概述一些基本知识,包括Power PMAC与驱动器的连接以及运动程序的编写,为后续项目开发做准备。

    1. Power PMAC与驱动器的的连接


        在欧姆龙官网上我们可以看到CK3M/CK3W系列运动控制器分为三部分:CPU单元、轴接口单元和电源单元,如下图所示:
    在这里插入图片描述

    CK3M、CK3W、CK3E这几款控制器的使用基本差不多。

         其中CPU单元电源单元是必须的,而对于轴接口单元我们可以根据需要来选择。配套的设备,兼容性肯定是好的,所以建议大家在使用的时候,如果没有特殊情况,尽可能的选择运动控制器和驱动器是同一厂家的配套产品。

        博主使用的是以色列elmo的驱动器,因此本文主要介绍CK3Melmo驱动器的连接。

        CK3M主机与驱动器之间走EtherCAT总线,通过双绞网线连接到CK3M主机的EtherCAT接口。更多介绍请参考欧姆龙官网关于CK3M的CPU单元说明书网盘有备份,官网找不到的话可以去网盘下载(提取码: ytjw)。

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

    2. Power PMAC中Project的结构树介绍(重要!)


        在学习笔记1中稍微提到过,这次对于结构树进行详细的说明。
    在这里插入图片描述

    • System:主要包括一些硬件的配置
      • CPU:设置全局时钟和通用CPU设置
      • Hardware:显示检测到的硬件,如外接手柄等
      • EtherCAT:ECAT主站及从站管理和设置
      • Motors:允许添加和配置电机
      • Coordinate Systems:允许配置坐标系统及其结构元素
      • Encoder:维护要在构建和下载中使用的当前编码器表设置
    • C Language:编辑和管理C语言编程文件
      • Background Programs:包含需要运行的后台C程序和相关头文件
      • CPLCs:包含所有后台PLC程序(bgcplc)
      • Include:包含所有C程序都可以包含的头文件
      • Libraries:用于在IDE中添加或开发公共库,用于所有C程序
      • Realtime Routines:包含用户编写的伺服控制程序
    • Configuration:包含一些配置文件,可以通过其来管理启动时应该先运行哪些文件以及在下载时运行哪些文件
    • Documentation:用于存放通用说明文档
    • Log:日志文件,存储下载项目后的调试信息
    • PMAC Script Language:编辑和管理PMAC脚本语言
      • Global Includes:包含任何脚本都可使用的全局变量以及配置信息,在脚本程序下载之前首先会下载它
      • Kinematic Routines:用于存放正逆运动学子程序
      • Libraries:可以存放任何脚本程序都可以使用的子程序
      • Motion Programs:用于存放运动程序
      • PLC Programs:用于存放PLC程序

    备注:

    1. 对于PMAC脚本的编写,最常操作的是System和PMAC Script Language这两项,务必熟悉
    2. System中的硬件配置是能对设备顺利调试的前提

    3. 硬件在控制器中的配置(重要!!)


        按1.1节连接好硬件后,我们接下来开始设置IDE中相应的配置。

    • Step1:连接CK3M主机,请参考上篇博文《Power PMAC运动控制器 —— 学习笔记1》,如果连接有问题,请检查物理连接和防火墙设置

      PowerPMAC IDE在安装时,建议右键以管理员权限运行,安装在默认位置

    • Step2:新建Project项目,点击IDE左上角“文件”按步骤进行新建

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

    • Step3:初始化控制器,在“终端”窗格中,分别键入 $$$***save$$$命令将控制器重置。

      注意,程序下载到运动控制器后,如果使用save保存过,下次上电后会自动运行,为防止危险发生,建议此步操作断开EtherCAT总线

          接下来设置CPU参数,双击结构树中CPU文件夹下的System,选择全局时钟,设置伺服频率(根据需要来),在本项目中使用的是1kHz,切记设置完后要点击右下角的接受,其他参数默认即可。

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

      注意,此处由于没有连接PMAC,因此选项是灰色的。

          设置完以上步骤后,在左下角终端中键入save回车保存参数到PMAC中。
      在这里插入图片描述

    • Step4:加载驱动器xml配置文件,单击PowerPMAC IDE工具栏中的EtherCAT选项下的ESI管理器,点击添加按钮,找到驱动器所对应的 *.xml 文件,选择 打开 按钮,过程如下图所示。

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

    • Step5:添加EtherCAT主站,右击EtherCAT选择添加EtherCAT主站,默认添加为Master0

    在这里插入图片描述
        添加完成后,双击添加的Master0,选择循环周期。注意,循环周期必须根据控制器的伺服频率指定通信周期,由于伺服频率选择的是1kHz,因此此处设置了1000 us。

    在这里插入图片描述

        选择分布式时钟,选择主站偏移,如下图所示:

    在这里插入图片描述

    • Step6:扫描EtherCAT从站,右击添加的Master0,选择扫描EtherCAT网络,系统会自动添加设备服务器从站,以下图片是已经有主从站的项目中截取出来的。

      注意,扫描完成后,需要确认从站数与电机数是否匹配,如不匹配,说明有几个驱动器之间的EtherCAT总线连接有问题,需要检查物理连接

    在这里插入图片描述
        扫描完EtherCAT网络后,双击添加的Slave_xxxx服务器,选择分布式时钟,按下图进行设置:选择FreeRun复写模式

    在这里插入图片描述
    在这里插入图片描述
    按上图设置完成后,选择高级选项按钮,取消图中红框选项。

    在这里插入图片描述

    由于手头没有机器,此选项只能建立连接后才能查看,此图截自官方文档

    • Step7:添加电机,并配置相应的PDO映射。右击Motors文件夹选择添加电机,有几个电机就添加几个,接下来配置电机与驱动器从站Slave_xxxx的连接,通过PDO映射完成。

      注意,在没有完成POD映射之前,不能对电机进行使能命令,没有轴设置的PDO将作为不确定值进行PDO通信,故可能会发生意外。

    在这里插入图片描述
        右击从站Slave_xxxx选择属性,单击PDO映射(PDO Mapping)选项卡,对Inputs和Outputs进行设置,值得注意的是,如果此处设置不当,编码器反馈会出现问题,因此绝大多数问题是出在PDO映射上。

    在这里插入图片描述

    注意,每个Slave从站都需要配置

        设置完PDO映射后,右击Master0选择加载映射到PowerPMAC.

    在这里插入图片描述

    • Step8:设置电机参数,双击Motors文件下的Motor1,出现如下图所示界面。主要设置的是放大器、编码器和硬件接口三项。
      在这里插入图片描述
          单击放大器,,将电机与Slave从站关联起来,配置好后点击接受按钮,如下图所示。
      在这里插入图片描述
          电机编码器选择EtherCAT反馈(根据实际情况进行选择),点击接受按钮。

    在这里插入图片描述
        检查硬件接口是否正确,然后点击接受按钮。
    在这里插入图片描述
        如果配置正确,在接口反馈窗口会出现如下曲线,此处是博主手绘的,参考一下即可。如果接口反馈无数据,是一条直线,则说明配置可能有问题,需要重复上述步骤。
    在这里插入图片描述
        对于用户单位窗口,可以设置电机单位的转换,也可在全局变量中通过Motor[x].PosSfMotor[x].Pos2Sf来设置。
        通常情况下,编码器计数单位为cts,假设电机减速比为100,编码器分辨率为1024,那么减速器输出一圈便是102400cts,即360°,要想在控制程序中直接指定的单位是度,那么可以在此设置电机位置单位为:1024*100/360 单位计数,选择 ,然后单击右下角 接受。对应的Motor[x].PosSf设置为Motor[x].PosSf = 1/(1024*100/360)

        但是博主不建议大家使用,原因在于项目关闭后,每次重新打开项目都需要重新配置,如果忘记配置,那么可能在控制程序中指定的值便是错的,从而导致危险的发生。
        要想实现单位的转换,可以在程序中实现,通过宏定义操作,如:#define cts2deg 1024*100/360

    在这里插入图片描述

    • Step9:为保险起见,使用终端命令save一下

        做好以上步骤,便可以进行实际设备调试了。

    4. 在线命令介绍


        调试时,我们通常先用在线命令去对电机、ECAT等进行操作,对于在线命令的输入,默认位于IDE下方或左下方的Termainal(终端)窗口,如下图所示:
    在这里插入图片描述
    在这里插入图片描述

    下面来介绍一下几个常用的命令。

    • 程序复位: $$$,即reset,如果想清楚PMAC中的数据缓存,可用此命令进行

    • 初始化:$$$***

    • 重启PMAC:reboot或者断电重新上电

    • 保存配置:save

      通常,我们需要完全初始化并保存到闪存时一般按如下步骤进行操作
      Step1: $$$***
      Step2:save
      Step3:$$$

    • 使能ECAT网络:ECAT[0].Enable = 1,使能EtherCAT网络0

    • 关闭ECAT网络:ECAT[0].Enable = 0

    • 停止和使能电机:#1..4j/,使能1到4号电机,如果只使能一个电机则用#nj/,其中n为电机序号

    • 关闭电机:#1k

    • 正向Jog:#1j+

    • 反向Jog:#1j-

    • 回零:#1hm

    • 设置电机Jog速度:Motor[1].JogSpeed = 1000 ,单位问题后续介绍,默认为32,如果电机运行速度很慢,则很有可能是默认值没有修改,或者最大Jog速度没有修改。

    • 设置电机最大Jog速度:Motor[1].MaxSpeed = 2000

    • 运行运动程序:&1b1r&1b1run,意思是运行坐标系1下的b1运动程序,其中b1是运动程序的名字,在写程序时指定

    • 电机模式设置:Slave_0_6060_0_Modeofoperation = 8,前提是已经配置好PDO,将电机设置为位置循环模式
      在这里插入图片描述
      在这里插入图片描述
          对于其他命令,在后续程序中用到时再做讲解。

    5. 参数和变量定义


        使用变量前,首先要搞清楚什么类型的变量能够满足我们的要求,因此变量的声明就显得很关键。

    5.1 变量声明的关键字

    声明关键字 对应的变量类型 范围 精度 说明
    global P变量 65536个可用 64位双精度浮点 可在PMAC的所有程序中全局访问,包括脚本和C,无论坐标系如何,通常在“全局定义”中声明。
    csglobal Q变量 8192个/坐标系 64位双精度浮点 表示在使用它的所有坐标系中具有相同名称的物理上不同的变量,通常在“全局定义”中声明
    ptr M变量 16384个可用 // 指向寄存器并返回寄存器值的指针变量,采用它所指向的寄存器的格式,可在所有程序中全局访问
    local L变量 8192个可用 64位双精度浮点 在程序启动时创建,可用于坐标系系统、PLC、运动程序、子程序、逆运动学以及在线命令中,在程序完成时销毁,即局部变量,只能在程序中声明,而不能声明为全局变量

    其中,M的变量格式如下:

    变量格式 说明
    s 有符号短整型
    i 有符号整型
    u 无符号整型
    f short (32-bit)浮点数,不使用{start}或{width}
    d long (64-bit)浮点数,不使用{start}或{width}

    对于ptr的索引来说,参数说明如下:

    参数 说明
    {start} 0到31(默认值为0,不限于1和4的倍数)
    {width} 1到32(默认值为32,不限于1和4的倍数)

        对于全局变量声明文件,默认文件名称为global definitions.pmh,如下图所示:
    在这里插入图片描述

    注意:
       此文件可以自定义名称,博主建议全局变量可以分类放在不同的全局pmh文件,或者在同一个全局pmh文件中通过类似/******/的分隔符进行分隔,以便于修改和查找。

    5.2 变量声明的示例

    /*****************************  global类型  *****************************/
    global MyGlobal;		// 通常在“全局定义”中声明
    global MyGlobalArray(10);	// 定义一个具有10个元素的数组
    
    /*****************************  csglobal类型  *****************************/
    csglobal MyCSGlobal, MyCSGlobalArray(15);	
    // 通常在“全局定义”中声明
    //当在运动程序中使用这些变量时,所使用变量的实例取决于程序运行的坐标系。同一个变量名可以在多个坐标系中使用
    // 在终端中使用时,【&1 MyCSGlobal】即使用坐标系1下的MyCSGlobal变量
    // 如果需要在PLC中更改坐标系统号,按【 PLC[n].Ldata.Coord = m】的格式进行修改,其中m是坐标系序号
    
    /*****************************  ptr类型  *****************************/
    // VariableName->*{format}[.{width}]
    ptr USHMPtr1->u.user:$4.0.8;  // Sys.Udata[1], bits 0 to 7
    ptr USHMPtr2->u.user:$4.8.8;  // Sys.Udata[1], bits 8 to 15
    ptr USHMPtr3->u.user:$4.16.8;  // Sys.Udata[1], bits 16 to 23
    
    /*****************************  lobal类型  *****************************/
    local index;	// 只能在程序中声明,即在PLCs、Motion Programs、 Subprograms、 、Kinematics中
    
    

    5.3 特殊数值的表示

          对于特殊数值的表示,在PMAC中遵循 IEEE-754 标准。


    • 正无穷:inf
    • 负无穷:-inf

    注意:
         在PMAC中,如果一个数除以0,得到的虽然是无穷值,但PMAC是不报错的。


    • 非值:nan

    注意:
          如sqrt(-1)即可得到,PMAC同样不会报错,可以通过isnan()函数来判断,该函数会返回一个布尔值,若temp = isnan(sqrt(-1)),则temp=1,即sqrt(-1)操作会产生nan值;
         此值来源有两个:一是对负数开根号;二是物理上不存在于系统中的硬件的数据结构元素的值


    • 负零:-0,此数存储按照IEEE-754标准

    6. 运算符的使用


    与C/C++相同:

    • 算数运算符: +   -  *   /    %
    • 位运算符:&   |    ^   ~    <<   >>
    • 条件运算符:==    !=   ~   !~    >   <   >=    <=
    • 逻辑运算符:&&  ||  !
    • 赋值运算符:=  +=  -=  *=  /=  %=  &=  |=  
                  ^=  >>=  <<=  ++   - -

          更多运算符请参考手册《Power PMAC Software Reference Manual》关于【Operators】的介绍,如下图所示:

    在这里插入图片描述

    7. 程序语法


        脚本语言的语法,与C/C++语法基本相同:

    while

    while(Input1 == 0) {} // Pause here until Machine Input 1 goes high
    while(Input2 == 1) 
    { 
    	Counter++; // Increment Counter while Input2 is 1
    }
    

    if

    if(Input1 == 0) // If Machine Input 1 is low
    {
    	Output1 = 0; // Set Output 1 low
    } else
    { 
    	Output1 = 1; // Set Output 1 high
    }
    

    switch

    switch(MachineState)
    {
    	case 0:
    	// action1
    	break;
    	case 1:
    	// action2
    	break;
    	default:
    	// action3
    	break;
    }
    

    goto

        在一般程序中,全局变量及goto强制性跳转语句一般是尽量避免使用的,但是由于控制程序的特殊性,要求逻辑必须清楚,因此在这种情况下是可以使用的,但必须要保证逻辑的安全性,而全局变量在控制程序中的使用是为了不同模块程序之间的相互。

    	/* code */
    N1000:
    	/* code */ 
    	// 此处即构成一个死循环
    
    goto 1000
    	/* code */
    

    8. 后记


        由于某些原因导致PMAC学习笔记长时间未更,在此感谢所有关注的朋友。发布笔记的初衷是为了帮助那些刚接触PMAC的人,避免像我刚开始一样迷茫,不知道该怎么去用这款产品。但分享经验不应该被道德绑架,希望大家都理性对待,每个人都有自己迫不得已的事情要做。也希望所有人都能参与技术共享的圈子,共同进步。

    声明


        1. 仅为技术分享交流,码字不易,转载请说明出处,违者必究,谢谢合作!
        2. 本文图片部分来源于Power PMAC手册,图片版权归欧姆龙所有。

    下节讲解:Power PMAC中运动程序的编写 —— 下

    展开全文
  • Power PMAC运动控制器 —— 学习笔记3

    千次阅读 多人点赞 2019-08-13 00:54:27
    Power PMAC中运动程序的编写 —— 下1. 参数和变量定义2. 坐标系和轴定义3. 运动程序流程4. 数据跟踪5. 编程实例声明 1. 参数和变量定义      2. 坐标系和轴定义      3. 运动程序流程      4. 数据跟踪...
  • Power PMAC运动控制器 —— 学习笔记6

    千次阅读 2019-08-10 19:28:40
    Power PMAC与上位机的Modbus通信 1. 启动modbus服务器 2. 用户共享内存缓冲区变量说明 3. 读取和发送数据 3.1 发送数据 3.2 读取数据 4. EtherCAT网络的使能 声明
  • Power PMAC运动控制器 —— 学习笔记5

    千次阅读 2019-08-10 19:28:43
    Power PMAC中PLC程序及子程序的编写 1. PLC程序的编写 2. 使能和关闭PLC程序的方法 3. PLC中运行运动程序的方法 4. PLC调用子程序的方法 5. 子程序的编写
  • Power PMAC运动控制器 —— 学习笔记4

    千次阅读 2019-08-13 15:37:24
    Power PMAC中正逆运动学的实现 1. 为什么要使用正逆运动学 ? 2. 怎样创建正逆运动学子程序 ? 3. 如何编写运动学程序? 3.0 预备工作 3.1 逆运动学 3.2 正运动学 3.3 运动学在C语言中的实现 4. 官方例程讲解 5. ...

空空如也

空空如也

1 2 3
收藏数 50
精华内容 20
关键字:

pmac学习笔记