python的工业过程控制场景模拟第一百零七篇:开发算法实现机器人跟随工艺生产节拍动态调整巡检周期。

发布时间:2026/11/16 2:15:42

python的工业过程控制场景模拟第一百零七篇:开发算法实现机器人跟随工艺生产节拍动态调整巡检周期。 机器人动态巡检周期调节算法 —— 基于生产节拍的自适应同步控制“那年动力电池装配车间巡检机器人在产线满节拍时还在按固定 5 分钟一圈慢慢转结果涂布机异常升温 10 分钟才被发现报废了整卷极片。后来我们用节拍耦合 滑动窗口预测让机器人跟着产线速度‘呼吸’高峰期 30 秒扫一次低谷期 5 分钟一圈再也没出现过滞后报警。”—— 哈尔滨工程大学《工业过程控制》课程核心思想延伸一、实际应用场景描述在锂电池涂布、半导体晶圆加工、汽车焊装等高节拍生产中工艺设备运行频率 ≠ 巡检机器人固定周期极易造成关键异常发现滞后┌──────────────────────────────────────────────┐│ 机器人动态巡检周期调节系统 ││ ││ [上位机节拍感知与调度层] ││ │ PLC心跳 / MES工单 / 设备OEE ││ ▼ ││ ┌────────────────────────────┐ ││ │ 节拍特征提取层 │ ││ │ ┌──────────────────────┐ │ ││ │ │ 1. 产线CTCycle Time│ │ ││ │ │ 实时采集与滤波 │ │ ││ │ └──────────────────────┘ │ ││ │ ┌──────────────────────┐ │ ││ │ │ 2. 设备稼动率 │ │ ││ │ │ (Running/Idle/Down)│ │ ││ │ └──────────────────────┘ │ ││ │ ┌──────────────────────┐ │ ││ │ │ 3. 工艺异常倾向 │ │ ││ │ │ (温度/振动趋势) │ │ ││ └────────────┬───────────────┘ ││ │ 节拍状态向量 ││ ┌───────┴───────┐ ││ ▼ ▼ ││ ┌─────────┐ ┌─────────┐ ││ │ 周期决策引擎 │ │ 路径重规划器 │ ││ │ • PID调节 │ │ • 关键点插补 │ ││ │ • 模糊规则 │ │ • 避障绕行 │ ││ │ • 优先级队列 │ │ • 最短路径 │ ││ └────┬────┘ └────┬────┘ ││ │ 巡检周期T │ 动态航点序列 ││ ▼ ▼ ││ ┌────────────────────────────┐ ││ │ 机器人执行层 │ ││ │ • SLAM定位(1kHz) │ ││ │ • 多传感器融合 │ ││ │ • 急停/安全域控制 │ ││ └────────────┬───────────────┘ ││ │ 实时状态反馈 ││ ▼ ││ ┌────────────────────────────┐ ││ │ 物理世界 (高洁净车间) │ ││ │ 工艺设备 (CT30s~5min) │ ││ │ 巡检机器人 (激光/热像) │ ││ │ ️ 关键测点 (温度/振动) │ ││ │ ⏱️ 生产节拍 (严格同步) │ ││ └───────────────────────────┘ ││ ││ 核心: 节拍感知 周期自适应 优先级插队 同步巡检 │└──────────────────────────────────────────────┘固定周期巡检 vs 动态节拍跟随维度 固定周期巡检 动态节拍跟随巡检巡检时机 ❌ 与产线异步可能错过异常上升期 ✅ 与工艺节拍同步关键工序必检高峰期覆盖 ❌ 异常频发时段采样不足 ✅ 节拍越快巡检越密资源占用 ❌ 低谷期空跑浪费电量 ✅ 低谷期休眠/慢巡节能异常发现 ❌ 滞后 3~10 分钟 ✅ 秒级同步30 秒内响应设备磨损 ❌ 电机频繁启停 ✅ 速度平滑调节减少冲击二、引入痛点2.1 现场的真实困境场景 现场发生了什么 根因“涂布机过热” “极片边缘鼓包废卷 200 米” 巡检周期 5min 温升时间常数 2min“焊点虚焊” “300 台车身返工” 机器人按固定路线走错过焊枪冷却异常“洁净室压差” “整批晶圆污染” 压差波动快于巡检采样频率“能耗浪费” “夜班产线停机机器人还在满速跑” 无节拍感知无法自适应降频“急停频繁” “机器人频繁撞上移动设备” 静态路径规划无法应对动态节拍2.2 核心矛盾巡检的本质不是“定时打卡”而是“风险同步”。固定周期巡检假设风险均匀分布而实际生产中风险随节拍加速呈指数增长。解决方案是建立“生产节拍—风险等级—巡检周期”的闭环映射让机器人像心脏一样跟着产线“脉搏”跳动。2.3 我们要解决什么用一段精简的 Python 程序构建一个 机器人动态巡检周期调节系统实现1. 节拍感知 —— 实时采集产线 CT、稼动率、工艺参数2. 风险量化 —— 基于温度变化率、振动趋势计算风险等级3. 周期决策 —— PID 模糊规则自适应调整巡检周期4. 优先级调度 —— 关键工位插队巡检5. 平滑变速 —— S 曲线加减速避免电机冲击6. 可视化 —— 节拍、风险、周期、能耗联动展示三、核心逻辑讲解3.1 理论基础节拍耦合与自适应控制本工具基于哈工程《工业过程控制》第三章“时域分析”、第六章“PID 控制”和第十一章“非线性与自适应控制”① 生产节拍模型定义产线节拍Cycle TimeCT(t) \frac{T_{process}}{N_{stations}}其中 T_{process} 为单件总工时 N_{stations} 为工位数量。② 风险量化模型综合风险指数 R(t) R(t) w_1 \cdot \frac{dT}{dt} w_2 \cdot \frac{dV}{dt} w_3 \cdot (1 - \eta(t))其中- \frac{dT}{dt} 温度变化率°C/min- \frac{dV}{dt} 振动变化率mm/s³- \eta(t) 设备稼动率- w_i 权重系数③ PID 周期调节器目标使巡检周期 T_{inspect} 跟踪理想周期 T_{ref} 与 CT 成正比T_{ref}(t) k_{ct} \cdot CT(t)PID 控制律\Delta T(t) K_p e(t) K_i \int e(t)dt K_d \frac{de(t)}{dt}其中 e(t) T_{ref}(t) - T_{inspect}(t)④ S 曲线速度规划为避免电机冲击采用五次多项式规划v(t) a_0 a_1t a_2t^2 a_3t^3 a_4t^4 a_5t^5边界条件 v(0)0, v(T)v_{max}, a(0)a(T)03.2 控制架构总览┌─────────────┐│ 产线PLC/MES ││ (CT/稼动率) │└──────┬──────┘│ 实时数据流┌─────────▼─────────┐│ 节拍特征提取器 ││ • 滑动平均滤波 ││ • 异常值剔除 ││ • 趋势预测 │└─────────┬─────────┘│ 节拍特征向量┌─────────▼─────────┐│ 风险量化评估器 ││ • 温度变化率 ││ • 振动趋势 ││ • 稼动率加权 │└─────────┬─────────┘│ 风险等级 R(t)┌─────────▼─────────┐│ 周期决策引擎 ││ • PID调节器 ││ • 模糊规则修正 ││ • 上下限约束 │└─────────┬─────────┘│ 目标巡检周期 T┌─────────▼─────────┐│ 优先级调度器 ││ • 关键工位插队 ││ • 路径重规划 ││ • 冲突消解 │└─────────┬─────────┘│ 动态巡检计划▼┌─────────────┐│ 机器人执行层 ││ (SLAM运动控制)│└─────────────┘四、代码讲解面向对象设计4.1 类结构总览类名 职责 设计模式ProductionBeat 生产节拍数据dataclass 值对象RiskAssessment 风险量化评估器 策略模式PIDPeriodRegulator PID 周期调节器 模板方法FuzzyRuleBase 模糊规则库 规则引擎PriorityScheduler 优先级调度器 责任链InspectionPoint 巡检点实体 实体对象RobotController 机器人运动控制器 状态模式FleetSimulator 集群仿真器聚合根 聚合根VisualizationEngine 可视化引擎 封装4.2 核心代码完整可运行完整源码约 520 行包含 8 个类、节拍感知、PID 调节、模糊决策、可视化。以下为精简核心版完整代码可直接复制运行。detailssummary 完整源码点击展开/折叠/summary机器人动态巡检周期调节算法 —— 基于生产节拍的自适应同步控制参考哈尔滨工程大学《工业过程控制》第三章时域分析与第六章PID控制from dataclasses import dataclass, fieldfrom typing import List, Dict, Tuple, Optional, Callablefrom enum import Enum, autoimport numpy as npimport matplotlib.pyplot as pltfrom collections import dequeimport timeimport randomfrom datetime import datetimeimport math# # 1. 基础数据结构# dataclassclass ProductionBeat:生产节拍数据 —— 值对象timestamp: floatcycle_time: float # 单件节拍 (s)oee: float # 设备综合效率 (0~1)station_count: int # 工位数product_type: str defaultpropertydef throughput(self) - float:单位时间产量 (件/分钟)return 60.0 / self.cycle_time if self.cycle_time 0 else 0propertydef ideal_inspection_period(self) - float:理论最佳巡检周期与节拍挂钩# 关键假设至少覆盖每个工位的1次完整循环return self.cycle_time * self.station_count * 0.8 # 留20%余量dataclassclass SensorReading:传感器读数timestamp: floattemperature: float 25.0vibration: float 0.0pressure: float 101325.0def derivative(self, other, dt: float 1.0) - SensorReading:计算变化率if dt 1e-6:return SensorReading(self.timestamp, 0, 0, 0)return SensorReading(self.timestamp,(self.temperature - other.temperature) / dt,(self.vibration - other.vibration) / dt,(self.pressure - other.pressure) / dt)dataclassclass InspectionPoint:巡检点 —— 实体对象point_id: strposition: Tuple[float, float]criticality: int 1 # 1普通, 2重要, 3关键last_inspected: float 0.0sensor_history: deque field(default_factorylambda: deque(maxlen10))def add_reading(self, reading: SensorReading):self.sensor_history.append(reading)self.last_inspected reading.timestampdef get_trend(self) - Optional[SensorReading]:获取变化趋势if len(self.sensor_history) 2:return Nonereturn self.sensor_history[-1].derivative(self.sensor_history[-2],self.sensor_history[-1].timestamp - self.sensor_history[-2].timestamp)# # 2. 风险量化评估器# class RiskAssessment:风险量化评估器 —— 策略模式def __init__(self, w_temp0.4, w_vib0.4, w_oee0.2):self.w_temp w_tempself.w_vib w_vibself.w_oee w_oeeself.temp_baseline 25.0self.vib_baseline 0.1def assess(self, beat: ProductionBeat,point: InspectionPoint) - float:计算综合风险指数 (0~1)trend point.get_trend()if trend is None:return 0.0# 温度变化率风险temp_risk min(abs(trend.temperature) / 10.0, 1.0)# 振动变化率风险vib_risk min(abs(trend.vibration) / 5.0, 1.0)# 稼动率风险低稼动率意味着不稳定oee_risk 1.0 - beat.oee# 关键性加权criticality_factor {1: 1.0, 2: 1.5, 3: 2.0}.get(point.criticality, 1.0)risk (self.w_temp * temp_risk self.w_vib * vib_risk self.w_oee * oee_risk) * criticality_factorreturn min(risk, 1.0)# # 3. PID周期调节器# class PIDPeriodRegulator:PID周期调节器 —— 模板方法def __init__(self, kp0.8, ki0.1, kd0.3):self.kp kpself.ki kiself.kd kdself.integral 0.0self.prev_error 0.0self.prev_time time.time()self.min_period 10.0 # 最小巡检周期 (s)self.max_period 300.0 # 最大巡检周期 (s)def regulate(self, target_period: float, current_period: float) - float:PID调节巡检周期now time.time()dt now - self.prev_timeif dt 1e-6:return current_perioderror target_period - current_period# 比例项p_term self.kp * error# 积分项抗积分饱和self.integral error * dtself.integral max(-50, min(50, self.integral))i_term self.ki * self.integral# 微分项d_term self.kd * (error - self.prev_error) / dt# PID输出adjustment p_term i_term d_term# 更新状态self.prev_error errorself.prev_time now# 应用调整并限制范围new_period current_period adjustmentnew_period max(self.min_period, min(self.max_period, new_period))return new_perioddef reset(self):重置PID状态self.integral 0.0self.prev_error 0.0self.prev_time time.time()# # 4. 模糊规则库# class FuzzyRuleBase:模糊规则库 —— 规则引擎def __init__(self):self.rules [# (风险等级, 节拍状态) - 周期调整因子((0.0, 0.3), low_risk), # 低风险((0.3, 0.7), medium_risk), # 中风险((0.7, 1.0), high_risk), # 高风险]def evaluate(self, risk: float, beat: ProductionBeat) - float:基于模糊规则调整周期# 确定风险等级if risk 0.3:base_factor 1.2 # 低风险延长周期elif risk 0.7:base_factor 1.0 # 中风险维持周期else:base_factor 0.5 # 高风险缩短周期# 根据节拍微调ct_factor 1.0if beat.cycle_time 30: # 超高速节拍ct_factor 0.7elif beat.cycle_time 60: # 高速节拍ct_factor 0.9elif beat.cycle_time 180: # 低速节拍ct_factor 1.3# 稼动率影响oee_factor 1.0if beat.oee 0.7: # 低稼动率oee_factor 1.2elif beat.oee 0.95: # 高稼动率oee_factor 0.9return base_factor * ct_factor * oee_factor# # 5. 优先级调度器# class PriorityScheduler:优先级调度器 —— 责任链def __init__(self):self.points: List[InspectionPoint] []self.emergency_queue: List[InspectionPoint] []def add_point(self, point: InspectionPoint):self.points.append(point)def request_emergency_inspection(self, point_id: str):请求紧急巡检插队for point in self.points:if point.point_id point_id:if point not in self.emergency_queue:self.emergency_queue.append(point)print(f 紧急巡检请求: {point_id})breakdef get_next_target(self, current_time: float,inspection_period: float) - Optional[InspectionPoint]:获取下一个巡检目标# 优先处理紧急队列if self.emergency_queue:return self.emergency_queue.pop(0)# 按优先级和时间排序due_points [p for p in self.pointsif current_time - p.last_inspected inspection_period *{1: 1.0, 2: 0.7, 3: 0.4}[p.criticality]]if not due_points:return None# 按关键性和等待时间排序return max(due_points, keylambda p: (p.criticality,current_time - p.last_inspected))# # 6. 机器人运动控制器# class RobotController:机器人运动控制器 —— 状态模式def __init__(self, max_speed1.5, max_accel0.5):self.position (0.0, 0.0)self.target (0.0, 0.0)self.max_speed max_speedself.max_accel max_accelself.current_speed 0.0self.state idle# S曲线参数self.traj_start_time 0.0self.traj_duration 0.0self.traj_start_pos (0.0, 0.0)self.traj_end_pos (0.0, 0.0)def set_target(self, target: Tuple[float, float]):设置目标点并规划S曲线self.target targetself.traj_start_pos self.positionself.traj_end_pos targetself.traj_start_time time.time()# 计算轨迹时长基于距离和速度约束dist math.sqrt((target[0] - self.position[0])**2 (target[1] - self.position[1])**2)self.traj_duration max(dist / self.max_speed, 2.0)self.state movingdef quintic_s_curve(self, t: float) - float:五次多项式S曲线if t 0:return 0.0if t 1:return 1.0# 五次多项式s(t) 10t³ - 15t⁴ 6t⁵return 10*t**3 - 15*t**4 6*t**5def update(self, dt: float) - bool:更新机器人状态返回是否到达目标if self.state ! moving:return Falseelapsed time.time() - self.traj_start_timeprogress min(elapsed / self.traj_duration, 1.0)# S曲线插值s self.quintic_s_curve(progress)# 更新位置self.position (self.traj_start_pos[0] (self.traj_end_pos[0] - self.traj_start_pos[0]) * s,self.traj_start_pos[1] (self.traj_end_pos[1] - self.traj_start_pos[1]) * s)# 更新速度ds_dt 30*progress**2 - 60*progress**3 30*progress**4self.current_speed ds_dt * (math.sqrt((self.traj_end_pos[0] - self.traj_start_pos[0])**2 (self.traj_end_pos[1] - self.traj_start_pos[1])**2) / max(self.traj_duration, 1e-6))if progress 1.0:self.state idleself.current_speed 0.0return Truereturn Falsedef emergency_stop(self):急停self.state idleself.current_speed 0.0print( 机器人急停)# # 7. 集群仿真器聚合根# class FleetSimulator:机器人巡检集群仿真器 —— 聚合根def __init__(self, num_points8):self.beat_history deque(maxlen100)self.current_beat ProductionBeat(timestamptime.time(),cycle_time60.0,oee0.85,station_count6)self.risk_assessor RiskAssessment()self.pid_regulator PIDPeriodRegulator()self.fuzzy_rules FuzzyRuleBase()self.scheduler PriorityScheduler()self.robot RobotController()self.inspection_period 60.0 # 当前巡检周期self.last_inspection_time 0.0self.stats {total_inspections: 0,emergency_inspections: 0,risk_events: 0,energy_consumption: 0.0,start_time: time.time()}# 初始化巡检点self._init_inspection_points(num_points)# 传感器模拟self.sensor_noise 0.1self.temp_trend 0.0self.running Falsedef _init_inspection_points(self, num_points: int):初始化巡检点for i in range(num_points):point InspectionPoint(point_idfP{i1:02d},position(random.uniform(0, 100), random.uniform(0, 80)),criticalityrandom.choice([1, 1, 1, 2, 3]) # 偏重普通点)self.scheduler.add_point(point)print(f 初始化 {num_points} 个巡检点:)for point in self.scheduler.points:crit_icon {1: , 2: , 3: }[point.criticality]print(f {crit_icon} {point.point_id}: 位置{point.position})def simulate_production_beat(self, t: float):模拟生产节拍变化# 模拟班次变化shift_phase (t % 1440) / 1440 # 24小时周期if shift_phase 0.3: # 早班高峰base_ct 30 10 * math.sin(2*math.pi*t/300) # 30s节拍波动oee 0.92 0.05 * math.sin(2*math.pi*t/600)elif shift_phase 0.7: # 中班平稳base_ct 45 5 * math.sin(2*math.pi*t/400)oee 0.88 0.03 * math.sin(2*math.pi*t/800)else: # 夜班低谷base_ct 90 20 * math.sin(2*math.pi*t/600)oee 0.75 0.10 * math.sin(2*math.pi*t/1200)# 随机设备故障if random.random() 0.001: # 0.1%概率故障base_ct * 2oee * 0.5self.current_beat ProductionBeat(timestampt,cycle_timemax(base_ct, 15.0),oeemax(min(oee, 0.99), 0.5),station_count6,product_typebattery_cell)self.beat_history.append(self.current_beat)def simulate_sensor_readings(self, point: InspectionPoint, t: float):模拟传感器读数# 基础温度随节拍升高base_temp 25 20 * (1 - self.current_beat.oee)# 风险趋势if point.criticality 3: # 关键点更容易异常self.temp_trend random.uniform(-0.1, 0.3)else:self.temp_trend random.uniform(-0.05, 0.05)self.temp_trend max(0, min(self.temp_trend, 5.0))temp base_temp self.temp_trend random.normalvariate(0, self.sensor_noise)vib 0.1 0.05 * self.temp_trend random.normalvariate(0, 0.01)reading SensorReading(t, temp, vib)point.add_reading(reading)# 检测高风险if temp 60 or vib 1.0:self.stats[risk_events] 1self.scheduler.request_emergency_inspection(point.point_id)def adjust_inspection_period(self):动态调整巡检周期# 计算目标周期target_period self.current_beat.ideal_inspection_period# PID调节pid_period self.pid_regulator.regulate(target_period, self利用AI解决实际问题如果你觉得这个工具好用欢迎关注长安牧笛
延伸阅读

更多相关文章

2026/11/14 22:06:53

基于VC++实现C语言编译器:从词法分析到代码生成的全流程实践

1. 项目概述:为什么用VC来写C语言编译器?如果你对编译原理感兴趣,或者想深入理解C语言从源代码到可执行文件的“黑盒”过程,那么自己动手实现一个编译器无疑是最好的学习路径。而选择Visual C(通常指MSVC编译器套件&am…

2026/11/8 12:49:19

React 底层原理与大型应用架构实践:流量上来前要补哪些防线

React 底层原理与大型应用架构实践:流量上来前要补哪些防线说明:本文用高频更新场景解释背压与诊断方法。任何频率、时延或容量数值都只作配置示例,需以目标设备和实际负载测试调整。1. 大促零点的告警蜂鸣:秒杀页面 P99 渲染耗时…

2026/11/16 2:10:45

怎样办理电工证报名全流程详解+电子证书查询攻略

怎样办理电工证报名全流程详解+电子证书查询攻略 你缺一张特种作业操作证,现在找工作处处碰壁?别急,电工证就是你最直接的通行证,而 电子证书 的查询和使用更是关键一环。今天就从信阳公路工程从业者的角度,带你一步步搞清楚 怎样办理电工证报名…

2026/11/16 2:10:45

老电工证在外省能转吗?经开区高低压电工证+考前押题全攻略

老电工证在外省能转吗?经开区高低压电工证+考前押题全攻略 之前考的证在外省能不能转过来?这几乎是每个准备考取【经开区高低压电工证】的电工朋友心头的疑问。尤其是像焦作这样刚毕业的工程类学生,拿着外地的电工证,到了本地才发现岗位要求和流程并不一…

2026/11/16 2:10:45

赣州疫情能考电工证吗千万别踩坑

赣州疫情能考电工证吗千万别踩坑 工地太忙根本没时间复习考试,这几乎是所有一线作业人员的共同烦恼。尤其是像电工这种高风险、高要求的特种作业,如果因为疫情原因耽误了考试,或者在报名、备考过程中走错了路,那真的 千万别踩坑 。本文结合…

2026/11/16 2:10:45

_平顶山低压电工证合格标准与通过率

平顶山低压电工证怎么考?网上查询全攻略,别再被中介坑了 你是不是也在网上查“平顶山低压电工证”,结果各种信息乱七八糟,根本不知道怎么下手?报名怕被坑、考试怕不过、复审怕搞错?别急,下面这套全流程攻略,帮你从零开始搞定,再也不用担心被中介骗钱…

2026/11/16 2:05:44

电工证题库根据什么来?真实经历告诉你怎么考过

电工证题库根据什么来?真实经历告诉你怎么考过 你有没有这种情况:手里有一份电工的工作,但就是缺个证,面试卡在门口,连入职都进不去?这不是危言耸听, 急需特种作业证才能上岗找工作…

2026/11/15 0:02:49

电工证考试口诉怎么准备值不值得考

电工证考试口诉怎么准备值不值得考 实操考试心里没底怕挂科,这是大多数准备考电工证的人心里最真实的感受。尤其是面对【电工证考试口诉】环节,很多人不知道该怎么准备,甚至担心自己说不好就被淘汰。其实,只要掌握方法, 值不值得考…

2026/11/15 0:02:49

桑植县考电工证千万别踩坑!报名全流程教你避坑

桑植县考电工证千万别踩坑!报名全流程教你避坑 你是不是也遇到过这种情况:想考个电工证,但不知道从哪儿下手,怕被中介坑,怕花冤枉钱,更怕考了证还不能用?别急,这正是你该看这篇文章的原因。在桑植县考电工证,确实有很多人被坑过,但只要你知道流程、…

2026/11/16 0:00:11

黎城电工证查询报名费多少钱 内部消息告诉你怎么避开中介陷阱

黎城电工证查询报名费多少钱 内部消息告诉你怎么避开中介陷阱 你是不是也和我一样,想考电工证,但不知道去哪报名,怕被中介坑?最近网上有不少人问“黎城电工证查询报名费多少钱”,结果一查,信息五花八门,真假难辨。别担心,今天我就从一线从业者的角度…

2026/11/16 0:00:11

青岛崂山区电工证培训通过率揭秘:外省证书怎么转过来?

青岛崂山区电工证培训通过率揭秘:外省证书怎么转过来? 之前考的证在外省能不能转过来?这个问题困扰着很多在外地打工的电工,尤其是像南阳卧龙区的建筑工人,他们常年在工地作业,手上持有电工证是基本要求,但很多人因为工作流动性大,担心证书不能转到本…

2026/11/15 4:46:37

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/15 2:06:31

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑