简介面向PLC编程初学者与自动化工程师的ST语言入门资料聚焦汇川H5U系列控制器在AutoShop环境下的结构化文本编程实践帮助读者跨越梯形图思维、建立清晰的文本化控制逻辑。内容围绕工程创建、ST子程序与FB/FC插入、变量声明两种方式、字元件类型定义如D0:D表示DINT、D0:E表示浮点型展开并系统讲解IF、CASE…OF、WHILE…DO、REPEAT、FOR、EXIT、RETURN等流程控制指令的语法与死循环防范要点同时附有R_TRIG/F_TRIG边沿触发及基本轴控指令清单。资源包仅含1个PDF文件大小约1.21MB轻量便携适合随时查阅与对照练习。已有2055人学习可作为编写和调试ST程序的案头速查手册。1. 第一次打开 ST 编程界面为什么满屏都是看不懂的英文单词很多刚接触 PLC 编程的朋友第一次在 AutoShop 里新建工程、把编程语言选成 ST 之后看到的是一个纯文本编辑页面里面全是IF、THEN、END_IF这类英文单词跟印象里那种一根根线、一个个触点的梯形图完全不一样心里第一反应往往是这玩意儿我是不是选错了其实没选错。ST 的全称是结构化文本Structured Text它是 IEC 61131-3 标准里定义的一种高级编程语言你可以把它理解成“专门给控制器用的、简化版的 Pascal 或 C”。它用文字描述逻辑而不是用图形连线。对于写惯了梯形图的人来说它像换了一种方言但对于处理数学运算、循环、数组、复杂判断这类事情文字描述反而更直接、更不容易画得满屏都是线。这份《H5U-ST 简易编程手册》要解决的就是“从梯形图思维切换到 ST 思维”这个坎。它不讲高深理论而是把工程怎么建、变量怎么定义、流程控制怎么写、常用指令有哪些一条条列清楚。适合谁适合已经能看懂基本梯形图、但一写 ST 就发怵的初学者也适合完全没碰过控制器、想先弄明白“编程语言”这四个字在工业现场到底指什么的新人。读完你会知道第一步点哪里第一个程序长什么样。2. 先弄明白 ST 到底在干什么它和梯形图是同一件事的两种写法2.1 为什么值得学 ST三个梯形图很难受、ST 很舒服的场景先说清楚“为什么要学”。不是为了显得高级而是有些活儿用梯形图干确实费劲。第一个场景是数学计算。比如你要算一个轴的当前位置偏差再乘一个比例系数再累加到某个寄存器里。梯形图里得摆好几个运算框线连来连去改一个参数要重新理一遍线。ST 里就是一行偏差 : 实际位置 - 目标位置;下面再一行乘法读起来就是算术题。第二个场景是循环和数组。比如你要把 20 个寄存器的值依次搬到一个数组里或者对一批数据做同样的判断。梯形图里要么写 20 段重复逻辑要么用间接寻址绕来绕去。ST 里一个FOR循环三行就写完了改数量只改一个数字。第三个场景是复杂条件判断。多个条件组合、不同分支走不同处理梯形图里并联串联画一大片查错时眼睛都看花。ST 的IF...ELSIF...ELSE是缩进结构从上往下读逻辑层次一目了然。所以学 ST 的收益很实在计算类、批量类、分支类逻辑写起来短、读起来顺、改起来不容易漏。而梯形图擅长的东西——比如一个按钮控制一个线圈这种直观的开关逻辑——ST 也能写只是没必要硬换。手册里也说了新建工程时子程序、FB/FC 可以自由选择 ST 或者梯形图两种可以混着用不是二选一。2.2 第一个 ST 程序从新建工程到跑通一行赋值光说没用动手走一遍。下面每一步都对应手册里的“工程创建”部分你照着点就行。第一步打开 AutoShop 软件点击新建工程在编辑器列表里把编程语言选成 ST。新建完成后默认的程序页面就是文本编辑状态。第二步在程序页里输入第一行代码。ST 里赋值用:不是等号等号在 ST 里是“判断相等”的意思这个后面会反复提醒。// 第一个 ST 程序把一个常数写给一个变量 a : 100;这行代码的意思是把十进制 100 赋给变量 a。注意结尾的分号ST 里每条语句都要用分号结束漏了会编译报错。第三步变量 a 还没定义。你可以直接在程序里写a : 100;然后把光标点到程序基本块外面的区域或者按回车软件会自动弹出变量定义框让你填变量名和类型。这是手册里说的两种变量定义方式之一另一种是提前在变量表里声明。新手建议先用这种“边写边弹框”的方式写到哪里定义到哪里不容易乱。第四步编译。如果变量类型选的是整型这行代码就能通过。想验证结果可以在在线监控里看 a 的值是不是 100。// 带注释的完整小例子定义两个变量做加法 num1 : 10; num2 : 20; result : num1 num2; // result 应为 30这段代码跑通你就已经跨过了 ST 的门槛知道赋值怎么写、变量怎么定义、注释用//。别小看这三件事后面所有复杂逻辑都是在这个基础上搭起来的。我第一次写的时候光“等号和赋值符号分不清”就卡了半天你如果也卡了正常。3. 变量和数据类型ST 里最容易翻车、也最该先弄懂的部分3.1 变量定义的两条路以及字元件的“冒号后缀”写法变量定义这件事手册给了两条路。第一条是在变量表里统一声明适合变量多、需要提前规划的情况第二条是在程序编辑区直接写变量名然后按回车或点空白处弹框自动让你定义适合边写边加。两条路效果一样新手用第二条更顺手。真正需要单独记的是字元件类型定义这是 ST 和梯形图习惯差别最大的地方之一。以 D 元件为例你在程序里写D0它默认是 16 位整型。但如果你想要一个 32 位双整型DINT不能直接改而是要在程序里写成D0:D想要浮点型写成D0:E。RW 元件同理。// 字元件类型后缀写法 D0 : 100; // D0 默认按 16 位整型处理 D1:D : 100000; // D1 按 32 位双整型 DINT 处理 D2:E : 3.14; // D2 按浮点型处理这里的冒号后缀不是装饰它是在告诉编译器“这个地址请按哪种数据宽度来解读”。为什么容易翻车因为如果你把一个超过 16 位范围的大数写进没加后缀的 D 元件值会被截断现象就是“我明明赋了 100000读出来却是个奇怪的数”。原因就是默认 16 位装不下。解决办法就是按手册加:D或:E。这个坑我见过不止一个新人踩记住“大数加后缀”能省很多排查时间。3.2 常数怎么写、类型怎么转下划线分隔和显式转换常数表示手册列了几种。默认是十进制比如a : 100;。也支持带下划线分隔方便读长数字比如a : 10#100_10;、a : 16#FF_AE_12;、a : 2#1100_1111_11_10。下划线只是给人看的编译器会忽略作用类似财务数字里的千分位逗号。类型转换分显式和隐式。显式转换就是明确写INT_TO_DINT、INT_TO_REAL、REAL_TO_INT这类函数名一看就知道在转什么。隐式转换则是编译器自动帮你转手册里说 int 可以隐式转成 DINT 或 REAL但其他方向不一定行。新手容易犯的错是“以为什么都能自动转”结果把 REAL 直接塞进 INT 变量编译报错或者值被截断。// 显式转换示例 intVal : 10; dintVal : INT_TO_DINT(intVal); // 明确把 INT 转成 DINT realVal : INT_TO_REAL(intVal); // 明确把 INT 转成 REAL建议养成习惯跨类型赋值时宁可多写一个转换函数也别赌编译器自动帮你转。多写几个字母换来的是编译期就能发现的错误而不是运行时的玄学数值。3.3 数组下标的五条硬规矩手册第 14 条专门讲数组下标注意事项五条都很短但每条都能让程序编译不过或者运行出错。第一常量数组下标不能超出数组本身大小第二数组下标不能是软元件第三FB、FC 里数组下标不能是全局变量第四数组下标不能是表达式第五复杂结构变量里不允许出现两个变量数组下标。这五条的共同点是ST 对数组下标的“写法”要求很死不像高级语言那么自由。比如你不能写arr[i1]这种表达式下标得先把i1算到一个整型变量里再用那个变量当下标。新手如果带着写 C 或 Python 的习惯过来这里必翻车。我的建议是第一次用数组先用常量下标把逻辑跑通再换成变量下标一步一步来。4. 流程控制IF、CASE、三种循环以及两个“提前退出”的指令4.1 条件分支IF 和 CASE 分别什么时候用IF是最常用的分支指令语法是IF 布尔表达式 THEN 指令 ELSIF 布尔表达式 THEN 指令 ... END_IF;。它适合“条件有先后、前面的条件优先”的场景。比如先判断急停再判断启动再判断运行状态顺序不能乱。// IF 分支示例根据状态值走不同处理 IF bEmergencyStop TRUE THEN output : 0; // 急停优先直接清零输出 ELSIF bStart TRUE THEN output : 1; // 启动信号有效输出置 1 ELSE output : output; // 其他情况保持 END_IF;这段代码的关键在ELSIF的顺序急停放在最前面保证它永远优先。如果你把启动判断放前面急停就压不住这是逻辑设计上的坑不是语法坑。CASE适合“一个整数变量有多个离散取值、每个取值对应一段处理”的场景。手册明确说条件变量只能是整数。语法是CASE Var1 OF value1: 指令 ... ELSE 指令 END_CASE;。// CASE 分支示例按工位号执行不同动作 CASE stationNo OF 1: action : 10; 2: action : 20; 3, 4, 5: action : 30; // 多个值共用一段处理 ELSE action : 0; // 未列出的值走这里 END_CASE;CASE比一长串IF...ELSIF更好读的地方在于值是平铺的一眼能看出“哪个值对应哪段”。工位号、配方号、模式号这类场景优先用CASE。4.2 三种循环WHILE、REPEAT、FOR 的区别一句话说清WHILE...DO是“先判断、后执行”条件为真才进循环第一次判断为假就一次都不执行。REPEAT...UNTIL是“先执行、后判断”所以循环体至少跑一次。FOR是“计数循环”给定初值、终值、步长计数器到了就停。// WHILE条件为真时循环 i : 0; WHILE i 10 DO sum : sum i; i : i 1; END_WHILE; // REPEAT至少执行一次 i : 0; REPEAT sum : sum i; i : i 1; UNTIL i 10 END_REPEAT; // FOR计数循环步长省略时默认 1 FOR i : 0 TO 9 DO sum : sum i; END_FOR;三段代码做的是同一件事把 0 到 9 累加。区别在控制方式。FOR最省心因为计数器自增是它帮你做的你只要别在循环体里手动改计数器就行。WHILE和REPEAT更灵活条件可以是任意布尔表达式但灵活意味着你要自己保证循环能退出。手册特别提醒了死循环WHILE条件永远为真、REPEAT条件永远为假都会导致程序停不下来。真发生了PLC 数码管会闪Er 15 00 50 82其中Er1500是看门狗超时Er5082是死循环报警。看到这组码先回去查循环的退出条件。4.3 EXIT 和 RETURN一个跳出循环一个跳出整个程序块EXIT用在FOR、WHILE、REPEAT里面作用是立刻跳出当前循环继续执行循环后面的代码。RETURN更狠它直接离开当前 POU程序组织单元后面的语句全都不执行。// EXIT找到目标就跳出循环 FOR i : 0 TO 99 DO IF arr[i] target THEN foundIndex : i; EXIT; // 找到就停不再往后扫 END_IF; END_FOR; // RETURN条件满足就提前结束本程序块 IF bAbort TRUE THEN RETURN; // 后面的 a : a 1 不会执行 END_IF; a : a 1;这两个指令新手容易混。记法EXIT只影响“这一层循环”循环外面的代码照常走RETURN影响“整个程序块”它后面的全部跳过。用RETURN做提前返回能让代码少一层嵌套但别滥用否则读代码的人要满篇找“哪里会提前溜走”。4.4 边沿触发和快捷输入TAB 键能省一半打字上升沿R_TRIG和下降沿F_TRIG在 ST 里不是直接写指令而是先在功能块实例表里新建 FB 实例类型选R_TRIG或F_TRIG然后在程序页里调用。// 上升沿调用示例 r_trig_ins(CLK : startSignal, Q startPulse);CLK接被检测的信号Q输出一个扫描周期的脉冲。下降沿同理把实例类型换成F_TRIG。手册第 6 条讲快捷输入输入指令名支持联想后按 TAB 键会自动补全引脚。如果引脚后面默认参数是???说明这个参数必须填不填编译不过没有???的可以按实际情况决定填不填。这个技巧在写MC_Jog这种引脚多的指令时特别省事不用一个个查手册。我第一次用的时候不知道 TAB手敲了十几个引脚名后来知道后感觉前面白费劲。5. 避坑与排查新手写 ST 最容易踩的五个坑5.1 坑一把当赋值用编译报错或逻辑不对现象写a 100;想赋值结果编译报错或者程序行为跟预期不符。原因ST 里是“判断相等”赋值必须用:。解决养成肌肉记忆赋值一律:判断才用。改完重新编译报错消失。5.2 坑二大数写进没加后缀的 D 元件值被截断现象给D0赋了一个超过 16 位范围的数监控读出来是个不相干的小数。原因D0默认按 16 位整型解读装不下就截断。解决按手册写成D0:DDINT或D0:E浮点。改完再看监控值就对了。5.3 坑三循环退出条件写反PLC 闪死循环报警现象程序跑着跑着停了数码管交替闪Er 15 00 50 82。原因WHILE条件恒真或REPEAT条件恒假循环出不来触发看门狗超时和死循环报警。解决检查循环条件里参与判断的变量有没有在循环体内被修改FOR循环别手动改计数器。改完重新下载报警消失。5.4 坑四数组下标用了表达式或软元件编译不过现象写arr[i1]或arr[D0]当下标编译报错。原因手册第 14 条明确数组下标不能是表达式、不能是软元件、FB/FC 里不能是全局变量。解决先把下标算到一个整型局部变量里再用那个变量当下标。比如tmp : i 1; arr[tmp]。改完编译通过。5.5 坑五FB/FC 嵌套太深编译报层数超限现象多层调用后编译报错提示嵌套层数。原因手册写明 FB、FC 嵌套调用不能超过 8 层SBR 嵌套不能超过 6 层。解决把中间层逻辑合并或拆平减少一层调用。改完重新编译。这个坑不常遇到但一旦遇到报错信息不一定直白记住这两个数字能少查半天。6. 下一步学什么从会写一行到能写一个功能块的路线走到这里你已经能新建 ST 工程、定义变量、写分支和循环、看懂常见报错。接下来别急着啃全部指令表手册里列了轴控、凸轮齿轮、编码器、通讯、定时器、中断、字符串、其他指令八大类一口气看完只会晕。我的建议是按“用得到才学”的顺序推进。第一步把定时器四个指令TPR、TONR、TOFR、TACR吃透。它们是 ST 里最常用、也最容易和梯形图习惯对应上的指令写完能立刻在监控里看到时间变化反馈快适合建立信心。第二步挑一个轴控指令做小实验比如MC_Power加MC_MoveRelative。先只做使能和一段相对定位跑通了再加MC_ReadActualPosition读位置。轴控指令引脚多正好练 TAB 快捷输入和???必填参数的判断。第三步学 FB/FC 的封装。手册第 5 条讲了 FB 和 FC 的区别FB 的输入参数除轴参数外可以不填FC 的输入引脚必须填否则编译报错。把一段重复逻辑封成 FC在主程序里调用体会“写一次、用多次”的收益。注意嵌套别超过 8 层。第四步碰在线修改。手册第 9 条列了在线修改的支持范围和不支持范围比如不支持增删程序文件、不支持改配置、FB/FC 局部变量里 IN/INOUT/OUT 类型不能增删改。这些限制先记个大概等真正需要在线改的时候再回来对照比现在硬背有用。阶段重点内容建议投入第一周变量定义、赋值、IF/CASE每天写一个小判断第二周三种循环、EXIT/RETURN把数组遍历写熟第三周定时器、边沿触发做一个延时启停小逻辑第四周FB/FC 封装、一个轴控指令封装一个可复用块最后说个我自己的习惯。从那以后我每次新建 ST 工程第一件事不是急着写逻辑而是先把要用的变量在变量表里列一遍标好类型和后缀再动手写第一行。这个习惯来自一次血泪经验早期我边写边弹框定义变量写到一半发现同一个量在两个地方类型不一致排查了半天才发现是弹框时手滑选错了。现在先列清单再写代码虽然开头多花五分钟但后面省下的排查时间远不止五分钟。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?