博文

IEC61131-3 ST语言必备 - 定时器与计数器标准功能块

ST/PLC

IEC61131-3 ST 语言必备 - 定时器与计数器标准功能块

1. 定时器(IEC 标准)

1.1 TON - 接通延时定时器

作用: 输入信号持续一段时间后,输出才为 TRUE。

VAR
    TON_Timer : TON;
    Timer_Result : BOOL;
    ElapsedTime : TIME;
END_VAR

TON_Timer(
    IN := Start_Signal,      // 输入信号
    PT := T#5s,              // 预设时间 5 秒
    Q => Timer_Result,       // 输出(延时后为 TRUE)
    ET => ElapsedTime        // 已过去时间
);

IF Timer_Result THEN
    // 5 秒后执行
    Action := TRUE;
END_IF;

1.2 TOF - 断开延时定时器

作用: 输入信号断开后,输出继续保持一段时间。

VAR
    TOF_Timer : TOF;
    Running : BOOL;
END_VAR

TOF_Timer(
    IN := Run_Signal,
    PT := T#10s,
    Q => Running
);

// 信号断开后继续运行 10 秒

1.3 TP - 脉冲定时器

作用: 输入触发后,输出固定宽度的脉冲。

VAR
    TP_Timer : TP;
    Pulse_Out : BOOL;
END_VAR

TP_Timer(
    IN := Trigger,
    PT := T#1s,
    Q => Pulse_Out
);

// 每次 Trigger 为 TRUE,产生 1 秒宽度的脉冲

1.4 定时器特性对比

定时器触发条件输出时机典型应用
TONIN 变为 TRUE延时后 Q 变为 TRUE延时启动
TOFIN 变为 FALSE延时后 Q 变为 FALSE延时停止
TPIN 上升沿固定宽度脉冲脉冲生成

1.5 定时器状态说明

每个定时器都有以下输出:

  • IN:输入信号
  • PT:预设时间(Preset Time)
  • Q:输出信号
  • ET:已过去时间(Elapsed Time)

2. 计数器(IEC 标准)

2.1 CTU - 加计数器

VAR
    CTU_Counter : CTU;
    Count_Done : BOOL;
    Count_Value : INT;
END_VAR

CTU_Counter(
    CU := Pulse_Input,       // 计数输入(上升沿计数)
    RESET := Reset_Btn,      // 复位
    PV := 100,               // 预设值
    Q => Count_Done,         // 计数完成
    CV => Count_Value        // 当前值
);

IF Count_Done THEN
    // 计数达到 100
    Process_Complete := TRUE;
END_IF;

2.2 CTD - 减计数器

VAR
    CTD_Counter : CTD;
    Count_Done : BOOL;
END_VAR

CTD_Counter(
    CD := Pulse_Input,       // 减计数输入
    LOAD := Load_Btn,        // 加载预设值
    PV := 50,                // 预设值
    Q => Count_Done,         // 计数到 0
    CV => Current_Count      // 当前值
);

// 从 50 减到 0 时 Count_Done 为 TRUE

2.3 CTUD - 加减计数器

VAR
    CTUD_Counter : CTUD;
    Reached_Max : BOOL;
    Reached_Min : BOOL;
END_VAR

CTUD_Counter(
    CU := Up_Btn,            // 加计数
    CD := Down_Btn,          // 减计数
    RESET := Reset_Btn,
    LOAD := Load_Btn,
    PV := 50,
    Q => Reached_Max,        // 达到预设值
    QU => Reached_Max,       // 达到预设值
    QD => Reached_Min,       // 减到 0
    CV => Current_Count
);

2.4 计数器特性对比

计数器计数方向复位典型应用
CTU递增RESET 清零产品计数
CTD递减LOAD 加载预设值倒计时
CTUD双向RESET 清零库存管理

3. 实战应用

3.1 延时启动功能块

FUNCTION_BLOCK FB_DelayedStart
VAR_INPUT
    Start : BOOL;
    DelayTime : TIME := T#3s;
END_VAR
VAR_OUTPUT
    Running : BOOL;
    Countdown : TIME;
END_VAR
VAR
    StartTimer : TON;
    ManualStop : BOOL;
END_VAR

// 启动延时
StartTimer(IN := Start AND NOT ManualStop, PT := DelayTime);
Countdown := StartTimer.ET;

IF StartTimer.Q THEN
    Running := TRUE;
END_IF;

// 手动停止
IF ManualStop THEN
    Running := FALSE;
END_IF;

END_FUNCTION_BLOCK

3.2 周期性任务调度

PROGRAM PeriodicTask
VAR
    CycleTimer : TON;
    CycleCounter : CTU;
    TaskReady : BOOL;
    MinuteCounter : INT;
END_VAR

// 1 秒周期
CycleTimer(IN := TRUE, PT := T#1s);

IF CycleTimer.Q THEN
    CycleTimer(IN := FALSE);  // 复位
    CycleTimer(IN := TRUE);   // 重新启动
    
    // 计数
    CycleCounter(CU := TRUE, RESET := FALSE, PV := 60);
    
    IF CycleCounter.Q THEN
        // 每分钟执行
        TaskReady := TRUE;
        MinuteCounter := MinuteCounter + 1;
        CycleCounter.RESET := TRUE;  // 复位计数器
    END_IF;
END_IF;

IF TaskReady THEN
    // 执行周期性任务
    Execute_Task();
    TaskReady := FALSE;
END_IF;

END_PROGRAM

3.3 产品计数与批次管理

FUNCTION_BLOCK FB_ProductCounter
VAR_INPUT
    SensorSignal : BOOL;
    BatchSize : INT := 100;
    ResetCount : BOOL;
END_VAR
VAR_OUTPUT
    CurrentCount : INT;
    BatchComplete : BOOL;
    TotalProduced : INT;
END_VAR
VAR
    ItemCounter : CTU;
END_VAR

// 计数(上升沿检测)
IF SensorSignal THEN
    ItemCounter(
        CU := TRUE, 
        RESET := ResetCount, 
        PV := BatchSize
    );
END_IF;

CurrentCount := ItemCounter.CV;
BatchComplete := ItemCounter.Q;

IF BatchComplete THEN
    TotalProduced := TotalProduced + BatchSize;
    ItemCounter.RESET := TRUE;  // 自动复位开始下一批
END_IF;

END_FUNCTION_BLOCK

3.4 闪烁指示灯

FUNCTION_BLOCK FB_Blink
VAR_INPUT
    Enable : BOOL;
    OnTime : TIME := T#0.5s;
    OffTime : TIME := T#0.5s;
END_VAR
VAR_OUTPUT
    Output : BOOL;
END_VAR
VAR
    OnTimer : TON;
    OffTimer : TON;
END_VAR

IF NOT Enable THEN
    Output := FALSE;
    OnTimer(IN := FALSE);
    OffTimer(IN := FALSE);
    RETURN;
END_IF;

// 亮灭交替
IF NOT Output THEN
    OnTimer(IN := TRUE, PT := OnTime);
    IF OnTimer.Q THEN
        Output := TRUE;
        OnTimer(IN := FALSE);
    END_IF;
ELSE
    OffTimer(IN := TRUE, PT := OffTime);
    IF OffTimer.Q THEN
        Output := FALSE;
        OffTimer(IN := FALSE);
    END_IF;
END_IF;

END_FUNCTION_BLOCK

4. 注意事项

⚠️ 定时器使用要点:

  1. 定时器是功能块,需要实例化后才能使用
  2. 每次调用都需要传入 IN 参数
  3. PT 不能为负数或零
  4. 不同 PLC 品牌的定时器实现可能有细微差异

⚠️ 计数器使用要点:

  1. CU/CD 是边沿触发,不是电平触发
  2. RESET 优先级高于计数输入
  3. CV 是只读输出,不能直接赋值

文档版本:1.0 | 更新日期:2026-04-28 | 作者:JianLin Studio

← 返回博文列表