简介:围绕欧姆龙PLC与触摸屏联机仿真的图文教程,面向工控入门者、自动化专业学生及需要自学调试的电气工程师,解决缺少PLC与PT硬件时如何验证程序与画面的问题。内容以CX-One集成套件为线索,串联CX-Programmer编程、CX-Simulator仿真与CX-Designer组态,讲清继电器状态与组态数据库数据的关联机制、PLC-PT集成仿真流程,以及CS1G、CJ1M、CP1H、CP1E等可仿真机型的选择与替换技巧,并配灯光闪烁小例程便于对照练习。压缩包共1个doc文件,约2.21MB,按仿真原理、软件安装、单独仿真与联机调试顺序编排,图文并茂,便于检索。已有351人学习。读者可在笔记本电脑上完成梯形图与触摸屏画面的同步调试,节省硬件投入,适合边看边练、查漏补缺的自学者。
1. 现场没到货,怎样在 PC 上把梯形图和画面一起跑通
设备还在装配车间,触摸屏画面已经画完,梯形图也编好了,但谁也不敢拍胸脯说按钮按下去 PLC 那边一定有反应。这时候能救场的就是欧姆龙体系里的联机仿真:CX-Programmer 配 CX-Simulator 虚拟出一台 PLC,CX-Designer 自带画面模拟器把 NS 屏也虚拟一份,两块屏幕都在同一台笔记本上跑。难的地方从来不是"会不会点",而是两个软件各跑各的——画面模拟器仍然按真实 PT 的逻辑去访问站号、节点号和通信驱动,虚拟 PLC 的节点号如果和组态里写的不是一回事,画面就是死的。这套流程适合三类人:设备未到、想提前把 I/O 地址表跑通的调试工程师;刚接触 CX-Programmer、想先看梯形图动起来再上机的入门者;以及要把画面动作和时序逻辑对齐后再交给现场的人。它真正考验的是通信三要素——机型支不支持仿真、驱动选没选对、地址对不对齐。
2. CX-Programmer 侧:机型筛选、编译检查与 CX-Simulator 启动条件
在 CX-Designer 里画了半天的按钮,连不上虚拟 PLC,八成问题出在 CX-Programmer 这一侧:挑了一个根本不支持仿真的机型。先把这件事解决,后面所有步骤才有意义。
2.1 哪些欧姆龙机型能在 CX-Simulator 里跑起来
CX-Simulator 覆盖的机型是有限的,写工程之前先确认,比写完再换机型省事得多。常见情况大致如下,具体以本机 CX-Simulator 新建工程时的机型下拉列表为准。
| 机型系列 | 仿真可用性 | 说明 |
|---|---|---|
| CS1 / CJ1 / CJ2 | 支持良好 | 联机仿真的主力机型,推荐 CJ2 系列做练习 |
| CP1H / CP1L | 视版本而定 | 部分 CX-One 版本的 CX-Simulator 可用,需实测 |
| CP1E / CP2E | 一般不支持 | 这类机型通常要接真实 PLC 才能在线 |
| CQM1 / C200H 等旧机型 | 不支持 | 指令系统老,仿真器不再覆盖 |
选型时还有一点容易被忽略:机型决定了可用指令集和地址区。CJ2 支持 CIO、W、H、D、T、C 全套,如果你在教学示例里用了TIMH(10ms 定时器)这类指令,却选了不支持它的机型,编译能过但仿真行为会对不上。我的习惯是练习工程统一用 CJ2M,等现场确认了真实型号再换回去。
2.2 编译与程序检查:仿真前的最后一道闸
CX-Programmer 里按下仿真按钮并不等于程序没问题。CX-Simulator 会把当前工程的编译结果下载进虚拟 PLC,如果有未定义符号、地址越界、指令使用不当,表现是"仿真起不来"或"起来了但不动作",看起来像通信问题,实际上是程序问题。所以养成顺序:先编译,再走一遍程序检查。
下面这段是练习里最常用的启动保持加定时逻辑,用来验证画面按钮是否真的写进了 PLC 地址:
; CX-Programmer 助记符视图(IL)示例,用于仿真自检 LD 0.00 ; 画面上的启动按钮(CIO 0 区第 0 位) OR 100.00 ; 输出自保持 AND NOT 0.01 ; 停止按钮,常闭接法 OUT 100.00 ; 运行输出线圈 LD 100.00 TIM 0000 #100 ; 定时器 0,设定值 100(BCD),单位 0.1s,即 10 秒 LD T0000 OUT 100.01 ; 定时完成输出逻辑说明:LD 0.00把启动位作为逻辑起点,OR 100.00构成自保持回路,AND NOT 0.01串入停止条件(常闭点,因此画面上的停止按钮用常开触点即可)。定时器TIM 0000的设定值#100是 BCD 格式,100×0.1s=10 秒;如果写成&100则是二进制写法,两者在监视窗口看到的设定值显示方式不同,这是新手最容易踩的一个坑。
参数说明:0.00、0.01、100.00属于 CIO 区,可以按位访问;T0000是定时器当前值,T0000的完成标志是T0000(触点形式),编号范围与机型相关。写完这几行之后先按编译,再进程序检查,确保输出窗口没有未定义地址告警。
2.3 启动 CX-Simulator 并锁定虚拟节点号
CX-Programmer 工具栏上的仿真按钮(或菜单 PLC → 仿真 → 在线工作)会把工程下载到虚拟 PLC 并切成在线状态,此时可以监视、强制置位、看时序。真正需要手工配的是 CX-Simulator 的环境设置:
| 设置项 | 建议值 | 为什么重要 |
|---|---|---|
| 虚拟通信端口 | 指定一个空闲 COM 号 | 串口方式下,画面模拟器要连的就是它 |
| FINS 节点号 | 与画面工程里写的节点号一致 | 不一致会直接通信超时 |
| 虚拟以太网 IP | 使用本机回路地址 | 以太网仿真方式下用 |
| 单元号 / 单元地址 | 与组态里的单元号一致 | Host Link 下的寻址单位 |
这里的节点号是后面第 3 章反复要回来对齐的数字。很多人仿真失败,就是 CX-Simulator 里是默认节点,CX-Designer 里是随手填的节点,两边都对不上,报错却只说"通信错误"。
3. CX-Designer 侧:NS 机型选择、通信驱动与符号表导入
画面工程这边要做的事是三件:机型对得上、通信驱动选对环境、地址别手敲错。三件事按顺序做完,联机仿真基本就是点一下开始。
3.1 新建工程时的机型与 PT 型号必须一致
CX-Designer 新建工程要选 PT 型号,比如 NS8-TV00、NS10-TV00 这类。这里的型号决定分辨率和可用对象数量,但不影响通信本身。真正影响通信的是系统设置里的通信参数,它落在工程里,仿真和实机用的是同一份。也就是说,仿真里调好的参数,将来上实机时可以直接沿用——前提是驱动和物理端口对得上。
需要注意的一点:仿真阶段选"虚拟 PLC"驱动,实机阶段要换成串口或以太网驱动。工程里同时留两份设置不现实,我的做法是仿真期间在工程名后加_sim后缀另存一份,避免把仿真参数误烧进现场设备。
3.2 通信协议与参数:先把这张表抄下来
欧姆龙 PT 与 PLC 之间的通信方式主要有 Host Link、NT Link 和 FINS 以太网三类。参数不是随便填的,默认值不匹配是连不上的头号原因。
| 通信方式 | 波特率 | 数据位 | 校验 | 停止位 | 典型场景 |
|---|---|---|---|---|---|
| Host Link(C-mode) | 9600 | 7 | 偶 | 2 | 老设备、单点连接 |
| Host Link(高速) | 38400 / 115200 | 7 | 偶 | 2 | 机型支持时可用 |
| NT Link 1:1 | 115200 / 38400 | 8 | 无 | 1 | NS 配 CJ/CS 最常见 |
| NT Link 1:N | 115200 | 8 | 无 | 1 | 一台 PLC 带多台 PT |
| FINS/UDP 以太网 | — | — | — | — | 需要节点号和 IP 规划 |
Host Link 的默认 9600-7-偶-2 是经典陷阱:CX-Programmer 那边按 8 位无校验连得好好的,PT 这边按 7 位偶校验发,帧直接丢掉,现象就是画面一直转圈。NT Link 则相反,走的是欧姆龙专有协议,一般用 8 位数据、无校验、1 位停止位,波特率越高刷新越快,但线缆质量和距离要跟得上。
仿真环境下的选择建议:优先用 FINS/UDP 走本机回路,其次是虚拟串口方式。以太网方式不需要关心线缆,参数出错的可能性也小。
3.3 把 CX-Programmer 的符号表导入 CX-Designer
地址手敲是联机仿真里最大的错误来源。可行的做法是先让 CX-Programmer 导出符号表 CSV,再在 CX-Designer 里批量导入,两边共用同一份地址清单。
步骤大致是:CX-Programmer 打开工程,从工具菜单里导出符号表为 CSV;CX-Designer 在标签或地址表编辑界面里选择导入,指定同一份 CSV;导入后逐条确认区号、数据类型和位/字属性。
3.3.1 导入后必须核对的三件事
第一件是区号。CX-Programmer 里写W10.00是工作区,导入后如果被当成 CIO 区,画面读到的就是完全不同的数据。第二件是数据类型,同一个 D 区字,PLC 侧可能按 16 位有符号数处理,画面侧可能按 BCD 显示,数值能差出一个数量级。第三件是位/字属性,D100.00这种按位访问的写法,如果画面对象被定义成整字读取,就只有最低位有效果。
CSV 走一遍以后,地址清单就成了一份可以版本管理的文件,后面做批量核对和修改都方便。
4. 联机仿真跑通:启动顺序、地址对表与报错定位
前面两章把两侧都准备好了,这一章是把它们接起来。顺序错了就会出现"PLC 在跑、画面不动"这种介于成功和失败之间的状态,很难判断。
4.1 先虚拟 PLC,再开画面模拟器
正确顺序是:CX-Programmer 打开工程 → 启动仿真并确认处于在线监视状态 → 确认 CX-Simulator 的节点号和通信端口 → 再启动 CX-Designer 的画面模拟器。反过来的话,画面模拟器启动时去找通信目标,找不到就会退回离线状态,之后再启动 CX-Simulator 也不会自动重连,只能把模拟器关掉重开。
验证是否真的连上了,有个很土但有效的办法:在 CX-Programmer 的监视窗口里手动给0.00强制置位,看画面上的指示灯是否跟着亮。亮,说明链路通了;不亮,问题在通信,不在程序。
4.2 用脚本自动核对画面地址和 PLC 符号表
手工核对几百个地址不现实,而且人会看漏。把两侧的 CSV 都拿出来,用一段脚本做差集比对,比肉眼靠谱得多。
import csv, re def load_addr(path, col): """从 CSV 读取地址列,归一到 (区号, 字, 位) 三元组集合""" result = {} with open(path, encoding="utf-8-sig", newline="") as f: for row in csv.DictReader(f): raw = (row.get(col) or "").strip().upper() if not raw: continue # 兼容 CIO0.01 / 0.01 / W10.00 / D100 这几种写法 m = re.match(r"^(CIO|W|H|D|T|C)?([0-9]+)(?:\.([0-9]{2}))?$", raw) if not m: print("无法识别:", raw) # 输出异常写法,人工复查 continue area = m.group(1) or "CIO" key = (area, int(m.group(2))) result.setdefault(key, set()) if m.group(3) is not None: result[key].add(int(m.group(3))) return result plc = load_addr("plc_symbols.csv", "地址") # CX-Programmer 导出 hmi = load_addr("hmi_tags.csv", "Address") # CX-Designer 地址表导出 for key in sorted(hmi): if key not in plc: print("仅画面有,PLC 无此字:", key) elif hmi[key] and not hmi[key].issubset(plc.get(key, set())): print("位号不匹配:", key, "画面", hmi[key], "PLC", plc.get(key))逻辑说明:脚本先把两个 CSV 里的地址全部规范化成(区号, 字, 位)结构,区号缺省时按 CIO 处理,这样0.01和CIO0.01会被认为是同一个地址。然后以画面地址为基准遍历,分别报出"PLC 里压根没有这个字"和"字存在但位号对不上"两类问题。
参数说明:col是 CSV 里存放地址的列名,两边导出时列名往往不同,必须分别指定;encoding="utf-8-sig"是为了兼容导出文件带 BOM 的情况;正则里的CIO|W|H|D|T|C覆盖了常用区,如果工程里用到 EM 扩展区(如E0_100),需要额外加一条分支。这套脚本在画面对象超过两三百个之后基本是必用的。
4.3 联机仿真常见报错与定位手法
| 现象 | 常见原因 | 处理方式 |
|---|---|---|
| 模拟器提示通信超时 | 画面工程仍选了实机串口驱动 | 切回虚拟 PLC / CX-Simulator 驱动 |
| 通信灯闪但按钮无反应 | 位号差一位,或地址写在别的区 | 用 4.2 的脚本跑一遍差集 |
| 数值显示明显偏大或偏小 | BCD 与二进制、有符号无符号不一致 | 两侧数据类型统一 |
| 仿真按钮点了没反应 | 机型不支持仿真,或程序未编译 | 换 CJ/CS 系列机型后重新编译 |
| 偶尔能通、偶尔断 | 虚拟串口号被其他程序占用 | 换一个空闲 COM 号,关掉串口调试工具 |
| 定时器不走 | 虚拟 PLC 处于编程模式而非运行模式 | 把 CX-Simulator 切到 RUN |
其中"虚拟 PLC 停在编程模式"这条最隐蔽,因为 CX-Programmer 显示在线,程序也在,就是所有输出都不动。切到运行模式之后,第 2 章那段启动保持逻辑应该立刻开始工作。
5. 从仿真切到实机:参数回改与梯形图时序自检
仿真跑通之后,剩下的价值在于把时序和异常分支也一起验证掉,这些在实机上很难反复试。
第一个技巧是利用 CX-Programmer 的数据跟踪功能。在联机仿真状态下开启数据跟踪,把启动位、输出位、定时器当前值一起加进采样列表,触发条件设为启动位上升沿,然后通过画面模拟器反复点按钮。采到的波形能直接看出自保持回路有没有建立、定时器是不是从 0 开始计时、停止按钮按下后输出是否在一个扫描周期内断开。这类时序问题在实机上靠肉眼看指示灯几乎发现不了。
第二个技巧是在画面里做一次全地址自检。用 CX-Designer 的宏或数值显示对象把关键 D 区数据批量搬到一组连续地址上,再用 CX-Programmer 监视这段区域,一次性确认画面写入的每个值都落到了预期位置。这比逐个按钮点一遍快得多,也更容易发现数据类型设置错误。
第三个是切换实机时的回改清单,这部分最容易漏:
| 项目 | 仿真时的值 | 上实机要改成 |
|---|---|---|
| 通信驱动 | 虚拟 PLC / CX-Simulator | NT Link 或 Host Link(按实物接线) |
| 串口参数 | 随虚拟端口 | NT Link 常用 115200、8、无、1 |
| 节点号 | 本机回路节点 | 与 PLC 实际 FINS 节点一致 |
| 单元号 | CX-Simulator 设定值 | PLC 串口单元号(CJ 内置口通常为 0) |
| 定时器设定 | 缩短用于快速验证 | 恢复工艺要求的实际值 |
把这张表放在工程目录里,现场接线前逐项打勾,能避免相当一部分"仿真好好的、上机就不动"的情况。
本文还有配套的精品资源,点击获取