news 2026/9/11 3:38:57

HMI进化论:从“傻白甜”显示终端到边缘AI智慧大脑的三级跳

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HMI进化论:从“傻白甜”显示终端到边缘AI智慧大脑的三级跳

1. 干了十年自动化,我为什么说传统HMI配得上"傻白甜"这个外号

前阵子去给一条老产线做数字化改造评估,车间主任指着墙上的触摸屏抛出一句话:"这东西不就是个放大版的平板吗?除了看看数、按按按钮,还能干点啥?" 我当时没急着反驳,但这个问题确实问到了根子上。在工业现场,HMI(Human Machine Interface,人机界面)是人跟设备打交道的第一道窗口,从最古老的按钮、指示灯,到文本显示器,再到现在的彩色触摸屏,它一直是操作工最熟悉的设备。可也正是因为太熟悉,很多人忽略了一件事:在整个自动化金字塔里,HMI长期扮演的只是一个"显示终端",真正负责运算和控制的是后面那台PLC。

做这行久了你会发现,传统HMI确实担得起"傻白甜"这三个字。"白"是说它的工作内容非常单纯,无非是把PLC里的数值搬上屏幕、把操作工的手指动作传回PLC,活脱脱一个"数据搬运工";"甜"说的是它的外壳和界面越来越漂亮,高清屏、扁平化UI、炫酷的动画一个不落,但漂亮底下藏着的是极其简单的逻辑;而"傻"才是重点——它不联网、不思考、不感知,既不知道设备在什么工况,也不知道操作工为什么这么按。你用惯了智能手机,回头再看这种HMI,会觉得它像个只能接电话的老式座机。

但这件事本身不怪HMI,也不怪当年选型的工程师。传统HMI的硬件平台决定了它的天花板:主流设备用的是低功耗嵌入式CPU,内存按MB算,存储按MB算,通信靠串口和现场总线,能稳定支撑几百个变量的实时刷新已经很不容易。上世纪八九十年代PLC统治工厂的时候,"看得见、按得动"就是人机界面的全部使命。只不过到了今天,产线数据量上来了、设备互联的要求上来了、工厂对预测性维护和柔性生产的期望也上来了,原来那套"傻白甜"的人机交互模型就明显不够用了。

所以这个标题里写了"拯救HMI",不是说HMI要被淘汰,恰恰相反,它正在经历一场从"傻白甜"到"智慧大脑"的进化。我把这个过程拆成了三级跳:第一级跳是联网,让HMI从孤岛变成数据节点;第二级跳是算力下沉,让HMI在本地就能处理和分析数据;第三级跳是AI进场,让HMI真正理解工艺、理解人的意图。下面每一级我都会结合具体的软件、芯片、协议和排障经验来展开,既有原理也有实操,适合自动化工程师、产线技术员,以及正在做产线数字化规划的同行参考。

2. 第一级跳:把"显示屏"升级成"数据节点",HMI完成联网觉醒

2.1 从"点对点接线"到"一张工业网络"

想理解第一级跳的本质,得先回头看HMI是怎么跟PLC通信的。早期HMI和PLC之间基本是点对点连接,一根串口线对应一台PLC,HMI软件里配好串口参数、站号和寄存器地址,然后按固定周期去轮询数据。这种模式在单机自动化时代没有问题,但产线一旦拉长、设备一多,问题立刻暴露:几十台HMI各自为政,数据没有汇总,故障信息散落在各个屏幕上,工程师想看全厂状态得挨个车间跑。

第一级跳的技术内核,就是把HMI从"单台设备的显示器"变成"工业网络上的一个数据节点"。这件事不是某个厂商一夜之间想明白的,而是工业通信协议逐步成熟推动的。今天你在现场最常碰到的组合大概有这几类:

协议/总线典型场景HMI侧常见处理
Modbus RTU/TCP中小型产线、老设备改造最通用,几乎所有HMI软件都有原生驱动
Profinet/Profibus西门子生态配合博图(TIA Portal)工程组态,PN口直连
EtherNet/IPAB、罗克韦尔生态HMI侧需获取EDS文件,标签地址走CIP协议
OPC UA跨厂商数据集成、上层MES/SCADA新版HMI软件大多已内置UA Server/Client

我自己的经验是,评估一台HMI有没有完成"联网觉醒",不要光看网口数量,要问三个问题:能不能同时连多个PLC?能不能向上游系统提供数据接口?能不能通过交换机把设备状态送进MES?如果三个答案都是"能",这台HMI才算迈进了数据节点的门槛。

2.2 HMI软件生态:组态不再是"画图"

很多人一提到HMI软件就想到组态、做画面,好像画几个矩形、拉几条线就叫开发。其实第二阶段的HMI软件早就不是"画图工具"了。以西门子生态为例,从WinCC flexible到TIA Portal里的WinCC,变量管理、配方、审计追踪、用户权限、数据记录全部集成在一个工程里,一个项目文件同时覆盖PLC程序和HMI画面,PLC里的DB块地址改动后,HMI侧的变量引用可以做一致性检查。这类"控制器-可视化一体化工程"的能力,让HMI真正意义上和PLC站在了同一个工程体系里。

其他主流HMI软件也都在往这个方向走:威纶通的EasyBuilder Pro强调"标签直接引用+宏指令",施耐德的Vijeo Designer强调与Modicon控制器的深度集成,还有一批支持Web发布的产品,比如部分厂商的Web HMI,直接让浏览器成为客户端。这些软件的共同趋势是:变量、报警、历史数据开始成为工程对象,而不只是画面上的一个图元。

这里给准备做第一级跳的同行一个实操建议:选型时先确认HMI软件支持多少种协议驱动、能否双口或多口通信、变量上限是多少。我见过一个项目,客户贪便宜买了入门款HMI,结果一条产线三台PLC,入门款只支持一路通信,最后被迫外接协议转换器,成本和稳定性都不划算。HMI的"联网资本"是写在硬件规格里的,这个账要提前算清楚。

2.3 第一级跳最常见的落地坑

联网之后接踵而来的问题,就是数据冗余和通信负载。HMI的CPU性能是有限的,如果你把全厂几千个变量一股脑全配进HMI轮询,扫描周期会肉眼可见地掉速。正确的做法是"按需采集、分层上传":操作层关注的数据放在HMI本地高频刷新,需要上传给MES的数据走OPC UA或者MQTT异步推送,而不是让HMI既当显示器又当采集网关把所有事情都干了。

另一个大坑是网段规划。现场改造项目中,HMI、PLC、上位机经常被塞进同一个交换机而没有VLAN隔离,广播风暴一来,HMI画面上的数据就像抽风一样跳。所以第一级跳改造时,我强烈建议把设备层网络和办公网络物理或逻辑隔离,HMI和PLC单独划一个工业网段,需要上送数据时走防火墙或工业安全网关,别图省事一把梭。

3. 第二级跳:边缘算力下沉,HMI从"显示终端"变成"车间小服务器"

3.1 为什么要让HMI自己"会算"?

联网解决了数据通路问题,但很快大家发现了一个新的尴尬:数据是上去了,处理不过来。如果让HMI把所有原始数据都交给云端或者厂级服务器去算,会遇到三个现实问题。第一是网络不稳,老车间里工业交换机的质量参差不齐,偶尔断个网,远程分析就成了瞎子;第二是延迟,操作工在设备旁边等着处理一个突发报警,等数据绕到云端再绕回来,黄花菜都凉了;第三是数据安全,越来越多的工厂不愿意把核心工艺参数全部放到外部平台,希望关键数据在车间本地消化。

这就是第二级跳的核心思路:把计算能力下沉到HMI这个边界节点上。现在的工业HMI,硬件平台早就不是当年那个只能刷界面的嵌入式小系统了。新一代工业平板和HMI盒子普遍采用多核ARM处理器,内存以GB计,存储用eMMC甚至SSD,操作系统从裸奔的实时内核进化到Linux和Windows IoT。硬件底子变了,软件层面的可能性就完全打开了——HMI本地可以跑MQTT Broker、OPC UA Server、关系型数据库、报警规则引擎,甚至直接部署容器化的数据采集服务。

换句话说,HMI从这个阶段开始不再"傻"了,它能在没人盯着的时候自己做事:比如设备振动数据到阈值后,本地马上算出趋势斜率并且触发预警,不需要等云平台下发命令。

3.2 AI HMI芯片:算力进一步下放的关键变量

最近行业里"AI HMI芯片"这个词很热,很多硬件厂商也拿它当卖点。所谓AI HMI芯片,其实就是在传统HMI主板上增加了一颗专门做神经网络推理的NPU或者高算力GPU模块,让设备具备在本地跑AI模型的能力。这事放在三年前是不敢想的,因为工业HMI的功耗、散热、成本都卡得很死,现在很多芯片厂商把NPU集成进了SoC,比如瑞芯微、恩智浦、瑞萨的中高端工业SoC都带了AI加速单元,HMI厂商只需要在主板上预留接口、在软件层做好推理框架适配,就能让HMI跑起轻量级的图像识别、异常检测模型。

举一个我们已经落地的场景:某装配工位靠HMI屏幕指导人工操作,以前只靠光电传感器判断零件有没有放到位,经常出现错装。后来在HMI里接入一个基于工业相机的缺陷识别模型,模型推理直接在本地AI芯片上完成,检出结果毫秒级回传界面。整台设备改动很小,没有新增工控机,没有重新设计控制柜,只是把HMI升级成了带NPU的版本,再把视觉模型打包部署进去。这就是AI HMI芯片最典型的价值:让边缘智能以极低的改造成本进到每个产线工位。

3.3 边缘HMI软件架构怎么搭

硬件到位之后,软件架构是决定第二级跳成败的关键。我目前比较推荐的是"本地服务+轻量显示"的分层架构:底层是数据采集服务,负责从PLC抓变量并做预处理;中间是数据服务层,提供历史存储、报警判断、规则引擎和API接口;最上层才是人机界面,负责展示和交互。这种架构的好处是,即便界面进程崩溃,数据服务和报警服务还在跑,不至于因为屏幕卡一下就丢了关键数据。

实际工程里,我见过很多工程师把"边缘计算"想得很玄,其实第一步可以很简单:先让HMI本地做报警确认和报表汇总,再把结果推给上位系统。比如原来报警记录都在HMI里,满了就被覆盖,现在我们每个月把报警记录按班次、按设备汇总,自动生成Excel报表通过邮件网关发出去。这个功能用传统HMI脚本写起来很痛苦,但在能跑容器或支持高级脚本的新一代HMI上,就是写个定时任务的事。别一上来就追大模型、追数字孪生,先把边缘HMI的"数据消化能力"做扎实,后面才有故事可讲。

4. 第三级跳:接入大模型和知识图谱,HMI开始"听懂人话"

4.1 从"图标按钮"到"自然语言交互"

如果说前两级跳都还在自动化工程师熟悉的范畴里,那第三级跳就真的进入了"智慧大脑"区域。核心变化是人机交互方式的革命:过去操作工要记住"按哪个键、进哪个画面、看哪个数值",现在新一代AI HMI开始支持自然语言交互,操作工可以直接对着屏幕说"一号产线今天下午三点到现在停机了几次?原因是什么?"HMI理解问题后,自动查询本地历史库、关联报警记录,然后生成一段回答,甚至可以主动给出排查建议。

有同行可能会觉得这是纯噱头,但我可以负责任地说,这件事在技术上已经具备落地条件。一方面,HMI本地存储的数据越来越结构化,报警记录、工艺配方、设备台账、维护工单都是现成的知识库材料;另一方面,轻量化大模型和RAG(检索增强生成)技术已经能在边缘算力上跑起来,HMI不需要连云端,也能基于本车间数据做问答。这就把"操作工遇到问题翻手册、打电话找工程师"的传统模式,改成了"直接问HMI"。

当然,真实的工业场景里,自然语言交互只能解决认知层面的问题,真正要动设备、改参数还是必须走硬联锁。所以第三级跳的正确姿势是"AI给建议、人来确认、PLC来执行"。HMI的AI能力是提供决策支持,而不是替代安全控制回路,这个边界在工程落地时绝对不能模糊。

4.2 设备知识图谱,HMI的"最强大脑"

要让HMI真正变成"智慧大脑",单靠一个大模型聊天窗口远远不够,底层还得有结构化的设备知识。我参与过的一个试点项目是这样做的:给每台关键设备建立知识图谱,节点是设备、部件、传感器、报警码、故障模式、维修动作,边是它们之间的因果关系。比如"主轴温度过高"这个报警码,在图谱里关联了"冷却水流量异常""轴承润滑不足""负载过大"三个可能原因,以及对应的检查步骤和维修工单。

当HMI检测到某个报警时,它不只是弹出一条文本,而是自动调取知识图谱,把可能的原因按概率排序,并把对应的排查步骤推送到界面上。操作工按照步骤逐项确认,每一步都可以直接在HMI上勾选反馈。这样一来,老师傅脑子里的经验、故障处理手册上的条目、历史维修记录的统计规律,全部被沉淀成了可检索、可推理的知识资产。这才是"智慧大脑"和"花哨界面"最本质的区别。

4.3 预测性维护不再是"PPT概念"

第三级跳里另一个看得见摸得着的成果,是预测性维护在HMI上的原生落地。以前预测性维护往往依赖独立的状态监测系统,要额外装传感器、装网关、装软件平台,小工厂根本玩不起。现在很多新一代HMI已经内置了振动特征分析、趋势预测等算法库,CPU或者AI芯片实时跑着设备健康度模型,HMI屏幕上直接显示每台电机的健康评分和剩余寿命预估。

有个案例我印象很深:某食品厂一台关键泵的振动数据一直正常,但AI模型从频谱里捕捉到某个特征频率的缓慢漂移,提前一周预警"轴承存在早期磨损风险"。按传统计划检修,这台泵还能再跑三个月,但基于预警,客户提前安排了备件和检修窗口,拆开后发现轴承滚道已经出现明显点蚀,晚几天就可能导致非计划停机。这种价值不是靠一块屏幕能做出来的,而是靠HMI本地的边缘算力、历史数据积累和AI模型共同完成的。

4.4 冷静看待第三级跳:哪些是真需求,哪些是过度包装

这个领域现在热度很高,我确实见到不少厂商把"AI HMI"宣传得无所不能。分享一点踩过坑之后的经验:判断一个AI HMI方案是不是靠谱,不要看演示视频,要看三样东西——模型能不能离线推理、数据是不是存储在本地、推理结果能不能落到实际的工单或报警动作上。如果某个AI HMI必须全程联网才能工作,核心数据都上传到厂商平台,那本质上就是挂了个平板壳的云服务,跟"智慧大脑"没什么关系。

另外要清醒认识的是,第三级跳的落地前提是前两级已经做好:数据要素没有治理干净、设备联网都没有完全打通,直接上AI问答和知识图谱,大概率是空中楼阁。我见过一些工厂跳过第一二级直接买"AI HMI",结果AI没有数据可喂,知识图谱全是手工录入的通用知识,问什么都答不到点子上,最后设备闲置,被车间当普通触摸屏用了。所以进化论的三级跳,每一级都是上一级的必要条件,顺序不要乱。

5. 实战排坑:博图HMI仿真"按钮无反应",我是怎么一步步查出来的

前面讲了这么多进化论,很多同行可能已经在琢磨手里的老设备要不要动。在动手之前,先分享一个几乎每个跟西门子生态打过交道的人都踩过的坑——博图HMI仿真按钮无反应。这个问题的排查思路,比答案本身更有价值。

5.1 问题复现:画面能开,按钮点了像没点

现象很典型:在TIA Portal(博图)里做了个WinCC HMI画面,放了一个按钮,配置了事件和变量,点"开始仿真",画面正常弹出来,PLC也已经在仿真运行,但按屏幕上的按钮,对应的PLC变量就是不动。第一次遇到这个问题的工程师,十有八九会以为自己按钮属性配错了,然后把事件、连接、变量翻来覆去检查好几遍,依然无济于事。

我排查这个问题,从来不会直接去怀疑画面组态,而是先按"数据通路+事件触发+运行环境"三个维度拆开。

5.2 排查链路:从变量到按钮,再到运行库

第一步,先看PLC到底有没有收到信号。在TIA Portal里打开"转至在线",监控PLC侧的那个布尔变量,同时按HMI仿真画面里的按钮,看变量值有没有翻转。如果PLC变量没反应,说明问题在HMI侧或者通信侧;如果变量翻转了但设备没动作,那是PLC程序逻辑的问题,跟HMI无关。这一步能快速缩小排查范围。

第二步,确认HMI和PLC的连接类型。我见过很多"按钮无反应"的案例,是因为HMI仿真里选了"使用HMI设备与PLC之间的集成连接",但PLC程序已经改了IP或者改了硬件标识,仿真器找不到连接。解决方法是在HMI连接配置里重新建立连接,并确认连接机制是"集成"而非"未指定"。还有一种是连接正常但变量地址对不上,比如PLC变量实际地址是DB1.DBX0.0,HMI里却关联到了DB1.DBX0.1,这种错位在画面上是看不出来的,必须逐个变量核对符号名和绝对地址。

第三步也是大家最容易忽略的,检查按钮的事件类型。WinCC里按钮的"单击"事件不一定对应你直觉里的"按下",有些项目里按钮的触发事件被配置成了"释放",也就是说你按下去那一瞬间没反应,松手那一瞬间才触发。如果按键面板响应比较迟钝,这种"按下vs释放"的差别会被放大,看起来就像完全没反应。还有更隐蔽的:按钮上叠加了"可见性"或"使能"动画属性,某个PLC变量控制着按钮的可用状态,变量值不对时按钮是置灰的,画面里如果不仔细看根本发现不了。

5.3 终极疑难:运行库生成文件损坏

如果前三步都排除干净,按钮依然没反应,那就要怀疑到编译后的运行文件上了。这里就要提到一个很多工程师遇见过但说不清来源的文件:项目编译后生成的PDATA.FWC之类的运行数据文件。它通常在工程目录下按设备和目标路径归档存储,结构类似"zonea\im\hmi\c\2\generates\pdata.fwc"这种层级——这个名字不用纠结,不同版本、不同项目里会有差异,但它本质上是WinCC在编译HMI项目时生成的运行库数据,里面包含了画面定义、变量归档、脚本和协议配置的打包结果。

这类生成文件一旦损坏或者跟当前工程版本不一致,表现就非常奇怪:画面能编译、能下载、能打开,但某个按钮事件、某段脚本就是没有响应,甚至PLC变量都通着,就是触发不了动作。遇到这种情况,常规的"删除画面重做"是没用的,因为问题根本不在画面,而在编译产物。

正确的处理办法是:把项目先整体"清理编译"(Clean Compile),强制删除所有旧生成文件并重新生成一遍;如果还不行,手动找到工程目录下的生成文件(就是上面提到的pdata.fwc这类文件),把它们删除后重新编译下载。注意删除前先备份,毕竟每个版本的工程结构有差异,万一手一抖把源文件也删了,那才是真正的灾难。我实践下来,八成以上"仿真按钮无反应"的疑难杂症,靠这一步都能解决。

5.4 后遗症预防:把仿真环境做成"干净环境"

排完这个坑,最后说点预防经验。博图HMI仿真之所以容易出现这种"编译产物污染"问题,一个很重要的原因是工程文件长期在一个环境里反复修改、反复编译,多个版本的残留产物互相干扰。所以我现在负责的项目,都会做三件事:第一,HMI工程和PLC工程分目录管理,HMI编译产物定期清理;第二,仿真用独立的虚拟机或者独立用户环境,避免多个博图版本混装导致的DLL冲突;第三,每次改动HMI组态后,先"清理编译"再仿真,不要图省事只做增量编译。别小看这三个习惯,它们能帮你省掉大量莫名其妙的时间。

6. 三级跳之后的现实抉择:老产线怎么改、新项目怎么选

6.1 老产线到底要不要升级HMI

聊完进化论和排障,回到最实际的问题:我手里的老产线,到底要不要跟着做三级跳?我的答案是:先搞清楚瓶颈在哪,再决定跳不跳、跳几级。

如果产线现在最大的痛点是故障响应慢、操作工对设备状态不透明,那第一级跳(联网+数据上送+报警汇总)性价比最高,改造成本低、见效快;如果痛点是工艺参数波动大、需要现场快速分析数据,那第二级跳(边缘算力+本地趋势分析+轻量AI)值得投入;如果是设备故障导致非计划停机频繁、老师傅经验断层,那第三级跳(知识图谱+预测性维护+自然语言交互)才是对症的药。

最怕的情况是,工厂没有任何明确痛点,只是觉得"别人都AI了我也不能落后",盲目跟风升级。HMI升级不是换手机,每一级跳都伴随着硬件更新、软件重组态、操作工再培训和数据治理的成本。没有业务痛点支撑的升级,到头来只会变成一块性能过剩的高级屏幕。

6.2 新项目选HMI,我自己的判断框架

如果是新项目直接选HMI,我一般按五个维度打分:通信协议广度、边缘算力规格、软件生态开放性、AI扩展能力、后期维护成本。通信协议广度决定了这台设备能兼容多少老设备;边缘算力规格看CPU核数、内存大小、是否有NPU;软件生态开放性看是否支技OPC UA、MQTT、容器化部署;AI扩展能力看官方是否提供模型推理SDK;后期维护成本看品牌在本地有没有渠道和备件。

顺便说一句,很多人在选型时过度关注屏幕分辨率、外观厚度这些参数,反而忽略了最核心的"可编程能力"和"数据接口完整性"。工业HMI不是消费电子,它是要在恶劣环境里7×24小时连续跑的设备,稳定性和扩展性永远排在观感前面。

6.3 我的最终建议:进化不是换代,是能力注入

跟完这么多项目,我从头到尾有一个体会:HMI的进化,本质上不是"把旧设备扔掉换新设备",而是"给原来的交互节点注入新的能力"。最成功的改造项目,往往是那些让车间操作工感觉"屏幕还是那块屏幕,但用起来明显更聪明了"的项目。操作工不需要知道底层跑的是NPU还是大模型,他们只需要感受到:设备报警的时候,屏幕上会直接告诉他先查哪里;设备数据异常的时候,界面上会出现趋势和提示;对着屏幕问一句,它听得懂。

这三级跳走完,HMI才真正配得上"智慧大脑"这个称号。但从"傻白甜"到"智慧大脑",每一步都需要工程师扎扎实实把通信、数据、模型和场景串起来,没有哪一步是买一台设备就能自动完成的。如果你手头正好在评估产线的人机界面改造,我建议先回去把产线现有的变量清单和报警记录梳理一遍,那才是三级跳真正的起点。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 3:35:56

Python enumerate函数用法与性能优化全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 3:35:25

RT-Thread工业质检AI:低代码+RTOS原生支持的MCU端落地实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 3:34:08

Gemini 3.8 Flash:推理换性能的工程实践指南

1. 项目概述:这不是一次普通升级,而是一次“推理路径重写”Gemini 3.8 Flash——这个名字刚出现在Google官方博客里时,我正调试一个卡在响应延迟上的多模态文档解析服务。没点开详情页,光看标题里的“Flash”两个字,我…

作者头像 李华
网站建设 2026/9/11 3:31:06

华硕游戏本性能与色彩,G-Helper 3步搞定

华硕游戏本性能与色彩,G-Helper 3步搞定 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Expertbook, ROG…

作者头像 李华
网站建设 2026/9/11 3:30:03

高斯过程回归:原理、Python实现与不确定性预测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华