PLC编程必学手把手教你创建和调用子程序附代码案例
at 2026.03.16 09:23 ca 设备销售区 pv 1378 by 工控设备哥
PLC编程必学!手把手教你创建和调用子程序(附代码案例)
宝子们!今天要聊的可是PLC编程中的核心技能——子程序!作为工业自动化圈的新手,如果你还在为程序臃肿、调试困难而头秃,这篇干货必须收藏!✨
1.jpg)
💡 为什么必须掌握子程序?
1️⃣ **代码复用率翻倍**:同一功能模块重复使用,告别重复造轮子
2️⃣ **调试效率提升80%**:模块化设计让故障定位快人一步
3️⃣ **代码可维护性增强**:修改只需改一处,牵一发而动全身
4️⃣ **职业竞争力加成**:大厂面试必考知识点,升职加薪神器!
📌 先看一张流程图(文字版)
创建子程序 → 修改参数 → 调用子程序 → 返回主程序
🔧 创建子程序的3大黄金步骤
【步骤1:定义子程序结构】
• 西门子S7-1200语法:
```
组织块1: block 1
变量声明区:
VAR input1 DB0.0; 输入变量
VAR output2 DB0.1; 输出变量
VAR temp DB0.2; 工作寄存器
END organized_block
```
• 三菱FX系列语法:
2.jpg)
```
组织块0: sub FNC_01
输入:X0,X1
输出:Y0,Y1
常数:K100
```
【步骤2:编写核心逻辑】
重点技巧:
1. 使用局部变量替代全局变量(减少信号干扰)
2. 添加延时函数避免竞争冒险
3. 优先使用位操作指令(如MOMR)
4. 关键位置插入调试断点(调试神器!)
【步骤3:编译验证】
• 西门子:双击打开子程序 → 右键"编译" → 检查语法错误
• 三菱:在工程管理器中右键编译 → 查看错误代码
🎯 调用子程序的5种高阶用法
【基础调用】
• 无参调用:
```
组织块0:
L DB0.0 ; 调用子程序1
JMP FNC_01
```
• 有参调用(西门子):
```
组织块0:
L DB0.0
L DB0.1
JMP block1
```
【进阶技巧】
1. **条件调用**:X0=1时自动触发
```
IF X0=1
JMP block1
ENDIF
```
2. **嵌套调用**:子程序中再调用子程序(嵌套深度≤5层)
3. **定时调用**:使用T定时器触发
4. **计数器触发**:C0>10时调用
5. **事件触发**:HMI信号改变时触发
⚠️ 常见踩坑指南(血泪经验)
【错误1:变量未声明】
```
错误代码:L X0
JMP block1 ; X0未声明会导致编译错误
```
正确写法:
VAR input X0; 需要显式声明
【错误2:返回值冲突】
```
错误案例:主程序返回值M0和子程序返回值重复
```
解决方案:使用临时寄存器或全局变量区
【错误3:参数类型不符】
```
错误代码:L DB0.0 ; 带符号数传给无符号参数
应改为:A DB0.0
```
🛠 案例实战:电机启停子程序
【需求】实现电机启停控制(含互锁)
```
组织块0:
VAR IN1 DB0.0; 启动按钮
VAR IN2 DB0.1; 停止按钮
VAR M0 DB0.2; 电机状态位
VAR M1 DB0.3; 过载报警
```
【子程序代码】block1
VAR local M2 DB0.4; 局部变量
L DB0.0
A DB0.1 ; 启动互锁
JNB L1
L DB0.5 ; 闭合接触器
JMP L2
L DB0.6 ; 检测过载
JNB L3
M2:=1 ; 报警标志
L2:
JMP 组织块0
L3:
M2:=0
【调用方法】
组织块0:
L DB0.0
A DB0.1
JNB L1
L DB0.5
JMP block1
L DB0.6
JNB L2
M2:=1
L2:
JMP 组织块0
💡 调试技巧:
1. 在子程序入口插入OB35(诊断中断)
2. 使用西门子S7-PLCSIM V5.5模拟调试
3. 三菱GX Developer添加断点监控
📚 延伸学习资源:
1. 《PLC高级编程技巧(第3版)》第7章
2. 西门子官方视频《子程序应用实例》
🔥 文末彩蛋:
关注并私信"子程序案例包",免费领取:
✅ 西门子/三菱/欧姆龙全系列子程序模板
✅ 50+工业场景调用代码
✅ 子程序调试checklist
PLC编程 工业自动化 电气工程师 智能制造 工业控制 技术干货 编程技巧 电气知识