PLC风力发电控制系统设计:状态机、Modbus与安全链
2026/9/19 2:22:38 网站建设 项目流程

简介:这份资源是基于PLC的风力发电控制系统课程设计文档,面向自动化、电气工程及相关专业的本科生、课程设计或毕业设计阶段的读者,解决偏航、齿轮箱、液压与发电机四大子系统的控制方案设计与原理图绘制问题。压缩包内共1个doc文件,约2.49MB,内容为完整的设计说明书,涵盖摘要、电气原理图、PLC与电动机及低压器件选型、I/O接线图以及各局部控制程序的编写与调试过程。目前已有189人学习下载。读者可据此了解以S7-200为核心的主控制器如何实时检测发电机状态、自动调整控制参数,并参考其中对风与解缆、温控与压力控制、油位控制等功能的设计思路,配合S7-200仿真软件的验证方法,完成从选型、绘图到编程调试的完整闭环,适合作为课程设计模板或工程入门的参考案例。

1. 阵风来了,桨叶没跟上:PLC 在风力发电控制系统里到底管什么

阵风从 8 m/s 拉到 15 m/s 往往只要十几秒。桨叶响应慢半拍,叶轮转速就会冲过额定值,机组报超速、安全链动作、液压站泄压、桨距顺桨到 90°,一套动作走完停机十几分钟,一天少发几千度电。这类现场问题最后都会指到同一个地方:主控 PLC 在一个扫描周期里要同时完成模拟量采样、状态机推进、Modbus 轮询和故障记录,哪一环慢了,保护就慢一拍。基于 PLC 的风力发电控制系统设计,实质是把启停、并网、变桨、偏航、保护和上位监控拆成确定性的顺序逻辑与联锁,让"什么时候允许做什么"变成可读、可测、可复现的代码,而不是靠一堆分散的继电器和时间继电器硬拼。做 PLC 课程设计、毕业设计的同学,和第一次接手风机主控柜的电气工程师,面对的是同一件事:先想清楚控制对象和控制边界,再决定用哪只 PLC、怎么写梯形图。

2. 风力发电控制系统总体架构与 PLC 选型:从 IO 点表倒推硬件

2.1 主控、变桨、偏航三层架构怎么分

风力发电控制系统的常规分法是三层。最上层是主控 PLC,负责整机状态机、并网条件判断、功率给定、故障汇总和与上位机/风场环网的通讯;中间层是执行机构控制,变桨通常由变桨柜里的伺服驱动器或变频器带电机完成,偏航由偏航电机加减速机驱动,液压站负责刹车和制动器释放;最下层是传感器与安全链,风速仪、风向标、编码器、振动开关、急停按钮、安全继电器串在一条独立的硬回路上。

分层的意义在于责任边界。主控 PLC 只发"桨距角到 2°"这种指令,不直接去驱动电机功率器件;变桨驱动器自己闭速度环和电流环,出问题先报自己的故障码。偏航逻辑相对独立,主控只给"左偏""右偏""停止"三个状态,解缆判断放在偏航 PLC 或主控的一个独立功能块里。安全链则完全不经过 PLC 软件——PLC 读到的只是安全链是否闭合的干接点反馈,急停一按,硬件先切断变桨和变流器使能,软件再去做顺桨和记录。把这条边界画错,后面所有调试都会变成"到底谁先动"的扯皮。

2.2 PLC 选型:西门子、三菱、汇川怎么挑

课程设计和实际项目选型标准不一样。学校里优先考虑编程软件好拿、资料多、仿真方便;工程上优先看 IO 余量、通讯口数量、温度等级和认证。下面这张表是我一般会拿来快速过一遍的对照。

平台典型型号模拟量通道通讯口适合场景
西门子S7-1200 / S7-1500板载 2AI,可扩 SM1231PROFINET + CM1241 RS485主控、教学、多机组网
西门子S7-200 SMART板载 2AI / 1AO本体 RS485 ×2小型离网机组、单机柜
三菱FX5U板载 2AI / 1AO以太网 + RS485教学、偏航/液压子站
汇川AM 系列(CODESYS)依模块配置EtherCAT + Modbus变桨、变流器侧控制

选型时先数点。一台 2 MW 机组的主控,模拟量输入大致 12~20 点(风速、风向、机舱振动、齿轮箱油温、轴承温度、环境温度、变流器电流等),数字量输入 30~50 点,数字量输出 15~25 点。S7-1200 的 CPU 1215C 加两三个扩展模块够用,但要提前算模块供电预算和背板电流。如果还要通过 PROFINET 挂 3 台以上变流器,CPU 的通讯连接资源要留余量,别到最后发现连不上第 4 台。

2.3 IO 点表与变量声明:先列表再接线

点表没排清楚就画接线图,是返工率最高的做法。点表里至少要有信号名、类型、量程、PLC 地址、对应端子号、是否进安全链六列。排完之后直接把前四列落到 PLC 变量声明里,组态和接线就能并行推进。

// DB_WT_IO —— 主控 PLC 过程映像与标定参数(示意) DATA_BLOCK "DB_WT_IO" { S7_Optimized_Access := 'TRUE' } VAR // ---- 模拟量输入 ---- WindSpeed_Raw : Int; // %IW64 风速仪 4~20mA WindDir_Raw : Int; // %IW66 风向标 4~20mA GearOilTemp_Raw : Int; // %IW68 齿轮箱油温变送器 NacelleVib_Raw : Int; // %IW70 机舱振动加速度 // ---- 数字量输入 ---- SafetyChain_OK : Bool; // %I0.0 安全链闭合反馈 YawLeftLim : Bool; // %I0.1 偏航左限位 YawRightLim : Bool; // %I0.2 偏航右限位 PitchFault_1 : Bool; // %I0.3 1# 变桨故障 // ---- 数字量输出 ---- YawMotor_L : Bool; // %Q0.0 偏航电机左转 YawMotor_R : Bool; // %Q0.1 偏航电机右转 PitchBrake : Bool; // %Q0.2 变桨制动器释放 ConvEnable : Bool; // %Q0.3 变流器使能 // ---- 标定量 ---- Wind_FS : Real := 50.0; // 风速满量程 m/s Dir_FS : Real := 360.0; // 风向满量程 度 Vib_Alarm : Real := 0.25; // 振动报警阈值 g END_DATA_BLOCK

这段声明的用法是:所有硬件地址只在数据块里出现一次,逻辑块只引用符号名。地址一旦调整,改数据块即可,不用去翻几十个网络。Wind_FSDir_FS这类标定量放在块里而不是写死在程序里,现场换量程的风速仪时只改一个数。

2.4 供电、接地与安全链的物理边界

机舱到塔基、塔基到主控柜的模拟量线,长度经常在一百米以上,4-20 mA 比 0-10 V 抗干扰强得多,所以远距离传感器一律走电流信号。屏蔽层单端接地,在控制柜侧落地,不要两头接。安全链回路用独立 24 V 电源双回路供电,急停、扭缆开关、超速开关串成硬线,PLC 只采集它的状态,不参与它的通断。

注意:把安全链的中间继电器触点接到普通数字量输入模块是常见做法,但这只用于状态监视。真正的停机动作必须由安全链自身切断使能回路,不能靠 PLC 软件跳闸。

3. 风力发电 PLC 程序怎么写:状态机骨架、多重实例 FB 与梯形图硬逻辑

3.1 为什么主控逻辑适合 plc 编程状态机写法

用置位/复位位堆出来的主控逻辑,刚写完能跑,加两个工况就开始互相打架。归根结底是因为风机的运行本来就是离散状态:待机、偏航对风、升速、并网发电、正常停机、安全停机、故障锁定。用 plc 编程状态机写法,把一个CASE语句里的步号当作唯一真值来源,每个周期只执行当前步的动作,跳转条件写在步内,逻辑就变得可以逐条对着工况表验证。

状态号本身要留区间,方便后期扩展:0~9 是停机类,10~29 是启动准备,30~49 是并网运行,80~89 是停机和故障。扩展新工况时只在区间里加号,不去动已有步。这个习惯在课程设计里可能看不出好处,但等你要加"低温待机"和"电网侧限功率"两个模式时,就知道省了多少事。

3.2 一个可复用的 SCL 状态机骨架

下面这段 SCL 可以直接放进 FB 里改,逻辑是完整可跑的骨架,没有依赖特定硬件。

// FB_WT_StateMachine —— 风机主控状态机骨架(SCL,S7-1200/1500) FUNCTION_BLOCK "WT_StateMachine" VAR_INPUT StartCmd : Bool; // 启动指令,面板或上位机 StopCmd : Bool; // 正常停机指令 SafetyOK : Bool; // 安全链闭合反馈,1=正常 n_Rotor : Real; // 叶轮转速 rpm v_Wind : Real; // 风速 m/s P_Grid : Real; // 并网有功 kW END_VAR VAR_OUTPUT PitchDemand : Real; // 桨距角给定,度 YawEnable : Bool; // 偏航使能 ConvEnable : Bool; // 变流器使能 StateCode : Int; // 当前状态号,送给上位机 END_VAR VAR step : Int := 0; tDelay : TON; tTimerOn : Bool; END_VAR BEGIN CASE #step OF 0: // 待机 #PitchDemand := 90.0; #YawEnable := FALSE; #ConvEnable := FALSE; #tTimerOn := FALSE; IF #SafetyOK AND #StartCmd THEN #step := 10; END_IF; 10: // 偏航对风,桨距解锁 #YawEnable := TRUE; #PitchDemand := 5.0; #tTimerOn := TRUE; #tDelay(IN := #tTimerOn, PT := T#30S); IF #tDelay.Q THEN #step := 20; END_IF; IF NOT #SafetyOK THEN #step := 90; END_IF; 20: // 变流器升速 #ConvEnable := TRUE; #PitchDemand := 2.0; IF #n_Rotor > 1050.0 THEN #step := 30; END_IF; // 到并网转速 IF NOT #SafetyOK THEN #step := 90; END_IF; 30: // 并网发电 IF #n_Rotor > 1980.0 THEN #step := 90; END_IF; // 1.1 倍额定超速 IF #v_Wind > 25.0 THEN #step := 80; END_IF; // 切出风速 IF #StopCmd OR NOT #SafetyOK THEN #step := 80; END_IF; 80: // 正常停机 #PitchDemand := 90.0; #ConvEnable := FALSE; IF #n_Rotor < 30.0 THEN #step := 0; END_IF; 90: // 安全停机,需手动复位 #PitchDemand := 90.0; #ConvEnable := FALSE; #YawEnable := FALSE; IF #SafetyOK AND #StartCmd = FALSE THEN #step := 0; END_IF; END_CASE; #StateCode := #step; END_FUNCTION_BLOCK

逻辑上,CASE每周期只命中一个分支,输出在每个分支里被完整赋值,不会出现上一步的残留输出。参数说明:n_Rotor > 1050.0是并网转速阈值,按机型改;1980.0是超速阈值,正常取额定转速的 1.1 倍;25.0是切出风速,超过就正常停机而不是安全停机。tDelay放在 CASE 外声明、步内调用,避免定时器被反复初始化。

3.3 西门子 plc 多重实例:变桨三轴共用同一个 FB

三支桨叶的控制逻辑完全相同,差别只在轴号和实际角度反馈。这是西门子 plc 多重实例最适合的场景:在调用块里声明一个 FB 类型的数组,每个元素自带一份背景数据,不用为每支桨建一个全局 DB。

// FB_WT_Main —— 主控调用层,用多重实例管三支桨 FUNCTION_BLOCK "WT_Main" VAR PitchAxis : ARRAY[1..3] OF "FB_PitchCtrl"; // 多重实例 END_VAR VAR_INPUT PitchSet : Real; // 统一桨距给定 PitchActual : ARRAY[1..3] OF Real; // 三轴实际角度反馈 END_VAR VAR_OUTPUT PitchFault : ARRAY[1..3] OF Bool; END_VAR VAR_TEMP i : Int; END_VAR BEGIN FOR #i := 1 TO 3 DO #PitchAxis[#i](Enable := TRUE, Setpoint := #PitchSet, Actual := #PitchActual[#i], AxisNo := #i, Fault => #PitchFault[#i]); END_FOR; END_FUNCTION_BLOCK

VAR里声明的PitchAxis就是多重实例,背景数据跟着WT_Main的实例 DB 走。好处是上位机可以用一个符号访问三轴状态,程序移植到 5 MW 机组时只把数组上限从 3 改成 3 就行(仍是三支桨,但控制参数不同),要扩到更多轴也不改结构。注意VAR_TEMP里的i每周期清零,不要拿它做状态保持。

3.4 plc 梯形图必须保留的硬逻辑:偏航解缆与急停复位

状态机负责流程,但有几条逻辑我建议仍然用梯形图单独写,因为它们要的就是"一眼看懂":偏航解缆、限位互锁、急停复位。梯形图里两个限位互串切断偏航输出,是最难被误改的写法。

// 偏航解缆联锁(指令表形式,梯形图等价) LD "YawLeftLim" // 左限位到,缆绳已接近扭死 O "YawRightLim" // 或右限位到 A "YawRunning" // 且偏航正在运行 = "YawCableAlarm" // 触发扭缆报警,上位机弹窗

说明:YawLeftLimYawRightLim是常开触点,正常时都断开;偏航运行中任意一个闭合,YawCableAlarm置位,状态机收到后转入停机。急停复位则要求SafetyOK由 0 变 1 的上升沿加上手动复位按钮,禁止自动复位——风场里最常见的事故复现方式就是"故障消失了,程序自己又启动了"。

4. 风速转速功率怎么进 PLC:4-20mA 标定、Modbus 轮询与数据集落库

4.1 4-20mA 风速风向的工程量转换与断线判定

S7-1200 的模拟量输入模块把 0~20 mA 转成 0~27648 的整数,4 mA 对应 5530 左右,20 mA 对应 27648。低于 5530 说明断线或者低于量程,这时候必须报警而不是当成 0 m/s——把断线当微风处理,是导致"无风也转"这类诡异现象的经典原因。

// FC_Analog2Eng —— 原始值转工程量,带量程钳位 FUNCTION "Analog2Eng" : Real VAR_INPUT Raw : Int; // 模拟量原始值 EngMin : Real; // 工程量下限 EngMax : Real; // 工程量上限 RawMin : Int := 5530; // 4mA 对应原始值 RawMax : Int := 27648; // 20mA 对应原始值 END_VAR BEGIN IF #Raw < 5300 THEN // 低于 4mA 约 0.2mA,判断线 "Analog2Eng" := #EngMin; // 返回下限,由调用方报警 ELSIF #Raw > #RawMax THEN "Analog2Eng" := #EngMax; // 超量程钳位 ELSE "Analog2Eng" := #EngMin + (#EngMax - #EngMin) * INT_TO_REAL(#Raw - #RawMin) / INT_TO_REAL(#RawMax - #RawMin); END_IF; END_FUNCTION

参数说明:RawMin取 5530,RawMax取 27648,这个比例是 4-20 mA 在 0-27648 全量程下的标准折算。风速仪量程 0~50 m/s 时,EngMin=0.0EngMax=50.0;风向标 0~360° 时,EngMax=360.0。调用方拿返回值之外,还要单独读一次Raw判断线,函数本身只做转换不做报警,职责分开。

信号传感器输出工程量程报警阈值
风速4-20 mA0~50 m/s>25 m/s 切出,<5300 判断线
风向4-20 mA0~360°变化率 >30°/s 判异常
齿轮箱油温4-20 mA-40~150 ℃>75 ℃ 报警,>85 ℃ 停机
机舱振动4-20 mA0~1 g>0.25 g 报警

4.2 plc 建立设备通讯:Modbus RTU 寄存器映射与轮询节拍

风机主控下面常挂变流器、变桨驱动器、风速仪、电量表,大多是 Modbus RTU。一台 plc 控制 3 台变频器这类需求,靠本体 RS485 口轮询就能做,关键是排好寄存器映射和轮询节拍,别让通讯阻塞保护逻辑。

先定寄存器表,这是所有通讯代码的依据:

寄存器地址长度含义类型系数
0x00001变流器状态字UINT16位定义
0x00012有功功率INT320.1 kW
0x00031直流母线电压UINT160.1 V
0x00041发电机转速UINT161 rpm
0x00101故障码UINT16位定义
// OB1 轮询:一台 PLC 依次读 3 台变流器,100ms 触发一次 CASE #PollStep OF 0: "MB_MASTER_1"(REQ := #Trig100ms, MB_ADDR := 1, // 从站地址 MODE := 0, // 0=读保持寄存器,功能码 03 DATA_ADDR := 0, // 起始寄存器 DATA_LEN := 17, // 连续读 17 个字 DATA_PTR => "DB_Conv1.Raw"); IF "MB_MASTER_1".DONE THEN #PollStep := 1; ELSIF "MB_MASTER_1".ERROR THEN #PollStep := 10; END_IF; 1: "MB_MASTER_1"(REQ := #Trig100ms, MB_ADDR := 2, MODE := 0, DATA_ADDR := 0, DATA_LEN := 17, DATA_PTR => "DB_Conv2.Raw"); IF "MB_MASTER_1".DONE THEN #PollStep := 2; ELSIF "MB_MASTER_1".ERROR THEN #PollStep := 10; END_IF; 2: "MB_MASTER_1"(REQ := #Trig100ms, MB_ADDR := 3, MODE := 0, DATA_ADDR := 0, DATA_LEN := 17, DATA_PTR => "DB_Conv3.Raw"); IF "MB_MASTER_1".DONE THEN #PollStep := 0; ELSIF "MB_MASTER_1".ERROR THEN #PollStep := 10; END_IF; 10: // 单站失败,跳过并计数,连续 3 次才报通讯故障 #CommFail[#PollStep] := #CommFail[#PollStep] + 1; IF #CommFail[#PollStep] > 3 THEN "DB_WT_IO".ConvCommFault := TRUE; END_IF; #PollStep := 0; END_CASE;

要点在REQ用 100 ms 脉冲而不是常 1,DONEERROR是互斥的握手信号,必须成对处理,否则轮询会卡死在某一步。3 台从站、每台 17 个字、19200 bps 下,一轮大概 60~90 ms,100 ms 节拍刚好留出余量。如果从站更多,比如 plc 控制 32 台变频器,就不要指望单口轮询还能保持秒级刷新——常见做法是按重要性分组,只把关键几台放进快速轮询,其余降速,或者改用多口/以太网分摊。

4.3 从采集脚本到风力发电数据集:落库与字段设计

课程设计常被要求"存一份数据做分析"。主控 PLC 侧的 10 分钟统计值通过上位机读到数据库,字段设计决定了后面能不能直接做分析。用 Python 直接从 Modbus 抓一份原始数据做对照,是最省事的验证手段。

from pymodbus.client import ModbusSerialClient import csv, time cli = ModbusSerialClient(port="COM3", baudrate=19200, parity="N", stopbits=1, bytesize=8, timeout=1.0) cli.connect() fields = ["ts", "status", "power_kw", "dc_bus_v", "gen_rpm", "fault"] with open("wt_dataset.csv", "w", newline="") as f: w = csv.DictWriter(f, fieldnames=fields) w.writeheader() for _ in range(3600): # 1 Hz 采 1 小时 rr = cli.read_holding_registers(address=0, count=17, slave=1) if rr.isError(): time.sleep(1.0) # 通讯失败跳过,不写脏数据 continue r = rr.registers power = (r[1] << 16) | r[2] # 32 位有功 if power > 32767: # INT32 补码还原 power -= 65536 w.writerow({"ts": round(time.time(), 3), "status": r[0], "power_kw": round(power * 0.1, 1), "dc_bus_v": round(r[3] * 0.1, 1), "gen_rpm": r[4], "fault": r[16]}) f.flush() time.sleep(1.0)

参数说明:slave=1是从站地址,和 PLC 轮询里用的是同一套;count=17对应寄存器表里 0x0000~0x0010;32 位有功耗两个字,高低字顺序按设备手册,先按高字在前试,读出来明显不对就交换。落库的表结构建议直接对齐分析需求:

CREATE TABLE wt_sample ( ts INTEGER NOT NULL, -- Unix 时间戳,秒 turbine_id TEXT NOT NULL, -- 机组编号,多机共用一张表 wind_ms REAL, -- 风速 m/s rpm REAL, -- 叶轮转速 rpm pitch_deg REAL, -- 桨距角 度 power_kw REAL, -- 有功功率 kW state INTEGER, -- 状态机步号 fault INTEGER -- 故障码 ); CREATE INDEX idx_wt_ts ON wt_sample (turbine_id, ts);

索引建在(turbine_id, ts)上,按机组查时间段才不会全表扫。state字段存的是状态机步号,比存一段文字描述有用得多——后面画时序图时,功率曲线和状态曲线叠在一起,停机原因一眼就能看出来。

4.4 通讯中断时的降级策略

通讯断了,主控不能跟着傻等。变流器数据 3 秒收不到,就把功率给定降到 0 并保持并网;10 秒收不到,转正常停机;风速仪数据丢失,直接转安全停机——没有风速输入就没法判断是否该切出,继续发电风险太高。降级策略要写进状态机的跳转条件里,而不是写在上位机报警里,因为上位机可能同时也在断。

5. 安全链与离网运行:超速、振动负阻尼、负载投切的 PLC 逻辑

5.1 超速保护的三级阈值与测速冗余

超速是风机最致命的工况,单靠一个转速信号不够。常见做法是三级:软件预警(1.05 倍额定)、软件停机(1.1 倍额定)、硬件超速开关(1.15 倍额定,直接进安全链)。软件两级用同一个编码器信号可以,但硬件超速开关必须是独立测速元件,不能和编码器共用一路。

// FC_OverspeedGuard —— 三级超速判断 FUNCTION "OverspeedGuard" : Int VAR_INPUT n_Rotor : Real; // 编码器转速 n_Backup : Real; // 独立测速开关折算转速 n_Rated : Real; // 额定转速 END_VAR BEGIN IF #n_Backup > #n_Rated * 1.15 THEN "OverspeedGuard" := 3; // 硬件级,安全链已动作 ELSIF #n_Rotor > #n_Rated * 1.10 THEN "OverspeedGuard" := 2; // 软件停机,状态机跳 90 ELSIF #n_Rotor > #n_Rated * 1.05 THEN "OverspeedGuard" := 1; // 预警,限制桨距变化率 ELSE "OverspeedGuard" := 0; END_IF; END_FUNCTION

返回 1 时不跳状态,只限制变桨速率,给控制系统一个纠正窗口;返回 2 直接进安全停机;返回 3 说明硬件已经先动了,PLC 只做记录和顺桨。两路转速差超过 5% 也要报警,可能是一路测速元件松了或线断了。

5.2 塔架振动与控制系统负阻尼

塔架前后一阶频率通常在 0.2~0.3 Hz,这个频率上的振动如果被控制回路放大,就会形成控制系统负阻尼:控制器在该频段的相位滞后超过 90°,输出的桨距动作不但没抑制振动,反而往里注能量,塔顶振幅越来越大。现场表现是风速平稳时振动报警频繁,风速变化剧烈时反而不报警。

保护项阈值动作说明
机舱振动加速度>0.25 g 持续 3 s报警并限功率检查变桨带宽
机舱振动加速度>0.5 g 持续 1 s安全停机可能已负阻尼发散
塔架低频振动0.2~0.3 Hz 幅值上升降低变桨增益加陷波或降带宽

处理办法通常是两条腿:一是在振动信号进控制环之前加陷波滤波,把 0.2~0.3 Hz 压掉;二是把变桨控制器的带宽降到塔架频率的三分之一以下。改完必须重新做阶跃试验,看塔顶位移的衰减包络是不是单调收敛。

5.3 离网型风力发电系统的负载投切与保护

离网型风力发电系统没有大电网做支撑,功率平衡全靠自己。风机出力随风速波动,负载却可能突然加减,PLC 要做的是按优先级投切负载并监视母线电压。常规顺序是:先看母线电压跌到下限,按优先级从低到高切除负载;电压回升到上限,再按相反顺序恢复。控制器要带延时和回差,否则会在阈值附近反复投切。

负载分组一般按"可中断—可延时—不可中断"三档,不可中断那档只能靠蓄电池或泄荷器兜。蓄电池组的充放电电流、单体电压、温度都要进 PLC,充到上限就切风机或转泄荷,放到下限就切非关键负载。这部分的逻辑量不小,但结构上和状态机一样,把优先级、延时、回差三个参数写成数据块里的常量,调试时改数就行。

6. 现场调试与偶发停机定位:扫描周期、资源占用与趋势录波

6.1 扫描周期与中断:把确定性留给保护

偶发停机的第一嫌疑是扫描周期。主控程序里放了大量 Modbus 轮询和浮点运算,扫描周期从 8 ms 涨到 30 ms,超速判断的响应就晚了二十多毫秒。做法是把保护判断放进循环中断 OB(比如 10 ms 的 OB30),Modbus 轮询和统计放到主循环里慢慢跑。中断里的代码只做比较、置位和写标志,不做通讯、不做字符串、不做任何可能耗时的动作。

// OB30 循环中断,10ms 调用,只放保护判断 "OverspeedGuard"(n_Rotor := "DB_WT_IO".n_Rotor, n_Backup := "DB_WT_IO".n_Backup, n_Rated := 1500.0); IF "OverspeedGuard" >= 2 THEN "DB_WT_IO".TripFlag := TRUE; // 只置标志,停机流程在主循环里走 END_IF;

主循环每周期检查TripFlag,为真则推状态机到 90。这样保护的响应时间由中断周期决定,不受通讯负载影响。

6.2 博途中查看 PLC 资源使用情况与趋势录波

调试阶段务实地看一眼资源占用,能省下大量猜测。在博途中查看 plc 资源使用情况,主要关注三处:在线诊断里的扫描周期(当前值和最大值)、存储器使用率(工作存储器与装载存储器)、通讯连接资源占用。扫描周期最大值如果远大于平均值,通常是某个条件分支偶尔跑了重活,比如通讯失败重试或者大数组的批量搬移。

趋势录波是定位偶发停机的最后一环。把转速、桨距角、风速、状态号和故障码放进同一条趋势,采样周期设到 100 ms 甚至 50 ms,重现时按时间倒推:先看状态号在哪一拍跳变,再看跳变前一拍的转速和桨距是否已经异常。如果转速在跳变前 200 ms 就已经越过阈值,说明是保护判断慢了,回去查扫描周期;如果转速正常但状态号跳了,说明跳转条件写错,回去查那一步的联锁。记录建议用循环缓冲,只保留最近 10 分钟,触发条件设为安全停机或故障码非零,这样即使无人值守,事后也能把现场那一拍捞出来。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询