PLC中ST语言编程实战:核心语法、工程模板与经典避坑
简介这是一份面向工业自动化、机器人控制及数据采集处理等场景的ST语言编程手册适合PLC程序员、运动控制工程师和自动化专业学生系统学习。手册以图文混排的Word文档呈现全篇共1个doc文件压缩包整体5.63MB内容组织从语法图、基本元素出发逐步覆盖标识符、数字与布尔值、字符串、数据类型与变量声明并深入讲解赋值与表达式、运算符、控制结构、函数、数组和结构体等核心知识点。相比零散网帖该手册按目录逐节展开既可用于入门自学也可作为日常开发时查阅的语法参考。目前已有233人学习对需要快速建立ST语言知识框架或巩固IEC 61131-3文本编程技能的读者来说是一份值得留存的纸质级参考资料。1. 我们为什么需要一本 ST 语言编程手册搜到一份《ST语言编程手册.doc》的人多半不是来普及概念的而是已经在项目里吃过亏用梯形图写一个移动平均滤波光来回翻转的中间变量就铺了半个程序段想在 HMI 上做配方数组的批量上限比较梯形图里一个个比较触点排到怀疑人生。STStructured Text语言是 IEC 61131-3 标准里的文本化编程语言恰恰是这类场景最直接的解法。它把 PLC 编程拉回到“写表达式”的思维有赋值、有 IF、有 FOR有函数块实例化一个复杂的数学处理可以用十几行文本替代几十个梯形图网络。本文从语法内核讲到工程落地把手册里那种“每页讲一条指令”的碎片内容串成一条能直接照着做的路径。2. ST 语法内核先过了变量、表达式与程序组织这三关ST 上手最大的坎不是“不会写”而是“习惯把梯形图的并行思维带进来”。梯形图从左到右、从上到下扫描本质是网络之间的顺序与并联关系而 ST 是严格的顺序执行文本语句之间从上往下一条一条跑。理解这个差异后面所有代码写起来才顺。大多数 PLC 品牌的 IDE 都支持编译 ST 语言到机器码或中间码语法大同小异本文的代码统一按 IEC 61131-3 的通用 ST 书写不做品牌绑定抄到哪个平台只会有微小的差异。2.1 先建立 ST 的最小骨架变量声明、赋值与表达式直译ST 程序的基本单元叫程序组织单元POU常见三种函数FUN、函数块FB、程序PROGRAM。其中函数没有内部状态同样的输入永远得到同样的输出函数块有内部记忆每次调用都会记住自己的历史数据。这是选型的第一个分岔口。FUNCTION_BLOCK FB_CalcAverage VAR_INPUT xValue : REAL; bReset : BOOL; END_VAR VAR_OUTPUT rAverage : REAL; nCount : INT; END_VAR VAR arrBuffer : ARRAY[0..9] OF REAL; nIndex : INT; rSum : REAL; END_VAR声明区写完之后实现区用赋值号“:”给变量赋值。下面是一个循环缓冲区求平均的典型写法IF bReset THEN nIndex : 0; rSum : 0.0; arrBuffer : [10(0.0)]; nCount : 0; ELSE arrBuffer[nIndex] : xValue; rSum : rSum xValue; nIndex : (nIndex 1) MOD 10; IF nCount 10 THEN nCount : nCount 1; END_IF END_IF IF nCount 0 THEN rAverage : rSum / INT_TO_REAL(nCount); ELSE rAverage : 0.0; END_IF“:”和比较用的“”要区分开C 语言程序员第一次写 ST 最容易在这里翻车。这段代码里MOD 10保证数组下标永远在 0 到 9 之间循环不会越界nCount用来记录已采样的数量方便在缓冲区未满时先求部分平均。难点在于 rSum 只加不减当缓冲区满了之后每来一个新值应该先减去被覆盖的旧值再加新值这个缺陷留在后面的避坑章节专门说。ST 的表达式直译能力是梯形图无法比拟的。一段开平方滤波计算在梯形图里要用数学指令字块连线在 ST 里就是一行rResult : SQRT(ABS(xValue - 100.0)) * 2.0 LN(rGain 1.0);这里ABS是取绝对值LN是自然对数SQRT是开平方。不同品牌的数学函数名称基本一致个别品牌会用LOG表示自然对数看手册的指令表就能确认。表达式的优先级和常规数学一致括号最优先其次乘除然后加减比较运算靠后。2.2 分支与循环CASE 才是 ST 的精髓IF 只是开胃菜IF...ELSE 在 ST 里和任何高级语言类似但真正让 ST 在处理多状态设备时效率翻倍的是CASE语句。它把一个变量的多种取值映射到不同分支省掉梯形图里一排排的比较器。下面是一个设备多模式控制的例子CASE nDeviceMode OF 0: // 手动模式直接跟随按钮状态 bOutput : bManualSwitch; rSpeed : 0.0; 1: // 半自动模式按配方号确定速度 CASE nRecipe OF 1: rSpeed : 50.0; 2: rSpeed : 80.0; ELSE rSpeed : 30.0; END_CASE; 2: // 全自动模式批量刷新测量值后计算 FOR nCnt : 0 TO 9 DO arrLevel[nCnt] : ReadLevel(nCnt); END_FOR; rSpeed : CalculateAutoSpeed(arrLevel); ELSE // 未知模式安全起见输出关断 bOutput : FALSE; rSpeed : 0.0; END_CASE每个分支末尾不需要显式 break因为 CASE 的执行流是排他的不像 C 语言那样会落入下一个分支。ELSE分支是强烈建议保留的设备运行中如果 nDeviceMode 被写入一个非法值有 ELSE 兜底输出安全状态没有 ELSE 则旧输出可能被保留这在现场是安全事故级别的隐患。FOR 循环的边界是0 TO 9共执行 10 次如果需要提前跳出可以用EXIT语句但建议少用因为 ST 的 FOR 循环在多品牌 IDE 里的跳出语义略有差异。WHILE 和 REPEAT 循环在 ST 中同样存在但我在工程里几乎不用。原因无他PLC 的扫描周期是硬实时的一个 WHILE 循环如果退出条件判断失误会直接把扫描周期卡死轻则看门狗报警重则 CPU 停机。FOR 循环因为有固定次数危险低很多。如果确实需要用 WHILE 处理“直到条件满足”的逻辑建议加上循环次数上限比如nGuard : 0; WHILE (NOT bFound) AND (nGuard 100) DO // 查找过程 nGuard : nGuard 1; END_WHILE2.3 函数块实例化一套 PID 代码两条回路独立运行函数块的实例化是 ST 在工程复用上最核心的机制。一个 PID 控制算法写成一个函数块后要想控制两台设备的温度不需要复制代码只需要声明两个实例各自的内部数据是完全隔离的PROGRAM Main VAR fbPIDLoop1 : FB_TempPID; fbPIDLoop2 : FB_TempPID; rPV1, rPV2 : REAL; rOut1, rOut2 : REAL; bEnable : BOOL; END_VAR fbPIDLoop1( bEnable : bEnable, rSetpoint : 60.0, rFeedback : rPV1, rOutput rOut1); fbPIDLoop2( bEnable : bEnable, rSetpoint : 80.0, rFeedback : rPV2, rOutput rOut2);调用时输入参数用:赋值输出参数用引出。这种写法让调用关系一目了然比梯形图里引脚一个一个拉伸出来清晰得多。实例化的每个函数块会在背后生成独立的数据区所以 fbPIDLoop1 的积分项不会污染 fbPIDLoop2。选型建议纯计算、无记忆的算法用 FUN比如 CRC 校验、单位换算、格雷码转二进制因为 FUN 没有内部状态并发调用不会互相干扰凡是要记住上一次状态或者做累计的——滤波、PID、积分、状态机——都用 FB。实践里有个土办法如果一个函数块的输出只由输入决定用 FUN否则用 FB别硬套。3. 把 ST 搬到真实项目通讯解析、批量处理和混编选型语法看懂了只是第一步工程上真正考验 ST 功底的是三类场景报文解析、批量数组操作、以及和梯形图的混编策略。这一章给出三套可以直接改用的落地模板并把每段代码的参数含义讲到“抄过去能自己调”的程度。3.1 报文解析按字节切数据的 ST 套路PLC 做串口通讯时收到的一帧数据往往是以 BYTE 数组形式存放在缓冲区里。要从原始字节里拼出寄存器地址、功能码和数值ST 的位操作和类型转换是主力。我看到很多新手用梯形图做这件事每个字节复制到字变量里再拼接网络数量动辄二三十个完全不可维护。下面是一段典型的 RTU 帧解析框架FUNCTION_BLOCK FB_ParseRtuFrame VAR_INPUT arrRaw : ARRAY[0..31] OF BYTE; nLen : INT; END_VAR VAR_OUTPUT nAddr : INT; nFunc : INT; rValue : REAL; bParsed : BOOL; END_VAR VAR wTmp : WORD; nIdx : INT; END_VAR bParsed : FALSE; IF nLen 7 THEN RETURN; END_IF nAddr : arrRaw[0]; nFunc : arrRaw[1]; // 功能码 3读保持寄存器数据从第 3 个字节开始 IF nFunc 3 THEN nIdx : 3; wTmp : INT_TO_WORD(SHL(WORD#16#00FF AND INT_TO_WORD(arrRaw[nIdx]), 8)); wTmp : wTmp OR (WORD#16#00FF AND INT_TO_WORD(arrRaw[nIdx 1])); rValue : INT_TO_REAL(WORD_TO_INT(wTmp)); bParsed : TRUE; END_IF这里的SHL是左移位指令AND用掩码取了低 8 位OR把两个字节拼进一个 WORD。注意顺序如果报文是高字节在前大端模式那么arrRaw[3]左移 8 位作为高位arrRaw[4]直接或进去作为低位。不同设备的报文可能采用低字节在前把两行对调即可这就是“大小端”的处理排查通讯数据不对时第一个要确认的就是它。算出来的 WORD 按无符号数转成 INT再转成 REAL完成从字节到浮点数的链路。CRC 校验一般在解析之前做把 CRC 算法也写成一个 FUN然后在这个函数块里优先调用。帧长不够时我用RETURN直接退出避免继续访问不存在的数组下标。这里的RETURN相当于 C 语言的 return执行后函数块本轮剩余代码不再运行。注意不同的编译器对 RETURN 的支持略有差别如果你用的 IDE 不支持就把处理逻辑包在IF nLen 7 THEN的大括号里。3.2 批量与数组中位值滤波和超限报警的模板ST 在数组处理上的优势非常明显。以中位值滤波为例十次采样排序取中间值梯形图写出来是几百个比较器ST 里就是两层 FOR 循环FUNCTION_BLOCK FB_MedianFilter VAR_INPUT arrSample : ARRAY[0..9] OF REAL; END_VAR VAR_OUTPUT rMedian : REAL; END_VAR VAR arrSorted : ARRAY[0..9] OF REAL; nI, nJ : INT; rTmp : REAL; END_VAR // 先复制原始样本避免修改输入数组 arrSorted : arrSample; // 冒泡排序从小到大 FOR nI : 0 TO 8 DO FOR nJ : nI 1 TO 9 DO IF arrSorted[nJ] arrSorted[nI] THEN rTmp : arrSorted[nI]; arrSorted[nI] : arrSorted[nJ]; arrSorted[nJ] : rTmp; END_IF END_FOR END_FOR // 10 个数取中间两个的平均或下标 4/5 任取其一 rMedian : arrSorted[5];冒泡排序的时间复杂度是 O(n²)但 10 个数据量对 PLC 的扫描周期影响微乎其微实测不到 0.1 毫秒。这类代码的要点是不要直接修改传入的数组先复制再排序否则输入参数被破坏的后果很难排查。另一个高频是批量超限报警和索引记录nAlarmCount : 0; FOR nI : 0 TO 9 DO IF arrTemp[nI] rHighLimit THEN nAlarmCount : nAlarmCount 1; IF nAlarmCount 10 THEN arrAlarmIndex[nAlarmCount - 1] : nI; END_IF END_IF END_FOR这段代码实现的功能是统计 10 个温度检测点中超过上限的数量并且把超限点的编号记录到arrAlarmIndex里。arrAlarmIndex要预先声明成足够大的数组否则上位机读取时会发生数组越界。记录超限编号时先判断nAlarmCount 10是防止数组越界的双保险。3.3 混编选型哪里必须用 ST、哪里该退回梯形图ST 不是万能的工程上最成熟的用法是和梯形图混编。我的经验法则是凡是“计算主导”的逻辑用 ST凡是“设备启停、手自动切换、互锁”的电气逻辑用梯形图。原因很现实设备维护工程师普遍更熟悉梯形图你把一个电机的启保停电路写成 ST现场电工盯着文本看半天都不敢下手改。场景ST 更适合梯形图更适合理由数学模型与表达式是否梯形图表达式网络繁琐通讯报文解析是否字节移位拼接在梯形图里反人类数组批量处理是否梯形图缺乏循环结构单设备启停与互锁否是电气人员可读性强安全回路否是冗余结构直观便于审阅顺序状态机视习惯视习惯SFC 其实更合适混编的具体做法不复杂可以在主程序里同时调用梯形图写的 POU 和 ST 写的函数块中间通过全局变量交换数据。ST 函数块把输入的传感器值算好输出给梯形图做连锁判断梯形图把设备的运行状态给到 ST 做批量统计。我一般会在程序架构里划分“算法区”和“设备区”两个文件夹算法区全部用 ST设备区以梯形图为主。这样既保证了复杂逻辑的可维护性又照顾了现场调试的习惯。4. ST 编程避坑指南扫描周期、类型转换与数据保持的 5 个经典坑这一章是实打实的血泪经验。每一条都是现场翻过车、用仿真一步步蹲出来的问题按“现象 → 原因 → 解决”的方式记录抄代码之前先看这里能少熬几个夜。坑一REAL 累加值到了一定程度就不增长了现象用 REAL 变量做产量累加前面一直正常运行几天后数字卡在某个值不再上涨但设备明明还在生产。原因REAL 在 PLC 里是 32 位浮点数有效精度只有约 7 位十进制。当累加值已经达到几百万时每次加 1 的增量幅度小于当前数量级的浮点分辨率累加操作被舍入吞掉。解决累计类数据改用 LREAL64 位双精度浮点或者用整型累加后除法。如果项目里只能用 REAL采用 Kahan 补偿累加算法// 补偿累加把上次舍入误差存到 rCompensation rY : xValue - rCompensation; rT : rSum rY; rCompensation : (rT - rSum) - rY; rSum : rT;这段代码的原理是把每次加法丢失的精度单独存起来下次加回去代价是每次累加多几次浮点运算。此坑在流量累计、产量统计中尤其常见建议在功能块设计阶段就决定好数据类型。坑二FOR 循环里调用 TON 定时器定时永远不动作现象在 FOR 循环里写了一个 TON希望每个循环周期累计 100ms结果在线监视看到 TON 的 ET 一直是 0根本不动。原因TON 是 IEC 定时器它的计时依赖每个扫描周期持续调用。FOR 循环在一次扫描周期内快速跑完TON 在循环里被反复调用ET 每次被清零重来实际上并没有“时间流逝”。解决不要在循环里用 TON。做批量设备的“各延时启动”时改用时间戳差值法tNow : CURTIME(); IF TIME_TO_REAL(tNow - tLastScan) 1.0 THEN // 每秒处理一个通道避免单周期负载过重 nChannel : MIN(nChannel 1, nMaxChannel); tLastScan : tNow; END_IFCURTIME()是获取当前扫描周期的系统时间不同品牌名称略有差异有的叫GET_CURRENT_TIME。时间戳方法不依赖调用次数只要程序每个周期跑一次就能正确累积物理时间。坑三BOOL 数组整体转 WORD高低位顺序和预期相反现象把 8 个开关量的 TRUE/FALSE 打包成一个字节发给上位机结果第 1 个开关对应到了字节的最高位而不是最低位数据全乱了。原因BOOL 是位类型但数组在内存中的排列和字节序在不同平台上有差异。直接对 BOOL 数组做类型转换或者在 FOR 循环里赋值容易踩高低位坑。解决手动逐位组装绝不依赖隐式转换nByteOut : 0; FOR nBit : 0 TO 7 DO IF arrSwitch[nBit] THEN nByteOut : nByteOut OR (1 SHL nBit); END_IF END_FORSHL是左移运算1 SHL nBit相当于产生位掩码。这段代码把 bit0 放到最低位如需反过来把nBit改成7 - nBit即可。同样的道理适用于从字节解析 BOOL 数组逐位TEST或AND判断。坑四断电保持变量在 PLC 上电瞬间产生一次误动作现象设备断电重启后某个输出莫名其妙地动作了一下然后又恢复。检查程序逻辑没问题百思不得其解。原因声明为VAR RETAIN的断电保持变量在 PLC 上电后第一个扫描周期就已经持有断电前的旧值。如果程序里用这个保持变量直接控制输出上电瞬间旧状态会先被执行一次。解决加一个“首周期初始化”标志在第一扫描周期把所有输出强制设为安全值VAR bFirstScan : BOOL : TRUE; END_VAR IF bFirstScan THEN bOutput : FALSE; rSpeed : 0.0; bFirstScan : FALSE; END_IF此处VAR ... BOOL : TRUE;是变量声明时赋初值。在声明区直接给变量初始值是一种常见做法但要确认你的 IDE 支持初始化语义。首周期标志方法是通用的在主程序最前面占三行却能挡掉绝大多数上电误动作。坑五数组下标越界在多数 IDE 里不报错却会悄悄破坏别的变量现象数组写入的下标超了上限程序运行一段时间后出现一些毫无规律的数据错误有时候连输出模块的映射都乱了。原因ST 编译器默认关闭运行时下标检查以换取执行速度。越界写入不会中断程序而是直接写到数组相邻的内存区域把别的变量或者 IO 映射区覆盖掉。解决访问数组前做钳位尤其当数组下标来自通讯报文或 HMI 输入时nIdx : MAX(0, MIN(nIdx, MAX_INDEX)); arrData[nIdx] : xValue;MAX与MIN是标准限制指令这里的写法把 nIdx 强制限定在 0 到MAX_INDEX之间。另一个常见手段是用LIMIT指令但 LIMIT 的边界参数语义在不同手册里略有不同我更喜欢 MAX/MIN 组合语义清晰哪个 IDE 都不会理解错。防了这一步通讯数据里一个非法下标导致 CPU 内存区被写坏的坑基本就堵上了。5. 把 Word 版 ST 手册变成自己的速查资产索引、标注与工程模板打开一份 ST 语言编程手册几百页的 PDF 或 Word 文档大部分人第一反应是“从头读一遍”。这是低效路径因为手册里的指令按字母排序或按功能分类而不是按工程场景组织。正确姿势是把它当成字典先建索引再按需查阅最后把常用指令沉淀成自己的工程模板。5.1 先按指令类别做索引读手册只读这三块任何一份 ST 手册哪怕它写得再乱以下四类内容是你动手前就要精读的内容类别优先级精读理由变量声明语法A 级不读这个连 VAR_INPUT 都写不对运算符与表达式A 级算术、比较、逻辑运算符是表达式的基石数据类型转换指令A 级BYTE、WORD、INT、REAL 互转规则是坑最多的地方功能块与函数定义语法B 级写自己的 FB 时必须清晰理解接口内置数学函数B 级用到时查不必提前背编译错误代码表C 级出错了再翻第一周别碰拿到 Word 版手册的第一件事是打开导航窗格把目录导出来把“变量声明语法”“数据类型转换”“函数块定义”这三节加上书签。不要试图通读整本ST 手册的价值在于遇到问题能快速定位。A 同学第一次拿到手册时用一周时间只精读了声明语法和类型转换两章然后直接开写项目代码遇到不会的指令再回头查远比通读效率高。5.2 从手册指令表到自己的速查 Excel/Markdown 表手册里的指令表往往很长逻辑运算、位运算、数据类型转换、数学指令、字符串指令、数组指令每一项都有函数原型、参数说明和示例。把这些零散内容整理成自己的速查表是手册消化过程中的关键一步。我习惯用 Markdown 表格维护方便做版本管理也方便复制到各种文档里指令函数原型关键参数用途与踩坑备注LIMITLIMIT(MN:, IN:, MX:)MN 下限 / IN 输入 / MX 上限限幅输出注意 MNMX 时行为随品牌而异SELSEL(G:, IN0:, IN1:)GFALSE 选 IN0GTRUE 选 IN1二选一选择器常替代 IF 简写MUXMUX(K:, IN0..INn)K 为通道号多路选择K 越界时输出默认值SHLSHL(IN:, N:)N 为移位位数左移配合 AND 可做字节拼装SHRSHR(IN:, N:)N 为移位位数右移注意无符号与有符号的差异每遇到一个手册里的指令就按“指令名 原型 关键参数 场景备注”四列补进自己的表。重点写在备注里这个指令上次用在哪、出了什么坑、改成什么写法了。这条备注的价值远高于指令本身因为手册不会告诉你“LIMIT 在下限大于上限时的输出不确定要先用 MAX/MIN 钳位”。建好之后写代码时遇到不确定的指令先查自己的表表里没有再看手册原定义。几周后这张表就是整本手册的浓缩精华。5.3 从示例到工程模板把手册代码改成带边界的生产代码手册里的示例代码天然有一个问题为了演示指令变量往往直接写常量完全没有边界检查。直接抄进项目里等于把风险一起抄进去。我通常按三步把示例改造成可交付代码把示例里的常量改成VAR_INPUT把一次性运行的逻辑改成函数块接口加上类型转换、边界保护和诊断输出。以一个斜坡发生器为例手册级代码往往长这样rOutput : rOutput 5.0; // 每周期加 5这种代码直接上产线会带来三个问题没有参数化、没有上下限保护、没有使能控制。改造后的工程模板FUNCTION_BLOCK FB_RampGenerator VAR_INPUT rSetpoint : REAL; // 目标值 rRampRate : REAL; // 每周期变化量 bEnable : BOOL; // 使能 bReset : BOOL; // 复位 END_VAR VAR_OUTPUT rOutput : REAL; // 当前斜坡输出 END_VAR VAR rCurrent : REAL; END_VAR IF bReset THEN rCurrent : 0.0; ELSIF bEnable THEN // 朝着目标逼近一步钳位防止越过目标 IF rCurrent rSetpoint THEN rCurrent : MIN(rCurrent rRampRate, rSetpoint); ELSIF rCurrent rSetpoint THEN rCurrent : MAX(rCurrent - rRampRate, rSetpoint); END_IF END_IF rOutput : rCurrent;这段代码里MIN和MAX承担了限幅任务使能位和复位位从外部接口接入。工程寿命中这种“带边界的参数化函数块”才是能复用的资产。手册原文只是给你提供算法灵感把它包装成带清楚接口的安全实现这步必须自己来。6. 从手写 ST 到可交付程序仿真、在线调试与代码自查三板斧ST 程序的最后一道关不是编译通过而是运行行为符合预期。离线仿真是最便宜的验证方式在 IDE 里把程序跑在虚拟 PLC 上手动给输入变量赋各种边界值——数组越界、REAL 溢出、CASE 非法值——在仿真里把这些都打一遍再下载到实物。我通常会写一段临时测试代码把所有输入按异常组合强制赋值观察程序会不会卡死或输出异常。在线调试时除了传统的梯形图在线监视ST 的断点功能更有价值。在 IDE 里对 ST 代码行设置断点可以单步执行逐行观察变量变化。遇到“这一周期计算怎么多走了一步”这类问题用断点比对每一行的计算结果定位速度远快于看监控表。在线修改也是常见操作但要注意不同 PLC 对在线改写的支持能力差异很大有的只支持改常量有的能改逻辑。改完逻辑后切记把修改下载到 RAM再考虑是否写入 Flash否则断电后程序回到旧版本。代码自查清单我打印出来贴在工位上方每个 FOR 循环是否会自动结束每次访问数组前是否做了边界钳位REAL 累加是否用 Kahan 补偿BOOL 打包成字节是否按位手动组装CASE 是否带 ELSE 兜底。这条清单是 N 个通宵换来的。有一次我在仿真器里测中位值滤波数组复制那行写成了直接操作输入数组导致第二次调用时原始样本已经被排序污染输出永远是同一个值排查了三个小时才发现。从那以后我的所有函数块第一行几乎都是arrTemp : arrInput;先复制再处理。ST 语言给你的自由度很大但工程现场的可靠性多数是用边界检查和防御式编程换来的。希望这篇笔记能把你在 PLC 文本化编程这条路上的坑提前填掉一些。本文还有配套的精品资源点击获取

相关新闻

C++老鼠走迷宫:数据结构课程设计中的DFS与回溯算法解析

C++老鼠走迷宫:数据结构课程设计中的DFS与回溯算法解析

简介:一份基于C的数据结构课程设计项目,围绕“老鼠走迷宫”经典问题,展示二维数组、图结构、栈与递归的综合运用。项目通过随机迷宫生成与路径搜索,帮助读者理解深度优先搜索(DFS)原理及其在连通性、回溯场…

2026/10/15 14:54:37 阅读更多 →
AI算力报告实战指南:从增速预测到扩容落地的完整方法

AI算力报告实战指南:从增速预测到扩容落地的完整方法

简介:这份《2025年中国人工智能计算力发展评估报告》由浪潮信息与IDC联合推出,共计45页,面向AI基础设施决策者、算力产业研究人员及技术规划人员,可用于把握智能算力市场演进方向、辅助制定采购与建设策略。报告涵盖全球及中国AI发…

2026/10/15 14:54:37 阅读更多 →
AI安全:提示词注入攻击防御与实战方案

AI安全:提示词注入攻击防御与实战方案

1. 提示词注入攻击的本质与危害去年我在参与一个企业级AI系统安全审计时,发现了一个令人后怕的现象:攻击者仅通过精心构造的输入文本,就成功让系统输出了本应严格保密的企业财务数据。这种攻击手法正是典型的提示词注入(Prompt In…

2026/10/15 14:54:37 阅读更多 →

最新新闻

道路检测与整车控制:从解压到实车验证的完整落地链路

道路检测与整车控制:从解压到实车验证的完整落地链路

简介:这是一份面向自动驾驶与车辆工程方向学习者的C综合项目压缩包,围绕道路检测与整车控制两大主题,涵盖传感器数据处理、车道线/斑马线识别、控制策略等实现思路,适用于正在研究ADAS、车辆动力学或Visual Studio工程实践的开发者…

2026/10/15 15:42:41 阅读更多 →
自动驾驶感知与控制链路:车道线检测如何转化为转向指令

自动驾驶感知与控制链路:车道线检测如何转化为转向指令

简介:面向C开发者和车辆控制/自动驾驶初学者,这份压缩包围绕道路检测与整车控制两大主题,提供一套完整的Visual Studio工程源码及相关学术资料。其中包含斑马线自动识别、车道偏离预警等检测方向的C实现代码,以及整车控制策略的参…

2026/10/15 15:42:41 阅读更多 →
openSCADA Java端jar包全解析:OPC通信与依赖冲突避坑指南

openSCADA Java端jar包全解析:OPC通信与依赖冲突避坑指南

简介:面向Java技术栈与OPC通信场景的openSCADA开发者,这份汇总包解决了开发环境中依赖分散、版本不齐、反复搜寻jar的痛点。压缩包共480个文件、约30.92MB,主体为339个class文件与129个jar包:class文件对应服务端、客户端、序列化…

2026/10/15 15:42:41 阅读更多 →
Windows LSP注入原理与实战:Winsock协议栈劫持技术详解

Windows LSP注入原理与实战:Winsock协议栈劫持技术详解

简介:本资源是一份面向Windows底层安全与逆向开发学习者的LSP注入技术实践包,聚焦原理剖析与可运行代码实现,适用于有一定C/COM基础的安全研究人员、渗透测试初学者及系统编程爱好者。资源完整呈现LSP(语言服务提供者)…

2026/10/15 15:42:41 阅读更多 →
Windows 上安装 Apache Superset 的完整避坑指南

Windows 上安装 Apache Superset 的完整避坑指南

简介:这份文档面向需要在Windows环境下搭建BI分析平台的数据工程师与运维人员,系统整理了SuperSet的安装与汉化操作说明。SuperSet由Airbnb开源,支持MySQL、Oracle、PostgreSQL、Presto、SparkSQL等多种关系数据库与大数据框架,具…

2026/10/15 15:42:41 阅读更多 →
12 月 PMP 报名三批次完整城市清单 + 考位紧张度预测 + 抢考位实操指南

12 月 PMP 报名三批次完整城市清单 + 考位紧张度预测 + 抢考位实操指南

12月PMP报名三批次完整城市清单12月PMP报名分三批放考位,时间、城市范围都不一样。这篇文章把批次安排、考点分布、考位紧张程度和抢位实操都过一遍,帮你提前心里有数。需要说明的是,本文内容仅基于官方公开信息整理,观点保持中立…

2026/10/15 15:41:41 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/15 9:49:14 阅读更多 →