尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

汇川AM系列PLC的Codesys多轴控制实战:电子齿轮、凸轮与指针应用

汇川AM系列PLC的Codesys多轴控制实战:电子齿轮、凸轮与指针应用 简介本资源是一套面向自动化工程师与PLC进阶学习者的新能源领域中大型PLC多轴控制实战案例聚焦汇川技术平台在风电、光伏等场景下的高精度运动控制需求解决多轴同步、相对/绝对定位、速度协同等典型工程问题。压缩包共80个文件含34张程序逻辑与HMI界面截图png、2个完整触摸屏工程hmiproj、5个Codesys编译配置文件opt、4个驱动与轴控XML配置如JMC_DRIVE_V1.7.xml、以及so/dll动态库和bin/hex固件文件全面覆盖PLC程序开发、驱动集成、HMI交互及烧录部署全流程整体大小259MB。已有1065人学习下载。读者可直接获取带完整中文注释的Codesys ST源程序、指针操作范例用于动态轴管理与数组访问、20轴协同控制逻辑框架以及配套InoTouchPad触摸屏软件与191系列人机界面工程具备即学即用、调试验证与二次开发基础。 做新能源设备自动化的朋友应该都有同感这些年锂电、光伏产线上多轴联动的设备越来越多。一台设备少则四五个伺服轴多则一二十个轴而且对节拍、同步精度的要求都非常高。我最近整理了一套基于汇川中大型PLC的Codesys多轴控制工程案例把实际调试过程中用过的一些控制思路和程序片段整理了出来借这篇内容分享给大家。这套案例按“设备工程师练习程序应用”的方式组织涵盖了电子齿轮耦合、电子凸轮、指针应用、通讯等核心板块整体是可控、可上手复现的。如果你正在学汇川的AM系列PLC或者刚接触Codesys平台想找一个能落地的练习方向又或者你已经在做新能源设备但想把多轴同步和指针这部分啃透这篇文章应该能帮上忙。整套程序我尽量做成了带注释的工程结构每个功能块都能单独移植到自己的项目里不需要改动太多。1. 项目整体设计思路与选型考量1.1 为什么拿汇川中大型PLC做多轴控制汇川现在有两套PLC技术路线一套是H5U/EASY系列这种自带梯形图生态的另一套就是AM400、AM600这种基于Codesys V3.5平台的。新能源设备里需要做多轴电子齿轮、电子凸轮、CNC插补的几乎都在用AM系列。我这次案例选的是AM402-CPU1608TP一块标准中型机带EtherCAT总线主站处理运动控制任务非常稳。选AM402而不是H5U核心原因在于Codesys平台对运动控制的支持深度不一样。Codesys SoftMotion里轴对象、轴组、电子齿轮、电子凸轮都是现成的功能块ST语言写起来非常顺手调试时又能直接监控轴的状态、位置、速度、跟随误差。这种“软件运动控制器”的模式做多轴同步比传统梯形图叠逻辑要快得多。另一个现实因素是新能源设备里客户经常要求“节拍可调、配方可换、后期能改动作”。如果全部用梯形图写死改一次动作就得上现场扒程序。用Codesys把运动控制封装成功能块再把工艺参数做成配方改动作就变成了改数据这个思路在后面的程序结构里会体现出来。1.2 案例练习的场景设定为了让练习贴近实际我设定了一个模拟的新能源电芯模组线工位一个搬运机构X轴负责水平取料Y轴负责升降Z轴是一个旋转轴另外配一条传送带作为主轴要求搬运机构在传送带运动过程中完成“追剪”式的同步抓取。这个场景几乎覆盖了多轴控制的所有基础知识点。传送带主轴一直以设定速度运行不允许停机。机械手需要在传送带上追踪电芯位置追上之后同步跟随一段距离然后抓取。抓取完成后机械手要快速返回起始位准备下一次循环。这个场景里X轴和传送带之间就是典型的电子齿轮耦合主轴速度变化从轴比例跟随。而“追上之后同步跟随一段距离”这种动作实际上是在电子齿轮的基础上叠加相对运动修正需要用到位置偏移功能。再往后如果我想让机械手在跟随过程中做一个正弦摆动那就要用到CamIn电子凸轮。这套案例就是把这几层逻辑全部做出来了。1.3 程序结构上的取舍我写这套程序时反复问自己一个问题一个练习案例到底要做到多复杂才算合适最后定下来的原则是运动控制用Codesys标准功能块逻辑层自己封装通讯和配方单独建任务。程序里建立了两个任务一个叫Task_Motion优先级高周期1ms专门跑轴控制和同步功能另一个叫Task_Logic周期10ms跑流程状态机、报警处理和IO逻辑。为什么要分开因为运动控制对实时性极其敏感如果和逻辑混在同一个周期逻辑里一旦出现扫描时间抖动轴的运动就会受影响轻则跟随误差变大重则直接触发跟随错误报警。这种任务分区的方法是Codesys工程里很重要的一个习惯。很多初学者把所有代码都扔在默认的MainTask里程序小的时候没事一旦轴数多、逻辑复杂问题就出来了。2. 硬件配置与软件环境搭建2.1 AM402和伺服驱动器的选型搭配我这套案例里AM402作为EtherCAT主站带汇川SV660N系列伺服驱动器。SV660N是汇川目前应用很广的总线伺服支持EtherCAT、CANopen性能上做中大型设备完全够用。电机的选择需要看实际负载比如X轴用1.5kW电机配减速机Y轴用750W电机配刹车Z轴旋转用400W电机就够了。注意一件事SV660N驱动器上电之前一定要先把控制电源和主电源分开接。控制电源先上电PLC和驱动器建立通讯之后再给主回路送电。这样做的好处是驱动器报错或总线异常时控制电源还在方便排查故障。我在案例程序里加了一个“伺服使能时序”功能块就是用来保证这个顺序避免现场因为乱上电导致炸机。电机编码器分辨率也要提前算清楚。SV660N配的23位编码器分辨率是8388608也就是每转8388608个脉冲。如果机械结构是电机直连丝杠导程10mm那么每个脉冲对应的位移量就是10/8388608mm。这个数值要写进轴的Scale参数里否则位置显示全是脉冲数调试的时候非常痛苦。2.2 Codesys V3.5环境与设备描述文件软件环境我推荐Codesys V3.5 SP11或更高版本这个版本对SoftMotion和EtherCAT的支持比较稳定。安装完Codesys之后还需要安装汇川的PLC设备描述文件也就是从汇川官网下载对应版本的“目标支持包”否则新建工程时找不到AM402这个设备。新建工程时注意选择“基于Codesys的应用程序”然后在设备树里添加AM402再在EtherCAT主站下面挂SV660N驱动器。驱动器挂上去之后会弹出一堆PDO映射参数这些参数决定了PLC和驱动器之间实时交换哪些数据包括控制字、状态字、目标位置、实际位置、目标速度、实际速度这些。PDO映射这里有两个坑。第一控制字和状态字必须映射这是走CiA402协议的基础第二如果你要做电子齿轮或凸轮实际位置和实际速度一定要映射上否则主从同步时反馈数据不对程序根本跑不起来。我在案例里把PDO映射表截图保存成了PDF方便排查现场问题时对照。2.3 轴的组态和单位换算在Codesys SoftMotion里轴的组态是一个容易忽略但非常关键的环节。每个轴在设备树里都对应一个Axis对象双击进去能看到“单位换算”和“限位”两个设置页。单位换算决定了你在程序里写的“距离100”到底是100脉冲、100毫米还是100度这个必须和机械设计对起来。我习惯把运动单位统一成“毫米”和“度”控制周期设置成1ms。程序里所有运动指令都写物理单位好处是调试界面里看位置、速度都非常直观客户问起来也容易解释。如果你的项目里有多台设备通用同一套程序可以把单位换算参数放到配方里设备型号变了直接换配方不用重新编译程序。限位设置同样重要正负软限位一定要设而且要比硬限位留出安全余量。我在案例里把软限位设成机械行程的90%这样即使程序逻辑出错轴也会在碰到硬限位之前停下来。3. 多轴运动控制核心实现3.1 电子齿轮耦合的配置与参数解析电子齿轮耦合是这套案例里最核心的功能对应Codesys的MC_GearIn功能块。它的作用很简单让从轴跟随主轴运动速度比例可调。但实际应用中有几个参数必须理解透彻。// 电子齿轮耦合功能块调用示例 fbGearIn( MasterAxis : Axis_Conveyor, // 主轴传送带 SlaveAxis : Axis_X, // 从轴X轴搬运机构 RatioNumerator : 1, // 比例分子 RatioDenominator : 1, // 比例分母 Acceleration : 500, // 从轴追上主轴时的加速度 Deceleration : 500, // 减速 Jerk : 0, // 加加速度0表示不限制 BufferMode : MC_BUFFERMODE_BLENDING, // 缓冲模式 Enable : TRUE );为什么比例是分子/分母而不是一个小数因为有些应用里主从轴的单位不同或者机械减速比不是整数用两个整数可以精确表示任意比例。比如主轴是传送带单位是毫米从轴是旋转轴单位是度主轴走10mm对应从轴转36度那么RatioNumerator:36RatioDenominator:10。Acceleration和Deceleration这两个参数很多人不重视实际上它俩决定了从轴从静止加速到同步速度的过程。如果设得太小从轴半天追不上主轴同步位置误差会越拉越大设得太大机械冲击明显。我建议先设一个中等值然后在示波器里看主轴和从轴的位置误差曲线再慢慢调。3.2 电子齿轮的二次开发位置修正纯齿轮耦合只能保证速度比例同步但机械手抓取电芯时需要的是精确的位置同步。也就是说电芯在传送带上的位置是不断变化的机械手必须能准确跟踪到这个位置这就要用到MC_GearInPos功能块在齿轮耦合的基础上加入位置偏移。MC_GearInPos比MC_GearIn多了几个关键参数PositionOffset和MasterStartDistance。PositionOffset是从轴相对主轴的位置偏移量MasterStartDistance是启动同步时主轴的位置基准。举一个实际例子传送带连续运行当光电传感器检测到电芯到达某个位置时程序记录当前主轴位置然后调用MC_GearInPos让X轴在跟踪传送带的同时以固定的位置偏移追到电芯正上方。这个过程中X轴的运动是“主轴速度叠加一个追赶速度”完全由功能块内部计算逻辑层只需要管理启动时机。// 位置同步耦合功能块调用 fbGearInPos( MasterAxis : Axis_Conveyor, SlaveAxis : Axis_X, RatioNumerator : 1, RatioDenominator : 1, Acceleration : 800, Deceleration : 800, Jerk : 0, PositionOffset : rOffset, // 从轴相对主轴的目标偏移 MasterStartDistance : rMasterPos, // 主轴基准位置 BufferMode : MC_BUFFERMODE_BLENDING, Enable : TRUE );这里的PositionOffset要特别注意符号。我在调试时遇到过一个问题从轴总是停在主轴前方20mm的地方找了半天才发现是偏移量的正负号写反了。建议大家在现场调试时先用一个小速度手动运行观察从轴实际的跟随关系再确定偏移量的正负。3.3 电子凸轮实现正弦摆动正弦运动是新能源设备里很常见的动作模式比如点胶头的升降、焊接头的摆动、旋转台的加减速。热词里也有“汇川plc 正弦运动”确实问的人很多。最简单的实现方式是MC_MoveSine功能块它能让轴按照正弦规律运动适合单轴往复。// 正弦运动功能块 fbMoveSine( Axis : Axis_Y, Frequency : 2.0, // 频率2Hz Amplitude : 50.0, // 幅值±50mm Offset : 100.0, // 偏移在100mm位置附近摆动 Direction : MC_Direction_Positiv, Enable : TRUE );Frequency、Amplitude、Offset三个参数可以理解成Offset决定正弦运动的中心位置Amplitude决定摆动的范围Frequency决定摆动的快慢。如果想让轴在摆动过程中同时移动可以把正弦运动本身看作一个从轴用电子齿轮去耦合主轴。但这里我要说一个更进阶的方案。如果你的动作不是标准正弦而是类似“快进-慢退-快进”这种非对称运动MC_MoveSine就不够用了需要用电子凸轮MC_CamIn加一张Cam表。Cam表本质上是把从轴位置定义成主轴位置的函数可以在CamTable里用点数组描述任意曲线。我在案例里做了一个“追剪凸轮提升”的组合动作机械手X轴跟随传送带Y轴根据X轴的位置做凸轮运动在追踪过程中先下降抓取再上升脱开。这个动作如果用梯形图写逻辑极其复杂用凸轮写只需要在凸轮编辑器里画出Y轴升降曲线再标出关键点位置就行。3.4 轴组运动学的扩展思考当设备要求机械手末端沿直线或圆弧轨迹运动时单轴控制就不够了需要引入轴组Kinematics的概念。Codesys里支持多种运动学模型比如2轴龙门、3轴DELTA、4轴SCARA等。不过说实话轴组功能的学习曲线比单轴控制陡很多涉及正解、逆解、工作空间等概念。新手学多轴控制我不建议一上来就碰轴组先把电子齿轮、凸轮这些基础功能玩熟再去做轴组会顺利得多。这套案例练习里我预留了一个SCARA轴组的模板工程但主程序仍然以电子齿轮和凸轮为主。4. 指针在Codesys程序中的应用4.1 Codesys指针的基础与内存操作指针是这套案例里另一个被点名的重点。C语言里的指针大家都熟Codesys的ST语言同样支持指针而且用法非常接近。指针的核心作用有两个一是避免大块数据的复制二是实现对内存的直接访问。在PLC程序里用得最多的场景是对数组、字符串、结构体数据的动态处理。声明指针的方式VAR pAxisName : POINTER TO STRING(64); // 指向字符串的指针 pDataArray : POINTER TO ARRAY[0..9] OF INT; // 指向数组的指针 pAnyData : POINTER TO BYTE; // 指向任意字节数据的指针 iValue : INT; aData : ARRAY[0..9] OF INT; END_VAR pDataArray : ADR(aData); // 取数组首地址 iValue : pDataArray^[3]; // 通过指针访问数组第4个元素这里ADR函数就是取地址^是解引用操作符。写的时候注意优先级pDataArray^[3]的意思是先解引用指针得到数组再取第3个元素和C语言的pDataArray[3]意思一样但语法上必须带^。Codesys的指针还有一个特点它可以指向任意数据类型包括结构体、联合体甚至指向另一个指针。这给程序带来了很大的灵活性但也埋下了空指针的隐患。我最开始在练习里用指针时遇到最多的就是空指针问题后面会专门讲。4.2 用指针数组管理设备的工艺配方这套案例里我用指针数组做了件很实用的事用一组指针统一管理多组工艺配方数据。比如设备有8种产品配方每种配方包含速度、位置、凸轮表索引等几十个参数如果每种配方都定义一个独立变量程序会变得无比臃肿。用指针数组的方式可以把所有配方的起始地址存进一个数组通过索引就能访问任意配方VAR_GLOBAL Recipe_1 : ST_Recipe; // 配方1结构体类型 Recipe_2 : ST_Recipe; Recipe_3 : ST_Recipe; pRecipeTable : ARRAY[1..3] OF POINTER TO ST_Recipe; END_VAR // 在初始化程序中 pRecipeTable[1] : ADR(Recipe_1); pRecipeTable[2] : ADR(Recipe_2); pRecipeTable[3] : ADR(Recipe_3); // 运行时通过索引访问 IF iRecipeIndex 1 AND iRecipeIndex 3 THEN rTargetSpeed : pRecipeTable[iRecipeIndex]^.Speed; rTargetPos : pRecipeTable[iRecipeIndex]^.Position; ELSE // 索引越界做保护 END_IF;这个写法最大的好处是新增配方时只需要增加一个全局变量和一个地址赋值主程序逻辑一行都不用改。我在实际项目中用这个方法管理了几十个配方的参数维护成本非常低。4.3 指针与字符串处理指针数组存放字符串热词里有“指针数组存放字符串”这是很多人遇到的实际痛点。Codesys里字符串的长度默认是固定的比如STRING(64)占65个字节。如果定义了几百个工艺名称直接用多维数组存内存占用很大。这时可以用指针数组把实际字符串分散存放另用数组记录每个字符串的地址。VAR_GLOBAL strWorkStationName_1 : STRING(32) : 电芯扫码工位; strWorkStationName_2 : STRING(32) : 极耳焊接工位; strWorkStationName_3 : STRING(32) : 模组入箱工位; pNameTable : ARRAY[1..3] OF POINTER TO STRING; END_VAR // 初始化 pNameTable[1] : ADR(strWorkStationName_1); pNameTable[2] : ADR(strWorkStationName_2); pNameTable[3] : ADR(strWorkStationName_3); // 读取某个工位名称并显示到HMI IF iStationIndex 1 AND iStationIndex 3 THEN HMI_CurrentStationName : pNameTable[iStationIndex]^; END_IF;4.4 联合体与指针配合数据拆包与打包Codesys里还有一个和指针强相关的特性叫联合体UNION它允许不同类型的数据共享同一段内存。这个在解析通讯报文时格外有用。举个例子设备通过Modbus TCP接收上位机下发的数据32位浮点数被拆成两个16位寄存器传输。传统做法是做移位运算容易出错。用联合体加指针几行代码就能完成TYPE ST_UnionFloat : UNION fValue : REAL; // 按浮点数解释 awWord : ARRAY[0..1] OF WORD; // 按两个寄存器解释 END_UNION END_TYPE VAR stUnion : ST_UnionFloat; END_VAR // 从Modbus映射区读取两个寄存器 stUnion.awWord[0] : ModbusHoldRegister[10]; stUnion.awWord[1] : ModbusHoldRegister[11]; // 此时 stUnion.fValue 就是组合后的浮点数这种写法在通讯协议处理里非常高效配合指针还能直接把整个结构体映射到一段连续的寄存器地址上收发数据都不需要逐个变量搬运。5. 上下位机通讯与以太网联调5.1 Modbus RTU和Modbus TCP的选择这套案例里PLC除了要控制多轴还要和上位机、HMI、传感器交换数据。通讯方案我选了两种现场传感器走Modbus RTURS485上位机监控走Modbus TCP以太网。Modbus RTU适合短距离、低速率的传感器数据读取比如温湿度、气压、流量计。注意的是RS485通讯波特率、数据位、校验位必须和从站设备完全一致。我遇到过很多次现场通讯不上最后发现是校验位设错了。Modbus TCP更简单基于以太网一台AM402可以同时建立多个客户端连接。上位机比如C#写的MES客户端可以通过Modbus TCP直接读取PLC里的轴状态、报警信息、产量数据。5.2 C#上位机与汇川PLC通讯实操如果你要自己写上位机C#是和汇川PLC通讯最常用的语言。有两种方式一种是用汇川提供的通讯库另一种是直接用Modbus TCP协议自己写。前者简单后者灵活。用Modbus TCP时PLC端需要配置Modbus TCP从站设备并把要交换的数据映射到保持寄存器区。比如把“设备状态字”、“当前产量”、“报警代码”这些变量映射到Modbus保持寄存器C#端用Modbus TCP客户端库比如NModbus去读写这些寄存器就行。C#里读PLC数据的核心代码大致是using Modbus.Device; // 创建TCP客户端 var client new TcpClient(192.168.1.10, 502); var master ModbusIpMaster.CreateIp(client); // 读取PLC保持寄存器起始地址0读10个字 ushort[] data master.ReadHoldingRegisters(0, 10); // 写入控制字 master.WriteSingleRegister(100, 1);这里有个关键点CodeSys里的地址偏移和Modbus地址之间有一个映射关系。PLC侧要把变量绑定到Modbus从站设备的保持寄存器C#侧才能读到。我在案例里专门做了一个“通讯映射地址表”的Excel文档列清楚了每个变量的寄存器起始地址、数据类型和读写权限调试时直接照着表来省去大量猜测。5.3 LabVIEW与汇川PLC通讯LabVIEW和汇川PLC通讯我推荐用Modbus TCP或者OPC UA。LabVIEW自带Modbus库用VISA或TCP节点实现通讯都很成熟。如果有多台PLC需要统一监控用OPC UA会更方便。LabVIEW侧的思路是用OpcUaClient读取PLC的节点数据再在LabVIEW的界面上显示。汇川AM系列PLC支持OPC UA服务器功能只需要在PLC组态里启用OPC UA并设置允许访问的变量列表。之后LabVIEW通过浏览节点找到这些变量按周期订阅读取。OPC UA的好处是通讯安全性高数据类型描述完整而且不用关心PLC内部寄存器地址。缺点是要花时间学习节点浏览和数据类型映射。如果你的项目只是简单读取几个变量Modbus TCP就足够了没必要上OPC UA。6. 常见问题与排查技巧实录6.1 空指针问题程序跑飞的头号元凶用指针最怕的就是空指针。在Codesys里指针未赋值、指向的变量被删除、或者地址超出范围程序运行到解引用操作时直接报异常严重时整个任务崩溃。最典型的情况是全局变量被优化掉或者变量名称拼写错误导致ADR取到了0地址。排查方法很简单在Watch窗口里观察指针变量的值。如果指针等于0说明取地址失败。在解引用之前加保护判断是最保险的IF pData 0 THEN iValue : pData^; ELSE // 指针无效取默认值或报警 iValue : 0; bPointerError : TRUE; END_IF;6.2 电子齿轮耦合错误的排查电子齿轮调好后有时会出现从轴位置和主轴对不上的情况尤其是程序启动再次耦合时。这种问题大多是主轴位置基准没设置对或者耦合启动前从轴已经偏离了同步位置。排查顺序建议这样先看主轴和从轴的实际位置、实际速度确认主轴确实在运动。再查电子齿轮的分子分母是不是符合机械传动比。最后检查从轴在耦合启动前是否处于静止状态如果从轴已经在运动一定要用MC_Stop先停稳。案例程序里我加了一个“自动对位”功能块每次耦合启动前先从主轴读取当前位置计算出从轴应处的位置如果偏差超过阈值就先执行一次绝对定位再做齿轮耦合。这样能避免大部分同步错误。6.3 Codesys任务周期与轴跟随误差的平衡运动控制任务的周期设置直接影响轴的跟随精度和系统的负载。1ms周期下跟随误差小但CPU负载高2ms周期CPU负担轻但对高速高精度同步可能不够。我这里根据自己的调试经验给一个参考范围普通搬运、定位2ms够用需要电子齿轮、电子凸轮同步建议1ms如果是多轴插补可能要0.5ms但这时CPU选型要留足余量。AM402在处理8轴同步加逻辑运算时1ms周期实测CPU负载在30%左右还能接受。6.4 常见问题速查表现象可能原因排查方法从轴不跟随主轴电子齿轮未使能检查fbGearIn的Enable和Busy状态从轴位置逐步偏离比例分子分母设置错误核对机械传动比和单位换算轴运行中报警跟随误差过大加速度设置过大降低Acceleration检查机械负载指针解引用报错指针地址无效检查ADR是否正确指针是否为0Modbus通讯超时波特率或校验位不一致用串口助手扫描从站参数OPC UA连接失败变量未发布到服务器检查PLC侧OPC UA变量列表6.5 设备调试中的避坑经验最后分享一个我在现场踩过无数次的坑调试多轴设备时千万别在大负载的状态下直接修改电子齿轮比例或凸轮表。齿轮耦合是实时计算比例突变会导致从轴瞬间加速或减速轻则机械振动重则撞机。正确的做法是先让轴停下来修改参数再重新启动耦合。还有就是程序的注释习惯。这套案例我每个功能块都写了详细注释包括输入输出参数的含义、单位、取值范围以及典型的应用场景。很多人觉得注释是给别人看的其实更多是给三个月后的自己看的。我见过太多程序当时写得飞起后来维护时翻着源码骂自己。说实话这套多轴控制案例练下来我自己最大的收获不是会调那几个功能块而是建立了一套“从机械传动看程序、从程序反推机械逻辑”的思维模式。新能源设备越来越强调柔性化和节拍掌握Codesys平台的多轴控制再加上对指针、通讯这类底层技巧的熟练运用无论做设备开发还是产线维护都会从容很多。本文还有配套的精品资源点击获取
返回列表