3. PLC基础回顾:PLC扫描周期、数字量与模拟量、常用编程语言
好,咱们开始第三讲。这一章我打算带大家快速回顾一下PLC的几个核心基础概念。你别觉得基础就不重要,说实话,我在现场调试时,很多奇奇怪怪的故障,追根溯源都是这些基础没吃透。咱们把地基打牢,后面做协议桥接时才不会翻车。
3.1 PLC扫描周期——PLC的“心跳”
PLC是怎么工作的?它不是像咱们写电脑程序那样,从上到下跑一遍就完事了。它是一遍又一遍地循环执行。这个循环,就叫扫描周期。
一个完整的扫描周期,大致分三步:
- 读输入:把现场所有输入信号(比如按钮、传感器)的状态,一股脑儿读到内存里。
- 执行程序:根据你写的逻辑,进行运算。注意,它只认刚才读进来的那组“快照”。
- 写输出:把运算结果,统一刷新到输出模块(比如继电器、变频器控制端子)。
核心要点: 整个扫描周期内,输入信号的状态是“冻结”的。程序执行期间,哪怕外部信号变了,PLC也视而不见,得等到下一个周期才会更新。
我在一个项目里就吃过这个亏。当时用PLC控制一个高速气缸,程序里判断一个传感器信号后立即输出。结果气缸动作总是慢半拍。后来一查,是传感器信号刚好在程序执行到一半时变化了,PLC没抓到。解决办法?要么把传感器接到中断输入口,要么在程序里做两次采样确认。嗯,这里要注意,扫描周期越长,你对信号的响应就越迟钝。
扫描周期有多长?小型的可能就几毫秒,大型的、程序复杂的,可能几十毫秒。你想想看,如果你要跟变频器做高速数据交换,比如实时读写转矩指令,那PLC的扫描周期就成了瓶颈。这也是为什么很多高速控制场景,得用专用运动控制器或者走EtherCAT这类实时总线。
3.2 数字量与模拟量——PLC的“语言”
PLC的世界里,就两种信号:数字量和模拟量。说白了,就是“开关”和“连续值”的区别。
3.2.1 数字量(DI/DO)
数字量最简单,就是0和1。按钮按下是1,松开是0;继电器吸合是1,断开是0。它用来控制变频器的启停、正反转,或者读取变频器的故障报警信号。
我个人习惯,在接线时,数字量输入一定要用漏型(PNP)还是源型(NPN)搞清楚。很多新手在这里栽跟头。我曾经在一个项目里,把NPN的传感器接到了PNP的输入模块上,结果信号死活读不到。排查了半天,最后发现是传感器类型和模块不匹配。所以,做桥接项目前,先确认好PLC和变频器的数字量接口类型。
3.2.2 模拟量(AI/AO)
模拟量就复杂一点。它代表一个连续变化的物理量,比如0-10V电压、4-20mA电流。变频器的频率给定,最传统的方式就是通过模拟量。你给0V,它就停转;给5V,它半速;给10V,它全速。
这里有个坑,我必须要讲。模拟量信号特别容易受干扰。尤其是变频器这种强干扰源,它的动力线缆如果和模拟量信号线走同一个线槽,那你的频率给定值就会乱跳。
避坑指南: 我曾经在一个造纸厂调试,变频器一启动,PLC读到的模拟量反馈值就上下波动。最后发现是信号线屏蔽层没单端接地,而且跟动力线绑在一起走了20米。后来换了屏蔽双绞线,单独走管,并在PLC侧单端接地,问题才解决。记住,模拟量信号线必须用屏蔽线,且屏蔽层只能一端接地。
模拟量的精度,通常用位数表示,比如12位、16位。12位的分辨率是4096(2的12次方),16位是65536。你想想看,如果你用12位的模块去读一个4-20mA的变频器反馈,那精度肯定不如16位的好。但在大多数工业场合,12位已经够用了。
3.3 常用编程语言——梯形图与结构化文本
PLC编程,主流就两种:梯形图(LD)和结构化文本(ST)。我个人觉得,它们就像螺丝刀和扳手,各有各的用处。
3.3.1 梯形图(Ladder Diagram, LD)
梯形图是电气工程师的最爱。它长得跟继电器电路图一模一样,左母线、右母线、常开触点、常闭触点、线圈。逻辑关系一目了然。
比如,控制变频器启动,梯形图就这么写:
| 启动按钮 | 停止按钮 | 变频器运行 |
|----[ ]----|----[/]----|----( )----|
你看,启动按钮按下(闭合),停止按钮没按下(闭合),线圈就得电。简单直观。做简单的逻辑控制、启停联锁,梯形图无敌。
但是,梯形图有个致命弱点:处理复杂数学运算、数组、循环时,它就像用算盘算微积分,累死人。我见过有人用梯形图写PID算法,那梯形图画得跟蜘蛛网一样,维护起来简直是噩梦。
3.3.2 结构化文本(Structured Text, ST)
结构化文本,说白了就是高级语言。它跟Pascal、C语言很像。如果你要写复杂的算法、数据处理、或者跟变频器做协议桥接(比如通过RS485读写Modbus寄存器),那ST语言是首选。
举个例子,用ST语言读取变频器的当前频率:
// 读取变频器地址1的当前频率(地址为1000)
IF Modbus_Read_Request( SlaveAddr := 1,
FunctionCode := 3,
StartAddr := 1000,
Quantity := 1,
DataPtr := ADR(变频器频率) ) THEN
// 读取成功,变频器频率变量已更新
Current_Frequency := 变频器频率 / 10.0; // 假设精度为0.1Hz
ELSE
// 读取失败,置报警
Comm_Error := TRUE;
END_IF
你看,逻辑清晰,变量名一看就懂。而且可以写注释。这在梯形图里很难做到。
我的建议: 做协议桥接项目,我强烈建议你用ST语言。因为你要处理大量的数据帧解析、校验、超时判断。梯形图做这些事,效率太低。你可以把梯形图当作“外壳”,用来做启停、急停、模式切换这些安全逻辑;而把ST语言当作“内核”,用来做通信和数据处理。两者结合,才是王道。
好了,这一章的基础回顾就到这儿。扫描周期决定了你的响应速度,数字量和模拟量是你跟变频器打交道的“手”,而梯形图和ST语言是你手里的工具。把这些搞明白了,后面咱们讲具体的协议桥接,你才能听得懂、用得上。