返回
三菱FX5U PLC系统教程 第八课:结构化编程入门


第一部分:结构化编程概述

1.1 为什么需要结构化编程

传统梯形图编程的局限性:

结构化编程的优势:

1.2 结构化编程的三种方法

  1. 标签编程

    • 使用有意义的名称代替设备编号

    • 提高程序可读性

  2. 功能块(FB)

    • 封装重复使用的功能

    • 有内部状态保持

  3. 函数(FC)

    • 实现特定计算功能

    • 无内部状态

第二部分:标签编程基础

2.1 标签概念

什么是标签?

标签类型:

  1. 全局标签:整个工程可用

  2. 局部标签:只在特定FB或程序中有效

  3. 结构体标签:多个数据的组合

2.2 创建和管理标签

步骤1:打开标签设置

  1. 在工程窗口中

  2. 右键点击"全局标签"

  3. 选择"新建数据"

步骤2:创建全局标签

text
标签名        数据类型        软元件  StartBtn      Bit            X0  StopBtn       Bit            X1  MotorRun      Bit            Y0  RunTime       Word[16]       D100

步骤3:在程序中使用标签

text
传统方式:   X0    X1    Y0              |---||---|/|---( )---    使用标签:   StartBtn   StopBtn   MotorRun              |---||---|/|---( )---

2.3 结构体标签

创建结构体:

text
结构体名:MotorData  成员:    - RunCmd     Bit    - StopCmd    Bit    - RunStatus  Bit    - Speed      Word    - Current    Word

使用结构体标签:

text
全局标签:  标签名        数据类型        软元件  Motor1        MotorData      D200开始  Motor2        MotorData      D210开始

第三部分:功能块(FB)编程

3.1 功能块基本概念

功能块特点:

适用场景:

3.2 创建第一个功能块

示例:电机控制功能块

步骤1:创建新FB

  1. 工程窗口右键"程序部件"

  2. 选择"新建数据"

  3. 选择"功能块(FB)"

步骤2:定义FB接口

text
FB名:MotorControl    输入变量:    Start     Bool    (启动信号)    Stop      Bool    (停止信号)    Fault     Bool    (故障信号)    SpeedSet  Word    (速度设定)    输出变量:    Run       Bool    (运行输出)    SpeedOut  Word    (实际速度)    Alarm     Bool    (报警输出)    内部变量:    RunTimer  Timer   (启动延时)    RunFlag   Bool    (运行标志)

步骤3:编写FB程序

text
网络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]---

3.3 调用功能块

在MAIN程序中调用FB:

text
网络1:实例化FB         FB实例名:Motor1         |---[MotorControl]---         输入参数:         Start := StartBtn         Stop := StopBtn         Fault := FaultSen         SpeedSet := SpeedSet1           输出参数:         Run => Motor1Run         SpeedOut => SpeedActual1         Alarm => Motor1Alarm

第四部分:函数(FC)编程

4.1 函数基本概念

函数特点:

适用场景:

4.2 创建和使用函数

示例:温度转换函数

步骤1:创建函数

  1. 工程窗口右键"程序部件"

  2. 选择"新建数据"

  3. 选择"函数(FC)"

步骤2:定义函数接口

text
函数名:TempConvert    输入参数:    RawValue   Word    (原始AD值)    ZeroPoint  Word    (零点值)    FullPoint  Word    (满度值)    输出参数:    TempValue  Real    (温度值,实数)    返回值:Bool(转换成功与否)

步骤3:编写函数程序

text
网络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:调用函数

text
网络1:调用温度转换     M8000  |---||----[TempConvert]---         输入:         RawValue := ADValue         ZeroPoint := D10         FullPoint := D11           输出:         TempValue => Temperature           返回值存储到M100

第五部分:结构化程序设计

5.1 程序组织原则

三层结构设计:

第一层:管理层(MAIN程序)

第二层:控制层(FB程序)

第三层:功能层(FC程序)

5.2 项目实例:输送线控制系统

系统组成:

  1. 3台电机

  2. 2个传感器

  3. 1个操作面板

程序结构设计:

text
工程结构:  [+] 全局标签      |- 输入标签      |- 输出标签      |- 系统变量        [+] 程序部件      |- FB_MotorControl(电机控制功能块)      |- FB_Sensor(传感器处理功能块)      |- FC_Alarm(报警处理函数)        [+] 程序      |- MAIN(主程序)      |- INIT(初始化程序)      |- ALARM(报警程序)        [+] 参数      |- PLC参数      |- 网络参数

第六部分:综合实例分析

6.1 完整示例:水泵控制系统

系统要求:

  1. 2台水泵,一用一备

  2. 自动/手动模式

  3. 故障切换

  4. 运行时间统计

步骤1:创建全局标签

text
输入标签:    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

text
FB名:PumpControl    输入:    Start       Bool    Stop        Bool    Fault       Bool    AutoStart   Bool    IsMainPump  Bool    输出:    Run         Bool    RunTime     DWord    Status      Word    内部:    RunTimer    Timer    RunCounter  Counter

步骤3:创建主程序

text
网络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

第七部分:实践任务

任务1:创建标签化的控制系统

要求:
设计一个简单的输送线控制系统:

  1. 创建完整的全局标签表

  2. 包括:输入、输出、内部变量

  3. 使用标签编写梯形图程序

  4. 实现输送线的启停和急停功能

标签表示例:

text
输入:    ConvStart    X0    ConvStop     X1    ConvEStop    X2    SensorIn     X3    SensorOut    X4      输出:    MotorRun     Y0    RunLamp      Y1    FaultLamp    Y2      内部:    RunStatus    M0    FaultStatus  M1

任务2:创建电机控制功能块

要求:
创建一个通用的电机控制FB:

  1. 包含启动、停止、故障信号

  2. 包含运行状态输出

  3. 包含运行时间统计

  4. 包含报警处理

  5. 在MAIN程序中调用两次,控制两台电机

FB接口设计:

text
输入:    Start        Bool    Stop         Bool    Fault        Bool    AutoMode     Bool      输出:    Run          Bool    RunTime      DWord    Alarm        Bool      内部:    RunTimer     Timer    TotalTime    DWord

任务3:创建数据处理函数

要求:
创建一个数据转换FC:

  1. 输入:原始AD值(0-4000)

  2. 输出:工程值(0.0-100.0)

  3. 支持零点和满度校准

  4. 返回转换状态(成功/失败)

  5. 添加数据有效性检查

函数原型:

text
函数名:AnalogConvert    输入:    RawValue     Word    ZeroCal      Word    FullCal      Word      输出:    EngValue     Real      返回值:Bool

第八部分:常见问题解答

问题1:标签和软元件如何对应?

解答:

示例:

text
标签名    软元件    注释  StartBtn  X0       启动按钮  StopBtn   X1       停止按钮  Motor1    Y0       电机1控制  Temp1     D100     温度1值

问题2:FB和FC的区别是什么?

对比表:

特性 功能块(FB) 函数(FC)
状态保持
调用次数 可多次实例化 直接调用
内部变量
返回值 无,通过输出参数 必须有
适用场景 设备控制 计算转换

问题3:如何调试结构化程序?

调试方法:

  1. 使用交叉引用查看标签使用位置

  2. 使用监控功能查看FB内部变量

  3. 使用断点调试

  4. 使用跟踪功能

技巧:

第九部分:学习检测

选择题(每题10分)

  1. 结构化编程的主要优点是什么?
    A) 程序更短
    B) 执行更快
    C) 便于维护和重用
    D) 节省内存

  2. 功能块(FB)和函数(FC)的主要区别是什么?
    A) FB有状态保持,FC没有
    B) FB执行快,FC执行慢
    C) FB只能调用一次,FC可多次调用
    D) FB需要返回值,FC不需要

  3. 全局标签的作用是什么?
    A) 只在FB内部有效
    B) 在整个工程中有效
    C) 只在当前程序中有效
    D) 只在函数中有效

判断题(每题10分)

  1. 标签只是软元件的别名,不占用额外内存。( )

  2. 一个FB可以被多次实例化,每个实例独立工作。( )

  3. 函数(FC)可以有内部变量,并且状态会保持。( )

编程题(40分)

设计一个温控系统:

要求:

  1. 创建温度控制功能块(TempControl)

  2. 输入:实际温度、设定温度、启停信号

  3. 输出:加热控制、冷却控制、报警

  4. 功能:PID控制(简化版,温差大于5度全功率,小于5度比例控制)

  5. 创建MAIN程序,调用两个温控FB(控制两个区域)

  6. 使用标签编程,提高可读性

答案部分

选择题答案:

  1. C 2. A 3. B

判断题答案:

  1. 对 2. 对 3. 错

编程题参考设计:

TempControl FB接口:

text
输入:    Enable       Bool    使能    SetTemp      Real    设定温度    ActualTemp   Real    实际温度      输出:    HeatOut      Bool    加热输出    CoolOut      Bool    冷却输出    Alarm        Bool    报警      内部:    ErrorTemp    Real    温差    ControlMode  Word    控制模式

FB程序逻辑:

text
网络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]---

第十部分:课后作业

作业1:标签编程练习

创建一个小型项目:

  1. 设计完整的标签表(至少20个标签)

  2. 使用标签编写一个简单的自动门控制系统

  3. 包括:感应器、开门按钮、关门按钮、安全传感器

  4. 实现基本的自动门逻辑

作业2:功能块设计练习

设计一个通用的阀门控制FB:

  1. 输入:开命令、关命令、故障信号、远程/本地选择

  2. 输出:开状态、关状态、故障状态

  3. 功能:带开到位和关到位检测,带故障保护

  4. 添加运行时间统计功能

  5. 在MAIN程序中调用3次,控制3个阀门

作业3:函数设计练习

设计一个数学计算函数集:

  1. 单位换算函数(如:摄氏度转华氏度)

  2. 数据滤波函数(移动平均滤波)

  3. 限幅函数(限制数据在最小最大值之间)

  4. 死区处理函数(消除小信号波动)

作业4:综合项目设计

设计一个小型自动化系统:

  1. 系统包含:输送线、机械手、检测站

  2. 使用结构化编程方法

  3. 创建相应的FB和FC

  4. 使用标签编程

  5. 设计完整的程序结构

  6. 编写程序说明文档

学习总结

本课重点回顾:

  1. 结构化编程的概念和优势

  2. 标签编程的基本方法

  3. 功能块(FB)的创建和使用

  4. 函数(FC)的创建和使用

  5. 结构化程序设计原则

关键技能掌握:

  1. 能够创建和使用标签

  2. 能够设计功能块

  3. 能够创建函数

  4. 能够组织结构化程序

  5. 能够调试结构化程序

常见错误避免:

  1. 标签命名不规范

  2. FB和FC使用场景混淆

  3. 结构化程度不够或过度

  4. 忘记设置软元件对应关系

下节课预告

第九课:通信功能配置

学习建议

  1. 从小项目开始练习结构化编程

  2. 养成良好的标签命名习惯

  3. 先设计接口,再实现功能

  4. 多做实际项目练习

  5. 学会查阅手册和资料

请认真完成本课的所有实践任务,准备好后可以开始第九课的学习。

祝您学习顺利!

下载资料前请先绑定手机号码