编写料仓控制程序,核心是实现料仓的物料管理(上料、下料、仓位检测)、状态监控和故障处理,我会以西门子 S7-1200 PLC(TIA Portal)为例,给出通用的料仓控制程序框架,涵盖单仓位和多仓位两种常见场景,代码可直接适配现场需求修改。
一、先明确料仓程序的核心逻辑
料仓控制的核心是 “状态判断 + 动作执行 + 安全互锁”,通用逻辑流程如下:
手动
自动
空仓位
满仓位
中间仓位
更新仓位计数
下料超时报警
状态反馈至HMI
报警输出+停机保护
二、程序实现(西门子 S7-1200 TIA Portal)
1. 第一步:定义变量(DB 块)
先创建全局 DB 块DB_BinStore,统一管理料仓的输入输出、状态和参数,避免变量混乱:
plc
// 料仓控制全局变量 DB_BinStore (优化的块访问) VAR_GLOBAL // 输入信号 I_BinEmpty: BOOL; // 料仓空检测(光电开关/接近开关) I_BinFull: BOOL; // 料仓满检测 I_FeedComplete: BOOL; // 上料完成信号(上料机构到位) I_DischargeComplete: BOOL; // 下料完成信号(下料机构到位) I_AutoMode: BOOL; // 自动模式选择(按钮) I_ManualFeed: BOOL; // 手动上料按钮 I_ManualDischarge: BOOL; // 手动下料按钮 I_ResetAlarm: BOOL; // 报警复位按钮 // 输出信号 O_FeedStart: BOOL; // 上料机构启动 O_DischargeStart: BOOL; // 下料机构启动 O_BinEmptyAlarm: BOOL; // 料仓空报警 O_BinFullAlarm: BOOL; // 料仓满报警 O_TimeoutAlarm: BOOL; // 上/下料超时报警 // 状态变量 S_BinLevel: INT := 0; // 料仓当前仓位(0-100,百分比) S_FeedBusy: BOOL := FALSE; // 上料中状态 S_DischargeBusy: BOOL := FALSE; // 下料中状态 S_AlarmActive: BOOL := FALSE; // 报警激活状态 // 参数变量 P_FeedTimeout: INT := 10; // 上料超时时间(秒) P_DischargeTimeout: INT := 10; // 下料超时时间(秒) P_BinFullLevel: INT := 95; // 满仓阈值(百分比) P_BinEmptyLevel: INT := 5; // 空仓阈值(百分比) END_VAR
2. 第二步:编写核心控制程序(OB1)
OB1 作为主循环组织块,实现手自动模式切换、上料 / 下料逻辑和报警处理:
plc
// 料仓主控制程序(OB1)
NETWORK
TITLE = 初始化与报警复位
// 报警复位:上升沿触发
VAR_TEMP
ResetEdge: BOOL; // 报警复位上升沿
END_VAR
ResetEdge := R_TRIG(CLK := I_ResetAlarm).Q;
IF ResetEdge THEN
S_AlarmActive := FALSE;
O_BinEmptyAlarm := FALSE;
O_BinFullAlarm := FALSE;
O_TimeoutAlarm := FALSE;
END_IF;
NETWORK
TITLE = 手动模式控制
IF NOT I_AutoMode THEN // 手动模式
// 手动上料:按钮按下且非满仓、非上料中
O_FeedStart := I_ManualFeed AND NOT I_BinFull AND NOT S_FeedBusy;
// 手动下料:按钮按下且非空仓、非下料中
O_DischargeStart := I_ManualDischarge AND NOT I_BinEmpty AND NOT S_DischargeBusy;
NETWORK
TITLE = 自动模式控制
IF I_AutoMode THEN // 自动模式
// 自动上料逻辑:空仓/低仓位 且 非上料中 且 非满仓
IF (S_BinLevel <= P_BinEmptyLevel OR I_BinEmpty) AND NOT S_FeedBusy AND NOT I_BinFull THEN
O_FeedStart := TRUE;
S_FeedBusy := TRUE;
// 上料超时检测(调用定时器,需在OB35中计时)
"TIA_Portal".T_FeedTimeout(IN := S_FeedBusy, PT := T#10S, Q => O_TimeoutAlarm);
END_IF;
// 自动下料逻辑:满仓/高仓位 且 非下料中 且 非空仓
IF (S_BinLevel >= P_BinFullLevel OR I_BinFull) AND NOT S_DischargeBusy AND NOT I_BinEmpty THEN
O_DischargeStart := TRUE;
S_DischargeBusy := TRUE;
// 下料超时检测
"TIA_Portal".T_DischargeTimeout(IN := S_DischargeBusy, PT := T#10S, Q => O_TimeoutAlarm);
END_IF;
// 自动上料完成:更新仓位
IF I_FeedComplete THEN
O_FeedStart := FALSE;
S_FeedBusy := FALSE;
S_BinLevel := S_BinLevel + 10;
IF S_BinLevel > 100 THEN
S_BinLevel := 100;
END_IF;
END_IF;
NETWORK
TITLE = 报警输出逻辑
// 空仓报警
O_BinEmptyAlarm := I_BinEmpty AND NOT S_AlarmActive;
// 满仓报警
O_BinFullAlarm := I_BinFull AND NOT S_AlarmActive;
// 超时报警(优先级最高)
O_TimeoutAlarm := ("TIA_Portal".T_FeedTimeout.Q OR "TIA_Portal".T_DischargeTimeout.Q) AND NOT S_AlarmActive;
// 任意报警激活时,标记报警状态
S_AlarmActive := O_BinEmptyAlarm OR O_BinFullAlarm OR O_TimeoutAlarm;3. 第三步:定时器配置(OB35)
创建循环中断 OB35(周期 100ms),用于超时计时(也可直接用 PLC 的 TON 定时器,无需 OB35):
plc
// OB35 - 定时中断(周期100ms) // 上料超时定时器 VAR_GLOBAL T_FeedTimeout: TON; // 上料超时定时器 T_DischargeTimeout: TON; // 下料超时定时器 END_VAR // 定时器无需额外编写,仅需在OB1中调用即可
4. 第四步:多仓位扩展(可选)
若为多仓位料仓(如 4 仓位),只需将变量改为数组形式,核心逻辑复用:
plc
// 多仓位变量扩展示例 VAR_GLOBAL I_BinEmpty: ARRAY[1..4] OF BOOL; // 4个仓位空检测 I_BinFull: ARRAY[1..4] OF BOOL; // 4个仓位满检测 S_BinLevel: ARRAY[1..4] OF INT := [0,0,0,0]; // 4个仓位当前值 // 其他变量同理改为数组 END_VAR // 多仓位控制逻辑:用FOR循环遍历每个仓位 NETWORK TITLE = 多仓位自动控制 VAR_TEMP BinIndex: INT; // 仓位索引 END_VAR FOR BinIndex := 1 TO 4 DO // 每个仓位的上料/下料逻辑,复用单仓位代码,仅替换索引 IF (S_BinLevel[BinIndex] <= P_BinEmptyLevel OR I_BinEmpty[BinIndex]) AND NOT S_FeedBusy THEN O_FeedStart[BinIndex] := TRUE; S_FeedBusy := TRUE; END_IF; END_FOR;
三、关键细节说明
仓位检测适配:
若用重量传感器检测仓位,只需将
S_BinLevel改为重量值(如 kg),阈值P_BinFullLevel设为额定重量(如 500kg),逻辑无需修改。若用位移传感器(如料位计),将
S_BinLevel映射为传感器的模拟量值(需先做模拟量转换)。安全互锁:
必须添加 “上料 / 下料机构限位互锁”(如
I_FeedLimit上料机构到位),避免机构碰撞,示例中已隐含I_FeedComplete作为到位信号。紧急停止信号(
I_EStop)需全局禁用所有输出,可在 OB1 开头添加:plc
IF I_EStop THEN O_FeedStart := FALSE; O_DischargeStart := FALSE; S_FeedBusy := FALSE; S_DischargeBusy := FALSE; RETURN; // 终止OB1执行 END_IF;
HMI 对接:
将
S_BinLevel、S_AlarmActive、I_AutoMode等变量映射到 HMI,实现仓位显示、模式切换、报警提示。
四、程序调试要点
先在离线模式下模拟:强制
I_BinEmpty=TRUE,观察O_FeedStart是否触发,仓位是否增加。现场调试时,先切换手动模式,测试手动上料 / 下料是否正常,再切换自动模式。
验证超时报警:断开
I_FeedComplete信号,触发上料后等待超时时间,观察O_TimeoutAlarm是否激活。
总结
料仓程序核心是仓位检测 + 手自动模式 + 动作执行 + 报警处理,先定义清晰的变量 DB 块,再分模式编写逻辑。
单仓位和多仓位的核心逻辑一致,多仓位只需将变量改为数组,通过循环遍历实现。
必须添加安全互锁(急停、限位) 和超时报警,避免设备故障和物料溢出。


