Java直连S7-200 Smart Modbus TCP实战:代码、避坑与稳定性优化
简介这份资源是面向工业自动化与Java开发者的西门子S7-200 Smart PLC Modbus TCP通讯代码解决Java程序与PLC主站建立连接、读取输入输出状态及寄存器值的实际问题。作者以PLC作为Modbus TCP主站用Java开发从站并已在真实S7-200 Smart设备上亲自调通验证适合具备一定Java基础和PLC通讯概念的中级开发者参考。资源包共79个文件约352KB包含5个java源码、5个class编译文件、3个xml配置文件以及jar依赖库另有项目说明文档与工程配置整体结构完整可直接导入开发环境运行。目前已有6639人学习下载说明该方案在同类场景中具有较高参考价值。读者可从中获得可复用的Modbus TCP从站实现、寄存器与IO状态读取的函数调用示例以及依赖库配置和工程组织方式便于快速移植到自己的采集或监控项目中。1. 从一条产线调试翻车说起Java 直连 S7-200 Smart 的 Modbus TCP 到底能不能落地去年帮一个做包装机械的朋友处理过一件事他们的上位机用 Java 写现场一台 S7-200 Smart 做从站采集几个气缸磁开关和称重传感器的数据。原本走的是 OPC 服务器中转结果那台工控机一重启OPC 服务就掉产线停了两次。后来我建议他们直接让 Java 走 Modbus TCP 读 S7-200 Smart 的保持寄存器把中间那层砍掉。改完之后连续跑了三个月没再因为通讯掉线停过机。这件事说明一个很实际的问题S7-200 Smart 本身支持 Modbus TCP 从站模式Java 侧只要有一个靠谱的 Modbus TCP 客户端库就能直接读写它的 V 存储区不需要经过任何中间件。这份资源就是围绕这个场景整理的 Java 版通讯代码核心解决三件事连接建立、寄存器读写、异常重连。适合做上位机、MES 数据采集、设备联网的 Java 开发者也适合刚接触工控通讯、想找一个能直接跑的参考实现的人。下面我按实际调试顺序把这份代码拆开讲清楚。2. 先搞懂 S7-200 Smart 的 Modbus TCP 映射关系地址不对后面全白搭2.1 S7-200 Smart 作为 Modbus TCP 从站的配置要点S7-200 Smart 要作为 Modbus TCP 从站需要在 STEP 7-Micro/WIN SMART 里调用MB_SERVER指令。这个指令的各个参数决定了从站的行为配置错了Java 端连得上但读不到数据。常见做法是在 OB1 里调用MB_SERVERConnect参数接一个TCON指令的完成位Disconnect接TDISCONIP_ADDR和IP_PORT分别填从站 IP 和端口默认 502MB_HOLD_REG指向一个V存储区起始地址HoldStart和HoldEnd定义保持寄存器的范围。这里有一个容易翻车的点MB_HOLD_REG指向的 V 区地址和 Java 端读到的寄存器地址之间有一个偏移关系。S7-200 Smart 的 Modbus 映射规则是40001对应MB_HOLD_REG指向的起始地址40002对应起始地址 2 字节以此类推。也就是说Java 端读40001实际拿到的是MB_HOLD_REG起始地址里的第一个字。我一般会先在 PLC 侧把MB_HOLD_REG设成VB1000然后 Java 端读40001时拿到的就是VW1000的值。这个对应关系必须在动手写 Java 代码之前就确认清楚否则后面读到的数据全是错位的。2.2 Java 侧 Modbus TCP 客户端的选型理由Java 做 Modbus TCP 客户端常见的选择有 j2mod、Modbus4J、Jamod 这几个。这份代码用的是 j2mod原因很直接它对 Modbus TCP 的异常处理比较完整支持自动重连而且 API 设计比 Jamod 更贴近实际使用习惯。j2mod 的核心类结构是这样的ModbusTCPMaster负责连接管理ReadMultipleRegistersRequest和WriteMultipleRegistersRequest负责读写请求Transaction负责把请求发出去并拿回响应。整个流程是同步阻塞的对于上位机采集这种场景反而比异步框架更好控制。选型时要注意一个边界j2mod 默认的超时时间是 5 秒对于产线采集来说太长了。如果从站掉线Java 端会卡 5 秒才抛异常这 5 秒里如果还有别的采集任务整个线程池都可能被拖住。所以实际使用时必须把超时改短一般设 1000 到 1500 毫秒比较合适。2.3 连接参数与寄存器地址的对应关系下面这张表是我调试时整理的地址映射对照Java 端读写的寄存器地址和 PLC 侧 V 区地址的对应关系一目了然Java 端寄存器地址PLC 侧 V 区地址数据类型说明40001VW100016 位有符号整数第一个保持寄存器40002VW100216 位有符号整数第二个保持寄存器40003VW100416 位有符号整数第三个保持寄存器40004VW100632 位浮点数高字浮点数需要两个寄存器40005VW100832 位浮点数低字与上一个寄存器组合提示浮点数在 Modbus 里占两个连续寄存器字节序可能是 ABCD 或 CDAB取决于 PLC 侧的数据排列方式。如果读出来的浮点数明显不对先检查字节序不要急着怀疑通讯本身。3. Java 端代码拆解从建立连接到读写寄存器的完整实现3.1 建立 Modbus TCP 连接与超时参数设置先看连接部分的代码。这段代码的核心是创建一个ModbusTCPMaster实例设置好超时和重试参数然后调用connect()。import com.ghgande.j2mod.modbus.facade.ModbusTCPMaster; import com.ghgande.j2mod.modbus.procimg.Register; import com.ghgande.j2mod.modbus.procimg.SimpleRegister; import com.ghgande.j2mod.modbus.util.ModbusUtil; public class PlcModbusClient { private ModbusTCPMaster master; private String ip; private int port; private int timeoutMs; private int retries; public PlcModbusClient(String ip, int port, int timeoutMs, int retries) { this.ip ip; this.port port; this.timeoutMs timeoutMs; this.retries retries; } public void connect() throws Exception { // 创建 Modbus TCP 主站实例 master new ModbusTCPMaster(ip, port); // 设置超时时间单位毫秒 master.setTimeout(timeoutMs); // 设置重试次数 master.setRetries(retries); // 建立连接 master.connect(); } public void disconnect() { if (master ! null) { master.disconnect(); } } }逻辑说明ModbusTCPMaster的构造函数接收 IP 和端口setTimeout设置的是单次请求的超时时间setRetries设置的是失败后的重试次数。这两个参数直接决定了从站掉线时 Java 端的反应速度。参数说明timeoutMs我一般设 1000retries设 1。这样最坏情况下一次读失败会在 2 秒左右返回不会把采集线程卡死。如果现场网络抖动比较大可以把retries加到 2但不要超过 3否则一次采集的耗时可能超过采集周期。3.2 读取保持寄存器的代码实现与字节序处理读保持寄存器用ReadMultipleRegistersRequest指定起始地址和寄存器数量然后通过Transaction发出去。import com.ghgande.j2mod.modbus.msg.ReadMultipleRegistersRequest; import com.ghgande.j2mod.modbus.msg.ReadMultipleRegistersResponse; import com.ghgande.j2mod.modbus.net.TCPMasterConnection; public int[] readHoldingRegisters(int startAddr, int count) throws Exception { // 创建读保持寄存器请求startAddr 从 0 开始计数 ReadMultipleRegistersRequest request new ReadMultipleRegistersRequest(startAddr, count); // 设置单元标识符S7-200 Smart 默认是 1 request.setUnitID(1); // 通过连接发送请求并获取响应 ReadMultipleRegistersResponse response (ReadMultipleRegistersResponse) master.getConnection().send(request); // 提取寄存器值 int[] values new int[count]; for (int i 0; i count; i) { values[i] response.getRegisterValue(i); } return values; }逻辑说明startAddr是从 0 开始计数的也就是说如果要读40001传入的startAddr是 0。setUnitID(1)对应的是从站的单元标识符S7-200 Smart 的MB_SERVER指令里有一个MB_UNIT_ID参数默认是 1如果改过这里也要跟着改。参数说明count是一次读取的寄存器数量S7-200 Smart 单次最多支持 125 个寄存器。实际使用时我一般一次读 10 到 20 个够用就行读太多会增加单次请求的耗时。浮点数处理需要把两个寄存器拼起来public float readFloat(int startAddr) throws Exception { int[] regs readHoldingRegisters(startAddr, 2); // 将两个 16 位寄存器组合成 32 位浮点数 // 字节序为 ABCD即高字在前 int raw (regs[0] 16) | (regs[1] 0xFFFF); return Float.intBitsToFloat(raw); }逻辑说明regs[0]是高字regs[1]是低字通过移位和按位或组合成一个 32 位整数再用Float.intBitsToFloat转成浮点数。如果读出来的值明显不对把regs[0]和regs[1]的位置对调试试这就是字节序的问题。3.3 写入寄存器的代码实现与注意事项写寄存器用WriteMultipleRegistersRequest可以一次写多个连续寄存器。import com.ghgande.j2mod.modbus.msg.WriteMultipleRegistersRequest; import com.ghgande.j2mod.modbus.msg.WriteMultipleRegistersResponse; public void writeHoldingRegisters(int startAddr, int[] values) throws Exception { // 将 int 数组转换为 Register 数组 Register[] registers new Register[values.length]; for (int i 0; i values.length; i) { registers[i] new SimpleRegister(values[i]); } // 创建写多个保持寄存器请求 WriteMultipleRegistersRequest request new WriteMultipleRegistersRequest(startAddr, registers); request.setUnitID(1); // 发送请求 WriteMultipleRegistersResponse response (WriteMultipleRegistersResponse) master.getConnection().send(request); // 检查是否写入成功 if (response.getReference() ! startAddr) { throw new Exception(写入地址不匹配可能写入失败); } }逻辑说明SimpleRegister接收一个 int 值内部会把它截断成 16 位。写入之后通过检查响应的getReference()是否等于请求的起始地址可以初步判断写入是否被从站接受。参数说明写入的寄存器数量同样不能超过 125 个。另外要注意S7-200 Smart 的MB_SERVER指令对写入操作有权限控制如果 PLC 侧设置了只读写入会返回异常码Java 端会抛出ModbusException需要在调用处捕获并处理。4. 避坑与排查调试 S7-200 Smart Modbus TCP 时最容易翻车的五个点4.1 连接建立成功但读不到数据现象Java 端connect()没有抛异常但readHoldingRegisters返回的全是 0或者直接超时。原因最常见的是MB_SERVER指令的MB_HOLD_REG没有正确指向 V 区或者HoldStart和HoldEnd的范围设置不对。另一个可能是 PLC 侧没有调用MB_SERVER或者调用了但Connect参数没有接通。解决先在 PLC 侧在线监控MB_SERVER的各个参数确认MB_HOLD_REG指向的地址和 Java 端读的地址能对应上。然后用一个简单的 Modbus 调试工具比如 Modbus Poll先试读如果调试工具也读不到问题就在 PLC 侧不在 Java 代码。4.2 读到的数据错位或数值明显不对现象读上来的整数偶尔对偶尔错浮点数完全对不上。原因地址偏移算错了或者浮点数的字节序不对。S7-200 Smart 的 Modbus 地址映射是从40001开始但 Java 端传入的startAddr是从 0 开始中间差了一个 1。另外浮点数在 PLC 里可能是 CDAB 排列而 Java 端按 ABCD 解析。解决先确认startAddr的传入值是否正确。读40001应该传 0读40002应该传 1。浮点数的话把高低字对调再试一次。如果还是不对用调试工具读同样的地址对比原始寄存器值逐字节排查。4.3 从站掉线后 Java 端卡死现象PLC 断电或网线拔掉后Java 采集线程卡住不动整个采集任务停摆。原因ModbusTCPMaster的默认超时时间太长或者没有设置重试次数导致单次请求一直阻塞。另外如果采集任务和通讯任务在同一个线程里通讯阻塞会直接拖死采集。解决把setTimeout设成 1000 毫秒setRetries设成 1。同时把 Modbus 通讯放到独立的线程池里不要让采集逻辑和通讯逻辑共享线程。每次读写操作都用 try-catch 包住捕获ModbusException和IOException在 catch 里做重连。4.4 写入操作返回异常码现象调用writeHoldingRegisters时抛出ModbusException异常信息里带一个异常码。原因S7-200 Smart 的MB_SERVER对写入有权限控制如果 PLC 侧设置了只读或者写入的地址超出了HoldStart和HoldEnd的范围从站会返回异常码 02非法数据地址或 03非法数据值。解决先确认写入地址在MB_HOLD_REG的范围内。然后检查 PLC 侧是否有写保护设置。如果确实需要写入在 PLC 侧把对应的 V 区地址开放写权限。4.5 多线程并发读写导致响应错乱现象多个线程同时读写同一个 Modbus 连接偶尔出现响应和请求对不上的情况。原因Modbus TCP 的Transaction不是线程安全的多个线程共用一个ModbusTCPMaster实例时请求和响应可能交叉。解决每个线程用自己的ModbusTCPMaster实例或者用一个专门的通讯线程串行处理所有请求。我一般会在客户端类里加一个synchronized关键字把读写方法锁住虽然会牺牲一点并发性能但能保证响应不会错乱。注意如果现场有多个 Java 应用同时连同一个 PLCPLC 侧的MB_SERVER可能不支持多连接需要确认 PLC 的并发连接数限制。5. 进阶技巧用连接池和心跳检测把通讯稳定性再拉高一个档次前面讲的代码能跑通但在实际产线环境里光能跑通不够还得能扛住网络抖动和 PLC 重启。我后来在这个基础上加了两个东西连接池和心跳检测。连接池的思路是维护一组ModbusTCPMaster实例每个实例对应一个独立的 TCP 连接。采集任务从池里借一个连接用完还回去。这样即使某个连接断了也不会影响其他采集任务。实现上可以用BlockingQueue来管理连接借还操作都是阻塞的天然支持超时。import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; public class ModbusConnectionPool { private BlockingQueueModbusTCPMaster pool; private String ip; private int port; private int timeoutMs; public ModbusConnectionPool(String ip, int port, int timeoutMs, int poolSize) throws Exception { this.ip ip; this.port port; this.timeoutMs timeoutMs; this.pool new LinkedBlockingQueue(poolSize); for (int i 0; i poolSize; i) { ModbusTCPMaster master new ModbusTCPMaster(ip, port); master.setTimeout(timeoutMs); master.setRetries(1); master.connect(); pool.offer(master); } } public ModbusTCPMaster borrow(int waitMs) throws Exception { ModbusTCPMaster master pool.poll(waitMs, TimeUnit.MILLISECONDS); if (master null) { throw new Exception(连接池已满等待超时); } // 检查连接是否仍然有效无效则重建 if (!master.isConnected()) { master new ModbusTCPMaster(ip, port); master.setTimeout(timeoutMs); master.setRetries(1); master.connect(); } return master; } public void release(ModbusTCPMaster master) { if (master ! null) { pool.offer(master); } } }逻辑说明borrow方法从队列里取一个连接如果取不到就等待指定的毫秒数。取到之后检查连接是否还有效无效就重建。release方法把连接还回队列。这样每个采集任务都能拿到一个独立的连接不会互相干扰。参数说明poolSize根据采集任务的并发数来定一般设成并发数的 1.5 倍。waitMs设成 500 到 1000 毫秒太短了容易借不到连接太长了会拖慢采集周期。心跳检测的思路是单独起一个线程每隔几秒往 PLC 写一个固定的寄存器值然后读回来对比。如果读回来的值和写入的不一致就认为连接有问题主动断开重连。这个寄存器可以选一个不用的 V 区地址比如VW1998专门用来做心跳。public class HeartbeatMonitor extends Thread { private ModbusConnectionPool pool; private volatile boolean running true; private static final int HEARTBEAT_ADDR 999; // 对应 VW1998 private static final int HEARTBEAT_VALUE 0x5A5A; public HeartbeatMonitor(ModbusConnectionPool pool) { this.pool pool; setDaemon(true); } Override public void run() { while (running) { ModbusTCPMaster master null; try { master pool.borrow(500); // 写入心跳值 Register[] regs { new SimpleRegister(HEARTBEAT_VALUE) }; WriteMultipleRegistersRequest writeReq new WriteMultipleRegistersRequest(HEARTBEAT_ADDR, regs); writeReq.setUnitID(1); master.getConnection().send(writeReq); // 读回心跳值 ReadMultipleRegistersRequest readReq new ReadMultipleRegistersRequest(HEARTBEAT_ADDR, 1); readReq.setUnitID(1); ReadMultipleRegistersResponse readResp (ReadMultipleRegistersResponse) master.getConnection().send(readReq); if (readResp.getRegisterValue(0) ! HEARTBEAT_VALUE) { // 心跳值不匹配主动断开重连 master.disconnect(); master.connect(); } } catch (Exception e) { // 心跳失败记录日志并继续 System.err.println(心跳检测失败: e.getMessage()); } finally { if (master ! null) { pool.release(master); } } try { Thread.sleep(3000); } catch (InterruptedException e) { break; } } } public void shutdown() { running false; } }逻辑说明心跳线程每 3 秒执行一次先借一个连接往HEARTBEAT_ADDR写一个固定值再读回来对比。如果值不对说明连接可能已经断了或者 PLC 侧有问题主动断开重连。如果读写过程中抛异常记录日志后继续下一轮。参数说明HEARTBEAT_ADDR要选一个实际不用的 V 区地址避免和业务数据冲突。HEARTBEAT_VALUE选一个不容易被干扰的值比如0x5A5A。心跳间隔一般设 3 到 5 秒太短了会增加 PLC 的通讯负担太长了故障发现不及时。这两个东西加上之后我那个包装机械的项目再没因为通讯问题停过机。后来我养成一个习惯凡是 Java 连 PLC 的项目连接池和心跳检测都强制走一遍不管现场网络看起来多稳定。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

土壤养分分级标准网站发布与等级判定实践指南

土壤养分分级标准网站发布与等级判定实践指南

简介:这份PDF文档汇集了土壤养分分级等级标准的完整数据,面向农业技术人员、种植户及土壤检测初学者,用于快速查对土壤肥力级别并制定合理施肥策略。内容涵盖土壤pH值六级划分、有机质与全氮/全磷/全钾等大量元素分级,以及钙、镁、…

2026/10/11 21:29:22 阅读更多 →
JavaWeb学生成绩管理系统实战:Servlet+JSP+MySQL完整开发指南

JavaWeb学生成绩管理系统实战:Servlet+JSP+MySQL完整开发指南

简介:这是一套面向JavaWeb初学者与课程设计实践者的学生成绩管理系统完整源码,基于Java语言与MySQL数据库开发,适用于高校《Java Web程序设计》《数据库应用》等课程实训或毕业设计参考。系统采用MVC架构,涵盖用户权限管理、学生/…

2026/10/11 21:29:22 阅读更多 →
Windows从零部署NeoHorse-Jev-4B:GGUF量化到OpenAI兼容API上线

Windows从零部署NeoHorse-Jev-4B:GGUF量化到OpenAI兼容API上线

Windows从零部署NeoHorse-Jev-4B:GGUF量化到OpenAI兼容API上线 【免费下载链接】NeoHorse-1-4B 项目地址: https://ai.gitcode.com/hf_mirrors/TokenRhythm/NeoHorse-1-4B 一个只有 4B 参数的开源模型,凭什么在 2026 年 9 月发布后一周内就引来 …

2026/10/11 21:28:20 阅读更多 →

最新新闻

API迁移建议生成中的上下文锚定:从大模型幻觉到可靠实践

API迁移建议生成中的上下文锚定:从大模型幻觉到可靠实践

我在接手模拟项目X的API迁移工作时,最头疼的不是某个接口怎么改,而是几百个存量调用点一起改。打开新版文档对照旧代码逐行看,眼睛都快看花了,团队里也总有人问"这个参数到底对应新接口的哪个字段"。后来我把目光转向了…

2026/10/11 22:18:03 阅读更多 →
安全狗安装配置实战:服务器主机安全防护与暴力破解拦截

安全狗安装配置实战:服务器主机安全防护与暴力破解拦截

前阵子有朋友的服务器被挂上了挖矿程序,CPU直接飙到100%,一查SSH日志几千条暴力破解记录。折腾了一晚上清理完,第二天又被打进来,最后给他装了个安全狗,才算安稳了几天。这种经历做运维的应该不陌生——明文端口暴露在…

2026/10/11 22:18:03 阅读更多 →
达梦DSC共享存储集群搭建指南:从架构选型到故障演练

达梦DSC共享存储集群搭建指南:从架构选型到故障演练

1. 先弄清DSC的定位:共享存储和主备、读写分离有什么不同1.1 为什么最终选了DSC双节点,而不是继续用数据守护主备在动手搭这套达梦数据库共享存储集群之前,我先把需求捋了一遍:业务侧要求两个数据库节点都能对外提供读写服务&…

2026/10/11 22:18:03 阅读更多 →
基于PyQt5与α-β剪枝的五子棋博弈搜索实战

基于PyQt5与α-β剪枝的五子棋博弈搜索实战

简介:这份资源是面向计算机相关专业学生与开发者的毕业设计级五子棋AI项目,采用Python与PyQt5构建图形界面,核心实现人机博弈,并引入深度优先搜索与α-β剪枝算法提升AI决策效率,适合作为人工智能、游戏开发方向的课程…

2026/10/11 22:18:03 阅读更多 →
微信聊天记录结构化导出:从SQLite提取到HTML/Word/CSV三格式交付

微信聊天记录结构化导出:从SQLite提取到HTML/Word/CSV三格式交付

简介:这是一套面向微信用户与Python开发者的聊天记录分析工具集,解决个人聊天数据长期保存、多格式导出及年度行为洞察的实际需求,适用于数字存档爱好者、数据分析初学者及轻量级微信应用开发者。资源包共238个文件,以94个Python脚…

2026/10/11 22:18:03 阅读更多 →
YOLO11电缆损伤检测实战:环境配置、训练调参与推理落地

YOLO11电缆损伤检测实战:环境配置、训练调参与推理落地

简介:面向电力设施维护与安全检查场景,这份ultralytics-yolo11电缆损伤识别资源包提供了从数据集到训练模型的一站式方案。包内包含1318张已标注图像,分别提供YOLO格式txt标签与VOC格式xml标签,并已划分好train/val/test子集&…

2026/10/11 22:17:02 阅读更多 →

日新闻

流感时间序列预测实战: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 阅读更多 →