4. 基本顺控指令与梯形图编程

在Omron Sysmac Studio中,梯形图(Ladder Diagram)仍然是设备联锁与顺控逻辑最直观的表达方式。本节围绕置位/复位、定时器、计数器、比较指令、跳转与子程序六类基本指令,构建一个单设备启停与简单步序控制的完整示例。理解这些指令的“执行时机”和“保持特性”,是写出可靠顺控程序的前提。

一、置位/复位与自保持:启停逻辑的两种写法

Sysmac中置位指令为SET,复位指令为RSET。它们的特点是:条件成立时执行一次,之后即使条件断开,位状态仍保持。这与普通线圈OUT“条件断开即失电”的行为完全不同。

单设备启停最经典的写法是自保持回路:启动按钮Start(常开)与运行输出Run的常开触点并联,再串联停止按钮Stop(常闭)。按下Start,Run线圈得电;松开Start后,电流经Run自身触点维持,实现自锁。这种写法依赖扫描周期,逻辑直观,但停止按钮必须使用常闭触点,接线断开时设备会停止,符合故障安全原则。

另一种写法使用SET/RSET:Start上升沿触发SET(Run),Stop上升沿触发RSET(Run)。这种写法不依赖自锁触点,逻辑更清晰,尤其适合多个条件分别置位和复位的场合。需要注意的是,SET/RSET必须配合上升沿(P触点或@指令)使用,否则每个扫描周期都会重复执行,虽然结果相同,但会掩盖逻辑意图。

建议:单点启停用自保持回路即可;当同一输出需要由多个条件分别置位、多个条件分别复位时,优先使用SET/RSET,可读性更好。

二、定时器:TON、TOF与步序延时

Sysmac提供TON(通电延时)、TOF(断电延时)、TP(脉冲)等定时器。TON最常用:输入条件成立后开始计时,达到设定值PT时输出Q置ON;输入断开则计时复位。

定时器在顺控中的典型用法是“步与步之间的等待”。例如某气缸伸出后需等待0.5s再启动下一动作,可将气缸到位信号接入TON的IN,PT设为T#500ms,TON的Q作为下一步的启动条件。这里要特别注意:TON的IN条件必须保持成立,若中途断开,计时会清零重来。若需要“到位后即使信号抖动也继续计时”,应先用SET锁存到位信号,再送入TON。

定时器当前值ET可用于比较或显示,例如ET >= T#300ms时提前触发某个辅助动作,实现分段延时。

三、计数器与比较指令:次数控制与参数判断

计数器CTU在CU输入上升沿时加1,达到设定值PV时输出Q置ON,RES复位。典型应用是“循环N次后停止”或“累计产量达到设定值报警”。例如包装机每完成一次动作,接近开关产生一个脉冲送入CTU,PV设为100,Q输出触发“满箱”信号。

比较指令包括>、<、>=、<=、=、<>,可直接比较整数、实数或时间。在顺控中,比较指令常用于“步序号判断”:用一个整数变量Step表示当前步,通过Step = 10、Step = 20等条件驱动不同输出。这种方式比大量自锁回路更易维护,也便于用HMI显示当前步。

需要区分“比较指令”和“比较触点”:前者是独立指令,输出为BOOL;后者直接作为触点使用。两者功能等价,选择取决于梯形图排版习惯。

四、跳转与子程序:程序结构与执行控制

跳转指令JMP与LBL成对使用。当JMP条件成立时,程序跳转到对应LBL处继续执行,中间的程序段被跳过。跳转常用于“手动/自动模式切换”:手动模式下跳过自动步序段,避免两套逻辑同时输出。使用跳转时要注意:被跳过区段内的输出不会刷新,若其中包含需要保持的输出,应改用SET/RSET或将其移到跳转区外。

子程序通过SBS调用、SBN定义,适合将重复使用的逻辑(如气缸控制、报警处理)封装成独立块。子程序内可以使用局部变量,减少全局变量冲突。调用时需注意子程序的执行时机:它是在主程序扫描到SBS指令时被调用执行的,而不是并行执行。

五、单设备启停与三步序控制示例

下面给出一个可直接在Sysmac Studio中搭建的示例。设备为一个气缸驱动的压紧装置,动作顺序为:启动→压紧→保压0.5s→松开→完成计数。变量定义如下:

变量名类型说明
StartBOOL启动按钮(常开)
StopBOOL停止按钮(常闭,正常为ON)
ClampOutBOOL压紧电磁阀输出
ClampInBOOL松开电磁阀输出
ClampPosBOOL压紧到位传感器
StepINT步序号,0=空闲,10=压紧,20=保压,30=松开
CycleCntINT完成次数

程序结构采用步序号法:

// 步0:空闲,等待启动
IF Step = 0 AND Start AND Stop THEN
    Step := 10;
END_IF;

// 步10:压紧
IF Step = 10 THEN
    ClampOut := TRUE;
    ClampIn  := FALSE;
    IF ClampPos THEN
        Step := 20;
    END_IF;
END_IF;

// 步20:保压0.5s
IF Step = 20 THEN
    ClampOut := TRUE;
    IF TON_1.Q THEN
        Step := 30;
    END_IF;
END_IF;

// 步30:松开
IF Step = 30 THEN
    ClampOut := FALSE;
    ClampIn  := TRUE;
    IF NOT ClampPos THEN
        CycleCnt := CycleCnt + 1;
        Step := 0;
    END_IF;
END_IF;

// 停止处理:任何时刻Stop断开,立即回步0并复位输出
IF NOT Stop THEN
    Step := 0;
    ClampOut := FALSE;
    ClampIn  := FALSE;
END_IF;

// 定时器调用
TON_1(IN := (Step = 20), PT := T#500ms);

这段程序中,Step是核心状态变量,所有输出都由Step和传感器条件共同决定。停止按钮Stop为常闭,正常运行时为ON;一旦断开,无论当前处于哪一步,都立即回步0并复位输出,实现故障安全。定时器TON_1在Step=20时开始计时,0.5s后Q置ON,推动步序进入30。

实际调试时,可在Sysmac Studio的Watch窗口中监视Step、ClampPos、TON_1.ET等变量,观察步序切换是否与传感器信号同步。若发现步序卡在某一步,优先检查该步的转换条件是否满足,以及传感器信号是否因抖动而反复通断。

单设备三步序控制状态与信号关系 Step 0 空闲 / 输出全断 Step 10 压紧 / ClampOut=ON Step 20 保压 / TON计时 Step 30 松开 Start=ON ClampPos=ON TON.Q=ON 松开到位 / Stop断开 → 回Step 0,CycleCnt+1 关键信号 ClampOut 压紧阀 ClampIn 松开阀 ClampPos 到位 TON_1 PT=T#500ms 执行要点 1. Step为INT步序号,所有输出由Step与传感器条件共同决定,避免多段自锁互相干扰。 2. Stop为常闭输入,断开时立即回Step 0并复位输出,实现故障安全。 3. TON的IN条件在Step=20期间保持ON,计时不中断;ET可用于提前触发辅助动作。

从上面的状态图可以看出,步序号法的本质是把“当前处于哪一步”作为唯一状态变量,每一步只关心自己的进入条件、输出动作和退出条件。相比多个自锁回路并行,这种方式在步数增加时仍然清晰,也便于用HMI显示Step值进行故障定位。实际项目中,可将Step改为枚举或结构体,进一步提高可读性。

常见错误:在步序程序中使用普通OUT线圈驱动输出,却在跳转区外又用SET/RSET操作同一位,导致输出状态不确定。同一输出位应只由一处逻辑驱动,或明确约定置位/复位优先级。

掌握这六类指令后,单设备启停与简单步序控制即可稳定实现。下一步的关键是把步序逻辑与设备联锁条件结合,例如在压紧步中增加“安全门关闭”作为允许条件,这将在后续联锁章节中展开。