news 2026/9/27 6:26:10

CODESYS安装配置全攻略:从下载到PLC连接避坑指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CODESYS安装配置全攻略:从下载到PLC连接避坑指南

1. 为什么CODESYS值得你花时间折腾

搞工业自动化的人,迟早会碰到CODESYS这个名字。不管你是做PLC编程的老手,还是刚从电气控制转过来的新手,只要涉及到IEC 61131-3标准编程,CODESYS就是一个绕不开的平台。它不是一个具体的PLC品牌,而是一套完整的开发环境,支持梯形图、功能块图、结构化文本、指令表、顺序功能图这五种标准编程语言。换句话说,你学会了CODESYS,就相当于掌握了多品牌PLC编程的通用钥匙。

我第一次接触CODESYS是因为手头一个项目要用汇川PLC,之前一直用西门子博途,突然换平台确实有点不适应。但用了一段时间后发现,CODESYS的架构设计非常清晰,尤其是对于多轴运动控制和复杂逻辑运算,它的表现相当稳定。而且现在越来越多的国产PLC厂商,比如汇川、台达、和利时等,都在推基于CODESYS内核的产品,学会它意味着你的技能可以跨品牌复用。

这篇文章我打算把CODESYS从下载到配置的完整流程拆开讲清楚,包括安装过程中可能遇到的各种坑、授权管理、设备描述文件的导入、以及和实际PLC硬件的连接配置。适合刚入门PLC编程的朋友,也适合从其他平台迁移过来的老手参考。我会尽量把每一步的操作意图和背后的逻辑都说明白,让你不仅知道怎么点,还知道为什么要这么点。

2. 下载前的准备工作与版本选型

2.1 先搞清楚你需要哪个版本

CODESYS的版本管理是新手最容易迷糊的地方。官网提供多个版本分支,包括CODESYS Development System V3.5、V3.6等,每个大版本下面还有多个SP(Service Pack)小版本。我的建议是:不要盲目追求最新版,而是根据你实际使用的PLC硬件来决定。

举个例子,汇川的AM系列控制器目前官方推荐的是CODESYS V3.5.15或V3.5.16,如果你装了V3.6,可能会出现设备描述文件不兼容的情况。台达的AX系列也是类似,官方有明确的版本适配表。所以第一步应该是去你PLC厂商的官网或者技术支持那里确认推荐版本,而不是直接上CODESYS官网下载最新版。

另外还有一个容易忽略的点:32位和64位版本的选择。CODESYS Development System同时提供32位和64位安装包。如果你后续要集成一些第三方的库或者工具,比如某些老版本的OPC UA服务器或者视觉库,它们可能只支持32位环境。我个人的做法是主开发机装64位,虚拟机里备一个32位环境,遇到兼容性问题时可以快速切换。

2.2 系统要求与依赖组件检查

CODESYS对系统资源的要求不算高,但有几个关键依赖必须提前确认。操作系统方面,Windows 10和Windows 11都支持,Windows 7也能跑但官方已经不再维护。内存建议至少8GB,如果你要同时跑仿真和实际硬件调试,16GB会更从容。硬盘空间预留10GB以上,因为后续安装设备描述文件、库文件和项目备份都会占用不少空间。

.NET Framework是必须的,CODESYS V3.5 SP15以上版本需要.NET Framework 4.6.2或更高。Windows 10默认自带4.8,一般不用额外装。但如果你用的是Windows 7或者某些精简版系统,可能需要手动安装。另外Visual C++ Redistributable也是常见依赖,建议把2015-2022的x86和x64版本都装上,避免安装过程中报错。

还有一个容易被忽略的是网络环境。CODESYS安装程序在首次启动时会尝试连接在线库仓库,如果你的开发机不能访问外网,安装过程可能会卡在某个步骤。这种情况下可以提前下载离线库包,或者安装完成后在设置里关闭在线更新检查。

2.3 下载渠道与文件校验

CODESYS的官方下载渠道是codesys.com的下载页面,注册一个账号后就可以免费下载Development System。注意,CODESYS IDE本身是免费的,收费的是运行时授权(Runtime License),这个后面会详细讲。

下载的时候建议同时把对应的Device Description文件也下好。Device Description是CODESYS识别具体PLC硬件的关键文件,不同厂商、不同型号的PLC需要对应的描述文件。比如汇川的AM401、AM600系列,台达的AX-3系列,都有各自的描述文件包。这些文件通常在PLC厂商的官网或者CODESYS的Device Repository里能找到。

下载完成后一定要做文件校验。CODESYS的安装包一般在几百MB到1GB左右,下载过程中如果网络不稳定,文件可能损坏。校验方法很简单:对比官网提供的SHA256或MD5值,或者直接看文件大小是否一致。我遇到过一次安装到一半报“cabinet文件损坏”的错误,后来重新下载才解决,浪费了不少时间。

3. 安装过程详解与关键选项配置

3.1 安装向导中的关键选择

双击安装包后,安装向导会引导你完成一系列选择。第一个关键点是安装类型:Typical(典型)、Compact(精简)、Custom(自定义)。我的建议是选Custom,因为Typical会安装很多你可能用不到的组件,比如某些特定的通信驱动和示例项目,白白占用空间。Custom模式下你可以只勾选核心IDE、标准库、以及你需要的通信驱动。

第二个关键点是安装路径。默认路径是C:\Program Files (x86)\CODESYS\CODESYS 3.5.x.x,这个路径里包含了空格和括号,某些老版本的库或者脚本在处理路径时可能会出问题。我一般会改成C:\CODESYS\V3.5,简洁且没有特殊字符,后续在命令行里操作也方便。

第三个关键点是组件选择。这里有几个必须勾选的项:CODESYS Development System(核心IDE)、Standard Library(标准库)、Device Description(如果你已经下载了对应文件)、以及Gateway(用于和PLC硬件通信)。如果你要做可视化界面,还要勾选Visualization。如果要做运动控制,Motion功能块库也要选上。

3.2 安装过程中的常见报错与处理

安装过程中最常见的报错是“无法写入注册表”或者“权限不足”。这是因为CODESYS安装程序需要管理员权限来注册一些COM组件和文件关联。解决方法很简单:右键安装包,选择“以管理员身份运行”。如果你用的是公司电脑,IT策略可能限制了管理员权限,这种情况下需要联系IT部门临时提权。

另一个常见问题是安装到一半卡住,进度条不动。这通常是因为安装程序在尝试连接在线库仓库,但网络不通。解决方法是断开网络再安装,或者提前在安装选项里取消勾选“检查在线更新”。如果已经卡住了,不要强行结束进程,等它超时(一般5-10分钟)后会自己跳过。

还有一个比较隐蔽的问题是杀毒软件误报。某些杀毒软件会把CODESYS的Gateway服务或者某些DLL文件当成可疑程序拦截,导致安装完成后Gateway无法启动。遇到这种情况,需要在杀毒软件里把CODESYS的安装目录加入白名单,然后重新安装Gateway组件。

3.3 安装后的首次启动配置

安装完成后首次启动CODESYS,会弹出一个初始配置向导。这里有几个选项需要留意。第一个是“是否导入现有配置”,如果你是全新安装,选“否”;如果你之前装过旧版本并且想保留设置,可以选“是”并指定旧版本的配置目录。

第二个是“默认编程语言”的选择。CODESYS支持五种IEC 61131-3语言,你可以设置一个默认语言。我一般设成ST(结构化文本),因为做复杂运算和逻辑处理时ST比梯形图更高效。但这不影响你后续在项目里混用多种语言,只是新建POU时的默认选项。

第三个是“在线用户管理”的设置。CODESYS默认会提示你登录CODESYS账号,用于同步库和更新。如果你在离线环境工作,可以跳过这一步,后续在“工具-选项”里关闭在线检查。跳过登录不影响IDE的核心功能,只是不能在线获取库更新。

4. 授权管理与运行时配置

4.1 理解CODESYS的授权模式

CODESYS的授权模式是新手最容易困惑的地方。简单来说,IDE本身免费,但你要把程序跑到实际PLC硬件上,就需要对应的Runtime License。这个License是绑定到PLC硬件的,不是绑定到你的开发电脑。也就是说,你在一台电脑上开发,可以把程序下载到多台PLC上,但每台PLC都需要自己的License。

License的类型主要有几种:Demo版(免费,但运行有时间限制,一般2小时)、Standard版(功能完整,支持大部分应用)、Professional版(支持高级运动控制和可视化)。对于学习和小型项目,Demo版够用了;如果是商业项目,必须买对应的License。

还有一个容易混淆的概念是“SoftPLC”和“硬件PLC”的授权区别。SoftPLC是跑在工控机或者普通PC上的软件PLC,它的License是绑定到网卡MAC地址或者加密狗的。硬件PLC的License通常是厂商预置在硬件里的,你不需要单独购买,但功能可能受限于厂商的配置。

4.2 授权管理器的使用

CODESYS的授权管理通过“CODESYS License Manager”工具进行。安装IDE时会自动装上这个工具。打开后你可以看到当前电脑上已安装的License列表,以及每个License的状态(有效、过期、未激活)。

如果你买了License,会收到一个License文件(通常是.lic格式)或者一个激活码。导入方法是:打开License Manager,选择“导入License”,然后指定文件或输入激活码。导入成功后,License会显示在列表里,状态变为“有效”。

这里有个坑要注意:License是绑定硬件的,如果你换了电脑或者换了网卡,License会失效。这种情况下需要联系厂商重新生成License文件。所以我的建议是,开发机的硬件配置确定后就不要轻易改动,尤其是网卡和主板。

4.3 在虚拟机上运行CODESYS的注意事项

很多人喜欢在虚拟机里跑CODESYS,方便做快照和迁移。这本身没问题,但有几个点要注意。第一,虚拟机的网卡模式建议用桥接模式,这样虚拟机和PLC硬件在同一个网段,通信更稳定。NAT模式下可能会出现Gateway连不上的情况。

第二,虚拟机的USB控制器要设置成USB 3.0或更高,否则某些USB转串口线或者加密狗可能识别不了。第三,如果你在虚拟机里跑SoftPLC,性能会比物理机差一些,尤其是做运动控制时,周期抖动可能会变大。建议给虚拟机分配至少4个CPU核心和8GB内存,并且把虚拟磁盘放在SSD上。

还有一个实际经验:VMware Workstation的“继续运行脚本未能在虚拟机中成功运行”这个报错,通常是因为VMware Tools的安装脚本被系统策略拦截了。解决方法是以管理员身份运行VMware Tools安装程序,或者在虚拟机设置里把“隔离”相关的选项关掉。

5. 设备描述文件导入与硬件连接

5.1 Device Description的获取与安装

Device Description(设备描述文件)是CODESYS识别PLC硬件的关键。没有它,你在“设备”列表里就找不到对应的PLC型号。获取途径主要有两个:一是PLC厂商官网,比如汇川、台达、和利时都会提供下载;二是CODESYS的Device Repository在线仓库。

安装方法有两种。第一种是通过CODESYS IDE的“工具-设备仓库”菜单,选择“安装设备描述文件”,然后指定你下载的.xml或.devdesc文件。第二种是直接把文件复制到CODESYS安装目录下的DeviceRepository文件夹里,然后重启IDE。我推荐第一种方法,因为IDE会自动处理依赖关系和版本兼容性。

这里有个常见问题:设备描述文件的版本和CODESYS IDE的版本不匹配。比如你用的是V3.5.15的IDE,但下载的是V3.5.17的描述文件,可能会提示“不兼容”。解决方法是去厂商官网找对应版本的描述文件,或者升级IDE到匹配的版本。不要强行安装不兼容的文件,否则后续编译会出各种奇怪的错误。

5.2 扫描和添加PLC设备

设备描述文件装好后,就可以在项目里添加PLC了。在CODESYS的“设备”视图中右键点击“Device”,选择“添加设备”,然后在弹出的对话框里搜索你的PLC型号。比如输入“AM401”就能找到汇川的AM401系列。

添加设备后,需要配置通信参数。最关键的是IP地址和Gateway设置。CODESYS通过Gateway服务与PLC通信,Gateway默认监听1217端口。如果你的PLC和开发机不在同一网段,需要在Gateway配置里添加路由或者修改网络设置。

扫描PLC的方法:在“在线”菜单里选择“扫描设备”,CODESYS会通过Gateway广播搜索同一网段内的PLC。如果搜不到,先检查网线是否插好、IP是否在同一网段、防火墙是否放行了1217端口。我遇到过Windows防火墙拦截Gateway的情况,表现就是扫描不到任何设备,关掉防火墙或者添加例外规则就好了。

5.3 修改PLC的IP地址

CODESYS修改PLC IP地址的操作和西门子博途不太一样。在CODESYS里,你需要先在线连接到PLC,然后在“设备”视图里右键点击PLC,选择“属性”,在“通信设置”里修改IP地址。修改后需要重新扫描或者手动输入新IP来重新连接。

这里有个细节:某些PLC的IP地址修改后需要重启才能生效,而有些是立即生效。汇川的AM系列是立即生效,但台达的AX系列需要断电重启。如果你修改后连不上,先试试重启PLC。另外,修改IP前最好确认新IP没有被其他设备占用,否则会出现IP冲突,导致通信不稳定。

还有一个实用技巧:如果你有多台PLC需要批量修改IP,可以写一个简单的脚本通过CODESYS的命令行接口来操作。不过这个属于进阶内容,新手先把单台修改练熟再说。

6. 常见问题排查与实操避坑指南

6.1 安装类问题速查

问题现象可能原因解决方法
安装程序无法启动权限不足或缺少.NET Framework以管理员身份运行,安装.NET 4.6.2+
安装到一半卡住网络不通,尝试连接在线仓库断网安装或取消在线更新检查
安装完成后Gateway无法启动杀毒软件拦截或端口被占用添加白名单,检查1217端口占用
提示cabinet文件损坏安装包下载不完整重新下载并校验文件哈希
设备描述文件不兼容版本与IDE不匹配下载对应版本或升级IDE

6.2 通信类问题排查思路

通信问题是最常见的,表现也多种多样。我总结了一个排查顺序:先看物理层,再看网络层,最后看应用层。

物理层就是网线、网口、指示灯。网线插好后,看网口的Link灯是否亮,Activity灯是否闪烁。如果不亮,换根网线或者换个网口试试。网络层就是IP地址、子网掩码、网关。确保开发机和PLC在同一网段,子网掩码一致。可以用ping命令测试连通性,如果ping不通,先解决网络问题。

应用层就是Gateway服务和CODESYS的通信设置。确认Gateway服务在运行(可以在Windows服务里查看“CODESYS Gateway”服务状态),确认防火墙放行了1217端口,确认CODESYS里选择的Gateway是正确的(有时候装了多个版本会有多个Gateway实例)。

还有一个容易被忽略的点:某些PLC的通信端口不是默认的1217,比如有些厂商会改成1218或者自定义端口。这种情况下需要在CODESYS的Gateway配置里手动指定端口。

6.3 授权类问题与解决方案

授权问题通常表现为“无法下载程序”或者“PLC运行时间受限”。如果提示“License无效”或“License过期”,先检查License Manager里的状态。如果是Demo版,运行2小时后会停止,需要重新下载或者购买正式License。

如果License文件导入失败,检查文件是否完整、是否绑定了当前电脑的硬件信息。有些License文件是绑定网卡MAC的,如果你换了网卡,需要重新生成。还有一种情况是License文件被其他程序占用了,比如某些加密狗管理软件,关掉这些程序再导入试试。

对于学习用途,我建议先用Demo版熟悉流程,等实际项目需要了再买License。Demo版除了时间限制,功能上和正式版没有区别,足够你学习和测试。

6.4 实操心得与避坑建议

第一个心得:安装前一定要做系统快照或者备份。CODESYS安装会修改注册表和系统服务,如果装出问题,卸载重装可能残留垃圾。用虚拟机的话,装之前打个快照,出问题直接回滚,省时省力。

第二个心得:不要混装多个版本的CODESYS。我见过有人同时装了V3.5和V3.6,结果Gateway服务冲突,两个版本都连不上PLC。如果确实需要多版本,建议装在虚拟机里隔离。

第三个心得:项目文件要定期备份。CODESYS的项目文件是二进制格式,损坏后很难修复。我一般用Git做版本管理,每次修改后提交一次,这样即使文件损坏也能回退到之前的版本。

第四个心得:遇到问题先看日志。CODESYS的日志文件在安装目录的Logs文件夹里,Gateway的日志在Windows事件查看器里。日志里通常有详细的错误信息,比弹窗提示有用得多。

7. 从安装到第一个项目的完整流程

7.1 创建新项目与设备配置

安装和配置都搞定后,就可以创建第一个项目了。打开CODESYS,选择“文件-新建项目”,在弹出的对话框里选择“标准项目”,然后指定项目名称和保存路径。接下来会提示你选择设备,这里选你之前添加的PLC型号。

项目创建后,在“设备”视图里会看到PLC设备和它的子模块。双击PLC设备可以打开设备配置页面,这里可以设置通信参数、周期时间、以及各种硬件相关的选项。对于新手,大部分选项保持默认即可,重点确认IP地址和Gateway设置正确。

7.2 编写第一个PLC程序

在“设备”视图里右键点击“Application”,选择“添加对象-POU”,创建一个新的程序组织单元。POU是CODESYS里的基本编程单元,可以理解为一个函数或者一个程序块。创建时选择编程语言,新手建议从梯形图(LD)开始,直观易懂。

写一个简单的起保停电路:定义一个启动按钮变量、一个停止按钮变量、一个输出变量。在梯形图里画一个标准的起保停逻辑,然后编译检查是否有错误。编译通过后,就可以下载到PLC了。

下载前先在线连接PLC,确认通信正常。然后点击“在线-登录”,再点击“在线-下载”。下载完成后,PLC会进入运行模式,你可以通过“在线-调试”来监控变量状态,验证程序逻辑是否正确。

7.3 仿真模式的使用

如果你手头没有PLC硬件,可以用CODESYS自带的仿真模式来测试程序。在设备配置里把“仿真”选项勾上,然后登录和下载时选择仿真模式。仿真模式下,CODESYS会在电脑上模拟一个PLC运行环境,你可以像操作真实PLC一样调试程序。

仿真模式的好处是不依赖硬件,随时随地都能写代码和测试。但要注意,仿真模式下的时序和真实PLC有差异,尤其是涉及高速计数和运动控制时,仿真结果只能作为参考,最终还是要上真实硬件验证。

7.4 项目归档与迁移

项目完成后,建议做一次归档。CODESYS支持“项目-归档”功能,可以把整个项目(包括库文件、设备描述文件、编译输出)打包成一个归档文件。这样迁移到另一台电脑时,不需要重新安装库和设备描述文件,直接打开归档就能继续开发。

归档时注意选择“包含所有依赖”选项,否则可能会漏掉某些库文件。归档文件通常比较大,但胜在完整。如果只是日常备份,用Git管理项目源文件就够了,归档更适合交付给客户或者迁移到新环境。

8. 进阶方向与技能扩展

8.1 学习IEC 61131-3标准语言

CODESYS的核心价值在于它完整实现了IEC 61131-3标准。如果你想深入掌握PLC编程,建议系统学习这五种语言的适用场景。梯形图适合逻辑控制,功能块图适合过程控制,结构化文本适合复杂运算,指令表适合底层优化,顺序功能图适合状态机设计。

实际项目中,往往需要混用多种语言。比如用梯形图做主控逻辑,用ST写PID算法,用SFC做流程控制。CODESYS支持在同一个项目里混用这些语言,灵活性很高。

8.2 掌握通信协议配置

工业自动化离不开通信。CODESYS支持Modbus RTU/TCP、EtherCAT、Profinet、CANopen、OPC UA等多种协议。学会配置这些通信协议,你就能把PLC和各种变频器、伺服驱动器、传感器、HMI连接起来。

比如你提到的“PLC控制32台变频器”,用Modbus RTU轮询是一种方案,用EtherCAT总线是另一种方案。前者成本低但速度慢,后者速度快但硬件成本高。具体选哪种,要看你的实时性要求和预算。

8.3 探索SoftPLC与边缘计算

CODESYS不仅可以跑在专用PLC硬件上,还可以作为SoftPLC跑在工控机、边缘计算网关、甚至树莓派上。这为边缘计算场景提供了很大的想象空间。你可以在边缘网关上跑CODESYS做实时控制,同时跑Python做数据分析和上云通信。

这种架构的优势是灵活、成本低,缺点是实时性不如专用硬件。对于大多数工业场景,SoftPLC的实时性已经够用了,除非你的控制周期要求小于1毫秒。

8.4 利用AI辅助PLC编程

现在有一些工具可以用AI辅助生成PLC代码,比如根据自然语言描述生成梯形图或者ST代码。这些工具目前还不够成熟,生成的代码需要人工审核和优化,但作为学习辅助还是不错的。你可以用AI生成一个基础框架,然后自己调整逻辑和参数。

不过要注意,AI生成的代码可能存在逻辑漏洞或者不符合IEC标准的地方,直接用到实际项目里有风险。我的建议是把AI当成一个“代码补全”工具,而不是“代码生成”工具,核心逻辑还是要自己把控。

9. 个人实操体会与建议

折腾CODESYS这几年,我最大的体会是:安装和配置虽然繁琐,但每一步都有它的道理。很多人遇到问题就想着重装系统或者换软件,其实大部分问题都有更简单的解决方法。关键是要学会看日志、查文档、做实验。

另外,不要怕犯错。我刚开始用CODESYS的时候,因为授权问题折腾了好几天,后来发现只是License文件放错了目录。这些坑踩过一次就记住了,比看十遍教程都管用。

最后分享一个小技巧:如果你在安装或配置过程中遇到问题,先去CODESYS的官方论坛搜一下错误信息。那个论坛很活跃,很多问题都有现成的解决方案。实在找不到,再发帖问,通常很快就能得到回复。工业自动化这个圈子不大,大家都很乐意帮忙。

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

PowerShell 2.0不是软件,是Windows系统级组件

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

作者头像 李华
网站建设 2026/9/27 6:20:38

DNA序列分类实战:频率特征、主成分分析降维与Fisher判别

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

作者头像 李华
网站建设 2026/9/27 6:18:22

STM32 HAL库DMA+IDLE+状态机实现SBUS协议解析

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

作者头像 李华
网站建设 2026/9/27 6:17:29

数学建模降落伞选择:参数估计与约束优化实战

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

作者头像 李华
网站建设 2026/9/27 6:15:51

星空组网排查指南:从设备在线到服务可用的五步检查

🔥承渊政道:个人主页 ❄️个人专栏: 《C语言基础语法知识》 《数据结构与算法》 《C知识内容》 《Linux系统知识》 《算法刷题指南》 《测评文章活动推广》 《大模型语言路线学习》 《MySQL数据库学习》 《Python知识内容》 《cpolar知识学习》 ✨逆境不…

作者头像 李华
网站建设 2026/9/27 6:15:27

电磁波极化实验拆解:从马吕斯定律到布儒斯特角的完整指南

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

作者头像 李华