H5U-ST编程手册实战指南:从变量声明到在线修改的避坑检查表
发布时间:2026/11/3 3:04:39 锦皓数字建站

简介面向PLC编程初学者与自动化工程师的ST语言入门资料聚焦汇川H5U系列控制器在AutoShop环境下的结构化文本编程实践。内容从工程创建切入讲解新建ST工程与在梯形图工程中插入ST子程序、FB/FC的方法并说明变量声明的两种途径及不区分大小写的规则进而以D元件、RW元件为例介绍16位整型、DINT、浮点型等字元件类型的书写约定。流程控制部分系统梳理IF、CASE…OF、WHILE…DO、REPEAT、FOR、EXIT、RETURN等指令的语法与执行逻辑并提示死循环风险另附R_TRIG/F_TRIG边沿触发及轴控指令清单。资源包为1个PDF文件约1.21MB篇幅精简便于随查随用。已有2055人学习适合希望从梯形图过渡到ST编程、快速掌握语法要点与常见陷阱的读者。1. 拿到一份 ST 手册先别急着翻指令表上周有个做包装机改造的朋友发来一段 ST 代码让我看说编译死活过不去报错指向一行D0 : D100 * 2;。我扫了一眼就问他D0 你按什么类型用的他说整数啊。问题就在这——H5U 的 D 元件默认是 16 位整型你拿它当 32 位算溢出和类型不匹配全藏在编译期和运行期两个不同的地方。这类坑手册里其实都写了但没人愿意从头读到尾。这份《H5U-ST 简易编程手册》就是干这个用的它把 AutoShop 环境下 ST 编程语言从建工程、定义变量、写流程控制到轴控、凸轮、编码器、通讯指令的调用方式再到在线修改边界和异常处理压成了一份能对着抄的实操底稿。适合两类人一是梯形图用熟了、想切 ST 写复杂逻辑的电气工程师二是接手了别人 ST 程序、需要快速搞懂变量声明和指令引脚含义的维护人员。下面我按自己拆这类手册的习惯把它拆成能直接落地的几段。2. 工程创建与变量声明ST 页面怎么插进梯形图工程2.1 新建 ST 工程与混合编程的两种入口AutoShop 里建 ST 工程有两条路选哪条取决于你手上是全新项目还是改造项目。全新项目直接新建工程在编辑器列表里把编程语言选成 ST建完之后默认程序页面全是文本编辑模式。这里有个容易被忽略的点即便你建的是 ST 工程新增子程序、FB、FC 的时候仍然可以自由选 ST 或梯形图也就是说混合编程从工程级别就是允许的不是非得二选一。改造项目走第二条路先建梯形图工程右键程序页插入子程序类型选结构化文本 ST。FB/FC 同理。我一般会建议改造项目走这条因为原有梯形图逻辑不动新加的复杂算法用 ST 单独开页面出了问题好定位回退也干净。提示混合工程里 ST 页面和梯形图页面共享同一套变量表变量名不区分大小写Motor_En和motor_en是同一个东西命名规范最好在开工前定死。2.2 变量声明的两种方式与字元件类型后缀变量声明和梯形图编程保持一致不区分大小写有两种定义方式。第一种是在变量表里直接声明适合批量整理 IO 和全局变量第二种是在程序编辑区直接写变量名按 Enter 键或者鼠标点到程序基本块外区域会自动弹出变量定义框让你声明。第二种方式写起来快但我踩过的坑是弹框里类型选错了不容易发现尤其是批量粘贴代码的时候建议写完一段就回变量表扫一眼。字元件类型定义是这份手册里最值得单独拎出来讲的部分。以 D 元件为例程序里写D0默认是 16 位整型要定义成 DINT得写成D0:D要浮点型写成D0:E。RW 元件同理。这个后缀不是可选的语法糖它直接决定编译器按几位数据去解析这个地址。D0 // 默认 16 位整型 D0:D // 按 DINT32 位整型解析 D0:E // 按浮点型解析 RW0:D // RW 元件同理按 DINT 解析逻辑说明后缀写在元件名后面、用冒号连接编译器看到后缀就切换解析宽度。参数说明上:D对应双整型占两个字:E对应实数同样占两个字。这里的关键边界是——同一个 D 地址在不同程序页里必须用同一种后缀否则一个页面按 16 位写、另一个页面按 32 位读数据错位是必然的而且这种错位在编译期往往不报错只在运行值上体现属于典型的黑匣子问题。2.3 常数表示与类型转换的写法常数支持三种进制写法十进制直接写其他进制带前缀并用下划线分组10#100_10、16#FF_AE_12、2#1100_1111_11_10。下划线只是可读性分隔不参与数值计算我习惯每四位一组跟看寄存器位图对得上。类型转换分手动和隐式两类。显式转换用INT_TO_DINT、INT_TO_REAL、REAL_TO_INT这类函数名直写。隐式转换的规则手册写得很克制int 可以隐式转 DINT 或 REALint、dint 可以隐式转……原文这里表述有截断实操中我按保守原则处理——凡是跨类型赋值一律显式写转换函数不赌编译器的隐式规则。血泪经验是隐式转换在简单赋值里看着没事一旦进了数组或者 FB 引脚报错信息会指向一个跟根因完全无关的行号。3. 流程控制指令IF、CASE、三种循环和两个跳转3.1 IF 与 CASE 的分支写法IF 的语法是IF 布尔表达式 THEN ... ELSIF ... END_IF;ELSIF 可以有多层。写 IF 我只有一个硬规矩每个分支体不超过一屏超了就抽成 FC。ST 的缩进不像梯形图有网络边界长分支读起来非常费眼。CASE 适合一个整数变量对应多个离散值的场景比如工位号、配方号。语法是CASE Var1 OF加若干value: Instruction支持一个分支挂多个值value3, value4, value5:最后可以带 ELSE。注意手册明确写了条件变量只能是整数你拿 REAL 或者 BOOL 去 CASE编译直接拦。CASE StationNo OF 1: ValveA : TRUE; 2, 3: ValveB : TRUE; // 多个值共用一个分支 4: ValveA : FALSE; ValveB : FALSE; ELSE Alarm : TRUE; // 非法工位号兜底 END_CASE;逻辑说明StationNo 是整数条件变量按值匹配进入对应分支都不匹配走 ELSE。参数说明分支值必须是常量整数不能写变量或表达式ELSE 建议永远写上作为非法值的兜底这是我在现场调试时养成的习惯——没有 ELSE 的 CASE遇到越界值就是静默不动作排查起来比报错还费时间。3.2 WHILE、REPEAT、FOR 三种循环的选用边界WHILE 是条件在前WHILE 布尔表达式 DO ... END_WHILE;条件为 TRUE 才进循环第一次就是 FALSE 则一次都不执行。REPEAT 是条件在后REPEAT ... UNTIL 布尔表达式 END_REPEAT;循环体至少执行一次直到条件为 TRUE 退出。FOR 是计数循环FOR INT_Var : 初值 TO 终值 {BY 步长} DO ... END_FOR;步长可选默认 1计数器超过终值就停。选型上我的习惯是已知循环次数用 FOR次数不定但可能零次用 WHILE必须至少跑一次用 REPEAT。手册对死循环的警告写得很直白——WHILE 条件永远为 TRUE、REPEAT 条件永远为 FALSE都会卡死。H5U 这边有看门狗和死循环检测兜底PLC 数码管会交替闪Er 15 00和Er 50 82前者是看门狗超时后者是死循环报警程序会报错停止运行故障诊断界面能跳到出错位置。但别指望这个兜底它救的是程序救不了你产线上停机的损失。3.3 EXIT 与 RETURN 的区别EXIT 只退出当前所在的 FOR、WHILE 或 REPEAT 循环循环外面的代码继续跑。RETURN 是直接离开当前 POU整个程序块都不再往下执行。手册给的例子很典型IF bTRUE THEN RETURN; END_IF; a:a1;b 为真时a:a1根本不执行。这两个指令混用是新手高频翻车点。我见过有人在 FOR 里想提前结束整个子程序写了 EXIT结果循环退了、后面的逻辑照跑输出状态跟预期完全对不上。记住一句话退循环用 EXIT退程序块用 RETURN。3.4 边沿触发 R_TRIG / F_TRIG 的实例化方式上升沿和下降沿不是直接写指令而是先在功能块实例表里新建 FB 实例对象FB 类型分别选 R_TRIG 和 F_TRIG然后在 ST 页面里调用r_trig_ins(CLK : , Q );。CLK 接被检测信号Q 输出一个扫描周期的脉冲。r_trig_ins(CLK : StartBtn, Q StartPulse); IF StartPulse THEN RunFlag : TRUE; END_IF;逻辑说明StartBtn 的上升沿让 Q 输出一个周期的高电平StartPulse 只在一个扫描周期内为 TRUE。参数说明CLK 是输入引脚Q 是输出引脚实例名r_trig_ins由你在实例表里定同一个实例不要在多处重复调用否则沿检测的上一周期状态会被互相覆盖脉冲宽度变得不可预期。4. 指令库调用轴控、凸轮、编码器与通讯的引脚怎么填4.1 基本轴控指令的调用骨架手册列了完整的轴控指令表从 MC_Power 使能、MC_Reset 复位、MC_ReadStatus 读状态到 MC_MoveRelative 相对定位、MC_MoveAbsolute 绝对定位、MC_MoveVelocity 速度指令、MC_Jog 点动、MC_Home 原点回归、MC_Stop 停止、MC_Halt 暂停、MC_ImmediateStop 急停再到插补类的 MC_MoveLinear 直线插补、MC_MoveCircular 圆弧插补和轴组类的 MC_GroupStop、MC_GroupPause。这张表的价值不在指令名在于让你知道哪些动作有专用指令、不用自己拼。调用骨架以 MC_Jog 为例手册给的引脚模板是MC_Jog(Enable : ???, Axis : ???, JogForward : ???, JogBackward : ???, Velocity : ???, Acceleration : ???, Deceleration : , CurveType : , Busy , CommandAborted , Error , ErrorID );。引脚后面默认参数是???的是强制输入不填编译不过其余可以按实际情况决定。MC_Jog(Enable : JogEnable, Axis : Axis1, JogForward : JogFwd, JogBackward : JogBwd, Velocity : 50.0, Acceleration : 500.0, Deceleration : 500.0, Busy JogBusy, Error JogErr, ErrorID JogErrID);逻辑说明Enable 为 TRUE 时点动功能生效JogForward/JogBackward 决定方向Velocity、Acceleration、Deceleration 给速度和加减速。参数说明Axis 是轴参数属于必须输入的引脚变量Busy、Error、ErrorID 是输出引脚用接变量。这里有个实操细节——轴参数引脚不是随便填个变量名就行它得是系统里已经配置好的轴对象填错类型编译期就报。4.2 凸轮、齿轮与编码器指令的分组记忆凸轮齿轮这块MC_CamIn 开始凸轮、MC_CamOut 解除、MC_Phasing 主轴相位偏移、MC_GenerateCamTable 更新凸轮表、MC_SaveCamTable 保存凸轮表、MC_GearIn 齿轮开始、MC_GearOut 解除、MC_GetCamTablePhase 和 MC_GetCamTableDistance 读凸轮表相位与位移、MC_DigitalCamSwitch 电子凸轮挺杆控制。记忆方法是按「进 / 出 / 查 / 配」四类分CamIn、GearIn 是进CamOut、GearOut 是出Get 开头是查Generate、Save 是配。编码器指令分高速计数器和编码器轴两组。HC_ 开头的是高速计数器HC_Counter 使能、HC_Preset 预置、HC_TouchProbe 探针、HC_Compare 比较、HC_ArrayCompare 数组比较、HC_StepCompare 等间距离比较。ENC_ 开头的是编码器轴其中好几个带「仅本地编码器轴有效」或「仅总线编码器轴」的限定——ENC_SetUnit、ENC_SetLineRotationMode、ENC_Compare 仅本地有效ENC_Reset、ENC_ResetCompare、ENC_GroupArrayCompare、ENC_ReadStatus、ENC_DigitalOutput 仅总线有效。这个限定不是注释是选型依据你手上是本地编码器还是总线编码器直接决定哪些指令能用。4.3 通讯、定时器、中断与字符串指令通讯指令只有三条ETC_ReadParameter_CoE 读从站 SDO 参数、ETC_WriteParameter_CoE 写从站 SDO 参数、ETC_RestartMaster 重启主站。定时器四条TPR 脉冲定时器、TONR 接通延时、TOFR 关断延时、TACR 时间累加。中断两条EI 开启、DI 关闭。字符串一条 STRMOV。其他指令里 ZSET 批量置位、ZRST 批量复位、BITW 十六位转字、WBIT 字转十六位、ModReal 实数取余、MSET 内存设置、MCPY 内存复位。BITW 和 WBIT 这对在写通讯打包解包时特别顺手一个字的 16 个位和 16 个 BOOL 之间来回转比逐位赋值干净。ModReal 做实数取余浮点运算里偶尔要用别自己拿减法循环凑。4.4 FB、FC、子程序、中断的调用差异与嵌套上限这四类调用形式完全不同混了就是编译错误。FB 的输入参数里轴参数是必须输入的引脚变量其他引脚包括输出都可以不填FC 的输入参数引脚必须输入否则编译报错输出参数可以为空子程序以无参函数形式调用写SBR_001();中断不用手动调用开中断调 EI、关中断调 DI。引脚快速调出有个快捷键输入完左括号(后按 TAB 键。FB 的例子是testfb(m0,m1)变成testfb()再按 TAB 展开引脚FC 的例子是testfc(m0,m1)变成testfc(m0)。嵌套层数有硬上限FB、FC 嵌套调用不能超过 8 层SBR 嵌套不能超过 6 层。超了编译报错这种报错信息通常指向最外层调用根因在嵌套深处排查时从调用链末端往回数层数最快。5. 避坑清单在线修改、数组下标和异常码的五个真实翻车点5.1 在线修改改了函数名标号变了导致下载失败现象在线修改时顺手改了个函数名下载报错或者修改不生效。原因手册写明了在线修改的范围——函数名范围内修改标号会改变只有在函数始末处添加;、(*以及空格、TAB、换行该函数标号才不变。解决在线修改阶段不动函数名要改名就下线改完整体下载非改不可时在函数首尾加注释符或分号保持标号稳定。5.2 在线修改想加程序文件软件直接不给选项现象想在线新增一个程序文件或者重命名现有文件发现操作被禁。原因手册的限制清单写得很清楚——不支持增、删程序文件不支持重命名程序文件不支持修改程序文件属性不支持加解密子程序也不支持修改配置。解决这些操作全部放到离线做在线只做逻辑体内部的修改。全局变量支持增删、支持改变量名和注释其他特性不支持FB/FC 局部变量不支持增删改 IN/INOUT/OUT 类型只支持增删 Var 类型。本次在线修改周期前增加的 Var 变量只支持改名和注释本周期内增加的 Var 变量才能全特性改。这条边界记不住就会反复撞墙。5.3 数组下标用了软元件或表达式编译报错指向莫名其妙的位置现象数组访问写成Arr[D100]或者Arr[i1]编译报错行号对不上。原因手册的数组下标注意事项列了五条——常量下标不能超出数组大小下标不能为软元件FB/FC 中下标不能为全局变量下标不能为表达式复杂结构变量中不允许出现两个变量数组下标。解决下标统一用局部整型变量进数组前先做范围判断FB/FC 里要用全局值当下标先赋给局部变量再用。5.4 除零和数组越界不报编译错只在运行期闪 Er 码现象程序跑着跑着 PLC 数码管交替闪Er 50 81或Er 50 80逻辑停摆。原因除数为 0 时系统自动把 0 替换成 1 并报Er 50 81数组越界常量在编译期检查、变量在运行期检查越界后报错并把越界值用数组最大下标表示报Er 50 80。注意当前阶段 BOOL 数组没做越界检查这是手册明说的缺口。解决除法前显式判零数组访问前显式判上下界BOOL 数组自己加保护别指望系统兜底。5.5 死循环触发看门狗故障码要会读现象程序卡死数码管闪Er 15 00和Er 50 82。原因Er 15 00是看门狗超时Er 50 82是死循环报警两者常常一起出现。解决故障诊断界面会显示错误信息并能跳转到错误处先跳过去看是哪个 WHILE 或 REPEAT 的条件写反了修完之后在循环体里加计数器上限做二次保护别让同一段代码有第二次卡死的机会。6. 把手册用成检查表上线前我固定跑的四个验证动作手册读到最后一章真正值钱的不是记住了多少条指令而是把它变成一套上线前的固定动作。我自己现在每次 ST 程序下载前会按顺序过四件事每件都对应手册里的一个具体边界。第一件扫一遍所有字元件后缀。用文本搜索把:D和:E列出来逐个确认同一地址在所有页面后缀一致。这一步花不了五分钟但能挡掉大部分运行期数据错位。第二件检查数组下标。把所有Arr[出现的位置过一遍确认下标是局部整型变量、有范围判断、FB/FC 里没有直接用全局变量。第三件数嵌套层数。FB/FC 调用链从末端往回数不超过 8 层SBR 不超过 6 层。第四件确认在线修改计划。要改函数名、要加程序文件、要动 IN/INOUT/OUT 引脚的全部挪到离线窗口在线只做逻辑体内部调整。这四件事对应一张简单的检查表检查项判据对应手册条目字元件后缀一致性同一地址全工程统一:D/:E字元件类型定义数组下标合法性局部变量、有界判断、非表达式数组下标注意事项五条嵌套层数FB/FC ≤ 8SBR ≤ 6FB/FC/子程序/中断在线修改范围不改名、不增删文件、不动 IN/INOUT/OUT在线修改限制清单还有两个小技巧值得单独说。一是快捷输入输入指令名支持联想按 TAB 补全引脚引脚默认值是???的必须填其余可空这个习惯能把引脚漏填的编译错误提前消灭。二是鼠标悬浮提示变量悬停显示变量名、类型、注释FB/FC/指令悬停显示函数名、类型、注释和全部输入输出引脚的类型与注释调别人程序的时候先把悬浮提示当文档读一遍比翻变量表快得多。最后提一句手册里那个容易被跳过的注因为梯形图指令转 ST 形式还没全部更新工具箱快捷输入功能暂时是关闭的等后续更新才开。这意味着现阶段别指望从工具箱拖指令老老实实手敲或者用联想补全。我第一次遇到时以为是软件装坏了折腾了半天重装后来翻到这条注才明白是版本阶段的已知状态。从那以后我每次拿到一份新的 ST 手册第一件事不是从头读而是先把它拆成「建工程、声明变量、写控制、调指令、避坑、上线检查」六段每段挑一个能立刻验证的点跑一遍跑通了再往下。这份 H5U-ST 手册我按这个方式过完最深的体会是它的价值不在指令表有多全而在那些「不支持」「仅本地有效」「不能超过几层」的边界写得足够具体边界才是现场不翻车的地方。希望帮到你。本文还有配套的精品资源点击获取
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。