C#与工业机器人Socket通讯:从TCP协议到上位机二次开发实践
简介C#与ABB机器人通讯及控制完整工程包定位在工业自动化场景下的二次开发与通讯集成面向需要调用RobotStudio SDK、RCI/RPL接口实现机器人控制的C#开发者。资源以六轴机器人气囊抛光控制为实际示例从连接认证、TCP/IP数据传输到RPL指令封装、实时状态监控与异常处理完整演示了二次开发中的关键环节并给出Robot Control Interface的调用方法及Robot Programming Language的典型语法便于理解整个控制流程。压缩包共61个文件大小约1.11MB包含13个cs源码、6个exe与6个dll运行组件、5个config、4个pdb及完整的Visual Studio解决方案结构各类工程文件与调试符号一应俱全打开即可编译运行并对照源码学习。已有6200余人学习下载。对希望掌握ABB机器人通讯原理、理清RPL指令集及二次开发程序架构的工程师这份工程不仅提供可直接复用的参考代码还能借助示例理解六轴机器人运动规划、抛光轨迹控制与安全防护逻辑可显著降低工业项目集成门槛并提升调试效率。1. C#与工业机器人通讯先搞通 Socket再谈二次开发产线上最常遇到的集成需求就是上位机用 C# 控制机器人取料、放料、改速度、读当前位置。很多工程师一听到“机器人二次开发”就容易联想到专属 SDK、专用协议心里先打退堂鼓。实际上绝大多数工业机器人都内置了 TCP Socket 通讯接口不需要额外授权C# 侧通过 TcpClient 就能直接对话。这篇笔记以某厂商机器人为例把通讯协议、C# 客户端、机器人侧程序和常见故障一次性拆开。适合 C# 上位机开发者、机器人调试人员和自动化集成工程师照着改 IP 就能跑通。2. 通讯方案选型Socket、厂商 SDK 还是 OPC UA2.1 三种常见通讯方式与适用边界工业机器人对外通讯绕不开三条路厂商提供的 SDK、OPC UA 网关、以及控制器原生 TCP Socket。厂商 SDK 是把控制器内部的数据结构都封装好调用接口就能读关节角、写速度、触发运动。好处是省事但坏处也明显SDK 与控制器固件版本绑定换一个系列可能要重新适配部分 SDK 还需要在 PC 上装运行时部署到工控机时多一层依赖。如果只是做一个简单的上下料控制用 SDK 属于大炮打蚊子。更麻烦的是SDK 的授权方式每个项目都要单独确认现场临时换电脑可能还要重新激活。OPC UA 很适合数据采集和 MES 对接服务器端把机器人的位置、IO 状态、报警丢给上位机。它的设计目标是“信息模型”不是“实时运动指令”。你通过 OPC UA 发一个“MoveAbsJ”也许能执行但遇到高速连续轨迹或需要握手确认的流程性能跟不上调试也麻烦。OPC UA 的配置文件、节点浏览和安全证书对不熟悉它的团队来说是一个黑匣子出了问题很难快速定位。TCP Socket 是机器人控制器里最朴素的通讯方式控制器作为服务器监听端口PC 作为客户端发送字符串指令机器人程序接到指令后执行并回传状态。它不依赖中间件没有授权限制只要控制器支持打开 Socket 端口就能用。延迟一般在 10 毫秒以内对取放料、呼叫程序、切换速度这类场景完全够用。Socket 是纯文本报文出问题用网络调试助手就能看到原始数据比 SDK 好排查得多。通讯方式优点缺点适合场景厂商 SDK接口齐全、能读内部数据结构版本绑定、环境依赖、学习成本高深度二次开发、需要读写控制器内部参数OPC UA跨平台、适合数据集成实时性弱、指令交互不够直接数据采集、MES 对接、状态监控TCP Socket通用、可控、部署简单需要自己定协议、机器人侧要写配套程序上下料、呼叫程序、速度切换、信号交互从维护角度看Socket 协议是纯文本机器人侧的代码也很短出了问题用串口调试工具就能直接抓到报文。SDK 是黑匣子报错往往只能查文档。所以我一般会把 Socket 作为首选SDK 作为补充。只有需要读机器人内部高级数据结构或者要做轨迹规划级别的功能时才考虑上 SDK。2.2 决定用 Socket 前先问自己的四个问题第一个问题机器人控制器是否支持 Socket 通讯。绝大多数中大型机器人控制器都有少数低端型号可能只有离散 IO。确认方法很简单打开控制器的网络服务配置页看有没有 TCP Socket 或类似选项。有的老型号不支持那就只能走 IO 映射或加一个通讯模块方案要提前变。第二个问题通讯频率有多高。Socket 适合指令级交互比如一分钟呼叫几十次程序运动指令交给机器人内部轨迹规划。如果你要实时回传位置做视觉跟踪走 Socket 不如走实时总线。这个频率上限要在方案阶段就说清楚否则后面改协议很伤。第三个问题机器人侧程序由谁负责。很多 C# 工程师以为只要写 PC 端就行结果到了现场发现机器人侧没有接收程序。Socket 通讯是双向的PC 发指令机器人得有循环接收的代码。这需要机器人调试工程师配合两边同时改。我把协议定好后一般会先把接口文档发给对方确认再各自开发。第四个问题是否需要断线重连。产线运行中机器人偶尔会重启如果 PC 端只做一次性连接重启后流程就卡死。所以协议里一定要设计心跳和重连机制。这个问题我在第 4 章会详细展开。这四个问题确认完后再决定用 Socket 还是 SDK。如果只是读数据OPC UA 也许更省事如果要控制动作Socket 是最直接路径。2.3 先定协议再写代码一个可落地的指令格式Socket 通讯最大的学习成本不是代码而是协议。很多新手直接在 TcpClient 里发字符串“move”机器人判断不了你是想移动、查询、还是暂停。我一般会定成这样的结构指令头 指令名 参数 结束符。比如#CMD,MOVE,10,20,30;开头#CMD表示一条指令MOVE是动作名后面三个数字是坐标或速度分号结尾。机器人侧解析时按逗号切分读到#CMD再匹配MOVE分支。回传格式可以是#ACK,MOVE,DONE; #ACK,MOVE,ERROR,103;第一条表示执行成功第二条带错误码。PC 端拿到#ACK就开始处理确认逻辑不会把状态数据误当指令。为什么用纯文本而不是二进制因为机器人侧字符串处理最方便调试时用网络调试助手直接看报文不用写十六进制解析。一个坑是编码要统一后面避坑章节会讲。协议里还要包含心跳指令例如#PING,1;机器人收到后回一个#PONG,1;。如果 PC 连续三秒没收到#PONG就判定掉线走重连流程。心跳间隔建议 1000 毫秒太频繁会占用控制器处理时间太慢会导致断线发现迟。这条格式一旦确认C# 侧和机器人侧都按同一份文档写后面联调时根本不用猜。3. C# 端实现连接、协议与心跳保活3.1 连接与重连机制先放一个最基础的连接方法public async Task ConnectAsync(string ip, int port, int timeoutMs 3000) { _client new TcpClient(); var connectTask _client.ConnectAsync(ip, port); var done await Task.WhenAny(connectTask, Task.Delay(timeoutMs)); if (done ! connectTask) { throw new TimeoutException(连接机器人控制器超时); } _stream _client.GetStream(); _connected true; }逻辑说明TcpClient.ConnectAsync在目标不可达时可能长时间阻塞用Task.WhenAny和Task.Delay做一个超时门闩3000毫秒没连上就抛异常避免界面卡死。_stream保存网络流后续所有收发都走它。参数说明ip是机器人控制器的网卡 IP一般需要和 PC 设置在同一网段port是控制器侧 Socket 监听的端口建议选 5000 以上的高端口避免和常用服务冲突。timeoutMs可以根据现场环境调如果有交换机延迟可以放宽到 5000。重连逻辑一般放在while循环里配合try-catch。常见做法是每 5 秒重试一次最多重试 30 次超过就报警for (int i 0; i 30; i) { try { await ConnectAsync(robotIp, 5000); break; } catch { await Task.Delay(5000); } }这里5000毫秒是重试间隔30次是上限。如果产线要求机器人重启后自动恢复这个循环要放在后台线程里一直跑不能放在 UI 事件里。实际操作中我还会在每次重试前把失败次数打到日志里方便现场判断是网络问题还是机器人侧程序没启动。3.2 数据帧定义与指令封装为了避免后面踩坑C# 侧最好先把指令封装成方法public byte[] BuildCommand(string cmd) { string frame $#CMD,{cmd};\r\n; return Encoding.UTF8.GetBytes(frame); } public async Task SendCommandAsync(string cmd) { var data BuildCommand(cmd); await _stream.WriteAsync(data, 0, data.Length); await _stream.FlushAsync(); }逻辑说明BuildCommand把字符串包成带帧头#CMD和结束符\r\n的报文SendCommandAsync负责写入网络流。用\r\n做结束符方便机器人侧按行读取。这里没有加长度字段靠结束符切分适合指令不长的场景。参数说明cmd可以是MOVE,100,200,30,50也可以是SET_SPEED,80。如果把BuildCommand设计成public单元测试可以直接验证生成的报文是否符合协议。注意Encoding.UTF8必须和机器人侧读取编码一致否则会出现乱码。接收端要处理粘包和半包。TCP 是流协议一次ReadAsync可能读到半条指令也可能读好多条。常见做法是用StreamReader.ReadLineAsync按行读取using var reader new StreamReader(_stream, Encoding.UTF8); while (_connected) { var line await reader.ReadLineAsync(); if (string.IsNullOrEmpty(line)) continue; ProcessMessage(line); }StreamReader内部处理了\r\n的缓冲所以ReadLineAsync天然解决了粘包问题只要机器人侧每条消息都以换行符结尾。这里ProcessMessage是解析入口收到#ACK就触发完成事件收到#PONG就更新心跳时间戳。3.3 异步接收与心跳保活接收循环不能阻塞 UI我一般用CancellationTokenSource和Task.Run启动后台任务_cts new CancellationTokenSource(); _receiveTask Task.Run(() ReceiveLoop(_cts.Token), _cts.Token); private async Task ReceiveLoop(CancellationToken token) { using var reader new StreamReader(_stream, Encoding.UTF8); while (!token.IsCancellationRequested) { var line await reader.ReadLineAsync(); if (line null) break; OnMessageReceived?.Invoke(line); } }逻辑说明ReceiveLoop在后台线程持续读取每收到一行就触发OnMessageReceived事件外部订阅这个事件来处理#ACK或#PONG。CancellationToken用于关闭连接时退出循环。注意ReadLineAsync如果网络断开会抛异常需要在外面包try-catch。心跳保活用一个定时器每秒发送PING_timer new System.Threading.Timer(_ { if (_connected) SendCommandAsync($PING,{Environment.TickCount64}).Wait(); }, null, 0, 1000);注意SendCommandAsync在Timer回调里调用不能直接await所以用.Wait()。心跳带一个时间戳机器人回PONG时带上同样的值PC 端可以计算往返延迟。如果连续三次没收到 PONG就触发断线重连。定时器的1000毫秒间隔要和机器人侧配合太短会干扰正常指令。4. 避坑与排查连接超时、粘包乱码、重启失效的四个问题4.1 机器人侧程序模板Socket 服务端怎么写PC 端再完美机器人侧没有配套程序也是白搭。机器人侧的代码通常由现场调试工程师写但 C# 开发者也应该知道大概结构避免两边理解偏差。下面的伪代码展示了一台机器人开启 Socket 服务、接收指令、回复确认的最小逻辑open_socket(5000) while true: data read_line() if data #PING,1;: write_line(#PONG,1;) elif data #CMD,MOVE,10,20;: move_to(10, 20) write_line(#ACK,MOVE,DONE;) elif data #CMD,SET_SPEED,80;: set_speed(80) write_line(#ACK,SET_SPEED,DONE;) else: write_line(#ACK,UNKNOWN,ERROR,901;)逻辑说明这段程序先打开 5000 端口然后进入一个死循环每次读一行文本按指令名做分支。read_line必须按换行符切分才能和StreamReader.ReadLineAsync对齐。move_to和set_speed是控制器提供的运动函数具体语法由机器人厂商决定。参数说明这里MOVE只带两个坐标实际产线可能要加速度、转角或工件坐标系。指令参数越多解析越复杂建议协议设计时保持参数位置固定不要做成可变长。机器人侧程序一定要处理未知指令返回错误码901否则 PC 端会一直等#ACK等不到触发了三层超时还不知道问题出在哪。4.2 参数设置端口、超时、数据长度、编码机器人通讯联调前先签好一个参数表两边照着填。参数建议值说明端口5000~6000避免和常用服务冲突控制器侧要放行连接超时3000 msPC 侧ConnectAsync超时时间接收超时5000 ms发送指令后等待#ACK的时间最大消息长度256 字节超过长度机器人侧直接丢弃并报错编码UTF-8两边必须一致否则匹配不上心跳间隔1000 ms机器人侧收到#PING必须立即回#PONG重连间隔5000 msPC 侧断线后自动重试的等待时间其中“接收超时”最容易忽略。很多人只设了连接超时没设指令确认超时结果产线卡住后界面一直转圈最后才发现是机器人侧程序崩溃了。我一般会在 PC 端做一个“发送后 5 秒未收到#ACK视为失败”的检查这条检查在自动化流程里比连接超时更重要。4.3 避坑记录四个真实踩坑记录坑 1连接超时。现象ConnectAsync抛TimeoutException机器人侧日志显示没有新的连接请求。原因PC 和控制器不在同一网段或 Windows 防火墙拦截了高端口。解决把 PC 网卡 IP 改成与控制器同一个网段比如控制器是 192.168.0.1PC 就设 192.168.0.2同时在防火墙入站规则里允许 5000 端口。这个坑几乎每个项目都会遇到我一般会现场先ping控制器 IPping 不通就先把网络问题解决掉不要急着改代码。坑 2粘包和半包。现象接收端偶尔把两条指令拼在一起或者一条指令分两次读到导致解析失败。原因TCP 是流式协议没有消息边界。解决用StreamReader.ReadLineAsync按行读机器人侧每条消息必须带\r\n结尾。有一个玄学现象是本地测试挺好到了现场偶发丢指令很有可能是机器人侧用的SocketSend没有追加换行符。坑 3乱码导致机器人动作异常。现象PC 发的字符串机器人能收到但指令名匹配不上比如“MOVE”变成“M?VE”。原因两边编码不一致PC 默认 UTF-8机器人侧按 ASCII 解析。解决统一用 UTF-8 编码发送和接收中文注释不要放在指令报文里。我这里有一条血泪经验调试了整整一上午最后发现是发送端在StreamWriter构造函数里没写Encoding.UTF8默认成了系统编码。坑 4机器人重启后无法自动恢复。现象机器人控制器断电重启后PC 端一直连不上必须手动重启上位机软件。原因机器人侧开机后没有自动运行 Socket 服务程序或者 PC 端没有重连循环。解决把机器人 Socket 程序配置为开机自运行PC 端在后台维持重连循环每 5 秒尝试一次。这个坑在批量产线上最致命因为没有人会半夜去重启上位机。从那以后我每次交付都会把“重启自恢复”写进验收项。5. 进阶技巧把通讯层封装成可复用的 RobotClient 类5.1 事件驱动与发送队列我一般不会把 TcpClient 代码直接写在窗体按钮里而是封装成一个RobotClient类暴露ConnectAsync、SendCommandAsync、OnMessageReceived事件public class RobotClient : IDisposable { public event Actionstring OnMessageReceived; public async Taskbool ConnectAsync(string ip, int port) { ... } public Task SendCommandAsync(string cmd) { ... } public bool IsConnected { get; private set; } public void Disconnect() { ... } }调用端只需要订阅事件_robot new RobotClient(); _robot.OnMessageReceived msg Dispatcher.Invoke(() ProcessRobotMsg(msg)); await _robot.ConnectAsync(192.168.0.1, 5000);这样 UI 层和通讯层分离不需要在页面里处理线程和 TCP 细节也方便单元测试。测试时可以用本机TcpListener模拟机器人端验证BuildCommand发出的报文是否符合协议。具体做法是写一个控制台程序监听 5000 端口收到消息后回一个#ACK然后跑一遍流程。这个模拟端我一般会留在工程目录里后面每次改协议都能用。5.2 发送锁避免心跳和运动指令互相干扰这个封装类里还有一个小细节发送队列。如果运动指令和心跳同时发可能两条指令互相交错机器人侧会解析出错。用SemaphoreSlim锁住SendCommandAsync确保同一时间只有一条指令在写入网络流private SemaphoreSlim _sendLock new SemaphoreSlim(1, 1); public async Task SendCommandAsync(string cmd) { await _sendLock.WaitAsync(); try { var data BuildCommand(cmd); await _stream.WriteAsync(data, 0, data.Length); } finally { _sendLock.Release(); } }逻辑说明SemaphoreSlim允许多个调用进入但只有拿到锁的那个可以执行WriteAsync其他调用等在WaitAsync上。这样即使定时器在下一秒触发心跳也不会插到运动指令中间。从那以后我每次写上位机通讯都会强制走一遍这个套路先定协议、再封装类、最后用模拟端联调。看起来多花了半天但到现场出差的时候能少加两个夜班。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

多Agent协同选股器:从“能跑”到“能用”的工程实践

多Agent协同选股器:从“能跑”到“能用”的工程实践

这个系列写到第六期,我先把前面干的事简单捋一遍:第一期搭数据底座,第二期定模型选型,第三四期把Agent框架跑通、把提示词调到能稳定输出结构化结论,第五期重点做了单Agent的深度分析流程。今天这期,题目叫…

2026/10/17 3:14:46 阅读更多 →
Spark RDD分区重置:coalesce与repartition原理及选型指南

Spark RDD分区重置:coalesce与repartition原理及选型指南

一提到RDD分区重置,很多Spark开发者第一反应是“这有什么好讲的,coalesce减少分区、repartition增加分区呗”。但在实际项目中,围绕这两个算子踩过的坑,比想象中多得多——有人发现coalesce缩完分区数据更歪了,有人用r…

2026/10/17 3:14:46 阅读更多 →
VS2015 C++ UDP Socket编程实战:从环境配置到调试避坑指南

VS2015 C++ UDP Socket编程实战:从环境配置到调试避坑指南

先说我自己的一个观察:讲UDP socket编程的入门资料不少,但大部分都在讲Linux的SOCK_DGRAM,一换到Windows、换到vs2015,很多人就卡在最基础的工程配置上,代码倒是抄下来了,一编译全是头文件冲突、链接错误。…

2026/10/17 3:14:46 阅读更多 →

最新新闻

Python计算机二级题库全解析:考纲、刷题技巧与备考误区

Python计算机二级题库全解析:考纲、刷题技巧与备考误区

简介:面向全国计算机二级Python备考人群,这份题库将近年常考知识点与真题题型整理为可直接刷练的练习集,覆盖选择题、操作题等常见考核模块,并配套参考答案与解析,帮助考生在考前快速定位薄弱环节、掌握得分要点。压缩…

2026/10/17 4:03:00 阅读更多 →
AHA-WAM世界模型实战:从RoboTwin数据到Wan权重部署

AHA-WAM世界模型实战:从RoboTwin数据到Wan权重部署

1. 项目概述:为什么“世界模型”不是玄学,而是可落地的机器人认知基座最近在工业自动化和具身智能圈子里,“世界模型”这个词出现频率高得有点吓人——不是那种被PPT反复咀嚼的空泛概念,而是真有人在产线边缘设备上跑通了AHA-WAM推…

2026/10/17 4:03:00 阅读更多 →
PyTorch实现FPN+ResNet:多尺度特征融合的工程实践指南

PyTorch实现FPN+ResNet:多尺度特征融合的工程实践指南

1. 项目概述:为什么FPNResNet这个组合值得深挖“基于PyTorch的ResNet的FPN”——这短短十个字,背后其实是一条被工业界反复验证、在目标检测与实例分割任务中稳坐主力位置的技术路径。我从2018年开始在某高校实验室做遥感图像分析项目时第一次完整复现FP…

2026/10/17 4:03:00 阅读更多 →
基于MP2642GR-Z与STM32F429NI的两串电芯被动均衡BMS设计实战

基于MP2642GR-Z与STM32F429NI的两串电芯被动均衡BMS设计实战

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

2026/10/17 4:03:00 阅读更多 →
Codex正价方案性价比表:用TaoToken统一Key做多模型成本对照

Codex正价方案性价比表:用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/17 4:03:00 阅读更多 →
环境变量全攻略:从原理到实战,避开PATH与配置那些坑

环境变量全攻略:从原理到实战,避开PATH与配置那些坑

说实话,我见过太多人在环境变量上栽跟头了。明明代码逻辑一点问题没有,换台机器跑就报错,最后折腾半天发现是环境变量没配对。环境变量这东西,说简单,十分钟就能学会怎么用;说复杂,它能让你在深…

2026/10/17 4:02:00 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →