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 地址PLCCPU 1214C DC/DC/DC6ES7 214-1AG40-0XB0PROFINET IO 控制器192.168.0.200触摸屏KTP700 BasicPROFINET IO 设备192.168.0.201编程电脑装 TIA Portal V13 与 WinCC Advanced工程师站192.168.0.10 同网段操作路径是新建 Portal 项目 → 项目视图 → 添加新设备 → 控制器里选 S7-1200 对应的 CPU 订货号 → 再添加新设备 → HMI 里选 KTP700 → 打开「设备和网络」视图用鼠标从 PLC 的绿色 PROFINET 接口拖到 HMI 的接口上两个设备就连起来了。接着分别点开两个设备的属性改 IPPLC 改 192.168.0.200HMI 改 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.0Start_BtnBool启动按钮I0.1Auto_SwitchBool手动/自动切换开关低电平自动I0.2Man_NSBool手动南北放行I0.3Man_EWBool手动东西放行Q0.0NS_RedBool南北红灯Q0.1NS_YellowBool南北黄灯Q0.2NS_GreenBool南北绿灯Q0.3EW_RedBool东西红灯Q0.4EW_YellowBool东西黄灯Q0.5EW_GreenBool东西绿灯Q0.6、Q0.7ReserveBool预留八段管实验里作 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」把下面这些成员一次性建全变量名数据类型初值说明RunBoolFALSE系统运行标志AutoBoolTRUE自动模式标志StateInt0相位步号 0~3Green_sInt30绿灯时长单位秒HMI 可改Yellow_sInt3黄灯时长单位秒HMI 可改NS_Green、NS_Yellow、NS_RedBoolFALSE南北灯位中间变量EW_Green、EW_Yellow、EW_RedBoolFALSE东西灯位中间变量StepTimeTimeT#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 连到 CPUHMI 变量表里的「连接」列必须显示为 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 进制0a b c d e f0x3F0xC01b c0x060xF92a b d e g0x5B0xA43a b c d g0x4F0xB04b c f g0x660x995a c d f g0x6D0x926a c d e f g0x7D0x827a b c0x070xF88a b c d e f g0x7F0x80这张表就是八段 LED 编码表的核心把它做成 DB 里的数组后面查表只要一个索引。数组类型写Array[0..8] of Byte初值按上表逐项填进去不用在程序里写九个 IF 分支。3.2 1s 节拍与 0 到 8 循环TON、计数、查表三件套节拍源用一个接通延时定时器 TONPT 设 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 端填 %QB0CPU 会把这一个字节一次性刷到 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.7CPU 1214C 的 Q 区足够。每个 FC 内部各自有一个 1 秒节拍还是一起共用一个节拍取决于你想让三位同时刷新还是轮流刷新同时刷新更简单共用一个节拍源即可。4. 交通灯控制实现DB 存状态、FC 写时序、HMI 管配时交通灯实验比八段管复杂的地方在于它有四个相位和两种模式程序一旦写成「一堆定时器串起来」就会失控。我的做法是把它当成一个状态机状态存 DB时长存 DBFC 里只写「当前状态该亮什么灯、该计多久、计满了跳哪一步」。4.1 四相位状态机四个灯组状态的轮转相位划分按最朴素的十字路口逻辑来南北绿加东西红南北黄加东西红南北红加东西绿南北红加东西黄然后回到第一步。相位 State南北方向东西方向持续时长0绿灯 Q0.2红灯 Q0.3Green_s 秒1黄灯 Q0.1红灯 Q0.3Yellow_s 秒2红灯 Q0.0绿灯 Q0.5Green_s 秒3红灯 Q0.0黄灯 Q0.4Yellow_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调用三次各自分配一个输出字节」就够了不用现场写代码。从那以后我每次交课程设计都会在最后附一张这样的验收表把每条预期结果写死演示时照着走。带过的几届学生里凡是认真填过这张表的答辩时被追问细节都不慌。希望帮到你。本文还有配套的精品资源点击获取