一、PLC硬件架构——别被那些花花绿绿的模块吓到

刚入行那会儿,我第一次打开西门子S7-300的机架,说实话有点懵。CPU、电源、DI、DO、AI、AO……一排排模块插在导轨上,像极了乐高积木。但搞懂了之后你会发现,PLC的硬件架构其实就那几块东西。

1.1 核心部件:CPU模块

CPU是PLC的大脑。它负责执行用户程序、处理I/O数据、管理通信。不同品牌的CPU性能差异很大,但核心指标就几个:

  • 处理速度:通常用ms/千步指令来衡量,比如0.1ms/1K指令
  • 程序容量:能装多少行代码,单位是KB或MB
  • I/O点数:最多能带多少个输入输出点
  • 通信接口:以太网、RS485、Profibus等
我的经验:选型时别只看价格。我见过有人为了省钱选了小CPU,结果项目后期要加功能,程序塞不下了,只能换CPU,工期和成本都翻倍。建议留30%的余量。

1.2 电源模块

电源模块给PLC系统供电。常见的有24V DC和220V AC两种。注意,电源模块的容量要算清楚——CPU、I/O模块、传感器、执行器都要吃电。

1.3 I/O模块

I/O模块是PLC和现场设备之间的桥梁。分两大类:

  • 数字量I/O:处理开关信号,比如按钮、继电器、指示灯
  • 模拟量I/O:处理连续信号,比如温度、压力、流量

我习惯把I/O模块比作PLC的「五官」——数字量是「触觉」,只有通断;模拟量是「视觉」,能感知程度。

1.4 通信模块

现代PLC很少单打独斗。通信模块让PLC能跟HMI、变频器、其他PLC甚至MES系统对话。常见的协议有Modbus、Profinet、EtherNet/IP等。

注意:不同品牌的通信协议可能不兼容。我曾经在项目中吃过亏——买了某品牌的PLC,结果发现跟现场的变频器协议对不上,最后加了个网关才搞定。选型时一定要确认通信协议是否匹配。

二、五种编程语言——IEC 61131-3标准

IEC 61131-3是PLC编程的国际标准。它定义了五种编程语言,每种都有自己的适用场景。说白了,就像工具箱里有螺丝刀、扳手、锤子——用对了地方,效率翻倍。

核心观点:没有最好的语言,只有最合适的语言。我建议你至少掌握两种:LD和ST,其他按需学习。

2.1 梯形图(LD)

梯形图是最直观的语言。它长得像继电器电路图,左母线、右母线、常开触点、常闭触点、线圈……电气工程师一看就懂。

||---[ ]----[ ]----( )---|
|   |  X1    X2    Y1   |

这个例子很简单:X1和X2都闭合时,Y1得电。我在项目中用LD写逻辑控制,比如电机启停、报警联锁,效率很高。

2.2 功能块图(FBD)

FBD用图形化的功能块来表示逻辑。每个功能块有输入和输出,用连线连接起来。适合做信号处理、PID控制这类任务。

|  X1 ---|AND|--- Y1
|  X2 ---|   |

嗯,FBD看起来像画流程图。我一般用它做模拟量处理,比如把4-20mA信号转换成工程量。

2.3 结构化文本(ST)

ST是高级语言,语法类似Pascal或C。适合写复杂算法、数学运算、数据处理。

IF X1 AND X2 THEN
    Y1 := TRUE;
ELSE
    Y1 := FALSE;
END_IF;

我个人非常喜欢ST。为什么?因为它写起来快,逻辑清晰,而且容易调试。你想想看,一个复杂的PID算法用LD写得多痛苦,用ST几行就搞定了。

2.4 指令表(IL)

IL是汇编风格的文本语言。一条指令一行,比如LD、AND、ST。现在用得少了,但在一些老设备上还能见到。

LD X1
AND X2
ST Y1

说实话,IL我很少用。除非是维护老项目,否则不建议花太多时间学它。

2.5 顺序功能图(SFC)

SFC用来描述顺序控制流程。它把程序分成多个步(Step),每个步执行特定动作,步之间通过转移条件切换。

|  [Step1] --> [Step2] --> [Step3]
|    |           |           |
|  (条件A)     (条件B)     (条件C)

SFC特别适合写流水线控制、自动加工这类有明确步骤的程序。我做过一个包装线项目,用SFC写主流程,配合ST写动作逻辑,调试起来非常顺畅。

三、数据类型与变量——别把整数当实数用

数据类型这事儿,看着简单,但坑不少。我见过有人把INT和REAL混用,结果计算精度全丢了。

3.1 基本数据类型

类型 说明 范围
BOOL 布尔型 TRUE / FALSE
INT 16位有符号整数 -32768 ~ 32767
DINT 32位有符号整数 -2^31 ~ 2^31-1
REAL 32位浮点数 ±1.18e-38 ~ ±3.4e38
TIME 时间型 T#0ms ~ T#49d17h2m47s295ms
避坑指南:我曾经在项目中用INT存一个计数器的值,结果计数器超过了32767,直接溢出变成负数。从那以后,凡是可能超过范围的变量,我都用DINT。

3.2 变量声明

变量分全局变量和局部变量。全局变量在整个程序里都能用,局部变量只在某个POU(程序组织单元)里有效。

VAR_GLOBAL
    g_bStart : BOOL := FALSE;
    g_iCount : INT := 0;
END_VAR

VAR
    bTemp : BOOL;
    rValue : REAL;
END_VAR

我建议:能用局部变量就别用全局变量。全局变量多了,程序耦合度高,改一个地方可能影响一片。你想想看,调试的时候找bug多痛苦。

四、基本指令与功能块——从简单到复杂

基本指令是PLC编程的砖瓦。功能块则是预制好的构件,拿来就能用。

4.1 位逻辑指令

  • 常开触点:--| |--,输入为TRUE时闭合
  • 常闭触点:--|/|--,输入为FALSE时闭合
  • 线圈:--( )--,输出赋值
  • 置位/复位:--(S)-- / --(R)--,保持状态

4.2 定时器与计数器

定时器(TON、TOF、TP)和计数器(CTU、CTD)是PLC编程的常客。

// TON定时器示例
TON_1(IN := X1, PT := T#5s);
Y1 := TON_1.Q;

这个例子:X1为TRUE后,延时5秒,Y1输出TRUE。我在项目中用TON做电机启动延时,防止同时启动导致电流冲击。

4.3 数学运算与比较

ADD、SUB、MUL、DIV、GT、LT、EQ……这些指令跟数学课上学的一样。但要注意数据类型匹配。

我的习惯:做数学运算前,先把所有变量转成REAL。虽然多一步转换,但能避免很多类型不匹配的错误。

4.4 功能块(FB)与函数(FUN)

功能块有内部状态,可以保存数据。函数没有内部状态,每次调用都重新计算。

FUNCTION_BLOCK FB_MotorControl
    VAR_INPUT
        bStart : BOOL;
        bStop : BOOL;
    END_VAR
    VAR_OUTPUT
        bRun : BOOL;
    END_VAR
    VAR
        bLastStart : BOOL;
    END_VAR
END_FUNCTION_BLOCK

我经常把电机控制、阀门控制这类重复逻辑封装成功能块。这样写一次,到处调用,省时省力还少出错。

五、知识体系总览

下面这张图是我自己画的,把本章的核心内容串起来了。你看一眼,心里就有谱了。

PLC编程基础(IEC 61131-3)知识体系 PLC硬件架构 CPU模块 电源模块 I/O模块 通信模块 五种编程语言 LD 梯形图 FBD 功能块图 ST 结构化文本 IL 指令表 / SFC 顺序功能图 数据类型与变量 BOOL / INT / DINT REAL / TIME 全局变量 / 局部变量 基本指令与功能块 位逻辑指令 | 定时器/计数器 | 数学运算 | 功能块(FB) / 函数(FUN) IEC 61131-3标准是PLC编程的通用语言 掌握硬件架构 + 至少两种编程语言 + 数据类型 + 基本指令 = 入门

这张图把PLC编程基础分成了四大块:硬件架构、五种编程语言、数据类型与变量、基本指令与功能块。你顺着这个框架学,不会跑偏。

总结一下:PLC编程没那么玄乎。硬件架构搞清楚CPU、电源、I/O、通信这四样;编程语言至少掌握LD和ST;数据类型别搞混;基本指令多练练。剩下的,就是项目里慢慢积累了。

公众号:蓝海资料掘金营,微信deep3321