4、PLC基础编程:位逻辑指令、定时器与计数器、数据块(DB)的创建与使用

4.1 位逻辑指令——PLC的“开关”世界

说实话,PLC编程里最基础也最常用的,就是位逻辑指令。你想想看,工业现场那么多传感器、按钮、继电器,归根结底不就是“通”和“断”两种状态吗?位逻辑指令就是处理这些开关信号的。

我个人习惯把位逻辑指令分成三类:

  • 触点指令:常开触点(--| |--)和常闭触点(--|/|--)。常开就是“按下才通”,常闭就是“不按就通”。
  • 线圈指令:输出线圈(--( )--)和取反线圈(--(/)--)。线圈得电,输出就为1。
  • 中间指令:置位(S)、复位(R)、取反(NOT)。这些指令能让你的逻辑更灵活。

我在项目中遇到过一个问题:一个电机启动按钮,按下去电机转了,但手一松就停了。后来发现是没用自锁电路。其实很简单,把启动按钮的常开触点和电机运行输出线圈的常开触点并联起来,就实现了“自锁”。

核心逻辑:位逻辑指令的本质就是布尔代数。与、或、非、异或,这些你高中就学过的东西,在PLC里就是常开串联、常开并联、常闭取反。

我的小技巧:写梯形图时,尽量把常开触点放在左边,线圈放在右边。这样读起来顺,也符合电流从左到右的习惯。

4.2 定时器——让PLC学会“等待”

定时器这东西,说白了就是个“延时开关”。你告诉它“等5秒再动作”,它就老老实实等5秒。

西门子S7-1200/1500里常用的定时器有四种:

定时器类型 功能描述 典型应用场景
TON(接通延时) 输入为1后,延时一段时间输出才变1 电机启动后延时5秒打开冷却阀
TOF(断开延时) 输入从1变0后,延时一段时间输出才变0 传送带停止后延时3秒关闭润滑泵
TP(脉冲定时) 输入为1时,输出产生一个固定宽度的脉冲 按钮按下后产生2秒的报警信号
TONR(累计接通延时) 多次接通的时间累加,达到设定值才动作 记录设备累计运行时间

嗯,这里要注意:定时器的精度取决于PLC的循环扫描周期。一般S7-1200的定时精度在1ms左右,够用了。但如果你需要微秒级的延时,那得用硬件定时器或者中断。

避坑指南:我曾经在一个项目中,用TON定时器做电机启动延时,结果发现定时器一直不动作。查了半天,原来是定时器的使能端(IN)接的是个脉冲信号,还没等定时器开始计时,信号就没了。记住:TON的IN端必须保持为1,定时器才会持续计时。

4.3 计数器——数数这件事,PLC比人靠谱

计数器,顾名思义就是用来计数的。工业现场里,数产品数量、数脉冲个数、数转数,都靠它。

常用的计数器类型:

  • CTU(加计数器):每来一个脉冲,计数值加1。达到设定值(PV)后,输出变1。
  • CTD(减计数器):每来一个脉冲,计数值减1。减到0时,输出变1。
  • CTUD(加减计数器):既能加也能减,适合做位置控制。

我举个例子:一个包装线上,每通过一个产品,传感器就发一个脉冲。用CTU计数器,设定PV=100,当第100个产品通过时,计数器输出为1,触发“装箱完成”信号。

关键点:计数器复位(R)和加载(LD)是两个重要功能。复位是把当前值清零,加载是把设定值PV写入当前值。别搞混了。

4.4 数据块(DB)——PLC的“记事本”

数据块(Data Block,简称DB),说白了就是PLC里的一块存储区域。你可以把它想象成一个Excel表格,里面可以存各种类型的数据:整数、浮点数、布尔量、字符串,甚至结构体。

创建DB的步骤很简单:

  1. 在TIA Portal的项目树里,找到“程序块” -> “添加新块”
  2. 选择“数据块(DB)”,给它起个名字,比如“MotorData”
  3. 在DB里定义变量:变量名、数据类型、初始值

举个例子,一个电机控制的数据块:

// 电机控制数据块 MotorData
// 变量名        数据类型      初始值      注释
StartButton     Bool          FALSE       启动按钮
StopButton      Bool          FALSE       停止按钮
MotorRun        Bool          FALSE       电机运行状态
SpeedSet        Real          50.0        速度设定值 (Hz)
SpeedActual     Real          0.0         速度实际值 (Hz)
RunTime         Time          T#0s        累计运行时间
FaultCode       Int           0           故障代码

我个人习惯把DB分成两类:

  • 全局DB:所有程序块都能访问,适合存共享数据,比如生产配方、系统参数。
  • 背景DB:跟某个功能块(FB)绑定,只在该FB内部使用,适合存局部变量。

我的经验:刚开始做项目时,我喜欢把所有变量都塞到一个大DB里。后来发现维护起来太痛苦了。现在我习惯按功能模块拆分DB,比如“MotorDB”、“ValveDB”、“AlarmDB”。这样找变量快,也方便别人接手。

4.5 知识体系总览

下面这张图,是我自己总结的本章知识体系。你看一眼,心里就有谱了。

PLC基础编程知识体系 位逻辑指令 定时器 计数器 数据块(DB) • 常开/常闭触点 • 线圈/置位/复位 • 自锁/互锁电路 • 上升沿/下降沿 • TON 接通延时 • TOF 断开延时 • TP 脉冲定时 • TONR 累计延时 • CTU 加计数器 • CTD 减计数器 • CTUD 加减计数器 • 复位/加载功能 • 全局DB • 背景DB • 变量定义与类型 • 结构化数据设计 核心:位逻辑是基础,定时/计数是工具,数据块是容器

你看,这四个模块其实是环环相扣的。位逻辑指令是基础,定时器和计数器是功能扩展,数据块则是把这些数据组织起来的容器。你想想看,没有数据块,你那些定时器的设定值、计数器的当前值往哪存?

再啰嗦一句:数据块里的变量,访问时要带路径。比如“MotorData.SpeedSet”,别直接写“SpeedSet”。不然PLC会报错,说找不到这个变量。我刚开始学的时候,这个坑踩了不下三次。

好了,这一章的内容就到这。位逻辑、定时器、计数器、数据块,这四个东西你搞明白了,PLC编程的基础就算打牢了。后面再学什么模拟量处理、通信、PID,都是在这个基础上往上搭。

专注资料整理