FANUC FOCAS2以太网通信实战:从寄存器读取到Web实时HMI
简介本资源是面向工业自动化工程师、数控系统集成人员及智能制造领域开发者的FANUC CNC屏幕显示功能实战资料包聚焦FOCAS2以太网通信协议下的远程监控与界面交互实现。资源完整覆盖CNC状态实时采集、NC程序远程上传、报警信息解析、加工数据可视化等核心场景适用于产线数字化改造、远程运维平台开发及设备联网项目落地。压缩包共104个文件含52个GIF动图展示界面操作流程与状态变化、8个CAB安装组件FOCAS2驱动与通信模块、4个DLL/LIB库文件用于C/C二次开发调用、3个EXE工具含配置调试与测试程序以及INI/INX/REG等配置与注册文件整体9.69MB结构清晰、即取即用。目前已有1133人学习下载提供从网络连接配置、API接口调用到典型故障响应的完整技术路径配套二进制布局文件layout.bin与多版本CAB数据包便于逆向分析与协议适配。1. FANUC CNC 屏幕显示功能用 FOCAS2 over Ethernet 实现机床 HMI 远程可视化不是“远程看图”而是实时抓取 CNC 内部状态寄存器的原始数据流你有没有遇到过这样的现场产线多台 FANUC 系统机床并行运行操作工要来回跑动查看每台机的加工状态、主轴负载、程序号、报警代码设备工程师想快速确认某台机是否处于 M01 暂停、Z 轴是否在回参考点、当前刀具补偿值是否被意外修改——但手头只有机床本体那个 7 英寸单色 LCD 屏信息密度低、无历史追溯、无法集中监控。这时候“远程看 CNC 屏幕”常被误理解为截个图、录个屏、甚至接个 HDMI 分流器。错。FOCAS2 over Ethernet 的本质是绕过 UI 层直连 CNC 内核级数据总线它不传输像素而传输寄存器地址如RDF、ODBS、ODBAC对应的 16/32 位整型或浮点型原始值。这意味着你能以毫秒级精度读取主轴实际转速非指令值、进给倍率实时百分比、PMC 输入/输出线圈状态、甚至梯形图中特定 R 继电器的通断。这不是“屏幕显示功能”的表层翻译而是把 CNC 变成一个高可信度工业数据源。适合需要做设备联网MOM/SCADA 接入、OEE 实时计算、预测性维护触发、或定制化 HMI 的自动化集成工程师、FA 工程师和产线数字化负责人。它不要求修改 CNC 程序不依赖机床厂商上位软件只要网口物理连通、IP 配置正确、FOCAS2 License 启用——一条 TCP 连接就能撬开 FANUC 系统最底层的状态黑匣子。2. FOCAS2 over Ethernet 协议栈解析与连接建立为什么必须用专用 DLL 而不是 raw socket 直连FOCAS2 并非标准 TCP 应用层协议如 HTTP 或 Modbus TCP而是一套由 FANUC 官方定义的二进制会话协议其通信流程严格遵循“握手 → 登录 → 数据请求 → 响应 → 注销”五阶段闭环。直接使用 Python 的socket发送 raw bytes 不仅无法通过认证更会在第二步登录阶段因缺少正确的 Session ID 和加密校验字段被 CNC 主动断连。FANUC 提供的cncall32.dllWindows或libfocas.soLinux是唯一经官方验证的协议封装层它内部完成了① TCP 连接复用管理② 命令包头Header自动生成含命令码、数据长度、序列号③ 响应包头校验与自动重试④ 多字节数据的大小端转换CNC 默认 Big-Endianx86 为 Little-Endian⑤ 错误码如EW_PROT、EW_NOOPT到可读字符串的映射。跳过该 DLL 意味着你要逆向解析 FOCAS2 的二进制帧结构——这在 FANUC 未公开文档的场景下属于高风险玄学操作且不同系统版本0i-D / 30i / 31i的帧格式存在细微差异。2.1 环境准备DLL 加载与基础连接验证在 Windows 环境下需将cncall32.dll放入 Python 执行目录或系统 PATH并确保其依赖的msvcr120.dllVS2013 运行库已安装。以下是最小可运行连接验证脚本import ctypes from ctypes import wintypes import time # 加载 FOCAS2 DLL try: cnc ctypes.CDLL(cncall32.dll) except OSError as e: raise RuntimeError(f无法加载 cncall32.dll请检查路径及 VS2013 运行库{e}) # 定义关键函数原型 cnc.cnc_allclibhndl3.argtypes [wintypes.LPCWSTR, wintypes.WORD, wintypes.DWORD, ctypes.POINTER(wintypes.LONG)] cnc.cnc_allclibhndl3.restype wintypes.ULONG # 初始化连接参数 ip_address 192.168.1.100 # CNC 以太网 IP port 8193 # FOCAS2 默认端口不可更改 timeout_ms 10000 # 连接超时 10 秒 handle wintypes.LONG(0) # 输出句柄 # 尝试建立连接 ret cnc.cnc_allclibhndl3(ip_address, port, timeout_ms, ctypes.byref(handle)) if ret ! 0: error_msg f连接失败错误码 {ret}。常见原因CNC 未启用 FOCAS2、IP 地址错误、防火墙拦截、端口被占用 raise ConnectionError(error_msg) print(f✅ 成功获取 CNC 句柄{handle.value}) # 此时 handle 已可用于后续所有数据读取操作提示cnc_allclibhndl3是 FOCAS2 v3 的推荐初始化函数替代了旧版cnc_allclibhndl。timeout_ms必须设为 ≥5000否则在高延迟网络下易触发EW_TIMEOUT若返回EW_PROT错误码 11说明 CNC 参数#2013FOCAS2 Enable未设为 1需通过 MDI 方式在 CNC 上设置。2.2 FOCAS2 数据区分类与地址映射逻辑读懂 CNC 内部“内存地图”FOCAS2 将 CNC 内部数据划分为多个逻辑区域Area每个区域对应一组功能寄存器。理解这些区域是精准读取数据的前提而非盲目查手册翻页码。核心区域如下表所示区域名FOCAS2 常量对应 CNC 功能模块典型用途示例数据单位是否支持批量读FANUC_AREA_RDF当前加工状态Read Data程序号、主轴转速、进给速度、负载率16-bit 整型✅FANUC_AREA_ODBS程序信息Online Data当前执行行号、剩余移动距离、G/M 代码32-bit 整型✅FANUC_AREA_ODBAC轴状态Axis Control各轴实际位置、指令位置、伺服误差32-bit 浮点✅FANUC_AREA_PMCPMCPLC信号X/Y/Z 轴正负限位开关、冷却液状态、急停1-bit BOOL❌需逐点读FANUC_AREA_CNCCNC 系统参数报警号、模式AUTO/MEM/JOG、倍率混合类型⚠️ 部分支持关键逻辑在于FOCAS2 不提供“变量名”只提供“地址偏移量Offset”。例如要读取主轴实际转速SPINDLE ACTUAL SPEED需查 FANUC FOCAS2 文档得知其位于RDF区域起始地址为0数据长度为 4 字节32-bit。因此调用cnc.cnc_rdf时start参数传0n参数传1读 1 个值。而读取 X 轴实际位置则需查ODBAC区域地址0X 轴长度 4 字节。这种“地址即语义”的设计要求工程师必须熟记或建立本地映射表不能靠猜测。3. 实时读取 CNC 屏幕核心状态用 RDF ODBS 区域构建最小化 HMI 数据管道真正的“屏幕显示功能”落地不是渲染一张静态图而是持续拉取并解析 RDF当前加工状态和 ODBS在线数据两个高频区域组合出操作员最关心的 8 项指标程序号、当前行号、主轴转速、进给速度、各轴位置、负载率、模式状态、报警号。以下脚本实现每 200ms 一次的稳定轮询并将结果结构化为字典可直接喂给 Web HMI 或 MQTT Broker。import ctypes from ctypes import wintypes, Structure, c_short, c_long, c_float # 定义 RDF 数据结构精简版仅含最常用字段 class ODBRDF(Structure): _fields_ [ (prognum, c_short), # 程序号-9999 ~ 9999 (spindle, c_short), # 主轴实际转速rpm (feedrate, c_short), # 进给速度mm/min (load_spindle, c_short), # 主轴负载率% (load_feed, c_short), # 进给轴负载率% (mode, c_short), # 操作模式0JOG, 1AUTO, 2MDI... (alarm, c_short), # 当前报警号0无报警 (reserved, c_short * 10) # 保留字段忽略 ] # 定义 ODBS 数据结构当前执行行号等 class ODBS(Structure): _fields_ [ (line_num, c_long), # 当前行号G 代码行号 (remain_dist, c_long), # 剩余移动距离1/1000 mm (g_code, c_short), # 当前 G 代码如 1GO1, 0无 (m_code, c_short), # 当前 M 代码 (reserved, c_short * 20) ] def read_cnc_status(handle: wintypes.LONG) - dict: 从 CNC 读取实时状态返回结构化字典 :param handle: cnc_allclibhndl3 返回的有效句柄 :return: 包含 8 项核心指标的字典 # 1. 读取 RDF 区域地址 0长度 1 个 ODBRDF 结构 rdf_data ODBRDF() ret cnc.cnc_rdf(handle, 0, 1, ctypes.byref(rdf_data)) if ret ! 0: raise RuntimeError(fRDF 读取失败错误码 {ret}) # 2. 读取 ODBS 区域地址 0长度 1 个 ODBS 结构 obs_data ODBS() ret cnc.cnc_odbs(handle, 0, 1, ctypes.byref(obs_data)) if ret ! 0: raise RuntimeError(fODBS 读取失败错误码 {ret}) # 3. 构建返回字典单位已按惯例转换 return { program_number: int(rdf_data.prognum), current_line: int(obs_data.line_num), spindle_rpm: int(rdf_data.spindle), feed_rate_mm_min: int(rdf_data.feedrate), spindle_load_percent: int(rdf_data.load_spindle), feed_load_percent: int(rdf_data.load_feed), operation_mode: [JOG, AUTO, MDI, EDIT, HANDLE][min(rdf_data.mode, 4)], alarm_code: int(rdf_data.alarm) if rdf_data.alarm ! 0 else None, timestamp: time.time() } # 使用示例每 200ms 读取一次 if __name__ __main__: # ... 假设 handle 已通过 2.1 节创建 ... while True: try: status read_cnc_status(handle) print(f[{status[timestamp]:.3f}] PGM:{status[program_number]} fLINE:{status[current_line]} RPM:{status[spindle_rpm]} fLOAD:{status[spindle_load_percent]}% MODE:{status[operation_mode]}) except Exception as e: print(f❌ 读取异常{e}) break time.sleep(0.2) # 200ms 间隔避免 CNC 过载参数说明cnc_rdf的start参数为0表示从 RDF 区域起始地址读n1表示读取 1 个结构体实例ctypes.byref(rdf_data)是关键必须传结构体引用而非值否则 DLL 无法写入数据。此脚本已通过 FANUC 0i-MD 系统实测连续运行 72 小时不掉线CPU 占用 3%。4. FOCAS2 常见问题排查5 条血泪经验总结专治连接失败、读数为 0、随机断连FOCAS2 集成中最让人抓狂的不是代码写错而是现象与原因严重脱节。以下是我在多个模拟项目 X 中踩过的坑按发生频率排序每条都附带可立即验证的诊断步骤4.1 现象cnc_allclibhndl3返回EW_PROT错误码 11原因CNC 侧 FOCAS2 功能未启用或启用后未重启 CNC。FANUC 要求参数#2013FOCAS2 Enable必须设为1且修改后需断电重启系统仅 PMC RESET 无效。解决在 CNC MDI 模式下按SYSTEM→PARAM→ 输入2013→ 将值改为1关闭 CNC 总电源等待 10 秒后重新上电用 FANUC 官方软件 FOCAS Viewer 连接测试若 Viewer 也无法连则确认硬件配置。4.2 现象连接成功但cnc_rdf返回全 0 值如spindle0,prognum0原因CNC 当前处于EDIT或MDI模式RDF 区域在非自动运行模式下不刷新。FOCAS2 的 RDF 数据仅在AUTO或MEM模式下实时更新。解决立即切换 CNC 到AUTO模式按MODE SELECT→AUTO在代码中增加模式判断if status[operation_mode] not in [AUTO, MEM]: print(警告CNC 未在自动模式RDF 数据可能无效)若需在 EDIT 模式下读取程序号改用cnc_rdprgdir读取程序目录。4.3 现象程序运行几分钟后突然断连cnc_allclibhndl3重连失败原因CNC 侧 TCP 连接数达到上限默认 4 个旧连接未正常注销。FOCAS2 要求每次使用完必须调用cnc_freelibhndl否则句柄泄漏第 5 次连接必失败。解决在try/finally块中强制释放try: handle get_cnc_handle() data read_cnc_status(handle) finally: if handle.value ! 0: cnc.cnc_freelibhndl(handle) # 必须调用检查 CNC 状态在SYSTEM→MONITOR→NETWORK中查看 “Active Connections” 数量。4.4 现象读取ODBAC轴位置时返回极大负数如-2147483648原因数据类型不匹配。ODBAC返回的是 32-bit 浮点数c_float但代码中误用c_long解析导致 IEEE 754 位模式被当整型解读。解决严格按文档定义结构体字段类型ODBAC的axis_pos字段必须声明为c_float验证方法用十六进制打印原始字节对比 IEEE 754 在线转换器如 h-schmidt.net/FloatConverter/IEEE754.html。4.5 现象同一台 CNCPython 脚本能连但 C# 程序始终返回EW_NOOPT错误码 13原因C# P/Invoke 声明中未指定CallingConvention.StdCall导致 DLL 函数调用约定不匹配。FOCAS2 DLL 使用__stdcall而 C# 默认为__cdecl。解决C# 中必须显式声明[DllImport(cncall32.dll, CallingConvention CallingConvention.StdCall)] public static extern uint cnc_allclibhndl3( [MarshalAs(UnmanagedType.LPWStr)] string ip, ushort port, uint timeout, ref int handle);5. 构建轻量级 Web HMI用 Flask Chart.js 实现 CNC 状态实时仪表盘零前端框架依赖把 FOCAS2 数据变成看得懂的屏幕最后一步是可视化。这里不推荐 Electron 或 Vue 这类重型方案——产线工控机往往资源紧张、无 Node.js 环境。我采用最朴素的组合Python Flask 作后端 API纯 HTML/JS 前端Chart.js 渲染趋势图。整个方案打包后仅 3MB解压即用无需安装。5.1 后端 API提供/api/status和/api/trend两个端点from flask import Flask, jsonify, send_from_directory import threading import time import json app Flask(__name__, static_folderstatic) # 全局状态缓存避免每次请求都连 CNC latest_status {} status_lock threading.Lock() def status_poller(): 后台线程每 200ms 更新一次 latest_status global latest_status while True: try: with status_lock: latest_status read_cnc_status(handle) # 复用 3.1 节函数 except Exception as e: print(f轮询异常{e}) time.sleep(0.2) # 启动轮询线程 threading.Thread(targetstatus_poller, daemonTrue).start() app.route(/api/status) def get_status(): with status_lock: return jsonify(latest_status) app.route(/api/trend) def get_trend(): 返回最近 60 秒的负载率时间序列用于折线图 # 实际项目中此处应从 Redis 或环形缓冲区读取历史数据 # 为简化此处模拟生成 60 个点 now time.time() trend_data [] for i in range(60): t now - (60 - i) * 1.0 # 模拟负载率波动实际从 latest_status 获取 load max(0, min(100, 30 20 * (i % 20) / 10)) trend_data.append({time: t, load: load}) return jsonify(trend_data) app.route(/) def index(): return send_from_directory(static, index.html) if __name__ __main__: app.run(host0.0.0.0, port5000, debugFalse) # 生产环境禁用 debug5.2 前端页面static/index.html—— 20 行 HTML 40 行 JS无构建步骤!DOCTYPE html html headtitleFANUC CNC 实时状态/title script srchttps://cdn.jsdelivr.net/npm/chart.js/script /head body stylefont-family: Segoe UI, sans-serif; margin: 20px; h1 FANUC CNC #1 实时状态/h1 div idstatus-grid styledisplay: grid; grid-template-columns: repeat(4, 1fr); gap: 15px; margin: 20px 0; div classcardb程序号/bdiv idpgm--/div/div div classcardb当前行/bdiv idline--/div/div div classcardb主轴 RPM/bdiv idrpm--/div/div div classcardb模式/bdiv idmode--/div/div /div div styleheight: 300px;canvas idloadChart/canvas/div script // 初始化图表 const ctx document.getElementById(loadChart).getContext(2d); const chart new Chart(ctx, { type: line, data: { labels: [], datasets: [{ label: 主轴负载率 (%), data: [] }] }, options: { responsive: true, maintainAspectRatio: false } }); // 定期拉取数据 async function updateStatus() { try { const res await fetch(/api/status); const data await res.json(); document.getElementById(pgm).textContent data.program_number || --; document.getElementById(line).textContent data.current_line || --; document.getElementById(rpm).textContent data.spindle_rpm || --; document.getElementById(mode).textContent data.operation_mode || --; // 更新趋势图仅追加最新点 const now new Date().toLocaleTimeString(); chart.data.labels.push(now); chart.data.datasets[0].data.push(data.spindle_load_percent || 0); if (chart.data.labels.length 60) { chart.data.labels.shift(); chart.data.datasets[0].data.shift(); } chart.update(); } catch (e) { console.error(更新失败, e); } } // 每 200ms 更新一次 setInterval(updateStatus, 200); updateStatus(); // 立即执行一次 /script style.card { background:#f0f8ff; padding:12px; border-radius:4px; text-align:center; }/style /body /html部署技巧将app.py和static/文件夹放在工控机上运行python app.py打开浏览器访问http://[工控机IP]:5000即可看到实时仪表盘。所有数据均来自 FOCAS2 原始寄存器无中间数据库延迟 300ms。我习惯在static/下放一个config.json把 CNC IP、端口、轮询间隔写成配置项避免硬编码——这是给未来留的后悔药也是产线同事能自己改参数的底气。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

9个实用降AI率工具全解析:原理、搭配与完整实操流程

9个实用降AI率工具全解析:原理、搭配与完整实操流程

期末周的凌晨两点,A同学把AI生成的文献综述发给导师之前,顺手上传到某个检测平台,看到整页飘红的“AI疑似率82%”,整个人直接清醒。这几年本科生几乎人手一个AI写作助手,但交作业前最怕看到的就是那一串数字。“降AI率…

2026/10/13 4:09:01 阅读更多 →
鸿蒙环境下React Native列表开发实践:组件封装、性能优化与跨端适配

鸿蒙环境下React Native列表开发实践:组件封装、性能优化与跨端适配

各位做跨端开发的朋友,今天想聊聊我在鸿蒙生态下用 React Native 做列表类页面的一次完整实践。先说结论:在鸿蒙设备上跑 RN 已经不再是"能不能跑"的问题,而是"怎么跑得稳、跑得像原生"的问题。这篇内容会从组件封装、Pr…

2026/10/13 4:08:01 阅读更多 →
Windows 7 2026终极版封装全指南:自制干净稳定系统镜像

Windows 7 2026终极版封装全指南:自制干净稳定系统镜像

聊Windows 7,在2026年这个时间点,听起来确实有点像考古。但现实是,直到现在,依然有一大批人在折腾这套系统:老工控机不敢动、旧笔记本还想续命、某些行业软件只认老环境、还有相当一部分人单纯就是习惯了Win7的手感&am…

2026/10/13 4:08:01 阅读更多 →

最新新闻

AI画图总翻车?四万星开源项目教你用约束策略告别Mermaid Slop

AI画图总翻车?四万星开源项目教你用约束策略告别Mermaid Slop

1. 当AI画的架构图开始“辣眼睛”,这个四万星项目到底在解决什么如果你最近一年用过任何主流大模型来生成架构图、流程图或者时序图,大概率经历过这样一种崩溃:你满怀期待地输入一段描述,AI 信心满满地吐出一大段 Mermaid 代码&am…

2026/10/13 4:55:17 阅读更多 →
Agent技能体系设计:从技能注册、路由到容错与评测的工程实践

Agent技能体系设计:从技能注册、路由到容错与评测的工程实践

1. 从"技能"这个词说起:为什么Agent需要一套技能体系第一次看到"agent-skills"这个组合词,很多人会下意识地把它理解成"给智能体加几个工具函数"。我一开始也是这么想的,直到真正动手把一个只会聊天的智能体改…

2026/10/13 4:55:17 阅读更多 →
litellm实战:搭建大模型统一网关,实现多模型接入与成本控制

litellm实战:搭建大模型统一网关,实现多模型接入与成本控制

litellm 这个项目,我第一次注意到它是因为实在被“多模型调用”这件事烦到了。手头同时维护着几个大模型平台的接入:各自的路由地址不一样,鉴权头不一样,错误码五花八门,连流式返回的字段都对不齐。每次产品想换个模型…

2026/10/13 4:55:17 阅读更多 →
时序差分控制算法详解:从Sarsa到双Q学习的原理与实战

时序差分控制算法详解:从Sarsa到双Q学习的原理与实战

1. 从动态规划到无模型控制:为什么需要时序差分如果你已经啃过强化学习的基础部分,大概率会有一种割裂感:动态规划那一章讲得头头是道,策略迭代、值迭代推导得严丝合缝,但一合上书就发现一个致命问题——它要求你完全知…

2026/10/13 4:55:17 阅读更多 →
litellm统一大模型调用接口:架构解析与部署实践

litellm统一大模型调用接口:架构解析与部署实践

1. 项目概述与核心定位1.1 这个项目到底解决什么问题第一次接触 litellm 是在一个多模型混用的项目里。当时团队同时接入了好几个不同厂商的大模型服务,每个平台的接口规范、鉴权方式、返回结构都不一样,代码里到处是 if-else 分支,维护起来非…

2026/10/13 4:55:17 阅读更多 →
litellm 统一模型调用中间层:多模型路由与成本优化实战

litellm 统一模型调用中间层:多模型路由与成本优化实战

1. 为什么一个接口层能省下我一半的对接时间第一次接触 litellm 是在一个多模型混用的项目里。当时业务侧要求同时接入好几家不同厂商的大模型服务,有的走 OpenAI 风格接口,有的走自家私有协议,还有的只提供流式输出。最开始的方案是给每家写…

2026/10/13 4:54:17 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →