
简介《PLC实验 八段LED编程实验 交通红绿灯》是一份面向电气工程及其自动化专业学生和PLC初学者的实验指导文档基于TIA Portal V13、S7-1200可编程控制器与KTP700触摸屏围绕梯形图编程、HMI画面设计和仿真验证展开。压缩包共1个docx文件约1.62MB以实验报告/指导书形式组织包含实验目的、仪器设备、操作步骤、程序设计与反思总结等模块。文档重点呈现八段LED显示0—8的循环控制、启动/停止与定时器、MOVE指令十六进制段位码应用以及触摸屏八段形状绘制、静态文本、按钮事件和PLC变量关联交通灯部分则覆盖自动/手动运行、DB与FC块组织、PROFINET连接及HMI动画颜色设置。已有449人学习。读者可据此理解完整实验流程掌握从PLC变量表配置到HMI交互和仿真验证的实现思路并参考定时器编号冲突等排错经验与课后扩展题完成类似课程设计或实验复现。1. 从一张 I/O 表看整门课八段LED与交通红绿灯共用一套骨架把这两个实验摊开摆在桌上会发现它们并不是两个孤立的知识点而是同一条流水线跑了两遍PLC 变量表 → 定时器推进 → MOVE 或线圈输出 → HMI 关联变量 → 仿真验证。八段LED 练的是「数据怎么送到输出端」交通红绿灯练的是「状态怎么按时间换位置」S7-1200 这块 CPU、TIA Portal V13 这套软件、KTP700 这块屏三样东西一点没换换的只是编码表和时间参数。所以复习时别按实验顺序死背按骨架背。骨架立住了八段管显示学号、路口加个左转灯、加个行人按钮都是往同一副架子上挂东西。这份笔记适合三类人正在做电气工程及其自动化课程设计、要交实验报告的考前想把梯形图、定时器和 HMI 关联一次串起来的以及仿真跑通了但实物不亮、正到处找原因的。2. 八段LED段位码、定时器与循环显示的四个关键点八段LED 这个实验表面上是在做「让数字动起来」实际考的是三件事能不能对齐段位编码表、时间基准、输出搬运。三者任何一环对不上现象都是「灯不亮」或者「显示乱码」而这两种现象在仿真里往往还看不出来。下面按「先定编码、再定节奏、最后定扩展」的顺序拆开。2.1 段位码表先分清共阴共阳编码才有意义八段管是七个发光段加一个小数点习惯上记作 a、b、c、d、e、f、g、dp。编程时最省事的做法是把它当成一个字节a 接 bit0b 接 bit1一路排到 g 接 bit6dp 接 bit7。这样「显示几」就退化成「送一个字节」MOVE 指令一条就够。共阴和共阳的区别必须放在最前面说清楚因为编码表拿反了现象不是不亮而是「数字缺笔画」很容易被误判成接线松动。共阴是公共端接地、段脚给 1 点亮所以有效位写 1共阳正好反过来公共端接正、段脚给 0 点亮编码要按位取反。数字点亮段共阴段码HEX共阳段码HEX0a b c d e f16#3F16#C01b c16#0616#F92a b d e g16#5B16#A43a b c d g16#4F16#B04b c f g16#6616#995a c d f g16#6D16#926a c d e f g16#7D16#827a b c16#0716#F88a b c d e f g16#7F16#809a b c d f g16#6F16#90这张表在工程里的正确存放位置是数据块而不是散在程序段的常量里。放在 DB 里可以当数组索引改一个数字只改一格散在程序段里后面想加个「显示 A~F」就得满地找。// 数据块 LED_DB 中的数组声明编辑器里直接填初值 // SegCode : Array[0..9] of Byte // 段位约定bit0a, bit1b, bit2c, bit3d, bit4e, bit5f, bit6g, bit7dp // 下面按共阴接法填段脚输出 1 点亮 // [0] : 16#3F; // a b c d e f // [1] : 16#06; // b c // [2] : 16#5B; // a b d e g // [3] : 16#4F; // a b c d g // [4] : 16#66; // b c f g // [5] : 16#6D; // a c d f g // [6] : 16#7D; // a c d e f g // [7] : 16#07; // a b c // [8] : 16#7F; // 全亮 // [9] : 16#6F; // a b c d f g这里的参数只有两个数组下标是「要显示的数字」元素值是「送到输出字节的段码」。真正的坑在于——HMI 上那个用矩形拼出来的八段形状和这张表一点关系都没有。仿真时 HMI 数字显示得再漂亮也只能证明「DB 里的数字在变」证明不了段码和接线是对的。这一点在后面第 5 章还会再提一次是整份笔记里最值钱的一句。2.2 定时器与 MOVE让数字一秒一步地走实验要求是「每个数字间隔 1 秒自动跳转0 到 8 循环段码用 MOVE 指令送到数码管」。拆开就是两个动作每隔 1 秒把步号加一然后把步号对应的段码搬到输出字节。TIA Portal V13 里做 1 秒节拍有两条路。一条是用接通延时定时器 TONPT 设为 T#1s输出 Q 接通时把步号加一同时把定时器自己的输入断开让它下个周期重新计时——这是自复位写法。另一条更省事启用 CPU 的时钟存储器字节取其中的 1Hz 位当前进脉冲连定时器都不用建。不管走哪条路有一件事必须做对脉冲要取上升沿。1Hz 位的高电平会持续整整半秒如果直接拿它当条件一个周期里步号会被加几十次现象是数字疯跑看起来像「程序跑飞了」实际只是少了个沿检测。// 每 1 s 前进一位0~8 循环段码送到输出字节 QB0 // Clock_1Hz 为 CPU 时钟存储器字节里的 1Hz 位 // LastClock 为自己的边沿记忆位必须是非保持型 IF Clock_1Hz AND NOT LastClock THEN // 只在上升沿成立一次 IF LED_DB.Step 8 THEN LED_DB.Step : 0; // 到 8 回到 0形成循环 ELSE LED_DB.Step : LED_DB.Step 1; // 否则步号加一 END_IF; END_IF; LastClock : Clock_1Hz; // 记住本周期的电平供下周期判断 QB0 : LED_DB.SegCode[LED_DB].Step]; // 查表取段码一次搬完八个段三段逻辑要分开看第一段是边沿检测负责「一秒只加一次」第二段是循环计数负责「到 8 回 0」第三段是搬运负责「数字变成段码」。参数上唯一能改的是上限 8改成 9 就能显示 0~9前提是段码表里补了第 10 个元素。MOVE 指令在梯形图里是一条框EN 接通就把 IN 的值复制到 OUT。它和上面最后一行是等价动作。写梯形图时最容易犯的错不是 MOVE 本身而是把 MOVE 放在定时器前面——那样送出去的是上一秒的段码显示会整体慢一拍。顺序永远是「先算步号再搬段码」。2.3 逐段控制的另一种写法七个常开触点也能干这活实验思考题问的是不用十六进制段位码还有什么办法让 a 到 g 显示对应数字标准答案是逐段控制——把七个段各当一个独立的输出点每个数字单独写一组触点谁该亮就把谁的线圈接通。数字需要接通的段梯形图里要处理的触点数0a b c d e f61b c22a b d e g53a b c d g57a b c38a b c d e f g7这种写法的好处是直观出问题一眼能看出是哪一段没点亮适合第一次上电验证接线坏处也明显一个数字就要并五六条支路显示到 9 的时候程序段已经长得没法看而且改一个笔画要动好几处。我的建议是把两种写法当成两个阶段用上电调试阶段先用逐段法确认 a 到 g 每一根线都接对了、共阴共阳没搞反确认完再切回段码表法把程序压回十几行。反过来做一旦显示不对你就分不清是编码错还是接线错只能干耗时间。2.4 扩展到三位数码管函数块复用与数位拆分课后作业要求用三个八段管显示学号后三位这个扩展考的是「同一段逻辑怎么复用三份」。如果直接把显示程序复制三遍改一次编码表就要改三处属于给自己埋雷。正确做法是写一个函数块把「输入一个 0~9 的数字、输出一个段码字节」封装起来主程序里调用三次每次传不同的数位。接口变量只需要一个输入 ValueInt和一个输出 SegCodeByte内部就是一句数组查表。// 把学号后三位拆成百位、十位、个位分别送给三个显示块 // StuNo 为 Int例如 394 #Hundreds : #StuNo / 100; // 394 / 100 3整数除法直接截断 #Tens : (#StuNo / 10) MOD 10; // 394 / 10 3939 MOD 10 9 #Units : #StuNo MOD 10; // 394 MOD 10 4参数说明只有一句SCL 里两个整数相除结果仍是整数小数部分直接丢掉所以不需要额外取整。剩下的工作是把三个段码分别送到三个输出字节或者送同一个字节再用位选信号轮流点亮——前者费输出点但程序简单后者省点但要写扫描切换实验箱上一般走前者。还有一个容易被忽略的点三个显示块如果写在同一个 FC 里连续调用各次的中间变量会互相覆盖。要么每次调用用不同的实参变量要么把 FC 换成 FB 让它自带背景数据。这个坑在只显示一位的时候完全不会暴露一扩展就现形。3. 交通红绿灯从顺序功能图落到梯形图的四条主线八段LED 练的是「数据搬运」交通灯练的是「状态推进」难度整体上了一个台阶。原因不在于指令更难而在于变量变多了、写同一组输出的地方变多了、还多了一条手动通路来和自动通路抢控制权。这一章按「先定灯序、再分通路、然后理数据结构、最后排程序段顺序」四步走。3.1 先画时序表六个灯、四个阶段别在程序里现想动手写梯形图之前先把灯的状态排成一张表。原文给出的自动流程是按下启动 I0.0在 I0.1 为低电平时进入自动状态先初始化把所有灯复位然后南北绿灯 Q0.2 与东西红灯 Q0.3 同时输出通行时间到南北绿灯灭、南北黄灯 Q0.1 亮黄灯时间到南北黄灯灭、南北红灯 Q0.0 亮、东西红灯灭、东西绿灯 Q0.5 亮之后按同样的节奏循环。按这个描述补全成四阶段表会发现原文只写清了前三个阶段第四个「东西黄灯」没有给出地址。这不是抄漏是这类实验报告里最常见的结构性缺口。阶段南北方向东西方向持续时间来源下一个阶段1绿灯 Q0.2红灯 Q0.3HMI 设定绿灯时间阶段 22黄灯 Q0.1红灯 Q0.3HMI 设定黄灯时间阶段 33红灯 Q0.0绿灯 Q0.5HMI 设定绿灯时间阶段 44红灯 Q0.0黄灯原文未给出地址HMI 设定黄灯时间回到阶段 1这张表的价值在于它把「程序里要写几个状态」这件事提前定死了。四个阶段就是四个 CASE 分支或者四段梯形图谁也别多谁也别少。如果边写边想最后一定会写成「南北绿灯亮的时候顺便把东西红灯也置位」这种耦合逻辑后面加个夜间黄闪就改不动了。表格里空着的那一格不要凑合填。做实物前必须自己在变量表里补一个地址按 Q0.0 到 Q0.5 的排布缺的那个位置大概率就是它并且给它起个能看懂的名字。空着不补仿真时看不出来一上实物就是「东西方向永远不黄」。3.2 自动与手动一个 I0.1 分出两条通路互锁和复位是命门原文的手动逻辑是I0.1 为高电平时进入手动状态I0.2 为高电平则南北通行南北绿灯 Q0.2 亮、东西红灯 Q0.3 亮I0.3 为高电平则东西通行东西绿灯 Q0.5 亮、南北红灯亮。切换手自动时复位所有灯输出。这里有三层设计要讲透。第一层是模式选择本身。用一位输入当开关低电平走自动、高电平走手动实现上就是把这个位取反后串进自动通路的能流里再把它本身串进手动通路的能流里。两条通路各走各的互不干扰这叫互锁。第二层是切换瞬间的复位。原文明确写了「手自动切换时复位所有灯输出」这句话不是客套是必需的。因为两条通路都在写同一组 Q如果切换时不复位会出现「自动那边的定时器还在跑、手动这边已经点了灯」的叠加状态输出全乱。可靠的做法是检测 I0.1 的上升沿和下降沿任意一个沿到来就把六个灯全部复位、把步号清零。第三层是手动通路内部的竞争。I0.2 和 I0.3 如果同时为高电平按原文的写法南北绿灯和东西绿灯会一起亮路口直接变成「全绿」。原文没提这个情况但做实物验证时一定会有人两个开关一起拨。稳妥的写法是给其中一个加优先权或者干脆互锁成「后按的无效」。// 自动状态机四阶段循环每阶段时长从 HMI 写入的 DB 变量取 // Traffic_DB.Step 存阶段号GreenTime / YellowTime 单位是秒 CASE Traffic_DB.Step OF 10: // 阶段 1南北绿、东西红 Q0.2 : TRUE; Q0.1 : FALSE; Q0.0 : FALSE; Q0.3 : TRUE; Q0.4 : FALSE; Q0.5 : FALSE; #PT : DINT_TO_TIME(INT_TO_DINT(Traffic_DB.GreenTime) * 1000); 20: // 阶段 2南北黄、东西红 Q0.2 : FALSE; Q0.1 : TRUE; Q0.0 : FALSE; Q0.3 : TRUE; Q0.4 : FALSE; Q0.5 : FALSE; #PT : DINT_TO_TIME(INT_TO_DINT(Traffic_DB.YellowTime) * 1000); 30: // 阶段 3南北红、东西绿 Q0.2 : FALSE; Q0.1 : FALSE; Q0.0 : TRUE; Q0.3 : FALSE; Q0.4 : FALSE; Q0.5 : TRUE; #PT : DINT_TO_TIME(INT_TO_DINT(Traffic_DB.GreenTime) * 1000); 40: // 阶段 4南北红、东西黄 Q0.2 : FALSE; Q0.1 : FALSE; Q0.0 : TRUE; Q0.3 : FALSE; Q0.4 : TRUE; Q0.5 : FALSE; #PT : DINT_TO_TIME(INT_TO_DINT(Traffic_DB.YellowTime) * 1000); END_CASE;这段代码的关键在「每个分支都把六个灯全写一遍」而不是只写「这个阶段该亮的那个」。全写的好处是不依赖上一个阶段残留的状态任何一个阶段单独跑起来结果都对代价是行数多。参数上PT 是当前阶段的定时器预设值单位毫秒所以要把 HMI 输入的整数秒乘 1000 再转成 Time 类型这一步漏了就会变成「绿灯亮 5 毫秒」。3.3 数据块与函数块变量别散在 M 区里原文的工程结构是新建一个 DB 块命名为「交通灯_DB」把需要的变量放进去再新建一个 FC 块命名为「交通灯」用梯形图实现各个程序段最后在 main 组织块里把 FC1 拖进程序段 1。这个结构值得单独说因为很多人图省事直接把时间参数写在 M 区地址里HMI 那边也连 M 区。当时能跑一旦要加第二个路口、或者要把地址挪一挪HMI 上所有关联全断只能一个个重连。变量名数据类型初值谁写谁读StepInt0FC 内部推进FC、HMI 状态显示GreenTimeInt30HMI 输入域FC 计算 PTYellowTimeInt3HMI 输入域FC 计算 PTAutoModeBoolTRUEFC由 I0.1 取反写入FC 两条通路NS_LampByte16#00FCHMI 指示灯动画EW_LampByte16#00FCHMI 指示灯动画前四个是控制参数后两个是给人看的状态汇总。把灯的状态另外打包成一个字节好处是 HMI 上只需要连一个变量颜色动画用位访问就能分出红黄绿不用一个灯一个变量地连六次。这里有个 TIA Portal V13 特有的注意点DB 默认是「优化的块访问」变量没有绝对地址只有符号名。HMI 连符号名没问题但如果后续要跟第三方设备按绝对地址通讯就得在 DB 属性里取消优化访问取消之后所有变量会重新分配地址之前记在纸上的偏移量全部作废。要么一开始就别优化要么就老老实实只认符号名。3.4 程序段顺序扫描周期决定了谁会赢原文列出的程序段顺序是启动复位、停止指令、自动南北通行、手动南北通行、启动按钮然后在 main 里把整个 FC1 拖进去。这个顺序里藏着一个梯形图最经典的坑同一个 Q 在两个程序段里被写。比如「启动复位」段里复位了所有灯「自动南北通行」段里又置位了南北绿灯两条逻辑在同一个扫描周期里先后执行后面的覆盖前面的最终结果取决于谁在后面。PLC 不会因为双线圈报错它只会安静地按顺序执行。稳妥的排法是把 FC 内部分成三层第一层处理模式判断和沿检测第二层处理自动与手动的状态推进第三层统一写输出。所有对 Q 的赋值只出现在第三层前面两层只改中间变量。这样无论加多少功能输出永远只有一处来源排查时看一个地方就够。停止指令的位置也值得留意。停止按钮的作用是「压住一切输出」它必须排在所有置位逻辑之后否则按下停止的瞬间后面的程序段又会把灯点回去。这不是理论问题是仿真时能直接看到的现象按停止灯闪一下就回来了。4. HMI 画面KTP700 上把图形、动画与输入域串起来HMI 这部分最容易被当成「画画」其实它承担的是三件正经事把 PLC 里的位翻译成颜色、把操作员输入的数字写回 PLC、把按钮动作变成一次置位或复位。这三件事任何一件接错变量现象都是「点了没反应」而且不报错。4.1 八段形状用矩形拼位置、尺寸与图层原文的做法是在画面里添加矩形组合成八段LED 的形状再加静态文本。KTP700 是 7 寸屏分辨率有限七个矩形的尺寸和间距要提前算。段方位建议做法关联对象a上横长宽比约 5:1 的横向矩形段码 bit0b右上竖长宽比约 1:5 的纵向矩形段码 bit1c右下竖同 b与 b 垂直对齐段码 bit2d下横同 a与 a 上下对称段码 bit3e左下竖同 b与 b 左右对称段码 bit4f左上竖同 b段码 bit5g中横同 a位于上下横正中段码 bit6两个实操细节。第一先把七个矩形全部画好、调好位置再统一设置动画不要画一个设一个否则改位置时动画会跟着乱。第二注意图层顺序段要放在背景框之上否则背景一刷新就把段盖住了表现为「灯永远不亮」而 PLC 那边其实是对的。原文还提到「添加静态文本」这里的文本不是装饰是给操作员看的标签——「南北通行时间」「黄灯时间」这类说明必须写在输入框旁边不然一个 30 一个 3 摆在那谁也分不清哪个是哪个。4.2 动画与变量关联颜色变化靠变量驱动颜色动画的配置路径是选中对象 → 外观 → 添加动画 → 关联变量 → 设置不同值对应的颜色。八段管每个段只关心「亮」和「灭」两种状态所以动画只需要两档变量为 1 时亮色为 0 时暗色。这里最容易出的错是变量类型不匹配。动画的触发变量如果是 Byte 或者 Int界面会让你选「值等于多少时变色」此时必须填具体的位值如果触发变量是 Bool直接选 0 和 1 就行。很多人图省事把整个段码字节连上去然后发现颜色永远不变——因为字节的值是 16#3F 这种永远不等于 1。我的习惯是给每个段单独建一个 Bool 中间变量在 PLC 里用位访问从段码字节拆出来HMI 那边就老老实实连 Bool。多建几个变量的成本比在 HMI 里跟数据类型较劲低得多。原文反思里提到「设置交通灯外观变量名称时可选表格里有两个类似的名称不知道选哪个」。这个问题很典型PLC 变量表和 DB 变量表里的名字可能高度相似下拉列表一展开两个都像。判断办法是看完整路径——带 DB 名前缀的才是 DB 里的变量只有名字没有前缀的是 PLC 变量表里的。选错了不会报错只会一直读到 0。4.3 I/O 域与时间参数数据类型选错输入框就是摆设原文的做法是添加 IO 文本域设置通行时间绿灯时间与延迟时间黄灯时间选中关联变量选择输入输出模式和显示格式。这里有一个必须先做的决策HMI 上输入的时间到底以什么类型存进 PLC。方案HMI 侧类型PLC 侧类型优点代价存整数秒IntInt用前乘 1000 转 Time输入框简单操作员输 30 就是 30 秒每次用都要转换一次存时间类型TimeTime直接喂给 TON不用转换输入格式受显示格式限制操作员容易输错实验场景下建议走第一种。操作员在触摸屏上输「30」意思就是 30 秒直观PLC 里在计算 PT 的时候做一次换算即可就是 3.2 节代码里那行 INT_TO_DINT 再乘 1000 再 DINT_TO_TIME。显示格式也要设。输入输出模式下格式决定了操作员看到的是「30」还是「30.000」小数点位数设错输进去的值会被放大或缩小一百倍。这个是纯界面问题但现象很像「程序算错了」排查时先看这一层。4.4 按钮事件按下置位、释放复位别用切换原文写的是「添加控制按钮并编辑按钮操作事件」。按钮在 HMI 上有三种常见行为按下置位、释放复位点动按下切换自锁按下置位保持。手动通路的 I0.2、I0.3 必须用点动也就是按下置位、释放复位。用切换的话操作员点一下松手这个位会一直保持为 1下次再切到手动模式灯直接就亮了现象是「什么都没按灯自己亮」。启动和停止按钮倒是可以用「按下置位」配一个单独的复位按钮但更稳妥的是启动用点动置位一个中间位、停止用点动复位同一个中间位把自锁逻辑放在 PLC 里做。这样 HMI 只负责「报告一次按下」状态记忆全在 PLC 侧换屏、换画面都不影响。5. 易错点定时器编号、地址冲突与仿真假象这一章是整份笔记里最該反复看的部分。下面五条每一条都能在实验报告里找到对应的翻车记录或者在原文的描述里找到痕迹。5.1 程序结构类复制粘贴留下的定时器编号易漏点复制一段带 TON 的程序段粘贴到别处两个定时器共用了同一个背景数据块。编译可能通过运行时两个定时器互相打断现象是「时间忽长忽短」。为什么漏TIA Portal 里复制程序段时指令框会连背景 DB 一起复制但有时会保留原来的编号更隐蔽的情况是连续复制三份三份都指向同一个 DB界面上看不出来只有打开每个定时器的属性才能看到。怎么补复制完立刻把定时器删掉从右侧指令库里重新拖一个进来让软件自动分配新背景每个 TON 的背景 DB 手动改名名字里带用途比如「TON_NS_Green」编译前用交叉引用查一遍这个 DB 被几处引用不是一处就说明复制出问题了。原文的反思里写的就是这个坑删掉重拖之后才恢复正常。5.2 程序结构类同一个 Q 被两处写易漏点启动复位段复位所有灯自动段又置位南北绿灯两个程序段都写了 Q0.2。梯形图不报错运行结果看扫描顺序。为什么漏梯形图的语法检查只管「这条指令用得对不对」不管「这个地址是不是被别人也写了」。加上程序段一多肉眼根本扫不过来。怎么补把「谁写输出」这件事定成规矩——只有最后一层程序段能写 Q前面各层只写中间变量。写完用交叉引用把每个 Q 点查一遍出现两次以上就得改结构。这条规矩在八段LED 实验里也要用MOVE 到 QB0 的那一句只能出现一次。5.3 地址与命名类Q0.1 到底是黄灯还是红灯易漏点原文自动流程里 Q0.1 是南北黄灯手动流程里 Q0.1 又写成南北红灯Q0.5 在自动段被描述成「南北方向绿灯」在手动段才是东西绿灯。照抄进程序灯序必然错乱。为什么漏手写实验报告是逐段推进的写到手动部分时人已经累了凭印象填地址加上变量命名用的是「南北/东西」这种方位词而不是「红/黄/绿」这种功能词两个维度一交叉就容易串。怎么补动手写程序之前先落一张 I/O 分配表全篇只认这张表任何一段代码写完都回来对一遍。变量名一律用功能命名NS_G、NS_Y、NS_R、EW_G、EW_Y、EW_R程序里只写符号名不写绝对地址。真要用地址也是在变量表里映射一次改地址只改一处。5.4 地址与命名类东西黄灯没有地址易漏点四个阶段里只有「东西黄灯」这一格在原文中是空的其余五个灯都有明确地址。为什么漏写报告的人按「南北绿 → 南北黄 → 南北红 → 东西绿」的顺序推推到东西黄的时候觉得「跟前面一样不用写了」就跳过去了。做程序的时候也跟着跳结果东西方向永远从绿灯直接跳回红灯。怎么补把时序表的每一格都填满再动程序空格就是待办项。填不出来说明硬件点不够得在变量表里补填得出来说明只是漏了补上就行。仿真时专门盯一次「东西绿灯灭之后那三秒」黄灯亮不亮一眼就看出来。5.5 验证类仿真通过不等于实物通过易漏点PLC 仿真跑通、HMI 仿真上数字 0 到 8 循环得很漂亮接上实验箱的八段管却不亮或者乱码。交通灯在 HMI 上颜色切换正常实物灯不亮。为什么漏HMI 上那个八段形状是用矩形拼的颜色动画连的是 DB 里的步号或者段码跟真实的段码表、共阴共阳、接线顺序完全无关。仿真验证的是「逻辑跑通了」不是「硬件接对了」。这是整个实验里最大的黑匣子——仿真给了你一个全绿的假象。怎么补把验证拆成两段。第一段在仿真里验逻辑步号会不会循环、时间到不到、手动按钮有没有反应。第二段在实物上验硬件先不管循环直接强制输出字节为 16#3F看是不是显示 0不是就查共阴共阳和线序是了再逐位强制 a 到 g一位一位确认。两段都过了才谈「实验结果正确」。6. 复习清单把两个实验压成一张自检表逐项打勾考前或者交报告前我会按下面这张表从头走一遍。每一项都有明确的通过标准不打勾就不往下走。序号自检项通过标准1I/O 分配表六个灯、四个按钮全有地址无空缺命名统一2段码表共阴共阳已确认0~9 全填放在 DB 数组里3定时器每个 TON 有独立背景 DB交叉引用只有一处4输出写入每个 Q 和 QB0 只在一处被写5手自动切换切换瞬间所有灯复位、步号清零6时间参数HMI 输入整数秒PLC 侧换算成 Time 再喂 TON7HMI 动画动画变量类型与控件匹配Bool 就是 Bool8仿真自动循环一轮、手动两个方向、停止能压住输出9实物强制 16#3F 能显示 0逐位点亮 a~g 全亮第 3 项和第 4 项是最容易跳过、后果最重的两步。第 3 项查的是「定时器有没有打架」第 4 项查的是「输出有没有被别处覆盖」两者都不会在编译时报错只会在运行时以「时间不对本文还有配套的精品资源点击获取