PowerFocus 6000开放协议实战:从拧紧枪通信到MES数据链路集成
简介这份PDF文档是阿特拉斯Atlas CopcoPowerFocus 6000开放协议Open Protocol的官方附录规范面向需要远程控制或数据订阅控制器的应用开发者、自动化工程师与系统集成人员。文档围绕PF6000在Open Protocol下的具体实现展开涵盖MID支持列表与修订版本、支持的MID Relay及数字/模拟输入信号、新旧版本兼容性以及紧固程序Pset选择、批量大小设置和序列Job选择等关键用法并给出MID 64/65旧结果数据的特殊处理说明。资源包共1个PDF文件约980KB内容为规范原文便于按章节查阅与对照开发。目前已有195人学习下载适合需要对接PowerFocus 6000、构建跨平台Linux、PLC、Windows等控制或订阅程序的工程师参考可帮助快速厘清协议支持范围与实现细节减少联调排错成本。1. 拧紧枪开放协议到底开放了什么从一台拧紧枪到一条产线的数据链路很多做装配线集成的工程师第一次接触 PowerFocus 6000 的开放协议时都会有一个直觉判断不就是个拧紧枪的通信协议吗能有多复杂。真正上手之后才发现这套协议背后牵扯的是整条产线的数据链路——拧紧结果怎么上传、配方怎么远程切换、多轴同步怎么协调、异常怎么追溯每一个问题都不是发一条指令就能解决的。PowerFocus 6000 是阿塔拉斯体系里比较主流的一款拧紧控制器它的开放协议本质上是一套基于 TCP/IP 的应用层协议允许外部系统PLC、MES、上位机、机器人控制器直接读写控制器内部的参数、状态和结果数据。换句话说你不需要通过专用的中间件就能用自己的程序跟拧紧枪对话。这篇文章面向的是正在做装配线数据采集、拧紧工艺集成或者产线数字化的工程师从协议结构讲到代码实现再到实际部署中那些文档里不会写的坑尽量把每一步都落到可复现的程度。2. 协议结构拆解报文长什么样、字段怎么读、连接怎么建2.1 开放协议的通信模型与报文格式PowerFocus 6000 的开放协议走的是 TCP 长连接默认端口是 4545。控制器作为服务端外部系统作为客户端发起连接。连接建立之后双方通过一种类似 JSON 的结构化文本进行通信——每条报文是一个独立的 JSON 对象以换行符分隔。这个设计的好处是调试方便你甚至可以用 telnet 直接连上去手动发指令看返回坏处是报文没有二进制协议那么紧凑高频采集时要注意带宽和解析开销。一条典型的请求报文包含几个核心字段mid是消息 ID用来匹配请求和响应cmd是命令类型比如读参数、写参数、订阅事件path指定你要操作的对象路径比如某把拧紧枪的扭矩值或者某个拧紧结果的详细数据data是携带的具体内容。响应报文会带上相同的mid外加status字段表示成功或失败以及data里的返回值。这里有一个容易忽略的点协议里的路径是层级化的类似文件系统的目录结构。比如你想读第一把拧紧枪的最后一次拧紧结果路径大概长这样/controller/tool/1/result/last。不同型号的控制器在路径命名上可能有细微差异所以第一步永远是拿一台实际设备用工具把它的对象树 dump 出来看一遍不要照着文档硬写。2.2 建立连接与第一条读写指令下面用 Python 写一个最小可用的连接和读写示例。选 Python 是因为它在工控上位机里够用socket 库是标准库不需要额外装东西。import socket import json import time class PF6000Client: def __init__(self, host, port4545): self.host host self.port port self.sock None self.mid 0 def connect(self): 建立到控制器的 TCP 长连接 self.sock socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.settimeout(5.0) # 超时设 5 秒避免网络抖动时卡死 self.sock.connect((self.host, self.port)) print(f已连接到 {self.host}:{self.port}) def _next_mid(self): 消息 ID 自增用于匹配请求和响应 self.mid 1 return self.mid def send_command(self, cmd, path, dataNone): 发送一条指令并等待响应 mid self._next_mid() payload {mid: mid, cmd: cmd, path: path} if data is not None: payload[data] data raw json.dumps(payload) \n self.sock.sendall(raw.encode(utf-8)) # 循环读取直到拿到完整的一行 JSON buf b while True: chunk self.sock.recv(4096) if not chunk: raise ConnectionError(连接被控制器关闭) buf chunk if b\n in buf: line, _, _ buf.partition(b\n) resp json.loads(line.decode(utf-8)) if resp.get(mid) mid: return resp # mid 不匹配说明是异步事件推送先跳过 buf buf[len(line) 1:] def read_param(self, path): 读取指定路径的参数值 return self.send_command(read, path) def write_param(self, path, value): 写入指定路径的参数值 return self.send_command(write, path, value) def close(self): if self.sock: self.sock.close() # 使用示例 if __name__ __main__: client PF6000Client(192.168.1.100) client.connect() # 读取第一把拧紧枪的当前扭矩设定值 resp client.read_param(/controller/tool/1/param/torque) print(扭矩设定值:, resp) # 写入目标扭矩为 25.0 Nm resp client.write_param(/controller/tool/1/param/torque, 25.0) print(写入结果:, resp) client.close()这段代码里几个关键点值得展开说。settimeout(5.0)是必须的产线网络环境不比办公室交换机端口松动或者控制器重启都会导致连接假死没有超时设置的话程序会一直阻塞。mid自增机制是协议层面的要求控制器靠这个字段区分并发的请求如果你同时发了多条指令但 mid 重复响应会串。读取循环里处理了粘包的情况——TCP 是流式协议一次recv可能拿到半条报文也可能拿到一条半所以必须按换行符切分。最后那个 mid 不匹配就跳过的逻辑是因为控制器会主动推送事件比如拧紧完成、错误报警这些推送没有对应的请求mid 是控制器自己生成的不能跟请求的 mid 混在一起。2.3 订阅拧紧结果从轮询到事件驱动早期做数据采集最常用的方式是轮询——每隔几百毫秒读一次结果路径看有没有新数据。这种方式实现简单但有两个硬伤一是延迟不可控二是高频轮询会给控制器带来额外负载。PowerFocus 6000 的开放协议支持事件订阅你可以在连接建立后发送订阅指令之后控制器会在拧紧完成时主动推送结果不需要你反复去问。def subscribe_results(self, tool_id): 订阅指定拧紧枪的结果事件 path f/controller/tool/{tool_id}/result resp self.send_command(subscribe, path) if resp.get(status) ok: print(f已订阅 tool {tool_id} 的结果事件) return resp def listen_events(self, duration60): 持续监听控制器推送的事件 self.sock.settimeout(duration) buf b start time.time() while time.time() - start duration: try: chunk self.sock.recv(4096) except socket.timeout: break if not chunk: break buf chunk while b\n in buf: line, _, buf buf.partition(b\n) if not line.strip(): continue event json.loads(line.decode(utf-8)) # 事件报文没有请求对应的 mid直接按 path 判断类型 if result in event.get(path, ): self._handle_result(event) def _handle_result(self, event): 处理一条拧紧结果 data event.get(data, {}) torque data.get(torque) angle data.get(angle) status data.get(status) # ok / nok print(f拧紧结果: 扭矩{torque}Nm 角度{angle}° 状态{status})订阅模式的核心优势在于实时性——拧紧一完成结果在毫秒级就推过来了不需要等下一个轮询周期。但要注意订阅是绑定在 TCP 连接上的连接断了订阅就失效重连之后必须重新订阅。我一般会在重连逻辑里加一个标志位记录当前应该订阅哪些路径连上之后自动恢复。3. 把拧紧数据接进 MES从协议报文到数据库落地的完整链路3.1 数据模型设计拧紧结果里哪些字段必须存拿到推送的拧紧结果之后下一步是把它存下来。很多团队在这里犯的错是“先存了再说”结果字段没设计好后面做追溯和统计分析时发现缺东少西。根据我的经验一条拧紧结果至少需要保留以下字段字段名含义是否必须备注timestamp拧紧完成时间是控制器时间不是上位机接收时间tool_id拧紧枪编号是多轴场景下用来区分torque实际扭矩值是单位 Nm注意精度angle实际角度值是单位度status拧紧状态是ok / nokprogram_id使用的拧紧程序号是追溯工艺参数的关键cycle_id拧紧循环编号建议控制器生成的唯一标识torque_target目标扭矩建议方便对比偏差angle_target目标角度建议同上时间戳这里有个坑控制器返回的时间戳可能是它自己的系统时间如果控制器没有配置 NTP 同步这个时间跟服务器时间可能差好几分钟。我的做法是在上位机接收时额外打一个本地时间戳两个都存追溯的时候以本地时间为准控制器时间作为参考。3.2 从 TCP 流到数据库批量写入与断线重连拧紧结果的产生频率取决于产线节拍一条装配线可能几秒到几十秒一个循环。这个频率用单条 INSERT 完全扛得住但如果你的系统同时接了几十把枪或者节拍特别快就需要考虑批量写入。下面是一个带缓冲队列的写入方案import sqlite3 import threading import queue class ResultWriter: def __init__(self, db_pathtightening.db, batch_size50, flush_interval2.0): self.db_path db_path self.batch_size batch_size self.flush_interval flush_interval self.queue queue.Queue() self._stop threading.Event() self._init_db() def _init_db(self): conn sqlite3.connect(self.db_path) conn.execute( CREATE TABLE IF NOT EXISTS tightening_results ( id INTEGER PRIMARY KEY AUTOINCREMENT, local_ts REAL NOT NULL, controller_ts REAL, tool_id INTEGER NOT NULL, torque REAL, angle REAL, status TEXT, program_id INTEGER, cycle_id TEXT, torque_target REAL, angle_target REAL ) ) conn.execute(CREATE INDEX IF NOT EXISTS idx_tool_ts ON tightening_results(tool_id, local_ts)) conn.commit() conn.close() def enqueue(self, result: dict): 由事件监听线程调用把结果放入缓冲队列 self.queue.put(result) def start(self): 启动后台写入线程 t threading.Thread(targetself._run, daemonTrue) t.start() def _run(self): conn sqlite3.connect(self.db_path) buffer [] last_flush time.time() while not self._stop.is_set(): try: item self.queue.get(timeout0.5) buffer.append(item) except queue.Empty: pass now time.time() if len(buffer) self.batch_size or (buffer and now - last_flush self.flush_interval): self._flush(conn, buffer) buffer.clear() last_flush now # 退出前把剩余数据写完 if buffer: self._flush(conn, buffer) conn.close() def _flush(self, conn, buffer): conn.executemany( INSERT INTO tightening_results (local_ts, controller_ts, tool_id, torque, angle, status, program_id, cycle_id, torque_target, angle_target) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) , [ (r[local_ts], r.get(controller_ts), r[tool_id], r.get(torque), r.get(angle), r.get(status), r.get(program_id), r.get(cycle_id), r.get(torque_target), r.get(angle_target)) for r in buffer ]) conn.commit() def stop(self): self._stop.set()这个写入器用了生产者-消费者模式事件监听线程只管往队列里塞后台线程负责批量落库。batch_size和flush_interval两个参数需要根据实际数据量调——数据量大就减小 flush_interval数据量小就增大 batch_size 减少事务开销。SQLite 适合单机部署或者数据量不大的场景如果产线规模大、需要多客户端并发查询换成 PostgreSQL 或者时序数据库更合适但表结构和写入逻辑基本一致。3.3 断线重连与数据补采产线环境里网络断开是常态交换机重启、网线被叉车压断、控制器固件升级都会导致连接中断。断线本身不可怕可怕的是断线期间产生的拧紧数据丢了。开放协议本身没有提供历史数据补采的机制——它推给你的就是实时的你没收到就没了。所以我的做法是在控制器侧开启结果缓存如果型号支持重连之后先读一遍缓存区里未确认的结果再切回事件订阅模式。def reconnect_and_recover(self, tool_ids): 断线重连后先补采缓存结果再恢复订阅 retry_interval 3.0 while True: try: self.connect() for tid in tool_ids: # 先读缓存区里未确认的结果 cached self.send_command(read, f/controller/tool/{tid}/result/buffer) for item in cached.get(data, []): self.writer.enqueue(self._normalize(item, tid)) # 确认缓存已消费 self.send_command(write, f/controller/tool/{tid}/result/buffer/ack, True) # 恢复事件订阅 self.subscribe_results(tid) print(重连完成缓存已补采) return except (ConnectionError, socket.timeout) as e: print(f重连失败: {e}{retry_interval}秒后重试) time.sleep(retry_interval)这里的关键是buffer/ack这个确认机制——读完缓存之后要显式告诉控制器“我收到了”否则下次重连还会把同样的数据推给你导致重复入库。如果你的控制器型号不支持结果缓存那就只能在上位机侧做本地缓存收到一条先写本地文件确认入库后再删除相当于自己实现一个简易的消息队列。4. 避坑指南调试开放协议时最容易翻车的五个地方4.1 连接上了但发指令没响应现象TCP 连接建立成功connect()没报错但发出去的指令石沉大海recv一直阻塞直到超时。原因通常有三个一是端口搞错了有些控制器有多个 TCP 端口4545 是开放协议但如果你连的是 Web 管理端口发 JSON 过去对方根本不认二是报文格式不对比如忘了加换行符控制器在等你的消息结束标志三是控制器侧没有启用开放协议功能需要在控制器的设置界面里手动打开。解决先用 telnet 或者 netcat 手动连上去发一条最简单的读指令确认控制器有返回。如果 telnet 能通但代码不通那就是代码里的报文格式问题重点检查换行符和 JSON 序列化。4.2 拧紧结果重复入库现象数据库里同一条拧紧结果出现了两次甚至多次cycle_id相同但id不同。原因事件订阅模式下如果连接断开重连后没有正确处理缓存确认控制器会把之前推过但未确认的结果再推一遍。另外如果代码里同时开了轮询和订阅两条路也会导致重复。解决在入库前用cycle_id做去重数据库层面加唯一索引。更根本的做法是确保只用一种采集方式要么纯轮询要么纯订阅不要混用。重连后的缓存补采逻辑里ack指令一定要发。4.3 扭矩值精度丢失现象控制器返回的扭矩是 25.03 Nm存到数据库里变成了 25.0。原因JSON 解析时如果用了默认的浮点数处理某些语言会把浮点数截断。另外数据库字段类型如果是FLOAT而不是DECIMAL存储时也会有精度损失。解决Python 的json.loads默认用float解析数字精度是够的问题通常出在数据库字段类型上。扭矩值建议用DECIMAL(10,3)或者直接存整数乘以 1000 存为毫单位避免浮点误差。4.4 多把拧紧枪的事件串了现象明明订阅的是 1 号枪的结果收到的却是 2 号枪的数据。原因事件推送报文里的path字段包含了工具编号但如果你在_handle_result里没有根据path区分所有结果都混在一起处理了。另外有些控制器在推送事件时tool_id放在data里而不是path里需要看具体型号的文档。解决在事件处理函数里先解析path提取tool_id再分发给对应的处理逻辑。不要假设所有控制器的报文结构完全一致拿实际设备抓包确认。4.5 控制器重启后上位机程序崩溃现象控制器因为固件升级或者断电重启上位机程序在recv时收到空数据没有处理导致抛异常退出。原因TCP 连接的对端关闭时recv会返回空字节串。很多示例代码没有处理这种情况直接json.loads(b)就崩了。解决在接收循环里判断if not chunk: raise ConnectionError然后在上层捕获这个异常触发重连逻辑。重连逻辑里要有退避策略不要每秒重试一万次把控制器打挂。5. 进阶技巧用脚本做协议探测与自动化回归验证前面讲的都是“怎么用”这一章讲“怎么确认你用对了”。开放协议有个特点不同固件版本、不同控制器型号之间路径命名和字段结构可能有细微差异。你照着文档写的代码换一台设备可能就跑不通了。所以我的习惯是在正式集成之前先写一个协议探测脚本把控制器的对象树 dump 出来跟自己代码里的路径做比对。def dump_object_tree(client, root_path/controller, max_depth4): 递归遍历控制器的对象树输出所有可读路径 results [] def _walk(path, depth): if depth max_depth: return resp client.send_command(read, path) if resp.get(status) ! ok: return data resp.get(data) if isinstance(data, dict): for key in data.keys(): child f{path}/{key} results.append(child) _walk(child, depth 1) else: results.append(f{path} {data}) _walk(root_path, 0) return results # 把探测结果写到文件跟代码里的路径做 diff if __name__ __main__: client PF6000Client(192.168.1.100) client.connect() paths dump_object_tree(client) with open(object_tree.txt, w) as f: f.write(\n.join(paths)) print(f共探测到 {len(paths)} 个路径已写入 object_tree.txt) client.close()这个脚本跑一次大概几十秒到几分钟取决于对象树的深度和控制器响应速度。拿到object_tree.txt之后你可以用grep快速定位自己关心的路径比如grep torque object_tree.txt就能看到所有跟扭矩相关的可读路径。如果发现代码里写的路径在探测结果里不存在那就说明这台控制器的固件版本跟之前的不一样需要调整。另一个我强烈建议做的事是自动化回归验证。每次修改采集程序之后不要手动去拧几次枪看数据对不对写一个模拟测试脚本用控制器支持的模拟模式如果有或者直接往数据库里插测试数据验证从接收到入库的完整链路。def regression_test(writer, client): 回归验证模拟一条拧紧结果验证入库链路 test_result { local_ts: time.time(), controller_ts: time.time() - 0.5, tool_id: 1, torque: 25.03, angle: 45.2, status: ok, program_id: 10, cycle_id: TEST-REG-001, torque_target: 25.0, angle_target: 45.0, } writer.enqueue(test_result) time.sleep(3) # 等后台线程 flush conn sqlite3.connect(writer.db_path) row conn.execute( SELECT torque, status FROM tightening_results WHERE cycle_id ?, (TEST-REG-001,) ).fetchone() conn.close() assert row is not None, 回归失败测试数据未入库 assert abs(row[0] - 25.03) 0.001, f回归失败扭矩精度丢失实际 {row[0]} assert row[1] ok, f回归失败状态字段错误实际 {row[1]} print(回归验证通过)这个测试脚本的价值在于它把“数据从协议层到数据库层”的完整链路都覆盖了。你改了写入逻辑、改了表结构、改了字段映射跑一遍就知道有没有破坏现有功能。我一般会把它挂在 CI 里每次提交代码自动跑。最后说一个我踩过的坑有一次产线反馈说某把枪的数据偶尔会丢查了两天才发现是控制器的结果缓存区满了之后会覆盖最旧的数据而我们的重连逻辑在补采时只读了缓存区的前几条就发了ack后面的数据被标记为已确认但实际上没读走。后来改成先读缓存区的总条数循环读完再发ack问题才解决。这个教训让我养成了一个习惯凡是涉及“确认”语义的指令一定要先搞清楚确认的粒度和范围不要想当然地以为ack就是“全部收到了”。希望这些经验能帮到你。本文还有配套的精品资源点击获取

相关新闻

PostgreSQL + pgvector + BM25:轻量级RAG混合检索生产实践

PostgreSQL + pgvector + BM25:轻量级RAG混合检索生产实践

刚接手一个某企业内部知识库的检索项目时,我差点按惯性给系统加一套专用向量数据库。预算、部署、运维、权限体系全都要重新走一轮,想想都头大。后来在项目复盘时发现,我们其实早就拥有了一个被低估的杀手锏:PostgreSQL 自带生态里…

2026/10/11 16:08:28 阅读更多 →
Python Trae提示词开发实战(2):2026 最新 10个自动化批处理场景 + 完整代码|TaoToken 统一 Key 接入

Python Trae提示词开发实战(2):2026 最新 10个自动化批处理场景 + 完整代码|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/11 16:08:28 阅读更多 →
如何在Vitest和Jest中使用emulate程序化API:createEmulator、reset()与快照完整实战

如何在Vitest和Jest中使用emulate程序化API:createEmulator、reset()与快照完整实战

【免费下载链接】emulate Local API emulation for CI and no-network sandboxes 项目地址: https://gitcode.com/gh_mirrors/emul/emulate 点击查看 免费下载 emulate 是一个面向 CI 和无网络沙箱的本地 API 模拟器,其程序化 API 可以把 GitHub、Strip…

2026/10/11 16:08:28 阅读更多 →

最新新闻

Spring Boot+Vue招聘系统实战:从表结构到权限控制

Spring Boot+Vue招聘系统实战:从表结构到权限控制

开发过招聘类系统的同学应该都有同感:这类项目的业务链路不算复杂,但角色多、状态多、权限多,一旦设计没想清楚,后期很容易陷入改表、加接口、调联调的循环。基于Spring Boot Vue的大学生就业招聘系统,就是典型的前后…

2026/10/11 16:48:53 阅读更多 →
深耕江浙沪,铸就金属材料展厅标杆:上海点山展示的“智能+绿色+科创”实践

深耕江浙沪,铸就金属材料展厅标杆:上海点山展示的“智能+绿色+科创”实践

深耕江浙沪,铸就金属材料展厅标杆:上海点山展示的“智能绿色科创”实践扎根产业高地,服务龙头企业的展示需求江浙沪地区是中国先进制造业与民营经济的策源地,汇聚了众多在全球产业链中占据重要地位的上市龙头企业。这些企业不仅追…

2026/10/11 16:48:53 阅读更多 →
基于机器学习的口碑商家客流量预测:SVM实战与避坑指南

基于机器学习的口碑商家客流量预测:SVM实战与避坑指南

简介:这份资源面向参加天池IJCAI17口碑商家客流量预测赛题的选手,以及希望用机器学习方法解决真实商业预测问题的开发者与数据科学学习者。内容围绕客流量预测这一典型回归任务,提供从数据预处理、特征工程到模型训练与结果调整的完整实现思路…

2026/10/11 16:48:53 阅读更多 →
从论文堆到综述报告:zotero-AI-Butler多文献综述自动生成完整教程

从论文堆到综述报告:zotero-AI-Butler多文献综述自动生成完整教程

人工智能大模型AI 应用科研 【免费下载链接】zotero-AI-Butler 【Zotero AI 管家】调用大模型,自动精读论文库里的论文,总结为Zotero笔记。支持主流大模型平台!您只需像往常一样把文献丢进 Zotero, 管家会自动帮您精读论文&#x…

2026/10/11 16:48:53 阅读更多 →
云南出行高性价比7座商务车同城快车服务省心之选

云南出行高性价比7座商务车同城快车服务省心之选

云南驷马科技有限公司作为2018年云南省重点招商引资落地企业,云南驷马科技有限公司正式扎根滇中新区,依托省级政策扶持夯实正规经营根基,持有全省十六地州完整网约车经营许可,同步取得网络货运、汽车租赁、增值电信业务等全套合规…

2026/10/11 16:48:53 阅读更多 →
折扣卡营销系统构建,多门店卡券管理方案

折扣卡营销系统构建,多门店卡券管理方案

折扣卡营销系统构建:连锁多门店卡券统一管理方案本地生活连锁品牌、多门店商户的数字化营销核心痛点,是卡券无法统一配置、门店权限混乱、核销数据割裂、营销效果无法统计。单门店卡券模式无法适配连锁经营场景,极易出现跨店乱核销、库存超发…

2026/10/11 16:47:53 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →