news 2026/9/28 1:59:39

欧姆龙PLC通信协议全解析:从Host Link到FINS/TCP实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
欧姆龙PLC通信协议全解析:从Host Link到FINS/TCP实战指南

干工控这行,尤其是常跟欧姆龙PLC打交道的人,恐怕都听过一句吐槽:“欧姆龙的软件挺好用,但它的通信协议是真的抽象。”我之前也是这么认为的,从第一次拿Host Link命令去读一个DM区数据,到后来用FINS/TCP从上位机批量读写数据,中间踩过的坑能装满两个工具箱。可等我真正把欧姆龙这套通信体系理顺之后才发现,它其实一点不乱,反而设计得相当有层次,只是官方文档习惯把“能做什么”和“怎么用”分开写,入门的人很容易被一串串术语绕晕。

这篇东西就是我自己的一个复盘总结。不绕弯子,直接讲清楚欧姆龙PLC通信协议里那些“一看就懂、一用就错”的点,包括串口、以太网、FINS协议、485总线和第三方设备通信,每一步我都会说为什么这么配、实际调试中会碰到什么问题。不管你是刚上手CP1系列、还在和CX-Programmer搏斗,还是已经在用Sysmac Studio调NJ/NX、需要和变频器或温控表做数据交换,这篇文章应该都能帮你少走点弯路。

1. 先搞懂欧姆龙PLC通信协议有哪些层

很多初学者第一次接触欧姆龙通信,都是从一个很具体的需求开始的:电脑怎么跟PLC交换数据?或者触摸屏怎么读PLC里的D区?然后就看到文档里出现Host Link、FINS、Modbus-RTU、EtherNet/IP、EtherCAT一堆名词,瞬间就懵了。

其实欧姆龙的通信体系,从我自己的理解来看,可以分成三“层”来记:串口时代的协议、以太网时代的协议、以及新一代总线级的协议。这三层不是互相替代的关系,而是根据硬件平台和应用场景并存的。搞懂这三层,后面很多问题都能对号入座。

1.1 串口通信:Host Link、FINS串行和编程口

欧姆龙早期PLC(C系列、CPM系列,包括后来的CP1系列)最常用的串口通信就是Host Link协议。这个协议本质上是欧姆龙自己定义的一套ASCII字符命令,通过RS-232C或RS-485口,以上位机发命令、PLC回应答的方式工作。

Host Link的特点非常“复古”:一条指令就是一串可见字符,比如以“@”开头,接着是两位十六进制的单元号,然后是命令代码,最后是校验码。它不需要安装驱动,任何一个串口调试助手都能发,这也是为什么很多老工程师到现在还在用Host Link做快速测试。但也正因为它是字符协议,传输效率不算高,一条命令只能操作一小段数据区域,不适合大批量实时读写。

除了Host Link,欧姆龙还支持通过串口跑FINS协议,这就是所谓的“FINS串行”。FINS(Factory Interface Network Service)是欧姆龙真正意义上的应用层通信协议,它不关心底层是串口、以太网还是SYSMAC LINK,它定义的是一套“内存区读写”的抽象命令。换句话说,Host Link是“字符命令”,FINS是“二进制帧命令”,而欧姆龙更推荐的是FINS,因为它能统一不同物理链路上的通信方式。

还有个概念叫“编程口”。很多用户用USB转232线插到CP1H前面的外设口下载程序,用的其实就是FINS协议,只不过软件CX-Programmer自动帮你把协议封装好了。这也是为什么有时候你用一个第三方串口助手去“模仿”CX-P发命令,却怎么也连不上——因为默认外设口的协议选择、波特率、数据格式跟通信口不一定一样。

1.2 以太网通信:FINS/TCP和FINS/UDP

到了以太网时代,欧姆龙把FINS协议打包进了TCP/IP和UDP/IP里,就成了大家常说的FINS/TCP和FINS/UDP。这两种方式最大的优势是:上位机可以直接通过网络读写PLC的I/O、DM区、CIO区,不需要像串口那样独占物理链路,而且可以同时和多台PLC通信。

FINS/TCP和FINS/UDP的关系有点像打电话和发传真的区别。FINS/TCP要先建立一个TCP连接,保证报文有序到达,适合需要可靠传输的场景;FINS/UDP则是无连接的数据报,速度快一点,但报文可能会丢,需要在应用层自己做重试。欧姆龙的默认FINS端口是9600,不管TCP还是UDP都是这个端口,这也是排查连接问题时要记住的一个数字。

在使用FINS/TCP时,有一个非常容易忽略的点:你不仅要设置PLC的IP地址,还要设置PLC的“FINS节点号”。节点号是欧姆龙FINS编址体系里的一个参数,范围是1到254,它跟IP地址不是一回事。如果上位机发的报文里目标节点号跟PLC实际设置的节点号对不上,就算网络是通的,PLC也不会理你。这个坑我后面细说。

1.3 新一代平台:EtherCAT、EtherNet/IP和Sysmac Studio

如果你用的是欧姆龙最新的NJ/NX系列,会发现通信体系又不一样了。NJ/NX系列更依赖Sysmac Studio进行配置,运动控制走EtherCAT,设备层通信走EtherNet/IP,同时也保留了对FINS命令的支持。

EtherCAT是一种实时工业以太网总线,适合伺服轴控制和高同步性场景;EtherNet/IP则是基于CIP协议的标准工业以太网,主要用于PLC与PLC、PLC与远程IO之间的数据交换。对刚接触Sysmac Studio的人来说,最困惑的不是协议本身,而是“配置方式从‘编程’变成了‘组态’”——你要先在软件里建好网络拓扑,给每个从站分配节点地址,然后再通过“变量映射”的方式关联数据。跟CP系列的“直接在D区里读写地址”完全是两套思路。

不过,对于大多数做上位机、触摸屏对接的开发者来说,最核心的仍然是FINS协议。就算你用的是最新款NJ系列,只要它支持FINS命令,你的上位机程序逻辑和之前写的并没有本质区别。所以这篇文章后面会以FINS为主线展开。

2. 实测:电脑和PLC之间的串口通信,怎么一步步调通

串口通信看着简单,实际上是最容易翻车的环节。尤其是现在笔记本电脑基本没有原生串口,大家只能用USB转RS232或者USB转RS485线,这中间光是驱动和线序就能卡住半天。我自己早期就干过一件蠢事:拿着一根USB转TTL的线去连CP1W-CIF01的RS422口,结果收发完全没反应,最后才发现是电平标准根本不匹配。

2.1 硬件连接:先确认电平标准,再谈协议

欧姆龙CP1系列PLC的串口主要有两种物理形式:一种是CPU单元自带的RS-232C口,常见于CP1H、CP1L等型号;另一种是通过通信板扩展出来的RS-422/485口,比如CP1W-CIF11、CP1W-CIF12。这两种口的引脚定义不一样,接线方法也完全不同。

如果是RS-232C口,和PC侧通讯通常需要“交叉线”:PLC的发送接PC的接收,PLC的接收接PC的发送,地线必须共地。用USB转232线时,原理也是一样,只不过连接器往往已经内置了转换逻辑,你只要把DB9公头跟PLC对插时注意对应引脚即可。这里我要反复强调一句:地线一定要接、要接、要接。不共地的串口通信,经常出现“偶尔能通一下,但数据全是乱码”的诡异现象,拿万用表量电压又觉得哪哪都对,其实就是地电位差在作怪。

如果是RS-485口,两线制(A、B)就简单很多,只要A接A、B接B即可。但485总线是半双工,而且需要终端电阻匹配。长距离多站点连接时,总线两端还需要加终端电阻(通常是120欧姆),否则波形反射会造成数据帧错误。

接好线之后,先用设备管理器确认USB转串口线识别出的COM口号,用串口调试助手打开这个COM口时,别急着发命令,先把参数和PLC侧设置改成一致,这是下一节的重点。

2.2 CX-Programmer里的通信参数设置

欧姆龙PLC的串口通信参数是在PLC设置里配置的。在CX-Programmer中双击左侧工程树里的“设置”,打开“串口1”或“串口2”选项卡,你会看到协议、波特率、数据位、停止位、校验位这几个选项。

以常用设置为例:协议选“Host Link”,波特率根据设备和线缆质量设为9600或19200,数据位8位,停止位1位,偶校验(Even),单元号设为0。这几个参数看似平平无奇,但任何一个跟对端不一致,通信就起不来。很多人在CX-P里下载设置时,忘记把PLC切换到“编程模式”,导致设置写入失败,这也是老生常谈的坑。

需要注意,PLC设置修改后并不会立即生效,通常要断电重启或者通过CX-P的“复位”操作让新参数加载。而且下载设置前,最好先把PLC拨码开关调到编程模式,等设置保存完再切回运行模式。否则在运行模式下写入通信设置,轻则写入失败,重则通信过程中PLC处在异常状态,现场就被你搞停机了。

2.3 用串口助手快速验证通信链路

配置完成后,可以先不急着写上位机程序,用串口调试助手发一条Host Link命令测试下链路是否通。比如读DM0000的一个字,命令格式大致是:@00RD00000001+FCS。这里的“@00”是起始符加单元号,“RD”是读命令,“0000”是起始地址,“0001”是读取字数,“FCS”是两位校验码。

这个FCS校验码需要自己计算,是把@之后的每个字符的ASCII码做异或运算,最后转成两位十六进制字符加在命令尾部。很多第一次接触的人都会在这里卡住。我的小技巧是:手头常备一个小的计算器工具,或者在电脑上写一个几行的FCS计算函数,不要手动算,太容易错。

如果PLC正常响应,串口助手的接收区会出现类似“@00RD0000...”的回显格式。如果没反应,先把PLC的通信指示灯和串口助手的发送计数对比一下:发送计数在涨、但没有任何接收数据,那基本可以判定是接线、波特率、校验位这三个问题之一。按这个顺序排查,十有八九能找到原因。

3. FINS协议拆解:从报文结构到上位机实例

如果说Host Link是“小打小闹”,那FINS就是真正能干大事的协议。它能读写几乎所有内存区,包括CIO、WR、DM、EM甚至定时器计数器的PV值和状态位,而且报文结构非常规整,用任意语言都能实现。我见过不少项目,上位机用C#或者Python直接往PLC发FINS帧,效果比用组态软件还灵活。

3.1 FINS/TCP帧到底长什么样

FINS/TCP的报文分两层:首先是TCP报文头,然后是FINS报文。TCP报文头是固定的10个字节:前4个字节是ASCII字符“FINS”,接着4个字节是报文长度(这里的长度是从“命令”字段开始到整个报文体结束的字节数),再接着2个字节是命令码和错误码的相关字段。后面才是真正的FINS正文。

FINS正文则有固定的12字节头加上命令代码和参数。这12字节头里最重要的是目标网络号、目标节点号、目标单元号、源网络号、源节点号、源单元号,以及服务ID。很多人第一次看官方手册时,会被这一堆“NA、DA、SA”搞晕,但其实只需要抓住一点:你要告诉PLC“我是谁、我要发给谁”。

举个例子,假设PLC的IP地址是192.168.1.20,FINS节点号设置为1,上位机节点号设置为0,那么读取D100开始的10个字,完整的FINS请求帧大致会包含以下内容:目标网络号00、目标节点01、目标单元00、源网络号00、源节点00、源单元00,服务ID随意比如AA,命令码0101(内存区读取),内存区代码82(DM区),起始字地址0064,位地址00,读取字数000A。把这串十六进制组出来,再加上前面TCP头,就是一条可以发送的FINS报文。

3.2 用Python做最简单的FINS/UDP读取

对于上位机快速验证,我最推荐用FINS/UDP而不是TCP,原因很简单:UDP不需要建连和断连,构造一个socket就能发,调试时方便。下面这段Python代码就是我当时用来验证FINS读取D区的最小示例:

import socket plc_ip = "192.168.1.20" plc_port = 9600 # FINS 报文头(目标节点1,源节点0,服务ID 0xAA) fins_header = bytes.fromhex("80 00 02 00 00 01 00 00 00 00 00 AA") # 命令: 0101 读内存区,区域82(DM),字地址0064,位地址00,读取字数000A fins_cmd = bytes.fromhex("01 01 82 00 64 00 00 00 0A") # FINS/UDP 数据报 = FINS标签头(4字节) + 长度(4字节) + FINS报文 packet = b"FINS" + (len(fins_header + fins_cmd)).to_bytes(4, "big") + fins_header + fins_cmd sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.settimeout(1) sock.sendto(packet, (plc_ip, plc_port)) data, addr = sock.recvfrom(1024) print(data.hex())

这段代码的关键在于两点:字节顺序都是大端,也就是高位字节在前;长度字段统计的是FINS报文的字节数,而不是整个packet的长度。我之前就因为在长度字段上多加了4个字节,导致PLC根本没法解析这条报文,一直以为是节点号不对。

收到响应后,数据区的前一部分是命令码和结束码,0表示正常,若结束码非0,PLC会告诉你具体是地址非法还是格式错误。需要注意的是,读出来的数据每个字是2字节,而且欧姆龙的高位字节在前,所以如果你要拼成16位有符号整数,得先把高字节左移8位再加上低字节。

3.3 那些“看起来对不上”的地址映射

FINS的地址映射是很多人的噩梦。先说D区,FINS报文里的“字地址”是从0开始的,而且它跟你在CX-Programmer里看到的梯形图地址DM0000是对应的。比如D100,报文里要写十六进制0064,只要你把十进制100转成十六进制就行,这个还算友好。

但CIO区就没这么直觉了。CIO区的地址在FINS里要用“区代码+字地址+位地址”来表示,比如CIO0.00,对应区代码是0x30,字地址是0,位地址是0。而W区(内部工作区)的区代码是0x31,H区是0x32,S区是0x33。用的时候拿不准,就去翻官方“FINS命令参考”里的内存区代码表,不要凭感觉猜。

真正让人抓狂的是位地址。读取字数据时位地址填0没错,但有些协议文档会告诉你,如果你要读写某个位,比如D100.01,报文里的地址就不是单纯的字地址+位地址,而是要把字地址和位地址拼接后作为一个3字节字段发送。这点在写程序时非常容易漏,我的习惯是封装一个“FinsAddress”类,把内存区代码、字地址、位地址拆开管理,绝不直接拼硬编码。

3.4 FINS/TCP连接时最容易踩的“节点号”坑

前面提到,上位机通过FINS/TCP访问PLC时,除了IP地址,还必须确保FINS报文里的目标节点号与PLC的FINS节点号一致。在CX-Programmer里设置以太网或通信单元时,会有一个“FINS节点号”选项,一般默认是1或根据单元号自动分配。很多人在做上位机时只关心IP能不能ping通,完全不看节点号,结果TCP三次握手都能成功,但PLC就是不回业务报文。

我当时的解决方案是:先打开CX-P的在线监控,查看PLC分配到的实际节点号,有条件的话直接在PLC设置里把节点号固定下来,比如固定成1。上位机程序里也写死1,测试通过后再改成可配置的。养成“工程项目里所有通信参数都是白纸黑字写在配置表上”的习惯,能省掉很多后期排查时间。

4. 用485和第三方设备通信:变频器、仪表和温控表

欧姆龙PLC不会只跟自家设备通信。现场变频器可能是台达的、汇川的,温控表可能是欧姆龙自己的E5CC,也可能是别的牌子。这些设备大多支持Modbus-RTU,所以欧姆龙PLC与它们通信的实质,就是把PLC当作Modbus主站,去轮询各个从站设备。

4.1 RS-485总线布线上的坑

先说物理层。RS-485是差动信号,A、B两根线之间的电压差决定逻辑状态,理论上抗干扰能力很强,但实际现场总会有变频器、电机这类大功率设备,一旦布线不走线槽、屏蔽层不接地,通信就会出现随机性丢帧。

我在现场踩过最典型的坑是“屏蔽层两端都接地”。变频器启动瞬间,地电位瞬间抬升,屏蔽层反而成了干扰耦合通道,通信直接罢工。后来按规范改成单端接地,设备端屏蔽层悬空,问题立刻消失。另外一个坑是A、B线接反,虽然有些设备能自动识别,但很多老设备不行,接反的结果是“发命令没响应、示波器看波形又好像有数据”。所以接线后第一件事就是确认A/B定义,千万不要默认红色就是A。

4.2 欧姆龙PLC做Modbus-RTU主站

欧姆龙CP系列PLC要做Modbus主站,不同型号支持情况不一样。部分型号(比如配备串行通信单元后)支持“Modbus-RTU简易主站”功能,也有的需要你用通信协议宏或者通过梯形图指令手动发送Modbus报文。如果是CP1H,使用串口通信板并且软件版本支持的情况下,可以用Modbus-RTU简易主站功能,把串口设为“Modbus RTU master”后,在DM区分配通信参数即可。

这个通信参数区里通常要填的内容包括:从站地址(1到247)、功能码(比如03读保持寄存器、06写单个寄存器、10h写多个寄存器)、起始寄存器地址、寄存器数量、数据存放区等。看起来和直接用自由协议差不多,但好处是欧姆龙已经把CRC校验和报文封装做好了,你只需在触发位给一个上升沿,通信结果会自动写到状态区。

这里我要强烈建议:触发位给一个脉冲(比如用@符号的微分指令),不要一直置ON。如果连续置ON,有些固件版本会不停重复发送请求,变频器或者仪表会被你的PLC轮询请求轰炸,表现就是某个从站设备偶发无响应甚至报警。我见过有人把这个问题归结为“变频器抗干扰差”,其实根本不是,就是PLC侧触发方式不对。

4.3 仪表通信:欧姆龙温控表E5CC为例

欧姆龙的E5CC等温控表,通信无非两种模式:CompoWay/F和Modbus-RTU。温控表默认可能是CompoWay/F协议,需要先用表上的按键参数把通信协议切到Modbus-RTU,再设置从站地址、波特率、校验位这些参数。

跟温控表通信时,寄存器地址不等于面板上显示的参数号,比如你想修改设定值SV,面板上显示的是“SP”,但Modbus寄存器里它可能对应地址0001或0000,具体要看仪表手册的“通信寄存器表”。这个坑我印象太深了,当年把一个温度设定值写到了错误的寄存器里,导致现场设备温度直接冲高,还好及时发现没有出事故。现在我的规矩是:任何Modbus寄存器地址,都要以官方通信手册为准,接线前先打印一页寄存器对照表贴在电柜门上。

4.4 现场485通信不顺畅的排查金字塔

如果485通信调不通,别慌,按顺序排查:先看物理层,用示波器或万用表确认A/B电压,最好是空闲时A比B高2到5伏;再确认从站设备地址、波特率、校验位和PLC配置完全一致;然后看报文层,把串口调试助手并联到总线上,抓包看看PLC发出的帧长什么样子,从站有没有应答帧;最后才去怀疑上位机软件逻辑和CRC计算。

我很少看到CRC算错导致完全无法通信的情况,因为大多数库函数都会处理好。反而最常见的是波特率不一致导致的乱码,比如PLC设为19200,温控表却是9600,你一抓包就会发现PLC发出的字节流“看起来是正常的但就是没有设备应答”。这种问题用串口助手一抓一个准,比盲目改参数快得多。

5. 那些年踩过的坑:欧姆龙通信故障速查表

每个项目做完,回头总结一下踩过的坑,比看十遍说明书都有用。我把这几年跟欧姆龙PLC通信相关的典型问题整理成了一张速查表,不一定能覆盖所有情况,但能覆盖我遇到过的大部分问题。排查时按图索骥,效率会高很多。

现象最可能原因解决方向
串口通信完全无响应接线错误或地线未共地用万用表逐针确认定义,接好地线
串口偶尔通、数据乱码波特率或校验位不一致统一检查PLC设置和上位机参数
上位机能连上但FINS无应答FINS节点号对不上确认PLC节点号并固定配置
FINS命令返回结束码非0地址越界或内存区代码错误对照FINS命令手册检查报文
485只在上电瞬间通一次屏蔽层接地方式错误改为单端接地并检查终端电阻
Modbus主站反复发请求触发位一直ON用微分指令做单次触发
温控表SV写不进去寄存器地址不对或仪表的通信协议不对查仪表手册,确认协议和寄存器表
多站点485轮询某个站点无响应站地址重复或总线太长挨个站点单独测试,检查布线分支

5.1 换软件平台后的新坑:Sysmac Studio和NJ/NX系列

如果你从CX-Programmer转到Sysmac Studio,最大的变化不是指令,而是通信配置的入口完全不同。在Sysmac Studio里,PLC的IP地址、节点号、EtherNet/IP连接、EtherCAT从站分配,全都在“配置和设置”里完成,而不是在梯形图里操作。

我初次用NJ系列做EtherCAT轴控时,犯过一个低级错误:在Sysmac Studio里更新了硬件配置,但忘记编译下载,结果轴参数和通信配置始终没生效,现场伺服一个脉冲都不动。后来才明白,Sysmac Studio的配置变更必须“离线编译——在线连接——下载——切换运行模式”四步走完才算数,尤其是EtherCAT的拓扑,下载前一定要先做总线扫描。

另外,NJ/NX系列的FINS命令虽然和CP系列差不多,但内存区映射方式不同,NJ里你看到的变量(变量名如A、B、C)是通过系统变量和I/O映射表映射到具体地址的,不像CP系列直接在D区里看得到。上位机想读NJ里的一个变量,要么把它映射到一个固定的地址区,要么用符号数据通信(比如Symbolic Addressing),否则你的FINS报文根本不知道要读哪个位置。

5.2 我的三个“保命习惯”,建议你也养成

第一个习惯是:通信调试之前,先把所有硬件的通信参数做成一张表,贴在办公室或者保存在项目文件夹里。表里至少包含设备名称、接口类型、协议、IP/节点号、波特率、校验位、停止位、寄存器地址说明。别嫌麻烦,现场调试时这张表比任何文档都好用。

第二个习惯是:上位机代码里把所有通信地址、参数做成配置文件,不要写死在代码里。因为现场设备可能随时调整从站地址或者PLC节点号,如果每改一次都要重新编译上位机,你会在现场被折腾到怀疑人生。配置文件解析虽然多写几行代码,但后期收益巨大。

第三个习惯,也是我最想强调的:通信异常时,先自己抓包,再问别人。欧姆龙的CX-Programmer里有数据跟踪功能,Sysmac Studio里有总线诊断,串口端可以并联一个485转USB模块给电脑看报文。很多问题你自己抓一次包就能定位,根本不需要打电话给技术支持。

5.3 把通信问题当“时序问题”看

最后分享一个我在项目里总结出来的视角:PLC通信里的大部分疑难杂症,其实都是时序问题,不只是协议问题。比如你用Host Link读了D区数据,但PLC程序里同一时间正在写D区,读到的数据就会“忽对忽错”;又比如你的上位机每50毫秒轮询一次PLC,而PLC的扫描周期刚好是50毫秒,就会时不时出现超时;再比如Modbus主站触发位没有做微分处理,导致请求帧连发,从站缓冲队列直接爆掉。

所以,当通信“偶尔正常、偶尔不正常”的时候,不要死磕协议格式,先描一遍双方的时间轴:PLC什么时候写数据,上位机什么时候读数据,通信指令占用了多久。很多时候你只要把轮询周期从100毫秒改成150毫秒,或者把数据交换区独立出来,问题就不治而愈了。欧姆龙的通信协议本身确实有些“刁钻”的地方,但只要把物理层、报文层、时序逻辑这三层分开看,每个问题都能一步步缩小范围,最后定位到那一两个真正的原因。

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

华为EC6108V9C刷机全攻略:固件选择与短接J16救砖详解

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

作者头像 李华
网站建设 2026/9/28 1:59:35

v4l2直采CSI摄像头实现低延迟人脸检测

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

作者头像 李华
网站建设 2026/9/28 1:59:11

SSM员工信息管理系统:从三层架构到部署实战全解析

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

作者头像 李华
网站建设 2026/9/28 1:59:02

西门子博途PTO脉冲控制调试避坑指南:5个常见错误与解决

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

作者头像 李华
网站建设 2026/9/28 1:58:38

H5U配CANopen控制步进伺服:从原理到调试全解析

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

作者头像 李华
网站建设 2026/9/28 1:58:31

基于YOLOv5与CNN的车牌检测识别项目实战:从CCPD数据集到模型复现

简介:这份资源面向计算机、人工智能及相关专业的本科生与初学者,提供一套基于CNN与YOLOv5的车牌检测与识别完整工程,数据集采用CCPD官方数据集,可用于毕业设计、课程设计、大作业、工程实训及学科竞赛等场景,帮助读者快…

作者头像 李华