我已经开始使用结构化文本对逻辑控制器 (PLC) 进行编程。我的背景来自 IT 或计算机科学。所以我习惯了传统的编程语言,如 Java、C# 等......我只是意识到 PLC 需要不同的思维方式。了解扫描周期...有人可以更清楚地向我解释我读到的以下段落
ST 与传统编程语言之间的一个重要区别是程序流控制的性质。一个 ST 程序每秒会从头到尾运行多次。传统程序在完全完成之前不应该到达终点。
PLC 程序与您已经知道的不同之处在于它通常具有一个循环执行的主任务,即每个扫描周期执行一次。然后主任务调用子任务或程序列表,完成后,主任务再次运行。
扫描周期可以设置为间隔运行,例如每 10 毫秒。然后 PLC 将更新 IO,运行程序,然后在等待下一次触发时什么也不做。如果您有固定的扫描时间,您可以使用它来制作非常精确同步的程序,但重要的是您的程序(主任务及其子任务)始终在此时间内执行。
可以设置一些 PLC 以尽可能快地一个接一个地运行扫描周期。扫描时间是可变的,但您仍然必须监视扫描时间以确保程序运行的循环时间相当一致。
在从其他语言过渡到 PLC 语言的过程中,我学到的最重要的一课是尽可能保持程序流的顺序,因为任何循环和偏差都会影响执行时间,而执行时间必须始终小于扫描时间。
这意味着例如:在 1 秒内,您的 PLC 程序执行 1 秒/循环时间。因此,如果您的循环时间为例如 1 毫秒,则您的程序在一秒钟内执行 1000 次。这就是主要区别。它是确定性的。这就是段落的意思。当它到达终点时,它还没有完成。它以更新的过程映像重新启动。
在,比如说,非 PLC 程序(比如在你的电脑上)你有类似的东西
while(!_end)
{
/* your code */
}
原则上,PLC 的工作原理与此类似。但是在您的 PC 上,无需在诸如 500µs 之类的硬时间帧中循环执行程序。您的 PC 上的大多数应用程序,让我们称之为“时间无关紧要”。最大的区别在于,PLC 运行完整的程序,在开始下一次运行之前,它会刷新其过程映像(写入输出/读取输入)。程序执行由所谓的“任务”触发。此任务负责保持您的实时控制。我之前提到的过程映像是 PLC 存在的所有过程值的总和(如数字 I/O、电机驱动器值……)。所以你看,它是一种循环,但与你从 c#/java 程序中知道的不同。
(顺便说一句,我无法打开你的pdf)
pboedker 和 ChrisKo 的答案都很好。需要一些额外的警告。
扫描(或扫描时间)可能比代码的执行时间短。在大多数 PLC 中,都有一个“看门狗”来检测这种情况,并警告您它正在发生。您经常需要设置这个“看门狗”,并为它设置一个警报/事件处理程序。
了解您的 PLC 如何执行 I/O。有些(例如 ControlLogix)是异步的,I/O 根据 RPI(请求数据包间隔)被读入控制器内存,并在您使用代码更改 I/O 点时被写出(相同的 RPI)。其他(例如 AutomationDirect 的 Productivity 2000 系列)仅在完整扫描您的代码时写入输出。我相信您可以想象每种情况的优缺点,特别是如果您的控制器在重新开始扫描之前没有完成您的代码。
允许您对不同代码段具有不同扫描速率的 PLC 为您提供强大的 I/O 和程序流管理工具。缓慢的进程可以慢慢扫描,让您有更多的 PLC 时间来处理其他事情。
我是一名PLC程序员。我想用PC来控制PLC,PLC作为一个哑IO。PLC编程总是循环扫描,每次扫描时间为几毫秒。您可以将其理解为 ChrisKo 所说的 while 语句。
while(1=1)
{
// code
}