2. 产线启停过程的状态建模
产线启停控制的核心难点,不在于“按下启动按钮让电机转起来”,而在于让整条产线在启停过程中始终处于可预期、可判断、可干预的状态。要做到这一点,第一步不是写程序,而是把产线运行过程抽象成有限个离散状态,并明确每个状态之间的迁移条件。这就是产线启停过程的状态建模。
状态建模的本质,是把连续变化的物理过程(速度、张力、温度、位置)映射为控制器可以判断和调度的离散状态机。控制器在每个扫描周期读取输入信号,判断当前状态是否满足迁移条件,满足则切换到目标状态,并执行该状态对应的输出动作。这样,启停过程就不再是一串“凭经验写死的延时”,而是一张可验证、可排障的状态迁移图。
一、六个基本状态的划分依据
对于典型的连续输送类产线(如皮带输送、辊道输送、多工位同步线),启停过程通常可划分为六个基本状态:停机(Stopped)、启动(Starting)、爬坡(Ramping)、稳态(Steady)、减速(Decelerating)、急停(E-Stop)。划分依据不是时间长短,而是“速度给定方式”和“安全等级”两个维度。
- 停机:速度给定为 0,所有驱动使能关闭,产线无物料流动。这是初始状态,也是正常停车的终点状态。
- 启动:驱动使能打开,但速度给定仍为 0,处于“抱闸松开、转矩建立”的短暂时段。此状态用于确认各工位就绪信号、安全门锁、急停回路均正常。
- 爬坡:速度给定从 0 按设定斜率上升到额定值。此状态是启停过程中最危险的阶段,因为张力、物料堆积、同步误差都在动态变化。
- 稳态:速度给定等于额定值,各工位同步误差在允许窗口内,产线进入正常生产。
- 减速:速度给定从额定值按斜率下降到 0,用于正常停车。
- 急停:安全回路断开,驱动以最大减速度或自由停车方式停止,属于安全状态,优先级最高。
二、状态迁移条件的设计
状态迁移条件必须由“可测量的信号”构成,不能依赖操作员口头确认。以一条三段式输送线为例,假设额定线速度 v_rated = 0.5 m/s,爬坡斜率 a_up = 0.1 m/s²,减速斜率 a_down = 0.15 m/s²,同步误差窗口 ±3 mm。各迁移条件可设计如下:
| 迁移 | 触发条件 | 说明 |
|---|---|---|
| 停机 → 启动 | 启动按钮按下 且 安全回路闭合 且 各工位就绪 | 就绪信号包括变频器无故障、抱闸已松、物料检测正常 |
| 启动 → 爬坡 | 驱动使能反馈为 ON 且 转矩建立完成(约 200 ms) | 避免在转矩未建立时给速度给定,防止溜车 |
| 爬坡 → 稳态 | 实际速度 ≥ 0.95×v_rated 且 同步误差 ≤ 3 mm | 两个条件同时满足才进入稳态 |
| 稳态 → 减速 | 正常停车按钮按下 或 生产计数到达 | 正常停车路径 |
| 减速 → 停机 | 实际速度 ≤ 0.02 m/s 且 抱闸已合 | 确认完全停止后才切断使能 |
| 任意状态 → 急停 | 急停回路断开 或 安全门打开 | 无条件、最高优先级迁移 |
这里有一个容易被忽略的细节:爬坡 → 稳态的迁移条件必须同时检查速度和同步误差。如果只检查速度,可能出现“速度到了但同步误差超限”的情况,此时产线虽然速度正常,但物料已经在工位间堆积或拉断。因此,稳态的进入条件应设计为“速度达标 + 同步误差在窗口内 + 持续稳定 500 ms”,用持续时间过滤瞬时波动。
三、状态迁移图
下图给出上述六个状态及其迁移条件的完整关系。图中实线箭头表示正常启停路径,虚线箭头表示异常或安全路径,箭头旁标注的是迁移条件。
四、状态建模中的三个关键约定
第一,急停状态必须独立于正常状态机。急停不是“减速到停”的变体,而是安全回路直接切断驱动使能。在状态机中,急停应作为最高优先级的中断处理,任何状态检测到急停信号都必须立即跳转到急停状态,并执行抱闸、切断输出、置位故障标志。急停恢复后,不能自动回到原状态,必须经过“停机 → 启动”的完整路径重新启动。
第二,爬坡和减速的斜率要分开设定。很多现场把加速和减速用同一个斜率参数,这是不合理的。加速时物料从静止到运动,需要克服静摩擦和建立张力,斜率应偏小;减速时物料已有动能,斜率可以稍大,但过大可能导致物料前冲或堆叠。示例中 a_up = 0.1 m/s²、a_down = 0.15 m/s² 就是基于这个考虑。
第三,状态迁移要有“确认”环节。例如“减速 → 停机”不能只判断速度给定为 0,而要判断实际速度反馈 ≤ 0.02 m/s 且抱闸已合。否则可能出现给定为 0 但实际仍在惯性滑行时就切断使能,导致下次启动时位置偏移。
五、从状态模型到程序结构
在 PLC 中实现时,通常用一个整数变量 state 表示当前状态,用 CASE state OF 分支执行各状态动作,在每个分支内判断迁移条件并更新 state。例如:
CASE state OF
0: (* 停机 *)
drive_enable := FALSE;
speed_ref := 0.0;
IF start_btn AND safety_ok AND all_ready THEN
state := 1;
END_IF;
1: (* 启动 *)
drive_enable := TRUE;
speed_ref := 0.0;
IF enable_fb AND torque_ready THEN
state := 2;
END_IF;
2: (* 爬坡 *)
speed_ref := RAMP(v_rated, a_up);
IF actual_speed >= 0.95*v_rated AND sync_err <= 3.0 THEN
stable_timer := stable_timer + 1;
IF stable_timer >= 500 THEN
state := 3;
END_IF;
ELSE
stable_timer := 0;
END_IF;
3: (* 稳态 *)
speed_ref := v_rated;
IF stop_btn OR count_reached THEN
state := 4;
END_IF;
4: (* 减速 *)
speed_ref := RAMP(0.0, a_down);
IF actual_speed <= 0.02 AND brake_closed THEN
state := 0;
END_IF;
END_CASE;
(* 急停中断,最高优先级 *)
IF NOT safety_ok THEN
state := 5;
drive_enable := FALSE;
speed_ref := 0.0;
brake_close := TRUE;
fault_flag := TRUE;
END_IF;
这段结构的关键在于:急停判断放在 CASE 之外,确保任何状态下都能立即响应;爬坡到稳态的迁移用 stable_timer 做 500 ms 持续确认,避免瞬时波动导致状态抖动;减速到停机同时检查实际速度和抱闸反馈,保证停稳后再切断使能。
状态建模完成后,调试的重点就从“调延时参数”变成了“验证迁移条件”。可以用强制变量逐条测试每个迁移条件是否按预期触发,也可以记录状态切换的时间戳,分析爬坡时间、稳态进入时间是否符合设计。这样,产线启停过程就从经验操作变成了可分析、可优化的工程对象。