news 2026/9/4 4:42:27

DSOGI-PLL原理建模与参数整定:有源电力滤波器锁相环设计

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DSOGI-PLL原理建模与参数整定:有源电力滤波器锁相环设计

有源电力滤波器专题1-DSOGI-PLL原理建模分析(下半)

接触有源电力滤波器(APF)控制的人,最后几乎都要在锁相环上栽一次跟头。谐波补偿的逻辑本身不复杂:检测出负载谐波,再反向注入补偿电流。但只要电网电压的同步相位出现零点几毫秒漂移,补偿电流的方向就偏了,治理效果立刻打折。更麻烦的是,实际台区电网很少是理想三相平衡电网,负序分量会让传统 SRF-PLL 的输出角度带有 100Hz 波动,这时 DSOGI-PLL 就成了绕不开的方案。

在专题上半部分,已经梳理了电网同步的基本需求、传统 SRF-PLL 的原理及其在不平衡电网下的不足,也给出了 SOGI 和 DSOGI 的基本结构。下半部分要解决的是更“硬核”的问题:SOGI 的数学模型到底怎么描述;正负序分离如何从公式走到代码;SRF-PLL 的 PI 参数如何通过计算得出而不是靠仿真试凑;整个 DSOGI-PLL 环路在频域上如何做带宽匹配;数字化实现时有哪些离散化坑;以及在 APF 工程中,DSOGI-PLL 的典型异常现象和排查思路又是什么。

很多人以为 DSOGI-PLL 的难点在于“认结构”,其实结构图闭着眼都能画出来。真正的难点在于闭环参数匹配和工况适应性。SOGI 的带宽、PLL 的带宽、频率自适应反馈的更新方式、离散化误差,这些因素交织在一起,决定了现场运行时系统稳不稳定、谐波补偿效果好不好。本文就把这些内容一次讲透。

1. 上半部分回顾与本篇主线

1.1 我们之前已经解决了什么问题

上半部分讲到,三相电网电压经过 Clarke 变换后,在静止 αβ 坐标系下仍然存在正序、负序和零序分量。如果直接用传统 SRF-PLL 锁相,负序分量会在同步旋转坐标系中表现为 2 倍工频的扰动,锁相角的输出会有明显的 100Hz 纹波。这个纹波对 APF 的影响非常大,因为 APF 的补偿电流参考值计算依赖锁相相位,相位波动会直接转化为补偿电流中的低次谐波误差。

为了解决这个问题,DSOGI-PLL 的核心思路是做两步处理:

  1. 用两个 SOGI 分别对 α 轴和 β 轴电压做正交信号生成,得到两路滞后 90° 的电压信号;
  2. 利用瞬时对称分量法,从 αβ 轴的正交信号中分离出正序分量,再进行 Park 变换和同步锁相。

这样,进入锁相环的电压不再包含负序分量,锁相角也就不会因为三相不平衡而产生 2 倍频波动。

1.2 下半部分要解决的四个问题

结构清楚了,不等于能落地。实际建模型和写控制代码时,还会遇到下面这些问题:

  • 参数怎么定:SOGI 中的 k 取多少、PLL 的 PI 取多少,是设计出来的,不是仿真试出来的。
  • 频率自适应怎么做:电网频率不是永远 50.00Hz,SOGI 的中心频率必须跟踪实际频率。
  • 离散化怎么实现:连续域传递函数再漂亮,写到 DSP/MCU 里也必须面对离散化误差。
  • 异常现象怎么排查:仿真里看不到的符号错误、初始化问题、离散误差,在实验台上都会暴露。

本文的主线就是围绕这些工程问题展开。

2. DSOGI-PLL 整体信号链路与模块职责

2.1 从三相电压到锁相角的完整链路

先站在系统层面看完整信号链路,各模块的关系如下:

三相电压 ua, ub, uc ↓ Clarke 变换 静止 αβ 电压 uα, uβ ↓ 两个 SOGI(频率由PLL反馈) + 正交信号生成 得到 uα′, quα′, uβ′, quβ′ ↓ 正负序分离 PNSC 得到正序分量 uα+, uβ+ ↓ Park 变换 得到 dq 分量 ud+, uq+ ↓ SRF-PLL(PI + 积分器) 输出频率 ω 和相位 θ ↓ ω 反馈给两个SOGI作为中心频率

每一个模块的任务都很单一:Clarke 负责坐标变换,SOGI 负责正交信号生成和滤波,PNSC 负责把负序分量剥离出去,Park + PI 负责完成锁相。真正决定性能的,是这些模块之间的参数匹配和动态耦合。

2.2 “两个 SOGI”到底在干什么

很多初学者会问:既然已经有了 αβ 两相电压,为什么不能直接做 Park 变换锁相?

因为三相不平衡时,αβ 电压是正序和负序分量的叠加。负序分量会让 dq 轴电压产生二倍频波动。要消除这个波动,就要把负序分量分离出来。而分离正负序分量需要构造“滞后 90°”的正交信号,这就是 SOGI 的任务。

所以这里的核心不是“滤波”,而是“构造正交信号”。SOGI 一方面提供正交信号用于正负序分离,另一方面本身也带有带通滤波特性,能够削弱谐波干扰。这种“一物两用”的设计,使得 DSOGI-PLL 比单纯在 dq 轴加低通滤波器的方案更自然。

2.3 为什么中心频率必须由 PLL 提供

SOGI 的正交性严格依赖于中心频率。当输入信号频率偏离 SOGI 中心频率时,SOGI 输出信号的幅值和相位都会变化,不再保持精确的 90° 正交关系,正负序分离也就不准确了。

因此,必须把 SRF-PLL 输出的角频率反馈给 SOGI,作为其中心频率。这就是 DSOGI-PLL 中“频率自适应”的含义。锁相环锁定电网频率后,SOGI 的中心频率跟随电网频率变化,才能保证在 49Hz、50Hz、51Hz 等不同工况下都保持稳定的正交特性。

3. SOGI 数学模型与 k 值影响分析

3.1 SOGI 的传递函数

SOGI 的本质是一个二阶广义积分器。设输入为 v,中心角频率为 ω,阻尼系数为 k,那么 SOGI 的两个输出可以表示为:

从输入 v 到同相输出 v' 的传递函数是带通特性:

$$ H_{d}(s) = \frac{v'(s)}{v(s)} = \frac{k \omega s}{s^{2} + k \omega s + \omega^{2}} $$

从输入 v 到正交输出 qv' 的传递函数是低通特性:

$$ H_{q}(s) = \frac{qv'(s)}{v(s)} = \frac{k \omega^{2}}{s^{2} + k \omega s + \omega^{2}} $$

在中心频率 ω 处,Hd 的幅值增益为 1,相位为 0;Hq 的相位滞后 90°。这正是构造正交信号所需要的特性。

3.2 为什么说 SOGI 不是单纯滤波器

如果只看传函,SOGI 很像一个带通滤波器。但它在锁相环中的作用不只是滤波,更是“相位重构”:它能够在输入电压畸变的情况下,重构出基波频率下的电压信号和它的正交信号,本质上是为一个通道生成两相信号,供后续正负序分离使用。

所以理解 SOGI 时要抓住两个层面:

  • 幅频特性层面:它对基波附近信号增益接近 1,对高次谐波有衰减;
  • 相频特性层面:它保证在中心频率处输出信号与输入同相、正交信号滞后 90°。

在工程分析中,最常用的办法是先画出 SOGI 带通输出的 Bode 图,查看不同 k 值下的带宽和相位特性,再根据电网工况选取参数。

3.3 参数 k 对性能的影响

k 在 SOGI 中相当于阻尼系数,直接决定带宽和动态响应速度。下面用一个表格总结在不同 k 值下的表现:

k 值带宽与选择性动态响应对频率偏差的敏感度谐波抑制能力
k 较小(0.1~0.3)带宽窄,选择性好响应慢,振荡明显敏感,频率偏移后正交性变差强,能有效衰减谐波
k 适中(0.5~1)带宽较合适响应较快,基本无超调适中,频率自适应后可接受较好,工程常用区间
k 较大(2以上)带宽宽,选择性弱响应快不敏感弱,谐波容易穿过

在 APF 的 DSOGI-PLL 中,k 并不是越大越好。如果 k 太大,SOGI 的滤波作用变弱,电压谐波会进入锁相环路造成相位波动;如果 k 太小,SOGI 响应变慢,电网频率变化或相位跳变时,正负序分离结果会滞后,导致锁相环动态性能下降。

实际项目一般先从 k = 0.7 左右开始整定,再结合电网背景谐波情况进行微调。谐波严重时向小调,动态响应要求高时向大调。

4. 正负序分离算法与数学基础

4.1 为什么需要“瞬时”对称分量

传统对称分量法是基于向量和复数运算的,适合稳态分析。但 APF 控制需要实时获得补偿电流参考,必须在每一个采样周期都能算出当前电压的正序分量。DSOGI-PLL 使用的方法是基于“延迟 90°”构造的瞬时对称分量法,也叫延迟算子法。

设 q 表示滞后 90° 的算子,则 αβ 坐标系下的正序分量可以用下式计算:

$$ \begin{aligned} u_{\alpha +} &= \frac{1}{2}\left( u_{\alpha}' - q u_{\beta}' \right) \ u_{\beta +} &= \frac{1}{2}\left( q u_{\alpha}' + u_{\beta}' \right) \end{aligned} $$

负序分量可以用下式计算:

$$ \begin{aligned} u_{\alpha -} &= \frac{1}{2}\left( u_{\alpha}' + q u_{\beta}' \right) \ u_{\beta -} &= \frac{1}{2}\left( -q u_{\alpha}' + u_{\beta}' \right) \end{aligned} $$

公式本身不复杂,但符号约定非常容易出错。不同论文和工程代码对 q 的定义、对正序分量的定义可能不同。第 4 章最后的代码必须与实际使用的 q 方向一致,否则正负序分离结果会颠倒。

4.2 从公式推导到代码

假设 q 表示滞后 90°,并且在 αβ 通道的 SOGI 输出中,v' 为同相信号,qv' 为滞后 90° 信号,那么实现时可以直接用 SOGI 输出替换公式中的 uα′、quα′、uβ′、quβ′。

正序分量计算实现如下:

// 输入:ua_f(alpha同相分量), qua_f(alpha正交分量) // ub_f(beta同相分量), qub_f(beta正交分量) // 输出:ua_pos, ub_pos ua_pos = 0.5f * (ua_f - qub_f); ub_pos = 0.5f * (qua_f + ub_f);

负序分量计算实现如下:

ua_neg = 0.5f * (ua_f + qub_f); ub_neg = 0.5f * (-qua_f + ub_f);

4.3 符号约定是最大的坑

这里特别提醒:如果代码中的 q 定义不是滞后 90°,而是超前 90°,那么正序和负序公式中的加减号会互换。仿真中如果发现分离出来的“正序分量”幅值不正确,或者 dq 轴电压仍有二倍频波动,优先检查 SOGI 正交输出的符号方向,而不是怀疑控制参数。

判断方法很简单:输入一个理想的三相正序电压,让系统运行后观察 uα+ 和 uβ+。如果 uα+ 的幅值与输入相电压幅值接近,同时 uβ+ 相位滞后 uα+ 约 90°,说明符号正确;如果结果是负序分量的形式,则说明公式中某一处符号反了。

5. SRF-PLL 小信号建模与 PI 参数设计

5.1 Park 变换后的误差信号

得到正序分量 uα+ 和 uβ+ 后,可以将其旋转到 dq 坐标系。若锁相角为 θ,则 q 轴分量为:

$$ u_{q+} = -\sin \theta \cdot u_{\alpha+} + \cos \theta \cdot u_{\beta+} $$

当 θ 接近电网正序电压相位时,uq+ 近似等于正序电压幅值乘以相位误差:

$$ u_{q+} \approx U_{m+} \cdot \left( \theta_{grid} - \theta_{pll} \right) $$

这就是 SRF-PLL 的“鉴相器”。uq+ 是相位误差信号,PI 调节器把误差调节到零,就完成了锁相。

5.2 小信号模型与开环传函

如果不考虑 SOGI 的动态影响,只研究 SRF-PLL 本身,那么锁相环的小信号模型可以简化为:

  • 误差信号经过 PI 得到角频率增量;
  • 角频率增量经过积分器得到相位输出;
  • 输出相位与电网相位比较,形成闭环。

在电压幅值已归一化到 1.0 pu、且 uq+ 近似等于相位误差弧度时,开环传递函数为:

$$ G_{ol}(s) = \frac{k_p s + k_i}{s^{2}} $$

闭环传递函数为:

$$ H_{cl}(s) = \frac{k_p s + k_i}{s^{2} + k_p s + k_i} $$

这是一个典型的二阶系统。设自然频率为 ωn,阻尼比为 ζ,则:

$$ \omega_n = \sqrt{k_i}, \quad \zeta = \frac{k_p}{2 \sqrt{k_i}} $$

反推 PI 参数:

$$ k_i = \omega_n^{2}, \quad k_p = 2 \zeta \omega_n $$

5.3 PI 参数设计示例

锁相环设计时,一般把阻尼比设置在 0.707 附近,此时超调量和响应速度比较均衡。自然频率的选择需要权衡“动态响应速度”和“谐波抑制能力”。自然频率越高,锁相响应越快,但对电压谐波的抑制能力越差;自然频率越低,输出相位越平滑,但动态响应越慢。

假设电网额定频率为 50Hz,希望锁相环的自然频率为 30Hz 左右,取阻尼比 0.707,则:

fn_pll = 30; % Hz wn_pll = 2 * pi * fn_pll; zeta = 0.707; kp = 2 * zeta * wn_pll; ki = wn_pll^2;

计算得到:

kp ≈ 266.5 ki ≈ 35530

这里有一个前提:uq+ 已经做过幅值归一化。如果直接使用实际电压幅值,比如相电压峰值为 311V,那么参数必须除以 311,否则环路增益会放大 311 倍。

在实际项目中,推荐先把电压归一化,再用归一化后的误差信号参与锁相。这样 PI 参数与电网电压幅值无关,现场电压波动不会导致锁相动态特性发生明显变化。

5.4 参数验证方式

参数定完后,可以用 Bode 图看开环与闭环特性。闭环带宽决定锁相环对电网频率突变的跟踪速度,开环剪切频率附近的相位裕度决定稳定性。不要只依赖阶跃响应,因为锁相环的输入是相位跳变,阶跃响应无法覆盖电网频率变化的场景。

更靠近工程的做法是,在仿真中构造“频率阶跃”和“相位阶跃”两大类工况,分别观察锁相误差和恢复时间。这个内容会在第 7 章展开。

6. 全环路建模:DSOGI 与 SRF-PLL 的带宽匹配

6.1 为什么不能把 SOGI 当作理想环节

前面设计 SRF-PLL 参数时,都把 SOGI 的动态忽略了,认为 SOGI 能瞬时输出正序分量。实际中,SOGI 也是一个二阶动态系统,它的响应速度会叠加到整个 DSOGI-PLL 环路中。

如果 SOGI 的响应速度比 SRF-PLL 慢很多,那么锁相环看到的“正序电压”会有明显滞后,整个环路的相位裕度变小,甚至出现振荡。如果 SOGI 的带宽太宽,又会削弱谐波抑制能力。所以 DSOGI-PLL 的设计核心就是:让 SOGI 的动态和 SRF-PLL 的动态在频域上分开

6.2 一个实用的参数设计顺序

工程上不需要建立极其复杂的多输入多输出模型,推荐按下面的顺序设计参数:

  1. 先设计 SRF-PLL 的 PI 参数,确定闭环自然频率 fn_pll;
  2. 再选择 SOGI 的 k 值,使 SOGI 的带宽明显高于 SRF-PLL 的带宽;
  3. 用仿真验证两者串联后是否还有足够的相位裕度;
  4. 如果发现动态变差,优先降低 SRF-PLL 带宽,而不是盲目提高 SOGI 的 k;
  5. 如果发现锁相输出含有大量谐波,优先降低 SOGI 的 k,或降低 SRF-PLL 带宽。

这样做的好处是:SRF-PLL 的带宽是“低频环”,负责跟踪相位;SOGI 的带宽是“中频环”,负责滤除谐波和分离负序。两个环路的特征频率错开,系统才是可设计的。

6.3 频率自适应反馈的建模意义

频率自适应反馈使 SOGI 成为一个参数随 PLL 输出变化的时变系统。静态分析时,可以把它当作定参数系统处理;但研究电网频率突变时,必须注意到频率反馈带来的耦合。

从工程经验来看,频率自适应反馈不会破坏锁相环稳定性,但会让动态过程更复杂。仿真时建议至少构造一次“电网频率从 50Hz 跳到 51Hz”的测试,观察锁相角和 SOGI 输出幅值是否收敛。如果收敛时间过长,说明 SOGI 带宽太窄;如果出现明显振荡,则需要检查 SOGI 的 k 和 PLL 带宽是否匹配。

7. MATLAB 仿真模型搭建与验证方法

7.1 Simulink 模型结构建议

在 MATLAB/Simulink 中搭建 DSOGI-PLL 时,不推荐把整个结构画成一个庞大子系统,最好按模块拆分,便于排错和后期移植。

建议的模块划分是:

  • SOGI Alpha:输入 uα,输出 uα_f 和 quα_f;
  • SOGI Beta:输入 uβ,输出 uβ_f 和 quβ_f;
  • PNSC:输入四路 SOGI 输出,输出正序 uα+、uβ+;
  • SRF-PLL:输入正序 uα+、uβ+,输出 θ、ω、以及反馈给 SOGI 的中心频率。

测试源可以用简化的理想三相电压源,额外叠加负序分量和谐波分量,用于验证算法。电网模型不要一开始就接整流负载或 APF 主电路,先单独验证锁相环,再做系统级仿真。

7.2 参数计算脚本

下面这段 MATLAB 脚本用于计算 DSOGI-PLL 的主要参数,并画出 SRF-PLL 闭环阶跃响应。它也可以作为项目里参数设计的第一步。

%% DSOGI-PLL 参数计算示例 clearvars; clc; % 电网参数 f_grid = 50; w_grid = 2 * pi * f_grid; % 设计变量 zeta = 0.707; % 阻尼比 fn_pll = 30; % PLL 自然频率,单位 Hz wn_pll = 2 * pi * fn_pll; % 自然角频率 % 电压归一化后,uq+ 近似等于相位误差 kp = 2 * zeta * wn_pll; ki = wn_pll^2; fprintf('kp = %.2f\n', kp); fprintf('ki = %.2f\n', ki); % SRF-PLL 闭环传递函数,输入为相位,输出为相位估计 s = tf('s'); G_open = (kp * s + ki) / s^2; H_close = feedback(G_open, 1); figure; step(H_close); title('SRF-PLL 相位阶跃响应'); grid on; % 查看 k 取不同值时 SOGI 带通输出 Bode 图 figure; hold on; k_list = [0.3, 0.7, 1.0, 2.0]; for k = k_list G_sogi = k * w_grid * s / (s^2 + k * w_grid * s + w_grid^2); bode(G_sogi, {1, 1000}); end legend('k=0.3', 'k=0.7', 'k=1.0', 'k=2.0'); grid on;

脚本中的 k 列表用于对比 SOGI 带通特性。实际项目可以先跑这段脚本观察 Bode 图趋势,再回到 Simulink 中做整体仿真验证。

7.3 仿真工况设计

只测理想电网下的锁相效果远远不够。DSOGI-PLL 在理想电网下的性能一定没问题,真正考验它的是非理想工况。建议至少做下面几组仿真:

工况测试目的观察指标
三相电压不平衡验证正负序分离效果dq 轴电压是否含 100Hz 分量
电压含 5 次、7 次谐波验证 SOGI 谐波抑制能力锁相角是否有明显的 300Hz 纹波
频率从 50Hz 跳变到 51Hz验证频率自适应跟踪效果锁相误差收敛时间
电压相位跳变 40°验证 PLL 动态响应相位跳变后恢复时间与超调量
电压幅值跌落 50%验证幅值归一化是否有效PI 输出是否变化、锁相是否失锁

每组仿真都要记录波形,方便定位问题。如果第五种工况下锁相性能发生了明显变化,多半是幅值归一化没有做彻底。

7.4 仿真运行结果的判断标准

判断 DSOGI-PLL 是否正常,主要看两点:

  • dq 轴电压是否平稳:稳态时 uq+ 应该稳定在 0 附近,没有明显的 2 倍频波动;
  • 锁相角是否平滑:θ 应该是以电网频率线性增长的斜坡信号,微分后得到稳定的角频率 ω,不能有明显的高频纹波。

如果 uq+ 存在 100Hz 纹波,基本可以断定正负序分离环节有问题;如果 θ 波形有稳态相位偏差,可能是 SOGI 中心频率没有精确跟踪电网频率,或者离散化引入了误差。

8. 离散化与嵌入式实现工程示例

8.1 连续域模型到了控制器里必须离散化

Simulink 中默认使用变步长连续求解器,PI 和 SOGI 都按连续域计算。但 APF 控制核心通常是 DSP 或 MCU,采样周期固定,所有积分都必须离散化。很多同学在仿真中表现很好的环路,下载到控制器里就不稳定,原因之一就是离散化实现不正确。

工程上常用三种离散化方法:

  • 前向欧拉法:实现简单,适合采样率较高、控制对象动态不太快的场合;
  • 双线性变换(Tustin):精度高,不会把 s 平面左半平面映射到 z 平面单位圆外,最常用;
  • 带预畸变的双线性变换:对特定频率点做精确匹配,适合需要精确谐振频率的场合,比如 SOGI 的中心频率。

在实际产品代码中,SOGI 一般采用双线性变换或带预畸变的双线性变换,单纯使用前向欧拉在部分频段会引入较大相位误差。下面给出一个工程化的简化示例,用于说明离散化实现思路。

8.2 SOGI 离散化实现示例

下面是一段基于欧拉法的简化 C 语言实现,重点展示 SOGI 的状态更新过程。它便于理解,但实际产品建议根据采样率选择更精细的离散化方法,并做相位补偿验证。

typedef struct { float k; // SOGI 阻尼系数 float w; // 中心角频率,来自 PLL float x1; // 同相输出状态 float x2; // 正交输出状态 } sogi_t; void sogi_init(sogi_t *sogi, float k, float w) { sogi->k = k; sogi->w = w; sogi->x1 = 0.0f; sogi->x2 = 0.0f; } // 每周期调用一次,v 为输入电压,Ts 为控制周期 // 返回值是 SOGI 的同相输出 float sogi_update(sogi_t *sogi, float v, float Ts) { float err = v - sogi->x1; // 频率自适应:中心角频率 w 由 PLL 更新,每次进入前已经更新 float tmp = sogi->w * (sogi->k * err - sogi->x2); sogi->x1 += Ts * tmp; sogi->x2 += Ts * (sogi->w * sogi->x1); return sogi->x1; }

调用时,分别创建两个实例,一个用于 α

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

多设备键盘入门到精通:罗技K868连接、切换与自定义全攻略

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

作者头像 李华
网站建设 2026/9/4 4:39:21

cloudwatch

Cloudwatch要启用ASG监控采集图表指标截图里选哪一个StatisticPeriod01-ALB-TG-RequestRequestCountApplicationELB > Per AppELB MetricsSum1 minuteRequestCountPerTargetApplicationELB > Per AppELB, per TG MetricsSum1 minute02-ALB-TG-5XXHTTPCode_ELB_5XX_CountA…

作者头像 李华
网站建设 2026/9/4 4:38:38

免公众号社交盲盒系统:PHP+MySQL轻量级部署与核心玩法实现

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

作者头像 李华
网站建设 2026/9/4 4:38:23

TraVEL:用轨迹引导视频嵌入提升驾驶视频检索

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

作者头像 李华
网站建设 2026/9/4 4:36:54

从0到1构建养生小程序:技术选型、核心功能与性能优化实战

简介:这是一套完整的微信小程序-养生小程序源码资源,面向前端初学者与小程序开发者,聚焦健康类轻应用开发实践,解决养生类功能模块集成、多页面交互及数据驱动UI等典型开发问题。资源包共70个文件,含8个核心JS逻辑文件…

作者头像 李华
网站建设 2026/9/4 4:36:23

用Godot引擎开发C盘清理工具:扫描、权限与安全删除实战

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

作者头像 李华