ABB机器人通过PROFINET收发浮点数全解析:从原理到联调避坑
干了快十年的ABB机器人调试最有意思的永远是现场那些看起来简单的问题。ABB机器人通过PN总线收发浮点数这需求听着就一句话可真做起来坑全埋在细节里信号类型选错、字节顺序反了、PLC侧数据类型对不上任何一环出问题结果都是通信明明正常数据却一路飞起。这需求典型出现在哪些场合涂胶工位要从PLC接收胶量设定值焊接机器人要拿焊枪压力目标视觉抓取时上位机把工件的XY坐标推过来还有MES系统要实时采集机器人TCP坐标做追溯。这些都是小数都要走浮点数。文章里我会把PN总线对接原理、ABB机器人侧的I/O配置、RAPID程序怎么写、PLC侧怎么组态以及联调时我踩过的字节序大坑一次讲明白。适合正在调试ABB机器人与PLC通信的电气工程师、调试工程师还有接手老旧项目需要做通讯改造的维护人员。1. PN总线与ABB机器人对接先搞明白整体思路1.1 为什么现场总选PROFINETPROFINET简称PN本质是跑在标准以太网上的工业实时通信协议。它最大的优势是既保留了以太网的高速和灵活布线又通过实时通道保证了IO数据更新的确定性。自动化项目里选它通常就三个理由一是跟西门子PLC配合最顺TIA Portal里拖一拖就能组起来二是比传统Profibus速度高好几个量级适合数据量大的产线三是网线比总线电缆便宜现场施工省事。ABB机器人这边IRC5控制器时代需要插通信板卡常见选件是DSQC 688这类的PROFINET从站接口。到了OmniCore控制器PROFINET支持已经做进系统里通过许可证选项激活。具体型号和固件版本能支持到什么程度以ABB当年发布的选型手册为准但无论哪个方案通信原理是一致的机器人作为PROFINET IO设备也就是从站周期性地把输入数据送给PLC同时从PLC周期性地拿输出数据。1.2 一台机器人和PLC之间到底传什么站在机器人角度看从PLC接收的叫Input信号发给PLC的叫Output信号。数字量一个点一个点传整数和浮点数则通过组信号Group Input/Output一次性传16位、24位、32位。一个32位单精度浮点数正好占一个Double Word的位置也就是4个字节在PN报文里被当成一个整体搬运。这里有个新手最容易绕晕的点PN总线本身不知道你传的是整数还是浮点数它只负责把一个4字节的数据块从A搬到B。至于这4个字节怎么解释完全看两端设备各自怎么解析。就像一张写着42的纸条有人当成十进制42有人当成ASCII字符*写法一样含义全靠约定。所以ABB机器人侧收到的是一个32位的无符号整数我们要做的是把这32位的位模式翻译回浮点数。2. 浮点数上总线底层原理必须吃透2.1 IEEE 754单精度浮点到底长什么样工业通信里最常见的浮点格式是IEEE 754单精度浮点数一共32位分为三部分最高1位是符号位0代表正数1代表负数接着8位是指数部分采用偏移127的表示法最后23位是尾数规格化后省略了最高位的1。拿12.5举例。12.5换算成二进制是1100.1规格化以后写成1.1001乘以2的3次方。符号位0指数是3加127等于130对应二进制10000010尾数是10010000000000000000000。拼起来就是0 10000010 10010000000000000000000十六进制写作0x41480000在大端字节序的报文中就是41 48 00 00这四个字节。再看一个负的带小数点的例子-2.5。2.5的二进制是10.1规格化是1.01乘以2的1次方。符号位1指数是1加127等于128对应二进制10000000尾数是01000000000000000000000拼起来十六进制是0xC0200000。这两个值非常典型联调的时候拿它们当测试数据一眼就能看出字节序对不对。2.2 为什么ABB侧读到的浮点数变成了整数ABB机器人自带的I/O系统里并没有直接叫浮点输入的信号类型。它的组信号GroupInput/GroupOutput本质上是把设备存储区里的若干位映射成一个整数值最大到32位无符号整数。所以当PLC把一个REAL值的位模式通过PN总线送过来ABB这边看到的就是一个0到4294967295之间的整数。理解了这个就不会慌。数据没丢只是两边在翻译同一串01。PLC认为那4个字节是REALABB当作DINT存下来了关键是把存下来的DINT重新解释成浮点数。RAPID语言里处理这个转换核心就是PackRawBytes和UnpackRawBytes这一对函数它们能干原始字节级别的搬运活专门用来把变量按字节打包成缓冲区或者把缓冲区里的字节解包到变量里。2.3 字节序大部分坑的根源字节序问题在这里是重灾区。PC机上常见的x86处理器是小端Little Endian低字节在低地址而PROFINET基于标准以太网报文在线上普遍按大端Big Endian排列也就是高位字节在前。西门子S7系PLC内部存储习惯也偏大端。这就导致一个现象PLC发送REAL1.0理论上的位模式是0x3F800000按大端在线路上是3F 80 00 00。如果ABB侧读取DINT后得到的是0x3F800000那恭喜字节序天然一致直接用就行。如果读到的是0x0000803F那就是典型的字节序反转需要做4字节交换再解析。到底属于哪一种跟控制器硬件、固件版本都有关系所以联调时第一件事就是用1.0这个特殊值把字节序确认清楚。3. ABB机器人侧配置实操3.1 动手前先确认硬件和选项配置之前先到控制柜里看一眼确认机器人有没有装PROFINET通信选件。IRC5老系统看主机箱里有没有对应的通信板卡OmniCore系统在控制面板的System Info里查看许可选项看看有没有PROFINET IO Device这类字样的授权。没有这个选项后面配置界面压根不会出现PROFINET设备的添加入口。硬件确认没问题下一步是确认网口和IP规划。机器人侧PROFINET接口的IP地址要跟PLC在同一个网段比如PLC是192.168.0.1机器人就设192.168.0.10。IP只是辅助真正让PN主站认出从站的是设备名称Station Name这个名称在PLC侧组态里和机器人侧必须完全一致一个字母都不能差。3.2 RobotStudio里添加PROFINET设备和信号映射打开RobotStudio连上控制器后在控制器菜单下进入配置界面找到I/O System。在这里添加一个新的Industrial Network设备类型选PROFINET。配置界面里填设备名称、IP地址以及输入输出数据长度。数据长度这个要提前算好每32位浮点数占4个字节如果交互8个浮点数输入输出各自至少要32字节宁可多预留一些也不要卡着刚刚好。信号映射是关键步骤。选中刚添加的PROFINET设备右键添加GroupInput或GroupOutput信号。对于浮点数信号需要映射到32位宽度。假设PLC发送一个压力值给机器人我习惯把信号命名为GI_Pressure_MPaDevice Mapping选到起始位位长度填32。命名一定要带单位现场联调能省很多口水。配置完成后控制器会提示是否重启或热加载。一般建议重启控制器让I/O配置彻底生效。重启后可以在I/O System的Signal列表里确认信号状态如果PN通信还没建立信号值可能是0或显示错误。3.3 RAPID程序实现把DINT位模式翻译成浮点数信号配好后写RAPID代码。核心思路是三步把GroupInput读进一个DINT变量把DINT按4字节打包进raw_data缓冲区再从缓冲区解包成浮点数。如果字节序需要反转中间加一步字节交换。接收浮点数的例程我常用的写法是这样的PROC RecvFloatFromPLC() VAR dint dRecv; VAR raw_data rawBuf; VAR num nResult; ! 读取PLC送来的32位组输入信号 dRecv : GI_Pressure_MPa; ! 把32位整数按位模式写入原始缓冲区 PackRawBytes dRecv, 1, rawBuf, 1, 4; ! 如果需要调整字节序这里调用交换函数 SwapRawBytes rawBuf, 1; ! 把缓冲区4字节解释为IEEE 754单精度浮点 UnpackRawBytes rawBuf, 1, nResult, 1, 4; TPWrite 收到压力值: \Num:nResult; ENDPROC发送浮点数到PLC反过来走PROC SendFloatToPLC(num nValue) VAR dint dSend; VAR raw_data rawBuf; ! 浮点数按单精度写入原始缓冲区 PackRawBytes nValue, 1, rawBuf, 1, 4; ! 字节序调整根据实测确认是否需要 SwapRawBytes rawBuf, 1; ! 4字节缓冲区按32位整数读出并送给组输出 UnpackRawBytes rawBuf, 1, dSend, 1, 4; GO_Pressure_MPa : dSend; ENDPROC这里的字节交换函数核心是取4个字节倒序放回PROC SwapRawBytes VAR raw_data rawBuf, num nOffset VAR byte b1, b2, b3, b4; UnpackRawBytes rawBuf, nOffset, b1, 1, 1; UnpackRawBytes rawBuf, nOffset1, b2, 1, 1; UnpackRawBytes rawBuf, nOffset2, b3, 1, 1; UnpackRawBytes rawBuf, nOffset3, b4, 1, 1; PackRawBytes b4, 1, rawBuf, nOffset, 1; PackRawBytes b3, 1, rawBuf, nOffset1, 1; PackRawBytes b2, 1, rawBuf, nOffset2, 1; PackRawBytes b1, 1, rawBuf, nOffset3, 1; ENDPROC这里必须重点提一个RAPID的细节偏移量从1开始不是0。PackRawBytes和UnpackRawBytes里的起始偏移参数第1个字节对应的偏移是1不是0。代码写习惯了C语言或者Python的人特别容易在这里翻车明明程序看着完全没问题数据就是不对。另外PackRawBytes和UnpackRawBytes必须成对使用缓冲区大小要足够。raw_data变量默认容量可能只有几百字节像这种一次只用4字节的用法声明VAR raw_data rawBuf;就够了不需要额外指定大小。实际项目中我更建议把收和发封装成独立的函数输入一个Group信号编号输出一个浮点数或者反过来。这样主程序里调用清爽以后扩展通道也好改。比如写成RecvFloatByDint(GI_Pressure_MPa)返回num底层怎么交换字节都封装在函数里。4. 主站侧组态要点以西门子S7为例4.1 TIA Portal里安装GSDML并组态设备ABB机器人作为PROFINET从站要跟西门子S7-1200或S7-1500通信第一步是拿到ABB官方的GSDML文件。这个文件通常随RobotStudio安装包附带或者到ABB官网对应型号的下载页去拿。注意GSDML文件版本和机器人固件版本要匹配版本不对经常出现组态失败或者数据长度对不上的问题。在TIA Portal里通过菜单选项进入管理GSD文件选择GSDML文件所在目录安装后就能在硬件目录的其他现场设备里找到ABB机器人设备。拖到网络视图先给它分配设备名称这名称必须和RobotStudio里设置的一模一样。然后设置IP地址同一网段才能通信。设备组态完成后在设备视图里能看到分配给机器人的输入输出地址区。根据自己的数据规划记好这些地址比如IB0开始是机器人发给PLC的数据QB0开始是PLC发给机器人的数据后面编程要用。4.2 PLC里REAL和DWORD怎么互换PLC侧编程的核心同样是把浮点数转成DWORD位模式。S7系列里用MOVE指令就可以实现MOVE不改变数据的底层位模式只是改变了类型解释。把一个REAL变量MOVE给一个DWORD变量DWORD里装的就是这个浮点数的32位编码。举个例子PLC要把压力设定值12.5发给机器人。先声明一个REAL变量压力设定值再声明一个DWORD发送临时变量执行发送临时变量 : MOVE(压力设定值)后发送临时变量里就是12.5的IEEE 754编码。然后把这个DWORD数据写到PLC分配给机器人输出的地址里比如用MOVE指令把DWORD写到控制字区域。也可以直接用SCL直接操作输入输出地址但不同型号PLC处理外设地址的方式略有差异项目里按实际工程习惯来。接收机器人上报的坐标数据反着来从PLC的输入地址区读回一个DWORD再MOVE给一个REAL变量这个REAL就是机器人那边发送的浮点数了。难点不在PLC指令在于搞清地址对应关系数据具体从哪个IB字进来跟第3节规划的信号映射一一对应。4.3 非西门子主站的处理思路有些项目主站不是西门子可能是倍福TwinCAT也可能是博世力士乐或者第三方运动控制器只要它支持PROFINET IO主站功能思路完全一致安装ABB的GSDML组态设备时填写设备名称和IP配置输入输出数据块然后把对应数据块里的DWORD按IEEE 754解析成浮点数或者反过来把浮点数打包成DWORD写入输出数据块。区别只在于组态软件的操作界面和GSDML导入方式不同底层机制都是标准的。这种跨厂商对接最大的风险反而是厂商文档里对设备名称IP地址数据长度这些概念叫法不一样。碰上了别急抓本质PN主站找从站靠设备名数据交换靠周期IO浮点数解析靠IEEE 754这三个点抓住了什么品牌都绕不开。5. 联调流程与问题排查实录5.1 从零到通的完整联调步骤第一步物理连接和网络测试。用网线把机器人和PLC连到同一个交换机两边设好IP在PC上分别Ping两个设备确认网络通。有些PN网络是直连的不经过交换机那IP和掩码设置要更仔细避免地址冲突。第二步确认PN从站被主站识别。在PLC侧组态里把设备名称和IP填好编译下载到PLC。观察机器人侧PROFINET接口的指示灯或者I/O System里设备的状态正常情况下Link灯亮通讯状态变成运行。这个阶段如果通不了百分之八九十是设备名称对不上。第三步用测试值验证数据链路。在PLC侧写一个简单的赋值向输出给机器人的地址连续发送0.0、1.0、-2.5、3.14这组值。机器人侧在TP屏幕上显示收到的GroupInput信号值把DINT记录下来。这一步会暴露大部分问题0.0对应DINT应该是01.0对应1065353216也就是0x3F800000-2.5对应3221225472也就是0xC02000003.14对应1078523331也就是0x4048F5C3。拿这些理论值去对实际值立刻知道字节序对不对、映射有没有错位。第四步程序联调。确认原始值正确后启用RAPID解析程序看解析出来的浮点数是否和PLC发送一致。反过来再让机器人发一组浮点数给PLCPLC侧看解析结果。两边都对了整个链路才算打通。5.2 高频故障速查表现象可能原因排查方向PN设备在PLC侧找不到设备名称不一致对比RobotStudio和TIA里的Station NameIP能Ping通但数据不通IO数据区没有真正映射检查RobotStudio里Device Mapping起始位信号值始终为0输入输出方向弄反确认机器人侧Input对应的到底是PLC的Q区还是I区数据值差不多但小数全错字节序反了用1.0测试看DINT是0x3F800000还是0x0000803F负数解析成很大的正数误用了无符号解析检查RAPID里dint和num的中间变量类型偶发跳变或大数通信周期太短IO负载高增大PLC侧更新周期检查交换机质量解析结果为NANPLC发送了非法REAL检查PLC侧数据源是否有未初始化或异常值数据偏移了一个字节信号映射位长和相邻信号重叠检查每个Group信号的Device Mapping位地址5.3 字节序问题的定位与修正字节序问题是最隐蔽的也是最值得单独写一段的。通信一切正常数据却差之毫厘谬之千里十有八九是它。定位方法其实特别简单发一个1.0。1.0的IEEE 754编码是0x3F800000大端字节是3F 80 00 00小端字节是00 00 80 3F。如果机器人收到的DINT是1065353216也就是0x3F800000那说明两端字节序一致不需要额外交换。如果收到32831也就是0x0000803F那就是反了调用字节交换函数再解析。这里我还想多说一句大端和小端的称呼在不同文档里有时会绕晕人。别去死记谁高谁低直接看结果。1.0测试法的好处在于这是一个截然不同的对比一眼就能定位问题。定位到之后修正方法有两个层面。一是程序层面像上文那样在RAPID程序里做4字节交换灵活不依赖硬件配置。二是在信号配置层面有些场景只要把组信号的字节映射顺序倒过来排列就能让底层读到的值直接匹配。两种方法都可行但强烈建议一个项目里只采用一种风格所有收发通道统一处理否则后期维护极易出错。我个人倾向于在程序层面统一处理因为排查问题时逻辑是收敛的最多翻一个函数。5.4 联调之外的一条小建议最后给刚接手这类项目的朋友一个建议建立一份简单的测试值对照表。不用很复杂就列PLC发送值、位模式十六进制、ABB侧DINT、解析结果这几列。每次联调把实际数据填进去问题往往在两三个来回内就能暴露。我试过很多次没有这张表的时候全靠直觉猜效率极低有了表之后连厂家支持电话都不用打了。还有一点I/O信号命名一定带工程单位。GI_Pressure_MPa和GI_Pressure平时看没什么区别到了现场设备一多两组信号混在一起排查成本天差地别。这些细节不复杂但确实能让调试阶段的效率高出一截。

相关新闻

OpenShell完全指南:Windows开始菜单替代与GPU集群分布式Shell详解

OpenShell完全指南:Windows开始菜单替代与GPU集群分布式Shell详解

1. 从"OpenShell"这个名字说起:它到底是个什么东西第一次看到"OpenShell"这个词,很多人会下意识地把它和"Shell脚本""命令行终端"联系在一起。这个直觉不算错,但也不完全对。OpenShell在技术圈里其实…

2026/10/4 6:55:41 阅读更多 →
50Ω源阻抗高增益功放模块:链路简化设计与稳定性实战要点

50Ω源阻抗高增益功放模块:链路简化设计与稳定性实战要点

前阵子调试一台2.3~2.7GHz的发射单元,前级信号只有几个dBm,却要在目标频段内推出十几瓦的射频功率。按老套路来,得先配一级驱动放大器,再推动级功放管,中间还得插衰减器调驻波、加隔离器防失配,链路又长又繁…

2026/10/4 6:55:41 阅读更多 →
距离多普勒谱(RD谱)绘制全解析:原理、Matlab实现与工程经验

距离多普勒谱(RD谱)绘制全解析:原理、Matlab实现与工程经验

距离多普勒谱(RD谱)绘制方法及理解做雷达信号处理的朋友,应该都绕不开距离多普勒谱(Range-Doppler Map,简称RD谱)这个基础概念。无论你是做车载毫米波雷达、安防雷达,还是做SAR成像、目标识别&a…

2026/10/4 6:55:41 阅读更多 →

最新新闻

Git分支管理规范:六类分支职责、合并方向与git flow落地指南

Git分支管理规范:六类分支职责、合并方向与git flow落地指南

简介:面向开发团队的Git分支流程开发规范文档,提供了一套标准化的分支管理方案,其核心价值是解决多人在同一仓库协作时的分支混乱与合并冲突问题。资源共包含一个Word文档,压缩包仅239KB,内容精炼,便于随时…

2026/10/4 7:34:03 阅读更多 →
MRAM与Cortex-M7结合:工业设备掉电保护与无限次写入方案

MRAM与Cortex-M7结合:工业设备掉电保护与无限次写入方案

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

2026/10/4 7:34:03 阅读更多 →
C语言多文件链表模块化开发实战

C语言多文件链表模块化开发实战

1. 为什么“多.c文件链表”是C语言工程能力的分水岭刚学完单个.c文件里写个链表,很多人会觉得“不就malloc几个节点、改改next指针嘛”,但真正把链表拆到多个源文件里编译链接,才是从“能跑通”迈向“能干活”的关键一跃。我带过几十个嵌入式…

2026/10/4 7:34:03 阅读更多 →
AI编程工具插件加载失败的根源与解决路径

AI编程工具插件加载失败的根源与解决路径

1. “plugins”不是功能菜单,而是现代AI编程工具的神经突触你点开Cursor、ZCode、Codex这些工具的设置页,看到“Plugins”那一栏时,大概率会下意识把它当成VS Code里那种“装了就能用”的扩展商店——点安装、重启、生效。但实际踩过坑的人很…

2026/10/4 7:34:03 阅读更多 →
MATLAB Arduino支持包本质与协议级故障排查指南

MATLAB Arduino支持包本质与协议级故障排查指南

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

2026/10/4 7:34:03 阅读更多 →
24天16万行代码:用Claude Code从零构建K12教育产品的实战工作流

24天16万行代码:用Claude Code从零构建K12教育产品的实战工作流

1. 先聊聊这个项目到底在做什么24 天,630 次提交,16 万行代码。这三个数字放在一起,任何一个写过代码的人都会先愣一下——平均每天 26 次提交、6600 多行代码产出,而且是在不到一个月的时间里从零搭出一个 K12 教育产品。如果这是…

2026/10/4 7:33:03 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/3 9:42:36 阅读更多 →