Jump to content
  • PLC programming technology and HMI interface design Simplified Chinese database

    PLC, DCS, HMI and SCADA product application technical articles

    leigehong
    在上一篇文章中,我们讨论了什么是功能块 FB、它在 PLC 程序中如何工作以及如何创建和使用功能块 FB。在本文中,我们将讨论西门子 Tia Portal 中不同功能块类型的数据块实例以及何时使用每种类型。
    内容:
    什么是功能块 FB? 数据实例的不同选项。 单实例。 参数实例。 多实例。 什么是功能块?
    功能块或 FB 只是包含代码逻辑的块。您可以使用该 FB 通过编写在其中的代码片段来实现特定的功能。
    当在代码中调用功能块时,系统会要求您分配一个数据块(也称为数据实例)与该 FB 关联,以保存 FB 参数的值。并非 FB 内的所有参数都保存在数据实例中,但我们稍后会讨论这一点。
    调用功能块时,您有 3 个不同的选项用于将数据块实例与此函数调用相关联。这些不同的选项将取决于您调用 FB 的位置。
    所以,简而言之。功能块FB基本上是具有专用数据块 DB 的功能 FC,该数据块用于存储功能块参数的值。
    数据实例的不同选项
    对于功能块的数据实例,我们有 3 个不同的选项,这些选项是:
    单实例。 参数实例。 多实例。 三个不同的调用数据实例来自 3 种不同的调用方法:
    您可以在主 OB1 内调用功能块 FB,这将为您提供以下选项: 单实例。  
    您可以在功能 FC 内调用功能块 FB,这将为您提供两种选择 单实例 参数实例  
    您可以在另一个功能块内调用该功能块,这将为您提供创建数据实例的三个可用选项 单实例 参数实例 多个实例 单个数据实例
    首先,让我们从创建一个功能块 FB 开始,正如我们之前提到的,我们通过单击 “添加新块” 并选择我们想要的块类型来创建一个功能块。见图1。

    图 1 – 创建功能块 FB
    现在,我们将在主 OB1 中创建的 ReusableFB 称为 ReusableFB。见图2。

    图 2 – 调用主 OB1 内的 FB
    正如您从上图中看到的,在主 OB1 内调用 FB 时,系统会要求您分配一个与该 FB 调用关联的数据实例。在这种情况下,只有一个选项,那就是单一实例。
    选择单实例选项后,将创建一个数据块并与 FB 调用关联。见图3。

    图 3 – 创建的单个实例
    创建的单个实例将用于存储一些 FB 参数的值。如输入、输出、In Out 和静态参数。
    FB 的其他参数将不会被存储,例如温度和常量。见图4和图5。

    图 4 – 数据保存在数据实例内部

    图 5 – 从 FB 保存到数据实例的数据。
    现在,让我们在 FB 中创建一个简单的逻辑,以帮助我们更好地理解数据实例。该逻辑会将常量值 15 添加到静态变量,然后将结果移至输出。见图6。

    图 6 – 创建一个简单的逻辑
    现在,返回主 OB1 并注意 FB 调用现在的情况。见图7。

    图 7 – 每次更改后更新 FB 调用
    您对 FB 内部逻辑所做的任何更改都将导致需要更新功能块调用,以便可以应用您所做的更改。
    您可以通过右键单击 FB 调用并按更新块调用选项或重新编译 PLC 代码来更新块调用。见图8。

    图 8 – 更新 FB 调用
    更新块调用后,您在 FB 代码中所做的更改将在块调用中应用和使用。如图 9 所示。
    FB 现在期望提供 bool 类型的输入信号,并且 FB 将给出 int 类型的输出。

    图 9 – 输入和输出现在与 FB 调用关联
    让我们模拟我们的代码,看看 PLC 将如何运行。请参阅下一个动画,该动画显示了迄今为止 PLC 逻辑的简单模拟。

    从动画中可以看出,每当启动信号为 TRUE 时,该函数就会被执行,并且输出不断变化。一旦启动信号不再可用,输出将保持在最后记录的值。
    这里数据实例的用途是静态变量和输出变量的值保存在单个实例内,因此当启动信号再次返回时,函数将从最后记录的值继续。
    非常重要的注意事项
    切勿对 FB 的两次不同调用使用相同的单个实例。请看下一个动画。

    正如您从动画中看到的,我们有两个不同的 FB 调用,但两个调用都与同一个实例关联,这就是为什么即使 start2 信号为 FALSE,Output2 值也会随 Output1 变化。
    正如您所期望的,第一次调用的数据实例的更改也会在第二次调用中受到影响,因为它们具有相同的内存块。见图10。

    图 10 – 切勿在不同的 FB 调用中使用相同的数据实例
    如果您对不同的 FB 调用使用相同的数据实例,则您的功能块将不再可重用。即使每个不同的 FB 调用的输入/输出参数都不同。正如您从上一个视频(动画)中看到的那样,即使第二个调用甚至没有启用输入信号,两个调用也具有相同的结果。
    另一个非常重要的注意事项
    我们之前说过,如果您从更高级别的 FC 调用您的 FB,则关联的数据实例将有两个选项;这些选项是单个实例和参数实例。见图11。

    图 11 – 使用带有从 FC 调用的 FB 的单个实例
    如果发生这种情况,并且您将在 FC 内调用 FB,则您永远不应该为 FB 使用单个实例。要知道这是为什么。见图12

    图 12 – 多次呼叫上级 FC
    从图 12 中可以看出,当您在逻辑中多次调用更高级别的 FC 时,不会要求您分配数据块,因为 FC 不需要数据块。
    但是你知道 FC 内部有一个叫做 FB 的,这个FB有一个与之关联的单个实例。因此,现在 3 个 FC 调用对于 FB 调用具有相同的数据实例。因此,您的函数 FC 不再可重用。
    该怎么办?当您需要在 FC 内调用 FB 时,最佳选择是使用参数实例。
    参数实例
    正如我们之前所说,如果您在 FC 内调用 FB,则不应选择单个实例,而参数实例更适合您的可重用性目的。
    参数实例将保存调用到 FC 块接口的 In Out 区域的 FB 的数据实例。允许您为每个 FC 调用输入新的数据实例。见图 13 和 14。

    图 13 – 在 FC 内调用 FB 时分配参数实例

    图 14 – 每个 FC 调用都需要一个新的数据实例
    从上图中可以看出,每当您在程序中调用 FC 时,它都会为 FC 内的可重用 FB 请求数据实例。
    但是,使用这种方式您将必须自己创建数据实例。见图15。

    图 15 – 创建一个新的数据实例
    要创建新的数据实例,您可以执行与创建 FC 或 FB 相同的操作,但这次您选择 DB 选项。并确保选择的 DB 类型与调用的 FB 相同。
    现在,您的 FC 可以根据您的需要多次重复使用,您只需为每次调用创建一个实例即可。见图16。

    图 16 – 将 DB 分配给 FC 调用
    多实例数据库
    多实例 DB 简单来说就是被调用 FB 的 DB 将存储在更高级别调用 FB 的 DB 中。仅当您从另一个 FB 调用一个 FB 时,此选项才可用。
    让我们创建另一个 FB 将其用作更高级别的 FB。
    创建此 HigherLevelFB 后,从主 OB1 调用它,当然唯一的调用选项将是单个实例,如前所示。见图17。

    图 17 – 从主 OB1 调用 UpperLevelFB
    现在,从 HigherLevelFB 调用 ReusableFB。并选择多实例选项。见图18。

    图 18 – 分配多实例 DB
    当您选择多实例选项时,创建的 DB 将存储在调用 FB 的静态参数内。见图19。

    图 19 – 实例保存在静态参数内
    您可以多次调用 ReusableFB,每次调用它时,多实例都会存储在静态参数中。见图20。

    图 20 – 多次调用 ReusableFB
    正如您所看到的,下级 FB 的数据实例将保存在上级 FB 的数据实例内。最好有更好的程序结构和易于阅读的逻辑。
    结论
    在代码中创建功能块需要将数据块与您在逻辑中进行的每个 FB 调用相关联。该数据块或也称为数据实例具有不同的选项,具体取决于调用 FB 的块的类型。
    选择数据实例类型时要小心,因为某些选项可能不适合您的情况,如我们之前所示。有时这可能会导致您的逻辑出现问题,并且您的函数无法再重用。
    使用多实例可以帮助更好地组织程序结构,因为所有被调用的 FB 都会将其 DB 存储在主调用 FB 中。

    leigehong
    在上一篇文章中,我们讨论了数据块,我们讨论了两种不同类型的数据块,全局数据块和功能块FB的数据实例。
    在本文中,我们将讨论西门子 Tia Portal 中优化数据块访问和标准数据块访问的含义。
    内容:
    什么是优化数据块和标准数据块? 简单的程序示例。 什么是标准 DB? 偏移量是多少? 什么是优化的数据库? 使用优化数据库的优点。 结论。 什么是优化和标准数据块访问?
    首先,这些不是新类型的数据块;我们说过我们只有两种不同的类型:全局数据库和背景数据库。优化数据块访问是数据块的一项功能。您可以从已创建的数据块的属性中激活或禁用此功能。
    优化数据块功能仅适用于 S7-1200 和 S7-1500 PLC,不适用于 s7-300 或 s7-400
    使用 S7-1200 或 S7-1500 PLC 时数据块的标准设置是它们是经过优化的,如果您想要标准数据块,则必须自行设置。
    那么,什么是优化块和标准块? 为了理解其中的差异,我们将编写一个简单的程序并尝试展示优化块与标准块的不同之处。
    简单程序示例:
    在此示例中,我们不会创建任何 PLC 逻辑或编写任何指令,我们只会创建 2 个全局数据块,DB1 将称为 OptimizedDB,DB2 将称为 StandardDB。
    在这两个数据块中,我们将分别声明数据类型 Bool、Int、Real 和 Word 的 4 个变量。见图1。

    图 1 – 创建两个全局 DB
    首先你会注意到,两个数据块是完全相同的,那是因为正如我们所说,创建数据块时的默认设置是它会被优化,所以我们需要更改 DB2 的设置,使其成为 标准块,看看是否会发生变化。
    我们根据 DB2 的属性来做到这一点。您可以通过右键单击数据块并按属性来访问 DB2 的属性。见图2。

    图 2 – 将 DB2 更改为标准块访问
    取消选择图 2 中所示的优化块访问属性并按 “确定” 后,将弹出警告消息,见图 3。

    图 3 – 更改块访问弹出窗口
    一旦按下 OK,您的 DB2 将被转换为标准块访问。请参见图 4。看看这有何不同。

    图 4 – DB2 现在是一个标准块
    我们直接看到的是 DB1 和 DB2 不再一样了。DB2 中表示的标准块访问选项有一个称为偏移量的附加列。
    在偏移框中的每个变量前面,都有一个...写着,一旦你编译程序,这个就会改变。
    让我们编译一下,看看会发生什么,见图 5。

    图 5 – 编译程序以重新加载偏移量
    现在,偏移量已分别填充为 0.0、2.0、4.0 和 8.0。
    那么,这个偏移量是多少? 这是什么意思? 我们稍后会讨论这个问题,但现在,让我们创建另一个 STANDARD 块并声明相同的 4 个变量,但这次我们将更改变量数据类型的顺序,见图 6。

    图 6 – 创建另一个标准块 DB3
    从上图可以看出,DB2 和 DB3 的偏移量是不同的,为什么当我们改变数据类型的顺序时,偏移值会不同呢?它们是相同的数据类型,但顺序不同。
    让我们创建另一个标准DB,并声明相同的 4 个变量,但顺序不同。编译您的 PLC 代码,然后比较 3 个 DB 的偏移量。见图7。

    图 7 – 具有三个不同偏移量的三个不同 DB
    同样的事情又发生了。
    什么是标准 DB?偏移量是多少?
    标准访问的数据块具有固定的结构。当您在标准 DB 中声明变量时,该变量将被分配到该 DB 中的固定地址。
    该变量的地址显示在 “Offset” 列中。因此,我们在前面的图片中看到的偏移量是为每个变量分配的地址。
    因为标准 DB 的结构是固定的,所以只能在具有固定存储容量的 DB 中工作,即 16 位区域或 2 字节。这就是当我们改变声明顺序时,相同变量的寻址不同的原因。更多解释请参见图 8。

    图 8 – DB2 的简单表示
    图 8 显示了标准数据块 DB2 的简单表示。正如我们之前所说,标准DB具有固定的 16 位内存块,因此,当我们将 Variable_1 声明为 BOOL 数据类型时,该变量将占用全部 16 位,即使它只需要 1 位内存。这就是为什么您会看到其余区域标记为红色,因为它未使用但无法再使用。所以这是一段失去的记忆。
    对于 Variable_2,数据类型 INT 需要 16 位,因此它使用 2 个完整字节。与 Variable_4 相同,其数据类型为 WORD。
    对于 Variable_3,我们占用了 4 个字节,因为它是 REAL 数据类型。这就是为什么 DB2 的偏移量分别为 0.0、2.0、4.0 和 8.0。
    DB3 和 DB4 执行相同的概念。但由于变量的数据类型顺序不同,内存表示也会不同,因此偏移量也会不同。DB3 和 DB4 见图 9 和 10。看看根据前面的解释你是否能理解表示法。

    图 9 – DB3 的内存表示

    图 10 – DB4 的内存表示
    因此,当您使用标准数据库时,声明变量时必须小心,因为每次定义新的 BOOL 变量时都会造成内存损失。
    如果您在数据库列表的末尾声明新变量,则偏移量将扩展以包含您的新变量。但是,如果您在旧变量之间或在数据库的开头声明新变量,则会发生其他情况。见图11。

    图 11 – 声明一个新变量
    您会注意到的第一件事是您的偏移量现在丢失了,您必须编译代码才能重新建立新的偏移量。见图12。

    图 12 – 通过重新编译代码重新建立偏移量
    您是否注意到变量的寻址 (OFFSET) 现在发生了怎样的变化?
    例如,REAL 标签的偏移量为 2.0,但在添加新的 TestVariable 后,同一 REAL 标签的寻址 (OFFSET) 现在为 4.0,见图 13。

    图 13 – 添加 TestVariable 后的偏移变化
    因此,当添加新变量时,所有旧变量的寻址都发生了变化。这意味着程序中需要写入或读取某个变量值的任何指令现在都将查看指令中分配的地址,但现在该地址具有与预期不同的数据。
    简而言之,你的整个逻辑现在已经混乱了。这会带来很多麻烦。更不用说现在添加新变量后您会丢失额外的内存。见图 14。

    图 14 – 添加 MOVE 指令
    让我们添加一条 MOVE 指令,将值 1 移至 Variable_2 标签中。查看 MOVE 输出的地址如何为 %DB2.DBW2。
    现在,让我们向 DB2 添加一个 INT 类型的新变量。见图15。

    图 15 – 添加新的 INT 变量
    当您添加新变量时,偏移量将丢失,并且 PLC 不再知道 MOVE 指令的 OUT1 的目的地在哪里。
    我们需要编译程序来重新加载新的偏移量。见图16。

    图 16 – OUT1 的新地址
    您看到 OUT1 地址现在有何不同了吗?现在是 %DB2.DBW4 而不是 %DB2.DBW2。这是使用标准数据块的一个非常大的缺点。
    什么是优化数据库?
    优化数据块和标准数据块的区别在于,优化数据块内部的变量没有被分配到固定的地址,而是给变量赋予一个符号名称,而且数据块的结构也不像标准的那样固定。数据块,因此在声明新标签时不会丢失内存,也不会更改地址。 见图 17。

    图 17 – 在优化块中声明新标签
    因此,在优化数据块中声明新标签不会影响其余标签,因为它们是由符号名称而不是绝对寻址定义的。
    优化的数据块将不允许您在使用其中定义的标签时使用地址。见图18。

    图 18 – 使用优化块的绝对寻址
    正如您在最后一张图片中看到的,优化数据块不允许绝对寻址,只允许符号名称。见图19。

    图 19 – 使用带有优化 DB 的符号名称
    优化访问的数据块的优点
    具有优化访问的数据块没有固定定义的结构。数据元素(标签)仅分配一个符号名称,并且不使用块内的固定地址。
    元素会自动保存在块的可用存储区域中,以便内存中不存在间隙。与标准 DB 相比,这可以实现内存容量的最佳利用,并避免内存丢失。
    这具有以下优点:
    您可以创建任何结构的数据块,而无需注意各个标签的物理排列。 由于数据存储是由系统优化和管理的,因此始终可以快速访问优化的数据。 例如,间接寻址或来自 HMI 的访问错误是不可能的。因为现在有地址,每个标签只有唯一的符号名称。 您可以将特定的单个标签定义为保持性。在标准 DB 中,您只能将整个块定义为保持性。 结论
    与标准数据库相比,优化数据块有很多优点。在向块添加新变量时,使用符号名称有助于避免标签的任何地址更改。
    通过优化块,不会丢失任何内存区域。与使用标准数据库时发生的情况相反。

    leigehong
    在之前的文章中,我们讨论了什么是组织块,并讨论了主循环中断 OB1 和时间中断 OB10。
    在本文中,我们将继续讨论不同的 OB,这次我们讨论的是延时中断组织块或 OB20。
    内容:
    什么是 OB20? 如何调用 OB20? SRT_DINT 指令的参数。 示例程序。 结论。 什么是延时中断 (OB20)?
    OB20 是一个组织块,由操作系统调用并执行,但是我们必须告诉操作系统什么时候调用这个 OB20。
    操作系统从用户 PLC 程序获取信息来调用该 OB20,它将等待配置的延迟时间,然后调用并执行 OB20 内部的任何逻辑。
    我们通过在项目树中添加新块来创建 OB20 块。见图1。

    图 1 – 创建一个新的 OB20 块
    现在我已经创建了延时中断,那么什么时候执行呢? 以及如何配置块执行的时间延迟?
    同样,OB20 是一个组织块,这意味着您不调用要执行的块,而是告诉操作系统何时可以调用它并执行其中写入的任何功能。
    如何让操作系统调用 OB20?
    为了告诉操作系统我们要调用 OB20,我们使用 SRT_DINT 或启动时间延迟中断,见图 2。

    图 2 - 启动延时指令
    SRT_DINT 指令的参数
    从上图可以看出,可以使用 SRT_DINT 指令来调用 OB20。但您需要配置一些参数才能使指令正常工作。
    EN:在 EN 输入出现下降沿信号之前,不会执行指令。这意味着您必须指定一组条件中的一个条件来启用信号,并且只有当该条件为真然后再次为假时,指令才会起作用。
    OB_NR:您分配需要调用的延迟中断的编号,在我们创建 OB20 的情况下为 20,但我们可以创建多个延迟中断,然后我们必须使用单独的 SRT_DINT 指令调用每个延迟中断。
    DTIME:即执行OB20之前要等待的延迟时间,为了模拟,我们将这个时间设置为 5 秒。
    SIGN:调用延时中断 OB 时在 OB 的启动事件信息中出现的标识符。
    PLC 程序示例
    为了更好地理解 OB20,我们将创建一个简单的逻辑来了解如何调用和执行 OB20。我们将基于之前文章中为 OB1 和 OB10 制作的逻辑构建此 PLC 示例。
    在 OB20 内部,我们将创建一个逻辑,用于计算在我们为 OB20 配置的 5 秒延迟时间内调用和执行了多少个 OB1 周期。见图3。

    图 3 – OB20 内部逻辑
    在最后一张图中,您可以看到我们使用 MOVE 指令在 OB20 调用开始时以及执行后推送有关周期计数的信息。
    其余逻辑请参见图 4。

    图 4 – 计算 5 秒内有多少个周期
    之后,我们将循环计数的两个值相减,即可得到在五秒延迟内执行了多少个循环。
    现在我们已经创建了我们想要的逻辑,我们如何调用 OB20? 如前所述,我们必须使用 SRT_DINT 指令。我们将在之前配置为每分钟执行一次的 OB10 中使用该指令。这意味着 OB20 也将每分钟调用并执行一次,但延迟时间为 5 秒。
    在上一篇文章中,我们构建了一个逻辑来调用 OB1 被调用和执行的次数,我们还构建了另一个逻辑来每分钟调用 OB10。
    在本例中,我们将使用 OB10 的调用来调用 OB20。见图5。

    图 5 – 通过 OB10 调用 OB20
    我们之前说过,SRT_DINT 需要 EN 处的下降沿信号才能启动调用。这就是为什么我们使用 TimeOfDayInterruptEnabled 信号,我们知道执行 OB10 时该信号将为 true,然后返回 false,为我们提供所需的边沿信号。
    现在所有 PLC 逻辑都已完成,让我们编译并运行一个新的仿真。请参阅以下我们项目的模拟。

    您首先在动画中看到周期计数的值为零,但是当调用 OB10 并且 TimeOfDayInterruptEnabled 为 true 时,逻辑将等待 5 秒,然后计数值将使用周期计数进行更新。
    结论
    OB20 是由操作系统调用并执行的组织块。 我们可以通过 SRT_DINT 指令告诉操作系统调用 OB20。

    leigehong
    在本文中,我们将继续讨论西门子 PLC 中不同类型的组织块。这次我们将讨论 OB121 或 Tia Portal 中的编程错误中断。
    内容:
    什么是编程错误中断 OB121? 编程错误的示例。 如果检测到编程错误会发生什么? 在 TIA Portal 中模拟编程错误。 OB121 如何有助于防止编程错误? 结论。 什么是编程错误中断 (OB121)?
    OB121 是一个组织块,如果运行逻辑时发生编程错误,PLC 操作系统将调用该块。请注意,我们并不是在讨论在尝试将逻辑下载到 PLC 时编译器会捕获的编程错误。见图1。

    图 1 – 一些编程错误会被编译器捕获
    从最后一张图可以看出,我的 PLC 逻辑中有一个编程错误;网络 1 的输入和输出中缺少一些操作数。但是,编译器甚至在将逻辑下载到 PLC 之前就捕获了该错误。图1中的错误不是可以触发需要调用 OB121 的编程错误类型。
    PLC 程序中编译器无法发现的错误,但在 PLC 运行时仍然会导致逻辑出现问题,这就是我们所说的编程错误。这些错误将触发操作系统对 OB121 的调用。
    编程错误示例
    以下是 PLC 逻辑中可能导致编程错误的一些错误示例:
    超出了块调用的最大嵌套深度。 您使用了 NULL 指针来寻址操作数。 未知指令。 寻址字符串的长度信息不正确。 读取时面积长度错误。 写入时区域长度错误。 计时器编号错误 访问未加载的数据库;DB 编号位于允许的区域内。 数据库不存在。 这些错误以及更多错误可能会导致 PLC 中的编程错误。您可以查看 TIA Portal 的帮助部分,了解可能导致 PLC 编程错误的其他原因。
    如果检测到编程错误会发生什么?
    当您的 PLC 检测到编程错误时,可能会发生以下三个事件之一。
    您的 PLC 将显示错误并进入停止模式。 您的 PLC 将显示错误,但继续运行您的逻辑。 您的 PLC 将显示错误,然后尝试解决该错误。 这三个事件基本上取决于您的 PLC 编程。这意味着您的代码将决定操作系统在检测到编程错误时的行为方式。
    在 TIA Portal 中模拟编程错误
    为了更好地理解 PLC 的行为方式,我们将创建一个简单的程序,在其中引发编程错误,然后我们将看看会发生什么。见图2。

    图 2 – 简单的程序逻辑
    我们创建的逻辑非常简单,当 InitiateProgError 已启用时,值 126 将被移至 DB52.DBW16 区域。请注意,我们还没有创建 DB52。所以,这将是我们的编程错误。请注意,在编译或下载到 PLC 期间不会捕获此错误。见图 3 和 4。

    图 3 – 编译器未捕获的错误
    查看该块如何成功编译,同时包含编程错误。

    图 4 – 下载到 PLC 的块
    该块再次下载到 PLC 时出现编程错误。
    现在,让我们模拟一下 PLC 程序,看看会发生什么。PLC 代码的模拟参见动画1。

    动画1
    正如您从上面的动画中看到的,PLC 错误 LED 将呈红色闪烁几秒钟,然后 PLC 将进入停止模式。
    进入 PLC 在线诊断看看发生了什么。见图5。

    图 5 – PLC 在线和诊断
    您在动画中看到的内容与您在上一张图片中看到的内容完全相同。它们可以分为 3 个步骤:
    PLC 检测到编程错误,即 OB52 未加载。 操作系统将触发对 OB121 的调用,但在我们的逻辑中并没有创建 OB121。 当 PLC 发现我们的逻辑中没有创建 OB121时,操作系统就会发起 STOP 请求。PLC 将进入 STOP 模式。 OB121 如何有效防止编程错误?
    让我们将 OB121 添加到 PLC 代码中,看看情况会如何变化。见图6。

    图 6 – 添加 OB121
    创建 OB121 并将其添加到 PLC 逻辑中后,让我们看看模拟中会发生什么。
    请记住,我们尚未在 OB121 内编写任何 PLC 逻辑。参见动画2。

    动画2
    从动画2 中可以看到,当 InitiateProgError 被触发时,PLC ERROR LED 将呈红色闪烁,但 PLC 将继续运行。
    这意味着 PLC 不会进入 STOP 模式。 让我们检查一下在线诊断,看看到底发生了什么。见图7。

    图 7 – 错误并未导致 PLC 停止
    从图中可以看出,PLC 检测到错误,但没有进入 STOP 模式。它将跳过此错误,继续循环并从头开始。
    当再次出现错误时,它将再次检测到错误,并在诊断中发出警报。跳过错误并继续。这意味着 PLC 在每个扫描周期都会发出相同的警报。这就是为什么在图片中您看到事件不断触发并且警报在每个扫描周期重复。
    因此,只要有一个空的 OB121 就可以让您保持 PLC 运行和扩展,从而保持过程运行。
    但是,我们还可以做更多的事情,我们可以尝试捕获这个错误并消除它。另外,我们可以尝试显示检测到的编程错误的类型。
    确定错误类型
    OB121 有一个内部故障 ID 标识符,我们可以用它来显示故障类型,也可以作为 HMI 上的警报。在 OB121 内部,我们将创建一个简单的 MOVE 指令,在该指令中,我们将 OB121 的 Fault_ID 输入推送到全局 DB 内定义的存储区域。见图8。

    图 8 – 识别错误类型
    从上图可以看出,当发生编程错误时,Fault_ID 将被推送到 Data.ProgErrorID 中。见图9。

    图 9 – 编程错误 Fault_ID
    可以看到故障 ID 为 3A。如果您查看 TIA Portal 帮助您可以找到该故障的含义。
    3A:访问未加载的 DB;DB 编号位于允许的区域内。
    捕获错误
    这只是意味着,在找出原因后尝试解决 PLC 编程错误。这主要取决于错误是什么以及您希望如何处理它。我们将模拟错误的解决方案,看看 PLC 将如何表现。
    针对我们创建的错误的实际解决方案是仅创建 DB52 或使用已创建的数据块。
    但为了模拟,我们将只添加一个简单的触点,当编程错误发生时,该触点将打开以捕获该错误。见图 10 和 11。

    图 10 – 捕获错误
    每当调用 OB121 时,都会设置 CatchError。

    图 11 – 消除错误
    每当调用 OB121 时,都会设置 CatchError,用于捕获网络 1 中的编程错误。PLC 模拟请参见动画 3。

    动画3
    从上面的动画可以看出,当 InitiateProgError 被触发时,PLC 会暂时出错,然后错误会被清除,PLC 始终处于 RUN 模式。
    结论
    如果代码中存在编程错误,只需在逻辑中包含一个空 OB121,即可确保 PLC 不会进入 STOP 模式。您稍后还可以使用 OB121 来识别错误并解决它。

    leizuofa
    本文介绍的是在 PLC 梯形逻辑的帮助下使用比较器进行信号灯操作的 T 字路口交通控制系统。
    T 字路口交通控制系统
    T字路口交通控制系统的功能由三组段组成。通过比较器操作的逻辑,我们控制交通灯系统。

    第一段: 第一段中,车道1允许通行,车道2和车道3停止通行。在此段中,车道 1 的绿灯(绿 1)亮起,车道 2 的红灯(红 2)和车道 3 的红灯(红 3)亮。此期间持续十五秒。
    第二段: 在第二段中,车道 2 允许通行,车道 1 和车道 3 停止通行。在该段中,车道 2 的绿灯(绿 2)亮起,车道 1 的红灯(红 1)和车道 3 的红灯(红 3)亮。此期间持续十五秒。
    第三段: 第三段,车道3允许通行,车道1和车道2停止通行。在该段中,车道 3 的绿灯(绿 3)亮起,车道 1 的红灯(红 1)和车道 2 的红灯(红 2)亮。此期间持续十五秒。
    执行完所有三个段后,操作序列再次开始并不断重复。
    输入和输出说明
    在这个 PLC 项目中,我们使用了 2 个输入、6 个输出、2 个内存和 1 个接通延迟定时器。
    序号 符号 说明 1 I 0.0 开始 2 I 0.1 停止 3 M 0.0 内存 4 M 0.1 内存 1 5 Q 0.0 绿色 1 6 Q 0.1 红色 1 7 Q 0.2 绿色 2 8 Q 0.3 红色 2 9 Q 0.4 绿色 3 10 Q 0.5 红色 3 11 DB1 延时定时器 PLC 编程及其讲解
    1. 当按下 START (I 0.0) 按钮时,MEMORY (M 0.0) 通电。这个 M 0.0 是用于执行程序中所有进程的主存储器。由于它被锁存,因此它仅处于通电状态。如果按下停止(I 0.1),整个过程将随时停止。

    2. 一旦 MEMORY 通电,它将打开 TIMER DB1,控制交通路口的计时。在此计时器中,我们将预设时间设置为 45 秒。一旦定时器达到预设时间,存储器 1 (M 0.1) 就会通电,并且该 M 0.1 还会根据逻辑重置定时器并连续运行循环。
    3. 其次,比较器在控制交通路口方面发挥着主要作用。首先,输出 GREEN 1 (Q 0.0) 按照逻辑打开。这里我们使用小于或等于比较器。在此逻辑中,Q0.0 将在 0 秒到 15 秒内处于 ON 状态。之后,它将进入OFF 状态
    4. 接下来,对于输出 RED 1 (Q0.1),我们使用大于或等于函数。Q0.1 将在 15 秒至 45 秒内处于 ON 状态。当 Q0.0 处于 ON 状态时,它处于 OFF 状态。
    5. 然后,对于输出 GREEN 2 (Q0.2),我们对此输出使用小于或等于和大于或等于。两个比较器功能均与输出串联逻辑连接。在此情况下,Q0.2 将根据条件处于 ON 状态 16 秒至 30 秒。
    6. 接下来,对于输出 RED 2 (Q0.3),我们还使用小于或等于和大于或等于函数来执行操作。比较器与输出并联连接。该输出将在 0 秒至 15 秒以及 30 秒至 45 秒期间处于 ON 状态。在 15 秒之间,它只会处于 OFF 状态,因为此时 Q0.2 处于 ON 状态。
    7. 然后对于最后一个 GREEN 3 输出 (Q0.4),我们使用大于或等于函数。根据条件逻辑,它将在 30 秒到 45 秒内处于 ON 状态。在此时间之前,它将处于关闭状态。
    8. 最后,RED 3 输出(Q0.5)。这里我们使用小于或等于函数来执行 PLC 逻辑。0 秒到 30 秒内它将处于 ON 状态,之后将处于 OFF 状态。
    结论
    因此,通过这种方式,给定的丁字路口交通控制由比较器功能与 PLC 逻辑来执行。我们可以通过多种方式借助 PLC 逻辑来控制交通逻辑,这也是方式之一。

    leizuofa
    在任何 PLC 中,了解其指令的编写方式都很重要。 所有语言的基本理解都是相同的; 不同之处在于它的说明方式。 如果我们清楚地了解说明,那么我们就可以使用任何类型的 PLC 软件。
    自动化领域使用最广泛的品牌之一是罗克韦尔。 其中有许多不同类型的指令用于编程。 其中,有两条指令是任何 PLC 逻辑中最需要的。 它们是——单次上升沿和单次下降沿。 在这篇文章中,我们将看到这两条指令的工作原理。
    一触发上升沿 (OSR)
    在 PLC 编程中,您一定听说过两种常见的对象类型——正峰值和负峰值。 正峰值意味着仅当变量从 0 变为 1 时才会触发。该对象的输出为触发脉冲类型。
    现在,PLC 中不再有变量状态,而是一条附加指令,您可以在其中获取整个梯级的触发输出。 这意味着,当整个梯级或条件将其状态从 0 更改为 1 时,输出将处于脉冲型触发条件。 这是 PLC 中的上升沿触发指令。 在罗克韦尔 PLC 中,称为单触发上升沿指令。
    可以参考下图来理解。 正如您所看到的,该指令在其条件下接受两个输入。 两者都写成 NO 逻辑; 意思是当两者都打开时,只有条件为真。 现在,当这种情况发生时,指令中有两个变量——存储位和输出位。 存储位的作用是存储条件状态。
    当这两个位都打开并且条件从 0 变为 1 时,存储位将更新为 1 并将该值传递到输出位。 输出位打开的时间很短(以毫秒为单位)。 PLC 程序员可以在其逻辑中使用该脉冲输出。
    只要条件为真,存储位就不会改变。 一旦条件变为假,存储位就会更新为 0。当条件再次变为真时,输出位将作为脉冲打开。

    这表明,当您只想通过一个脉冲来打开输出时,该指令非常有用,并且该脉冲必须仅在整个条件为真时生成,而不是在单个变量变为真时生成。
    一击下降沿 (OSF)
    现在,举一个需要在系统停止时采取行动的例子。 这意味着,当条件从真变为假时,必须采取某些行动。 并且该动作必须以触发器类型完成; 它不应该持续打开。 这称为负峰值。 要执行此函数,必须从变量中获取负峰值,或者必须从整个条件中获取负峰值,如前所述。 对于第二种类型,Rockwell PLC 使用单触发下降沿指令。
    请参阅上图。 梯级中有 2 个 NO 条件,并且该梯级的输出连接到 OSF 块。 该块有两个位——存储和输出。 存储位用于存储梯级的状态。
    当条件为真时,存储位更新为1。当条件从真变为假时,存储位更新为 0,输出位以脉冲形式变为 1。 当条件再次成立时,循环会再次重复。 输出位为脉冲形式,并且持续时间很短(以毫秒为单位)。
    这表明,当您只想通过一个脉冲来打开输出时,该指令非常有用,并且只有当整个条件为假时,而不是在单个变量变为假时,才必须生成该脉冲。
    这样,我们就看到了罗克韦尔 PLC 中的单次上升沿和单次下降沿指令。

    leizuofa
    JSR、SBR 和 RET 指令用于指示控制器执行梯形图程序内的单独子程序文件,并返回到 JSR 指令后面的指令。
    Allen Bradley PLC 子程序
    SBR 指令必须是包含子例程的程序文件中第一个梯级上的第一条指令。
    使用子例程存储必须从应用程序中的多个点执行的程序逻辑的重复部分 子例程可以节省内存,因为您只需对其编程一次。 使用立即输入和/或输出指令(IIM、IOM)更新子例程内的关键 I/O,特别是当您的应用程序调用嵌套或相对较长的子例程时 否则,控制器不会更新 I/O,直到到达主程序末尾(执行完所有子程序后) 子例程内控制的输出保持其最后状态,直到再次执行子例程。 当执行 JSR 指令时,控制器跳转到目标子程序文件开头的子程序指令(SBR),并从该点恢复执行。 除了该文件中的第一条指令之外,您不能跳转到子例程的任何部分。
    目标子例程由您在 JSR 指令中输入的文件号来标识。 SBR指令用作程序文件作为常规子程序文件的标签或标识符。 该指令必须编程为子程序第一个梯级的第一条指令。
    RET 指令标志着子程序执行的结束或子程序文件的结束。 如果包含 RET 指令的梯级位于子例程结束之前,则该梯级可能是有条件的。
    这样,仅当子程序的梯级条件为真时,控制器才会忽略子程序的平衡。

    caixiaofeng
    台达 PLC(DVP 14SS2) 与台达变频器 (VFD-L系列) 的 Modbus 通讯。 电机将使用 Modbus 通信直接从 HMI (DOP-107CV) 运行。
    台达 PLC 与 VFD Modbus 通讯
    感应电机及其速度控制将直接从 HMI 运行。 速度控制是指 HMI 中应该有两个按钮,以 1 赫兹为单位增加和减少电机的速度(假设)。
    VFD-L 系列台达交流变频器将根据从 PLC 接收到的命令来运行电机。
    首先需要在驱动器中设置与 PLC 相匹配的通讯及其他参数,如波特率、奇偶校验、通讯模式等; 除了从站 ID(站地址)外,它必须与 PLC 站地址不同。 默认情况下,PLC 站地址等于一 (1)。 这意味着驱动器的站地址必须是其定义范围内除一 (1) 之外的任何地址。
    通讯模式需要设置的详细参数如下:
    2-00 = 4 2-01 = 4
    通讯参数

    我们必须按照上表设置通信参数。 (摘自手册)。
    9-00 = 2(可以设置为除 1 之外的任何值) 9-01 = 1 9-04 = 7(RTU 模式,停止位等于 1,奇偶校验为偶数) DVP 14SS2 有两个通讯端口,分别为 RS232 和 RS485。 此时需要根据变频器设置的参数进行通讯口2的设置,如下所示。
    打开 WPL 软件。 (台达 PLC 软件) 单击编程页面上的通信程序图标。
    选择 COM2 并按下一步。

    根据变频器通讯参数设置参数,然后单击“下一步”。 在这里,它们根据 VFD-L 潜水中设置的参数进行馈送。
    PLC 的站地址为1(见左下角)

    检查突出显示的内容并按下一步。

    人们可以勾选下面的方框并写下条件。
    这里,我们跳过这个窗口,而是直接在梯形图模式下编写逻辑。
    单击“完成”。

    现在,根据上述设定条件生成以下梯形图逻辑。

    每次收到发送的请求时,都会执行梯级 2 中的梯形图。 每次从驱动器读取或写入任何数据后,都会执行梯级 3 中的梯形图。 现在,在进一步编写启动和停止电机及其速度控制的逻辑之前,我们需要找出执行该逻辑的驱动器的 Modbus 地址。 对于 VFD-L 系列,2000H 是用于启动和停止变频器的 Modbus 地址,2001H 是用于频率更改的 Modbus 地址。 这里,H 表示十六进制。 在本主题中,我们将使用十进制格式表示特定地址。 所以必须将十六进制格式改为十进制格式。
    通过 8421 代码,我们将转换如下:
    2000(十六进制)= 8192(十二月) 2001(十六进制)= 8193(十二月) 因此,将使用 8192K 和 8193K,而不是 200H 和 2001H。 确保 8192 和 8193 仅是 Modbus 地址。
    如果 8192K 的值等于 10,则电机将启动。 如果 8192K 的值等于 1,则电机将停止。 如果 8193K 的值等于 5000,则电机将以 50 Hz 运行,这意味着如果电机的速度需要增加 1 Hz,则必须在现有值上添加 100,反之亦然。 PLC 程序说明
    现在,我们来详细了解 PLC 程序。 每次向梯级 5 中的 VFD 发出任何命令时,都会设置发送请求位 M1122。
    MODRW K2 K6 K8192 D70 K1
    MODRW 代表 Mod 读写 K2 代表变频器的站地址。 K6/K3 代表功能码是写还是读。 这里 k6 代表写入。 K8192 代表写入数据的 Modbus 地址 D70 中的数据写入 k8192 K1 是数据长度
    当梯级 6 和 7 中给出启动和停止命令时,10(十进制)和 1(十进制)被移至 D70。同时,数据传输发生,即将 D70 中的数据写入 VFD 的 8192k 地址。 梯级 8 用于启动和停止电机。
    当接收到速度增加脉冲 (M4) 时,将 100(十进制)添加到梯级 10 中的 D100 值,以将速度增加 1 Hz。 当接收到速度减小脉冲 (M5) 时,从梯级 9 中的 D100 值中减去 100(十进制),将速度减小 1 Hz。
    同时进行数据传输,即将 D100 中的数据写入梯级 11 中 VFD 的 8193k 地址,以启动和停止电机。

    人机界面
    现在,进入 HMI 配置。
    选择 HMI 型号后,设置如下配置,PLC 到 HMI 的配置是在 RS232 上。 (需根据 HMI 型号进行配置)

    取四个瞬时按钮,分配地址,设计 HMI 屏幕如下:

    开始 = M0 停止 = M1 增加速度 = M4 降低速度 = M5 测试流程 本文不涉及 HMI 设计。

    leikang
    根据下面给出的逻辑开发工业自动化上的 PLC 编程示例,
    当按下启动按钮时,锯、风扇和油泵都会启动。
    如果锯的运行时间少于20秒,锯关闭时油泵应关闭,锯关闭后风扇应再运转5秒。
    如果锯已运行超过 20 秒,风扇应保持打开状态,直至通过单独的风扇重置按钮重置,并且锯关闭后油泵应再保持打开 10 秒。
    编写一个 PLC 程序来实现这个过程。
    PLC 编程实例

    程序说明:
    梯级 0000:
    启动/紧急停止 PB 用存储器 B3:0/0 锁存。
    梯级 0001:
    B3:0/0 启用以打开锯 (O: 0/0)、风扇 (O: 0/1) 和油泵 (O:0/2)。
    停止开关的常闭触点串联锯齿输出以关闭。
    风扇复位开关和定时器T4:0连接,当条件满足时关闭风扇。
    定时器T4:2做了位和记忆位就是关闭油泵。
    梯级 0002:
    当按下停止按钮时,根据第 2 点提到的逻辑,风扇输出(O:0/2)需要在 5 秒后关闭。
    比较器块限制定时器 T4:0 在 Saw 操作 20 秒后运行。
    梯级 0003:
    当按下开始按钮时,定时器 T4:1 开始运行。当 20 秒后的任意时刻按下停止按钮时,Saw 输出将关闭。
    10秒后,油泵将关闭。该操作由定时器T4:2完成。定时器 T4:0 完成位用于在 T4:0 为 ON 时限制定时器T4:1 的操作。
    梯级 0004:
    少于一个比较器块用于执行第2点中提到的逻辑,以在锯齿输出操作少于20秒时关闭风扇。
    程序输出:
    现在我们看到上述梯形图逻辑在不同条件下的模拟,如下所述。
    当按下开始 PB 时

    当停止开关在 20 秒之前按下时

    20秒后按下停止开关时

    当按下风扇复位开关时

    结论:
    我们可以通过这个例子来理解 Allen Bradley PLC 中的编程逻辑。

    leigehong
    适合初学者使用施耐德电气 EcoStruxure Machine Expert 基本 PLC 软件进行多电机控制的 PLC 编程示例。
    请注意,此 PLC 示例适用于有兴趣学习和练习 PLC 练习的工程专业学生。实时工业PLC程序将设计出更多的安全和保护功能。
    多电机 PLC 编程实例
    为以下应用设计PLC 梯形逻辑。
    我们使用三个拨动开关来控制三个电机。
    如果开关 1 打开,则电机 I、电机 II 和电机 III 将打开。
    如果开关 2 打开,则电机 I 和电机 II 将打开。
    如果开关 3 打开,则电机 I、电机 II 和电机 III 将关闭。
    数字输入
    本示例程序需要以下数字输入 (DI) 。还提到了分配的 PLC DI 地址。
    开关1:I0.0
    开关2:I0.1
    开关3:I0.2
    数字输出
    本示例程序需要以下数字输出 (DO)。还提到了分配的PLC DO 地址。
    电机1:Q0.0
    电机2:Q0.1
    电机3:Q0.2
    多电机控制梯形图

     
    计划说明
    对于此应用,我们使用 Ecostruxure Machine Expert Basic v1.2 软件进行编程。
    在上面的程序中,我们对开关 1 (I0.0) 使用常开触点,对开关 2 (I0.1) 和开关 3 (I0.2) 使用常闭触点
    电机1和电机2的开关1和开关3串联,从而实现与逻辑门。
    对于电机3,开关1、开关2和开关3串联,从而实现与逻辑门。
    要打开电机 1 和电机 2,开关 1 应打开,开关 3 应关闭。
    当开关 1 为 ON,开关 2 和开关 3 为 OFF 时,电机 3 为 ON。
    打开开关 3 将关闭所有电机,即电机 1、电机 2 和电机 3 将关闭。
    当开关 2 打开时,电机 3 将关闭。
    当开关 1 接通时,所有电机都将接通,因为电流也会通过开关 2 和开关 3,因为它们是常闭触点。
    如果不关闭开关 1,电机 1 和电机 2 仍将保持开启状态,但当开关 2 开启时,电机 3 将关闭。打开开关 2 时,它不会将电流传递到电机 3。
    当开关 3 打开时,即使其他开关打开,所有电机也会关闭。
    当开关 1 为 ON 时
    当开关 1 处于真实状态时,电流流过它。在错误状态下,开关 3 和开关 4 还将电流传递至输出。

    当开关 2 为 ON 时
    当开关2接通时,电流不流过。在真实状态下,常闭触点会断开电路。

    当开关 3 打开时
    开关 3 是常闭触点。当打开时,它不会允许电流通过。结果,没有一个输出会打开。


    leigehong
    有许多控制情况需要在 PLC 中实现某种逻辑功能条件组合时启动动作。
    PLC 逻辑功能
    例如,对于自动钻孔机,可能存在这样的情况:当限位开关被激活时,指示工件的存在以及钻孔位置位于工件的表面处,钻孔电机将被激活。
    这种情况涉及 AND 逻辑功能,条件 A和 条件 B 都必须实现才能发生输出。本节是对此类逻辑函数的考虑。  
    PLC 和逻辑
    图 1.7a 显示了一种情况,除非两个常开开关都闭合,否则输出不会通电。开关 A 和开关 B 都必须闭合,从而给出 AND 逻辑情况。
    我们可以将其视为具有两个输入 A 和 B 的控制系统(图 1.7b)。只有当A和 B都导通时才有输出。因此,如果我们使用 1 表示开启信号,使用 0 表示关闭信号,那么为了得到 1 输出,我们必须让 A 和 B 都为 1。
    这种操作据说是由逻辑门控制的,并且逻辑门的输入和输出之间的关系以称为真值表的形式列出。因此对于与门我们有:

    与门的一个例子是机床的联锁控制系统,因此只有在安全防护装置就位并且电源打开时才能操作。
    图 1.8a 显示了梯形图上的与门系统。梯形图以 jj 开始,jj 是一组常开触点,标记为输入 A,代表开关 A,并与其串联 jj,另一组常开触点,标记为输入 B,代表开关 B。
    然后该行以 O 结尾以表示输出。为了有输出,输入 A 和输入 B 都必须发生,即输入 A 和输入 B 触点必须闭合(图 1.8b)。一般来说:
    在梯形图上,水平梯级中的触点(即串联触点)表示逻辑“与”运算。

    PLC 或逻辑
    图 1.9a 显示了一个电路,当开关 A 或 B(均为常开)闭合时,输出通电。
    这描述了“或”逻辑门(图 1.9b),其中输入 A 或输入 B 必须打开才能有输出。
    真值表为:

    图 1.10a 在梯形图上显示了 OR 逻辑门系统,图 1.10b 显示了绘制同一图的等效替代方法。
    梯形图以 jj 开始,常开触点标记为输入 A,代表开关 A,与它并联的是 jj,常开触点标记为输入 B,代表开关 B。
    输入 A 或输入 B 必须闭合才能使输出通电
    (图 1.10c)。然后该行以 O 结尾以表示输出。一般来说:
    由梯形图主梯级的垂直路径提供的替代路径,即并行路径表示逻辑“或”运算。
    或门控制系统的一个示例是将瓶装产品运输到包装的传送带,如果重量不在一定的公差范围内或瓶子上没有盖子,则激活偏转板将瓶子偏转到废品箱中。

    PLC 非逻辑
    图 1.11a 显示了由常闭开关控制的电路。当开关有输入时,它打开,电路中就没有电流。
    这说明了非门,没有输入时有输出,有输入时没有输出(图 1.11c)。门有时被称为反相器。
    真值表为:

    图 11.11b 显示了梯形图上的非门系统。输入 A 触点显示为常闭。
    它与输出 ( ) 串联。由于输入 A 没有输入,触点闭合,因此有输出。当输入 A 有输入时,它打开,然后没有输出。
    非门控制系统的一个例子是当天黑时亮起的灯,即当没有光输入到光传感器时有输出。

    PLC 与非逻辑
    假设我们在 AND 门后面跟随一个 NOT 门(图 1.12a)。使用非门的结果是反转与门的所有输出。
    另一种方法是在每个输入上放置一个“非”门,然后使用“或”(图 1.12b),它可以给出完全相同的结果。
    出现相同的真值表,即:

    输入 A 和 B 都必须为 0,输出才会为 1。
    当输入A和输入B不为1时有输出。
    这些门的组合称为“与非”门(图 1.13)。

    与非门控制系统的一个例子是,如果机床的安全防护开关尚未激活并且发出工件存在信号的限位开关尚未激活,则警告灯就会亮起。
    PLC 或非逻辑
    假设我们在“或”门之后跟随一个“非”门(图 1.14a)。
    使用非门的结果是反转或门的输出。
    另一种方法可以给出完全相同的结果,即在每个输入上放置一个“非”门,然后为结果反转的输入放置一个“与”门(图 1.14b)。
    下面是得到的真值表:

    或非门的组合称为或非门。当输入 A 或输入 B 都不为 1 时,就有输出。
    图 1.15 显示了 NOR 系统的梯形图。
    当输入 A 和输入 B 均未激活时,输出为 1。当 X400 或 X401 为 1 时,输出为 0。

    PLC 异或 (XOR) 逻辑
    当一个或两个输入均为 1 时,或门给出输出。
    然而,有时需要一个门,当其中一个输入为 1 时给出输出,但当两个输入均为 1 时则不给出输出,即具有真值表:

    这样的门称为“异或”门或“异或”门。
    获得这种门的一种方法是使用 NOT、AND 和 OR 门,如图 1.16 所示。

    图 1.17 显示了异或门系统的梯形图。当输入 A 和输入 B 未激活时,输出为 0。
    当仅激活输入 A 时,上分支导致输出为 1。当仅激活输入 B 时,下分支导致输出为 1。
    当输入A和输入B同时激活时,没有输出。
    在此逻辑门示例中,输入 A 和输入 B 在电路中具有两组触点,一组常开,另一组常闭。
    通过 PLC 编程,每个输入可以根据需要拥有任意多组触点。

    PLC 专用或非 (XNOR) 逻辑


    leizuofa
    梯形图 (LD) 编程
    PLC编程最常用的语言是梯形图 (LD),也称为继电器梯形逻辑 (RLL)。
    这是一种图形语言,显示输入和输出之间的逻辑关系,就好像它们是硬连线机电继电器电路中的触点和线圈一样。
    发明这种语言的明确目的是让熟悉基于继电器的逻辑和控制电路的电工感到“自然”的 PLC 编程。尽管梯形图编程有许多缺点,但它在工业自动化中仍然非常流行。
    每个梯形图程序都被安排为类似于电气图,使其成为一种图形(而不是基于文本)的编程语言。
    梯形图被认为是虚拟电路,其中虚拟“电源”流经虚拟“触点”(闭合时)以激励虚拟“继电器线圈”以执行逻辑功能。
    梯形图 PLC 程序中看到的触点或线圈都不是真实的;相反,它们作用于 PLC 存储器中的位,这些位之间的逻辑相互关系以类似于电路的图表的形式表达。在个人电脑上编辑:
    梯形图编程
    以下计算机屏幕截图显示了典型的梯形图程序。

    触点的出现就像在继电器逻辑图中一样——由水平空间分隔的短垂直线段。
    常开触点在线段之间的空间内是空的,而常闭触点具有穿过该空间的对角线。
    线圈有些不同,要么显示为圆圈,要么显示为一对括号。其他说明显示为矩形框。
    每条水平线称为一个梯级,就像梯子上的每个水平台阶称为一个“梯级”一样。
    正如此屏幕截图所示,梯形图程序编辑器的一个共同功能是能够用颜色突出显示虚拟“电路”中准备“传导”虚拟“电源”的虚拟“组件”。
    在这个特定的编辑器中,用于指示“传导”的颜色是浅蓝色。
    在此 PLC 程序中看到的另一种状态指示形式是 PLC 内存中某些变量的值,以红色文本显示。
    例如,您可以在屏幕右上角看到线圈 T2 通电(充满浅蓝色),而线圈 T3 则未通电。
    相应地,每个常开 T2 触点都显示为彩色,指示其“闭合”状态,而每个常闭 T2 触点则为无色。
    相比之下,每个常开 T3 触点均未着色(因为线圈 T3 未通电),而每个常闭 T3 触点则显示为彩色以指示其导电状态。
    同样,定时器T2和T3的当前计数值分别示出为193和0。数学指令框的输出值恰好是2400,也以红色文本显示。
    当然,梯形图元件的颜色突出显示仅在运行程序编辑软件的计算机连接到 PLC 并且 PLC 处于“运行”模式(并且启用了编辑软件的“显示状态”功能)时有效。 )。
    否则,梯形图只不过是白底黑字。
    状态突出显示不仅在调试PLC 程序时非常有用,而且当技术人员分析 PLC 程序以检查连接到 PLC 的实际输入和输出设备的状态时,它还具有宝贵的诊断目的。
    当通过计算机网络远程查看程序状态时尤其如此,使维护人员甚至无需靠近 PLC 即可调查系统问题!

    caixiaofeng
    可编程逻辑控制器用于输入各种信号类型(离散信号、模拟信号),对这些信号执行控制算法,然后输出信号以响应控制过程。PLC 本身通常缺乏向操作员显示这些信号值和算法变量的能力。
    拥有个人计算机和编辑PLC程序所需软件的技术人员或工程师可以连接到PLC并“在线”查看程序状态以监控信号值和变量状态,但这对于操作人员来说不是一个实用的方法定期监控 PLC 的运行情况。
    为了让操作员监视和调整PLC 内存内的参数,我们需要一种不同类型的接口,允许读取和写入某些变量,而不会暴露太多信息或允许任何不合格的人更改程序,从而损害 PLC 的完整性。本身。
    此问题的一种解决方案是专用计算机显示器,该显示器经过编程以提供对 PLC 存储器中某些变量的选择性访问,通常称为人机界面或 HMI。
    HMI 可以采用运行特殊图形软件来与 PLC 连接的通用(“个人”)计算机的形式,也可以采用设计为安装在金属板面板正面的专用计算机的形式,除了操作员-PLC 界面外不执行任何任务。
    第一张照片显示了运行 HMI 软件的普通个人计算机 (PC) 的示例:

    这里显示的显示屏恰好用于监控一个示例,即用于纯化从环境空气中提取的氧气的真空变压吸附 (VSA) 过程。在某个地方,PLC(或 PLC 集合)正在监视和控制该 VSA 过程,HMI 软件充当 PLC 内存的“窗口”,以易于操作人员解释的形式显示相关变量。运行该 HMI 软件的个人计算机通过以太网等数字网络电缆连接到 PLC。
    注意:操作员界面面板的旧术语是“人机界面”或“MMI”。
    下一张照片显示了专门设计和构建用于工业操作环境的专用 HMI 面板的示例:

    这些 HMI 面板实际上只不过是“强化”个人计算机,坚固耐用且结构紧凑,以方便在工业环境中使用。
    大多数工业 HMI 面板都配备了触摸屏,操作员可以将指尖按在显示的对象上以更改屏幕、查看过程各部分的详细信息等。

    技术人员和/或工程师对 HMI 显示器进行编程,以通过数字网络向一个或多个 PLC 读取和写入数据。
    HMI 显示屏上排列的图形对象通常模仿现实世界的指示器和开关,以便为操作人员提供熟悉的界面。
    例如,HMI 面板表面上的“按钮”对象将被配置为将一位数据写入 PLC,其方式类似于现实世界中的开关将一位数据写入 PLC 的输入寄存器。
    现代 HMI 面板和软件几乎完全基于标签,屏幕上的每个图形对象都与至少一个数据标签名称相关联,而数据标签名称又通过标签与 PLC 中的数据点(位或字)相关联名称驻留在 HMI 中的数据库文件。
    HMI 屏幕上的图形对象要么接受(读取)来自 PLC 的数据以向操作员提供有用信息,要么从操作员输入向 PLC 发送(写入)数据,或者两者兼而有之。
    对 HMI 单元进行编程的任务包括构建标签名称数据库,然后绘制屏幕以按照操作员运行该过程所需的详细程度来说明该过程。
    此处显示了现代 HMI 标签名称数据库表的示例屏幕截图:

    使用相同的软件访问和编辑标签名称数据库,以在 HMI 中创建图形图像。
    根据此示例,您可以看到与 PLC 内存中的数据点关联的多个标签名称(例如,启动按钮、电机运行定时器、错误消息、电机速度)(在本例中,PLC 地址以Modbus寄存器格式显示)。
    在许多情况下,标签名称编辑器能够以与 PLC 编程编辑器软件中显示的方式相同的方式显示相应的 PLC 存储点(例如 I:5/10、SM0.4、C11 等)。
    在此标签名称数据库显示中需要注意的一个重要细节是每个标签的读/写属性。
    特别注意显示的四个标签是只读的:这意味着 HMI 仅有权从 PLC 内存中读取这四个标签的值,而不能写入(更改)这些值。
    在这四个标签的情况下,原因是这些标签引用 PLC 输入数据点。例如,START PUSHBUTTON 标签指的是 PLC 中由真实按钮开关供电的离散输入。
    因此,该数据点从离散输入端子的通电中获取其状态。如果向 HMI 授予对此数据点的写入权限,则可能会发生冲突。
    假设 PLC 上的输入端子已通电(将 START PUSHBUTTON 位设置为“1”状态),并且 HMI 同时尝试将“0”状态写入同一标签。
    这两个数据源之一会获胜,而另一个会失败,可能会导致 PLC 程序出现意外行为。
    因此,PLC 中与实际输入相链接的数据点应始终被限制为 HMI 数据库中的“只读”权限,因此 HMI 不可能产生冲突。
    然而,数据库中的其他一些点也存在数据冲突的可能性。
    一个很好的例子是电机运行位,它是 PLC 程序中告诉实际电机运行的位。
    据推测,该位从 PLC 梯形图程序中的线圈获取数据。然而,由于它也出现在具有读/写权限的HMI 数据库中,因此HMI 可能会覆盖(即冲突)PLC 内存中的同一位。
    假设有人在链接到此标签的 HMI 中编写了一个切换“按钮”屏幕对象:按下 HMI 屏幕上的此虚拟“按钮”将尝试设置该位 (1),再次按下它将尝试重置该位 (0 )。
    然而,如果 PLC 程序中的线圈正在写入同一位,则存在明显的可能性,即 HMI 的“按钮”对象和 PLC 的线圈将发生冲突,即试图告诉该位为“0”,而另一个试图告诉该位为“1”。
    这种情况与梯形图程序中的多个线圈寻址到同一位时遇到的问题非常相似。
    这里要遵循的一般规则是绝不允许多个元素写入任何数据点。根据我教授 PLC 和 HMI 编程的经验,这是学生第一次学习 HMI 编程时最常见的错误之一:他们会尝试将 HMI 和 PLC 写入相同的内存位置,但会产生奇怪的结果。
    在对大型复杂系统进行编程时,您将学到的教训之一是,在开始在 HMI 中布局图形之前定义所有必要的标签名称非常有益。
    PLC 编程也是如此:如果您在之前花时间定义所有必要的 I/O 点(以及标签名称,如果 PLC 编程软件支持编程环境中的标签名称),那么整个项目会更快且更少混乱。您开始创建任何代码,指定这些输入和输出如何相互关联。
    保持标签名称的一致约定也很重要。例如,您可能希望将每个硬连线 I/O 点的标签名称开头为 INPUT 或 OUTPUT(例如 INPUT PRESSURE SWITCH HIGH、OUTPUT SHAKER MOTOR RUN 等)。
    维持严格命名约定的原因一开始并不明显,因为标签名称的全部目的是让程序员可以自由地为系统中的数据点分配任意名称。
    但是,您会发现大多数标签名称编辑器按字母顺序列出标签,这意味着以这种方式组织的命名约定将在列表中连续(相邻)显示所有输入标签,在列表中连续显示所有输出标签,并且很快。
    利用按字母顺序排列的标签名称列表的另一种方法是,每个标签名称以描述其与主要设备关联的单词开头。
    以这个过程为例,该过程具有在 PLC 控制系统中定义并在 HMI 中显示的多个数据点:

    如果我们按字母顺序列出所有这些标签,那么它们之间的关联就会立即显而易见:
    交换器污水泵 交换器出水温度 交换器预热泵 交换器预热温度 交换器预热阀 反应器床温 反应器进料流量 反应器进料温度 反应釜夹套阀 从该标签名称列表中可以看出,所有与热交换器直接关联的标签都位于一个连续组中,所有与反应器直接关联的标签都位于下一个连续组中。
    通过这种方式,明智的标签命名有助于以分层方式对它们进行分组,使程序员可以轻松地在将来的任何时间在标签名称数据库中找到它们。
    您会注意到,此处显示的所有标签名称在单词之间都缺少空格字符(例如,标签名称应使用连字符或下划线作为间隔字符,而不是“Reactor bed temp”:“Reactor bed temp”),因为通常假定空格由计算机编程语言来进行分隔符(不同变量名之间的分隔符)。
    与可编程逻辑控制器本身一样,HMI 的功能一直在稳步增强,而价格却在下降。
    现代 HMI 支持图形趋势、数据归档、高级报警,甚至网络服务器功能,允许其他计算机通过广域网轻松访问某些数据。
    HMI 能够长时间记录数据,从而使 PLC 不必执行这项非常占用内存的任务。
    这样,PLC仅将当前数据“提供”给HMI,而HMI能够使用其更大的内存储备来记录当前和过去的数据。
     如果HMI基于个人计算机平台(例如Rockwell RSView、Wonderware、FIX/Intellution软件),它甚至可以配备硬盘驱动器以存储大量历史数据。
    一些现代的 HMI 面板甚至在设备内部内置了 PLC,在同一设备中提供控制和监控。
    此类面板为离散甚至模拟 I/O 提供端子排连接点,允许所有控制和接口功能位于单个面板安装单元中。

    leigehong
    在对 PLC 进行编程时,可以使用不同的块结构,这些块包括功能 FC、功能块 FB 和数据块 DB。这些块是非常方便的工具,您可以使用它们更好地设计 PLC 逻辑,并使您的代码更具可读性并且易于遵循和调试
    在之前的文章中,我们讨论了 FC 和 FB。在本文中,我们将讨论数据块 DB,更具体地说是全局数据块。
    内容:
    什么是数据块 DB? 数据块的类型。 什么是全局数据块? 创建全局数据块? 使用全局数据块。 示例模拟。 什么是数据块?
    数据块 DB 是用于保存 PLC 程序执行期间写入的参数值的存储区域。
    与代码块相反,数据块 DB 仅包含变量声明。它没有像 FC 或 FB 那样的任何网络或指令。DB 的结构由您在数据块内声明的变量数量定义。
    PLC 中数据块的类型
    数据块有两种类型:
    全局数据块 实例数据块 ARRAY 数据块 全局数据块
    顾名思义,全局数据块是为整个 PLC 逻辑进行全局声明的。它没有分配给特定的代码块。您可以从 PLC 逻辑中任何位置的任何代码块访问全局数据块的值。全局数据块仅包含静态标签。
    全局数据块的结构可以自由定义。在数据块的声明表中,声明要包含在全局数据块中的数据元素。
    实例数据块
    背景数据块直接分配给功能块 FB,无论该功能块是在 PLC 中内部定义的(如定时器和计数器)还是用户定义的功能块 FB。
    背景数据块的结构不能自由定义,而是由功能块的接口确定。背景数据块恰好包含在功能块接口中声明的那些块参数和标记。
    但是,您可以在实例数据块中定义特定于实例的值;例如,声明的标签的起始值。
    数组数据块
    ARRAY 数据块仅适用于 S7-1500 CPU,是由 ARRAY 组成的全局数据块。该数组可以基于任何数据类型。
    例如,PLC 数据类型 (UDT) 的 ARRAY 是可能的。除了 ARRAY 之外,DB 不包含其他元素。由于其扁平结构,ARRAY 数据块便于访问 ARRAY 元素并将其传输到被调用的块。
    “指令”任务卡的“移动操作”部分提供了用于寻址 ARRAY DB 的选项。
    在本文中,我们将讨论全局数据块,我们将在单独的文章中讨论其他两种类型。
    什么是全局数据块?
    数据块用于存储 PLC 程序数据。这意味着它们包含用户程序使用的变量数据。全局数据块存储可供所有其他块使用的数据。
    数据块的最大大小根据 CPU 的不同而变化。您可以用任何您喜欢的方式定义全局数据块的结构。
    您还可以选择使用 PLC 数据类型 (UDT) 作为创建全局数据块的模板。
    每个功能块 FB、功能 FC 或组织块 OB 都可以从全局数据块读取数据,或者本身可以将数据写入全局数据块。即使退出数据块后,该数据仍保留在数据块中。见图1。

    图 1 – 访问全局数据块
    从上图可以看出,全局数据块可以从 PLC 程序内的任何代码块访问,而背景数据块只能由关联的功能块访问。
    创建全局数据块
    创建全局数据块的方式与创建功能 FC 或功能块 FB 的方式相同。从将新块添加到项目树中。见图2。

    图 2 – 创建全局数据块
    让我们在全局数据块中声明一些变量。
    您可以通过单击名称下的“添加新”部分,写入所需的变量名称,然后选择变量数据类型来完成此操作。见图3。

    图 3 – 全局数据块中的变量声明
    使用全局数据块
    声明一个标签。 我们已经在图 3 中展示了如何声明标签/变量。
    定义起始值 标记的起始值是您定义的值,标记在 CPU 启动后采用该值。该值必须与标签的数据类型匹配,并且不应超出数据类型的范围。见图4。
    标签在启动时采用定义的值,前提是它没有声明为保持性。

    图 4 – 定义标签的起始值
    因此,如果我将 Tank1Level 起始值设置为零以外的任何值,则下次重新启动 PLC 时将应用该值。见图5。

    图 5 – 定义变量的起始值
    保留全局数据块中的变量 为了防止断电时数据丢失,您可以将数据标记为保持性。该数据存储在保持性存储区域中。
    设置保留的选项取决于数据块的类型和设置的块访问的类型。见图6。

    图 6 -. 全局数据块中保留选项
    如图 6 所示,Tank2Level 变量设置为保留值,这意味着即使 PLC 停止或断电,当 PLC 再次启动时,Tank2Level 也会存储相同的数据。它不会重置为起始值。
    与 HMI 的可访问性 在全局数据块中,您可以定义变量在 HMI 变量表中是否可见。您还可以定义是否可以从 HMI 读取或写入该变量。见图7。

    图 7 – HMI 的可访问性
    全局数据块中任何声明的变量的默认设置是可以从 HMI 访问、读取和写入。如果您想对某个变量禁用此功能,则必须取消选中该变量的辅助功能选项。
    模拟示例
    到目前为止我们创建了一个全局数据块并在里面声明了一些变量。
    现在我们将尝试运行该程序的模拟,看看我们是否可以更好地理解全局数据块是什么。
    下面提供了两个 PLC 仿真。
    测试变量的起始值
    检查以下动画,解释全局数据块内变量的起始值。

    动画1
    动画1说明:
    储罐液位参数的起始值为零,您可以在视频中看到它们正在通过模拟屏幕进行更改。 当 PLC 重新启动、断电然后再次上电时,您会看到这些值将重置为起始值为零。 之后,起始值分别更改为500、32654和-356,并且当PLC重新启动时,这些值更改为新的起始值。 请注意,当我们更改起始值时,我们必须再次将逻辑下载到 PLC;每次更改逻辑时都需要这样做。 测试全局 DB 中变量的保留选项
    检查以下动画,解释全局数据块内变量的保留选项。

    动画2
    动画2说明:
    首先,您会注意到 Tank2Level 的 Retain 属性现在处于活动状态。 您在视频中看到 3 个水箱的值正在改变。 当 PLC 停止然后再次启动时,Tank1Level 和 Tank3Level 重置回起始值 0,但 Tank2Level 保留其值 -22938 结论
    全局数据块可以由 PLC 程序中存在的任何块从任何地方访问。您可以在全局数据库中声明任意数量的变量。
    最佳实践技术是为逻辑的不同部分创建单独的数据块,以便非常容易地遵循您的逻辑。例如,需要由 HMI 读取或写入的所有变量的单独数据块。

    leigehong
    在之前的文章中,我们讨论了 PLC 中的定时器、不同类型以及如何使用它们。计时器实际上并不需要实时工作,因为它们只是根据您的设置来计算秒或毫秒。
    但对于某些应用,您需要了解 PLC 程序的真实日期和时间,例如出于诊断目的。
    在这篇文章中,我们将讨论 PLC 的系统和本地时间。
    内容:
    为什么 PLC 需要实时性? 示例程序和模拟 什么是系统时间? 当地时间是几点? 结论。 为什么我需要 PLC 中的实时功能?
    在 PLC 的许多应用中,出于多种不同的原因,您需要了解进程运行时的实时情况。
    以下是其中一些原因:
    将 PLC 备份到主服务器。 对于 PLC 的诊断,需要有诊断的时间记录,以了解某一事件发生的时间,否则诊断信息就没有多大用处。 对于需要使用时间中断 OB10 的应用程序,您需要知道实际时间。 您可能需要在需要处理实时应用程序的逻辑部分中使用本地时间或系统时间。 对于数据记录,如果您有重要的数据要保存,并且需要每次数据记录的时间戳,那么您需要为 PLC 设置正确的时间,以便存储的数据有意义。 PLC 示例程序和仿真
    为了更好地理解什么是 PLC 中的系统时间和本地时间,我们将从创建一个非常简单的程序开始,并用它来解释 PLC 内部实时的概念。
    检查以下步骤:
    在本文中,我们不会创建任何 PLC 逻辑,但我们会展示 PLC 中与系统和本地时间相关的一些配置,如何设置它们,以及有什么区别。
    打开西门子 Tia Portal,添加一个新设备,这次我们将使用 CPU 1512C-1 PN。见图1。

    图 1 – 添加新 PLC
    编译并启动新的 PLC 仿真。打开在线&诊断页面,查看PLC的设定时间。见图2。

    图 2 - PLC 在线时间
    从上图可以看到有两个不同的时间:
    PG/PC 时间 – 这是您的 PC 本身的本地时间。 模块时间 – 这是 PLC 本身内部的实际时间。 这两个时间可以设置为相同的值,也可以设置为不同的值。最好使它们相同,最好使模块时间与您的本地时间相似,或者更具体地说与将使用 PLC 的地区的本地时间相似。见图3。

    图 3 - PLC 设定时间
    如果您希望模块时间与本地时间相同,请选择从 PG/PC 获取并按应用。
    在主 OB1 中,拖放 RD_SYS_T 和 RD_LOC_T 指令。
    这些是读取系统时间和读取本地时间指令。这些指令是 PLC 内部的内置功能 FC,用于将 PLC 的本地时间和系统时间写入指令输出 OUT 中选择的目的地。见图4。

    图 4 – 添加读取系统和当地时间指令
    添加一个新的全局数据块,并定义一些要使用的标签。见图5。

    图 5 – 创建一个新的全局数据块
    再次运行模拟并检查两次。见图6

    图 6 PLC 在线本地时间和系统时间
    从上图中可以看出,PLC 的本地时间和系统时间是相同的,但与 PC 机的实际本地时间不同。
    如果您还记得的话,我们已将 PLC 的模块时间设置为与 PG/PC 时间类似,即您的本地时间。见图7。

    图 7 – 模块时间和 PG/PC 时间
    如您所见,在设置时间页面上,模块时间选择从 PG/PC 时间获取。但在实际情况中,它们是不同的。为什么?
    为什么时代不同? 由于 PLC 本地时间的默认设置是 UTC+0 或 Zulu 时间(如果您熟悉该术语),因此您无需从在线和诊断页面更改它,而是从 PLC 本身的属性更改。见图8。

    图 8 – PLC 中的时间配置
    如您所见,PLC 时间的默认设置设置为 UTC+0 时间,这就是 PLC 模块时间与实际本地时间不同的原因。除非您实际上在伦敦,否则您不会遇到这个问题。
    为了更正 PLC 本地时间,我们必须在配置中更改它,我们需要将时区更改为我们拥有的时区,在我的例子中是 UTC+02:00。见图9。

    图 9 – 将 PLC 本地时间调整为您所在的时区
    您还可以看到夏令时选项已被停用,因为它在我的国家/地区没有使用。如果您所在地区使用它,则必须激活它。
    现在所有配置均已正确设置,返回并在模拟中再次查看本地时间和系统时间。见图10。

    图 10 – PLC 的本地时间现在与 PC 相同
    现在你看到调整 PLC 时区后,PLC 的本地时间和你所在地区的实际本地时间是一样的。
    正如我们之前所说,由于我们上面提到的许多原因,设置正确的 PLC 本地时间非常重要。您现在可以定义 PLC 的系统时间和本地时间吗?
    PLC 中的系统时间
    是 CPU 时钟的模块时间。
    CPU 时钟将模块时间解释为协调世界时 (UTC)。因此,模块时间的存储始终不包含 CPU 时钟中的“本地时区”或“夏令时”因素。然后 CPU 时钟根据模块时间计算 CPU 时钟的本地时间。
    CPU 时钟的模块时间用作从 CPU 开始的所有时间处理的模板。
    使用示例:
    根据模块时间计算 CPU 时钟本地时间 “在线与诊断” 下以当地时间表示模块时间 CPU 诊断缓冲区中的条目 PLC 当地时间
    有关时区以及夏令时和标准时间开始的信息(这些信息已在 CPU 时钟配置中设置)用于输出本地时间。
    本地时间是指您的电脑上或您所在国家/地区的时间,不同地区的时间会有所不同。
    结论
    许多应用要求 PLC 了解过程的实时或本地时间,以便能够执行某些任务,例如数据记录和诊断任务。在以后的文章中,我们将展示一些逻辑需要实时的应用程序
    应手动配置 PLC 的本地时间,以匹配 PLC 的使用区域。

    leigehong
    在之前的文章中,我们讨论了 SIEMENS TIA Portal 中的不同类型的块,其中讨论了功能块 FB、功能 FC 和数据块 DB。
    在本文中,我们将讨论西门子 PLC 中的另一种类型的块,这些是组织块,在本文中,我们将讨论其中最重要的组织块,即主组织块或 OB1。
    内容:
    什么是组织块? 不同类型的 OB。 什么是 OB1? 周期时间监控。 简单的程序示例。 结论。 什么是组织块 (OB)?
    组织块,您可以将它们视为功能 FC 或功能块 FB。但不同的是,你不调用它们,PLC 的操作系统调用这些组织块,无论操作系统将 OB 作为 OB1 循环调用还是在某个事件发生时调用,无论哪种方式,操作系统 照顾它。您只需要创建块并在块内添加您想要的任何逻辑。有时,您甚至不需要在 OB 中添加任何代码,只需创建 OB 本身就可以提供许多好处,我们将在讨论其中一些 OB 时看到这些好处。
    组织块是 PLC 操作系统和用户程序之间的接口。任何 PLC 都会有两个不同的程序,运行程序是 PLC 的操作系统,用户程序是 PLC 程序员编写的用于控制某个过程的逻辑或代码。这两个不同的软件需要相互通信,而组织块 OB 就是如何完成此操作的。
    组织块 OB 用于执行许多任务,下面列出了其中一些任务:
    自动化系统的启动特性 循环程序处理 中断驱动程序执行 错误处理。 不同类型的组织块
    因为组织块基本上是操作系统执行许多任务的工具。
    不同的任务需要不同的 OB,这就是为什么 PLC 内部有许多不同的 OB,有多少不同的 OB 将取决于您使用的 PLC 类型,但以下是您几乎可以在所有 PLC 中找到的一些最常见的 OB。西门子 PLC:
    主循环 OB1。 时间会中断 OB。 一天中的时间 OB。 软件错误 OB。 硬件错误 OB 还有更多的组织块可用于您的逻辑。见图1。

    图 1 – TIA Portal 中提供的不同组织块
    在本文中,我们将讨论其中最重要的组织块,即主循环中断 OB1。
    主循环中断 OB1
    主循环 OB1 是负责由 PLC 循环执行逻辑的组织块。每当您创建新项目并添加 PLC 时,软件都会自动创建主 OB1。这些是 PLC 代码所需的最少块。见图2。

    图 2 – 主OB1自动创建
    在此主 OB1 中,如果项目很小,您可以编写整个 PLC 程序。如果您的项目相当大,那么您可能需要执行一些功能块 FB 的功能 FC。在这种情况下,您将使用主 OB1 来调用它们。
    当然,您不必通过 OB1 调用每个 FC 或 FB,但如果您的 OB1 不是嵌套调用的第一个块,则它将不会被执行。见图3。

    图 3 – 通过 OB1 调用您的块
    PLC 代码的基本基础是循环行为,这意味着您需要连续执行代码。当逻辑处理完成后,操作系统将再次开始处理它。这是通过使用主 OB1 来完成的,您可以在该 OB1 中放置和调用所有逻辑和代码,操作系统将确保连续执行它。
    您应该知道,即使您无法创建 OB1 块(因为添加新 PLC 时会自动创建 OB1 块),您也可以创建多个循环中断块。
    OB1 是一个循环中断,操作系统会自动连续调用并执行里面的任何逻辑。然而,对于大型 PLC 项目,您的 PLC 逻辑中有如此多的功能和功能块,您可以使用多个循环中断 OB 来更好地构建代码,使其易于阅读和理解。
    在这种情况下,您将创建另一个循环中断,见图 4。

    图 4 – 创建多个循环 OB
    当创建了多个程序循环 OB 时,将按照 OB 编号的顺序依次调用这些 OB。
    首先调用具有最低 OB 编号的程序循环 OB。见图5。

    图 5 – 具有多个循环 OB 的程序循环
    循环程序完成后,操作系统按如下方式更新过程映像:
    它将过程映像输出中的值写入输出模块。 它读取输入模块的输入并将这些输入传输到过程映像输入。 前两步加上 PLC 程序的执行称为一个扫描周期。见图6。

    图 6 – 西门子 PLC 的扫描周期
    周期时间监控
    循环时间是指循环程序的运行时间,包括所有嵌套程序部分(例如 FC、FB 和更高优先级 OB)的运行时间。如果创建了多个程序循环 OB,则每个程序循环 OB 都会影响循环时间。
    操作系统监视循环时间是否仍然小于配置的最大循环时间。如果超过最大循环时间,PLC 将根据您的编程进入 STOP 模式或调用 OB80。
    除了监控最大循环时间之外,还可以保证最小循环时间。为此,操作系统会延迟新周期的开始,直到达到最小周期时间。
    您可以在 PLC 的配置属性中配置最小和最大循环时间。见图7。

    图 7 – 配置最小和最大循环时间
    PLC 中的简单程序示例

    图 8 – PLC 程序示例
    为了更好地理解 PLC 程序周期和 OB1 执行,让我们创建一个简单的程序。该程序将使用一条加法指令,每 1 个扫描周期将值 1 累加到存储区域中。请参阅以下模拟。

    从动画中可以看出,add 指令的执行速度非常快;这就是扫描周期的速度。这将取决于您的 PLC 的功能有多强大。但主要扫描周期在毫秒范围内。
    结论
    组织块是 PLC 操作系统和控制程序之间的接口。 主循环 OB1 由操作系统循环执行。 您可以通过将逻辑包含在一个或多个循环 OB 中来执行该逻辑。 扫描周期时间是执行逻辑 1 次所用的时间。

    leigehong
    在上一篇文章中,我们讨论了什么是组织块,并且谈到了一个非常重要的组织块,它就是主 OB1。
    在本文中,我们将继续讨论不同的 OB,这次我们讨论的是时间中断组织块或 OB10。
    内容:
    中断 OB10 是一天中的什么时间? 如何创建和使用 OB10? 简单的程序示例。 一天中中断时间的重要规则。 结论。 什么是当日时间中断 (OB10)?
    顾名思义,时间中断是一个组织块,它将在一天中的某个时间中断 PLC 程序主周期的执行。该中断时间(日期和时间)可以指定为在指定时间发生一次,或者以指定时间间隔定期发生,例如每分钟、每小时、每天、每周和一些其他选项。
    您可以在同一程序中拥有多个时钟中断,它们不必具有相同的逻辑或代码,每个中断都可以有自己的功能,并且每个中断都可以单独配置为在指定的时间发生 时间。
    如何创建和使用 OB10?
    要创建一天中的时间中断,请按照与需要在逻辑中添加任何新块时相同的步骤进行操作。见图1。

    图 1 – 添加一天中的时间中断
    按左侧项目树中的添加新块选项,选择组织块,然后选择一天中的时间中断,如上图所示。
    现在您可以打开 OB10 并添加调用此块时要执行的任何 PLC 逻辑,所谓调用是指中断事件或时间已经发生,因此操作系统将中断主周期并执行 OB10。
    我们将在 OB10 中编写一段非常简单的代码,以帮助我们更好地理解这个 OB10 块的工作原理。在此逻辑中,我们使用 add 指令将值 1 添加到称为 TimeOfDayInterruptCounter 的内存区域,然后将求和结果放回同一区域。这样我们就可以有一个用于执行 OB10 的计数器。
    每次调用并执行 OB10 时,TimeOfDayInterruptCounter 的值都会加 1。见图 2。

    图 2 – 将逻辑添加到 OB10
    现在我们已经创建了 OB10 并在其中编写了一些逻辑,我们需要配置 OB10 的设置时间以及我们希望它中断主周期的次数。
    要配置 OB10 的时间和间隔设置,我们需要进入 OB10 的属性页面。见图3。

    图 3 – OB10 的属性
    在 OB10 的属性中,您会发现许多可以配置的设置和属性。
    现在我们需要的是一天中的时间中断页面,以便我们可以设置何时调用 OB10 以及调用多少次。见图4。

    图 4 – 时间中断设置
    正如您从最后一张图片中看到的,您可以设置 OB10 的执行、开始日期以及执行 OB10 的时间。
    为了模拟方便,我们将执行间隔设置为每分钟,这样每分钟都会调用并执行 OB10。这意味着从 2023 年 3 月 23 日和时间 09:25 AM 开始,TimeOfDayInterruptCounter 的值将每分钟增加 1。
    您可以选择根据 PLC 系统时间或本地时间设置时间,如上图所示。在上一篇文章中,我们讲了 PLC 的系统时间和本地时间,各个时间的含义以及如何配置和使用它们。
    正如我们之前所说,当地时间是您现在在 PC 上看到的时间。所以是 PLC 使用地区的实际时间。
    您必须根据 PLC 的使用地点配置本地时间。见图5。

    图 5 – 设置 PLC 当地时间
    简单 PLC 程序示例
    我们在 PLC 程序中添加了时间中断 OB10,并对其进行了设置,以便每分钟执行一次。我们还配置了 PLC 的本地时间。
    我们创建了 ADD 指令的简单逻辑,以便在每次执行 OB10 时将 TimeOfDayInterruptCounter 的值累加 1。
    我们将添加另一条指令,但在主 OB1 中,该指令是 RD_LOC_T 或读取本地时间,因此我们可以看到本地时间的进展情况并将其与 OB10 的执行进行比较。见图6。

    图 6 – 简单程序示例
    编译您的 PLC 程序并开始新的模拟。
    请注意,我们将设置中断发生的时间,以便在模拟 PLC 逻辑时可以调用并执行 OB10。请参阅以下模拟。

    从动画中可以看到,TimeOfDayInterruptCounter 的值一开始为零,然后从 09:25 AM 开始每分钟增加 1,表示 OB10 每分钟执行一次。
    一天中的时间中断的重要规则
    如果设置时间中断以使相应的 OB 被处理一次,则启动时间不得是过去的时间(相对于 CPU 的实时时钟)。 如果设置时间中断以定期处理相应的 OB,但开始时间是过去的时间,则在下次到期时根据当前时间处理时间中断 OB。 周期性时间中断的日期必须与实际日期相对应。例如,开始日期为 1/31 的时间中断 OB 每月重复一次是不可能的。在这种情况下,仅在有 31 天的月份中启动 OB。 启动期间激活的时间中断只有在启动完成后才会执行。 启动会删除由用户程序中的指令设置和激活的所有时间中断。 结论
    OB10 是一个组织块,可配置为在特定日期和时间中断程序循环。该中断可以发生一次,也可以每隔一定时间定期发生。
    没有具体原因说明您需要 OB10,因为这取决于您的流程和逻辑。是的,您可以使用您的个人代码实现相同的功能,但它是一个可用且易于使用的内置函数。而且你知道如何使用它。

    leigehong
    在之前的文章中,我们讨论了不同类型的组织块,例如主 OB1 是主循环程序块,在本文中我们将讨论另一个循环组织块。OB30 或循环中断 OB。
    内容:
    什么是循环中断 OB30? OB1 的主周期是什么? 为什么需要 OB30? 如何配置循环中断? 如果我有多个循环中断怎么办? 结论。 什么是循环中断 OB30?
    循环中断 OB30 是一个组织块,它以指定且精确的时间间隔被调用和执行,与连续调用和执行的主循环 OB1 不同,循环中断将按照您在创建循环中断 OB 时配置的时间间隔被调用 。
    例如,如果我创建的 OB30 的时间间隔(也称为周期时间)为 20ms,则意味着操作系统将中断主周期 OB1 并每 20ms 调用 OB30。
    必须确保循环中断 OB 的运行时间必须小于其时间间隔。否则,当 OB30 的本次调用仍在执行时,仍有可能发生下一次 OB30 的调用到达。在这种情况下,操作系统会生成时间错误,可能导致 PLC 进入 STOP 模式。
    什么是主循环 OB1?
    主循环 OB1 是负责由 PLC 循环执行逻辑的组织块。每当您创建新项目并添加 PLC 时,软件都会自动创建主 OB1。
    PLC 代码的基本基础是循环行为,这意味着您需要连续执行代码。当逻辑处理完成后,操作系统将再次开始处理它。这是通过使用主 OB1 来完成的,您可以在该 OB1 中放置和调用所有逻辑和代码,操作系统将确保连续执行它。
    主 OB1 循环时间是指循环程序的运行时间,包括所有嵌套程序部分(例如 FC、FB 和更高优先级 OB)的运行时间。如果创建了多个程序循环 OB,则每个程序循环 OB 都会影响循环时间。
    操作系统监视循环时间是否仍然小于配置的最大循环时间。如果超过最大循环时间,PLC 将根据您的编程进入 STOP 模式或调用 OB80。
    为什么需要 OB30?
    有人可能会说,我可以将 OB30 内的任何功能放在主 OB1 中,并尝试摆脱它,这取决于当今大多数 PLC 的快速性能。有时这可能没问题,但并非每次都如此。
    根据 PLC 的性能,主循环时间可能在 1 到 150 毫秒之间;它可以不同,但这是标准配置,该循环时间取决于很多因素,例如 PLC 程序的大小、逻辑内部的中断以及其他因素,这些因素很可能会使循环的运行时间不稳定。
    现在,如果您需要精确地每 10 毫秒执行某些功能,而不是 9 毫秒或 11 毫秒。现在您不能依赖主 OB1,因为结果可能达不到预期。在这种情况下,您使用循环中断 OB30,将其配置为您想要的 10ms,操作系统将确保精确地每 10ms 调用并执行此函数。这就是为什么它被称为中断;因为它会中断主 OB1 的执行来调用并执行您的 OB30。
    需要 OB30 的功能示例
    PID 控制器处理。 安全电路监控。 监控机器之间的通信。 前面的所有示例都需要在特定时间连续监视和检查参数,因为它们与实际物理量或机器安全相关。不应延迟执行此类功能,因为它们会影响流程的安全性和连续性。
    如何配置循环中断?
    创建循环中断时,需要配置一些参数。请参见图 1 添加新 OB30。

    图 1 – 添加新的循环中断 OB30
    创建循环中断时,您可以在块的属性中找到许多可以设置的参数,请参见图 2。

    图 2——OB30的特性
    您需要考虑的最重要的参数如下:
    周期 使用参数“循环时间”设置循环中断 OB 两次调用之间的时间间隔。它是 1 µs 的整数倍。
    相位偏移 在此,您可以设置开始时间相对于循环时间的倍数偏移的时间段。
    有关周期时间和相位偏移配置,请参见图 3。

    图 3 – 设置 OB30 的循环时间和偏移量
    循环中断 OB 的优先级 这是配置循环中断时必须考虑的另一个重要参数,因为您可能有多个循环块,如果需要同时调用两个不同的 OB,操作系统将调用并执行该块 更高优先级的编号。
    您应该知道 PLC 主程序循环 OB1 的优先级编号为 1,这是块可以具有的最低优先级。这就是 OB1 可以被任何其他块调用中断的原因。见图4。

    图 4 – 设置 OB30 的优先级
    如果我有多个循环中断怎么办?
    在逻辑中出现多个循环中断的情况并不罕见。如果您的 PLC 逻辑中有两个 PID 控制器,那么您可能需要两个循环中断来处理每个 PID。在这种情况下,需要确保不同循环中断的调用和执行不会重叠。
    例如,如果 OB30 的间隔循环时间为 5ms,OB31 的循环间隔为 10ms,则意味着 OB30 的第二次调用也将是调用 OB31 的时间。这可能会导致逻辑错误,即使您将其中一个的优先级设置为高于另一个,也会扰乱较低优先级块的循环时间。见图5。

    图 5 – 调用不同循环中断的重叠
    在这种情况下,当您使用多个循环中断 OB 时,可能建议使用相位偏移。
    如果它们的周期时间具有公倍数,则可以使用相位偏移来防止同时启动时间。见图6。

    图 6 – 不同 OB 调用之间的偏移
    因此,为了避免这种重叠,我们将 OB31 的偏移时间设置为 1 ms。
    这意味着 OB31 时间间隔的计数将比 OB30 的起始时间偏移 1ms。见图7。

    图 7 – OB31 的偏移设置
    结论
    循环中断对于不应该面临任何延迟的时间关键任务非常有用。 您的逻辑中可以有多个循环中断。 使用循环中断的偏移设置来避免同时启动时间。 使用优先级设置来控制不同循环中断的执行顺序。

    leigehong
    在之前的文章中,我们开始讨论 TIA Portal PLC 的不同组织块,讨论了 OB 是什么,并讨论了一些 OB,例如 OB1 - 主循环、OB10 和 OB20,分别表示时间延迟和时间延迟中断。在本文中,我们将讨论西门子 Tia Portal 中的 OB100 或启动组织块。
    内容:
    什么是 OB100? 为什么需要 OB100? 启动期间的重要注意事项。 简单的程序示例。 什么是初创组织块(OB100)?
    OB100 或启动 OB 是一个组织块,在 PLC 启动时由操作系统调用并执行一次,即每次从 STOP 模式转换到 RUN 模式时一次。
    只有执行完 OB100 内部的所有启动函数后,主循环 OB1 才会被调用和执行。
    您的 PLC 逻辑中可以有多个启动 OB,如果发生这种情况,操作系统将从较低 OB 编号到较高编号开始一一调用并执行所有这些启动 OB。IE。如果您有 OB100 和 OB123,则将首先调用并执行 OB100,然后再调用并执行 OB123。
    执行 OB100 后,操作系统将输入模块读入 PII 并启动主循环程序 OB1。
    为什么需要 OB100?
    在启动循环逻辑之前,您可以使用 OB100 来执行许多您可能想要或需要执行的任务,原因如下:
    初始化变量。 重置系统模块。 重新校准传感器/执行器。 在开始流程之前检查警报和安全状况。 即使您尚未为逻辑创建启动 OB,操作系统在启动主逻辑之前仍然需要执行许多任务,其中一些任务是:
    清除非保留记忆 清除 PIQ 调用并执行启动 OB(如果有)。 更新个人身份信息 更改为 RUN 模式后启用输出。 您是否注意到启动例程的最后一个任务是启用输出? 这就是为什么执行主循环程序 OB1 的第一步是将 PIQ 写入输出模块。
    启动期间的重要注意事项
    关于 “STARTUP” 模式,请注意以下几点:
    模块上的输出被禁用。 过程映像被初始化。 过程映像未更新。 为了在“启动”期间从输入读取当前状态,您可以通过直接 I/O 访问来访问输入。 为了在启动期间初始化输出,可以通过过程映像或直接 I/O 访问写入值。 在转换到“RUN”模式期间,这些值在            输出端输出。 非保持性位存储器、定时器和计数器被初始化。 数据块中的非保持性标签被初始化。 在启动期间,尚未运行循环时间监控。 简单程序示例
    在此示例中,我们将向 PLC 逻辑添加一个启动 OB100,并查看 OB100 执行了多少次。请参阅图 1 添加新的 OB100。

    图 1 – 添加 OB100
    正如您从最后一张图片中看到的,您添加启动组织块的方式与我们添加功能块的功能相同。
    在我们刚刚创建的 OB100 中,我们将添加一个简单的 ADD 指令,以累计 OB100 被调用和执行的次数。见图2。

    图 2 – OB100的累计执行次数
    现在,编译并运行您的程序,看看会发生什么。请参阅以下动画来了解 PLC 程序的模拟。

    动画1
    从上面的动画中可以看到,OB100CycleCounter 为 1,并且当 PLC 模式从 STOP 转换为 RUN 时它不会改变。
    嗯,它确实发生了变化,但你看不到这种变化。每次 PLC 进入 STOP 模式,然后再次进入 RUN 模式。执行 OB100 后,计数器将重置为零,然后再次重置为 1。您还可以看到主 OB1 循环计数器发生变化,PLC 停止然后再次运行,OB1CycleCounter 将再次开始累加。
    为了看到启动计数器的变化,我们需要保留标签内存的值。见图3。

    图 3 – 保留 OB100CycleCounter 标签存储器
    我们保留 OB100CycleCounter 标签后,现在再次运行 PLC 仿真,看看会发生什么。参见模拟动画2。

    动画2
    现在,您可以从上面的动画中看到,每次我停止 PLC 然后再次启动它时,启动计数器都会增加。由于现在保留了标签内存,因此该值不会重置为零,这就是您看到 OB100CycleCounter 的值累加的原因。
    现在,我需要向启动 PLC 逻辑添加额外的功能,即了解 PLC 上次启动的时间。我们将通过一个简单的逻辑来实现这一点,在启动时读取 PLC 的本地时间并将日期和时间移动到某个存储区域。见图4。

    图 4 – 启动时读取当地时间
    添加逻辑后,再次编译并运行模拟。参见 PLC 仿真动画3。

    动画3
    从上面的动画可以看到,每次 PLC 启动时,启动日期和时间都会被记录在我们分配的内存区域中。现在我有了关于我的 PLC 启动了多少次以及上次启动时间是什么时候的信息。
    结论
    如果您想在运行循环过程之前评估某些功能,启动 OB 非常重要。您可以使用启动 OB 来初始化参数、校准传感器,甚至在允许流程运行之前检查安全条件。

×
×
  • Create New...