news 2026/10/30 1:09:23

基于S7-1200 PLC的升降横移式立体车库自动存取系统设计

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于S7-1200 PLC的升降横移式立体车库自动存取系统设计

做完了这个题目我才发现,它根本不是一个“交差就行”的毕设,而是一个能把PLC编程、电气控制、传感器选型、上位机组态、通信协议全部串起来的小型工业项目。如果你正打算做“基于PLC的立体车库自动存取系统设计”,或者手头拿了这份源码和LW文档不知道从哪下手,这篇文章我尽量按“我当年踩坑踩出来的经验”来写,从方案选型、IO表到底层程序怎么写、仿真怎么跑、上位机怎么连,一路拆到能直接抄作业的程度。

先说一点:这套设计的主控选的是西门子S7-1200,配合博途TIA Portal完成控制逻辑,车位模型采用升降横移式立体车库。之所以选这个组合,一是S7-1200在学校实验室覆盖率极高,二是博途环境里既能仿真又方便接组态王或触摸屏,三是这种“传感器+电机+逻辑互锁”的控制场景,用PLC做天然的比单片机稳得多。你拿到的源码主体也就是围绕这套方案写的,下面我按设计顺序逐层拆。

1. 系统整体设计与思路拆解

1.1 为什么立体车库和PLC是天生一对

立体车库解决的是城市停车难、地面车位利用率低的问题。传统的平面车位一辆车占一个车道宽的地面,而立体车库能往空中要车位,常见的升降横移式能轻松把车位数量扩大到平面停车的3到5倍。但问题来了:车位一多,车怎么存、怎么取、怎么防止机构撞车,就成了一个典型的逻辑控制问题。

这种控制问题有几个特点:

  • 输入信号多:每个车位有没有车、车辆到了哪个位置、升降台到没到指定层、横移框架到没到指定列,全靠传感器给信号。
  • 输出动作多:升降电机、横移电机、车位锁止电磁阀、声光报警器、运行指示灯,少说二十几个输出点。
  • 安全要求高:升降和横移绝对不能同时执行,上下限位必须形成双重保护,急停要在任何时刻都有效。
  • 逻辑是“状态转移”式:存车、取车本质上是把小车板从一个位置搬到另一个位置,中间每一步都不能跳。

单片机也能做,但从抗干扰能力、程序容错、继电器输出、扩展IO的方便程度上看,PLC是更“正”的方案。这也是为什么企业里停车设备控制柜里基本都是PLC。毕设选PLC做主控,既符合工业实际,也方便答辩时候说清楚“为什么不用单片机”。

1.2 三种库型里,为什么选升降横移式

立体车库类型很多:垂直循环式、垂直升降式、巷道堆垛式,还有升降横移式。我选升降横移式,核心原因有三个。

第一,结构直观。升降横移式就是“每层一排车位,底层留一个空位,通过左右横移腾出空位,上层车板再升降下来/升上去”。理解门槛低,画图、建仿真模型都容易,答辩时老师一眼能看懂。第二,控制逻辑的复杂度恰到好处。它既有横移的平移运动,又有升降的垂直运动,还涉及“空位寻址”和“路径规划”,能体现逻辑设计能力,又不至于像巷道堆垛那样算法太重。第三,资料多、可仿真。市面上大量毕业设计、控制系统案例都是升降横移式,遇到问题能找到参考。

模型尺寸方面,我用的是3层×5列的布局,底层为横移层,1号位为空位。总车位数是14个,加上一个空位作为搬运通道。这个规模对实验室硬件仿真和PLC点数的利用率都比较合适,控制器选型时点数不会太紧张,程序也能写够深度。

1.3 系统整体架构一张图看懂

整个自动存取系统可以分成四层:

  • 设备层:车位框架、载车板、升降电机、横移电机、光电传感器、限位开关、急停按钮。
  • 控制层:S7-1200 PLC,负责采集信号,执行逻辑,输出电机和指示控制。
  • 监控层:组态王或触摸屏,通过以太网实时读取车位状态、运行步骤、报警信息,并下发存取指令。
  • 方案层:毕业设计里的“设计文档”部分,用流程图和状态机把控制策略写清楚,方便后续编程和答辩。

这个分层让我在整个毕设期间头脑一直比较清晰:硬件接线归硬件,程序逻辑归程序,人机界面只做显示和命令下发。最忌讳的就是一边写梯形图一边改硬件,最后出了问题根本说不清是接线错了还是程序错了。

2. 核心硬件选型与IO规划

2.1 控制器选型:S7-1200怎么选型号

我选的是CPU 1214C DC/DC/DC,也就是24V直流供电、数字量输入和晶体管输出。平时课程设计里有人用继电器输出型,但做立体车库控制我不建议。继电器输出动作慢、寿命有限,更重要的是如果后续要把输出频率调高去控制变频器,继电器根本顶不住。晶体管输出频率高,配合小中间继电器驱动接触器,整体更稳。

1214C自带14个数字量输入、10个数字量输出,实际项目里不够用。我另外加了一块SM 1223数字量扩展模块,提供8入8出,最后总IO是22入18出,留有一定余量。实际上按我最终的I/O分配表,用了18个输入、15个输出,余量7个点,方便调试时临时加信号。

还有一个备选方案是S7-200 SMART SR40,如果实验室没有S7-1200,用200 SMART也能做。差别主要在博途和STEP 7-Micro/WIN SMART的软件环境不同,以及通信指令稍有差异,控制逻辑思路是一模一样的。但论文呈现上,S7-1200更能体现“以太网通信+组态监控”的现代PLC理念,所以我主推1200。

2.2 传感与驱动方案:信号怎么来,动作怎么做

车位上有没有车,这个信息不能靠猜,要在每个车位上方装光电传感器。我实际用的是漫反射式光电开关,安装难度低,对车辆轮廓反射足够可靠。入口处我用的是对射式光电开关,用来检测车辆是否完全进入载车板,防止车头还没进来就开始升降。

限位开关方面,每层升降到位和每列横移到位都要装机械式限位。有些同学只靠编码器或时间定时来判断到位,这样很危险,一旦电机打滑或者机械卡死,定时到点了机构还在动,轻则撞框架,重则掉车。所以我在程序里把限位信号放在首要判断位置,定时器只作为超时报警的辅助。

电机驱动有两种组合:

  • 升降电机:功率1.5kW,采用变频器拖动。频率设为30Hz慢速启动、缓慢停止,保证升降平稳。
  • 横移电机:功率0.75kW,用接触器正反转控制。横移速度较低,不需要变频,正反转切换时注意加延时,避免接触器打火。

这里有一个我在实际调试中得到的经验:变频器的频率不要一开始就设到工频50Hz。升降机构带着车板,惯性很大,高速到位时即使有限位开关,机械冲击也大。我最后把高速设到40Hz,低速爬行设到15Hz,接近目标前有一段低速运行,定位精度和舒适度都好很多。

2.3 一张表说清PLC的I/O分配

做PLC项目,第一件事就是把I/O分配表写清楚。我最后的分配表长这样:

输入信号I/O地址作用说明
存车按钮I0.0启动存车流程
取车按钮I0.1启动取车流程
急停按钮I0.2紧急停止所有动作
入口对射光电1I0.3入口是否有车辆
1层1列光电I0.41层1列车位占位检测
1层2列光电I0.51层2列车位占位检测
…………每列车位一个占位输入
升降上限位I2.0升降台到达最高层
升降下限位I2.1升降台到达最低层
各层到位限位I2.2~I2.4升降台到达2层/3层对应限位
横移左限位I2.5横移框架左行到位
横移右限位I2.6横移框架右行到位
手动/自动切换I2.7调试模式
输出信号I/O地址作用说明
横移电机正转Q0.0框架向右移动
横移电机反转Q0.1框架向左移动
升降电机上升Q0.2载车板上升
升降电机下降Q0.3载车板下降
变频器高速选择Q0.4变频器多段速1
变频器低速选择Q0.5变频器多段速2
运行指示灯Q0.6系统运行状态指示
报警蜂鸣器Q0.7故障报警声
存/取车完成指示灯Q1.0动作完成提示
各车位锁止电磁阀Q1.1~Q1.2对应车位锁止/解锁

注意这个表不是死的。比如你的库型是2层×4列,点位自然会少一些。关键是先把表做出来,然后按表去接线、按表去写程序。我见过很多同学嫌做表麻烦,直接对着端子板乱接,结果程序里地址对不上,查了一整天发现是I0.4在硬件上接到了I0.5。

3. 自动存取系统的核心控制逻辑

3.1 车位编码与调度策略:车停在哪、先停哪

3层×5列一共15个位置,我把每个车位编码成“层-列”的结构,比如1-1表示1层第1列,2-3表示2层第3列。底层是横移层,1列位置永远设为空位,作为通道。这样编码的好处是程序中用字或双字来表示坐标,运动控制的目标地址计算方便。

存车时最关键的问题:空车位那么多,车到底停到哪个?

我采用的是“就近低层优先”策略。也就是说,每次存车时扫描所有车位状态,先按层号从小到大找第一层,如果有空位选列号居中靠出口的;如果第一层满再找第二层,以此类推。这样做有两个好处:一是减少升降动作,节省存取时间;二是低层车位优先使用,机械结构受力均匀。

具体实现上,我在数据块里建了一张车位状态表DB_Data.CarStatus[1..15],每个元素是布尔的“1-占用、0-空闲”,程序里用一个循环扫描,找到第一个空闲的编码后,把目标层、目标列写进变量DB_Data.TargetLayer和DB_Data.TargetColumn。S7-1200的SCL语言里用FOR循环很方便,所以我这部分功能是用SCL写的,梯形图负责动作执行。如果你的老师要求必须用梯形图,也可以用一堆比较指令实现,但代码会冗长很多。

3.2 存车流程:一步步拆给PLC执行

存车流程我按状态机设计,用一个整型变量StepNumber表示当前步骤,每一步执行完毕满足条件后才进入下一步。这样做的好处是程序结构清晰、定位故障快。大致步骤如下:

  1. 检测入口对射光电,确认车辆已进入载车板,否则提示待车。
  2. 扫描车位状态表,确定最近空闲车位编号。
  3. 判断当前横移层列号与目标列是否一致,不一致则横移框架移动,目标列到位后停止。
  4. 判断目标层是否就是当前层,如果是,载车板不需要升降,直接等待车辆驶出;如果不是,启动升降电机,将载车板升/降到目标层。
  5. 目标层到位后,载车板继续向目标列平移,把车送入车位。
  6. 占位光电传感器动作,确认车辆到位,锁止机构动作锁住载车板。
  7. 升降台复位回到底层空位,横移框架回到初始列,置位“存车完成”指示灯,更新车位状态表。

流程图里,每一步之间的转移条件必须加上“上一步的动作输出已被确认”的信号,而不是光靠定时器。举例来说,升降台发出的动作是“上升”,转移条件是“上升限位Q0.1=1”且没有急停。我调程序的时候发现,如果不把“动作输出”和“到位反馈”同时检查,偶尔会出现电机还没停稳就开始横移的抖动现象。

3.3 取车流程:目标车怎么被送到出口

取车流程和存车正好相反。用户在触摸屏上输入车位号,PLC解析后把这个车位的编号存到变量TargetPosition:

  1. 校验输入车位号是否合法,是否在1-1到3-5范围内,同时检测该车位是否有车(占位信号=1),如果无车则报警提示。
  2. 空位通道移动到目标列,使目标车位正下方的横移通道空出。
  3. 载车板升降到目标层,准备接车。
  4. 横移机构伸出/移动,把目标载车板拉到升降台上。
  5. 升降台带着载车板回到底层出口层。
  6. 出口对射光电确认车辆驶出后,将载车板复位,更新车位状态表为空。

取车时有个细节:如果目标车位本身就是底层列且与出口列不一致,需要先把空位挪到目标列旁边,才能把目标车拉出来。这个“腾挪”过程在硬件上表现为连续几次横移动作,在程序里就是状态机多走两步。很多同学第一次调直接卡在这,以为程序死循环了,其实是目标车位和空位的相对位置关系没有处理好。

3.4 安全互锁:升降与横移必须“水火不容”

立体车库出安全事故,绝大多数是升降机构和横移机构同时动作导致载车板错位甚至坠落。所以在程序层面,必须设置硬互锁和软互锁双重保护。

硬件互锁方面,我在接触器回路里把升降接触器的常闭触点串到横移接触器线圈回路,反过来也一样。即使PLC程序出bug同时输出两个动作,接触器也无法同时吸合。软件互锁方面,梯形图里用“升降输出线圈前串联横移输出常闭触点”“横移输出线圈前串联升降输出常闭触点”,双保险。

另外,升降的上下限位有双重限位:第一道是目标层到位限位,到了就切断继续升降的输出;第二道是极限限位,如果第一道损坏,第二道限位直接断开主回路。我在程序里还做了“超时保护”,比如升降启动后8秒内未收到任何到位信号,立即报警停机。这一步在实际调试里非常重要,因为机械卡死是偶发问题,没有超时保护,电机会一直堵转发热烧毁。

4. 软件实现与仿真调试:可直接参考的实操过程

4.1 博途里的程序结构怎么搭

拿到源码打开博途,第一个建议是先把程序块结构认清楚。我的程序划分是:

  • OB1:主程序,循环调用各功能块。
  • FC1:车位调度与目标位置解析。
  • FC2:横移控制。
  • FC3:升降控制。
  • FC4:报警与状态指示。
  • DB1:全局数据块,存放车位状态、运行模式、目标地址、步骤号、报警码。

这样的模块化结构,调试的时候可以只看某一个功能块,不牵扯其他逻辑。很多同学喜欢把所有逻辑全写进OB1,到后面改一个点要翻几百行梯形图,效率很低。

关于数据块,S7-1200有一个关键设置:DB块的属性里必须勾选“允许从HMI/OPC访问”。不然组态王或者触摸屏读取数据时会显示“连接失败”或读出全0。这个坑我在做上位机时踩了很久,一度以为是自己网络配置问题,最后发现是DB块访问权限没开。

4.2 存车核心程序段怎么写

下面这段SCL代码是我在FC1里写的车位扫描与目标分配的核心逻辑,你可以对照你的源码找类似部分:

// 扫描车位状态表,找最近空闲车位 // 优先低层,同层优先靠近中间列(减少取车距离) i := 1; TargetPos := 0; WHILE i <= 15 DO IF DB_Data.CarStatus[i] = false THEN TargetPos := i; EXIT; // 找到第一个空位即停 END_IF; i := i + 1; END_WHILE; // 把编码拆成层和列 IF TargetPos > 0 THEN DB_Data.TargetLayer := (TargetPos - 1) / 5 + 1; DB_Data.TargetColumn := (TargetPos - 1) MOD 5 + 1; ELSE DB_Data.AlarmCode := 16#10; // 车库已满 END_IF;

在这段代码里,CarStatus数组的下标1对应车位1-1,下标2对应1-2,再往上5个下标对应2层。这样编号方式让程序里的“层”“列”计算非常直观。

梯形图部分,横移电机的控制我采用启保停电路加互锁:

// 横移右行(正转)启动条件 A "M横移右行启动" AN "M横移左行输出" AN "M升降输出" A "自动模式运行中" AN "急停" = "Q横移电机正转"

其中“M横移左行输出”和“M升降输出”是互锁条件。如果你用的博途版本,直接把符号名对应成变量即可。

升降控制我用了多段速选择。运行开始时置位“Q变频器高速选择”,接近目标层时清除高速、置位“Q变频器低速选择”,收到限位信号后全部复位。这样做的好处是既有速度,定位又稳。

4.3 PLCSIM仿真:S7-1200不能用的坑

博途自带S7-PLCSIM,可以直接仿真S7-1200的PLC程序。但很多同学下载的是S7-PLCSIM Advanced v5.0,这个版本只支持S7-1500的仿真,不支持S7-1200,结果程序加载到仿真器时提示“启动不了”“没有报错干脆不动作”。我在这里浪费过整整两天。

如果你用的是S7-1200,记住要用博途内置的经典S7-PLCSIM V14/V15/V16版本,而不是Advanced版本。仿真器启动后,把程序块下载到“虚拟PLC”里,然后通过仿真窗口里的按钮手动强制输入信号,比如点一下I0.0,看Q0.0有没有输出。这个方法在调状态机时特别好用,因为每一步转移条件都能迅速验证。

如果想模拟传感器信号变化,可以在PLCSIM里对输入点做“强制(FORCE)”操作。比如模拟车辆到位信号I0.4,强制为1,程序里的“车辆到位”条件就满足了。调试状态下,我发现用“CPU仿真”比“程序仿真”好使,因为前者连定时器都是真实运行的,后者有些定时器行为会异常。

4.4 实物调试的顺序建议

如果你手上有一套实物模型,千万别一上来就通电动所有机构。我调试的顺序是:

  1. 空载测试输出:手动给每个输出点置位,检查接触器吸合、指示灯亮、电机转动方向对不对。这个阶段最容易发现接线错误和电机正反接反的问题。
  2. 传感器测试:逐个触发限位和光电,观察输入状态是否有变化。光电开关的灵敏度旋钮调到一个合适位置,太灵敏会误检,太钝会漏检。
  3. 单动作测试:只测升降到一层、横移到一列,确认限位信号能可靠切断输出。
  4. 状态机测试:按存车流程走一遍,先不放大车板,用空载调试。
  5. 带载测试:放上模拟负载,调节变频器加减速时间,观察机械冲击。

每走一步都要在I/O表上打勾,确认信号和动作一一对应。我见过有同学跳过前三步直接仿真,结果一通电接触器就跳闸,查了两天发现是横移正反转两条线序接反了。

5. 上位机监控与通信:让系统“看得见”

5.1 三种上位机连接方案对比

立体车库系统加一个上位机监控画面,论文档次会明显提升。可选方案有三个:

方案通信协议适用场景难度
组态王+西门子S7-1200驱动S7协议课程设计、毕设常用,步骤简单低
触摸屏(如西门子Smart Line)博途直接组态更接近工业现场低
OPC UA服务器+自建上位机OPC UA想体现编程能力,做C#或Python上位机中高

如果老师没有强制要求,我推荐组态王。理由很简单:组态王驱动库里有S7-1200的以太网驱动,配置一个IP地址,填上DB号、偏移量,就能把PLC里的数据读出来。相比OPC UA还要搭UA服务器,组态王对毕设来说成本极低。

5.2 组态王与S7-1200通信的关键配置

首先,PLC和电脑的IP要在同一网段,比如PLC设192.168.0.1,电脑设192.168.0.2。组态王里新建设备时选择“S7-1200 TCP”,配置要点如下:

  • IP地址填PLC的IP。
  • 机架号默认0,插槽号默认1,不要随便改。
  • 数据块DB1的访问:在组态王“数据词典”里新建变量,寄存器类型选择“DB”,寄存器地址填“DB1, 0.0, 字节”这种格式,取决于你的数据在DB块里的偏移位置。
  • DB块必须勾选“允许从HMI/OPC访问”。

我当年组态王里读不到DB数据,排查了半天发现是PLC侧DB块属性没勾选。这个在前面提过,但真的值得再强调一次,因为博途默认不勾选,很多人会漏掉。

5.3 监控画面的数据映射逻辑

上位机画面我做了几个区域:车位状态总览、当前运行步骤显示、报警信息栏、手动控制按钮。车位状态总览直接读取DB_Data.CarStatus数组的15个元素,用绿色表示空位、红色表示占用,直观得像一个“车库地图”。

关键一点:上位机只做显示和命令下发,不要在组态王里写逻辑。存车还是取车、目标位置怎么算,全部留在PLC里。上位机的按钮只是把DB_Data.StartUse和DB_Data.StartTake这两个BOOL变量置true,PLC检测到后执行对应流程。这样你的监控层就是一个纯粹的“仪表盘”,后期换触摸屏、换上位机平台都不影响PLC程序。

组态王里还能顺手做一个数据库记录表格,把每次存取车的时间、车位号、动作类型记录下来。这个数据可以通过组态王SQL访问功能写到Access里,论文里展示一张“历史存车记录表”,对“信息化管理”这个评价维度很加分。

6. 常见问题与排查技巧实录

6.1 问题速查表

现象可能原因排查步骤
PLCSIM/PLCSIM Advanced虚拟PLC启动不了,且没有报错用错仿真器版本;实例名非法;网卡驱动异常确认S7-1200用经典S7-PLCSIM;实例名改成纯英文;重装网卡虚拟驱动
程序下载失败IP不在同一网段;PLC被其他程序占用;博途版本不一致检查PLC和电脑IP;关闭其他上位机软件;确认项目版本与软件匹配
所有输入信号都读不到传感器供电缺失;PLC输入公共端没接;接线松动万用表测传感器输出;查输入公共端是否接对
电机动作正常但状态机不往下走到位信号没送到;程序里限位地址与硬件不对应在PLCSIM或在线监控里看I点是否变1;对照I/O分配表检查地址
升降到不了目标层,总是冲过变频器高速太高;减速位置信号缺失;限位安装偏移调低高速频率到30~40Hz;增加减速限位;调整限位支架
组态王连不上PLCDB访问权限没勾;IP配置错;防火墙拦截勾选DB属性“允许HMI/OPC访问”;Ping通PLC;关闭Windows防火墙
接触器频繁跳闸电机相间短路;正反转切换太快断电查电机绕组;正反转之间加0.5~1秒互锁延时

6.2 排查经验:先看状态,再怀疑硬件

自动化系统排查有个通用原则:用PLC的在线监控从状态表入手,而不是先拿万用表到处测。你先把博途打开,在线连接PLC,打开I/O监控表,触发传感器看对应输入点是否变绿。如果I点状态正确,再查对应的Q点输出有没有动作。如果I点不变,基本可以断定问题在硬件侧(传感器、接线、供电)。把问题源一分为二地缩小范围,比漫无目的地查线快得多。

我在调试升降到位问题时,就是靠在线监控发现“层到位限位”输入一直为0,查了半天发现是限位开关的常闭/常开选反了。PLC数字量输入一般接常开触点,到位时触点闭合,输入变成高电平。如果你接了常闭,逻辑就全反了。

6.3 几个能直接抄的调试技巧

第一,逻辑分析用“步号变量”做追踪。我在程序里定义了一个DB_Data.StepNumber变量,存车/取车每一步都赋值不同的值。调试时在PLCSIM或在线监控里观察这个值跳到几,就能立刻知道程序卡在哪个环节。没有这个变量,几百行梯形图里找断点,眼睛真的会瞎。

第二,调试时把“超时报警”时间调短。正常运行时我设8秒,调试时改成3秒。程序一旦卡住,蜂鸣器马上响,不用老师提醒你就知道出问题了。

第三,给所有输出点加一个“调试模式”开关。手动模式下,可以直接通过上位机或按钮操作每一个电机,方便测试单个机构。这个开关在毕设答辩演示“手动/自动切换”时也是现成的亮点。

最后再说点个人经验

我做完这个课题最大的体会是,毕业设计不是“写一堆代码让老师觉得你工作量够”,而是“把一套控制系统从需求到落地完整走一遍”。这套立体车库系统,麻雀虽小,五脏俱全——从传感器信号采集,到PLC状态机调度,到变频器多段速控制,再到上位机远程监控,正好把一个工业自动化项目的核心环节全串起来了。

如果你拿到的源码是别人写好的,建议不要直接照抄去答辩。先看懂状态机的转移条件,然后照着I/O表把你的硬件接起来,把源程序里的地址和自己的接线对应一遍。哪怕只改一个输入点,你也对这个系统有了真正的掌控。

最后一个小建议:论文的LW文档里,流程图一定要自己画一遍,不要直接用源码里那份示意图。老师问起“为什么存车先要让空位移动”,你能顺着流程图把逻辑讲出来,这个毕设就稳了。

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

17款低功耗蓝牙SoC横向对比:射频、功耗、外设与选型避坑指南

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

作者头像 李华
网站建设 2026/10/30 1:07:53

PyTorch多GPU训练避坑指南:DDP实战、NCCL调优与日志诊断

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

作者头像 李华
网站建设 2026/10/30 1:07:53

ESP32-S3开发中GDB报错No match的排查与解决

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

作者头像 李华
网站建设 2026/10/30 1:07:11

SQL Server脚本导出导入与迁移:SMO、SqlBulkCopy避坑指南

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

作者头像 李华
网站建设 2026/10/30 1:06:49

香薰机智能语音控制芯片怎么选?低成本离线方案与选型要点解析

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

作者头像 李华
网站建设 2026/10/30 1:06:20

Android显示链路全解析:从MIPI-DSI到Java View的12级穿透

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

作者头像 李华