传统梯形图编程的局限性:
程序规模增大时难以维护
重复功能需要重复编写
调试困难,查找问题耗时
团队协作不便
结构化编程的优势:
模块化设计,程序结构清晰
代码重用,提高开发效率
易于调试和维护
便于团队协作开发
标签编程
使用有意义的名称代替设备编号
提高程序可读性
功能块(FB)
封装重复使用的功能
有内部状态保持
函数(FC)
实现特定计算功能
无内部状态
什么是标签?
有意义的名称代替X、Y、M、D等编号
提高程序可读性
便于程序维护
标签类型:
全局标签:整个工程可用
局部标签:只在特定FB或程序中有效
结构体标签:多个数据的组合
步骤1:打开标签设置
在工程窗口中
右键点击"全局标签"
选择"新建数据"
步骤2:创建全局标签
标签名 数据类型 软元件 StartBtn Bit X0 StopBtn Bit X1 MotorRun Bit Y0 RunTime Word[16] D100
步骤3:在程序中使用标签
传统方式: X0 X1 Y0 |---||---|/|---( )--- 使用标签: StartBtn StopBtn MotorRun |---||---|/|---( )---
创建结构体:
结构体名:MotorData 成员: - RunCmd Bit - StopCmd Bit - RunStatus Bit - Speed Word - Current Word
使用结构体标签:
全局标签: 标签名 数据类型 软元件 Motor1 MotorData D200开始 Motor2 MotorData D210开始
功能块特点:
可以重复调用
有输入、输出、内部变量
可以保持内部状态
类似高级语言中的函数
适用场景:
电机控制
阀门控制
温度控制
通信处理
示例:电机控制功能块
步骤1:创建新FB
工程窗口右键"程序部件"
选择"新建数据"
选择"功能块(FB)"
步骤2:定义FB接口
FB名:MotorControl 输入变量: Start Bool (启动信号) Stop Bool (停止信号) Fault Bool (故障信号) SpeedSet Word (速度设定) 输出变量: Run Bool (运行输出) SpeedOut Word (实际速度) Alarm Bool (报警输出) 内部变量: RunTimer Timer (启动延时) RunFlag Bool (运行标志)
步骤3:编写FB程序
网络1:启动停止逻辑 Start Stop Fault RunFlag |---||---|/|---|/|---( )--- | | RunFlag | |---||------------------ 网络2:启动延时 RunFlag RunTimer T#5S |---||------------[TON]-------- 网络3:运行输出 RunTimer.DN Run |---||------------( )--- 网络4:报警处理 Fault Alarm |---||------------(S)--- Stop Alarm |---||------------(R)--- 网络5:速度处理 RunFlag [MOV SpeedSet SpeedOut]---
在MAIN程序中调用FB:
网络1:实例化FB FB实例名:Motor1 |---[MotorControl]--- 输入参数: Start := StartBtn Stop := StopBtn Fault := FaultSen SpeedSet := SpeedSet1 输出参数: Run => Motor1Run SpeedOut => SpeedActual1 Alarm => Motor1Alarm
函数特点:
纯功能,无内部状态
每次调用都重新执行
必须有返回值
适合计算、转换等
适用场景:
数学计算
数据转换
单位换算
逻辑运算
示例:温度转换函数
步骤1:创建函数
工程窗口右键"程序部件"
选择"新建数据"
选择"函数(FC)"
步骤2:定义函数接口
函数名:TempConvert 输入参数: RawValue Word (原始AD值) ZeroPoint Word (零点值) FullPoint Word (满度值) 输出参数: TempValue Real (温度值,实数) 返回值:Bool(转换成功与否)
步骤3:编写函数程序
网络1:参数检查 ZeroPoint >= FullPoint |---||------------[RETURN False]--- 网络2:温度转换 // 公式:温度 = (原始值 - 零点) × 100 ÷ (满度 - 零点) [SUB RawValue ZeroPoint D100]--- [SUB FullPoint ZeroPoint D101]--- [DINT_TO_REAL D100 D200]--- // 转换为实数 [DINT_TO_REAL D101 D202]--- [MUL D200 100.0 D204]--- [DIV D204 D202 TempValue]--- 网络3:返回值 [RETURN True]---
步骤4:调用函数
网络1:调用温度转换 M8000 |---||----[TempConvert]--- 输入: RawValue := ADValue ZeroPoint := D10 FullPoint := D11 输出: TempValue => Temperature 返回值存储到M100
三层结构设计:
第一层:管理层(MAIN程序)
系统初始化
功能块调用
模式管理
故障处理
第二层:控制层(FB程序)
设备控制(电机、阀门等)
过程控制
逻辑运算
第三层:功能层(FC程序)
计算功能
数据处理
通信处理
系统组成:
3台电机
2个传感器
1个操作面板
程序结构设计:
工程结构: [+] 全局标签 |- 输入标签 |- 输出标签 |- 系统变量 [+] 程序部件 |- FB_MotorControl(电机控制功能块) |- FB_Sensor(传感器处理功能块) |- FC_Alarm(报警处理函数) [+] 程序 |- MAIN(主程序) |- INIT(初始化程序) |- ALARM(报警程序) [+] 参数 |- PLC参数 |- 网络参数
系统要求:
2台水泵,一用一备
自动/手动模式
故障切换
运行时间统计
步骤1:创建全局标签
输入标签: AutoMode Bit X0 ManualMode Bit X1 StartBtn Bit X2 StopBtn Bit X3 Fault1 Bit X4 Fault2 Bit X5 输出标签: Pump1Run Bit Y0 Pump2Run Bit Y1 Alarm Bit Y2 系统变量: RunMode Word D0 RunTime1 DWord D10 RunTime2 DWord D20
步骤2:创建水泵控制FB
FB名:PumpControl 输入: Start Bool Stop Bool Fault Bool AutoStart Bool IsMainPump Bool 输出: Run Bool RunTime DWord Status Word 内部: RunTimer Timer RunCounter Counter
步骤3:创建主程序
网络1:模式选择 AutoMode [MOV 1 RunMode]--- ManualMode [MOV 2 RunMode]--- 网络2:调用水泵FB // 水泵1实例 [PumpControl]--- Start := StartBtn AND (RunMode=2) Stop := StopBtn Fault := Fault1 AutoStart := (RunMode=1) IsMainPump := True Run => Pump1Run RunTime => RunTime1 // 水泵2实例 [PumpControl]--- Start := StartBtn AND (RunMode=2) Stop := StopBtn Fault := Fault2 AutoStart := (RunMode=1) AND Fault1 IsMainPump := False Run => Pump2Run RunTime => RunTime2 网络3:报警处理 [FC_Alarm]--- Input1 := Fault1 Input2 := Fault2 AlarmTime := 5 Output => Alarm
要求:
设计一个简单的输送线控制系统:
创建完整的全局标签表
包括:输入、输出、内部变量
使用标签编写梯形图程序
实现输送线的启停和急停功能
标签表示例:
输入: ConvStart X0 ConvStop X1 ConvEStop X2 SensorIn X3 SensorOut X4 输出: MotorRun Y0 RunLamp Y1 FaultLamp Y2 内部: RunStatus M0 FaultStatus M1
要求:
创建一个通用的电机控制FB:
包含启动、停止、故障信号
包含运行状态输出
包含运行时间统计
包含报警处理
在MAIN程序中调用两次,控制两台电机
FB接口设计:
输入: Start Bool Stop Bool Fault Bool AutoMode Bool 输出: Run Bool RunTime DWord Alarm Bool 内部: RunTimer Timer TotalTime DWord
要求:
创建一个数据转换FC:
输入:原始AD值(0-4000)
输出:工程值(0.0-100.0)
支持零点和满度校准
返回转换状态(成功/失败)
添加数据有效性检查
函数原型:
函数名:AnalogConvert 输入: RawValue Word ZeroCal Word FullCal Word 输出: EngValue Real 返回值:Bool
解答:
在标签编辑器中设置对应关系
一个标签对应一个软元件
结构体标签对应多个连续软元件
标签名不能重复
示例:
标签名 软元件 注释 StartBtn X0 启动按钮 StopBtn X1 停止按钮 Motor1 Y0 电机1控制 Temp1 D100 温度1值
对比表:
| 特性 | 功能块(FB) | 函数(FC) |
|---|---|---|
| 状态保持 | 有 | 无 |
| 调用次数 | 可多次实例化 | 直接调用 |
| 内部变量 | 有 | 无 |
| 返回值 | 无,通过输出参数 | 必须有 |
| 适用场景 | 设备控制 | 计算转换 |
调试方法:
使用交叉引用查看标签使用位置
使用监控功能查看FB内部变量
使用断点调试
使用跟踪功能
技巧:
给每个FB添加调试模式
使用全局调试变量
分模块调试
结构化编程的主要优点是什么?
A) 程序更短
B) 执行更快
C) 便于维护和重用
D) 节省内存
功能块(FB)和函数(FC)的主要区别是什么?
A) FB有状态保持,FC没有
B) FB执行快,FC执行慢
C) FB只能调用一次,FC可多次调用
D) FB需要返回值,FC不需要
全局标签的作用是什么?
A) 只在FB内部有效
B) 在整个工程中有效
C) 只在当前程序中有效
D) 只在函数中有效
标签只是软元件的别名,不占用额外内存。( )
一个FB可以被多次实例化,每个实例独立工作。( )
函数(FC)可以有内部变量,并且状态会保持。( )
设计一个温控系统:
要求:
创建温度控制功能块(TempControl)
输入:实际温度、设定温度、启停信号
输出:加热控制、冷却控制、报警
功能:PID控制(简化版,温差大于5度全功率,小于5度比例控制)
创建MAIN程序,调用两个温控FB(控制两个区域)
使用标签编程,提高可读性
选择题答案:
C 2. A 3. B
判断题答案:
对 2. 对 3. 错
编程题参考设计:
TempControl FB接口:
输入: Enable Bool 使能 SetTemp Real 设定温度 ActualTemp Real 实际温度 输出: HeatOut Bool 加热输出 CoolOut Bool 冷却输出 Alarm Bool 报警 内部: ErrorTemp Real 温差 ControlMode Word 控制模式
FB程序逻辑:
网络1:温差计算 Enable [SUB ActualTemp SetTemp ErrorTemp]--- 网络2:控制逻辑 ErrorTemp > 5.0 [SET HeatOut]---(全功率加热) [RST CoolOut]--- ErrorTemp < -5.0 [SET CoolOut]---(全功率冷却) [RST HeatOut]--- ErrorTemp >= -5.0 AND ErrorTemp <= 5.0 [比例控制逻辑]--- 网络3:报警处理 ErrorTemp > 10.0 OR ErrorTemp < -10.0 [SET Alarm]---
创建一个小型项目:
设计完整的标签表(至少20个标签)
使用标签编写一个简单的自动门控制系统
包括:感应器、开门按钮、关门按钮、安全传感器
实现基本的自动门逻辑
设计一个通用的阀门控制FB:
输入:开命令、关命令、故障信号、远程/本地选择
输出:开状态、关状态、故障状态
功能:带开到位和关到位检测,带故障保护
添加运行时间统计功能
在MAIN程序中调用3次,控制3个阀门
设计一个数学计算函数集:
单位换算函数(如:摄氏度转华氏度)
数据滤波函数(移动平均滤波)
限幅函数(限制数据在最小最大值之间)
死区处理函数(消除小信号波动)
设计一个小型自动化系统:
系统包含:输送线、机械手、检测站
使用结构化编程方法
创建相应的FB和FC
使用标签编程
设计完整的程序结构
编写程序说明文档
结构化编程的概念和优势
标签编程的基本方法
功能块(FB)的创建和使用
函数(FC)的创建和使用
结构化程序设计原则
能够创建和使用标签
能够设计功能块
能够创建函数
能够组织结构化程序
能够调试结构化程序
标签命名不规范
FB和FC使用场景混淆
结构化程度不够或过度
忘记设置软元件对应关系
第九课:通信功能配置
通信基础概念
以太网通信设置
串口通信配置
与触摸屏、变频器等设备通信
从小项目开始练习结构化编程
养成良好的标签命名习惯
先设计接口,再实现功能
多做实际项目练习
学会查阅手册和资料
请认真完成本课的所有实践任务,准备好后可以开始第九课的学习。
祝您学习顺利!