引言:PLC编程在工业自动化中的核心地位

可编程逻辑控制器(Programmable Logic Controller,简称PLC)是现代工业自动化的大脑和神经中枢。从简单的机械控制到复杂的生产线协调,PLC无处不在。掌握PLC编程技能不仅能让你深入理解工业自动化的核心原理,还能显著提升你在职场中的竞争力。本文将带你从零基础开始,逐步深入到高级应用,通过详细的理论讲解和实用的代码示例,帮助你解决实际生产问题。

为什么学习PLC编程?

  • 行业需求旺盛:制造业、能源、交通等领域对PLC技术人才的需求持续增长。
  • 薪资待遇优厚:具备PLC编程能力的工程师通常能获得更高的薪酬。
  • 职业发展空间广阔:从设备维护到系统设计,PLC技能为你打开多条职业路径。
  • 解决实际问题:直接参与生产优化,提升效率,降低成本。

第一部分:PLC基础入门(适合零基础学习者)

1.1 PLC硬件组成与工作原理

PLC本质上是一种专为工业环境设计的计算机,其核心组件包括:

  • 中央处理单元(CPU):执行程序、处理数据
  • 输入模块(Input):接收传感器、按钮等信号
  • 输出模块(Output):控制电机、阀门等执行器
  • 电源模块:为整个系统供电
  • 编程设备:电脑或手持编程器

工作原理:PLC采用循环扫描工作方式:

  1. 读取所有输入状态
  2. 执行用户程序
  3. 更新所有输出状态
  4. 返回步骤1(通常每秒扫描数次)

1.2 PLC编程语言基础(IEC 61131-3标准)

国际电工委员会(IEC)定义了5种PLC编程语言:

  1. 梯形图(Ladder Diagram, LD) - 最常用,类似电气原理图
  2. 功能块图(Function Block Diagram, FBD) - 类似数字电路图
  3. 结构化文本(Structured Text, ST) - 类似Pascal高级语言
  4. 指令表(Instruction List, IL) - 类似汇编语言(已弃用)
  5. 顺序功能图(Sequential Function Chart, SFC) - 用于状态机设计

1.3 第一个PLC程序:电机启停控制

让我们用最常见的梯形图语言编写一个电机启停控制程序。

控制要求

  • 按下启动按钮(I0.0),电机(Q0.0)运行
  • 按下停止按钮(I0.1),电机停止
  • 电机运行后,可通过自身触点保持运行(自锁)

梯形图程序

    Network 1: 电机启动与自锁
    I0.0       Q0.0
----| |---------( )----
    |   I0.1    |
    |----|/|----|     |
    |   Q0.0    |     |
    |----| |----|     |
    |             |
    -----------------

程序说明

  • I0.0:启动按钮(常开触点)
  • I0.1:停止按钮(常闭触点)
  • Q0.0:电机输出线圈
  • 自锁回路:当Q0.0得电后,其常开触点闭合,维持电流路径

接线示意图

+24VDC ---[启动按钮]--- I0.0
+24VDC ---[停止按钮]--- I0.1
Q0.0 -------------------> 电机接触器线圈

1.4 PLC编程软件使用指南

以西门子TIA Portal(博途)为例:

  1. 创建项目:File > New Project
  2. 添加设备:选择你的PLC型号(如CPU 1214C)
  3. 创建程序块:Main[OB1]中添加Network
  4. 编写程序:拖拽指令或输入STL代码
  5. 编译下载:连接PLC后下载程序
  6. 在线监控:监控变量状态,调试程序

第二部分:PLC编程进阶技巧

2.1 定时器与计数器的应用

定时器(Timer)

PLC提供多种定时器类型:

  • 接通延时(TON):输入接通后延时动作
  • 断开延时(TOF):输入断开后延时动作
  • 保持型接通延时(TP):脉冲定时器

TON定时器示例(西门子S7-1200):

// Structured Text (ST) 示例
VAR
    TON_1: TON; // 声明TON定时器实例
    Start: BOOL;
    TimerOutput: BOOL;
END_VAR

TON_1(IN := Start, PT := T#5S); // 5秒延时
TimerOutput := TON_1.Q;

梯形图实现

    Network: TON定时器应用
    I0.0       TON_1(IN)
----| |--------[TON]----
              PT: T#5S
              Q: M0.0
              ET: MD0

计数器(Counter)

  • 加计数器(CTU)
  • 减计数器(CTD)
  • 加减计数器(CTUD)

CTU计数器示例

VAR
    CTU_1: CTU;
    CountUp: BOOL;
    Reset: BOOL;
    CounterValue: INT;
END_VAR

CTU_1(CU := CountUp, R := Reset, PV := 100);
CounterValue := CTU_1.CV;

2.2 数据处理与数学运算

PLC不仅能处理开关量,还能进行复杂的数据运算:

示例:计算产品平均温度

VAR
    TempArray: ARRAY[1..10] OF REAL; // 10个温度值
    Sum: REAL;
    Average: REAL;
    i: INT;
END_VAR

// 计算总和
Sum := 0;
FOR i := 1 TO 10 DO
    Sum := Sum + TempArray[i];
END_FOR;

// 计算平均值
Average := Sum / 10.0;

2.3 模拟量处理

工业现场常有4-20mA或0-10V的模拟信号,需要转换为工程单位。

模拟量转换公式

工程值 = (原始值 - 原始值下限) * (工程值上限 - 工程值下限) / (原始值上限 - 原始值下限) + 工程值下限

示例:将0-27648的原始值转换为0-100°C的温度值

VAR
    RawValue: INT; // PLC读取的原始值(0-27648)
    Temperature: REAL;
END_VAR

Temperature := (RawValue / 27648.0) * 100.0;

2.4 子程序与函数块

将重复代码封装为函数块(Function Block)是提高编程效率的关键。

创建电机控制函数块

FUNCTION_BLOCK FB_MotorControl
VAR_INPUT
    Start: BOOL;
    Stop: BOOL;
    FaultReset: BOOL;
END_VAR

VAR_OUTPUT
    MotorRun: BOOL;
    Fault: BOOL;
END_VAR

VAR
    Timer: TON;
    MotorLatch: BOOL;
END_VAR

// 电机启停逻辑
IF Start AND NOT Stop AND NOT Fault THEN
    MotorLatch := TRUE;
END_IF;

IF Stop OR Fault THEN
    MotorLatch := FALSE;
END_IF;

// 故障检测(运行超过10秒无反馈)
IF MotorRun THEN
    Timer(IN := TRUE, PT := T#10S);
    IF Timer.Q THEN
        Fault := TRUE;
    END_IF;
ELSE
    Timer(IN := FALSE);
END_IF;

MotorRun := MotorLatch;

调用函数块

VAR
    Motor1: FB_MotorControl;
    Start1, Stop1, Reset1: BOOL;
    Run1, Fault1: BOOL;
END_VAR

Motor1(Start := Start1, Stop := Stop1, FaultReset := Reset1);
Run1 := Motor1.MotorRun;
Fault1 := Motor1.Fault;

第三部分:高级应用与系统集成

3.1 顺序功能图(SFC)编程

SFC非常适合描述顺序控制过程,如灌装线、包装机等。

示例:自动灌装机流程

初始步(Initial Step)
    |
    v
[等待启动] --(启动按钮)--> [传送带运行]
    |
    v
[检测瓶子] --(有瓶)--> [打开阀门]
    |
    v
[灌装计时] --(时间到)--> [关闭阀门]
    |
    v
[完成指示] --(确认)--> [返回初始]

SFC实现(西门子S7-SCL):

CASE Step OF
    0: // 初始步
        Conveyor := FALSE;
        Valve := FALSE;
        IF StartButton THEN
            Step := 1;
        END_IF;
        
    1: // 传送带运行
        Conveyor := TRUE;
        IF BottleSensor THEN
            Step := 2;
        END_IF;
        
    2: // 打开阀门
        Valve := TRUE;
        FillTimer(IN := TRUE, PT := T#3S);
        IF FillTimer.Q THEN
            Step := 3;
        END_IF;
        
    3: // 关闭阀门
        Valve := FALSE;
        IF ConfirmButton THEN
            Step := 0;
        END_IF;
END_CASE;

3.2 PLC与HMI(人机界面)通信

HMI用于显示数据、设置参数和手动操作。

HMI变量映射

  • HMI变量SetSpeed(设定速度)
  • PLC变量DB1.DBW0(数据块中的字)
  • 通信协议:OPC UA、Modbus TCP、Profinet等

示例:HMI设定速度值,PLC读取并控制电机

// PLC程序
VAR
    HMI_SetSpeed: INT; // HMI写入的设定值(0-100)
    ActualSpeed: INT;  // 实际速度反馈
    MotorOutput: REAL; // 0-100%输出
END_VAR

// 限制设定值范围
IF HMI_SetSpeed > 100 THEN
    HMI_SetSpeed := 100;
ELSIF HMI_SetSpeed < 0 THEN
    HMI_SetSpeed := 0;
END_IF;

// 模拟电机响应
MotorOutput := HMI_SetSpeed;
ActualSpeed := MotorOutput; // 实际中应读取编码器反馈

3.3 Modbus TCP通信实例

PLC常需与第三方设备(如变频器、仪表)通信,Modbus是常用协议。

西门子PLC作为Modbus TCP客户端

VAR
    MB_CLIENT: MB_CLIENT; // Modbus客户端功能块
    CONNECT: BOOL;
    MB_ADDR: INT := 1; // 从站地址
    MODE: INT := 0; // 0=读取
    DATA_ADDR: INT := 40001; // 寄存器地址
    DATA_LEN: INT := 10; // 读取长度
    DATA_PTR: DWORD; // 数据指针
    DONE: BOOL;
    ERROR: BOOL;
END_VAR

// 执行Modbus读取
IF CONNECT THEN
    MB_CLIENT(
        REQ := CONNECT,
        MB_ADDR := MB_ADDR,
        MODE := MODE,
        DATA_ADDR := DATA_ADDR,
        DATA_LEN := DATA_LEN,
        DATA_PTR := ADR(DATA_PTR),
        DONE => DONE,
        ERROR => ERROR
    );
END_IF;

3.4 数据记录与报警管理

报警处理函数块

FUNCTION_BLOCK FB_Alarm
VAR_INPUT
    Trigger: BOOL;
    AlarmText: STRING[50];
    Acknowledge: BOOL;
END_VAR

VAR_OUTPUT
    Active: BOOL;
    Acked: BOOL;
END_VAR

VAR
    LastTrigger: BOOL;
    AlarmLatch: BOOL;
END_VAR

// 检测上升沿
IF Trigger AND NOT LastTrigger THEN
    AlarmLatch := TRUE;
    Acked := FALSE;
END_IF;

LastTrigger := Trigger;

// 确认逻辑
IF Acknowledge AND AlarmLatch THEN
    AlarmLatch := FALSE;
    Acked := TRUE;
END_IF;

Active := AlarmLatch;

第四部分:实际生产问题解决方案

4.1 案例:多台电机顺序启动控制

问题描述:3台电机需要按M1→M2→M3顺序启动,间隔2秒,停止时同时停止。

解决方案

VAR
    StartButton: BOOL;
    StopButton: BOOL;
    Motor1, Motor2, Motor3: BOOL;
    Timer1, Timer2: TON;
    SequenceStep: INT := 0;
END_VAR

// 启动逻辑
IF StartButton THEN
    SequenceStep := 1;
END_IF;

// 停止逻辑
IF StopButton THEN
    SequenceStep := 0;
    Motor1 := FALSE;
    Motor2 := FALSE;
    Motor3 := FALSE;
    Timer1(IN := FALSE);
    Timer2(IN := FALSE);
END_IF;

// 顺序控制
CASE SequenceStep OF
    0: // 停止状态
        // 无操作
        
    1: // 启动M1
        Motor1 := TRUE;
        Timer1(IN := TRUE, PT := T#2S);
        IF Timer1.Q THEN
            SequenceStep := 2;
        END_IF;
        
    2: // 启动M2
        Motor2 := TRUE;
        Timer2(IN := TRUE, PT := T#2S);
        IF Timer2.Q THEN
            SequenceStep := 3;
        END_IF;
        
    3: // 启动M3
        Motor3 := TRUE;
END_CASE;

4.2 案例:PID温度控制系统

问题描述:控制加热器使温度稳定在设定值,避免超调。

解决方案(使用西门子PID_Compact):

VAR
    PID_Inst: PID_Compact;
    ActualTemp: REAL; // 来自模拟量输入
    SetTemp: REAL := 100.0; // 设定温度
    HeaterOutput: REAL; // 0-100%输出
END_VAR

// 配置PID参数(首次运行需调试)
PID_Inst.Gain := 2.0; // 比例增益
PID_Inst.Ti := T#20S; // 积分时间
PID_Inst.Td := T#5S;  // 微分时间

// 执行PID计算
PID_Inst(
    Setpoint := SetTemp,
    Input := ActualTemp,
    Output => HeaterOutput
);

// 输出到模拟量模块
// HeaterOutput需要转换为0-27648的原始值

4.3 案例:生产线产量统计与OEE计算

OEE(设备综合效率) = 时间开动率 × 性能开动率 × 合格品率

VAR
    // 输入信号
    MachineRunning: BOOL; // 设备运行信号
    ProductOK: BOOL;      // 合格品信号
    ProductNG: BOOL;      // 不合格品信号
    
    // 计时器
    RunTimer: TON;
    StopTimer: TON;
    
    // 统计变量
    TotalProducts: INT;
    OKProducts: INT;
    NGProducts: INT;
    
    // OEE计算
    Availability: REAL; // 时间开动率
    Performance: REAL;  // 性能开动率
    Quality: REAL;      // 合格品率
    OEE: REAL;
    
    // 理论节拍(秒/件)
    IdealCycleTime: REAL := 5.0;
    ActualCycleTime: REAL;
END_VAR

// 运行时间统计
RunTimer(IN := MachineRunning, PT := T#8H);
StopTimer(IN := NOT MachineRunning, PT := T#8H);

// 产品计数
IF ProductOK THEN
    OKProducts := OKProducts + 1;
    TotalProducts := TotalProducts + 1;
END_IF;

IF ProductNG THEN
    NGProducts := NGProducts + 1;
    TotalProducts := TotalProducts + 1;
END_IF;

// OEE计算(每小时更新)
IF RunTimer.Q THEN
    // 时间开动率 = 运行时间 / (运行时间 + 停机时间)
    Availability := RunTimer.ET / (RunTimer.ET + StopTimer.ET);
    
    // 性能开动率 = 理论节拍 × 总产量 / 运行时间
    Performance := (IdealCycleTime * TotalProducts) / RunTimer.ET;
    
    // 合格品率
    IF TotalProducts > 0 THEN
        Quality := REAL(OKProducts) / REAL(TotalProducts);
    END_IF;
    
    // OEE
    OEE := Availability * Performance * Quality;
END_IF;

第五部分:高级主题与最佳实践

5.1 冗余系统与安全PLC

对于关键应用(如核电站、化工),需要冗余系统和安全PLC(如西门子S7-1500F)。

安全程序特点

  • 使用安全指令(如F-IO、F-Timer)
  • 程序独立于标准程序
  • 需通过安全认证
  • 双通道处理

5.2 OPC UA服务器集成

现代PLC(如S7-1500)内置OPC UA服务器,便于与MES/ERP系统集成。

配置步骤

  1. 在PLC硬件配置中启用OPC UA
  2. 创建OPC UA变量表
  3. 设置访问权限
  4. 使用OPC UA客户端(如UaExpert)测试连接

5.3 版本控制与程序管理

使用Git管理PLC程序版本:

# 初始化Git仓库
git init plc-project

# 添加西门子项目文件(排除临时文件)
echo "*.tmp" > .gitignore
echo "*.log" >> .gitignore
git add .

# 提交初始版本
git commit -m "Initial version: Motor control V1.0"

# 创建新分支开发功能
git checkout -b feature-pid-control

# 合并到主分支
git checkout main
git merge feature-pid-control

5.4 安全编程规范

  1. 急停电路必须硬接线,不能仅依赖PLC程序
  2. 所有模拟量输入应设置滤波,防止干扰
  3. 关键输出应有互锁,防止误操作
  4. 程序中应有看门狗定时器,检测程序异常
  5. 定期备份程序,使用版本控制

第六部分:学习路径与职业发展

6.1 推荐学习路径

  1. 第1-2周:掌握PLC基础理论、梯形图编程
  2. 第3-4周:学习定时器、计数器、数据处理
  3. 第5-6周:掌握函数块、结构化编程
  4. 第7-8周:学习HMI设计、通信协议
  5. 第9-10周:深入PID控制、SFC编程
  6. 第11-12周:项目实战,解决实际问题

6.2 推荐硬件平台

  • 入门:西门子S7-1200、三菱FX3U、欧姆龙CP1H
  • 进阶:西门子S7-1500、三菱Q系列、罗克韦尔ControlLogix
  • 仿真:西门子PLCSIM、Factory I/O(3D仿真)

6.3 职业认证

  • 西门子:S7-1200/1500认证
  • 罗克韦尔:Rockwell Automation认证
  • 三菱:MELSEC认证
  • 国际:IEC 61131-3编程认证

6.4 薪资参考(2024年)

  • 初级PLC工程师:8K-15K/月
  • 中级PLC工程师:15K-25K/月
  • 高级PLC工程师:25K-40K/月
  • 系统集成专家:40K+/月

结语:从入门到精通的持续学习

PLC编程是理论与实践紧密结合的技能。掌握基础后,最重要的是:

  1. 动手实践:购买小型PLC套件进行实验
  2. 项目经验:参与实际项目,积累经验
  3. 持续学习:关注新技术(如AI、边缘计算)
  4. 交流分享:加入技术社区,解决实际问题

通过本文的系统学习,你将具备解决工业自动化实际问题的能力,显著提升职场竞争力。记住,最好的学习方式是动手实践,从简单的电机控制开始,逐步挑战更复杂的系统。祝你学习顺利!


附录:常用资源

  • 西门子TIA Portal试用版:www.siemens.com/tia-portal
  • Factory I/O仿真软件:www.factoryio.com
  • PLC编程论坛:PLCtalk.net、工控论坛
  • 标准文档:IEC 61131-3可编程控制器标准# PLC编程课程从入门到精通掌握工业自动化核心技能解决实际生产问题提升职场竞争力

引言:PLC编程在工业自动化中的核心地位

可编程逻辑控制器(Programmable Logic Controller,简称PLC)是现代工业自动化的大脑和神经中枢。从简单的机械控制到复杂的生产线协调,PLC无处不在。掌握PLC编程技能不仅能让你深入理解工业自动化的核心原理,还能显著提升你在职场中的竞争力。本文将带你从零基础开始,逐步深入到高级应用,通过详细的理论讲解和实用的代码示例,帮助你解决实际生产问题。

为什么学习PLC编程?

  • 行业需求旺盛:制造业、能源、交通等领域对PLC技术人才的需求持续增长。
  • 薪资待遇优厚:具备PLC编程能力的工程师通常能获得更高的薪酬。
  • 职业发展空间广阔:从设备维护到系统设计,PLC技能为你打开多条职业路径。
  • 解决实际问题:直接参与生产优化,提升效率,降低成本。

第一部分:PLC基础入门(适合零基础学习者)

1.1 PLC硬件组成与工作原理

PLC本质上是一种专为工业环境设计的计算机,其核心组件包括:

  • 中央处理单元(CPU):执行程序、处理数据
  • 输入模块(Input):接收传感器、按钮等信号
  • 输出模块(Output):控制电机、阀门等执行器
  • 电源模块:为整个系统供电
  • 编程设备:电脑或手持编程器

工作原理:PLC采用循环扫描工作方式:

  1. 读取所有输入状态
  2. 执行用户程序
  3. 更新所有输出状态
  4. 返回步骤1(通常每秒扫描数次)

1.2 PLC编程语言基础(IEC 61131-3标准)

国际电工委员会(IEC)定义了5种PLC编程语言:

  1. 梯形图(Ladder Diagram, LD) - 最常用,类似电气原理图
  2. 功能块图(Function Block Diagram, FBD) - 类似数字电路图
  3. 结构化文本(Structured Text, ST) - 类似Pascal高级语言
  4. 指令表(Instruction List, IL) - 类似汇编语言(已弃用)
  5. 顺序功能图(Sequential Function Chart, SFC) - 用于状态机设计

1.3 第一个PLC程序:电机启停控制

让我们用最常见的梯形图语言编写一个电机启停控制程序。

控制要求

  • 按下启动按钮(I0.0),电机(Q0.0)运行
  • 按下停止按钮(I0.1),电机停止
  • 电机运行后,可通过自身触点保持运行(自锁)

梯形图程序

    Network 1: 电机启动与自锁
    I0.0       Q0.0
----| |---------( )----
    |   I0.1    |
    |----|/|----|     |
    |   Q0.0    |     |
    |----| |----|     |
    |             |
    -----------------

程序说明

  • I0.0:启动按钮(常开触点)
  • I0.1:停止按钮(常闭触点)
  • Q0.0:电机输出线圈
  • 自锁回路:当Q0.0得电后,其常开触点闭合,维持电流路径

接线示意图

+24VDC ---[启动按钮]--- I0.0
+24VDC ---[停止按钮]--- I0.1
Q0.0 -------------------> 电机接触器线圈

1.4 PLC编程软件使用指南

以西门子TIA Portal(博途)为例:

  1. 创建项目:File > New Project
  2. 添加设备:选择你的PLC型号(如CPU 1214C)
  3. 创建程序块:Main[OB1]中添加Network
  4. 编写程序:拖拽指令或输入STL代码
  5. 编译下载:连接PLC后下载程序
  6. 在线监控:监控变量状态,调试程序

第二部分:PLC编程进阶技巧

2.1 定时器与计数器的应用

定时器(Timer)

PLC提供多种定时器类型:

  • 接通延时(TON):输入接通后延时动作
  • 断开延时(TOF):输入断开后延时动作
  • 保持型接通延时(TP):脉冲定时器

TON定时器示例(西门子S7-1200):

// Structured Text (ST) 示例
VAR
    TON_1: TON; // 声明TON定时器实例
    Start: BOOL;
    TimerOutput: BOOL;
END_VAR

TON_1(IN := Start, PT := T#5S); // 5秒延时
TimerOutput := TON_1.Q;

梯形图实现

    Network: TON定时器应用
    I0.0       TON_1(IN)
----| |--------[TON]----
              PT: T#5S
              Q: M0.0
              ET: MD0

计数器(Counter)

  • 加计数器(CTU)
  • 减计数器(CTD)
  • 加减计数器(CTUD)

CTU计数器示例

VAR
    CTU_1: CTU;
    CountUp: BOOL;
    Reset: BOOL;
    CounterValue: INT;
END_VAR

CTU_1(CU := CountUp, R := Reset, PV := 100);
CounterValue := CTU_1.CV;

2.2 数据处理与数学运算

PLC不仅能处理开关量,还能进行复杂的数据运算:

示例:计算产品平均温度

VAR
    TempArray: ARRAY[1..10] OF REAL; // 10个温度值
    Sum: REAL;
    Average: REAL;
    i: INT;
END_VAR

// 计算总和
Sum := 0;
FOR i := 1 TO 10 DO
    Sum := Sum + TempArray[i];
END_FOR;

// 计算平均值
Average := Sum / 10.0;

2.3 模拟量处理

工业现场常有4-20mA或0-10V的模拟信号,需要转换为工程单位。

模拟量转换公式

工程值 = (原始值 - 原始值下限) * (工程值上限 - 工程值下限) / (原始值上限 - 原始值下限) + 工程值下限

示例:将0-27648的原始值转换为0-100°C的温度值

VAR
    RawValue: INT; // PLC读取的原始值(0-27648)
    Temperature: REAL;
END_VAR

Temperature := (RawValue / 27648.0) * 100.0;

2.4 子程序与函数块

将重复代码封装为函数块(Function Block)是提高编程效率的关键。

创建电机控制函数块

FUNCTION_BLOCK FB_MotorControl
VAR_INPUT
    Start: BOOL;
    Stop: BOOL;
    FaultReset: BOOL;
END_VAR

VAR_OUTPUT
    MotorRun: BOOL;
    Fault: BOOL;
END_VAR

VAR
    Timer: TON;
    MotorLatch: BOOL;
END_VAR

// 电机启停逻辑
IF Start AND NOT Stop AND NOT Fault THEN
    MotorLatch := TRUE;
END_IF;

IF Stop OR Fault THEN
    MotorLatch := FALSE;
END_IF;

// 故障检测(运行超过10秒无反馈)
IF MotorRun THEN
    Timer(IN := TRUE, PT := T#10S);
    IF Timer.Q THEN
        Fault := TRUE;
    END_IF;
ELSE
    Timer(IN := FALSE);
END_IF;

MotorRun := MotorLatch;

调用函数块

VAR
    Motor1: FB_MotorControl;
    Start1, Stop1, Reset1: BOOL;
    Run1, Fault1: BOOL;
END_VAR

Motor1(Start := Start1, Stop := Stop1, FaultReset := Reset1);
Run1 := Motor1.MotorRun;
Fault1 := Motor1.Fault;

第三部分:高级应用与系统集成

3.1 顺序功能图(SFC)编程

SFC非常适合描述顺序控制过程,如灌装线、包装机等。

示例:自动灌装机流程

初始步(Initial Step)
    |
    v
[等待启动] --(启动按钮)--> [传送带运行]
    |
    v
[检测瓶子] --(有瓶)--> [打开阀门]
    |
    v
[灌装计时] --(时间到)--> [关闭阀门]
    |
    v
[完成指示] --(确认)--> [返回初始]

SFC实现(西门子S7-SCL):

CASE Step OF
    0: // 初始步
        Conveyor := FALSE;
        Valve := FALSE;
        IF StartButton THEN
            Step := 1;
        END_IF;
        
    1: // 传送带运行
        Conveyor := TRUE;
        IF BottleSensor THEN
            Step := 2;
        END_IF;
        
    2: // 打开阀门
        Valve := TRUE;
        FillTimer(IN := TRUE, PT := T#3S);
        IF FillTimer.Q THEN
            Step := 3;
        END_IF;
        
    3: // 关闭阀门
        Valve := FALSE;
        IF ConfirmButton THEN
            Step := 0;
        END_IF;
END_CASE;

3.2 PLC与HMI(人机界面)通信

HMI用于显示数据、设置参数和手动操作。

HMI变量映射

  • HMI变量SetSpeed(设定速度)
  • PLC变量DB1.DBW0(数据块中的字)
  • 通信协议:OPC UA、Modbus TCP、Profinet等

示例:HMI设定速度值,PLC读取并控制电机

// PLC程序
VAR
    HMI_SetSpeed: INT; // HMI写入的设定值(0-100)
    ActualSpeed: INT;  // 实际速度反馈
    MotorOutput: REAL; // 0-100%输出
END_VAR

// 限制设定值范围
IF HMI_SetSpeed > 100 THEN
    HMI_SetSpeed := 100;
ELSIF HMI_SetSpeed < 0 THEN
    HMI_SetSpeed := 0;
END_IF;

// 模拟电机响应
MotorOutput := HMI_SetSpeed;
ActualSpeed := MotorOutput; // 实际中应读取编码器反馈

3.3 Modbus TCP通信实例

PLC常需与第三方设备(如变频器、仪表)通信,Modbus是常用协议。

西门子PLC作为Modbus TCP客户端

VAR
    MB_CLIENT: MB_CLIENT; // Modbus客户端功能块
    CONNECT: BOOL;
    MB_ADDR: INT := 1; // 从站地址
    MODE: INT := 0; // 0=读取
    DATA_ADDR: INT := 40001; // 寄存器地址
    DATA_LEN: INT := 10; // 读取长度
    DATA_PTR: DWORD; // 数据指针
    DONE: BOOL;
    ERROR: BOOL;
END_VAR

// 执行Modbus读取
IF CONNECT THEN
    MB_CLIENT(
        REQ := CONNECT,
        MB_ADDR := MB_ADDR,
        MODE := MODE,
        DATA_ADDR := DATA_ADDR,
        DATA_LEN := DATA_LEN,
        DATA_PTR := ADR(DATA_PTR),
        DONE => DONE,
        ERROR => ERROR
    );
END_IF;

3.4 数据记录与报警管理

报警处理函数块

FUNCTION_BLOCK FB_Alarm
VAR_INPUT
    Trigger: BOOL;
    AlarmText: STRING[50];
    Acknowledge: BOOL;
END_VAR

VAR_OUTPUT
    Active: BOOL;
    Acked: BOOL;
END_VAR

VAR
    LastTrigger: BOOL;
    AlarmLatch: BOOL;
END_VAR

// 检测上升沿
IF Trigger AND NOT LastTrigger THEN
    AlarmLatch := TRUE;
    Acked := FALSE;
END_IF;

LastTrigger := Trigger;

// 确认逻辑
IF Acknowledge AND AlarmLatch THEN
    AlarmLatch := FALSE;
    Acked := TRUE;
END_IF;

Active := AlarmLatch;

第四部分:实际生产问题解决方案

4.1 案例:多台电机顺序启动控制

问题描述:3台电机需要按M1→M2→M3顺序启动,间隔2秒,停止时同时停止。

解决方案

VAR
    StartButton: BOOL;
    StopButton: BOOL;
    Motor1, Motor2, Motor3: BOOL;
    Timer1, Timer2: TON;
    SequenceStep: INT := 0;
END_VAR

// 启动逻辑
IF StartButton THEN
    SequenceStep := 1;
END_IF;

// 停止逻辑
IF StopButton THEN
    SequenceStep := 0;
    Motor1 := FALSE;
    Motor2 := FALSE;
    Motor3 := FALSE;
    Timer1(IN := FALSE);
    Timer2(IN := FALSE);
END_IF;

// 顺序控制
CASE SequenceStep OF
    0: // 停止状态
        // 无操作
        
    1: // 启动M1
        Motor1 := TRUE;
        Timer1(IN := TRUE, PT := T#2S);
        IF Timer1.Q THEN
            SequenceStep := 2;
        END_IF;
        
    2: // 启动M2
        Motor2 := TRUE;
        Timer2(IN := TRUE, PT := T#2S);
        IF Timer2.Q THEN
            SequenceStep := 3;
        END_IF;
        
    3: // 启动M3
        Motor3 := TRUE;
END_CASE;

4.2 案例:PID温度控制系统

问题描述:控制加热器使温度稳定在设定值,避免超调。

解决方案(使用西门子PID_Compact):

VAR
    PID_Inst: PID_Compact;
    ActualTemp: REAL; // 来自模拟量输入
    SetTemp: REAL := 100.0; // 设定温度
    HeaterOutput: REAL; // 0-100%输出
END_VAR

// 配置PID参数(首次运行需调试)
PID_Inst.Gain := 2.0; // 比例增益
PID_Inst.Ti := T#20S; // 积分时间
PID_Inst.Td := T#5S;  // 微分时间

// 执行PID计算
PID_Inst(
    Setpoint := SetTemp,
    Input := ActualTemp,
    Output => HeaterOutput
);

// 输出到模拟量模块
// HeaterOutput需要转换为0-27648的原始值

4.3 案例:生产线产量统计与OEE计算

OEE(设备综合效率) = 时间开动率 × 性能开动率 × 合格品率

VAR
    // 输入信号
    MachineRunning: BOOL; // 设备运行信号
    ProductOK: BOOL;      // 合格品信号
    ProductNG: BOOL;      // 不合格品信号
    
    // 计时器
    RunTimer: TON;
    StopTimer: TON;
    
    // 统计变量
    TotalProducts: INT;
    OKProducts: INT;
    NGProducts: INT;
    
    // OEE计算
    Availability: REAL; // 时间开动率
    Performance: REAL;  // 性能开动率
    Quality: REAL;      // 合格品率
    OEE: REAL;
    
    // 理论节拍(秒/件)
    IdealCycleTime: REAL := 5.0;
    ActualCycleTime: REAL;
END_VAR

// 运行时间统计
RunTimer(IN := MachineRunning, PT := T#8H);
StopTimer(IN := NOT MachineRunning, PT := T#8H);

// 产品计数
IF ProductOK THEN
    OKProducts := OKProducts + 1;
    TotalProducts := TotalProducts + 1;
END_IF;

IF ProductNG THEN
    NGProducts := NGProducts + 1;
    TotalProducts := TotalProducts + 1;
END_IF;

// OEE计算(每小时更新)
IF RunTimer.Q THEN
    // 时间开动率 = 运行时间 / (运行时间 + 停机时间)
    Availability := RunTimer.ET / (RunTimer.ET + StopTimer.ET);
    
    // 性能开动率 = 理论节拍 × 总产量 / 运行时间
    Performance := (IdealCycleTime * TotalProducts) / RunTimer.ET;
    
    // 合格品率
    IF TotalProducts > 0 THEN
        Quality := REAL(OKProducts) / REAL(TotalProducts);
    END_IF;
    
    // OEE
    OEE := Availability * Performance * Quality;
END_IF;

第五部分:高级主题与最佳实践

5.1 冗余系统与安全PLC

对于关键应用(如核电站、化工),需要冗余系统和安全PLC(如西门子S7-1500F)。

安全程序特点

  • 使用安全指令(如F-IO、F-Timer)
  • 程序独立于标准程序
  • 需通过安全认证
  • 双通道处理

5.2 OPC UA服务器集成

现代PLC(如S7-1500)内置OPC UA服务器,便于与MES/ERP系统集成。

配置步骤

  1. 在PLC硬件配置中启用OPC UA
  2. 创建OPC UA变量表
  3. 设置访问权限
  4. 使用OPC UA客户端(如UaExpert)测试连接

5.3 版本控制与程序管理

使用Git管理PLC程序版本:

# 初始化Git仓库
git init plc-project

# 添加西门子项目文件(排除临时文件)
echo "*.tmp" > .gitignore
echo "*.log" >> .gitignore
git add .

# 提交初始版本
git commit -m "Initial version: Motor control V1.0"

# 创建新分支开发功能
git checkout -b feature-pid-control

# 合并到主分支
git checkout main
git merge feature-pid-control

5.4 安全编程规范

  1. 急停电路必须硬接线,不能仅依赖PLC程序
  2. 所有模拟量输入应设置滤波,防止干扰
  3. 关键输出应有互锁,防止误操作
  4. 程序中应有看门狗定时器,检测程序异常
  5. 定期备份程序,使用版本控制

第六部分:学习路径与职业发展

6.1 推荐学习路径

  1. 第1-2周:掌握PLC基础理论、梯形图编程
  2. 第3-4周:学习定时器、计数器、数据处理
  3. 第5-6周:掌握函数块、结构化编程
  4. 第7-8周:学习HMI设计、通信协议
  5. 第9-10周:深入PID控制、SFC编程
  6. 第11-12周:项目实战,解决实际问题

6.2 推荐硬件平台

  • 入门:西门子S7-1200、三菱FX3U、欧姆龙CP1H
  • 进阶:西门子S7-1500、三菱Q系列、罗克韦尔ControlLogix
  • 仿真:西门子PLCSIM、Factory I/O(3D仿真)

6.3 职业认证

  • 西门子:S7-1200/1500认证
  • 罗克韦尔:Rockwell Automation认证
  • 三菱:MELSEC认证
  • 国际:IEC 61131-3编程认证

6.4 薪资参考(2024年)

  • 初级PLC工程师:8K-15K/月
  • 中级PLC工程师:15K-25K/月
  • 高级PLC工程师:25K-40K/月
  • 系统集成专家:40K+/月

结语:从入门到精通的持续学习

PLC编程是理论与实践紧密结合的技能。掌握基础后,最重要的是:

  1. 动手实践:购买小型PLC套件进行实验
  2. 项目经验:参与实际项目,积累经验
  3. 持续学习:关注新技术(如AI、边缘计算)
  4. 交流分享:加入技术社区,解决实际问题

通过本文的系统学习,你将具备解决工业自动化实际问题的能力,显著提升职场竞争力。记住,最好的学习方式是动手实践,从简单的电机控制开始,逐步挑战更复杂的系统。祝你学习顺利!


附录:常用资源

  • 西门子TIA Portal试用版:www.siemens.com/tia-portal
  • Factory I/O仿真软件:www.factoryio.com
  • PLC编程论坛:PLCtalk.net、工控论坛
  • 标准文档:IEC 61131-3可编程控制器标准