S7-1200实验箱:八段数码管与交通灯PLC/HMI仿真实现

发布时间:2026/10/28 13:49:33
S7-1200实验箱:八段数码管与交通灯PLC/HMI仿真实现 简介面向电气工程及其自动化等专业学生与PLC初学者这份实验文档围绕TIA Portal V13、S7-1200可编程控制器和KTP700触摸屏展开覆盖八段LED显示与智能交通灯控制两个典型实验帮助读者完成从梯形图编程、HMI组态到仿真验证的实践链路。压缩包内含1个docx文件约1.62MB以实验指导书形式整合实验目的、器材清单、操作步骤、思考题和反思总结便于对照操作与整理报告。文档涉及PLC变量表设置、接通延时定时器与MOVE指令、16进制段位码显示、启停按钮控制以及HMI八段LED图形组合、静态文本、按钮事件和变量动画关联交通灯部分还包含DB块、FC块、手自动切换与时序控制。已有449人学习其中的定时器编号冲突处理、三个数码管显示学号等拓展内容可为课程设计和程序调试提供参考。1. 从一块八段数码管到路口红绿灯S7-1200实验箱里到底跑的是什么某实验室的 S7-1200 实验箱上最容易被低估的两个实验一个是八段 LED 循环显示 0-8另一个是路口红绿灯自动/手动切换。表面看是两道理科题实际是一套完整的 PLC 落地链路TIA Portal V13 里建项目、配 CPU1214C DC/DC/DC、拉 KTP700 触摸屏、写梯形图、做 HMI 动画、跑 PLCSIM 仿真。八段管实验练的是“字节输出 定时器 段码表”交通灯练的是“DB 块 手自动切换 HMI 读写”。适合电气工程及其自动化专业的课程设计也适合刚接触 Portal、想把梯形图从纸面搬到仿真里的人。后面按段码表、定时器、HMI 绑定、踩坑、复用封装五块拆能照着复现。2. 段码表与变量表0-8循环显示的第一块砖八段管的本质是八个 LED 封装在一起a、b、c、d、e、f、g 七段加一个小数点 dp。PLC 输出一个字节哪一位为 1 哪一段就亮听起来简单但第一次接线的人十有八九会翻车段码表抄对了数码管显示的还是乱码。问题通常不在程序而在位序和共阴共阳没对上。这一章先把段码表的来历讲清楚再落到 TIA Portal V13 里怎么建变量表、怎么用 MOVE 指令把段码送到输出字节。2.1 段位映射a到dp到底占哪一位常见做法是把 Q0.0 到 Q0.7 依次对应 a、b、c、d、e、f、g、dp这样一个字节 QW0 的低八位就能直接驱动一根八段管。但实验箱的接线不一定是这个顺序有的板子把 dp 放在最高位有的把 a 放在 Q0.7。写程序前必须做一件事翻实验箱原理图或者拿万用表二极管档逐段点确认 Q0.0 到底点亮的是哪一段。我一般会在变量表里先把 Q0.0 到 Q0.7 命名成 Seg_a 到 Seg_dp再对着实物一段一段试试完再写段码表。这样后面查程序时看到 Seg_a 就知道是 a 段不用在脑子里做地址换算。位序确认之后段码表才有意义。以共阴极为例a 在 bit0、dp 在 bit7数字 0 需要 a、b、c、d、e、f 六段亮二进制是 0011_1111十六进制 0x3F。数字 1 只要 b、c 亮即 0x06。依此类推0 到 9 的共阴段码如下表。共阳接法把每一位取反即可表里一并列出省得每次重新算。数字点亮段共阴段码共阳段码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 g0x7F0x809a b c d f g0x6F0x90这张表要背下来不现实但要知道它是怎么来的。面试或者答辩时被问“0x5B 为什么是 2”能当场把二进制拆开讲清楚比背表更有说服力。2.2 共阴共阳判断段码表为什么要取反共阴和共阳的区别在公共端接法共阴是八段 LED 的阴极连在一起接地PLC 输出高电平点亮共阳是阳极连在一起接电源PLC 输出低电平点亮。实验箱上通常有一个跳线或者两种不同的数码管模块接错不会烧但显示会完全反过来——该亮的灭该灭的亮。判断方法很简单拿万用表二极管档红表笔接公共端、黑表笔依次碰 a 到 dp如果某段亮说明公共端是阳极模块是共阳反过来黑表笔接公共端、红表笔碰段脚亮就是共阴。没有万用表就看实验箱丝印或者直接试送 0x3F 进去显示 0 就是共阴显示一个反过来的图案就是共阳。这里有个容易忽略的点S7-1200 的 DC/DC/DC 型 CPU数字量输出是晶体管源型输出Q 点为高电平时对外提供 24V。如果数码管是共阳公共端接 24VQ 点输出低电平才能点亮而晶体管输出低电平是拉低到 0V灌电流能力有限最好加限流电阻或者用达林顿管驱动。实验箱一般已经做好驱动不用自己搭但做课程设计焊板子的人要留意这一点。2.3 在TIA Portal V13里建变量表和DB块打开 TIA Portal V13新建项目在“添加新设备”里选 CPU1214C DC/DC/DC订货号 6ES7 214-1AG40-0XB0再添加 HMI 选 KTP700。两个设备加完后点开网络视图用 PROFINET 把 PLC 和 HMI 连起来。接着设 IPPLC 改成 192.168.0.200HMI 改成 192.168.0.201子网掩码 255.255.255.0。这一步别偷懒后面 PLCSIM 和 HMI 仿真能不能连上一大半取决于这两个地址在不在同一网段。变量表按实际接线建八段管实验最少需要这几个变量变量名地址数据类型说明Start_BtnI0.0Bool启动按钮常开Stop_BtnI0.1Bool停止按钮常闭Seg_OutQB0Byte段码输出字节Num_CurMW10Int当前显示数字 0-8AutoRunM0.0Bool自动运行标志如果想把段码表做成可查的数组可以新建一个全局 DB 块命名为“Seg_Data”里面放一个 Array[0..9] of Byte把上表的共阴段码填进去。DB 块的好处是数据集中、HMI 也能直接访问坏处是新手容易把 DB 变量和 M 区变量搞混HMI 动画里选错变量路径灯就不亮。我一般先在变量表里把 I/O 和 M 区变量命名清楚DB 块只放段码表和设定时间这类参数分工明确排查时好找。2.4 MOVE指令送段码QB0和QW0别混用段码输出最直接的写法是用 MOVE 指令把算好的字节送到 QB0。比如当前数字是 3就把 0x4F 写进 QB0八段管显示 3。这里有个坑QB0 是字节QW0 是字MW10 是字。把 Int 类型的 Num_Cur 直接 MOVE 到 QB0TIA Portal 会报数据类型不匹配或者隐式转换警告正确做法是先查表得到 Byte再送 QB0。用 SCL 写一个查表功能块逻辑比梯形图里堆一排 MOVE 清爽得多// 共阴段码查表输入0-9输出对应字节 FUNCTION_BLOCK SegCode VAR_INPUT Num : Int; // 当前要显示的数字0-9 END_VAR VAR_OUTPUT Code : Byte; // 送QB0的段码 END_VAR VAR_TEMP tbl : Array[0..9] of Byte : [16#3F,16#06,16#5B,16#4F,16#66, 16#6D,16#7D,16#07,16#7F,16#6F]; END_VAR BEGIN IF Num 0 AND Num 9 THEN Code : tbl[Num]; // 数组下标从0开始直接取 ELSE Code : 16#00; // 越界时熄灭避免显示乱码 END_IF; END_FUNCTION_BLOCK这段代码的关键在数组下标和边界判断。tbl[0] 对应数字 0tbl[9] 对应数字 9Num 越界时输出 0x00防止数组访问出错导致 CPU 报错。Code 是输出引脚调用时接 QB0例如SegCode_DB(Num : Num_Cur, Code QB0);。参数说明Num 是 Int 输入来自计数器或者 HMI 输入Code 是 Byte 输出直接写输出字节tbl 是临时数组每次调用重新初始化不占背景数据块。如果实验箱是共阳接法把表里的值全部取反或者加一句Code : NOT Code;不用改两套表。QB0 和 QW0 混用是另一个高频错误。QB0 只覆盖 Q0.0 到 Q0.7 八个点QW0 覆盖 Q0.0 到 Q1.1 十六个点。如果程序里既有人写 QB0又有人写 QW0后写的会把先写的覆盖掉表现就是数码管偶尔闪一下正确数字又变乱。变量表里给 QB0 命名之后所有输出统一走这个符号不要在程序里直接写绝对地址。3. 定时器与计数器让0-8每秒跳一格的三段程序八段管能显示一个数字只是第一步实验要求是 0 到 8 每秒自动跳一格按启动开始循环按停止终止。这背后是三段逻辑一个 1 秒节拍、一个 0 到 8 的循环计数、一个启动停止自锁。很多人卡在定时器上不是不会用 TON而是复制粘贴程序段时把定时器编号搞重了编译能过仿真一跑所有段一起跳查半天查不出原因。这一章按节拍、计数、自锁、复位四块拆每块给出可抄的程序结构。3.1 TON的PT参数1s节拍怎么来S7-1200 的接通延时定时器 TON引脚 IN 为真时开始计时计到 PT 设定值后 Q 输出真。PT 的数据类型是 TIME写 T#1S 表示 1 秒也可以写 T#500MS、T#2S。实验要求间隔 1 秒所以 PT 填 T#1S。但 TON 有个特性IN 一直为真时Q 会一直保持真不会自己复位。想让它在 1 秒后产生一个脉冲必须让 IN 在 Q 置位后断开一个扫描周期下一个扫描周期再接通重新计时。常见做法是用 Q 的常闭触点串在 IN 前面或者用 R_TRIG 抓 Q 的上升沿。用 SCL 写一个 1 秒脉冲发生器结构如下// 1秒脉冲ton1s.Q每1秒置真一个扫描周期 #ton1s(IN : NOT #ton1s.Q, PT : T#1S); #trig(CLK : #ton1s.Q); IF #trig.Q THEN #pulse1s : TRUE; // 本扫描周期产生一个脉冲 ELSE #pulse1s : FALSE; END_IF;逻辑说明ton1s 的 IN 接自己的 Q 取反。初始 Q 为假IN 为真开始计时1 秒后 Q 变真下一扫描周期 IN 变成假Q 复位再下一扫描周期 IN 又变真重新计时。这样 Q 每 1 秒产生一个扫描周期的真信号R_TRIG 把它抓成脉冲。参数说明ton1s 是 IEC_TIMER 类型的背景数据块PT 填 T#1Strig 是 R_TRIG 背景数据块CLK 接 ton1s.Qpulse1s 是 Bool 临时变量供后面计数用。这个结构比梯形图里两个定时器互相复位更直观也不容易把编号搞重。3.2 计数器与比较指令0-8循环的两种写法有了 1 秒脉冲计数就有两种写法。第一种用 CTU 加计数器PV 设 9CV 当前值 0 到 8计到 9 时用比较指令或者复位引脚把 CV 清 0。第二种不用 CTU直接用一个 Int 变量自加加到 8 之后手动赋 0。两种写法在实验里都能跑区别在可读性和扩展性CTU 的 CV 是 Word送显示前要转 Int自加变量本身就是 Int查段码表方便。我一般用第二种少一层数据类型转换。// 0-8循环计数pulse1s为1秒脉冲 IF #pulse1s THEN #num : #num 1; IF #num 8 THEN #num : 0; // 到8后回0形成0-8循环 END_IF; END_IF;这段代码放在 FC 或者 OB1 里都行num 是静态变量或者 M 区 Int。注意判断条件是 8而不是 8因为要让 8 显示满 1 秒之后再回 0如果写 8数字 8 只停留一个扫描周期肉眼看不到。这个细节在仿真里特别明显8 一闪而过很多人以为是定时器问题其实是比较条件写错了。参数说明pulse1s 来自上一节的脉冲发生器num 建议用 DB 里的静态变量不要用临时变量否则每个扫描周期清零计数永远不累计。如果坚持用 CTU接线是 CU 接 pulse1sR 接复位条件PV 填 9CV 用比较指令CV 9时复位。CTU 的 CV 是 Word查段码表前要INT_TO_BYTE或者先转 Int。两种写法没有优劣看个人习惯但同一个项目里不要混用否则查程序时要在两种数据形态之间来回切。3.3 启动停止自锁与首次扫描初始化启动按钮 I0.0 是常开点按一下给一个脉冲松开就断所以必须做自锁。标准写法是启动按钮和 AutoRun 常开触点并联再串停止按钮的常闭点最后接 AutoRun 线圈。停止按钮接常闭程序里用常开触点这样正常运行时停止回路是通的按下停止按钮断开AutoRun 掉电。如果停止按钮接常开程序里就要用常闭触点接反了表现是“不按停止也能跑一按停止反而启动”这是血泪经验里最常见的一条。首次扫描初始化用 FirstScan 位S7-1200 里是 OB1 的启动信息或者#FirstScan临时变量。初始化要做三件事num 清 0、AutoRun 清 false、QB0 清 0。不清 num 的话上次停机时显示到 5再启动从 6 开始看起来像程序乱跳不清 QB0 的话停机后数码管还亮着最后一个数字实验要求是停止后熄灭或者归零。程序段功能关键指令注意事项1首次扫描初始化FirstScan MOVEnum 清 0QB0 清 02启动停止自锁常开并联 常闭串联停止按钮用常开触点31 秒脉冲TON R_TRIGPT 填 T#1S40-8 循环计数INC 比较判断条件用 85段码查表输出FC 调用 QB0共阴共阳别搞反这张表可以直接对着在梯形图里一段一段搭每段的功能和注意事项写清楚调试时哪段不对一眼能定位。程序段 2 的自锁回路要注意触点顺序启动按钮和 AutoRun 并联之后再串停止按钮不能把停止按钮并在启动按钮两边否则停止按钮会被自锁旁路按了没反应。3.4 停止时把段码清0而不是留最后一位停止逻辑有两种处理一种是停止时把 QB0 清 0数码管全灭另一种是保持最后显示的数字直到下次启动。实验指导书一般要求循环终止没明确说灭不灭但仿真验收时老师通常希望看到“停止后不再跳变”。我建议停止时清 QB0同时在 HMI 上给一个“当前值”显示这样既满足停止不跳又能看到停在哪。清 0 的写法是在 AutoRun 的下降沿触发一个 MOVE把 16#00 送 QB0不要用复位整个 QB0 字节的线圈指令字节没有线圈只能用 MOVE 或者 Fill。还有一个边界如果停止时正好在 1 秒脉冲上升沿num 可能多加一次再启动时从下一个数字开始。严格的做法是在停止回路里把 pulse1s 也屏蔽掉或者计数条件写成IF #pulse1s AND #AutoRun THEN这样停机期间脉冲不计数。这个细节不影响演示但课程设计报告里写上去能体现对扫描周期的理解。4. KTP700画面绑定八段管动画和交通灯面板怎么做PLC 程序跑通只是半边实验要求 HMI 上能看到八段管形状的数字变化还要能输入通行时间、切换手自动。KTP700 是 7 寸屏分辨率 800×480工具箱里的基本对象够用难的是变量绑定和动画配置。很多人 PLC 变量表建得没问题HMI 上灯就是不亮最后发现动画关联的是另一个同名 DB 变量或者变量选择对话框里点错了层级。这一章按八段管动画、IO 域、指示灯颜色、手自动开关四块讲每块给出变量对应关系和操作顺序。4.1 用矩形拼八段管可见性动画绑定段码位在 HMI 画面里放七个矩形每个矩形旋转成对应角度拼成一个“8”字a 段横放顶部b 段竖放右上c 段竖放右下d 段横放底部e 段竖放左下f 段竖放左上g 段横放中间。矩形尺寸建议 60×12 像素间距留 2 像素拼出来比例接近真实数码管。拼好之后全选右键组合方便整体移动但不要组合成一个对象否则每段的动画要单独配。每段矩形的动画配置选中矩形在属性里找“动画”→“可见性”关联 PLC 变量。变量不要直接绑 Q0.0 到 Q0.6因为 Q 点在仿真时不一定能单独监控到每一位更稳的做法是在 DB 块里建八个 Bool命名 Seg_a 到 Seg_dpPLC 程序里把段码字节拆成位赋给这八个 BoolHMI 动画关联这八个 DB 变量。拆位写法// 把段码字节拆成八个Bool供HMI动画使用 Seg_a : Seg_Out.%X0; Seg_b : Seg_Out.%X1; Seg_c : Seg_Out.%X2; Seg_d : Seg_Out.%X3; Seg_e : Seg_Out.%X4; Seg_f : Seg_Out.%X5; Seg_g : Seg_Out.%X6; Seg_dp : Seg_Out.%X7;逻辑说明%X0到%X7是字节内的位访问Seg_Out 是 QB0 的符号名这样 HMI 只认 DB 变量不直接认物理输出。参数说明Seg_a 到 Seg_dp 建在全局 DB“HMI_Data”里数据类型 BoolHMI 动画的“可见性”选“变量为真时可见”背景色选红色或者绿色和实验箱数码管颜色一致。这样做的好处是仿真时不用连实物HMI 上也能看到数字变化。4.2 IO域与按钮事件绿灯黄灯时间写入DB交通灯实验要求通过触摸屏设定通行时间和黄灯时间。在 HMI 画面上放两个 IO 域一个标“绿灯时间”一个标“黄灯时间”数据类型选 Int格式选十进制输入输出模式。关联变量建在 DB“Traffic_DB”里比如 Green_Time 和 Yellow_Time初始值给 10 和 3单位秒。IO 域的限制值要设上下限Green_Time 设 5 到 60Yellow_Time 设 1 到 10防止输入 0 或者负数导致定时器 PT 不合法。按钮事件分两种启动/停止按钮用“按下置位、释放复位”或者“按下取反”手自动切换用开关对象更直观。以启动按钮为例在按钮的“事件”→“按下”里添加函数“置位位”关联 DB 里的 Start_Cmd在“释放”里添加“复位位”关联同一个变量。这样按下去 Start_Cmd 为真松开为假PLC 里再用 Start_Cmd 做自锁。不要直接把按钮关联到 I0.0HMI 不能写物理输入点只能写 DB 或者 M 区变量PLC 程序里再把 DB 变量和 I0.0 并联。HMI 对象关联变量数据类型事件/动画说明启动按钮Traffic_DB.Start_CmdBool按下置位释放复位PLC 里与 I0.0 并联停止按钮Traffic_DB.Stop_CmdBool按下置位释放复位PLC 里串常闭手自动开关Traffic_DB.AutoModeBool取反0 自动1 手动绿灯时间 IO 域Traffic_DB.Green_TimeInt输入输出限制 5-60黄灯时间 IO 域Traffic_DB.Yellow_TimeInt输入输出限制 1-10这张表里的变量名要和 PLC 程序里完全一致大小写也一样。TIA Portal 的变量选择对话框支持搜索输入变量名能直接定位比在树形目录里一层层点开快得多。如果搜不到检查变量是不是建在了“显示所有变量”里被过滤掉了。4.3 交通灯红黄绿指示灯的颜色动画交通灯画面放六个圆形南北方向红黄绿三个东西方向红黄绿三个直径 40 像素默认灰色。每个圆形的动画配置“颜色”→“变量”关联对应的 Q 点或者 DB 里的灯状态位。比如南北红灯关联 Traffic_DB.NS_Red变量为真时背景色红色为假时灰色。颜色动画和可见性动画二选一即可颜色动画更接近真实路口灯不亮时是灰的亮时变色不会出现“灯消失”的空洞感。PLC 程序里的灯输出建议用 DB 变量中转不要直接写 Q0.0 到 Q0.5。原因和八段管一样HMI 动画关联 DB 变量更稳仿真时不受物理输出限制。程序结构是自动逻辑算出一组灯状态手动逻辑算出另一组最后根据 AutoMode 选择输出到 QB0 或者逐个 Q 点。这样 HMI 上看到的是逻辑状态实物输出是另一层排查时可以分开看是逻辑错还是接线错。4.4 手自动切换开关一个Bool管两套逻辑交通灯的手自动切换用 I0.1 或者 HMI 上的开关低电平自动、高电平手动。程序里不要用 I0.1 的常开常闭在各处分散判断而是先把它映射成一个 DB 变量 AutoMode所有逻辑统一用这个变量。自动模式下定时器按 Green_Time 和 Yellow_Time 循环切换南北绿、南北黄、东西绿、东西黄手动模式下南北通行按钮 I0.2 和东西通行按钮 I0.3 直接控制对应绿灯另一方向强制红灯。切换瞬间最容易出问题从自动切手动如果不清除自动定时器的状态手动按钮按下去可能没反应因为自动逻辑还在往输出写值。常见做法是在 AutoMode 的上升沿和下降沿各触发一次复位把所有灯输出和定时器复位再进入对应模式。这个复位不是可选项是必须做的否则验收时切一次模式灯就乱老师一眼就能看出来。5. 避坑与排查定时器编号、变量选错、仿真连不上这五类翻车PLC 实验的坑有个特点编译不报错下载也成功就是现象不对。这时候没有黑匣子只能靠分段监控和变量表逐点查。下面五类是实验箱上重复率最高的翻车现场每条按现象、原因、解决写遇到对不上的现象可以先从这里对照。5.1 定时器编号冲突复制粘贴埋的雷现象程序里有两个以上 TON仿真时所有段同时跳或者定时时间明显不对改了一个定时器的 PT另一个也跟着变。原因从别处复制程序段时TON 的背景数据块编号一起被复制多个定时器共用了同一个实例 DB。TIA Portal 编译时不会报错因为语法上合法但运行时后一个定时器会覆盖前一个的状态。解决把所有 TON 删除从右侧指令树里重新拖拽每个 TON 自动分配独立背景 DB或者手动在背景 DB 编号里改成不同的值。改完之后编译整个项目不要只编译单个块否则旧背景 DB 还在。5.2 HMI动画变量选错灯不变色现象PLC 程序监控里 Q0.0 已经为真HMI 上对应的灯还是灰色。原因动画关联的变量和程序里写的不是同一个常见的是选了同名但不同 DB 的变量或者选了过程变量而不是 DB 变量。TIA Portal 的变量选择对话框里同名变量会列在不同 DB 下面点快了就容易选错。解决在 HMI 动画的变量选择框里点开“显示所有变量”按 DB 名称筛选选中后看对话框下方显示的绝对路径确认是“Traffic_DB.NS_Red”而不是“HMI_Data.NS_Red”。改完重新编译 HMI只下载 HMI 不行要整个项目编译。5.3 PLCSIM与HMI仿真连不上现象PLC 仿真启动正常HMI 仿真一点就报“无法建立连接”或者一直转圈。原因通常有三个PLC 和 HMI 的 IP 不在同一网段、PROFINET 连接没有编译下载、HMI 连接里指向的 PLC 名称和实际 CPU 名称不一致。解决先核对 192.168.0.200 和 192.168.0.201 是不是同一子网再在网络视图里选中 PROFINET 连线右键“编译并下载”最后打开 HMI 的连接设置看“合作伙伴”是不是 CPU1214C 的符号名。顺序是先下 PLC 再下 HMI反了也会连不上。5.4 段码对但显示乱共阴共阳和位序现象程序里 MOVE 0x3F 到 QB0数码管显示的不是 0而是一个残缺图案或者全亮。原因共阴共阳接反、a 到 dp 的位序和程序里假设的不一致、限流电阻或者排线接触不良。解决先用万用表二极管档逐段点确认公共端和段脚再把 QB0 强制成 0x01、0x02、0x04 逐位测试看哪一位对应哪一段最后检查排线有没有插反。位序问题改程序里的段码表或者改接线都行推荐改程序因为改接线容易把相邻段搞乱。5.5 手自动切换时灯全灭或对向绿灯同亮现象自动切手动瞬间两个方向绿灯同时亮或者所有灯全灭按手动按钮也没反应。原因切换时没有复位自动逻辑的输出和定时器状态两套逻辑同时在写同一组 Q 点或者手动模式下南北和东西按钮没有做互锁。解决在 AutoMode 的上升沿和下降沿各加一个复位程序段把六个灯输出和两个定时器全部复位手动模式里南北通行和东西通行互锁按其中一个时复位另一个。互锁不要只靠按钮常闭触点程序里也要做HMI 按钮和物理按钮可能同时被按下。6. 三块八段管显示学号把单管程序封装成可复用FC单管显示跑通之后课后作业要求用三个八段管显示学号后三位比如 394。很多人第一反应是复制三份程序改地址结果定时器编号冲突、段码表重复、HMI 上要配三组动画改一个数字要动三个地方。更稳的做法是把段码查表封装成 FC主程序里调用三次分别送三个输出字节。FC 和 FB 的区别在于 FC 不需要背景 DB适合这种纯组合逻辑查表数组用临时变量每次调用重新初始化不占内存。// FC输入0-9返回共阴段码供多次调用 FUNCTION Seg_Decode : Byte VAR_INPUT Num : Int; // 要显示的数字 END_VAR VAR_TEMP tbl : Array[0..9] of Byte : [16#3F,16#06,16#5B,16#4F,16#66, 16#6D,16#7D,16#07,16#7F,16#6F]; END_VAR BEGIN IF Num 0 AND Num 9 THEN Seg_Decode : tbl[Num]; ELSE Seg_Decode : 16#00; END_IF; END_FUNCTION调用时在 OB1 里写三次分别对应百位、十位、个位// 学号后三位394分别送QB0/QB1/QB2 QB0 : Seg_Decode(Num : 3); // 百位 QB1 : Seg_Decode(Num : 9); // 十位 QB2 : Seg_Decode(Num : 4); // 个位逻辑说明FC 的返回值直接赋给输出字节三次调用互不影响因为 tbl 是临时变量每次调用重新初始化。参数说明Num 是 Int 输入超出 0-9 返回 0x00QB0、QB1、QB2 对应三根八段管的段码输出接线时确认每根管的 a 到 dp 顺序一致。如果实验箱只有一根管可以用一个字节的 QW0 分时复用但课程设计一般要求同时显示三根管各占一个字节最省事。HMI 上对应放三组矩形每组七个分别关联三组 DB 变量比如 HMI_Data.Seg1_a 到 Seg1_g、Seg2_a 到 Seg2_g、Seg3_a 到 Seg3_g。PLC 程序里加一段拆位把 QB0、QB1、QB2 分别拆到这三组 Bool。这样改学号只需要改三个调用参数不用动 HMI 动画。我一般还会在 HMI 上放一个输入框关联一个 Int 变量 Student_No程序里用整除和取余拆出百位、十位、个位这样答辩时老师随便报一个三位数现场就能改不用重新下载程序。// 从三位数学号拆出百十个位 #hundreds : Student_No / 100; #tens : (Student_No / 10) MOD 10; #units : Student_No MOD 10;这段代码要注意整数除法的截断特性394 / 100 得 3不是 3.94394 / 10 得 39再 MOD 10 得 9394 MOD 10 得 4。变量都用 Int不要用 Real否则 MOD 用不了。拆出来的三个值分别送三次 FC 调用HMI 输入框限制 0 到 999超出范围显示 000 或者报警避免数组越界。从那以后我每次做多管显示都先把段码查表封成 FC再在 OB1 里按位调用最后才去配 HMI 动画。这个顺序反过来做先画三组矩形再写程序很容易在变量绑定上耗掉半天。把逻辑和画面分开改哪一层都不牵动另一层验收时也敢让老师随便报数。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询