Практическое руководство по написанию программы управления электровантом с помощью ПЛК (реализация на двух языках: лестничные диаграммы S7-1200 и SCL)
📌 电动葫芦PLC控制程序编写(S7-1200实战) 本文以西门子S7-1200(CPU 1212C DC/DC/DC)为核心控制器,使用TIA Portal V17开发环境,采用LAD(梯形图)+ SCL(结构化文本)混合编程,实现电动葫芦的上升/下降/左右行逻辑控制、超载保护、限位保护、急停联锁、遥控/手柄切换、故障自诊断等功能。完整程序包含4个FC块、1个DB块、1个OB1主循环,可直接导入实际项目使用。
传统电动葫芦的控制方式长期以来以”凸轮控制器+继电器+接触器”为主导,电气原理图由数十个中间继电器和时间继电器组成,故障排查困难、且无法接入工厂信息化系统。随着工业4.0的推进,越来越多的工厂要求将起重设备接入MES/SCADA系统,实现设备状态监控、运行数据采集、故障预警等功能。以PLC取代继电器逻辑是必然趋势。本文基于克鲁德重工实际交付的某汽车零部件工厂(68台电动葫芦集中控制)项目经验,完整呈现电动葫芦PLC控制程序的编写过程,包括IO分配表、梯形图逻辑、SCL故障处理代码、HMI监控画面规划和程序下载调试全流程。
一、硬件配置与IO分配
1.1 硬件选型
| Оборудование | Модель | 数量 | Примечание |
|---|---|---|---|
| PLC CPU | S7-1200 1212C DC/DC/DC | 1 | 6ES7 212-1AE40-0XB0,8DI/6DO |
| 数字量扩展模块 | SM 1223 DI 8×24VDC / DO 8×24VDC | 1 | 6ES7 223-1BH32-0XB0 |
| 模拟量扩展模块 | SM 1231 AI 4×13bit | 1 | 6ES7 231-4HD32-0XB0,4~20mA |
| HMI 触摸屏 | KTP400 Basic PN | 1 | 6AV6 647-0AD11-3AX0,4.3寸 |
| 中间继电器 | RIM 24VDC 2CO | 6 | PLC DO→接触器线圈隔离 |
| 开关电源 | EDR-120-24 | 1 | AC220V→DC24V 5A |
1.2 IO分配表
| 地址 | 符号 | Функции | Тип | Примечание |
|---|---|---|---|---|
| %I0.0 | SB1_UP | 上升按钮 | DI | 手柄上升,常开 |
| %I0.1 | SB2_DN | 下降按钮 | DI | 手柄下降,常开 |
| %I0.2 | SB3_LT | 左行按钮 | DI | 手柄左行,常开 |
| %I0.3 | SB4_RT | 右行按钮 | DI | 手柄右行,常开 |
| %I0.4 | SQ1_UL | 上限位 | DI | 行程开关,常闭 |
| %I0.5 | SQ2_DL | 下限位 | DI | 行程开关,常闭 |
| %I0.6 | SB0_EST | 急停按钮 | DI | 常闭触点,0=触发 |
| %I0.7 | FR_OL | 热继电器 | DI | 热继电器,常闭 |
| %I1.0 | OL1_OVLD | 超载信号 | DI | 超载限制器输出,常开 |
| %I1.1 | RC_SEL | 遥控/手柄切换 | DI | 0=手柄 1=遥控 |
| — | 模拟量输入:超载传感器(4~20mA→0~20t) | |||
| 地址 | 符号 | Функции | Тип | Примечание |
|---|---|---|---|---|
| %Q0.0 | KM1_UP | 上升接触器 | DO | 控制上升主回路接触器 |
| %Q0.1 | KM2_DN | 下降接触器 | DO | 控制下降主回路接触器 |
| %Q0.2 | KM3_LT | 左行接触器 | DO | 控制左行主回路接触器 |
| %Q0.3 | KM4_RT | 右行接触器 | DO | 控制右行主回路接触器 |
| %Q0.4 | KA1_ALM | 故障报警 | DO | 驱动声光报警器 |
| %Q0.5 | KA2_RUN | 运行指示灯 | DO | 绿色运行指示灯 |
二、LAD梯形图程序设计
2.1 主程序 OB1 架构
OB1为主循环组织块,扫描周期默认10ms。按执行顺序调用以下FC块:
| 调用顺序 | FC块 | Функции | 编程语言 |
|---|---|---|---|
| 1 | FC100_Safety | 安全联锁(急停/限位/热继/超载) | LAD |
| 2 | FC200_HoistCtrl | 起升控制逻辑(上升/下降/互锁) | LAD |
| 3 | FC300_TravelCtrl | 运行控制逻辑(左行/右行/互锁) | LAD |
| 4 | FC400_FaultDiag | 故障诊断与报警(SCL) | SCL |
2.2 安全联锁 FC100(LAD梯形图)
// FC100: 安全联锁逻辑
// 所有安全条件串联——任一条件不满足则禁止运行
"SB0_EST" "SQ1_UL" "SQ2_DL" "FR_OL" "SafetyOK"
----|/|-------------|/|-------------|/|-------------|/|------------------------( )
// 超载连锁:超载时仅允许下降
"OL1_OVLD" "SB2_DN"
----| |------------| |-----------------------------------------------------------( "Overload_DN_Only" )
// 超载信号复位(手动确认)
"Overload_DN_Only" "SB1_UP" "Overload_Latch"
----| |-------------------| |----------------------------------------------------( )
2.3 起升控制 FC200(LAD梯形图)
// FC200: 起升控制逻辑
// 上升:SafetyOK + 上限位未触发 + 非超载 + 下降未运行 + 上升按钮
// 下降:SafetyOK + 下限位未触发 + 上升未运行 + 下降按钮(超载时只允许下降)
"SafetyOK" "SQ1_UL" "Overload_Latch" "KM2_DN" "SB1_UP" "KM1_UP"
----| |-------------| |-------------|/|----------------|/|-----------| |----------( )
| |
"KM1_UP" |
----| |----------------------------------------------------------------------------+
"SafetyOK" "SQ2_DL" "KM1_UP" "SB2_DN" "KM2_DN"
----| |-------------| |-------------------------------|/|-----------| |----------( )
| |
"KM2_DN" |
----| |----------------------------------------------------------------------------+
// 电气互锁:KM1和KM2绝对不能同时输出
"KM1_UP" "KM2_DN" "Interlock_OK"
----| |-----------| |--------------( ) // 用于故障检测,正常时不应导通
2.4 延时保护——防止频繁启动
// 频繁启动保护:每次停止后延时500ms才允许再次启动
// 防止接触器在极短时间内频繁吸合(触头抖动/电弧)
"KM1_UP"
----|/|-----------------------------------------------------------------------------
"KM2_DN" TON_Start_Delay
----|/|----------------[TON: #Temp_StartDelay ]
PT= T#500MS
Q= "Start_Allowed"
// 加入主控制回路
"Start_Allowed" "SB1_UP" "KM1_UP" // 上升
----| |----------------| |-----------( )
三、SCL故障诊断代码
3.1 FC400_FaultDiag(SCL结构化文本)
// FC400: 故障诊断与报警
// 语言:SCL(结构化文本)
// 功能:实时监控设备状态,检测13种故障类型,输出故障代码到HMI
FUNCTION FC400_FaultDiag : Void
VAR_INPUT
I_SafetyOK : Bool; // 安全联锁状态
I_KM1_UP : Bool; // 上升接触器反馈
I_KM2_DN : Bool; // 下降接触器反馈
I_Overload_Latch : Bool; // 超载锁定
I_OL1_OVLD : Bool; // 超载传感器信号
I_RunHours : Real; // 累计运行时间(小时)
END_VAR
VAR_OUTPUT
Q_FaultCode : Int; // 故障代码输出到HMI
Q_FaultMsg : String[40]; // 故障描述
Q_Alarm_Output : Bool; // 驱动声光报警器
Q_TotalRunHours : Real; // 总运行时间
END_VAR
VAR
vFaultCount : Int; // 故障计数器
vPrev_KM1 : Bool; // 上升接触器边沿检测
vPrev_KM2 : Bool; // 下降接触器边沿检测
vOverloadTimer : Time; // 超载持续时间
END_VAR
// === 故障检测列表 ===
Q_FaultCode := 0; // 默认无故障
Q_Alarm_Output := FALSE;
vFaultCount := 0;
// 故障1:急停按下
IF I_SafetyOK = FALSE AND
"SB0_EST" = FALSE THEN
Q_FaultCode := 1;
Q_FaultMsg := '急停按钮已按下';
vFaultCount := vFaultCount + 1;
END_IF;
// 故障2:上限位触发
IF "SQ1_UL" = FALSE THEN
Q_FaultCode := 2;
Q_FaultMsg := '上限位触发(钩头距卷筒不足)';
vFaultCount := vFaultCount + 1;
END_IF;
// 故障3:下限位触发
IF "SQ2_DL" = FALSE THEN
Q_FaultCode := 3;
Q_FaultMsg := '下限位触发(卷筒钢丝绳不足3圈)';
vFaultCount := vFaultCount + 1;
END_IF;
// 故障4:热继电器过载
IF "FR_OL" = FALSE THEN
Q_FaultCode := 4;
Q_FaultMsg := '电机过载保护(热继电器动作)';
vFaultCount := vFaultCount + 1;
END_IF;
// 故障5:超载
IF I_Overload_Latch THEN
Q_FaultCode := 5;
Q_FaultMsg := '超载限制器动作(负载>110%)';
vFaultCount := vFaultCount + 1;
END_IF;
// 故障6:KM1/KM2同时吸合(接触器粘连)
IF I_KM1_UP AND I_KM2_DN THEN
Q_FaultCode := 6;
Q_FaultMsg := '严重故障:高低速接触器同时吸合';
vFaultCount := vFaultCount + 1;
END_IF;
// 故障7:接触器反馈异常(输出命令与反馈不符)
IF ("KM1_UP" = TRUE AND I_KM1_UP = FALSE) OR
("KM2_DN" = TRUE AND I_KM2_DN = FALSE) THEN
Q_FaultCode := 7;
Q_FaultMsg := '接触器响应异常(可能卡死/线圈烧毁)';
vFaultCount := vFaultCount + 1;
END_IF;
// 如果有任何故障,驱动报警输出
IF vFaultCount > 0 THEN
Q_Alarm_Output := TRUE;
END_IF;
// === 运行时累计 ===
Q_TotalRunHours := I_RunHours +
(TIME_TO_REAL(TIME_NOW() - "Start_Time")) / 3600000.0;
END_FUNCTION
四、HMI监控画面与通信配置
4.1 HMI变量表与画面规划
| HMI画面 | 显示内容 | 关联DB变量 |
|---|---|---|
| 主画面 | 设备状态/当前载荷/运行时间 | DB1.Status / DB1.Load / DB1.RunHours |
| 控制画面 | 上升/下降/左行/右行虚拟按钮 | 手自动切换时使用 |
| 故障画面 | 故障代码/描述/发生时间/复位按钮 | DB1.FaultCode / DB1.FaultMsg |
| 参数画面 | 超载设定值/运行时间清零/密码修改 | DB1.Overload_Set / DB1.Password |
4.2 PROFINET通信配置(博途组态)
// 设备组态网络参数 // 1. S7-1200 CPU 1212C // IP: 192.168.0.10 // 子网掩码: 255.255.255.0 // PROFINET设备名: plc-hoist-01 // 2. KTP400 Basic HMI // IP: 192.168.0.20 // 子网掩码: 255.255.255.0 // 设备名: hmi-hoist-01 // 3. HMI连接配置(在HMI组态中设置) // 连接类型: PROFINET (S7-1200) // HMI设备: HMI_1 [192.168.0.20] // 控制器: plc-hoist-01 [192.168.0.10] // 访问点: S7ONLINE // 子网: PN/IE_1 // 4. HMI变量连接示例(PLC tag → HMI tag) // "DB1".FaultCode → "FaultCode" (Int, 采集周期500ms) // "DB1".Load_Current → "CurrentLoad"(Real, 采集周期200ms) // "DB1".Status_Running → "IsRunning" (Bool, 采集周期100ms)
五、程序下载与调试
5.1 下载步骤
// 下载流程(TIA Portal V17) // 1. 编译全项目(Project → Build → Rebuild All) // 确保"0 errors, 0 warnings" // 2. 选择目标设备(Select target device) // 在线访问 → 检测到PLC → 分配IP 192.168.0.10 // 3. 下载硬件组态(Download HW config) // 将自动重启PLC(约15秒) // 4. 下载软件程序(Download SW) // 选择"Download all blocks" → 覆盖现有程序 // 5. 在线监控(Go online) // 点击"眼镜"图标进入在线监控模式 // 观察梯形图绿色通路是否按预期导通 // 6. 强制变量(Force table)—— 调试用 // 可以在不实际按钮操作的情况下强制改变DI状态 // 例如强制%I0.0=1模拟上升按钮按下 // 注意:调试完成后务必清除所有强制值
5.2 调试检查清单
☐ 急停按下→所有KM输出为0,Q0.4报警输出为1
☐ 急停复位+上限位未触发→按下SB1→KM1吸合→电机上升
☐ SB1释放→KM1释放→电机停止
☐ 上升过程中触发SQ1上限位→KM1立即断开
☐ KM1吸合时按下SB2→KM2不应吸合(确认互锁)
☐ 超载信号输入→上升禁止,仅下降可操作
☐ 频繁启停间隔<500ms→第2次不响应(延时保护正常)
☐ HMI故障画面显示正确的故障代码和描述
☐ PROFINET通信无断开(HMI无报警弹窗)
Часто задаваемые вопросы
问:PLC替代继电器控制,成本增加多少?
答:单台电动葫芦从继电器控制改PLC控制,硬件成本增加约1500~2500元(S7-1200 CPU约800元+扩展模块约600元+HMI约1200元+辅材约300元)。但多台集中控制时均摊成本显著降低——68台案例中,PLC控制成本每台仅增加约350元。且PLC方案减少了40%的故障排查时间、实现了远程监控和预防性维护,长期运维成本和停机损失远低于继电器方案。
问:不会SCL语言,只用梯形图能写电动葫芦程序吗?
答:完全可以。本文的FC100/FC200/FC300都用LAD编写,只有FC400故障诊断用了SCL。故障诊断也可以用LAD的状态字加比较指令实现,但SCL在字符串处理和数学运算上更简洁。对于纯工程应用场景,LAD语言的电气原理图风格更容易被电工理解,建议核心逻辑用LAD,辅助功能用SCL。
问:PLC控制方案和变频器方案怎么选?
答:PLC方案用于逻辑控制(通断型),变频器方案用于速度控制(调速型)。两者不是二选一的关系。对电动葫芦最成熟的方案是”PLC+变频器”组合:PLC负责逻辑(急停/限位/互锁/报警),变频器负责电机驱动(软启动/调速/制动)。5t以上葫芦建议增加变频器实现慢速精准对位,5t以下用途单一的葫芦PLC+接触器方案完全够用。
问:S7-1200和S7-200 SMART选哪个好?
答:S7-200 SMART成本更低(CPU约500元),适合10台以内的单机控制。S7-1200支持PROFINET实时以太网,适合多台组网和接入MES/SCADA系统。建议:单台/小批量→200 SMART(经济);多台集中监控→1200(联网);需要变频器PROFINET通信→必须1200。两个平台编程思路完全一致,程序迁移成本低。
📌 Рекомендуемые стандарты
• JB/T 10220-2014《电动葫芦 用制动器》
• JB/T 10218-2014《电动葫芦 用锥形转子电动机》
• JB/T 10219-2014《电动葫芦 用减速器》