Python读取PLC数据实战:Modbus TCP全解析与踩坑总结
做上位机开发这些年被问得最多的问题之一就是“怎么用Python读PLC的数据”。问的人里有做产线的工程师有做设备数据采集的乙方也有刚入行的学生。大家真正想要的东西其实特别朴素一台PLC一根网线一段能跑的代码能把设备的状态、温度、转速这些数读回来。至于PLC是什么品牌最好是别管。Modbus TCP就是为这个场景准备的。它在工业圈里几乎是默认的“普通话”无论是欧系、日系还是国产设备基本都支持这个协议或者通过一个网关模块就能支持。这篇文章我把自己实际调试设备用的那套Python方案完整写出来包含能直接跑的示例代码以及我在不同品牌PLC上踩过的地址坑、字节序坑和超时坑。1. 为什么偏偏是 Modbus TCP跨品牌通吃的底层逻辑你可能会问西门子有自己的S7协议三菱有MC协议欧姆龙有FINS为什么还要用Modbus因为Modbus TCP是工业以太网里的“世界语”它够简单简单到几乎所有设备厂商都愿意为它开一个口子。1.1 从Modbus RTU到Modbus TCP它到底改了什么最早的Modbus出现在串行链路上叫Modbus RTU用RS485总线一主多从半双工。后来以太网普及人们把Modbus报文直接封装进TCP/IP里就成了Modbus TCP。它保留了RTU的核心功能码、寄存器地址、数据长度这些概念一模一样只是把CRC校验换成了TCP自带的校验不再需要地址轮询每个设备独占一个IP。简单说Modbus TCP就是“穿着TCP/IP外套的Modbus报文”。因为TCP天生是全双工、可靠连接所以通信双方不再需要像RS485那样一帧一帧地排队等应答同一台PLC可以同时被多个上位机读取这在产线数据采集里非常实用。1.2 请求-应答模型你发一条指令它会回答你一个结果Modbus TCP的通信模型非常直白就是客户端发请求、服务端回响应。数据模型分为四类线圈Coil可读可写的开关量比如电机的启停状态。离散输入Discrete Input只读的开关量比如限位开关、急停信号。保持寄存器Holding Register可读可写的16位寄存器绝大多数模拟量、设备参数都放在这里。输入寄存器Input Register只读的16位寄存器通常存放传感器采集值。功能码是理解Modbus的钥匙功能码作用对应数据模型01读线圈线圈02读离散输入离散输入03读保持寄存器保持寄存器04读输入寄存器输入寄存器05写单线圈线圈06写单寄存器保持寄存器15写多线圈线圈16写多寄存器保持寄存器实际项目里用的最多的就是03功能码读保持寄存器因为现在很多PLC的Modbus映射里连输入信号都映射到了保持寄存器区域读写一体用起来最省事。1.3 为什么它不限品牌从专用协议到公开文档早期各家PLC的以太网协议都是私有的你想读西门子的数据必须用西门子的库读三菱的数据又得换一套库维护成本极高。后来随着设备联网的需求爆发主流厂商纷纷在自己的PLC里增加了Modbus TCP服务端功能或者用专门的通信网关把私有协议转换成Modbus TCP。我在现场见过一台很老的进口设备控制器本身死活不支持以太网但设备旁边挂了一个网关盒子把原本的RS485 Modbus RTU转换成Modbus TCP。上位机只需要连接网关的IP就能读到背后那台老古董的数据。这就是Modbus TCP不限品牌的底气所在——无论是原生支持还是网关转换最终暴露给你的都是一个标准的502端口。2. Python库选型从pymodbus到pyModbusTCP的取舍Python操作Modbus TCP的库有好几个我早期用的是 modbus_tk后来发现它更新太慢遇到一些新版的PLC固件连接时会握手异常。现在主流的选择基本是两个pymodbus和pyModbusTCP。2.1 pymodbus功能全、社区大只是API变化有点快pymodbus是我个人目前在正式项目里的首选。它支持Modbus TCP、RTU、ASCII还有服务端模拟功能你甚至可以用它在一台电脑上模拟一台假PLC这对调试上位机程序非常有用。需要注意pymodbus在2.x和3.x版本之间API变化很大。2.x时代的写法是异步与同步混杂到了3.x版本官方把同步客户端统一成了ModbusTcpClient位置也变了。下面是我在实际项目里验证过的pymodbus连接代码from pymodbus.client import ModbusTcpClient client ModbusTcpClient( host192.168.0.10, port502, timeout3, ) connect_success client.connect() if connect_success: print(连接成功) else: print(连接失败)我强烈建议你固定pymodbus的版本比如3.6.9因为它的API还在演进如果哪天升级到了4.x我这段代码有可能跑不通。工业项目讲究“能用就别乱动”依赖锁定是基本素养。2.2 pyModbusTCP上手最快适合快速验证如果你只是临时读几个寄存器或者写个小工具验证点位表pyModbusTCP会更轻量。它的客户端类就一个ModbusClient方法名也直观from pyModbusTCP.client import ModbusClient c ModbusClient(host192.168.0.10, port502, timeout5) if c.open(): regs c.read_holding_registers(0, 10) print(regs)优点是没有那么多花哨的封装调试时看代码一目了然。缺点也很明显对现场总线RTU的支持弱没有服务端模拟能力扩展性不如pymodbus。2.3 我的建议平时用pymodbus快速验证用pyModbusTCP如果你的项目只是“读数据→存数据库→做报表”这种轻量级场景两个库都能胜任。但如果你要做的东西比较复杂比如同时采集几十台设备、需要读写多类型数据、还要做协议转换我建议用pymodbus。后面示例代码我也以pymodbus为主线写因为它在异常处理、批量读写的细节上做得更完备。安装就一句话pip install pymodbus3.6.9提示如果你的机器上已经装了别的大版本建议用虚拟环境隔离我吃过一次亏——系统里残留的旧版pymodbus导致新代码一直报“模块结构不同”的错误。3. 示例程序完整拆解从连接建立到批量读写寄存器这部分是重点我提供一个可以完整跑通的示例。我们假设现场PLC的IP是192.168.0.10端口502需要读取保持寄存器地址0到20的数据。3.1 先确认PLC侧的Modbus TCP配置Python代码写得再好PLC侧没开Modbus服务也是白搭。不同品牌开启方式不同但大方向一致在PLC的通信设置里启用Modbus TCP服务端口一般默认502。确认PLC的IP地址在同网段且允许上位机访问。核对点位映射确定你要读的地址对应PLC内部的哪个寄存器。关于点位映射我见过无数人在这里栽跟头PLC内部地址和Modbus地址不是一回事。有的PLC手册上写“D100对应Modbus地址0”这其实是厂家的映射关系你只管查表确认就好不要自己猜。3.2 完整示例连接、读线圈、读寄存器、写寄存器下面是完整示例我用一个类把常用操作封装起来方便直接抄作业import logging import struct from pymodbus.client import ModbusTcpClient class PlcClient: def __init__(self, host, port502, timeout3): self.client ModbusTcpClient( hosthost, portport, timeouttimeout ) self.connected False def connect(self): self.connected self.client.connect() return self.connected def close(self): self.client.close() self.connected False def read_coils(self, address, count1): 读取线圈状态0x01 result self.client.read_coils(address, count) if hasattr(result, bits): return result.bits[:count] return None def read_holding_registers(self, address, count1): 读取保持寄存器0x03 result self.client.read_holding_registers(address, count) if hasattr(result, registers): return result.registers[:count] return None def read_input_registers(self, address, count1): 读取输入寄存器0x04 result self.client.read_input_registers(address, count) if hasattr(result, registers): return result.registers[:count] return None def write_coil(self, address, value): 写单个线圈0x05 self.client.write_coil(address, value) def write_register(self, address, value): 写单个寄存器0x06 self.client.write_register(address, value) def write_registers(self, address, values): 写多个寄存器0x10 self.client.write_registers(address, values) if __name__ __main__: logging.basicConfig(levellogging.INFO) plc PlcClient(192.168.0.10) if not plc.connect(): print(无法连接PLC请检查IP、端口和防火墙) exit(1) coils plc.read_coils(100, 8) print(线圈状态:, coils) regs plc.read_holding_registers(0, 20) print(寄存器0-19原始值:, regs) plc.write_register(30, 500) print(已写入寄存器30值500) plc.close()这段代码看起来简单但有几个细节值得说。3.3 返回值为什么是对象而不是列表pymodbus的坑pymodbus的读方法返回的不是纯列表而是一个响应对象。响应对象包含registers、bits等属性不同版本还有别的属性。我在2.x和3.x版本之间切换时踩过坑因为2.x里字段的差异挺大导致我的调用代码改了一处才好。所以建议你拿到响应对象以后不要直接拿列表去操作而是先打印出来看看结构再决定怎么取数。习惯写成resp client.read_holding_registers(0, 10) if resp.isError(): print(读取失败) else: values resp.registers3.4 寄存器读出来是原始整数不是真实物理量很多初学者不理解为什么读出来的寄存器值是 745而不是 23.5℃。因为PLC寄存器里存的是原始整数它的真实物理量要靠工程量换算。换算公式一般是真实值 原始值 × 缩放系数 偏移量比如某温度变送器4~20mA对应0~100℃采集到的原始值是0~4000那么真实温度的换算公式就是temp raw / 40.0这个缩放系数在PLC程序里叫“量程换算”它是现场工程师非常关心的一环。做上位机采集时建议把换算规则做成一个配置表不要写死在代码里不然每次设备参数调整都要改代码重发版本。4. 跨品牌最大的坑地址偏移、数据类型与字节序这部分是我最想提醒你的。代码连接上很简单但读出来的数不对才是最折磨人的。下面这些坑我在不同品牌PLC上都撞过。4.1 地址偏移为什么读0却对应PLC内部的40001Modbus协议里设定的数据模型地址是0起始的但很多设备厂商习惯用1起始的“地址1”表示。最典型的就是那些沿用Modicon习惯的寄存器编号40001对应协议地址040002对应协议地址1以此类推。这就造成了一个问题你的Python代码里写的地址到底是0还是1如果PLC手册里写“保持寄存器地址从40001开始”那么协议地址就是寄存器编号减140001 - 协议地址 040010 - 协议地址 9我见过一个同事按照手册上的40001直接写进代码结果读取的每一个地址都错了一位数据当然全乱套。正确做法就是换算一次或者你在读的时候统一减去1再传给函数。4.2 不同品牌PLC的Modbus区域映射差异再拿几个实际场景举例。某德系品牌的S系列PLC做Modbus TCP从站时通常可以把I区、Q区、M区、DB块映射到Modbus数据模型里某日系品牌Q系列则更直接D寄存器区直接映射到保持寄存器M软元件映射到线圈区。国产很多支持Modbus的仪表则常把浮点数放在连续两个保持寄存器里。这里没法展开每个品牌的具体映射表因为不同固件版本、不同组态软件版本都会影响映射结果。我的建议是查该PLC型号的官方手册中“Modbus映射”章节以手册为准。用调试工具单地址逐个读确认哪个协议地址能读到预期值。把确认结果做成点位表标注协议地址、PLC内部地址、数据类型、缩放系数。4.3 32位数据与字节序这是100%会遇到的坑16位寄存器只能表示0~65535带符号的数据也就-32768~32767。但温度、压力、累计流量这些值动不动就超过范围而且浮点数在PLC里很常见所以PLC通常用两个连续的16位寄存器存放一个32位数据。问题在于高16位和低16位谁在前字节内部的高字节和低字节谁在前不同品牌甚至不同型号的风格都不一样。常见的有四种排列ABCD大端模式高16位在前字节高位在前最常规。CDAB字序颠倒高16位在后但字节内部正常。BADC字节序颠倒字序正常。DCBA小端模式全部翻转。我调试某进口设备的累计流量时读出的两个寄存器值分别是 0x4448 和 0x2000按ABCD模式拼起来就是0x44482000转成浮点是800.25。如果按CDAB拼就是0x204448转出来是个完全不对的小数。所以不要盲目相信“网上说Modbus都是大端”设备手册里写的字节序才是真理。在Python里处理一个32位浮点数的标准写法def regs_to_float(regs, orderABCD): 将两个16位寄存器值转换为32位浮点数 if len(regs) 2: raise ValueError(需要至少两个寄存器) v 0 if order ABCD: v (regs[0] 16) | regs[1] elif order CDAB: v (regs[1] 16) | regs[0] elif order BADC: v ((regs[0] 0xFF) 24) | ((regs[0] 8) 16) | ((regs[1] 0xFF) 8) | (regs[1] 8) elif order DCBA: v (regs[1] 16) | regs[0] v ((v 0xFF) 24) | ((v 0xFF00) 8) | ((v 8) 0xFF00) | ((v 24) 0xFF) return struct.unpack(f, v.to_bytes(4, little))[0]这个函数我用了很久建议你把设备手册里的字节序标到点位表里拿到数据后按表处理千万不要一个设备一个代码分支维护起来你会疯掉。4.4 有符号数和无符号数负数读出来是65535另一个常见问题是符号位。温度在零下时有些PLC的寄存器存的是补码也就是-1被表示成65535。如果用无符号数直接看读到65535会让你误以为传感器坏了。判断方法很简单如果原始值接近65535或32768上下大概率是有符号数。你可以在Python里做一次转换def to_signed16(value): 把无符号uint16转成有符号int16 if value 32768: value - 65536 return value负数转完以后再接上量程系数才算得到真正的物理量。很多人读模拟量输入模块的数据发现“不对”一半以上是栽在这个符号没处理上。5. 从Demo到能上产超时、重连、批量读取的实战改造示例代码能跑通当然好但工业现场不是实验室。我在现场吃过不少亏把几个关键经验整理一下。5.1 超时设置3秒还是5秒为什么不能太小TCP连接超时太短比如1秒在现场网络稍有抖动时就会误报“PLC连接失败”。超时太长比如30秒一旦PLC掉线你的程序会卡很久才反应过来。我个人习惯设3秒极少数跨交换机跨地域的链路会设到5秒。还要区分连接超时和读写超时。ModbusTcpClient里的timeout参数就是读写超时。连接TCP本身握手超时在系统层面如果要更精细的控制可以先用socket判断端口连通性再建立Modbus连接。5.2 断线重连与看门狗工业现场PLC偶尔会重启网线偶尔会被踢到。你的采集程序必须能在PLC恢复后自动重新建立连接不能因为一次断线就彻底挂掉。我常用的重连策略import time def ensure_connected(plc_client): if not plc_client.connected: plc_client.connect() if not plc_client.connected: print(等待PLC恢复5秒后重试...) time.sleep(5) return False return True这个函数在每一轮采集循环开始前调用。如果连接断了它就尝试重新连接重试间隔5秒直到PLC恢复。不要在一个循环里每100毫秒就重连一次那样会把PLC的通信模块累死。5.3 批量读取一包读200个寄存器比循环读快几十倍新手最容易犯的错是一个一个读寄存器而Modbus最擅长的就是批量。一次读取的寄存器数量由PLC决定通常能连续读100个甚至更多。比如你要读模拟量输入模块的64个通道一条03功能码直接读64个寄存器网络开销比你循环读64次小得多。我的经验值读取连续寄存器每次读100~120个幅值设成125个以下最常见。读取线圈每次读500个以内。如果需要的数据分布在多个不连续区域分段多次读而不是一次读一大块再丢弃。5.4 固定频率采集不按需采集很多采集程序喜欢写死1秒采集一次。其实大部分产线场景设备数据变化并不快温度、液位都是缓变量。PLC的状态变化需要及时感知但模拟量没必要1秒读一次。我一般把数据点分成几类快速变化的状态数据启停、故障、报警500ms~1s刷新。缓变模拟量温度、液位、压力2~5s刷新或者变化超过阈值才上报。累计量流量、电能每分钟或每小时读取一次。这种“按需调度”的采集策略能显著降低PLC通信模块的负载也减少网络报文量现场调试时双方都轻松。5.5 数据记录先落数据库还是先落文件上位机采集完数据一般要入库。我个人建议先写本地缓存文件或直接写时序数据库不要每一条直接远程写传统关系型数据库因为现场网络到机房是跨网段数据库连接一旦抖动你的采集线程会被数据库拖死。我当时处理的方式是import json import sqlite3 from datetime import datetime def write_point_to_sqlite(conn, point_name, value): ts datetime.now().isoformat() conn.execute( INSERT INTO sample_data(ts, point_name, value) VALUES(?, ?, ?), (ts, point_name, value) ) conn.commit()SQLite本地落库然后由另一个线程定时把数据推到中心数据库或者让我写的那套同步程序每天零点同步一次。这个方案在几万台设备数据采集的项目里也扛得住。6. 排错手记从连不上到读数乱跳的完整排查思路写到最后我把最常遇到的排错场景按完整的排查链路整理一遍。6.1 连不上PLC先别怀疑代码按这个顺序查如果connect()返回False别急着改代码。先按下面的顺序一步步查ping 192.168.0.10如果ping不通说明网络链路就有问题查网线、IP、子网、网关。能ping通说明物理链路通再看端口nc -zv 192.168.0.10 502如果端口不通多半是PLC的Modbus TCP服务没启用或者IP地址没配对。还可以看看防火墙有没有拦502端口——Windows防火墙默认是拦的这是新人最容易忽略的地方。排查顺序大概是ping不通 - 检查网线、IP配置、交换机。ping通但端口不通 - 检查PLC的Modbus服务是否启用、端口是否被改。端口通但连接返回False - 检查ModbusTcpClient的参数是否设置正确timeout是否太短。连接成功但读数据超时 - 检查PLC的通信负载或你读的地址范围是否超出从站能力。6.2 连接成功但读出来全是0怎么回事读出来全是0一般不是协议问题而是地址问题。你读的那个地址区域PLC根本没映射数据。比如你把寄存器地址写成0但PLC的D区映射是从100开始的那你读到的当然全是0。这时你可以尝试用一个已知的有效值去读把PLC里某个常数值映射到Modbus地址然后测试读。依次扫描连续的地址比如ReadHoldingRegisters(0, 200)看哪个断点出现非0值。用Modbus调试工具做点对点测试确认工具和Python结果一致排除代码问题。6.3 数据有时对有时错很大概率是网络延迟和并发冲突如果同一个设备被多个客户端同时访问有些PLC的Modbus服务端在请求并发时会异常导致偶发超时或读取旧数据。我遇到过某个老设备的从站模块同一时间只能处理一个连接第二个连接虽然在TCP层能握手成功但数据返回速度极慢。解决办法就是统一采集入口不要让多个上位机同时直接连PLC而是由一台采集服务器统一读取再分发给各个业务系统。这也是很多工厂做数据中台的原因——用一台稳定的采集站把所有设备数据收拢再对外提供统一接口。6.4 数据乱跑的终极排查手段抓包到了这一步还没有头绪就该上抓包工具了。Wireshark就能直接解析Modbus TCP协议你可以看到每一帧的请求和响应的具体内容包括你发出的功能码、起始地址、数量以及响应里回来的一堆字节。我常用的抓包排查方法tshark -i eth0 -f tcp port 502 -Y modbus抓包后重点看三件事请求的地址和你预期是否一致。响应数据长度是否等于地址数量乘以寄存器字节数。应答的原始字节序列是否符合设备的字节序。有一次我怎么都读不出正确温度抓包后发现PLC回的数据是CDAB顺序而我代码里按ABCD处理修正字节序函数后就一切正常了。7. 给新手的几条实在建议最后分享几条我个人积累下来的经验绝对都是踩坑换来的。第一拿到一台新PLC先确认它的Modbus TCP从站功能是否默认开启。很多设备出厂时这个功能是关闭的需要上位机组态软件里勾选然后下载到PLC才生效。不是插上网线就能用的。第二第一次联调时把PLC侧所有通信诊断信息打开。绝大多数PLC都有在线监控功能能看到Modbus通信的报文数、错误数。如果PLC侧显示通信错误而上位机却显示连接成功那多半是你的请求格式不对被PLC拒绝后被上位机当成无响应处理了。第三测试代码时尽量用固定已知值。比如你在PLC里写死一个D10012345的固定值然后用Python去读如果能读回12345说明通信链路正常否则就是地址映射或字节序有问题。可以排除法缩小范围。第四点位表是项目的生命线。我建议建一个CSV文件包含点位名称、PLC内部地址、Modbus协议地址、功能码、数据类型、字节序、缩放系数、单位、备注。Python程序读这个CSV去采集而不是把地址写死在代码里。这样以后设备点位调整只需要改CSV不用改程序别提多省心。第五不要让采集逻辑和业务逻辑混在一个文件里。我习惯把采集封装成一个独立的服务只负责把数据读出来放到队列或者缓存里然后由业务模块消费。这样调试的时候你可以把采集部分单独跑不给别人添麻烦。Modbus TCP这个方向入门容易精通需要拿真实设备练手。如果你手边恰好有PLC按我上面的代码把连接、读寄存器、批量读全部跑一遍再把自己设备的点位表整理出来你基本就能应付绝大多数数据采集项目了。

相关新闻

ATECC608A硬件加密芯片实战:从选型到I2C驱动与密钥安全设计

ATECC608A硬件加密芯片实战:从选型到I2C驱动与密钥安全设计

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

2026/10/19 2:15:33 阅读更多 →
Provider 不属于 Agent 核心:rpi 的分层理由与收益

Provider 不属于 Agent 核心:rpi 的分层理由与收益

先把项目定位说清楚,否则"为什么这样分层"没有判断依据。 rpi 是一个 Rust 原生的 coding-agent runtime,加一个建立在它之上的终端 agent。九个 crate 覆盖 provider 适配、可恢复的 agent 循环、工具、会话持久化、终端界面和一套稳定的插件…

2026/10/19 2:14:32 阅读更多 →
2026考证培训刷题功能模块怎么搭建

2026考证培训刷题功能模块怎么搭建

考证培训的核心业务是让学员大量刷题、熟悉题型、模考查漏。搭建刷题模块,本质是把题库、答题活动、成绩记录三件事组织起来。乔拓云教育系统是一款专为教育培训机构打造的在线教育解决方案,支持课程售卖、教务管理、学员运营、营销推广等核心场景。 刷题…

2026/10/19 2:14:32 阅读更多 →

最新新闻

RSS订阅源整理指南:官方RSS与RSSHub路由配置实战

RSS订阅源整理指南:官方RSS与RSSHub路由配置实战

自己动手整理了一份 RSS 订阅源清单,包含各家的官方 RSS 和大量 RSSHub 路由。这篇博文把整理的过程、筛选思路、部署配置、坑点全部写清楚,希望能帮你少走弯路。内容比较长,但每一步都是实际跑过的,可以直接照着抄。

2026/10/19 3:01:58 阅读更多 →
科研绘图工作流:从图表设计到投稿图片的自查清单

科研绘图工作流:从图表设计到投稿图片的自查清单

一篇论文的审稿意见里,最容易被忽略却最能影响第一印象的,往往是插图。我见过太多这样的场景:数据扎实、逻辑严密,结果图却配色刺眼、字体发虚、坐标轴刻度乱糟糟。审稿人还没读完正文,心里已经给这篇稿子打了折扣。反…

2026/10/19 3:01:58 阅读更多 →
C# OpenCVSharp圆形检测实战:霍夫圆算法、边缘检测与亚像素精修

C# OpenCVSharp圆形检测实战:霍夫圆算法、边缘检测与亚像素精修

有段时间我的工作台上摆着一批金属垫片,项目要求很简单:在来料图像里快速找到每个垫片的圆心,把圆心坐标和半径发给后续机械臂。听着不难,真正开始做才发现,圆这种东西在照片里非常容易变形——光照一变,边…

2026/10/19 3:01:58 阅读更多 →
TikTok内容难产?三步搭建工业化生产体系

TikTok内容难产?三步搭建工业化生产体系

做了快三年海外短视频内容,我最大的感受是:做TikTok最难的从来不是拍摄和剪辑,而是“今天到底该发什么”。选题靠灵感、爆款靠运气、更新靠硬撑,这种状态几乎每个创作者都经历过。后来我把整个内容流程推倒重做,用一套…

2026/10/19 3:01:58 阅读更多 →
Flink map、filter、flatMap 算子详解:原理、选型与性能优化

Flink map、filter、flatMap 算子详解:原理、选型与性能优化

1. 为什么这三个算子值得单独拎出来讲刚接触 Flink 那会儿,我总觉得map、filter、flatMap这三个算子太基础了,基础到几乎每本教程都一笔带过。直到有一次帮同事排查一个数据倾斜问题,发现他在flatMap里做了一堆本可以提前过滤掉的计算&#x…

2026/10/19 3:01:58 阅读更多 →
DDoS攻防底层逻辑:从攻击原理到企业级防护落地

DDoS攻防底层逻辑:从攻击原理到企业级防护落地

一段话讲清DDoS攻防的底层逻辑做了几年线上业务的稳定性保障,和DDoS攻防打交道是免不了的。我见过不少团队,平时不把这事儿当回事,等到某一天入口带宽被打满、监控告警响成一片、用户疯狂反馈“网站打不开”的时候,才手忙脚乱去翻…

2026/10/19 3:00:57 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 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/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54:50 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →