S7-1200 PLC课程设计:八段数码管与交通灯HMI实战
简介:《PLC实验 八段LED编程实验 交通红绿灯》面向电气工程及其自动化专业学生与PLC初学者,基于TIA Portal V13、S7-1200可编程控制器和KTP700触摸屏,提供八段LED显示与智能交通灯控制两项实验的完整指导材料。压缩包仅含1个docx文档,约1.62MB,按实验目的、仪器材料、操作步骤、结果测试与反思总结组织,便于按流程查阅。文档具体覆盖Portal项目创建、PLC变量表设置、梯形图编程、接通延时定时器与MOVE指令应用、八段LED段位码显示和0至8循环控制,也说明HMI画面中矩形组合数码管、静态文本、控制按钮、变量关联及动画设计的方法。交通灯部分给出自动与手动模式切换、南北/东西方向灯序控制、触摸屏设定通行和黄灯时间、仿真验证等思路。思考题涉及直接控制各段通断、三个八段LED显示学号及定时器编号冲突排查,有助于理解逻辑并完成课程设计。已有449人学习。
1. 从一块八段数码管说起:这套 PLC 实验方案要解决什么问题
很多电气专业的同学第一次打开 TIA Portal V13,面对空白的项目视图是懵的:设备组态、PLC 变量表、FC 块、HMI 画面、仿真下载,一套走下来不知道该先动哪一步。这套 PLC 实验方案围绕两个具体任务,把整条流程逐步走通:一是用 S7-1200 可编程控制器驱动八段 LED 循环显示 0 到 8,二是做一个带手动自动切换的十字路口智能交通灯。前者训练基本指令、八段 LED 编码表、定时器节拍和 MOVE 输出,后者训练 DB 加 FC 的程序结构、HMI 程序的变量关联和在线配时。它适合电气工程及其自动化专业的 PLC 课程设计、实验报告,也适合要给实训箱配一套完整例程的实验室。下面按总体设计、程序实现、避坑排查、验收答辩的顺序拆开讲,每一段都能对着 TIA Portal 直接敲。
2. 总体架构设计:S7-1200 加 KTP700 的两级结构与 I/O 规划
两个实验看起来是两件事,硬件骨架却是同一套:一台 CPU 跑逻辑,一块触摸屏做输入输出,中间一根 PROFINET 网线。把骨架先定死,后面写程序才不会一边写一边改地址。
2.1 硬件组态:CPU 1214C 与 KTP700 怎么连在一条 PROFINET 上
实验箱上的配置基本固定,先在纸上把角色分清楚,再去软件里点。
| 设备 | 型号/订货号 | 在项目里的角色 | IP 地址 |
|---|---|---|---|
| PLC | CPU 1214C DC/DC/DC,6ES7 214-1AG40-0XB0 | PROFINET IO 控制器 | 192.168.0.200 |
| 触摸屏 | KTP700 Basic | PROFINET IO 设备 | 192.168.0.201 |
| 编程电脑 | 装 TIA Portal V13 与 WinCC Advanced | 工程师站 | 192.168.0.10 同网段 |
操作路径是:新建 Portal 项目 → 项目视图 → 添加新设备 → 控制器里选 S7-1200 对应的 CPU 订货号 → 再添加新设备 → HMI 里选 KTP700 → 打开「设备和网络」视图,用鼠标从 PLC 的绿色 PROFINET 接口拖到 HMI 的接口上,两个设备就连起来了。接着分别点开两个设备的属性改 IP,PLC 改 192.168.0.200,HMI 改 192.168.0.201,子网掩码统一 255.255.255.0。
提示:IP 不要图省事用 192.168.1.x,很多实训室的局域网网关就占着这个网段,下载时会报「无法建立连接」,排查半天以为是网线坏了。
机型选择这一步容易踩空:CPU 1214C 有 AC/DC/RLY 和 DC/DC/DC 两种,实验箱上是后者,输出是晶体管型,选错了编译能过但下载会提示固件不匹配。设备加完先编译一次,确认没有红色报错再往下走,别等程序写完才发现组态是错的。
2.2 I/O 分配表:把每个点位在变量表里固定下来
两个实验共用同一组物理点,如果不先把变量表钉死,写到第三个程序段就会开始怀疑人生。我一般会在 PLC 变量表里按「输入在前、输出在后、预留垫底」的顺序排:
| 绝对地址 | 符号名 | 数据类型 | 用途 |
|---|---|---|---|
| I0.0 | Start_Btn | Bool | 启动按钮 |
| I0.1 | Auto_Switch | Bool | 手动/自动切换开关,低电平自动 |
| I0.2 | Man_NS | Bool | 手动南北放行 |
| I0.3 | Man_EW | Bool | 手动东西放行 |
| Q0.0 | NS_Red | Bool | 南北红灯 |
| Q0.1 | NS_Yellow | Bool | 南北黄灯 |
| Q0.2 | NS_Green | Bool | 南北绿灯 |
| Q0.3 | EW_Red | Bool | 东西红灯 |
| Q0.4 | EW_Yellow | Bool | 东西黄灯 |
| Q0.5 | EW_Green | Bool | 东西绿灯 |
| Q0.6、Q0.7 | Reserve | Bool | 预留,八段管实验里作 dp 位和高位 |
这里的 Q0.4 在原始实验步骤里没有单独点出来,按东西方向与南北方向对称的原则,黄灯落到 Q0.4 最顺,接线时对照实训箱的端子排确认一下即可。原始记录里手动部分把南北红灯写成了 Q0.1,跟自动部分的 Q0.0 对不上,这属于整理稿时留下来的笔误,实际以变量表为准,别照着错的那份接线。
八段 LED 实验占用的是整字节:Q0.0 到 Q0.7 分别对应数码管的 a、b、c、d、e、f、g、dp 八段,输出时按字节整体写,也就是 %QB0。两个实验复用同一组 Q 点,做完一个要换另一个时,记得先把前一个程序块在 OB1 里的调用去掉,否则两段逻辑抢同一个输出字节,现象会非常诡异。
2.3 DB 块分工:交通灯_DB 里到底放什么
程序里凡是要被 HMI 读写的量,一律进数据块,不要散落在 M 区。新建一个全局 DB,命名「交通灯_DB」,把下面这些成员一次性建全:
| 变量名 | 数据类型 | 初值 | 说明 |
|---|---|---|---|
| Run | Bool | FALSE | 系统运行标志 |
| Auto | Bool | TRUE | 自动模式标志 |
| State | Int | 0 | 相位步号 0~3 |
| Green_s | Int | 30 | 绿灯时长,单位秒,HMI 可改 |
| Yellow_s | Int | 3 | 黄灯时长,单位秒,HMI 可改 |
| NS_Green、NS_Yellow、NS_Red | Bool | FALSE | 南北灯位中间变量 |
| EW_Green、EW_Yellow、EW_Red | Bool | FALSE | 东西灯位中间变量 |
| StepTime | Time | T#0S | 当前相位已计时长,仅监视用 |
灯位为什么先放 DB 再映射到 Q 区,而不是直接写 Q?因为 HMI 的动画要读这些位,直接读 Q 区在部分固件版本下刷新不及时,走 DB 中间变量最稳,输出段统一做一次赋值,逻辑和界面就解耦了。
2.4 程序骨架:启动、停止和首扫描复位
不管哪个实验,OB1 里最先写的永远是这三件事:启动自锁、停止断开、上电复位。这段骨架我用得最多,直接抄过去改符号名就行。
// FC10「系统骨架」,在 OB1 的 Network 1 调用 // 启动用常开按钮,停止用常闭按钮(接线为常闭时,程序里用常开触点) "System_Run" := ("Start_Btn" OR "System_Run") AND "Stop_Btn"; // FirstScan 来自 CPU 属性里勾选的系统存储器字节,默认 %M0.0 IF "FirstScan" THEN "System_Run" := FALSE; // 上电不自动运行,防止设备带电启动 "QB0" := 16#00; // 八段管输出清零,避免上电瞬间乱亮 "Traffic_DB".State := 0; // 交通灯状态机回到初始步 "Traffic_DB".Auto := TRUE; // 默认进自动模式 END_IF;第一行的自锁是梯形图里最经典的起保停:启动按钮并上运行标志自身,再串停止按钮。第二段用首次扫描位做一次性初始化,FirstScan只在上电后的第一个扫描周期为真,后面一直为假,所以不会每个周期都把运行标志清掉。停止按钮的常开常闭要和实际接线对上:如果实物接的是常闭按钮,程序里就写常开触点,按下时断开,这条线反了会出现「按一下启动,手一松就停」的现象。
2.5 HMI 与 PLC 的变量交界
触摸屏只做两件事:读 PLC 的状态显示,写 PLC 的参数。所以 HMI 变量表里出现的每一个名字,背后都应该指向「交通灯_DB」或者 I/Q 区,不要用 HMI 内部变量去做本该由 PLC 算的逻辑。KTP700 通过 PROFINET 连到 CPU,HMI 变量表里的「连接」列必须显示为 PLC_1,这一列空着就是没连上,画面做得再漂亮也是死的。
3. 八段 LED 程序实现:段码表、1s 节拍与 MOVE 输出
八段管实验的价值不在「点亮」,而在「用最少的程序段把循环、查表、输出三件事串起来」。程序结构就三层:一个 1 秒的节拍源,一个 0 到 8 的循环计数器,一次按数字查表并输出。
3.1 八段 LED 编码表:共阴共阳两套码,先确认硬件再写程序
八段管的八段是 a、b、c、d、e、f、g 加一个小数点 dp,按 a 在最低位、dp 在最高位的顺序组成一个字节。共阴极是给 1 点亮,共阳极是给 0 点亮,两套码互为按位取反。实验箱上常见的是共阴,但不同批次的实训箱不一样,写程序前用万用表二极管档量一下公共端方向,或者干脆单点亮一段试出来。
| 数字 | 点亮的段 | 共阴段码(16 进制) | 共阳段码(16 进制) |
|---|---|---|---|
| 0 | a b c d e f | 0x3F | 0xC0 |
| 1 | b c | 0x06 | 0xF9 |
| 2 | a b d e g | 0x5B | 0xA4 |
| 3 | a b c d g | 0x4F | 0xB0 |
| 4 | b c f g | 0x66 | 0x99 |
| 5 | a c d f g | 0x6D | 0x92 |
| 6 | a c d e f g | 0x7D | 0x82 |
| 7 | a b c | 0x07 | 0xF8 |
| 8 | a b c d e f g | 0x7F | 0x80 |
这张表就是八段 LED 编码表的核心,把它做成 DB 里的数组,后面查表只要一个索引。数组类型写Array[0..8] of Byte,初值按上表逐项填进去,不用在程序里写九个 IF 分支。
3.2 1s 节拍与 0 到 8 循环:TON、计数、查表三件套
节拍源用一个接通延时定时器 TON,PT 设 1 秒,把定时器自己的输出取反后送回输入,就变成了一个每秒钟产生一个扫描周期脉冲的自复位振荡器。
// FC2「八段管控制」:1s 节拍 → 0~8 循环 → 查表输出 "T_1s"(IN := NOT "T_1s".Q, // 自复位:计时到就把 IN 拉低,下个周期重新开始 PT := T#1S); // 必须是 Time 类型,写成 1000 会报类型不匹配 IF "T_1s".Q THEN // Q 在计时到达的那个扫描周期为真 "Digit" := "Digit" + 1; // Digit 为 Int 型,放在全局 DB 或 M 区 IF "Digit" > 8 THEN "Digit" := 0; // 8 之后回 0,形成 0~8 共 9 个数的循环 END_IF; END_IF; // 查表并整体输出到 Q 区首字节 "QB0" := "Seg_Table"["Digit"];"T_1s"是调用 TON 时自动生成的背景数据块,名字可以改,但一个定时器只能对应一个背景块。NOT "T_1s".Q的写法让定时器到达 PT 后立刻复位并重新计时,周期稳定在 1 秒,误差不超过一个扫描周期,对实验演示完全够用。最后一行在梯形图里就是一个 MOVE 指令框:IN 端填 DB 数组元素,OUT 端填 %QB0,CPU 会把这一个字节一次性刷到 Q0.0 到 Q0.7 八个端子上,正好对应数码管八段。用 MOVE 而不是逐位赋值,好处是不会有中间态闪烁,切换数字时干净利落。
Digit这个变量建议放全局 DB,别用 FC 的临时变量。临时变量在块执行完后不保持,下一个扫描周期读到的就是随机值,现象是数码管跳着显示乱码,这类问题查起来很费时间,记住「需要跨周期保持的量一律进 DB」就能避开。
3.3 不用段码表的位控写法
实验指导书后面的思考题问得挺好:不查 16 进制段码,还能怎么显示。答案是把每一段当成一个独立的线圈,按数字去拼。
// 位控版本:不用编码表,逐段判断该不该亮(以显示 2 为例) "Seg_a" := ("Digit" = 0) OR ("Digit" = 2) OR ("Digit" = 3) OR ("Digit" = 5) OR ("Digit" = 6) OR ("Digit" = 7) OR ("Digit" = 8) OR ("Digit" = 9); "Seg_b" := ("Digit" = 0) OR ("Digit" = 1) OR ("Digit" = 2) OR ("Digit" = 3) OR ("Digit" = 4) OR ("Digit" = 7) OR ("Digit" = 8) OR ("Digit" = 9); // c、d、e、f、g 同理,按编码表反推每个数字点亮哪几段这种写法的逻辑是「或运算拼段」:一个数字只要出现在某一段的点亮集合里,那一段就是 1。它的好处是不依赖编码表,改显示内容只要改集合;坏处是程序段长、可读性差,九个数码就要写七组或逻辑。实际项目里我一般用编码表,只有在需要现场改显示字形、又不想重新算码的时候才会退回位控写法。两种方式都写一遍,答辩时被问到「为什么用查表」,能答出「查表把字形数据和逻辑分离,改字形只改数据块」就很有说服力。
3.4 HMI 八段管画面:八个矩形拼图形加位动画
触摸屏上的八段管不是现成控件,得自己拼:从右侧工具箱拖八个矩形出来,摆成「日」字形的八段布局,a 在上横、b 在右上竖、c 在右下竖、d 在下横、e 在左下竖、f 在左上竖、g 在中横、dp 单独一个小方块放右下角。八个矩形统一填充灰色、无边框,间距调到视觉上像一根完整的数码管。
动画的做法是给每个矩形绑一个布尔量:选中矩形 → 属性 → 动画 → 外观 → 变量选「交通灯_DB」里对应的段位 → 类型选「范围」→ 值为 0 时前景灰,值为 1 时前景亮红或亮绿。八个矩形各绑一位,PLC 里 %QB0 输出什么,屏上就显示什么,两边永远是同一份数据。
另一种更省事的做法是把 %QB0 拆成八个内部布尔变量,在 HMI 里做位提取。这种做法要写八行脚本,不如直接在 PLC 侧把段位映射成 DB 里的八个 Bool 干净。我一般倾向后者:屏上只负责显示,逻辑全在 PLC。
3.5 三个八段管显示学号的扩展思路
课后作业要求用三个八段管显示学号后三位,这个扩展其实是在考「同一个功能怎么复用」。做法是把单个八段管的控制逻辑封装成一个 FC,输入参数是数字和输出字节起始地址,调用三次分别对应百位、十位、个位。三个管占用三个连续字节,第一个管 Q0.0 到 Q0.7,第二个 Q1.0 到 Q1.7,第三个 Q2.0 到 Q2.7,CPU 1214C 的 Q 区足够。每个 FC 内部各自有一个 1 秒节拍还是一起共用一个节拍,取决于你想让三位同时刷新还是轮流刷新,同时刷新更简单,共用一个节拍源即可。
4. 交通灯控制实现:DB 存状态、FC 写时序、HMI 管配时
交通灯实验比八段管复杂的地方在于它有四个相位和两种模式,程序一旦写成「一堆定时器串起来」就会失控。我的做法是把它当成一个状态机:状态存 DB,时长存 DB,FC 里只写「当前状态该亮什么灯、该计多久、计满了跳哪一步」。
4.1 四相位状态机:四个灯组状态的轮转
相位划分按最朴素的十字路口逻辑来:南北绿加东西红,南北黄加东西红,南北红加东西绿,南北红加东西黄,然后回到第一步。
| 相位 State | 南北方向 | 东西方向 | 持续时长 |
|---|---|---|---|
| 0 | 绿灯 Q0.2 | 红灯 Q0.3 | Green_s 秒 |
| 1 | 黄灯 Q0.1 | 红灯 Q0.3 | Yellow_s 秒 |
| 2 | 红灯 Q0.0 | 绿灯 Q0.5 | Green_s 秒 |
| 3 | 红灯 Q0.0 | 黄灯 Q0.4 | Yellow_s 秒 |
表里的时长不是写死的常量,而是从 DB 里读 Int 型的秒数,现场在触摸屏上改了立刻生效。这也是把参数放进 DB 而不是写死在程序里的直接收益:改配时不用重新下载程序。
4.2 相位计时:一个定时器走完四个相位
新手最容易写成四个定时器各管一段,结果相位切换时定时器之间互相打架。正确的做法是只用一个 TON,相位变了就换 PT 并重新计时。
// FC1「交通灯」核心段:先定时长,再统一计时,计满跳相位 CASE "Traffic_DB".State OF 0, 2: "PT_Time" := T#1S * "Traffic_DB".Green_s; // 绿灯相位 1, 3: "PT_Time" := T#1S * "Traffic_DB".Yellow_s; // 黄灯相位 END_CASE; // 自复位计时:Q 为真时 IN 拉低一个周期,下个相位从 0 开始计 "Phase_T"(IN := "Traffic_DB".Run AND NOT "Phase_T".Q, PT := "PT_Time"); IF "Phase_T".Q THEN "Traffic_DB".State := ("Traffic_DB".State + 1) MOD 4; // 0→1→2→3→0 END_IF;T#1S * "Green_s"这一句是 Time 类型乘以 Int 型,结果是 Time 型,TIA 里支持这种写法,比手工写T#30S灵活得多。MOD 4让步号在 0 到 3 之间循环,不用写四个 IF 判断。注意"Phase_T".Q触发跳步的那一个扫描周期里,IN 已经变成 FALSE,定时器自动复位,下一个相位从头计时,整个过程不需要额外的复位指令。
4.3 手自动切换的互锁:一个开关决定两条链路
I0.1 是手动自动切换开关,低电平自动、高电平手动,这个极性要在变量注释里写清楚,否则过两周自己都记不住。两条链路的灯位输出必须互斥,切换瞬间还要强制复位。
// 自动模式:状态机算出来的灯位送输出 IF "Traffic_DB".Auto THEN "NS_Green" := ("Traffic_DB".State = 0); "NS_Yellow" := ("Traffic_DB".State = 1); "NS_Red" := ("Traffic_DB".State = 2) OR ("Traffic_DB".State = 3); "EW_Green" := ("Traffic_DB".State = 2); "EW_Yellow" := ("Traffic_DB".State = 3); "EW_Red" := ("Traffic_DB".State = 0) OR ("Traffic_DB".State = 1); ELSE // 手动模式:两个按钮互锁,按下哪个方向就放行哪个方向 "NS_Green" := "Man_NS" AND NOT "Man_EW"; "EW_Green" := "Man_EW" AND NOT "Man_NS"; "NS_Red" := "Man_EW"; "EW_Red" := "Man_NS"; "NS_Yellow" := FALSE; "EW_Yellow" := FALSE; END_IF; // 模式切换沿检测:切过去的一瞬间全部复位,避免两个方向同时绿 "Auto_Edge"(CLK := "Traffic_DB".Auto); IF "Auto_Edge".Q THEN "Traffic_DB".State := 0; "QB0" := 16#00; // 八个灯位一次性清零 "Phase_T"(IN := FALSE, PT := T#1S); // 定时器强制复位 END_IF;手动分支里的两个互锁不能省:"Man_NS" AND NOT "Man_EW"保证两个按钮同时按下时谁都不亮,而不是两个方向一起绿。切换沿检测用 R_TRIG 实例,只在模式真正变化的那一个扫描周期动作,"QB0" := 16#00一次性把所有灯灭掉,比逐个赋值干净。
4.4 HMI 画面:灯位动画加配时输入域
画面左边画路口:南北和东西各三个圆形指示灯,按红黄绿竖排。每个圆的动画绑定 DB 里对应的灯位布尔量,0 时填充暗灰,1 时填充对应的红、黄、绿。这种「位绑颜色」的动画比绑可见性稳,灯灭的时候还能看到灯罩轮廓,界面更像真实路口。
右边放两个 IO 域,一个绑 Green_s,一个绑 Yellow_s,模式选「输入/输出」,格式选十进制,这样操作员既能看见当前值也能直接改。IO 域的过程变量必须是 Int 型,不要直接绑 Time 型,Time 在屏上显示成一串毫秒数,看着很别扭。改完值不需要按确认,HMI 每个扫描周期都会把值写回 DB,下一个相位开始时自动生效。
再放一个启动按钮、一个停止按钮和一个手动自动切换开关,都绑到 PLC 变量表里对应的 I 区地址或者 DB 里的运行标志。按钮的事件里不要写脚本,直接绑变量最省事。
4.5 仿真验证:PLCSIM 加 HMI 仿真加强制表
程序写完先别急着下载到实物,走一遍仿真:点 PLC 工具栏的「开始仿真」,弹出 PLCSIM 窗口后下载程序;再点 HMI 的「开始仿真」,两块屏会同时起来。仿真里改配时、按启动、切手动,观察 Q 区的灯位变化,整个过程和实物一致。
强制表是排查利器:把"Traffic_DB".State、"Phase_T".Q、Green_s这几个关键量加进监视表,运行中能直接看到步号什么时候跳、定时器什么时候到。现象和预期对不上时,先看 State 卡在哪个值,再看Phase_T的 PT 是不是比实际配时短,九成的逻辑问题都能这样定位。
5. 避坑与排查:五个亲手翻过的坑
这部分是血泪经验,每一条都是当时调了半天才想明白的。
5.1 定时器编号重复:复制粘贴带出来的同一个背景块
现象:程序里有好几段各有一个定时器,下载后只有一段在计时,其他段的延时完全不起作用,或者所有段同时到时间。
原因:写程序时图快,直接复制粘贴已经写好的程序段,粘贴出来的 TON 沿用了原来那个背景数据块。TIA 不会因为地址变了就自动新建实例,几个网络共用同一个背景块,后执行的覆盖先执行的,逻辑全乱。
解决:把可疑的定时器全部删掉,从右侧「基本指令 → 定时器操作」重新拖一个进来,拖的时候软件会自动分配新的背景块编号。写完编译一次,在「程序信息」里看有没有背景块重复的警告。更彻底的做法是用多重背景,把定时器实例放进数组里统一管理,但这属于进阶用法,课程设计阶段老老实实一个个拖最稳。
5.2 段码位序反了:显示的不是数字而是乱码
现象:按共阴码 0x3F 输出,数码管上亮的是几段不相干的笔画,或者本该显示 0 的时候亮了半圈。
原因:a 到 g 对应 Q0.0 到 Q0.6 的接线顺序和编码表的假设不一致,或者实验箱上的数码管实际是共阳,程序按共阴给了码,整张表全部取反才对。
解决:写一段单点测试程序,让 QB0 依次等于 0x01、0x02、0x04、0x08、0x10、0x20、0x40、0x80,每两秒换一个,记录每一段亮的是哪根笔画,重新排出真实位序,再改编码表。共阴共阳的判断更简单:给全 0 看亮不亮,亮就是共阳,不亮就是共阴。
5.3 HMI 变量选错:两个同名变量看不出区别
现象:画面上灯位动画不跟着 PLC 走,或者按了按钮没反应,检查程序逻辑一点问题没有。
原因:DB 里建了同名成员,HMI 变量表里有两条看起来一样的记录,一条指向 PLC 的连接,一条是 HMI 内部变量,选的时候点错了。还有一种情况是 KTP700 的连接列显示空白,等于根本没组态到 PLC。
解决:命名统一加前缀,PLC 侧加DB_,HMI 内部变量加HMI_,从名字上就分得开。选完变量后看一眼变量表里的「连接」列是不是 PLC_1,不是就重选。实在找不到,用交叉引用查这个变量在哪几个块里被用过,能很快定位到底是哪一条在起作用。
5.4 手自动切换不复位:切过去两个方向同时绿
现象:自动运行中拨到手动,或者手动拨回自动,路口会出现短暂的两个方向绿灯同时点亮,实物上是绝对不允许的。
原因:模式切换只是改变了 IF 分支的走向,但没有清掉上一个模式留下的灯位状态和相位步号。上一轮自动跑到状态 0,切手动时南北绿还没清,手动分支又给了东西绿,两个绿灯就叠上了。
解决:加模式切换的沿检测,在切换的那一个扫描周期里把 QB0 清零、State 归零、定时器复位。这一条代码不长,但少了它整个系统就不安全,我建议把它写进标准骨架里,所有带模式切换的项目都挂上。
5.5 仿真连不上:IP 不在同一网段或下载顺序错了
现象:点开始仿真,PLCSIM 窗口起来了,但 HMI 仿真报错连不上 PLC,或者编译提示 IP 地址冲突。
原因:一是 PLC 和 HMI 的 IP 不在同一网段,比如 PLC 是 192.168.0.200、HMI 是 192.168.1.201;二是先启动了 HMI 仿真再启动 PLC 仿真,连接建立时对方还没起来;三是电脑上装了其他虚拟机软件,把 PLCSIM 要用的端口占了。
解决:两个 IP 统一到 192.168.0.x,子网掩码一致;启动顺序固定为先 PLC 后 HMI;仿真前把虚拟机网络适配器停掉。下载的时候用工具栏的「开始仿真」按钮,不要单独点下载,仿真模式下的下载入口和实物下载不是同一个。
6. 验收与答辩:用一张表把两份实验讲成一个完整方案
答辩最怕的是讲成流水账:先讲怎么建项目,再讲怎么拖指令,讲完老师问一句「你这个方案解决了什么问题」就卡住了。我后来固定用一个顺序:先说需求,再说架构,再说关键实现,最后现场演示验收点。需求就一句话——用一台 PLC 同时覆盖循环显示和路口时序两类典型控制;架构就是 S7-1200 加 KTP700 的两级结构,PLC 管逻辑,屏管人机交互;关键实现挑两个讲,八段管的编码表加节拍器,交通灯的四相位状态机加手自动互锁;最后按验收表逐项演示。
验收表我一般提前打印出来,演示时按行打勾,评委看得清楚,自己也不会漏项:
| 序号 | 验收项 | 操作方法 | 预期结果 | 判定 |
|---|---|---|---|---|
| 1 | 八段管循环显示 | 按 I0.0 启动 | 每 1 秒依次显示 0~8 后回到 0 | 通过 |
| 2 | 停止功能 | 按停止按钮 | 当前数字停住,循环中断 | 通过 |
| 3 | 触摸屏显示同步 | 观察 HMI 八段管 | 与实物数码管数字一致 | 通过 |
| 4 | 交通灯自动运行 | 自动模式下启动 | 南北绿→南北黄→东西绿→东西黄循环 | 通过 |
| 5 | 配时在线修改 | HMI 上把绿灯改 10 秒 | 下一个相位起按新时长运行 | 通过 |
| 6 | 手动放行 | 切手动,按南北放行 | 仅南北绿,东西红,互锁有效 | 通过 |
| 7 | 模式切换复位 | 自动与手动反复切换 | 切换瞬间全灭,无两向同绿 | 通过 |
这张表的价值在于它把「程序能跑」变成了「可验证的交付」。演示到第 7 项的时候,评委通常会点头,因为他知道这一条是真正做过项目的人才会想到的。
答辩提问里出现频率最高的是「为什么用 MOVE 而不是逐位赋值」和「手自动切换为什么必须复位」,这两个问题在前面都埋好了答案。还有一类是扩展题,比如「三个管显示学号怎么改」,答「把单管逻辑封装成带参数的 FC,调用三次,各自分配一个输出字节」就够了,不用现场写代码。
从那以后我每次交课程设计,都会在最后附一张这样的验收表,把每条预期结果写死,演示时照着走。带过的几届学生里,凡是认真填过这张表的,答辩时被追问细节都不慌。希望帮到你。
本文还有配套的精品资源,点击获取