结构化PLC的要点

本教程是CE 9月Back to Basics文章的扩展。

通过达达拉·波尼齐尔,圣地亚哥,加州 二一年九月一日
图1

l和其他软件语言一样,加法器代码可以而且应该遵循结构化编程的原则:模块化、自顶向下的设计、单入口/出口点、自底向上的测试。本教程将提供这样做的要点:开发一旦项目签署就可以阅读和支持的PLC代码。这种方法被称为站点映射编程(SMP),下面的页面描述了四个步骤。

步骤1:分而治之:将项目分成子系统。

除非系统非常基本(少于16个I/O),否则可以将其划分为模块或子任务。让我们使用上面的图形,一个零件排序和存储工具来说明。记住,系统的细节并不重要;您的系统将有所不同,但概念仍然适用。在这里,传送带将零件送到拾取处,拾取处将零件移动到传输传送带。大型龙门架拾取和放置接收从传输输送机的部分,并将其放置在适当的托盘。一旦装满,零件托盘就会被电梯放入转运车中。该系统被划分为任务区域或工作站,按顺序编号(0、9),从输入阶段开始,一直到输出阶段。使用10个站点将照顾大多数plc嵌入式系统,数字0,9很容易映射到内存分配。

这样做的原因是:

  • 它允许我们专注于每个子系统,并定义每个子系统的特定功能,而不会分散整体的注意力。换句话说,它使我们能够全面了解项目。

  • 在子系统级别定义过程需求将产生每个工作站的输入和输出变量。

  • 作为我们正在进行的系统审查的一部分,我们可以,在这个早期的概念阶段,对关键问题进行审查:这将满足规范的要求吗?

下表用于组织站点映射过程。

站# 名字 函数 输入 输出
0 Conveyor1 将零件送入刀具 来料件present 零件可挑选和放置
3. 拾取和放置 从输送机接收零件;将零件放置在适当的输送轨道上
  • 可从输送机获得的部件

  • 输送机空

  • 部分状态

从输送机上拆下的部件
4 转移输送机 将零件传送到龙门架拾取和放置 部分存在于输送机头部
5 龙门 从输送轨道上拆下零件,并将零件放入适当的托盘中。
  • 零件在挑片位置

  • 可提供工艺托盘

进程托盘状态
8 接收架 储存已收集整理的零件以备进一步加工。 进程托盘状态 进程托盘状态
1.实际的传送带将使用某种部件传输机制,例如托盘或部件模拟,但是,为了清楚起见,我们将忽略这些细节
  • 系统划分沿着功能边界进行。如果你发现一个特定的工作站有超过4个输入或输出,那么这个过程可能需要进一步划分。

  • 请注意,站点不需要按任何特定顺序编号或连续编号。但是,如果子系统是串行依赖的,例如具有多个停止门的传送带,则顺序编号留下备件提供了最大的灵活性。

  • 内存分配:

物理I/O和内部存储器使用工作站编号进行映射。

由于PLC设计人员使用各种存储器组织和命名约定,我们将使用a /B SLC500作为说明2。您的内存分配将取决于特定的平台;在任何情况下,都需要某种内存分配方法,以使代码保持模块化。因此,如果稍后需要添加一个站点,它的内存在程序的其他地方还没有被使用。虽然浪费了内存,但设计时间的成本要大得多。有多少次你不得不搜索可用的字和位来使用一个新的控制功能?或者更糟的是,有多少次您必须搜索多次使用导致意外行为的地址?

在基于符号的系统中,如Allen Bradley的ControlLogix, I/O映射是为你完成的,你应该使用一种命名方案,在符号中嵌入车站号码。例如,拾取和放置末端执行器可以是STAnGRIPPER_CLOSED, STAnCLOSE_GRIPPER等,其中n是工位号。这样,子系统的分离、功能和识别仍然得以保留。

下表说明了Allen Bradley SLC 500的内存映射派生。

站# 程序文件 物理I / O3 单词 计时器
0 One hundred. 我:1、3;O: 2 N107:0 9 B103/0 99 T104:0 9
101 N107:10, 19 B103/100,199 T104:10, 19
... ... ... ...
109 N107:90 99 B103/900,999 T104:90 99
1 110 我:5、7;O: 6 N117:0 9 B113/0 99 T114:0 9
111 N117:10, 19 B113/100,199 T114:10, 19
... ... ... ...
119 N117:90 99 B113/900,999 T114:90 99
2 120 我:9,11;O: 10 N127:0 9 B123/0 99 T124:0 9
121 N127:10, 19 B123/100,199 T124:10, 19
... ... ... ...
129 N127:90 99 B123/900,999 T124:90 99
3. 130 我:13、15;O: 14 N137:0 9 B133/0 99 T134:0 9
131 N137:10, 19 B133/100,199 T134:10, 19
... ... ... ...
139 N137:90 99 B133/900,999 T134:90 99
... ... ... ... ... ...
9 190 我:17、19;O: 18 N197:0 9 B193/0 99 T194:0 9
191 N197:10, 19 B193/100,199 T194:10, 19
... ... ... ...
199 N197:90 99 B193/900,999 T194:90 99
这是一个松散的赋值,因为实际的I/O数量和类型会有所不同;然而,应该考虑一些组织。通常,输入到输出的比例是2:1。我们也考虑到了备用插槽。至少,类似的设备应该使用连续的I/O,因为最终的考虑是:您是否可以在不重新连接整个机架的情况下将该进程移动到新的位置

关于内存映射的注意事项:

  • 关键概念是每个工作站有10个程序文件(子程序)。每个子程序根据文件编号分配字和位内存。每个接收10个字的整数、计时器和计数器;每个接收100个位内存元素,等等。同样,只要在插入新的子例程时不存在内存分配问题,您使用的方法就是有效的。

  • 可以对跨站点重复出现的函数的子例程文件的分配进行进一步的改进。例如,重置/归巢例程都可以是1n5文件;固定控制均可为1n1等,其中n为工位号。

  • 通过将内存空间绑定到功能块,我们正在制作各种可移植的代码对象。

步骤2:使用状态机表示设计每个流程。

这就是关键所在:实际控制的设计。每次选取一个站点,将所有可用的信息,如系统规格、真值表、伺服控制协议、网络协议、客户规格、切割表等汇集在一起,并开发每个站点功能的状态机表示。当工作站处理复杂时,使用多个测序器。例如,一个工作站固定一个部件,在它周围包装一个柔性电路,然后将它固定在需要几个子程序/顺序程序文件以模块化方式处理操作。一般来说,如果该过程需要超过32个状态,则将其分解为两个(或更多)序列器。

如果,在状态表示的开发过程中,你发现你在序列器之间重复状态/动作段,将它们隔离到另一个程序文件/序列器中。

使用状态机建模的原因有:

  • 设计决策是在编写代码之前预先做出的。

  • 项目的负责人可以聚在一起,在一开始就做出设计决策。尽管他们确切地告诉了你他们想要什么,但当面对一个具体的设计,精确地说明系统将如何运行——启动条件是什么,会产生什么警报,过程将如何处理意外的刺激,或者更重要的是,它将忽略哪些刺激——你会发现,这个“硬性和快速的规范”正在发生许多工程上的变化。

  • 状态机表示与梯子保持一对一的对应关系,因此,如果您可以在状态表示中提出逻辑设计,那么您的控件将在PLC中工作。

  • 项目是自文档化的,因为状态图表示控制规范。

  • 使用状态图更容易向那些不熟悉项目的人解释将要发生的事情。

图2:输送机控制顺序器
图2显示了一个三状态序列器,用于演示使用状态机建模的设计开发

状态图符号
& > 不平等的
+
(左) 门闩
(U) 拉开插栓

图2注释:

  • 当定义一个过程时,制作一个简单的草图来指示主要的控制元素,如执行器、传感器、入口和出口点等,通常是有帮助的。在这里,我们指出了受控设备:安装在传送带上的部件振荡器。

  • 从初始条件(不存在部件)开始定义状态。您总是从空闲状态作为切入点开始。在空闲状态下不会发生任何操作,并且进程总是重置/返回到此状态。

  • 这个过程是由进入输送机的零件驱动的,因此当零件到达模拟滑块时发生第一次状态变化。请注意,作为该序列器复位功能的一部分,singulator被初始化到HOLD part位置(前导门收回,后导门扩展)。

  • 从空闲状态到状态2的过渡是在输送带头部有零件,拣料处没有零件和单步都满足的情况下进行的。这可以通过使用表示与关系的布尔运算符“&”来表示。对应的梯子横档见图3。

  • SINGLE STEP条件是一个位地址,它允许在单步模式下进行这种转换。在程序的其他地方,这个位为一次扫描打开。在需要单步或机器需要停止处理的任何状态转换中,通过将此位与任意状态转换结合,我们获得两种控制模式:单步和停止。通常,我们希望工具在涉及动作的任何操作之前触发单个步骤。因此,我们在切换单点器之前(在状态2和4之前)添加一个步骤。

  • 状态2到状态4的转换不需要任何部件在单点器上,并且需要一个部件到达拾取位置和单步。通过要求零件到达下游传感器,我们确保没有零件搁浅或卡在输送机上。

  • 注意,使用颜色是为了使状态图更具可读性。在下一个示例中,我们将演示如何使用标志进行序列间的握手。

状态机编程的其他好处:

  • 故障检测。在图2的序列器中,我们可以在状态2添加一个故障检测定时器来对事件进行计时,并在部件没有在合理的时间范围内到达拾取位置时提醒操作员。故障检测是状态机编程的另一个重要优点。状态数成为故障检测机制的一个条件。在任何状态转换条件中添加延迟都很简单。

  • 故障排除和设置。使用状态机排序还有助于故障排除和设置。通过一次步进,传感器、气缸、自导旗等的调整成为一个有条不紊、可控的过程,几乎没有意外行为的机会。

  • 报喜。通过简单地扫描状态词,该工具告诉你它在哪里。”This is especially handy when designing MMI screens showing the state of the process.

  • 启动,循环停止和单步功能。这是通过使用单个步进位作为任何需要步进点的转换的一部分来实现的。

  • 决定论。状态机编程允许在工具执行任务之前确定工具要执行的任务。这使得它更安全,更不可能造成损害。

  • 的变化。由于流程定义良好且自文档化,因此可以更快地进行修改,并有信心再次运行。具体地说,转换条件和动作可以很容易地修改,因为对特定过程或设备的操作被封装在该序列器的动作级中(而不是整个程序)。

这些转化为底线:高效设计的固件是安全、可靠和可支持的

步骤3:梯形编码。

这几乎是一个事后的想法,因为状态图是阶梯。一旦将状态图转换为阶梯,就只需要添加状态字/位描述来反映动作,并对状态转换/动作进行编码。使用测序模板和站点映射内存,您只需执行索引剪切和粘贴,即可为新的站点间文件或其他站点文件创建测序器。您的时间花在设计流程上,而不是花在复杂的梯级结构上。图3、图4为图2过程对应的梯形图。

图3:输送过程的过渡梯级

图4:输送过程的动作梯级

注:

  • 状态字N107:10的每个位与状态图中的每个状态都有一一对应关系。同样,使用组合逻辑对每个转换条件进行编码,以匹配状态图所指定的内容。因此,状态图上的信息包含了写入相应序列器的所有信息。

  • 注意使用一次性指令和输出锁存/解锁指令。目的是在进入状态时只对寻址设备(或内存元素)进行一次操作。然后可以使用MMI设备或调试屏幕写入这些元素。

这个代码要运行我们的传送带,剩下的是一旦转换条件解码为真,就推进序列器的代码。这是通过以下梯级完成的:

图5:序列器状态推进级

这里的本质是简单。每当序列器的转换条件解码为TRUE时,新状态位字0或字1变为非零。这个阶段,它在最后一个过渡级之后,在动作级之前,将下一个状态位复制到本地状态字(这里是N107:10, N107:11)。然后清除新状态位word0和word1。

注意:

  • 在至少一次扫描中,给定状态将保持活动状态(其位值将为1)。这很重要,因为其他测序器可能会在稍后的程序中查找状态。此外,在任何一个扫描周期中,只能有一种状态为真。这样做是为了避免状态机算法中的歧义,程序员应该严格遵守。由于此梯级使用基本指令,因此可以在任何PLC平台上进行编码。

这个特定过程的控制代码的剩余部分在很大程度上取决于您。顺序器处理所有顺序逻辑和控制。通常会添加错误/故障解码和重置级。前者可以处理诸如输送机上的零件卡壳或单传感器冲突等故障情况。后者将序列器初始化为空闲状态,并将单例器置于HOLD PART条件。

步骤4:测试和调试

排序器控制的一个重要优点是易于自底向上的测试和调试。首先,隔离常用文件——实用程序文件、驱动程序文件等——并分别对它们进行测试。然后,有了这些信心,就可以一次一个地启用更大、更复杂的流程文件。(使用选择性跳转到子程序指令来做到这一点。)序列器允许您单步执行代码,这样就可以有条不紊地识别竞争条件和逻辑错误,而不是像这样难以预测(尽管更令人兴奋):“好了,伙计们,我将把它置于RUN模式。”向后站!”

更多的例子

为了扩展这些概念,我们又添加了两个状态机图。第一个(图6)控制3轴拾取和放置。第二个(图7)是一个实用程序文件,每次需要伺服移动时,第一个都会“调用”它。请注意,伺服驱动器执行的功能可以内置到主拾取和放置文件中,但我们选择将它们分开。由于设置目标地址,延迟,然后触发移动的操作是重复的,所以整个序列最好在单独的例程(或函数)中处理。这样,程序可以单独测试,其他的序列器可以使用它,主程序更紧凑,如果需要改变驱动程序,它将只在一个地方完成。

图6:伺服驱动拾取和放置序列器

关于图6的说明:

  • 在这里,拾取和放置将零件从传送带的末端移动到托盘上。状态2通过将移动ID或地址写入伺服执行子程序的输入寄存器来初始化z轴向下移动。然后,它锁住一个标志(SERVO EXECUTE flag)并等待,直到该标志被重置。处理例程(参见图7)使用此标志触发序列以实际执行移动。请注意,只有一个标志用于完成两个例程之间的所有握手。当移动完成并且标志被清除时,该序列将前进到状态4,从而关闭抓手。在状态4,我们寻找抓手传感器来指示关闭状态,然后我们前进到状态6,依此类推。

  • 在状态6中,我们演示了异常处理路径的使用。如果托盘在状态6延迟计时器设定的时间内没有准备好接收该部件,则控制将传递到状态7(而不是8),并且该部件被拒绝进入转储滑道。

  • 无论进程时间是否过期,序列仍然返回到空闲状态并等待下一部分。从系统控制的角度来看,为所有过程提供单一的入口和出口点是非常可取的。

图7:拾取和放置伺服控制驱动器音序器

有关本教程或任何其他PLC或嵌入式控制问题的更多信息,请联系Dadla Ponizil, ControlWare。电话760-436-5362dponizil@connectnet.com

评论?电子邮件gmintchell@cahners.com