当前位置: 首页 > news >正文

电机控制的空间矢量调制 (SVPWM)

目录

概述

1 电机控制的空间矢量调制 (SVPWM)介绍

2 实现原理

2.1 设计要求

2.2 SVPWM 的实现

3 SVPWM的C语言 

3.1 代码文件

3.2 STM32G4平台上验证

 4 源代码文件


概述

本文主要介绍电机控制的空间矢量调制 (SVPWM),空间矢量调制 (SVPWM) 是感应电机和永磁同步电机 (PMSM) 磁场定向控制的常用方法。空间矢量调制负责生成脉宽调制信号以控制逆变器的开关,由此产生所需的调制电压,以所需的速度或转矩驱动电机。空间矢量调制也称为空间矢量脉宽调制 (SVPWM)。文中介绍了该部分内容的实现原理,并实现C语言实现其代码。

1 电机控制的空间矢量调制 (SVPWM)介绍

空间矢量调制 (SVPWM) 是感应电机和永磁同步电机 (PMSM) 磁场定向控制的常用方法。空间矢量调制负责生成脉宽调制信号以控制逆变器的开关,由此产生所需的调制电压,以所需的速度或转矩驱动电机。空间矢量调制也称为空间矢量脉宽调制 (SVPWM)。

2 实现原理

2.1 设计要求

试考虑三相逆变器电机控制的空间矢量调制,该逆变器具有六个开关,如以下等效电路所示。注意,有八种有效的开关配置。

用于电机控制的空间矢量调制 (SVPWM)

电机控制的空间矢量调制 (SVM)

 每种开关配置都会产生特定的电压,施加于电机端子。电压是基本空间矢量,以空间矢量六边形表示其幅值和方向。

通过对开关区间内的基本空间矢量(方向)和零矢量(幅值)作用时间进行调节,可以近似得到空间矢量六边形内任意位置、任意幅值的电压矢量。

例如:  图中,一个脉宽调制 (PWM) 周期内,选择两个相邻空间矢量(图中的 U3 和 U4)分别作用一段时间、在周期其余时间内由零矢量(U7 或 U8)作用,从而得到近似平均参考矢量 Uref。 

通过控制开关序列,即控制脉冲的导通持续时间,就可以在每个 PWM 周期获得具有变化幅值和方向的任何电压矢量。空间矢量调制方法的目标是在每个 PWM 周期生成与参考电压矢量相符的开关序列,以实现连续旋转的空间矢量。

2.2 SVPWM的实现

空间矢量调制方法基于参考电压矢量进行操作,在每个 PWM 周期为逆变器生成适当导通信号,目标是实现连续旋转的空间矢量。

采用空间矢量调制的磁场定向控制架构示意图:

在每个 PWM 周期,以电压矢量作为输入参考,SVM 算法会:

  • 基于参考电压矢量计算开关导通时间
  • 基于导通时间生成马鞍波
  • 基于导通时间为逆变器开关生成适当的导通脉冲

SVPWM算法生成的空间矢量调制电压信号的波形图:

所生成的马鞍波能够最大程度地利用直流总线电压。与正弦脉宽调制 (SPWM) 方法相比,该方法能提供更好的额定电压输出。然后,将生成的导通信号应用于三相逆变器的开关,以所需的速度或转矩驱动电机。

3 SVPWM的C语言 

3.1 代码文件

代码84行: 设置SVPWM的采样周期

代码85~87行: 设置象限的电压值

代码91行: 计算扇区

代码97 ~ 111 行: 实现第5扇区的波形

 代码116 ~ 129 行: 实现第1扇区的波形

 代码130~ 145 行: 实现第3扇区的波形

  代码147~ 162行: 实现第2扇区的波形

  代码165~ 179行: 实现第6扇区的波形

  代码181~ 196行: 实现第4扇区的波形

3.2 STM32G4平台上验证

1)测试代码实现

2)运行代码和查看波形

 查看α,β坐标系上的波形图:

经svm转换后的波形图:

 4 源代码文件

1)  .c文件中的代码

/* USER CODE BEGIN Header */
/********************************************************************************* File Name        :  foc_ctrl.h* Description      :  foc driver base on stm32f446******************************************************************************* @attention*
* COPYRIGHT:    Copyright (c) 2024  tangminfei2013@126.com* DATE:         JUL 05th, 2024*******************************************************************************/
/* USER CODE END Header *//* Includes ------------------------------------------------------------------*/#include "foc_ctrl.h"#define  SQRT_3           1.7320508f
#define  SQRT_3_DIV_2     0.8660254f
#define  DIV_1            0.5fFOC_T FOC;
/*****************************************************************************
Clarke变换 输入三相电流,输出alpha,bate电流
Iα = Ia
Iβ = (Ia + 2Ib) / sqrt(3)
******************************************************************************/
void clarkeTransform(Phase_T *abc, AlphaBeta_T *alphaBeta)
{alphaBeta->alpha = abc->Ua;alphaBeta->beta = (abc->Ua + 2 * abc->Ub) * SQRT_3;
}/****************************************************************************
Park变换,输入电角度、Ialpha和Ibeta,经过Park变换得到Iq、Id
Id = Iα · cosθ + Iβ · sinθ
Iq = Iα · sinθ + Iβ · cosθ
*****************************************************************************/
void parkTransform(const AlphaBeta_T *alphaBeta, float angle, DQ_T *dq)
{float sinAngle = sin(angle);float cosAngle = cos(angle);dq->d = cosAngle * alphaBeta->alpha + sinAngle * alphaBeta->beta;dq->q = -sinAngle * alphaBeta->alpha + cosAngle * alphaBeta->beta;
}/***************************************************************************
park逆变换,输入Uq、Ud得到Ualpha、Ubeta
Uα = Ud · cosθ - Uq · sinθ
Uβ = Ud · sinθ + Uq · cosθ
****************************************************************************/
void inverseParkTransform(DQ_T *dq, AlphaBeta_T *alphaBeta, float angle)
{float cosAngle = cos(angle);float sinAngle = sin(angle);alphaBeta->alpha = dq->d * cosAngle - dq->q * sinAngle;alphaBeta->beta = dq->d * sinAngle + dq->q * cosAngle;
}/**********************************************************************************************************
Clarke逆变换,输入Ualpha、Ubeta,得到Ua,Ub,Uc
Ua = Uα
Ub = -1/2 * Uα + sqrt(3)/2  * Uβ
Ub = -1/2 * Uα - sqrt(3)/2  * Uβ
**********************************************************************************************************/void inverseClarkeTransform(AlphaBeta_T *abVoltage, Phase_T *abc){abc->Ua = abVoltage->alpha;abc->Ub = -DIV_1 * abVoltage->alpha + SQRT_3_DIV_2 * abVoltage->beta;abc->Uc = -DIV_1 * abVoltage->alpha - SQRT_3_DIV_2 * abVoltage->beta;}void SVPWM(SVPWM_T *svpwm, Phase_T *abc)
{float sum;float k_svpwm;// step-1: 设置象限电压值svpwm->Ts = 1.0f;        // SVPWM的采样周期svpwm->u1 = abc->Ua;svpwm->u2 = abc->Ub;svpwm->u3 = abc->Uc;// step2:扇区判断// 根据u1、u2和u3的正负情况确定所处的扇区svpwm->sector = (svpwm->u1 > 0.0f) + ((svpwm->u2 > 0.0f) << 1) + ((svpwm->u3 > 0.0f) << 2); // N=4*C+2*B+A// step3:计算基本矢量电压作用时间(占空比)// 根据扇区的不同,计算对应的t_a、t_b和t_c的值,表示生成的三相电压的时间switch (svpwm->sector){case 5:// 扇区5svpwm->t4 = svpwm->u3;svpwm->t6 = svpwm->u1;sum = svpwm->t4 + svpwm->t6;if (sum > svpwm->Ts){k_svpwm = svpwm->Ts / sum; //svpwm->t4 = k_svpwm * svpwm->t4;svpwm->t6 = k_svpwm * svpwm->t6;}svpwm->t7 = (svpwm->Ts - svpwm->t4 - svpwm->t6) / 2;svpwm->ta = svpwm->t4 + svpwm->t6 + svpwm->t7;svpwm->tb = svpwm->t6 + svpwm->t7;svpwm->tc = svpwm->t7;break;case 1:// 扇区1svpwm->t2 = -svpwm->u3;svpwm->t6 = -svpwm->u2;sum = svpwm->t2 + svpwm->t6;if (sum > svpwm->Ts){k_svpwm = svpwm->Ts / sum; // 计算缩放系数svpwm->t2 = k_svpwm * svpwm->t2;svpwm->t6 = k_svpwm * svpwm->t6;}svpwm->t7 = (svpwm->Ts - svpwm->t2 - svpwm->t6) / 2;svpwm->ta = svpwm->t6 + svpwm->t7;svpwm->tb = svpwm->t2 + svpwm->t6 + svpwm->t7;svpwm->tc = svpwm->t7;break; case 3:// 扇区3svpwm->t2 = svpwm->u1;svpwm->t3 = svpwm->u2;sum = svpwm->t2 + svpwm->t3;if (sum > svpwm->Ts){k_svpwm = svpwm->Ts / sum; //svpwm->t2 = k_svpwm * svpwm->t2;svpwm->t3 = k_svpwm * svpwm->t3;}svpwm->t7 = (svpwm->Ts - svpwm->t2 - svpwm->t3) / 2;svpwm->ta = svpwm->t7;svpwm->tb = svpwm->t2 + svpwm->t3 + svpwm->t7;svpwm->tc = svpwm->t3 + svpwm->t7;    break;case 2:// 扇区2svpwm->t1 = -svpwm->u1;svpwm->t3 = -svpwm->u3;sum = svpwm->t1 + svpwm->t3;if (sum > svpwm->Ts){k_svpwm = svpwm->Ts / sum; svpwm->t1 = k_svpwm * svpwm->t1;svpwm->t3 = k_svpwm * svpwm->t3;}svpwm->t7 = (svpwm->Ts - svpwm->t1 - svpwm->t3) / 2;svpwm->ta = svpwm->t7;svpwm->tb = svpwm->t3 + svpwm->t7;svpwm->tc = svpwm->t1 + svpwm->t3 + svpwm->t7;    break;case 6:// 扇区6svpwm->t1 = svpwm->u2;svpwm->t5 = svpwm->u3;sum = svpwm->t1 + svpwm->t5;if (sum > svpwm->Ts){k_svpwm = svpwm->Ts / sum; // svpwm->t1 = k_svpwm * svpwm->t1;svpwm->t5 = k_svpwm * svpwm->t5;}svpwm->t7 = (svpwm->Ts - svpwm->t1 - svpwm->t5) / 2;svpwm->ta = svpwm->t5 + svpwm->t7;svpwm->tb = svpwm->t7;svpwm->tc = svpwm->t1 + svpwm->t5 + svpwm->t7;break;case 4:// 扇区4svpwm->t4 = -svpwm->u2;svpwm->t5 = -svpwm->u1;sum = svpwm->t4 + svpwm->t5;if (sum > svpwm->Ts){k_svpwm = svpwm->Ts / sum; // svpwm->t4 = k_svpwm * svpwm->t4;svpwm->t5 = k_svpwm * svpwm->t5;}svpwm->t7 = (svpwm->Ts - svpwm->t4 - svpwm->t5) / 2;svpwm->ta = svpwm->t4 + svpwm->t5 + svpwm->t7;svpwm->tb = svpwm->t7;svpwm->tc = svpwm->t5 + svpwm->t7;    break;default:break;}// step4:3路PWM输出
}void foc_test(void)
{int run_cnt = 10;float theta = 0;float ta,tb,tc;DQ_T dq_t;AlphaBeta_T alphaBeta_t;SVPWM_T svpwm_out;Phase_T phase_t;dq_t.d = 0.2f;dq_t.q = 0.0f;while( run_cnt--){for ( theta = 0; theta < 6.2831853f; theta += 0.275f ){// 逆Park变换inverseParkTransform(&dq_t,&alphaBeta_t,theta);// 逆Clark变换inverseClarkeTransform(&alphaBeta_t, &phase_t);// swpwm 转换SVPWM( &svpwm_out,&phase_t );ta = 100.0f*svpwm_out.ta;tb = 100.0f*svpwm_out.tb;tc = 100.0f*svpwm_out.tc;printf( "%.4f,%.4f,%.4f,%.4f,%.4f\n", alphaBeta_t.alpha*100.0f ,alphaBeta_t.beta*100.0f ,ta,tb,tc);//            printf("%.4f,%.4f,%.4f,%.4f,%.4f \n", alphaBeta_t.alpha,alphaBeta_t.beta,
//                                                  phase_t.Ua,phase_t.Ub,phase_t.Uc );}}
}/* End of this file */

2)  .h文件中的代码

/* USER CODE BEGIN Header */
/********************************************************************************* File Name        :  foc_ctrl.h* Description      :  foc driver base on stm32f446******************************************************************************* @attention*
* COPYRIGHT:    Copyright (c) 2024  tangminfei2013@126.com* DATE:         JUL 05th, 2024*******************************************************************************/
/* USER CODE END Header *//* Includes ------------------------------------------------------------------*/
#ifndef __FOC_CTRL_H
#define __FOC_CTRL_H/*****************************************************************************/
/* Includes                                                                  */
/*****************************************************************************/
#include "main.h"
#include "utils_types.h"#ifdef _cplusplus
extern "C" {
#endif typedef struct 
{float Ia;  // Phase A currentfloat Ib;  // Phase B currentfloat Ic;  // Phase C currentfloat Ua;  // Phase A Voltagefloat Ub;  // Phase B Voltagefloat Uc;  // Phase C Voltage} Phase_T;typedef struct{float alpha;  // alpha-axis currentfloat beta;   // beta-axis current
} AlphaBeta_T;typedef struct 
{float d;  // d-axis currentfloat q;  // q-axis current
} DQ_T;typedef struct
{int sector;float u1;float u2;float u3;  float ta;float tb;float tc;float Ts;float t0;float t1;float t2;float t3;float t4;float t5;float t6;float t7;} SVPWM_T;typedef struct
{float U_d;float U_q;float theta;float U_alpha;float U_bate;Phase_T Phase_Curr;AlphaBeta_T  AlphaBeta;DQ_T DQ;
} FOC_T;extern FOC_T FOC;void foc_test(void);#ifdef _cplusplus
}
#endif   #endif    /* __FOC_CTRL_H */

相关文章:

电机控制的空间矢量调制 (SVPWM)

目录 概述 1 电机控制的空间矢量调制 (SVPWM)介绍 2 实现原理 2.1 设计要求 2.2 SVPWM 的实现 3 SVPWM的C语言 3.1 代码文件 3.2 STM32G4平台上验证 4 源代码文件 概述 本文主要介绍电机控制的空间矢量调制 (SVPWM)&#xff0c;空间矢量调制 (SVPWM) 是感应电机和永磁…...

jupyterhub on k8s 配置用户名密码 简单版

如果只是小组内使用 不想共用密码 也不想搞复杂认证方案 那么就直接通过map(用户名,密码md5值)来制定密码 config.yaml部分内容 hub:config:JupyterHub:shutdown_on_logout: true # 用户logout 自动stop jupyter pod,家目录下所有文件会被保存到pvc 即启动后之前家目录下…...

c++笔试准备

一、 输入输出 1.多组数据【while】 cin #include <iostream> using namespace std;int main() {int a, b;while (cin >> a >> b) { // 当读取到EOF时&#xff0c;循环自动终止cout << a b << endl;}return 0; }getline #include <iostrea…...

【Docker】如何在Linux、Windows、MacOS中安装Docker

Linux安装Docker 在终端中执行一键安装脚本命令安装dockersudo curl -fsSL https://gitee.com/tech-shrimp/docker_installer/releases/download/latest/linux.sh | bash -s docker --mirror Aliyun1.1 配置docker镜像源 在终端执行 一行命令,编辑配置文件sudo tee /etc/docke…...

欧拉回路与哈密尔顿回路: Fleury算法与Hierholzer 算法(C++)

图论中的回路是指一个路径, 它从某个顶点开始, 经过所有边恰好一次, 并回到起始顶点. 定义 欧拉回路: 从一个顶点出发, 经过每条边恰好一次, 并且最终回到起始顶点. 哈密尔顿回路: 从一个顶点出发, 经过每个顶点恰好一次, 并且最终回到起始顶点. 欧拉路径: 从一个顶点出发, …...

JavaSE学习笔记26-集合(Collection)

集合 Java 中的集合&#xff08;Collection&#xff09;是 Java 标准库中非常重要的一部分&#xff0c;用于存储和操作一组对象。Java 集合框架&#xff08;Java Collections Framework&#xff09;提供了一套丰富的接口和类&#xff0c;用于处理各种数据结构&#xff0c;如列…...

本地开发用ASP.NET Core Web API项目创建及测试

1. 服务端代码&#xff08;C#&#xff09; 1.1 创建ASP.NET Core Web API项目 打开Visual Studio 2022。 选择“创建新项目”。 选择“ASP.NET Core Web API”模板&#xff0c;点击“下一步”。 输入项目名称&#xff08;如OracleApi&#xff09;&#xff0c;选择项目位置&…...

Redis——用户签到BitMap,UV统计

目录 BitMap 使用场景 1. 用户签到系统 2. 用户行为标记 3. 布隆过滤器&#xff08;Bloom Filter&#xff09; BitMap介绍 Redis中的使用 Redis功能示例 添加&#xff1a; 获取&#xff1a; 批量获取&#xff1a; java中实现 统计本月连续签到次数 UV统计 UV 统计…...

一文详解U盘启动UEFI/Legacy方式以及GPT/MBR关系

对于装系统的老手而说一直想研究一下装系统的原理&#xff0c;以及面对一些问题时的解决思路&#xff0c;故对以前的方法进行原理上的解释&#xff0c;主要想理解其底层原理。 引导模式 MBR分区可以同时支持UEFI和Legacy引导&#xff0c;我们可以看一下微pe制作的启动盘&#…...

Unity Shader 学习13:屏幕后处理 - 使用高斯模糊的Bloom辉光效果

目录 一、基本的后处理流程 - 以将画面转化为灰度图为例 1. C#调用shader 2. Shader实现效果 二、Bloom辉光效果 1. 主要变量 2. Shader效果 &#xff08;1&#xff09;提取较亮区域 - pass1 &#xff08;2&#xff09;高斯模糊 - pass2&3 &#xff08;3&#xff…...

小迪安全-24天-文件管理,显示上传,黑白名单,访问控制

上节课回顾&#xff0c;token问题 没有更新token值&#xff0c;造成了复用 加上这段代码就好了&#xff0c;就不会复用了 文件管理-文件上传 upload.html文件&#xff0c;找ai生成就行 uoload.php接受文件上传的信息 这里在写个临时文件存储换个地方 因为上面临时文件存在c盘…...

java23种设计模式-建造者模式

建造者模式&#xff08;Builder Pattern&#xff09;学习笔记 1. 模式定义 建造者模式是一种创建型设计模式&#xff0c;通过分步构建复杂对象的方式&#xff0c;将对象的构建过程与表示分离。允许使用相同的构建过程创建不同的对象表示。 2. 适用场景 ✅ 需要创建包含多个…...

JMeter 中实现 100 个用户在 3 秒内并发登录

在 JMeter 中实现 100 个用户在 3 秒内并发登录,需要合理配置线程组、定时器和测试逻辑。以下是具体步骤: 1. 创建测试计划 打开 JMeter。右键点击“Test Plan”,选择 Add > Threads (Users) > Thread Group。 : 设置为 100(模拟 100 个用户)。 : 设置为 3...

SOME/IP-SD -- 协议英文原文讲解2

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 5.1.2.2 S…...

IntelliJ IDEA中Maven配置全指南

一、环境准备与基础配置 1.1 Windows 环境下载并配置 Maven 见此篇博文&#xff1a;环境配置 1.2 IDEA配置步骤 打开设置面板&#xff1a;File → Settings → Build → Build Tools → Maven 关键配置项&#xff1a; Maven home path E:\apache-maven-3.9.9 &#xff08;…...

第438场周赛:判断操作后字符串中的数字是否相等、提取至多 K 个元素的最大总和、判断操作后字符串中的数字是否相等 Ⅱ、正方形上的点之间的最大距离

Q1、判断操作后字符串中的数字是否相等 1、题目描述 给你一个由数字组成的字符串 s 。重复执行以下操作&#xff0c;直到字符串恰好包含 两个 数字&#xff1a; 从第一个数字开始&#xff0c;对于 s 中的每一对连续数字&#xff0c;计算这两个数字的和 模 10。用计算得到的新…...

20-R 绘图 - 饼图

R 绘图 - 饼图 R 语言提供来大量的库来实现绘图功能。 饼图&#xff0c;或称饼状图&#xff0c;是一个划分为几个扇形的圆形统计图表&#xff0c;用于描述量、频率或百分比之间的相对关系。 R 语言使用 pie() 函数来实现饼图&#xff0c;语法格式如下&#xff1a; pie(x, l…...

【LLM】R1复现项目(SimpleRL、OpenR1、LogitRL、TinyZero)持续更新

note &#xff08;1&#xff09;未来的工作需亟待解决&#xff1a; 支持大规模 RL 训练&#xff08;PPO、GRPO 等&#xff09;的开源基础框架用于稳定训练的 GRPO 训练超参的自动化调优RL 训练数据的配比&#xff08;难度、领域、任务等&#xff09;基于 Instruct 模型训练 R…...

Linux 内核网络设备驱动编程:私有协议支持

一、struct net_device的通用性与私有协议的使用 struct net_device是Linux内核中用于描述网络设备的核心数据结构,它不仅限于TCP/IP协议,还可以用于支持各种类型的网络协议,包括私有协议。其原因如下: 协议无关性:struct net_device的设计是通用的,它本身并不依赖于任何…...

20241130 RocketMQ本机安装与SpringBoot整合

目录 一、RocketMQ简介 ???1.1、核心概念 ???1.2、应用场景 ???1.3、架构设计 2、RocketMQ Server安装 3、RocketMQ可视化控制台安装与使用 4、SpringBoot整合RocketMQ实现消息发送和接收? ? ? ? ? 4.1、添加maven依赖 ???4.2、yaml配置 ???4.3、…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...