尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

汇川H5U PLC ST语言编程实战:7步掌握非标设备控制

汇川H5U PLC ST语言编程实战:7步掌握非标设备控制 做非标设备这几年我接触过三菱、西门子、信捷、台达的PLC但真正让我愿意花整块时间系统性写一套实战教程的汇川H5U算第一个。原因很简单它把中型PLC的性能、EtherCAT总线能力和对工程师友好的编程方式压到了一个让我无法拒绝的价位上。而H5U最值得你投入时间去学的就是它的ST语言编程——不是梯形图不好而是当你要面对多轴运动控制、复杂算法逻辑、以及需要封装复用功能块的时候ST语言能让代码量少一半可读性和维护性却翻一倍。这篇文章是“工控实战”系列的第一篇我按照自己带新人时的思路把H5U的ST语言学习拆成了完整的7步。你不用按部就班啃手册跟着这7步一步步实操对着一台真实设备或者软件里的仿真环境练一周内就能入门三周左右能独立写中型非标设备的控制程序。1. 7步法整体拆解先看清地图再上路很多朋友学PLC有个通病上来就下载个AutoShop再找份手册然后从变量表开始抠抠了三天还停在“怎么建立一个工程”。我的建议相反先花20分钟搞懂H5U在汇川产品线里的位置以及ST语言的独特优势这样你后面的每一步都知道自己在干什么而不是被人推着走。1.1 为什么选H5U而不是小型PLCH5U是汇川的一款中型PLC它和AM系列、AC系列属于不同的定位。H5U的杀手锏在于本体自带EtherCAT主站最大支持64个从站同时还支持以太网、串口、CANopen等通讯方式。这意味着你不需要额外买昂贵的总线主站模块就能直接带伺服、带远程IO、带变频器。它的编程软件是AutoShop但软件内核和常见的Codesys体系非常接近使用的编程语言遵循IEC 61131-3标准包括梯形图LD、结构化文本ST、功能块图FBD、顺序功能图SFC等。如果你之前接触过Codesys、博途、或者其他基于IEC 61131-3的软件上手H5U会非常快。我个人推荐重点学ST语言原因有四个处理复杂计算和算法时ST比梯形图直观得多写个PID、写个坐标变换梯形图能写到你怀疑人生ST十几行搞定。ST方便做功能块封装FB做好一个气缸控制块、一个轴控制块换项目直接拖过来用。ST程序的可读性和可维护性更好接手别人程序的时候读ST逻辑比翻梯形图网络快太多。汇川H5U本身是中型PLC许多应用场景如多轴设备、视觉联动、总线通讯天然适合文本编程。1.2 七步路线图及各阶段目标在动手之前先把整个学习路线用一张表摆出来。这张表是我带人时长期修正后的版本每一步都有明确的产出物练完你就知道自己学到什么了。步骤核心任务学习产出建议用时第一步软件安装、硬件连接、工程创建能新建工程并在线连接设备2至4小时第二步IO分配与第一个ST程序理解扫描周期写出启保停程序4小时第三步ST语言变量、数据类型、语法熟练使用变量表、IF/CASE/FOR1天第四步函数FB封装与程序结构设计封装气缸控制块、学会状态机1天第五步EtherCAT总线配置与伺服控制配置SV630P伺服ST控制点动1至2天第六步Modbus RTU、CANopen通讯实战完成PLC与变频器/IO从站通讯1至2天第七步在线调试、监控、程序规范独立排查问题输出规范程序长期打磨这里我要特别提醒一句不要跳过第一步和第二步去直接抓总线配置。我见过太多人一开始就扎进EtherCAT里结果连PLC和电脑通讯都搞不定白白消耗热情。基础打得越稳后面总线和运动控制你越容易理解。2. 第一步软件安装与硬件连接工控这行工具链不对后面全都白搭。很多人卡在第一天不是程序不会写而是软件装不对、驱动出问题、设备连不上。所以第一步我们老老实实把环境搞定。2.1 工具链清单与版本选择做H5U开发你至少需要准备三样东西编程软件AutoShop、伺服调试软件InoDriverShop如果涉及伺服调试、以及一台能跑Windows的笔记本电脑Win7到Win11都行32位或64位均可。AutoShop是汇川PLC的集成开发环境H5U、H3U、Easy系列都会用到。下载渠道就是汇川官网的“服务与支持-下载中心”别去第三方网站下一是不安全二是版本混乱。版本选择上我的建议是直接装最新的正式发布版本。不要装Beta版你是在做设备开发稳定性优先。InoDriverShop是汇川伺服的调试软件如果你后面要调SV630P、SV660N这类伺服它用来设置伺服参数、监控运行状态、测试点动。注意InoDriverShop并不是和AutoShop一起安装的它俩是两套独立软件。硬件的准备方面一台H5U主机是必须的。H5U根据IO点数不同有不同型号常见的有H5U-1614MTD16输入14输出晶体管输出等。如果你暂时没有实体机AutoShop也内置了仿真功能可以用仿真先跑通程序逻辑后面再用实体机验证。2.2 电脑与PLC的通讯连接H5U本体上有以太网口、USB口和串口。最推荐用的是以太网口速度快且稳定。H5U出厂默认的IP地址一般是192.168.1.88具体以实际为准。你电脑的IP要跟PLC设置在同一网段但不要重复。操作步骤用网线连接电脑和H5U的以太网口。打开电脑的本地连接把IPv4地址手动设为192.168.1.10举例子网掩码255.255.255.0。打开AutoShop在“连接”或“在线”菜单里选择“自动扫描”。软件搜到设备后双击连接即可。如果你的电脑网络环境比较复杂比如同时挂了无线网卡和有线网卡建议把无线临时禁用避免路由冲突导致扫描不到PLC。这是我这几年经常遇到的坑同一台电脑网线连的PLC但无线网卡占用同一个网段导致AutoShop明明搜不到折腾半天才发现是无线的锅。2.3 新建工程与型号选型安装好AutoShop并成功连上PLC后我们来新建第一个工程。双击AutoShop图标选择“新建工程”弹出来的对话框中会让你选择PLC型号。这时候千万不要选错。比如你手里是H5U-1614MTD那型号一栏就要选H5U-1614MTD。选错型号会导致IO映射对不上、下载报错等问题。如果还没买机器只做仿真学习那就选一个你打算买的型号就行。工程建好后你会看到左侧的工程树程序块、变量表、任务配置、逻辑配置、轴配置、通信配置等等。先熟悉一下这个界面往后的每一步都在这棵树上操作。注意H5U的工程中你编写ST代码的位置在“程序块”下。默认会生成一个PRG程序块通常叫Main或者PRG双击进入即可编写代码。如果你创建了多个程序块就要在“任务配置”里把程序块挂到某个任务下比如挂到MainTask否则程序是不会被扫描周期调用的。3. 第二步创建第一个H5U工程并让IO动起来第一次写ST程序很多人会直接把三菱、西门子那种“先画梯形图再转换”的思维带过来结果很不适应。ST文本编程的逻辑其实是“用代码描述逻辑”你需要先把IO规划好然后在程序块里写代码。这一步我们做一个最经典的启保停程序让你完整走一遍“IO映射—编写ST代码—编译下载—监控验证”的流程。3.1 分配IO变量打开“变量表”或者“IO映射”给物理输入输出点定义符号和数据类型。假设需求是用启动按钮X0、停止按钮X1、接触器输出Y0做电机启保停。在变量表里录入DI_X0BOOL映射到X0注释“启动按钮”DI_X1BOOL映射到X1注释“停止按钮”DO_Y0BOOL映射到Y0注释“接触器输出”在ST语言编程里你要养成一个好习惯尽量不要在代码里直接写“X0”、“Y0”这样的绝对地址而是通过变量表定义成有意义的符号。这样后面逻辑复杂起来你看到DI_X0就知道这是启动按钮而不是再去查图纸。3.2 用ST写启保停程序打开程序块PRG输入以下代码IF DI_X0 THEN DO_Y0 : TRUE; END_IF; IF DI_X1 THEN DO_Y0 : FALSE; END_IF;这段程序的意思是X0有信号时Y0置位X1有信号时Y0复位。但说实话这样写在实际工程里是有问题的——当X0一直按住时X1按下去Y0瞬间复位但X0还按着程序下一轮扫描又会把Y0置位导致停不下来。这就是很经典的“启保停竞争”在梯形图里老手会故意用“优先停止”的接法在ST里你就要手动处理优先级。正确写法是把停止放在优先判断IF DI_X1 THEN DO_Y0 : FALSE; ELSIF DI_X0 THEN DO_Y0 : TRUE; END_IF;这样即使X0和X1同时按也是停止优先。这个逻辑细节是新手最容易踩的坑之一。ST语言看起来就是几行文字的排列但执行顺序和处理优先级完全由代码结构决定你必须带着“扫描周期内从上往下执行”的意识来写。3.3 编译、下载与在线监控写完代码后点工具栏上的“编译”或按快捷键下方输出窗口会显示编译器信息。如果代码有语法错误、变量未定义、数据类型不对等问题都会在这里报出来。初学阶段报错很正常关键是学会看错误提示。常见的几个错误提示“变量未定义”说明你的变量没在变量表里声明。提示“数据类型不匹配”比如把INT类型赋值给了BOOL变量。提示“缺少分号或结束符”ST语句每条指令末尾要加分号。编译通过后点击“下载”按钮把程序写到PLC里。下载前会提示是否停止PLC运行选择“是”。下载完成后把PLC切到RUN状态然后你就能看到程序在真实设备上跑起来的结果了。在线监控的方式我后面在第七步详细说这里你只要知道在线状态下当前程序中的变量值是实时刷新的变量名旁边会显示当前TRUE或FALSE这样你就可以直观地看到哪些条件满足了、哪些输出了。4. 第三步吃透ST语言的变量与语法如果你的目标是“会用ST写启保停”那前面两步就够了。但要想做真正的项目你必须把ST语言的变量体系、数据类型和常用语法结构吃透。这是所有文本编程语言的基础工程也是H5U的ST与三菱、西门子的文本语言最接近的部分。4.1 变量声明与数据类型在H5U的ST编程中变量的声明有两种方式一种是在变量表里统一声明适合全局变量另一种是在程序块PRG或者功能块FB的局部变量区声明适合局部变量。常用的数据类型有这些类型位数取值范围/说明使用场景BOOL1TRUE/FALSE按钮、开关、输出、内部标志BYTE80至255小整数、状态字INT16-32768至32767常规整数计数、IO映射DINT32-2147483648至2147483647大整数、高精度计数、编码器位置REAL32浮点数温度、压力、速度等模拟量STRING可变字符串报警信息、配方名称这里我特别提醒一下REAL类型很多从三菱转过来的朋友容易忽略浮点数精度问题。REAL是单精度浮点有效位数大概是7位十进制数。如果你用REAL累计运行时间累到几万小时后再参与运算精度可能就不够用了。长时间累加计数建议用DINT或LREAL。4.2 常用语法结构IF、CASE、FOR、WHILEST语言的语法并不复杂核心就是几个结构分支判断、循环、状态选择、功能块调用。IF语句是用的最多的IF 条件 THEN // 条件成立执行 ELSE // 条件不成立执行 END_IF;几个IF嵌套的时候建议用ELSIF能避免嵌套过深导致可读性变差。CASE语句非常适合多状态选择CASE 状态变量 OF 0: // 初始状态 1: // 运行状态 2: // 暂停状态 ELSE // 异常状态 END_CASE;CASE语句在写状态机时是神器。我可以给你个生活化的类比CASE就像你坐地铁看线路图车厢到了第几站就执行第几站的开门动作而不是像IF嵌套那样一层层往下判断。代码简洁执行效率也高。FOR循环和WHILE循环用的频率相对低一些但在批量数据处理时很重要FOR i : 0 TO 9 DO 数组[i] : 0; END_FOR;注意在PLC里写循环一定要确认循环次数可控否则一旦死循环扫描周期被卡住可能导致整个控制系统“假死”。这是工控安全的大忌。4.3 必备指令TON定时器、R_TRIG上升沿ST语言里没有梯形图那种现成的TON定时器触点但你可以直接实例化并使用定时器功能块。调用方式如下TON_1: TON; // 定时器输入 TON_1(IN : 启动条件, PT : T#5S); IF TON_1.Q THEN // 定时5秒后执行 END_IF;这里的TON_1相当于你在程序里声明的一个定时器实例IN是定时器使能输入PT是设定时间Q是定时器输出。我刚从梯形图转ST时最不适应的就是这种“功能块实例化调用”的写法。但用习惯了你会发现ST里创建多个定时器非常方便定义一个数组或者多个实例就行梯形图里一个定时器一个定时器地复制粘贴效率完全没法比。上升沿检测也有对应的功能块R_TRIGR_TRIG_1: R_TRIG; R_TRIG_1(CLK : 输入信号); IF R_TRIG_1.Q THEN // 上升沿到来执行一次 END_IF;新手常见误区直接写IF 输入信号 THEN去代替上升沿。这样会导致只要信号持续为TRUE里面的逻辑就一直执行而不是只执行一次。想实现“按钮按一下计数器加1”就必须用R_TRIG。5. 第四步ST思维与程序结构设计如果把前两步比作学开车那这一步就是从“会开”到“会规划路线”的转变。ST语言真正发挥威力靠的不只是语法熟练而是程序设计思维的升级。很多从梯形图转过来的工程师都遇到过类似的瓶颈语法看得懂但真要自己设计一个复杂设备的控制流程时脑子里还是一团乱麻。这一章的目的就是帮你建立“扫描周期思维”和“状态机思维”并用功能块封装解决代码复用问题。5.1 从梯形图思维切换到扫描周期思维梯形图的本质是“电路”你会下意识地用电路流向来理解信号传递。而ST语言的本质是“顺序执行的指令”每一行代码在同一个扫描周期内从上到下依次执行。理解这个本质区别你就抓住了ST编程的第一条命脉。PLC的扫描周期大概是这样的过程输入刷新读取所有DI状态—程序执行从上到下执行所有挂载的任务和程序块—输出刷新把所有DO结果输出到物理端点。这个过程不断循环一次循环就是一个扫描周期。这个机制的直接影响是什么举个例子varA : 1; varB : varA;这两行代码在同一周期内执行varB会被赋值为1。而如果写成varB : varA; varA : 1;varB最终得到的是varA在赋值前的旧值可能是0。在梯形图里这种“先后顺序”远没有ST表达得那么明显但在ST里每一行的顺序都会直接决定运算结果。所以调试ST程序时遇到结果和你预想的不一致先别急着怀疑硬件回头看看代码执行顺序。5.2 用状态机整理工艺逻辑设备控制中最常见的逻辑不是“永远在一个状态里运行”而是“根据工艺要求在不同阶段之间切换”。我见过很多梯形图老手把这种多阶段流程写成了密密麻麻的一大堆中间继电器和置位复位线圈。程序一长自己都得靠翻注释才能看懂。ST语言里面我强烈推荐把这种流程控制都写成状态机。举个非常典型的例子一个自动装配工位需要完成“夹紧→检测→装配→松开”四个动作。CASE 当前状态 OF 0: // 初始态 IF 启动 THEN 当前状态 : 10; END_IF; 10: // 夹紧 夹紧阀 : TRUE; IF 夹紧到位 THEN 当前状态 : 20; END_IF; 20: // 检测 IF 检测完成 THEN 当前状态 : 30; END_IF; 30: // 装配 装配阀 : TRUE; IF 装配完成 THEN 当前状态 : 40; END_IF; 40: // 松开 夹紧阀 : FALSE; 装配阀 : FALSE; IF 松开到位 THEN 当前状态 : 0; 完成计数 : 完成计数 1; END_IF; ELSE 当前状态 : 0; // 异常复位 END_CASE;状态机的好处在于每一个状态对应一段清晰的动作和退出条件新增一个工序就新增一个状态编号逻辑范围可控排查问题的时候一目了然。5.3 把重复功能封装成功能块FB这是ST语言最大的红利之一代码复用。比如你的设备上有5个气缸每个气缸的动作逻辑其实都差不多——都有伸出、缩回、到位检测、报警难道你要把这套逻辑复制5遍当然不是封装成一个FB实例化5次就行。下面我以一个简单气缸控制FB为例展示ST中FB的写法FUNCTION_BLOCK FB_Cylinder VAR_INPUT bExtendCmd : BOOL; // 伸出指令 bRetractCmd : BOOL; // 缩回指令 END_VAR VAR_INPUT bExtendFeedback : BOOL; // 伸出到位 bRetractFeedback : BOOL; // 缩回到位 END_VAR VAR_OUTPUT bExtendValve : BOOL; // 伸出电磁阀 bRetractValve : BOOL; // 缩回电磁阀 bHome : BOOL; // 原位 bWorkDone : BOOL; // 工作完成 END_VAR VAR step : INT : 0; END_VAR CASE step OF 0: // 待机 bExtendValve : FALSE; bRetractValve : TRUE; bWorkDone : FALSE; IF bRetractFeedback THEN bHome : TRUE; END_IF; 10: // 伸出 bExtendValve : TRUE; bRetractValve : FALSE; IF bExtendFeedback THEN bWorkDone : TRUE; step : 0; END_IF; END_CASE; IF bExtendCmd THEN step : 10; END_IF; IF bRetractCmd THEN step : 0; END_IF;你再调用它时只需要气缸1 : FB_Cylinder; 气缸1(bExtendCmd : 启动伸出, bRetractCmd : 停止, bExtendFeedback : 气缸1伸出到位, bRetractFeedback : 气缸1缩回到位);这样做的好处很明显关键控制逻辑集中在一个地方10个气缸就是10行调用现场任何一个气缸逻辑需要修改只改FB内部就行了根本不用去找每一处复制的代码调试半天。6. 第五步EtherCAT总线配置与伺服点动实战H5U最核心的竞争力就在EtherCAT这也是汇川生态里绕不开的内容。如果你只把H5U当普通PLC用不发挥它的总线能力那基本等于买了个跑车只在市区里堵着。这一章我们直接上伺服而且是用ST语言写点动程序。6.1 EtherCAT基础与从站添加EtherCAT是一种高速实时工业以太网总线技术它的核心优势是数据交换速度快、同步精度高微秒级支持大量从站设备级联。对设备工程师来说用EtherCAT最大的直观感受就是接线轻松了——以前一个伺服要接脉冲、方向、编码器反馈一堆线现在一根网线把伺服串起来就行。在AutoShop里添加EtherCAT从站的步骤如下在左侧“轴配置”或“设备配置”中找到EtherCAT主站。右键或双击进入从站配置界面选择“扫描从站”。给所有伺服上电并确保伺服之间用网线正确串联注意EtherCAT组网必须是一进一出的菊花链拓扑。扫描完成后会列出从站设备信息。确认设备型号和顺序然后保存到工程中。常见问题是扫描不到伺服大多和这几个因素有关伺服没有正常上电或者只上了控制电没上主电。网线连接顺序错误或者网线本身有问题。伺服处于异常状态或报警状态导致ESCEtherCAT从站控制器没有正常工作。AutoShop版本和伺服固件版本不兼容。6.2 伺服参数设置与单位换算伺服接入EtherCAT总线之前需要用InoDriverShop对伺服参数做一次基本配置。这里最关键的参数是电机编码器分辨率、电子齿轮比和通讯设置。如果你用的是汇川SV630P伺服在InoDriverShop里进入“参数”页面确认电机的编码器分辨率和电机型号匹配。这里我多解释一下“电子齿轮比”这个让很多新人头疼的东西。在传统脉冲控制里你给伺服发多少个脉冲伺服走多少距离由电子齿轮比决定。在EtherCAT总线控制里我们通常会直接在PLC里把位置单位换算成用户单位比如毫米或者度。换算公式大致如下目标转速用户单位/秒 期望的位移用户单位/ 编码器分辨率 × 电子齿轮比实际操作中我不会手算得太复杂你只需要把握好一个原则先确认编码器每转的脉冲数再确认一个用户单位对应的机械位移比如转一圈对应10mm然后把比例关系写到程序或者轴参数里让PLC通过EtherCAT直接下发用户单位的位置/速度指令。6.3 用ST写伺服点动运行程序在H5U中运动控制指令多是以功能块形式提供的。轴控制通常需要先启用轴然后执行运动指令。点动程序如下所示// 轴使能 MC_Power_0( Enable : TRUE, Axis : Axis1, Status 轴状态, Error 轴错误, ErrorID 轴错误码 ); // 点动正转 MC_MoveJog_0( JogForward : 点动正转按钮, JogBackward : 点动反转按钮, Axis : Axis1, Velocity : 10.0, // 单位由轴参数决定 Acceleration : 1.0, Deceleration : 1.0, Execute : TRUE ); // 绝对定位 MC_MoveAbsolute_0( Execute : 定位触发, Axis : Axis1, Position : 目标位置, Velocity : 运行速度, Acceleration : 加速度, Deceleration : 减速度, Done 到位完成 );注意点动按钮的接线方式点动按钮通常没有自锁按下为TRUE、松开为FALSE。所以给JogForward的信号应该是实时按钮状态而不是上升沿。但如果你用了R_TRIG把按钮信号转成只触发一次的脉冲那点动就只能动一下完全不符合需求。这个细节很值得注意。6.4 InoDriverShop搜不到伺服地址的排查用户群里每天都有人问InoDriverShop软件搜索不到伺服地址怎么办我遇到过太多次了专门列一下排查顺序确认电脑网口和伺服之间物理连接正常观察伺服的网口指示灯是否亮起。打开电脑的“网络连接”确认IP地址设置没有明显冲突。InoDriverShop一般会通过广播或者驱动层直接搜索设备不要求电脑IP和伺服在同一网段但如果你电脑IP设成了特殊网段也可能导致搜索失败。确认伺服驱动器的通信协议设置正确部分伺服默认不使能上位机通信功能需要在面板上进入参数菜单把通信使能打开。换一条网线试试。总线设备对网线质量也有要求百兆工业级网线比普通成品网线靠谱得多。如果还搜不到把InoDriverShop关闭重开或者重启电脑。别笑工控软件很多时候就是这种“重启大法”最管用。假如AutoShop已经能扫到EtherCAT从站但InoDriverShop搜不到大部分情况是两种软件走的是不同的通讯机制你直接用AutoShop侧扫描并分配站号即可InoDriverShop只要能对伺服单独调参就行不一定非要通过USBTCP实时连接。7. 第六步Modbus RTU与CANopen通讯实战做工业控制通讯绝对是绕不开的大门类。H5U支持EtherCAT、Modbus RTU、Modbus TCP、CANopen等多种协议。哪怕你前面ST写得再熟练通讯配不明白现场一样抓瞎。这一章我们挑两个最常见也最实用的协议展开一是Modbus RTU二是CANopen。7.1 Modbus RTU主站配置与寄存器地址理解Modbus RTU是一种基于串口的通讯协议非常经典也是工控领域最普及的协议之一。许多变频器、仪表、温控器、智能电表都会提供Modbus RTU接口。H5U本体带有串口可以作为Modbus RTU主站去轮询这些从站设备。理解Modbus寄存器先从这张表开始地址范围数据类型读写属性典型用途00001至09999线圈Coil读写开关量输出10001至19999离散输入只读开关量输入40001至49999保持寄存器读写参数、运行数据30001至39999输入寄存器只读测量值、状态值掌握一个核心原则PLC作为主站时会向从站发送“功能码”加“寄存器地址”从站返回对应数据。比如读取变频器的运行频率通常使用功能码03读保持寄存器。寄存器地址在从站手册里一般会以40001开头的方式标注但实际报文中的地址编号要去掉40000这个偏移。例如手册写“运行频率地址40005”那Modbus报文里的实际地址就是0004从0开始。在H5U里做Modbus RTU主站一般是通过配置界面添加协议驱动然后在ST里调用对应通讯功能块。具体功能块名称和参数因固件版本略有差异但流程基本一致填从站地址、功能码、寄存器起始地址、数据长度然后触发读写。7.2 实战PLC读取变频器运行频率假设我们用H5U的串口作为Modbus RTU主站从站是一台汇川变频器从站地址为1运行频率寄存器地址为40005功能码03。你需要做的步骤是在AutoShop通讯配置中添加Modbus RTU主站设置串口参数波特率9600、数据位8、停止位1、无校验。老设备这里要注意很多仪表出厂默认就是9600/8/N/1但也有例外的必须对着设备手册设置。在ST中声明一个数据接收变量比如一个INT数组用于存放从站返回的数据。调用读取功能块把地址0004、长度1赋值进去。读回来的数据除以10可能才是以赫兹为单位的实际频率因为有些变频器内部数据放大了10倍。这个“除以10”或者“乘以0.1”的系数问题是现场调试中最常见的坑之一。每个厂家的变频器寄存器单位定义都不一样有的返回0.01Hz有的返回0.1Hz有的直接就是整数Hz。必须对照手册确认不能靠猜。关于大量从站轮询提一个经验如果现场有32个变频器走Modbus RTU轮询周期会非常长。你要做的不是在一个扫描周期里把32台全部读一遍而是设计一个轮询调度逻辑——同一个扫描周期只发1到2个从站的读写请求周期性地循环。这样才不会让PLC的通讯负载过重。可以采用一个轮询指针变量每次触发一个从站完成后指针加一到32后归零。7.3 CANopen配置与常见错误CANopen在汇川生态里的应用也很多尤其是一些使用CAN总线IO模块、阀岛、或者老式伺服的场合。H5U本体支持CANopen主站功能在AutoShop里的“通讯配置”中选CANopen主站扫描从站设置从站节点号然后配置PDO映射。CANopen中最容易翻车的点是节点号和波特率。一条CAN总线上的所有设备必须设置相同的波特率而且每个从站的节点号不能重复。现场如果出现设备全部通讯失败先怀疑波特率匹配如果只有某一个设备通讯失败先怀疑节点号冲突。PDO映射理解起来也需要一点抽象思维。简单说PDO就是“周期性自动传送的数据包”。主站从站约定好PDO1里放什么参数PDO2里放什么参数。配置好后主站不需要每次都发指令去读从站会按周期自动把数据打包发过来。这种机制非常适合运动控制和实时IO刷新。作为初学者我建议先不要一上来就自己手动映射PDO先用AutoShop的默认映射跑通通讯再根据实际需求增删对象。手动映射PDO时有一个常见错误对象字典Index和SubIndex填错或者数据长度不匹配导致从站一直报错。遇到这类问题最快的方法是“恢复出厂设置”重新按默认方式映射一遍。8. 第七步在线调试、监控与程序工程化规范最后这步不是锦上添花而是决定你在一个项目里能不能独立收尾的关键环节。写程序只是起点让程序在设备上稳定运行、出了问题能快速定位才是真正的工程能力。而且程序写得多、封装得规范你后面所有项目都会受益。8.1 在线监控与强制赋值AutoShop的在线监控功能是ST开发最基础的调试武器。程序下载后进入在线状态代码编辑器里每个变量旁边都会实时显示当前值。你就能直观地看到按钮信号有没有进来、输出有没有被驱动、定时器计时到多少了。如果需要临时改变某个变量的值来测试不同分支逻辑可以使用“强制”功能。比如你想测试报警分支又不想真的去触发报警按钮就在监控窗口里临时强制报警信号为TRUE程序就会按报警分支执行。强制功能分为“强制写”和“强制读”使用时务必注意调试完及时取消强制否则强制值会一直生效跑来现场你早忘了排查半天查不出来。如果程序支持在线修改很多PLC支持注意这是指在不动PLC运行状态的前提下修改部分代码并下载。但有些修改会导致CPU停机重启这在你控制真实设备时是危险的。我的建议是在设备运行中不要做任何在线修改要改就停下来安全第一。8.2 程序规范与可维护性我参与过很多设备的后期维护给我最大的教训就是程序必须写得像一本清晰的书而不是只有自己能看懂的密码。几个我坚持的规范分享给你命名规范物理IO用“DI_”“DO_”“AI_”“AO_”前缀比如DI_StartButton内部变量用“b_”开头表示BOOL比如bAlarm全局变量用“g_”开头比如g_nProductCount功能块实例用“fb_”开头比如fb_Cylinder_01。注释规范每个程序块开头写明作者、日期、版本、功能描述关键判断条件写清楚“为什么这样判断”状态机每个状态写清含义。版本管理每次下载前另存为一个版本文件命名带日期比如“工装设备_V1.0_20250615.autoshop”。现场调试绝对不要覆盖掉上一版否则改坏了回不去。备份程序程序做完后除了在PLC里存一份电脑上也要存一份最好网盘再放一份。8.3 程序下载与上传的注意点第一次接触H5U的工程师容易对“下载”和“上传”两个操作理解反。下载Download是把电脑里的工程写到PLC里上传Upload是把PLC里的程序读回电脑。设备量产或者现场维护的时候如果PLC里已经跑着一套程序而电脑里没有对应工程文件你可以上传程序。但ST语言和变量表的上传结果往往和原始工程有差异注释和部分结构会丢失。所以不要指望上传能百分之百还原工程日常保存好源工程才是正道。下载程序之前务必确认PLC处于STOP状态。如果PLC正在运行且控制着执行机构直接下载可能导致输出冻结或者程序瞬间中断在设备带负载的情况下非常危险。停机前先让设备回到安全位置再操作下载。8.4 扫描周期与程序优化调试后期要关注程序性能。H5U的扫描周期可以在在线监控里查看。如果发现扫描周期变长通常是以下原因程序中有大量浮点运算或者复杂数学函数尤其是三角函数、开方运算。通讯读写指令等待时间太长。比如Modbus RTU轮询中的超时时间设置过大导致每次请求要等很久。循环语句写的范围过大比如FOR循环上万次而实际只需要几十次。EtherCAT从站数量多、通讯周期短本身占用不少资源。一般中型设备的控制程序扫描周期在1ms到5ms之间都属于正常范围。如果超过10ms涉及到高速IO和运动控制就要谨慎了。优化时优先看通讯其次是浮点运算再就是循环。不要盲目追求扫描周期短设备稳才是第一位。9. 调试中最容易翻车的5个问题前面七步走完你已经具备独立开发的能力了。这一章我整理了调试现场最容易遇到的5类问题每一类都是我在真实项目里反复踩过、又反复帮别人解决的集中看一下能帮你少走很多弯路。问题现象常见原因排查方法程序编译通过但PLC不运行PLC处于STOP状态有急停信号程序被任务中断卡住查看PLC状态灯强制RUN检查急停回路查看任务监控伺服点动无动作轴未使能点动信号无效轴状态报错模式不对先查轴状态和错误码确认MC_Power的Enable为TRUE在线监控点动输入信号Modbus RTU通讯偶发失败波特率/校验位不匹配从站地址冲突干扰导致帧错误用串口调试工具监听报文把波特率降到19200或9600检查屏蔽接地定时器或计数器数值异常定时器重复实例化扫描周期导致累计误差用REAL做计数确保定时器和实例一一对应计数用DINT确认PT单位程序下载后设备动作异常下载时输出状态初始化旧程序残留变量初值不对下载前确认停机安全全初始化或恢复出厂设置检查变量的初始值以上这些问题有一个算一个都是实际项目里会真实发生的。你光记住答案没用核心是要掌握排查思路。排查的第一步永远是“确认现象”第二步是“缩小范围”是硬件问题还是软件问题是输入没到还是输出没出是通讯过程丢包还是逻辑判断错误。这些都排查完问题基本就水落石出。关于个人经验最后分享一点学ST语言最忌讳的是抱着教材去背语法。你不要把ST当成英语来学要把它当成工具箱来用。写程序时想一想如果我用梯形图这个逻辑会怎么画然后用ST换一种表达。每完成一个工位、一个设备就把其中的公共功能抽出来做成FB攒成自己的部件库。几年下来你编程的速度和可靠性会远远超过那些每次从零开始写的老工程师。这套“工控实战”系列后面我也会继续更新伺服同步、凸轮控制、视觉通讯这些进阶内容H5U的潜力值得你继续往下挖。
返回列表