简介:这份欧姆龙ST编程中文手册面向PLC编程初学者与自动化工程技术人员,用于系统学习结构化文本(ST)语言的基础语法与功能块应用。手册以CX-Programmer 6.1为编程环境,内容涵盖功能块介绍与类型划分、变量声明与赋值/条件/循环等基本语法、编程环境设置,以及安全注意事项与应用注意事项等章节,并附有功能块规格、实例规格与功能块限制等技术参数说明,可作为入门指南与日常参考。资源包共1个PDF文件,约2.26MB,为中文版操作手册,便于在电脑或移动设备上随时查阅。目前已有7311人学习下载,说明其在工控编程学习群体中具有较高的参考价值。读者可借助它快速建立ST编程的整体认知,掌握功能块与变量的使用方法,并在实际项目中规避常见的安全与应用问题。
1. 欧姆龙ST编程中文手册:一份2006年的功能块手册,今天还能不能打
手上拿到一份 W447-CN5-02 编号的中文手册,封面写着 CX-Programmer 6.1 功能块操作手册,修订日期 2006 年 6 月,对应 CS1-H、CJ1-H、CJ1M、CP1H 这几条 CPU 线,外加 NSJ、FQM1。很多人第一反应是:快二十年的文档了,还有翻的必要吗。我的判断恰恰相反——如果你现在还在维护存量 CS/CJ/CP 系列设备,或者要接手一套用功能块(FB)搭起来的老程序,这份手册的价值不在“新”,而在“准”:它把功能块的定义、实例、变量、库文件、编译限制、指令操作数边界讲得比很多二手教程细,尤其是数组长度与指令操作数不匹配时编译器到底报错还是只给警告,这种细节直接决定你现场敢不敢下载程序。它适合做设备维护、产线改造、老程序移植的电气工程师,不适合只想学 ST 语法皮毛的人。
2. 功能块与ST语言:先把这套编程模型的地基打牢
2.1 功能块、实例、变量三者的关系
这份手册第 1 章把功能块(Function Block)定义成“带内部变量的程序单元”,可以理解成梯形图里的一个“黑匣子”:对外只暴露输入参数和输出参数,内部逻辑用梯形图或 ST 写都行。关键在于“定义”和“实例”是分开的——定义只写一份,实例是定义在内存里的一次落地,每个实例有自己的变量副本。手册里反复强调的“实例规格”“实例执行时间”,说的就是这件事:你调用 10 次同一个 FB,就有 10 份实例数据,占 10 份内存,执行时间也按实例累加。
变量分三类,这是后面所有坑的源头:内部变量(FB 内部用,外部看不见)、输入变量(算法执行前成批从参数搬进来)、输出变量(算法执行完再成批写回参数)。手册里有一句很容易被跳过的话:数值是“成批地”经过输入参数到达输入变量的,不是指令执行到哪搬到哪。这意味着你在 FB 内部用输入变量做中间运算,拿到的永远是本次调用开始时的快照,不会随内部指令执行而变。我一般会跟新人说:输入变量当只读用,要改就落到内部变量,别在输入变量上做自增。
还有一条硬规矩:指定多个字的首地址或末地址时,必须用 AT 设定(或外部变量)来指定变量,或者变量长度要和指令处理的数据长度一致。否则编译直接报错。这条在手册的“安全注意事项”和“应用注意事项”里各出现一次,说明当年踩的人不少。
2.2 为什么老项目偏爱功能块而不是纯梯形图
纯梯形图做重复逻辑,复制粘贴十遍,改一个定时器参数要改十处,这是血泪经验。功能块把“一段带状态的逻辑”封装起来,参数化调用,改定义一处生效。手册第 2 章给了功能块规格、实例规格、CPU 单元的功能块规格,还有“功能块程序步骤数和实例执行时间”的表格——这其实是在提醒:FB 不是零成本的抽象,每个实例都要吃扫描周期。CP1H 这类小型机资源紧,实例开多了周期时间肉眼可见地涨。
选型上我的习惯是:逻辑重复三次以上、且带内部状态(计时、计数、步序)的,做成 FB;纯组合逻辑、一次性的,老老实实写梯形图,别为了“架构好看”硬封。手册里“功能块应用指南”那一节讲的就是这个度,虽然写得偏官方,但方向是对的。
2.3 用 ST 写 FB 内部算法的最小骨架
手册附录 B 专门讲结构化文本(ST 语言),附录 A 讲数据类型,附录 C 讲外部变量。把这三块拼起来,一个能编译的 FB 内部 ST 大概长这样(变量名按手册风格起,实际项目里换成你自己的):
(* 功能块内部ST示例:带使能的累计计时 *) (* 输入变量:Enable(BOOL), Reset(BOOL) *) (* 输出变量:Elapsed(TIME), Running(BOOL) *) (* 内部变量:tAcc(TIME), bPrev(BOOL) *) IF Reset THEN tAcc := T#0s; (* 复位累计值,注意用T#字面量 *) Elapsed := T#0s; Running := FALSE; ELSIF Enable THEN tAcc := tAcc + T#10ms; (* 假设任务周期10ms,按实际任务周期改 *) Elapsed := tAcc; Running := TRUE; ELSE Running := FALSE; (* 不使能时保持Elapsed,不清零 *) END_IF;逻辑说明:Reset 优先级最高,直接清零;Enable 有效时按固定步长累加;不使能时只把 Running 拉低,Elapsed 保持——这是“暂停”而不是“复位”,现场调试时这两种语义经常被混用,导致操作工以为停了其实还在累计。参数说明:T#10ms必须和该 FB 所在任务的循环周期一致,手册在“实例执行时间”部分隐含了这个前提,任务周期改了这里不改,计时就是玄学。Elapsed是输出变量,按手册的成批写入机制,它在本次调用结束才写回参数,所以 FB 内部别拿Elapsed当中间量再算。
提示:ST 里的赋值用
:=,比较用=,这两个符号在 CX-Programmer 6.1 的 ST 编辑器里敲错一个就是编译错误,且报错行号有时偏移,别死盯报错那一行。
3. 在CX-Programmer 6.1里落地:从建FB到下载的完整链路
3.1 建功能块定义与库文件
手册第 3 章“创建功能块”给了程序流,第 1 章 1-4 节讲“将功能块定义转换为库文件”。实操顺序是:先在项目树里新建功能块定义,选编程语言(梯形图或 ST),定义变量表(名字、数据类型、方向:输入/输出/内部/外部),写完算法,编译通过后另存为库文件(.cxf 之类,具体后缀以你装的版本为准),之后别的项目就能引用这个库。
变量表这一步最容易翻车的是数据类型。附录 A 列了 BOOL、INT、UINT、DINT、REAL、TIME、WORD、ARRAY 等,注意 WORD 和 UINT 在手册里是分开的,混用会在指令操作数匹配时报类型错误。数组变量要特别小心:手册明确说,指令操作数处理长度固定时,数组元素数量必须和指令处理的元素数量相同,否则编译报错;长度不固定(由另一个变量指定)时,数组元素数量必须大于等于那个长度,否则 6.1 版只给警告不报错——然后指令会对超出元素数的那部分照读照写,踩到别的变量头上,这就是现场“莫名其妙动作”的来源之一。
3.2 变量声明与AT设定的写法
AT 设定是这份手册的高频词。它的作用是给变量绑一个绝对地址(比如 CIO 区的 W 字),让指令能按“多字首地址”去操作。写法上,在变量属性里勾 AT,填地址,例如W100。下面这段是变量表在文本层面的等价描述,方便你对照检查(不是可直接粘贴的源码,CX-Programmer 的变量表是表格录入):
变量名 数据类型 方向 AT设定 说明 StartSig BOOL 输入 - 启动信号 RunTime TIME 输出 - 运行时长 wBuf ARRAY[0..9] OF WORD 内部 W100 10字缓冲,供多字指令用 wFirst WORD 内部 W100 首字,与wBuf同址逻辑说明:wBuf和wFirst绑同一地址是刻意的——手册要求“由操作数指定多个字中第一个或最后一个时,输入变量无法被用作指令操作数,应使用带 AT 设定的内部变量”。所以多字指令的操作数一律走内部变量 + AT,别图省事直接塞输入变量。参数说明:数组上下界写清楚,ARRAY[0..9]是 10 个元素,如果某条指令要处理 16 个字,这里就必须扩到 16,否则就是上面说的越界读写。
3.3 编译、下载与闪存备份的时序
编译通过后下载,手册“应用注意事项”里有两条必须刻在脑子里:第一,包含功能块的任务无法在任务单元中下载(上传可以),也就是说你只能整程序下载,别指望单独下某个任务;第二,在线编辑后 CS1-H/CJ1-H/CJ1M/CP1H 会把用户程序和参数区备份到内置闪存,备份期间 CPU 前面板 BKUP 灯亮,此时断电数据就不备份了。
下载前还有一条安全警告:把 I/O 存储器区状态从编程软件传送到实际 CPU 之前,要充分确认安全性,因为不管 CPU 在什么模式,接在输出单元上的设备都可能动作。我一般会先把输出侧能断的断掉,或者至少让现场的人知道“要下载了”。
# 不是真命令,是下载前自检清单的落地形式,按顺序过一遍 1. 确认CPU模式在PROGRAM 2. 确认输出负载已隔离或现场已通知 3. 确认程序编译0错误(警告也要逐条看) 4. 确认FB实例数量与周期时间余量 5. 下载后先监控,再切RUN这段清单看着土,但比任何流程图都管用。手册里那些“否则可能导致人身伤害”的警告,落到操作层面就是这几步。
4. 避坑与排查:功能块编译和运行的五个高频翻车点
4.1 现象:编译报错“操作数长度不匹配”,但变量明明够长
原因:指令操作数要处理多字,你给的变量没有 AT 设定,或者变量是输入变量。手册写得很死:指定多字首/末地址必须用 AT 设定或外部变量,输入变量不能当这类操作数。解决:把该变量改成内部变量并加 AT 设定,或者用数组变量且元素数与指令长度严格相等。
4.2 现象:数组长度比指令长度短,编译只给警告,运行后别的变量被改
原因:长度由变量指定时,6.1 版不报错只警告,指令对超出数组元素数的部分照常读写。解决:把数组元素数扩到大于等于最大可能长度;如果长度是常量,则必须严格相等。上线前把这类警告当错误处理。
4.3 现象:FB 内部用输入变量做累加,结果每次调用都从初值开始
原因:输入变量是算法执行前成批搬入的快照,不是实时跟随。解决:累加、计数这类带状态的量放内部变量,输入变量只读。
4.4 现象:下载后程序跑飞,提示非法指令
原因:含 6.0 版以上功能块的程序被下到了不支持功能块的 CPU(2.0 版及以下的 CS/CJ 系列),所有实例被当非法指令。解决:确认 CPU 单元版本,CP1H 和 3.0 版以上的 CS1-H/CJ1-H/CJ1M 才支持;不支持的机器只能去掉 FB 改回标准程序。
4.5 现象:在线编辑后断电,改动丢了
原因:在线编辑触发闪存备份,BKUP 灯亮期间断电,数据没写进去。解决:等 BKUP 灯灭再断电;或者在 PLC 属性里打开“PLC 存储器备份状态”显示,确认备份完成。
注意:手册里“用户程序无法上传到 CX-Programmer 中”这句在注意事项里出现过,结合上下文指的是某些受保护或特定条件下的情形,实际能不能上传以你手上 CPU 的保护设置和软件版本为准,别拿这句话当“永远不能上传”的结论。
5. 把手册用成工具书:三个检索技巧和一个验证习惯
这份手册 150 多页正文加附录,当小说读一遍记不住,当工具书用才划算。第一个技巧:按“症状”查而不是按“章节”查。编译报错先翻 2-5“规定多字中第一个字或最后一个字的操作数指令注意事项”和 2-6“指令支持和操作数限制”,这两节是编译错误的集中营;运行异常先翻 2-3“功能块限制”和 2-7“CPU 单元的功能块规格”,资源不够、实例超限都在这。第二个技巧:附录 B 的 ST 规格和附录 A 的数据类型要对着看,ST 里每个运算符能接受哪些类型,附录 B 有表,别凭 C 语言直觉写。第三个技巧:把 1-4“将功能块定义转换为库文件”和 3-1“程序流”打印出来贴工位,建库和建 FB 的顺序错一步,后面变量表全要重来。
验证习惯上,我自己的做法是:任何带 FB 的程序,下载前先在软件里做一次“实例数量 × 单实例执行时间”的粗算,和任务周期余量对一下,余量低于 20% 就砍实例或者拆任务。这个习惯来自一次翻车——某模拟项目里一个 FB 开了三十多个实例,单看每个都不大,合起来把扫描周期顶到临界,现场偶尔丢输入脉冲,查了两天才定位到是周期余量不够,不是接线问题。从那以后我每次建 FB 都强制走一遍“实例数 × 执行时间”的估算,再顺手把数组长度和指令长度对一遍,宁可编译期多花十分钟,也不在产线上花两天。
手册里那些 2006 年的警告语今天读起来有点啰嗦,但每一条背后大概率都有一台停过的设备。把它当中文速查表放在手边,遇到 FB 相关的编译错误和运行异常先翻它,比在网上搜二手答案快得多。希望帮到你。
本文还有配套的精品资源,点击获取