北岛夜话
原创工业智能控制领域(PLC、单片机、嵌入式、机器人、通信)的技术及经验分享。
文章301 浏览1930577

深度理解PLC的工作原理(How PLC works)

工控的小伙伴应该都知道PLC是以循环扫描的方式进行工作的。但是如果要细问几个问题,估计并不是所有的人都能答上来。比如:循环扫描都有哪些步骤?循环扫描的过程中,数字量和模拟量都要进入缓存区吗?PLC的程序结构是怎样的呢?今天这篇文章,我们就来深入讨论下PLC的工作原理并回答这几个问题。

cover.png在讨论PLC的工作原理之前,我们先来看看PLC的程序结构。

PLC的CPU中有两类程序:一类是操作系统,它由PLC的厂家设计并在出厂前固化到CPU中;另一类是用户程序,它是由编程人员根据实际需要设计的、完成特定功能的程序;

操作系统预留一些接口(Interface)给用户程序。通过这些接口,操作系统可以控制用户程序的执行。一般有两种接口:主程序接口和中断程序接口。

主程序接口是正常情况下用户程序运行的起点。PLC的这种设计思想与计算机编程是一样的。我们知道,在C语言的编程中,程序的运行起始于Main函数。在Main函数中,按照从上到下的顺序依次执行代码。Main函数是操作系统执行用户程序的接口。

main.png

在西门子S7-300/400系列PLC中,程序的运行起始于组织块OB1。OB1就相当于C语言的Main函数;在S7-200 smart中,更是直接把OB1称为Main块。

如果程序比较复杂,还可以把一些常用的功能设计成模块,以便重复利用。这些小的模块称为子程序。

子程序存在于主程序中,操作系统通过调用主程序,就能让子程序也得到运行。在S7-300/400中,子程序包括FB和FC。

除了主程序接口,PLC还提供中断程序的接口。比如S7-300/400系列PLC的组织块OB35(循环中断)、OB40(硬件中断)、OB82(诊断中断)、OB122(IO访问故障中断)等等。中断程序接口中的程序,称为“中断处理程序”,中断处理程序由用户自己编写。

PLC在运行的过程中如果检测到中断请求,操作系统会暂停当前用户程序的执行,转而去寻找中断程序的接口,以执行相应的中断处理程序。以S7-300/400为例:当PLC检测到外围IO访问出现故障时,会调用OB122来进行处理。如果此时程序中没有添加OB122,CPU将会停机;如果添加了OB122但是没有写任何代码(没有中断处理程序),CPU将会继续运行,但是SF灯会亮起,以提示系统存在故障。

中断的执行是有优先级的,优先级高的中断会被优先响应;中断也可以嵌套,这也意味着高优先级的中断会打断低优先级的中断;

从上面描述的主程序接口及中断程序接口,我们可以看出:操作系统是PLC的大管家,是它控制着用户程序的执行及中断的响应。

其实,PLC的操作系统在执行用户程序之前,还要做一些其它工作,如下图:

scan_cycles.png

PLC在冷启动或热启动后,会执行启动扫描。在这个步骤中,可以对一些变量进行初始化。启动扫描仅在每次启动后执行一次,在S7-300/400系列PLC中,OB100(暖启动)、OB101(热启动)和OB102(冷启动)是用于启动扫描的组织块。

启动扫描完成后,PLC进入循环扫描的阶段。首先进行内部检查,然后将外部的数字量输入读到CPU的输入缓存区(input image)。这里要注意,仅读取数字量输入信号,不包括模拟量输入信号。当数字量输入信号的状态读取到输入缓存区后,便开始执行用户程序。

在用户程序执行的过程中,如果需要数字量输入信号,CPU将会从输入缓存区中读取,而不是到外部设备去获取信号。但是,如果需要模拟量输入信号,将会直接到外部模拟量传感器进行读取。

将数字量输入信号读取到输入缓存区中有以下几个好处:

  1. 在当前的扫描周期中,信号的值被固定。外部的信号抖动不会干扰程序的执行结果;

  2. 输入缓存区读取的速度比直接读取外部信号值要快的多,有利于程序的快速执行;

  3. 外部的数字量输入信号只能以“位(bit)”的方式进行访问,但是当信号读取到输入缓存区后,可以“位(bit)”、“字节(byte)”、“字(word)”和“双字(double word)”等方式进行访问,程序的编写更加灵活;

对于数字量输出信号,用户程序执行的结果被存放在输出缓存区(output image)中。当用户程序执行完成后,操作系统将存放在输出缓存区的运算结果,刷新到数字量的输出模块中。

对于模拟量的输出,不存放到输出缓存区,而是会在程序执行的过程中直接将结果输出到外围设备中。

好了,关于PLC的程序结构及PLC的循环扫描工作原理就先介绍到这里,欢迎扫描下面的二维码关注我们的微信公众号。

取消

感谢您的支持,欢迎常来看看!

扫码支持
一点动力,多少随意

打开支付宝扫一扫,即可进行扫码打赏哦

发表评论

  • 文中介绍,当程序需要模拟量时,将直接到外部模拟量传感器进行读取,请问“外部模拟量传感器”的速度能与CPU的速度匹配吗?外部设备速度一般无法和CPU相比,是数量级的差别,此时CPU只能在执行空指令等待数据,无形中将及大地拖长PLC的扫描时间,为何不可以像数字量信号读到输入缓存区呢?还请李老师不吝赐教,谢谢!

    • 外部模拟量传感器的数值存放在模拟量输入模块中,这里是指CPU直接从模拟量输入模块中读取数据。

  • 非常棒