返回主站|会员中心|保存桌面

西驰电气专营    

变频器、软启动器

新闻分类
  • 暂无分类
站内搜索
 
首页 > 新闻中心 > 料仓程序该如何写!
新闻中心
料仓程序该如何写!
发布时间:2026-01-18        浏览次数:7        返回列表

编写料仓控制程序,核心是实现料仓的物料管理(上料、下料、仓位检测)、状态监控和故障处理,我会以西门子 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;

三、关键细节说明

  1. 仓位检测适配

    • 若用重量传感器检测仓位,只需将S_BinLevel改为重量值(如 kg),阈值P_BinFullLevel设为额定重量(如 500kg),逻辑无需修改。

    • 若用位移传感器(如料位计),将S_BinLevel映射为传感器的模拟量值(需先做模拟量转换)。

  2. 安全互锁

    • 必须添加 “上料 / 下料机构限位互锁”(如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;
  3. HMI 对接

    • S_BinLevelS_AlarmActiveI_AutoMode等变量映射到 HMI,实现仓位显示、模式切换、报警提示。

四、程序调试要点

  1. 先在离线模式下模拟:强制I_BinEmpty=TRUE,观察O_FeedStart是否触发,仓位是否增加。

  2. 现场调试时,先切换手动模式,测试手动上料 / 下料是否正常,再切换自动模式。

  3. 验证超时报警:断开I_FeedComplete信号,触发上料后等待超时时间,观察O_TimeoutAlarm是否激活。


总结

  1. 料仓程序核心是仓位检测 + 手自动模式 + 动作执行 + 报警处理,先定义清晰的变量 DB 块,再分模式编写逻辑。

  2. 单仓位和多仓位的核心逻辑一致,多仓位只需将变量改为数组,通过循环遍历实现。

  3. 必须添加安全互锁(急停、限位)超时报警,避免设备故障和物料溢出。

收缩
  • QQ咨询

  • 电话咨询

  • 18576370666
  • 添加微信客服