欧姆龙ST功能块编程:CX-Programmer 6.1配置与编译下载排错
简介:《欧姆龙ST编程中文手册》面向欧姆龙PLC编程初学者、电气自动化技术人员及需要查阅CX-Programmer 6.1功能块用法的一线工程师,重点解决ST语言入门、功能块组织与编程规范等问题。压缩包内共1个PDF文件,大小约2.26MB,内容围绕功能块介绍、变量定义、技术规格、库文件转换、应用程序及版本升级信息展开,并单列安全注意事项与应用注意事项,便于读者在编程前建立规范意识。该手册已有7329人学习下载,具备较好的参考基础。读者可从中系统了解ST语言的基本语法、功能块类型与限制、编程环境设置方法,也能借助目录结构快速定位章节,把它作为日常查阅和入门练习的中文资料。
1. 翻到 W447-CN5-02 第 xviii 页的人,多半是被一个编译错误逼过去的
真正让人熬夜的,往往不是程序逻辑,而是变量表里那行DataBuf[0..9] of INT和指令要求的 16 个字对不上——编译报警告,下载也下载,机器一转起来却把后面 6 个字连着一块儿读写了。手里这本《欧姆龙ST编程中文手册》(W447-CN5-02,2006 年 6 月修订),正文其实只有三章,剩下的分量全压在数据类型、ST 语言规格和外部变量这三个附录上,因为功能块出问题,十次有八次出在这三块。这套环境的组合很固定:CX-Programmer 6.1(安装介质型号 WS02-CXPC1-E-V61S)加一台支持功能块的 CS1-H、CJ1-H、CJ1M 或 CP1H CPU 单元,再配一条串口或 USB 电缆。装不顺的后果也很固定:功能块编译不过、下载下去全变非法指令、在线改完断一次电全白做。下面按我实际装机的顺序走一遍,新手照着能通,熟手可以只看版本边界和踩坑那两章。
2. 版本核对:CX-Programmer 6.1 与 CS1-H/CJ1-H/CJ1M/CP1H 的功能块支持边界
装这套东西最容易犯的错,是把它当成普通上位机软件——下个安装包,一路下一步,连上电缆就开干。CX-Programmer 6.1 是 2006 年前后的产物,它能不能用功能块,一半取决于软件版本,另一半取决于对面那台 CPU 的固件版本,两边任何一边不够,程序都下不去或者下去跑不了。开工前把手册编号、软件型号、CPU 型号这三样东西逐一核对一遍,比装完再返工省事得多。
2.1 三张表先分清:手册编号、软件型号、CPU 单元
很多人拿到一堆 PDF 就懵,不知道哪本管什么。W447 这本只管「功能块」相关内容:功能块定义、实例、变量、ST 语言、外部变量。梯形图的基础操作、工程管理、在线监控这些,在 CX-Programmer 操作手册(样本编号 W437)里;指令本身怎么用查 W340 指令参考手册;PLC 的安装接线和 I/O 存储器分配查 W339(CS 系列)或 W393(CJ 系列);编程任务与文件存储器查 W394。我在现场见过有人抱着 W447 找「怎么新建工程」,翻了半小时没找到,就是没分清这几本的分工。
| 类别 | 编号 / 型号 | 管什么 |
|---|---|---|
| 功能块手册 | W447-CN5-02(2006-06 修订) | 功能块定义、实例、变量、ST、外部变量 |
| 软件型号 | WS02-CXPC1-E-V61S | CX-Programmer 6.1 安装介质标识 |
| 配套手册 | W437 | CX-Programmer 一般操作(非功能块部分) |
| 配套手册 | W394 / W340 | 编程方法与指令参考 |
| 配套手册 | W339 / W393 | CS 系列 / CJ 系列 PLC 操作与接线 |
核对软件型号这一步别省。安装介质的标签上写的是WS02-CXPC1-E-V61S,装完在帮助菜单里看到的版本号应该是 6.1。如果手上是 6.0 或更早的介质,功能块相关的行为会有出入——手册前言里就明确提到,某些输入变量长度不一致的情况,6.0 版在编译时不会报错,只给一条警告,6.1 版开始收紧了规则。版本差一点点,编译结果就不一样,这类问题查起来最耗时间。
2.2 功能块支持边界:哪些 CPU 能装、哪些只能上传
这是全篇最该背下来的一张表。功能块并不是所有 CS/CJ 系列 CPU 都认,判断依据是 CPU 单元自身的版本,不是软件版本。
| CPU 单元 | 支持功能块的最低条件 | 说明 |
|---|---|---|
| CS1G/H-CPU□□H、CJ1G/H-CPU□□H、CJ1M-CPU□□ | CPU 单元 3.0 版以上 | 早期 2.0 版及以下不支持 |
| CP1H-X□□□□-□、CP1H-XA□□□□-□、CP1H-Y□□□□-□ | 手册覆盖范围内 | 与 6.1 版配套使用 |
| NSJ、FQM1 | 手册覆盖范围内 | 按对应章节规格执行 |
| 2.0 版及以下的 CS/CJ 系列 | 不支持 | 下载后所有实例被视为非法指令 |
最后一行是硬性限制,也是最容易被忽略的一条:把一个含功能块的用户程序下载到 2.0 版或以下的 CS/CJ CPU 单元,程序不会报「不支持」,而是所有实例统统变成非法指令,既不能编辑也不能执行。现场表现就是「下载成功了,但设备一点反应没有」,第一次遇到能让人怀疑人生。所以接线之前先读出 CPU 单元型号和版本,对不上就别往下走了。
还有一条同样容易忽略的事项:包含功能块的程序,上传和下载的方法与普通程序完全一致,但含功能块的任务无法下载到任务单元——上传是可以的。也就是说,如果你把程序组织成任务结构,功能块那一部分别指望整包下发,得换个组织方式。这条写在手册的应用注意事项里,不看就会在下载环节反复试。
2.3 电脑侧先关三个开关:串口、省电、后台常驻
软件再对,电脑不给力照样连不上。这一步不需要什么技术含量,但漏掉任何一条,后面所有的通信故障排查都是在浪费时间。
第一是串口本身。不少笔记本的 RS-232C 端口默认被分配到调制解调器或红外线设备上,你在 CX-Programmer 里选 COM1,实际通到的根本不是那个物理口。正确做法是先打开设备管理器确认端口号:
# 列出本机所有串口设备,确认 PLC 电缆实际落在哪个 COM 口 Get-CimInstance Win32_SerialPort | Select-Object DeviceID, Description # 打开设备管理器图形界面复核(端口 → COM 和 LPT) devmgmt.mscDeviceID就是待会儿在通信设置里要填的 COM 号,Description用来判断这个口是主板原生串口还是 USB 转串口线。如果Get-CimInstance一条都列不出来,说明驱动没装好,先解决驱动,别急着开软件。
第二是省电设置。部分笔记本的省电策略提供的电压达不到 RS-232C 端口的额定值,表现为刚连上就掉线、监控窗口刷着刷着就断开。Windows 电源计划里有对应的设置项,BIOS 里可能还有一层,两处都要关掉。命令行快速处理:
# 关闭交流供电下的待机与休眠,避免在线监控中途断链 powercfg /change standby-timeout-ac 0 powercfg /change hibernate-timeout-ac 0standby-timeout-ac对应接通电源时的待机超时,单位是分钟,设为 0 表示永不。用电池供电调试的话,把-ac换成-dc再来一遍。另外设备管理器里串口属性的「电源管理」页,把「允许计算机关闭此设备以节约电源」的勾去掉。
第三是后台常驻程序。手册的应用注意事项里列得很直白:启动前退出所有与 CX-Programmer 不直接相关的程序,尤其是屏幕保护、病毒检查程序、邮件客户端、调度程序这类会定期启动或自动启动的软件;网络上其它计算机的共享硬盘和打印机也建议先断开。这些东西平时不显山不露水,一旦在下载程序的当口抢一次串口,轻则通信超时,重则下进去半个程序,CPU 停在中间状态。
提示:这三条做完再装软件。装完再回头改环境,很容易把「环境问题」误判成「软件问题」。
3. 安装 CX-Programmer 6.1:从安装包到串口第一次连接
真正开始安装之前,先花五分钟把电脑侧的情况摸清楚。这套软件年纪不小,对运行环境比较敏感,装之前多看一眼,比装完再折腾兼容模式划算。装完还要配通信参数,参数对不上,软件装得再干净也是白搭——CX-Programmer 里那个「在线工作」按钮点下去毫无反应,九成是参数问题。
3.1 安装前的一次性环境检查
我一般先跑一遍检查脚本,把系统版本、磁盘余量、串口情况一次性看清楚,避免装到一半才发现空间不够或者盘符不对。
# 1) 操作系统版本与架构:老版本软件优先 32 位环境 Get-CimInstance Win32_OperatingSystem | Select-Object Caption, Version, OSArchitecture # 2) 目标安装盘剩余空间(建议预留 2 GB 以上) Get-PSDrive C | Select-Object @{n='FreeGB';e={[math]::Round($_.Free/1GB,1)}} # 3) 串口枚举,记下 PLC 电缆对应的 COM 号 Get-CimInstance Win32_SerialPort | Select-Object DeviceID, Description # 4) 关闭休眠产生的休眠文件占用(可选,能腾出与内存等量的空间) powercfg /hibernate off第一段拿的是系统标题和架构,OSArchitecture显示 32 位还是 64 位很关键:CX-Programmer 6.1 在 32 位系统上最省心,64 位系统上常见做法是装进虚拟机或者用兼容模式跑,具体看手上介质。第二段的Free是字节数,除以 1GB 再保留一位小数,人眼好读;磁盘紧张的时候别硬装,安装过程解压临时文件也要占地方。第三段同上一章,重点是把 COM 号抄下来。第四段powercfg /hibernate off会删掉休眠文件并关闭休眠功能,台式机上没什么影响,笔记本上如果还要用休眠就跳过这一步。
环境检查的另一半是系统干净度:装之前把杀毒软件的实时防护临时关掉,装完再开。老安装程序写注册表和系统目录的动作比较多,实时防护拦一下,装出来的东西就是缺胳膊少腿,而且不报错,等到连接 PLC 时才发现某个组件没注册。
3.2 安装过程的组件选择与目录约定
安装介质跑起来之后,会依次装 CX-Server 通信中间件和 CX-Programmer 主体。CX-Server 是上位机和 PLC 之间的通信层,装的时候别跳过去,跳过了软件能打开但连不上任何设备。安装路径我固定用不带空格、不带中文的目录,比如D:\OMRON\CX-Programmer,老软件处理长路径和中文路径时出问题的概率不低。
装完做一次版本确认,确认装上去的确实是 6.1:
# 读取主程序文件版本信息,确认安装结果 Get-ChildItem "D:\OMRON\CX-Programmer" -Filter "CX-Programmer.exe" -Recurse -ErrorAction SilentlyContinue | Select-Object FullName, @{n='FileVersion';e={$_.VersionInfo.FileVersion}}FileVersion里应该能看到 6.1 的字样。如果显示 6.0 或者干脆没有输出版本号,说明装的不是这个介质,或者装的时候组件没选全,卸载重来比在错误版本上排查要快。
工程目录我按固定结构放,几年下来省了很多事:
D:/PLC/<项目代号>/ ├── prg/ # 主程序与任务 ├── fb/ # 功能块定义(单个导出,便于复用) ├── lib/ # 功能块库文件(.cxf 之类) └── doc/ # W447-CN5-02 手册、接线图、通信参数记录fb和lib分开是有原因的:功能块定义可以转换成库文件反复引用,库文件一旦被多个工程共用,就不要再随手改,改动要回到定义源头,重新导出覆盖。手册我固定放doc目录,和工程放一起,查数据类型和外部变量规则的时候不用满硬盘找。
3.3 串口通信参数配置与 PLC 属性核对
参数配置的核心只有一句话:软件侧和 CPU 侧必须是同一套参数。软件侧在工程树里选中 PLC 图标,右键打开属性,网络类型选 Toolbus(串口直连的常用选项),驱动器页签里填 COM 号和波特率;CPU 侧的外围端口参数在 PLC 系统设定区里,两边的波特率、数据位、停止位、校验必须完全一致。
| 参数 | 常见取值 | 说明 |
|---|---|---|
| 网络类型 | Toolbus | 串口直连;USB 连接时改选 USB |
| 端口 | COM1 / COM3 … | 与设备管理器里的DeviceID一致 |
| 波特率 | 9600(可 19200、38400) | 两侧必须相同,长线优先低速率 |
| 数据位 | 7 | 与 CPU 外围端口设定对齐 |
| 停止位 | 2 | 同上 |
| 校验 | 偶校验(Even) | 同上 |
| 单元号 | 0 | 单机直连默认值 |
上表是串口直连时最常见的组合,实际以你手上那台 CPU 的系统设定为准,两边对齐就行。改完参数别急着点「在线工作」,先做一次连接测试,看能不能读出 CPU 型号和运行模式;读不出来就说明参数还是不对,或者电缆接错了口。CP1H 这类带 USB 口的机型,用 USB 线连接时网络类型直接选 USB,不要既配串口又插 USB,两套通道同时存在容易选错。
还有一条容易忘:在线状态下不要直接拔电缆或关 PLC 电源。手册的应用注意事项写得很清楚,在线时断开连接可能让计算机侧出问题。真要断,先在软件里切到离线(离线工作),再动手。
4. 功能块与 ST 落地:变量表、AT 设定和数组长度怎么写才编译得过
功能块这套东西,最反直觉的地方在于「代码不是第一步」。在 CX-Programmer 里新建一个功能块定义之后,先要填的是变量表——变量名、数据类型、方向、初始值、AT 设定,这张表填错,ST 代码写得再漂亮也编译不过;更坏的情况是编译过了,运行时越界读写,把别的变量搅乱。这一章把变量表、AT 设定、数组长度三件事讲透,剩下的就是照抄。
4.1 新建功能块定义:变量表比代码先写
新建路径是工程树 → 功能块 → 新建功能块定义,选编程语言的时候可以选梯形图,也可以选结构化文本(ST)。选 ST 之后,先在变量表里把输入变量、输出变量、内部变量分好,再写代码体。
以一段电机启停加运行计时为例,变量表这么填:
| 变量名 | 数据类型 | 方向 | 说明 |
|---|---|---|---|
| Start | BOOL | 输入 | 启动信号 |
| Stop | BOOL | 输入 | 停止信号 |
| SetTime | INT | 输入 | 设定运行时间(单位 0.1 s) |
| Run | BOOL | 输出 | 运行输出 |
| Done | BOOL | 输出 | 计时到达 |
| ErrCode | INT | 输出 | 故障码,0 为正常 |
| Timer | INT | 内部 | 运行计时,不对外暴露 |
对应的 ST 代码体:
(* FB_MotorRun:电机启停与运行计时 *) (* 输入变量在算法执行前一次性批量传入,代码里不要给输入变量赋值 *) IF Start AND NOT Stop THEN Run := TRUE; Timer := Timer + 1; (* 内部变量累加,单位 0.1 s *) ELSIF Stop THEN Run := FALSE; Timer := 0; (* 停止优先,计时清零 *) END_IF; IF Timer >= SetTime THEN Done := TRUE; (* 计时到达置位 *) ELSE Done := FALSE; END_IF; ErrCode := 0; (* 预留故障码,正常恒为 0 *):=是赋值,END_IF带下划线,注释用(* *),这几处和 C 语言的习惯不一样,第一次写容易手滑。Timer声明成内部变量而不是输入输出变量,是因为它只服务于这个功能块的算法,对外没有意义,暴露出去反而会在实例调用时占地方。SetTime是输入变量,代码里绝对不能给它赋值——功能块的输入变量是在算法执行之前、数值被成批地经过输入参数传进来的,不是每条指令执行时实时刷新,写进去也不会按你预期的时序生效。要在算法执行过程中传递数值,必须换用内部变量或者外部变量,这条规则的原始出处就在手册的应用注意事项里。
写完编译一次,编译通过再导出成库文件放进lib目录。库文件的好处是同一个功能块定义可以被多个工程引用,改一处、重新导出、其余工程更新引用,比复制粘贴可靠得多。
4.2 AT 设定与数组长度:编译期能拦下的和拦不下的
这是全篇最容易翻车的一节,也是那本手册存在感最强的部分。规则本身很短:指令操作数要指定多个字当中的第一个字或最后一个字时,必须用带 AT 设定的变量(或外部变量)来指定,或者让变量的数据长度和指令要处理的数据长度完全一致。
区别在于编译期能不能拦住你:
| 场景 | 写法 | 编译结果 |
|---|---|---|
| 指令长度固定,数组元素数不一致 | 数组 10 个元素,指令处理 16 个字 | 编译报错,直接拦下 |
| 指令长度由常量指定 | 指令里写常量 16 | 编译报错,直接拦下 |
| 指令长度由变量指定,数组偏小 | 指令长度来自变量,数组只有 10 个元素 | 只报警告,编译能过 |
最后一行最危险。编译只给一条警告,程序能下载能运行,但指令会对超出元素数的那部分继续执行读写——数组只有 10 个元素、指令要 16 个字,多出来的 6 个字照样被读写。如果这 6 个字恰好被别的指令用着(包括内部变量分配占用的),就会发生完全无法解释的误动作。手册在这里用了一整段警告,不是小题大做。
(* 反例:数组只声明了 10 个元素,循环却跑到 15 *) (* DataBuf 定义为 ARRAY[0..9] OF INT *) FOR i := 0 TO 15 DO DataBuf[i] := 0; (* i 大于 9 时越界写入,编译不一定报错 *) END_FOR;FOR ... TO ... DO ... END_FOR是 ST 的循环结构,i需要单独声明为 INT 内部变量。上面这段的问题不在语法,在于循环上界和数组声明对不上。正确做法有两个:把数组声明改成ARRAY[0..15] OF INT让长度匹配,或者把循环上界改成 9。我一般选前者,因为功能块里数组长度往往是由外部工艺决定的,改循环不如改声明来得清楚。
反过来,如果指令操作数里的长度是变量而不是常量,编译器就彻底管不了了。手册里的说法是:长度由变量指定时,即使数组变量长度和那个变量指定的长度不同,编译也不报错,只显示一条警告;而如果数组元素数小于指定长度,指令就会对超出部分执行读写。所以只要看到这类警告,别当它不存在,一行行核对数组声明。
至于「多个字中的第一个或最后一个」,还有个细节:如果指令操作数指定的那个地址没法写成内部数组变量(比如不允许写数组元素的形式),就必须用带 AT 设定的内部变量。AT 设定说白了就是把变量钉死在一个具体地址上,让功能块内部的算法能直接按地址访问,这在处理连续字数据时几乎是唯一选择。
4.3 外部变量与全局符号:什么时候宁可用内部变量
外部变量是功能块和外部世界打交道的另一条通道,用错了会出现「数据不稳定」这种最难查的现象。手册里列了几条硬规则,我按现场用得上的顺序整理:
| 场景 | 该用什么 | 原因 |
|---|---|---|
| 基本 I/O 单元、特殊 I/O 单元、CPU 总线单元的地址 | 带 AT 设定的内部变量 | 这些地址无法注册为全局符号,也不能指定为外部变量 |
| 辅助区中未预注册到外部变量的位 | 内部变量 | 注册成全局符号后数据可能不稳定 |
| 跨结点地址(如 SEND/RECV 的首字) | 内部变量 | 远程结点的地址不适合做外部变量 |
| 指令操作数的首字/末字,且无法写成数组元素 | 带 AT 设定的内部变量 | 无法用输入变量代替 |
第一条踩的人最多。有人看到 I/O 单元的地址就顺手在全局符号表里注册一个名字,再勾上「外部变量」,编译直接过不去;更麻烦的是有些情况编译能过,运行起来那个值一会儿对一会儿不对。原因就是这些地址本身不允许注册为全局符号,变量的存放位置不由你控制,当然不稳定。
(* 正确姿势:用带 AT 设定的内部变量承接连续字数据 *) (* 内部变量 RecvBuf 设定为 ARRAY[0..15] OF INT,AT 设定指向接收区首地址 *) FOR i := 0 TO 15 DO RecvBuf[i] := 0; (* 长度和数组声明一致,编译无警告 *) END_FOR; IF RecvBuf[0] = 1 THEN Run := TRUE; (* 首字作为握手标志 *) END_IF;这段代码的关键不在逻辑,在注释里那行 AT 设定——变量的地址是固定的,长度和循环上界是匹配的,两个条件同时满足,编译和运行都不会出问题。RecvBuf[0]当握手标志用是现场常见做法,首字放状态、后续字放数据,功能块内部按索引取用。
5. 排错:ST 编译与下载环节最容易翻车的 5 个坑
下面这五条,每一条我都在现场或实验室里真实遇到过,而且第一次遇到时都判断错了方向。按「现象 → 原因 → 解决」记下来,遇到的时候直接对号入座,比从日志开始推要快得多。把它们按发生阶段分成三组:编译阶段两个、下载阶段两个、运行阶段一个。
5.1 编译阶段:两个看着像玄学的报错
坑一:编译报「操作数长度不一致」,但数组明明够大。
现象:功能块编译不通过,提示操作数处理的数据长度和变量长度不匹配,可打开变量表一看,数组声明的元素数并不小。
原因:变量声明和数据长度这两个数字确实对得上,但方向反了——数组元素数比指令要处理的长度大,而指令的长度是常量。手册的规则是「要由指令操作数处理的长度为固定时,数组元素的数量必须与要由指令处理的元素数量相同」,注意是相同,不是大于等于。大也不行,编译器一样报错。
解决:把数组声明改成和指令长度严格相等;如果这个数组还要被别的指令用,就拆成两个变量,各自匹配各自的长度。别图省事用一个大数组包打天下。
坑二:输入参数里填了个 20,运行起来值变成了 0020。
现象:功能块调用时,某个输入参数直接敲了数字 20,编译没问题,在线监控发现实际生效的值是十六进制的 0020,也就是十进制 32,逻辑全乱。
原因:纯数值被当成了 CIO 区地址。手册写得很明确:输入变量数据不是布尔格式、参数中只输入数值时,CIO 区地址里的实际值会被略过,所以输入数值前必须加上&、#或者+、-前缀。不加前缀,软件就按地址解释。
解决:十进制常数加&(写作&20),十六进制加#,带符号的加减前缀按需使用。这条规则在梯形图里也一样,只是 ST 里写常数的地方更多,更容易忘。
5.2 下载阶段:CPU 版本和任务类型的两条硬性限制
坑三:下载成功,但所有功能块实例都成了非法指令。
现象:下载过程一路绿灯,没有任何报错,切到在线监控发现程序根本不执行,功能块实例全部显示为非法指令,也不能编辑。
原因:目标 CPU 单元是 2.0 版或以下的 CS/CJ 系列,不支持功能块。软件侧不会拦你,因为工程本身没问题,是目标机不认。
解决:先读 CPU 型号和单元版本,确认在 3.0 版以上,对不上就换 CPU,或者把功能块拆成普通梯形图程序。这一条没有绕过办法。判断顺序建议固定下来:接线之前先读版本,不要等下载完再回头查。
坑四:别的程序都能下载,唯独带功能块的任务下不去。
现象:同一个工程里,普通任务下载正常,含功能块的那个任务怎么都下发不了。
原因:含功能块的任务无法下载到任务单元,这是手册明确写的限制——上传可以,下载不行。
解决:调整程序组织方式,把功能块部分放到可下载的结构里,任务单元里不要塞功能块。这条在项目初期设计程序结构的时候就要考虑,后期改结构成本很高。
5.3 运行阶段:备份灯亮着的时候别碰电源
坑五:在线改了一下午,断一次电全没了。
现象:在线编辑改了不少逻辑,运行也正常,收工断电,第二天上电发现改动全部回退到修改前。
原因:执行在线编辑之后,CS1-H、CJ1-H、CJ1M 和 CP1H 的 CPU 单元会把用户程序和参数区数据备份到内置闪存里,备份进行中 CPU 单元前面的 BKUP 指示灯会亮。灯亮着的时候切断电源,数据就不会被备份。
解决:等 BKUP 灯灭再断电。要确认备份状态,可以在 CX-Programmer 里打开 PLC 属性,把「显示 PLC 存储器备份状态」勾上,再从查看菜单里调出 PLC 存储器备份状态窗口盯着。这一条属于「后悔药也没有」的类型,因为丢的是你几个小时的在线修改,PLC 里连痕迹都不留。
另外提一句相关的:在线编辑会延长周期时间,手册要求先确认周期时间延长不会造成不良影响再动手,否则可能出现输入信号读不到的情况。改之前看一眼当前周期时间和扫描时间余量,心里有个数。
6. 验证跑通:一份能照着走的上机自检清单
装完不算完,能跑通才算。我的习惯是拿一个最小功能块做端到端验证,五步走完,任何一步卡住都能定位到具体环节。
第一步,离线编译。打开fb目录里那个最小功能块,全编译一次,确认零错误、零警告。有警告就先清掉,尤其是数组长度相关的,别带着警告往下走。
第二步,连接测试。在线工作,能读出 CPU 型号、单元版本、运行模式,说明通信参数和电缆都没问题。
第三步,下载与备份。把含功能块的程序下载下去,观察 BKUP 灯亮起再熄灭,确认备份完成。
第四步,强制验证。切到监控模式,手动置位启动信号,看输出位是否跟随、计时是否累加、计时到达后 Done 是否置位;再置位停止信号,确认计时清零。手册在这里专门提醒过:在梯形图窗口或观察窗口监控之前要先确认安全,因为误按快捷键执行强制设置/强制复位,连在输出单元上的设备可能直接动作。所以这一步一定要在输出回路断开或者设备处于安全状态时做。
第五步,断电复电。整机断电,等十秒再上电,确认改动还在、功能块实例正常、没有非法指令。
| 步骤 | 观察点 | 不通过时先查 |
|---|---|---|
| 离线编译 | 错误数 0、警告数 0 | 数组长度、常数前缀 |
| 连接测试 | 能读出 CPU 型号与版本 | COM 号、波特率、校验 |
| 下载与备份 | BKUP 灯亮后熄灭 | 任务结构、CPU 是否支持功能块 |
| 强制验证 | 输出跟随、计时正确 | 变量方向、输入变量是否被赋值 |
| 断电复电 | 改动保留、实例正常 | 备份是否完成 |
验证用的功能块就用第 4 章那段电机启停逻辑,把SetTime设成 20(记得写成&20),启动后大约两秒Done应该置位。这个块小到能一眼看完,又同时覆盖了输入、输出、内部变量、计时累加和比较判断,出问题的地方一眼能看出来。
从那以后我每次装完这套环境,都强制走一遍这五步,尤其是断电复电那一步——它验证的不是软件,是闪存备份到底有没有真的写进去。手册就放在doc目录里,和工程躺在一起,查数据类型、查外部变量规则、查数组长度限制的时候随手翻开,比在网上翻帖子快得多。这份 W447-CN5-02 中文手册的价值不在通读,在于它就是这套环境的黑匣子,出问题时知道翻到哪一页。希望帮到你。
本文还有配套的精品资源,点击获取