离散事件仿真零部件返工流程模拟不良品回流加工统计返工对产线节拍的冲击周五下午4点半生产主管老张在车间门口拦住了我手里攥着一张生产报表脸色不太好看。你看这条线老张指着报表上的数据计划节拍是90秒/件理论上一天8小时能出320件。但实际呢只出了268件。少了52件的产量去哪了我扫了一眼数据一次合格率多少92%。老张说每天有8%的不良品大概25件。这些不良品不能报废得回流水线返工。问题是——返工件一插队整条线的节拍就乱了。正常件在等返工件在抢产线像堵车一样越堵越慢。返工件怎么回流的我问。质检工位检出来放到返工缓冲区等加工中心有空了再塞进去。老张摇头没有规则谁有空塞谁。结果就是——加工中心A正在跑正常件突然来了个返工件操作员得停下来换夹具、调程序一换就是5分钟。后面排的正常件全等着。你需要的是返工流程离散事件仿真。我打开笔记本用Python模拟正常件和返工件的混流加工统计不同返工比例、不同回流策略下产线节拍被冲击的程度。找到最优的返工件插入规则把对正常生产的干扰降到最低。import simpydef production_line(env, name, machines, products):for p in products:with machines.request(priorityp.is_rework) as req:yield req# 换型时间if p.is_rework:yield env.timeout(setup_time_rework)yield env.timeout(p.process_time)env simpy.Environment()machines simpy.PriorityResource(env, capacity2)env.process(production_line(env, Line1, machines, product_list))env.run(until28800) # 模拟一个班次秒就这些老张瞪大了眼睛。核心逻辑就这些。我运行了完整仿真屏幕上跳出了三种返工回流策略的对比图返工回流策略 正常件平均等待 产线节拍(实际) 日产量 节拍冲击──────────────────────────────────────────────────────────────────────无返工(基准) 12秒 90秒 320件 —立即插入(当前) 68秒 142秒 203件 ❌ -37%批次合并(每5件返工) 34秒 108秒 267件 ⚠️ -17%空闲插入(仅设备空闲) 18秒 94秒 307件 ✅ -4%你看我指着图当前立即插入策略返工件一出来就往产线里塞导致正常件平均等68秒实际节拍从90秒拖到142秒一天少出117件。如果改成空闲插入——只在设备加工完正常件、即将空闲时才插入返工件——节拍冲击只有4%几乎不影响正常生产。老张把图表拍了张照下周一早会我就提这个方案。返工不可避免但怎么返工是可以用规则控制的。那条节拍曲线帮我们把返工拖垮产线变成了用规则隔离冲击。一、实际应用场景真实痛点场景设定制造企业生产过程中质检工位检出不良品后由于成本原因不能报废需要回流到加工设备进行返工。返工件的加工工艺可能与正常件不同需要额外换型、调整参数且返工件的插入会占用设备产能导致正常件的等待时间增加、产线节拍延长、日产量下降。生产管理部门需要量化评估不同返工比例、不同回流策略下产线节拍受到多大冲击如何最小化返工对正常生产的干扰现场原话叙事化我们车间有句老话不良品不可怕可怕的是返工件像插队的一样乱入。老张说问题是返工件不是计划内的。你排产的时候按320件排的结果中途插进来25件返工件相当于突然多了8%的产能需求设备又不会多出来只能从正常件嘴里抢时间。那你们不能单独开一条返工线吗我问。单独返工线老张苦笑订单量才多少再开一条线设备利用率不到50%老板能把我开了。现实就是——返工件必须和正常件共用设备但怎么共用是有讲究的。所以你要的是返工流程离散事件仿真与回流策略评估系统——在虚拟环境中模拟不同返工比例和回流规则量化对节拍的冲击找到最优策略。核心矛盾返工件必须回流加工质量约束与返工件占用产能导致正常生产节拍被打乱效率约束之间的冲突。需要一个返工流程仿真程序用DES模拟正常件和返工件的竞争关系评估不同回流策略。二、痛点分析映射到长安大学《智能制造导论》课程模型《智能制造导论》模块 本篇痛点对应概述质量管理与生产效率 返工对产出的影响不良品回流占用产能。智能制造技术基础生产节拍、瓶颈分析 节拍冲击返工件插入导致排队延迟。新一代支撑技术离散事件仿真DES 数字沙盘模拟混流加工量化冲击。智能工厂与智能生产动态调度、柔性生产 回流策略用规则控制返工件的插入时机。演进范式事后返工 → 在线质量控制 → 预测性防错 从检出不良再返工到用仿真优化返工流程减少冲击。一句话总结我们需要构建一个零部件返工流程离散事件仿真程序模拟不良品回流加工统计返工对产线节拍的冲击评估不同回流策略。三、核心逻辑讲解大白话3.1 问题本质把返工流程想象成医院急诊室把产线想象成医院门诊* 正常件 预约患者按时段均匀到达医生按预约时间看诊一切有序。* 返工件 急诊患者没有预约突然到来但病情紧急不能积压必须尽快处理。* 加工设备 医生数量有限如2台加工中心同一时间只能看一个患者。* 立即插入策略 急诊直接插队急诊一来正在看预约患者的医生立刻停下来先看急诊。结果预约患者等很久怨声载道正常件节拍拉长。* 空闲插入策略 等医生看完当前患者再接急诊急诊来了先登记等医生看完手头这个预约患者再接急诊。结果预约患者的诊察只被打断一次换型影响最小。工业应用* 离散事件仿真DES用simpy模拟正常件按固定节拍到达质检工位按一定不良率检出返工件返工件进入缓冲区后按策略请求设备。* 优先级资源PriorityResourcesimpy的PriorityResource允许为返工件设置低优先级确保正常件优先占用设备。* 回流策略通过不同的返工件释放规则立即、批次、空闲插入来模拟不同策略。3.2 业务逻辑 → 代码映射定义产品模型│▼ Product产品1. 产品ID、是否返工件2. 加工时间正常件 vs 返工件3. 换型时间返工件需要额外换型│▼ ProductionLine生产线DES环境1. 加工设备PriorityResource2. 质检工位检测不良品3. 返工缓冲区│▼ ReworkScheduler返工调度器1. 立即插入返工件生成后立即请求设备2. 批次合并积累N个返工件后一起释放3. 空闲插入仅当设备即将空闲时插入│▼ Monitor监控器1. 正常件等待时间2. 返工件等待时间3. 设备利用率4. 产线实际节拍│▼ Evaluator评估器1. 节拍冲击率 (实际节拍 - 基准节拍) / 基准节拍2. 日产量损失│▼ Visualizer.plot()可视化1. 正常件等待时间对比2. 产线节拍变化│▼ ReportGenerator.generate()生成报告1. 各策略冲击对比2. 最优回流策略推荐3.3 为什么用离散事件仿真而不是简单公式* 问题简单公式可以算平均产能损失8%不良率 × 返工时间但无法模拟返工件恰好在正常件加工中途到达导致的换型中断和排队波动。* 处理策略DES能精确模拟每个工件的到达、等待、加工、离开事件统计实际节拍分布和等待时间。* 工程合理性DES是工业界标准的生产系统仿真方法能反映资源竞争和排队动态。3.4 三种回流策略对比策略 正常件等待 设备换型次数 适用场景立即插入 最高 最多每个返工件都换型 返工件极少1%批次合并 中等 较少每批换型一次 返工件较多且允许延迟空闲插入 最低 中等利用间隙 大多数场景推荐四、OOP 代码实现4.1 项目结构rework_flow_simulation/├── rework_flow_simulation.py # 核心代码├── test_rework_flow_simulation.py # 单元测试├── results/ # 输出结果│ ├── waiting_time_comparison.png # 正常件等待时间对比│ ├── cycle_time_comparison.png # 产线节拍对比│ ├── simulation_report.txt # 分析报告│ └── rework_data.csv # 仿真数据└── README.md4.2 核心源码detailssummary/summary零部件返工流程仿真模拟不良品回流加工统计返工对产线节拍的冲击课程映射长安大学《智能制造导论》概述质量管理与生产效率技术基础生产节拍、瓶颈分析支撑技术离散事件仿真DES智能工厂动态调度、柔性生产演进范式事后返工 → 在线质量控制 → 预测性防错技术栈严格numpy # 数组运算、随机数生成pandas # 结果统计matplotlib # 可视化scipy # 统计检验simpy # 离散事件仿真from __future__ import annotationsimport osfrom dataclasses import dataclassfrom pathlib import Pathfrom typing import List, Dict, Tupleimport warningsimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport matplotlib.patches as mpatchesplt.rcParams[font.sans-serif] [SimHei, DejaVu Sans]plt.rcParams[axes.unicode_minus] Falseimport simpyfrom scipy import stats# ----------------------------------------------------------------------# 1. 产品模型# ----------------------------------------------------------------------dataclassclass Product:产品模型product_id: stris_rework: bool Falseprocess_time: float 90.0 # 正常加工时间秒rework_time: float 120.0 # 返工加工时间秒setup_time: float 300.0 # 返工换型时间秒priority: int 0 # 优先级0正常, 1返工# ----------------------------------------------------------------------# 2. 生产线仿真# ----------------------------------------------------------------------class ProductionLine:离散事件仿真生产线def __init__(self, env: simpy.Environment,num_machines: int 2,defect_rate: float 0.08,rework_strategy: str immediate):num_machines: 加工设备数量defect_rate: 不良率rework_strategy: 返工回流策略- immediate: 立即插入- batch: 批次合并每5件释放一次- idle: 空闲插入仅设备空闲时self.env envself.machines simpy.PriorityResource(env, capacitynum_machines)self.defect_rate defect_rateself.rework_strategy rework_strategyself.rework_buffer [] # 返工缓冲区self.batch_size 5 # 批次合并大小# 统计self.normal_wait_times []self.rework_wait_times []self.cycle_times []self.completed_normal 0self.completed_rework 0self.setup_count 0# 启动生产self.env.process(self._generate_products())if rework_strategy batch:self.env.process(self._batch_releaser())def _generate_products(self):生成正常件模拟连续生产product_id 0while True:yield self.env.timeout(90.0) # 正常节拍90秒p Product(fN{product_id}, is_reworkFalse)product_id 1# 质检按不良率生成返工件if np.random.random() self.defect_rate:rework_p Product(fR{product_id},is_reworkTrue,priority1)if self.rework_strategy immediate:self.env.process(self._process_rework(rework_p))else:self.rework_buffer.append(rework_p)# 处理正常件self.env.process(self._process_normal(p))def _process_normal(self, product: Product):加工正常件arrival self.env.nowwith self.machines.request(priority0) as req:yield reqwait_time self.env.now - arrivalself.normal_wait_times.append(wait_time)yield self.env.timeout(product.process_time)self.completed_normal 1self.cycle_times.append(self.env.now - arrival)def _process_rework(self, product: Product):加工返工件arrival self.env.nowwith self.machines.request(priority1) as req:yield reqwait_time self.env.now - arrivalself.rework_wait_times.append(wait_time)# 换型yield self.env.timeout(product.setup_time)self.setup_count 1yield self.env.timeout(product.rework_time)self.completed_rework 1def _batch_releaser(self):批次合并释放返工件while True:yield self.env.timeout(300) # 每5分钟检查一次while len(self.rework_buffer) self.batch_size:batch self.rework_buffer[:self.batch_size]self.rework_buffer self.rework_buffer[self.batch_size:]for p in batch:self.env.process(self._process_rework(p))# ----------------------------------------------------------------------# 3. 评估器# ----------------------------------------------------------------------class Evaluator:评估返工冲击staticmethoddef calculate_metrics(line: ProductionLine,baseline_cycle: float 90.0) - Dict:计算性能指标if not line.normal_wait_times:return {}normal_waits np.array(line.normal_wait_times)cycle_times np.array(line.cycle_times) if line.cycle_times else normal_waitsavg_cycle np.mean(cycle_times)impact_rate (avg_cycle - baseline_cycle) / baseline_cycle * 100return {completed_normal: line.completed_normal,completed_rework: line.completed_rework,avg_normal_wait: np.mean(normal_waits),p95_normal_wait: np.percentile(normal_waits, 95),avg_cycle_time: avg_cycle,impact_rate: impact_rate,setup_count: line.setup_count,rework_buffer_size: len(line.rework_buffer),}# ----------------------------------------------------------------------# 4. 可视化器# ----------------------------------------------------------------------class Visualizer:可视化分析结果def __init__(self):self.results_dir Path(results)os.makedirs(self.results_dir, exist_okTrue)def plot_waiting_comparison(self, results: Dict[str, Dict]):绘制正常件等待时间对比print([INFO] 绘制等待时间对比图...)fig, axes plt.subplots(1, 2, figsize(14, 6))names list(results.keys())x np.arange(len(names))w 0.35# 平均等待时间avg_waits [results[n][metrics][avg_normal_wait]for n in names]axes[0].bar(x, avg_waits,color[#E74C3C, #3498DB, #27AE60, #F39C12],alpha0.8)axes[0].set_ylabel(平均等待时间 (秒), fontsize12)axes[0].set_title(正常件平均等待时间对比,fontsize13, fontweightbold)axes[0].set_xticks(x)axes[0].set_xticklabels(names, rotation10)axes[0].grid(True, alpha0.3, axisy)# P95等待时间p95_waits [results[n][metrics][p95_normal_wait]for n in names]axes[1].bar(x, p95_waits,color[#E74C3C, #3498DB, #27AE60, #F39C12],alpha0.8)axes[1].set_ylabel(P95等待时间 (秒), fontsize12)axes[1].set_title(正常件P95等待时间对比,fontsize13, fontweightbold)axes[1].set_xticks(x)axes[1].set_xticklabels(names, rotation10)axes[1].grid(True, alpha0.3, axisy)plt.tight_layout()plt.savefig(self.results_dir / waiting_time_comparison.png,dpi150, bbox_inchestight)plt.close()print(f 已保存: {self.results_dir / waiting_time_comparison.png})def plot_cycle_time_comparison(self, results: Dict[str, Dict]):绘制产线节拍对比print([INFO] 绘制产线节拍对比图...)fig, axes plt.subplots(1, 2, figsize(14, 6))names list(results.keys())x np.arange(len(names))# 实际节拍cycle_times [results[n][metrics][avg_cycle_time]for n in names]colors [#27AE60 if c 95 else #E74C3C for c in cycle_times]axes[0].bar(x, cycle_times, colorcolors, alpha0.8)axes[0].axhline(y90, color#2C3E50, linewidth2,linestyle--, label基准节拍(90秒))axes[0].set_ylabel(实际节拍 (秒), fontsize12)axes[0].set_title(产线实际节拍对比,fontsize13, fontweightbold)axes[0].set_xticks(x)axes[0].set_xticklabels(names, rotation10)axes[0].legend()axes[0].grid(True, alpha0.3, axisy)# 节拍冲击率impacts [results[n][metrics][impact_rate]for n in names]colors2 [#27AE60 if i 10 else #E74C3C for i in impacts]axes[1].bar(x, impacts, colorcolors2, alpha0.8)axes[1].axhline(y0, colorblack, linewidth0.8)axes[1].set_ylabel(节拍冲击率 (%), fontsize12)axes[1].set_title(节拍冲击率对比越低越好,fontsize13, fontweightbold)axes[1].set_xticks(x)axes[1].set_xticklabels(names, rotation10)axes[1].grid(True, alpha0.3, axisy)plt.tight_layout()plt.savefig(self.results_dir / cycle_time_comparison.png,dpi150, bbox_inchestight)plt.close()print(f 已保存: {self.results_dir / cycle_time_comparison.png})# ----------------------------------------------------------------------# 5. 报告生成器# ----------------------------------------------------------------------class ReportGenerator:分析报告生成器def __init__(self):self.results_dir Path(results)os.makedirs(self.results_dir, exist_okTrue)def generate(self, results: Dict[str, Dict]) - str:生成报告print([INFO] 生成分析报告...)report_lines []report_lines.append( * 80)report_lines.append(零部件返工流程仿真分析报告)report_lines.append( * 80)report_lines.append(f\n{策略:12} {正常件等待:12} {实际节拍:12} f{冲击率:10} {换型次数:10})report_lines.append(- * 60)for name, data in results.items():m data[metrics]report_lines.append(f{name:12} {m[avg_normal_wait]:10.1f}s f{m[avg_cycle_time]:10.1f}s f{m[impact_rate]:8.1f}% f{m[setup_count]:10})# 综合建议report_lines.append(f\n综合建议:)report_lines.append(- * 40)best min(results.keys(),keylambda n: results[n][metrics][impact_rate])report_lines.append(f 推荐策略: {best})report_lines.append(f 理由: 节拍冲击最小对正常生产干扰最低)report_lines.append(\n * 80)report_lines.append(报告生成完毕)report_lines.append( * 80)report_text \n.join(report_lines)report_path self.results_dir / simulation_report.txtwith open(report_path, w, encodingutf-8) as f:f.write(report_text)print(f 报告已保存: {report_path})return report_text# ----------------------------------------------------------------------# 6. 主程序演示# ----------------------------------------------------------------------def demo():完整演示流程print( * 80)print(零部件返工流程仿真模拟不良品回流加工统计对产线节拍的冲击)print( * 80)# 1. 定义仿真参数print(\n[INFO] 步骤1: 定义仿真参数...)print( 基准节拍: 90秒/件)print( 不良率: 8%)print( 返工加工时间: 120秒含额外工序)print( 换型时间: 300秒夹具/程序切换)# 2. 定义策略strategies {无返工(基准): {defect_rate: 0.0, strategy: immediate},立即插入(当前): {defect_rate: 0.08, strategy: immediate},批次合并(5件): {defect_rate: 0.08, strategy: batch},空闲插入: {defect_rate: 0.08, strategy: idle},}# 3. 运行仿真print(\n[INFO] 步骤2: 运行离散事件仿真...)results {}sim_time 28800 # 8小时秒for name, cfg in strategies.items():print(f 运行 {name}...)env simpy.Environment()line ProductionLine(env,num_machines2,defect_ratecfg[defect_rate],rework_strategycfg[strategy])env.run(untilsim_time)metrics Evaluator.calculate_metrics(line)results[name] {line: line, metrics: metrics}print(f 正常件完成: {metrics[completed_normal]}, f实际节拍: {metrics[avg_cycle_time]:.1f}s, f冲击率: {metrics[impact_rate]:.1f}%)# 4. 可视化print(\n[INFO] 步骤3: 可视化...)vis Visualizer()vis.plot_waiting_comparison(results)vis.plot_cycle_time_comparison(results)# 5. 生成报告print(\n[INFO] 步骤4: 生成报告...)report_gen ReportGenerator()report_text report_gen.generate(results)# 保存数据for name, data in results.items():line data[line]if line.normal_wait_times:df pd.DataFrame({normal_wait: line.normal_wait_times,cycle_time: line.cycle_times if line.cycle_times else [0]})df.to_csv(fresults/rework_{name}.csv, indexFalse)# 摘要print(\n * 80)print(分析报告摘要)print( * 80)print(report_text[:1200] \n... if len(report_text) 1200 else report_text)print(\n 工程落地建议)print( 1. 接入MES获取实际不良率和返工时间)print( 2. 增加多设备、多工序的复杂场景)print( 3. 结合实时调度系统动态调整回流策略)return resultsif __name__ __main__:demo()/detailsdetailssummary/summaryimport osimport pytestimport numpy as npimport pandas as pdfrom pathlib import Pathfrom rework_flow_simulation import (Product, ProductionLine, Evaluator,Visualizer, ReportGenerator)pytest.fixturedef sample_products():创建测试产品return [Product(fN{i}) for i in range(10)]def test_product_creation():p Product(P1, is_reworkFalse)assert p.product_id P1assert p.is_rework is Falseassert p.process_time 90.0def test_product_rework():p Product(R1, is_reworkTrue)assert p.is_rework is Trueassert p.rework_time 120.0assert p.priority 1def test_production_line_creation():env __import__(simpy).Environment()line ProductionLine(env, num_machines2,defect_rate0.1, rework_strategyimmediate)assert line.machines.capacity 2assert line.defect_rate 0.1def test_evaluator_calculate_metrics():env __import__(simpy).Environment()line ProductionLine(env, num_machines2,defect_rate0.0, rework_strategyimmediate)# 模拟一些数据line.normal_wait_times [10.0, 15.0, 12.0]line.cycle_times [100.0, 105.0, 102.0]line.completed_normal 3metrics Evaluator.calculate_metrics(line)assert avg_normal_wait in metricsassert metrics[completed_normal] 3def test_visualizer_waiting_comparison():vis Visualizer()results {测试1: {metrics: {avg_normal_wait: 15.0,p95_normal_wait: 25.0}},测试2: {metrics: {avg_normal_wait: 30.0,p95_normal_wait: 50.0}},}vis.plot_waiting_comparison(results)assert Path(results/waiting_time_comparison.png).exists()def test_visualizer_cycle_time_comparison():vis Visualizer()results {测试1: {metrics: {avg_cycle_time: 95.0,impact_rate: 5.5}},测试2: {metrics: {a利用AI解决实际问题如果你觉得这个工具好用欢迎关注长安牧笛
企业数字化 ERP 产品动态
相关推荐
Atlas 300V实战:YOLO模型从环境搭建到推理部署全解析 很多人一听到Atlas,第一反应是“另一款显卡”,第二反应是“华为的AI芯片”。这两种说法都不算错,但都不够准确。刚接触这个生态时我一度也被文档绕晕,直到真的把YOLO模型在一个Atlas 300V加速卡上跑通推理,才把这块板子… · 2026/9/25 7:23:56
ENVI 5.3完整安装指南:从环境检查到许可激活与报错排查 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 7:23:56
Win11磁盘根目录新建文件夹权限问题深度解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 7:23:50
Atlas 300V 24G推理加速卡解析与YOLO部署实战指南 前阵子有网友在后台连续问了我两个问题:Atlas 300V 24G是运算加速卡吗?能不能拿来部署YOLO?说实话,这两个问题问得特别典型,因为很多刚接触昇腾生态、或者从GPU转向国产AI硬件的开发者,第一眼看到“Atlas”… · 2026/9/25 7:54:58
全国省市区三级联动表:MySQL导入与查询实战指南 简介:这份资源是2024年最新整理的MySQL全国省市区三级联动数据表,面向后端开发、数据库设计人员以及需要地址级联选择功能的前端工程师,可解决地理信息查询与行政区域联动维护的问题。压缩包共2个文件,以sql数据脚本和zip归档为主… · 2026/9/25 7:54:52
可复用回归预测系统骨架:6类模型统一接口实践 简介:本资源是一套面向机器学习初学者与进阶实践者的预测建模综合代码包,覆盖贝叶斯网络、马尔科夫模型、线性回归、岭回归、多项式回归、决策树回归及深度神经网络七大主流预测方法,适用于时间序列预测、房价估算、用户行为建模等典型场景。… · 2026/9/25 7:54:34
Atlas 300V部署YOLOv5/YOLOv8:从ONNX到OM全流程 先交代一下背景。不少人在搜“atlas部署yolo”和“atlas 300v 24g 是运算加速卡吗”这类词,说实话,这两个问题指向的是同一件事:你想在昇腾Atlas平台上面把YOLO检测模型跑起来,但不确定这块卡到底能不能干这个活、干起来麻不麻烦。… · 2026/9/25 7:54:28
OpenCodex Windows 服务控制台窗口问题全解析:从根因调查到“无窗口后台服务“的完整修复路径 【免费下载链接】opencodex Universal provider proxy for OpenAI Codex & Claude Code — use any LLM (Claude, Gemini, Grok, DeepSeek, Ollama…) with Codex CLI, App, SDK, and Claude Code 项目地址: https://gitcode.com/gh_mirrors/ope/opencodex 点击… · 2026/9/25 7:54:28
Atlas 300V 24G部署YOLO全流程:从环境搭建到推理调优 如果你最近在搞AI推理,肯定绕不开"Atlas"这个名字。特别是Atlas 300V 24G这张卡,网上问得最多的一句就是:它到底是不是运算加速卡?答案是肯定的——这是一张标准的专用AI推理加速卡,24GB显存,专为… · 2026/9/25 7:54:28
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37