TIA Portal 梯形图实战分拣机

西门子提供了最直观、最友好的开发环境之一。这使得它成为想要开始实践PLC编程的人的理想起点。

在本教程中,我们将通过在TIA Portal中用梯形图(LADDER)编程一个简单的盒子分拣机,来探索西门子环境中可用的基本指令(由IEC 61131-3标准定义)。目的是展示这些指令如何在实际应用中使用。

前提条件:要跟随本教程,您需要安装TIA Portal。我们将使用TIA Portal v17,但您也可以使用任何其他版本。

不需要其他硬件或软件。

如果后续需要将梯形图转换为SCL,可以使用LAD2SCL插件

1、定义盒子分拣机的规格

我们正在构建的机器是一个系统,其中大盒子和小盒子从机器入口送入并按尺寸分拣(我们假设只有两种盒子:大的和小的)。

它配备有两个按钮(一个用于启动机器,另一个用于停止机器)和两个光电(PE)数字传感器。一个传感器放置在另一个上方,以检测进入的是大盒子还是小盒子(大盒子比小盒子高)。大盒子通过传送带A继续直线移动到大盒子收集器,而小盒子则被推(由电磁阀控制的气缸)向传送带B,传送带B通向小盒子收集器。每个传送带由其电机以恒定速度驱动。

图1.1:盒子分拣机示意图。

这台机器必须遵守以下规格。

  • 如果小盒子进入:只有低传感器必须打开。从传感器位置到大盒子收集器的行程时间为5秒。
  • 如果大盒子进入,两个传感器必须都打开。从传感器到气缸的行程时间为2秒,然后从传送带B到小盒子收集器的行程时间为5秒。
  • 计算小/大盒子的数量及其总数。
  • 计算小/大盒子的百分比。
  • 机器必须在达到1000个盒子时停止。

下图总结了机器的工作方式。

图1.2:机器工作图。

我们假设所有部件都按照以下两幅图所示进行接线。

图1.3:电源图。

两个电机都是异步三相电机。每个电机由一个接触器(KM1和KM2)控制。

图1.4:控制图。

启动按钮、停止按钮和两个传感器(PE_Low和PE_High)连接到4个PLC数字输入(从I 0.0到I 0.3)。两个接触器(KM1和KM2)和电磁阀线圈连接到3个PLC数字输出(从Q 0.0到Q 0.2)。

2、在TIA Portal中创建新项目

现在我们已经定义了机器的所有规格,可以开始编写PLC程序了。

首先启动TIA Portal。然后,在第一个屏幕上,点击"创建新项目",为其命名(本例中为"盒子分拣机"),然后点击"创建"。

图2.1:在TIA Portal中创建新项目。

然后,在下一个视图中点击"配置设备"。

图2.2:选择"配置设备"。

在设备配置中,点击"添加新设备",打开文件夹"控制器 -> SIMATIC S7-1500 -> CPU -> CPU 1511-1 PN",然后选择6ES7 511-1AK02-0AB0 CPU。

选择此CPU不是强制性的,您可以自由选择所需的CPU。我们只是选择了最简单的S7-1500 CPU的最新版本。

图2.3:选择S7-1500 CPU。

让软件初始化项目,直到项目界面出现。

在项目树中打开"程序块"文件夹,然后双击"Main [OB1]"

图2.4:打开Main OB1。

这是项目的主块(OB1代表组织块1)。这是一个循环块,这意味着只要CPU处于RUN模式,其中编程的所有指令将重复执行。为了简单起见,我们将只使用这个块进行编程。

在屏幕右侧,您可以找到指令列表。可以通过点击"指令"侧边选项卡随时访问。

在本教程中,我们将只关注基本指令。它们包含了我们满足所有设定要求所需的全部工具。

图2.5:基本指令。

3、在TIA Portal中编程位逻辑操作

打开"位逻辑操作"文件夹,然后将一个常开触点和一个置位指令拖放到网络1的线上。

图2.6:添加常开触点和置位指令。
  • 常开触点是位查询。添加此指令后,我们正在查询相关位的状态。如果其状态为1,程序将继续执行该行的其余部分。如果其状态为0,后面的指令将不会执行
  • 置位指令将位的状态更改为1。只要没有其他指令更改其状态,它将保持为1。

现在我们必须为每个指令关联一个位地址。首先是给它一个标签。点击指令上方的红色问号,然后按照下图所示输入名称。

图2.7:标签名称。

如您所见,我们的标签下方有一条红线。这是正常的,因为我们还没有定义这些标签。可以通过右键点击标签然后点击"定义标签"来完成。

图2.8:定义标签。

将打开一个小窗口,要求您定义标签的数据区、数据类型和内存地址。将其定义为全局输入BOOL。完成后,第一个可用的物理地址将自动分配给此标签。在我们的例子中,它是"%I0.0"。完成后,点击"定义"。

图2.9:定义启动标签。

注意:您可以通过在项目树中打开"PLC标签"文件夹并双击"默认标签表"来随时访问所有标签的列表。

图2.10:项目树中的默认标签表。

重复相同的动作来定义"auto_mode"标签。将其定义为全局内存。

图2.11:启动和auto_mode标签。

如您所见,我们的标签下方不再有红线,并且正确的内存地址显示在它们上方。

使用这些指令,每当我们按下启动按钮时,内存位"Auto_mode"的状态将被设置为1。我们将使用"Auto_mode"位的状态作为条件,允许我们将编程的功能执行。

现在我们需要添加指令,当我们按下停止按钮时将"Auto_mode"的状态更改为0。为此,将一个常开触点和一个复位指令拖放到网络2。

图2.10:复位指令位置。

为常开触点定义"Stop"标签作为全局输入BOOL(其地址将自动设置为"I 0.1"),并将"Auto_mode"分配给复位指令。

图2.11:停止和auto_mode标签。
  • 复位指令将其相关位的状态更改为0。至于置位指令,其状态将保持为0,直到我们用另一个指令更改它。

现在,使用网络2,每当我们按下停止按钮时,"Auto_mode"位将被设置为0。

我们完成了按钮的编程,现在开始编程传感器。正如我们之前所说,检测大盒子的条件是两个传感器都打开。检测小盒子的条件是只有低传感器打开而高传感器关闭。让我们首先在网络3中添加两个常开触点,将它们命名为"PE_Low"和"PE_High",并将它们的标签定义为全局输入BOOL。

图2.12:PE_Low和PE_High常开触点。

之后,在触点后添加一个赋值指令。您可以在"位逻辑操作"文件夹中找到赋值指令。

图2.13:赋值指令位置。

拖放该指令,将其命名为"Large_box"并将其定义为局部临时BOOL。

图2.14:"Large_box"位赋值指令。
  • 赋值指令复制之前执行的指令的逻辑状态。如果之前的逻辑结果为1,则相关位将被设置为1。如果之前的逻辑结果为0,则相关位将被设置为0。

这样,每当两个传感器都为1时,"Large_Box"将被设置为1。告诉我们大盒子刚刚通过了传感器。

让我们为小盒子做同样的事情。重复我们刚才做的相同动作,但为"PE_High"使用常闭触点。您可以在"位逻辑操作"文件夹中找到常闭触点。

图2.15:常闭触点位置。

为赋值指令使用"Small_box"标签名称。

图2.16:"Small_box"位赋值指令。
  • 常闭触点是位查询。添加此指令后,我们正在查询相关位的状态。如果其状态为0,程序将继续执行该行的其余部分。如果其状态为1,后面的指令将不会执行。

在这种情况下,只有当"PE_Low"为1且"PE_High"为0时,"Small_box"位才会被设置为1。

4、在TIA Portal中编程定时器

好的,我们定义了所有需要的条件位。现在让我们开始编程推杆和电机的行为。由于规格要求基于时间的控制,我们将使用定时器来激活它们。

首先,我们将定义传送带A的行为(大盒子)。在网络4中添加两个常开触点。并将它们定义为"Auto_mode"和"Large_box"。

图3.1:"Auto_mode"和"Large box"查询。

从"定时器操作"文件夹中,拖放一个TP指令。

图3.2:TP定时器指令位置。

放置指令后,将打开一个"调用选项"窗口,要求您创建一个包含所有定时器信息的DB(数据块)。只需将DB命名为"timerA_DB",然后点击确定。

图3.3:定时器调用选项窗口。

注意:每次创建定时器或计数器时,此窗口都会打开。让DB的编号自动设置。

图3.4:已创建的"timerA_DB"TP定时器。
  • TP定时器是脉冲定时器指令。它通过在IN输入端接收1来激活,并在PT输入指定的时间内将输出Q设置为1,并在ET输出中返回当前时间。如果IN输入在计数器激活时多次设置为1,不会影响当前时间值。

PT输入需要TIME数据类型。要定义TIME数据,您必须写"T#",然后指定一个带有单位的时间持续时间。对于这种情况,我们希望定时器运行5秒。所以我们必须写"T#5s"。

图3.5:将定时器设置为5秒。

如果指令保持这样,会导致机器故障。由于重置输入不会重置当前时间,这意味着如果多个大盒子在5秒内通过,Q输出将只被设置为1一次,持续5秒。为了避免这种情况,我们只需要在IN输入之前添加一个"复位定时器"指令。您可以在"定时器操作"中找到"复位定时器"指令

图3.6:复位定时器指令位置。

将复位定时器函数分配给"timerA_DB"。

图3.6:复位定时器指令位置。

这样,每当IN输入设置为1时,它都会在之前重置定时器。

注意:此逻辑将应用于本教程其余部分中使用的所有其他定时器。

现在我们只需在Q输出之后添加一个赋值指令。将其命名为"Motor1"并将其定义为全局输出BOOL。

图3.7:"Motor1"位赋值。

很好,现在电机1将按照我们的规格开启。

让我们为小盒子构建机器的行为。由于我们已经有了"Auto_mode"位查询,不需要再添加一个。我们可以在查询之后简单地添加一个新分支。您可以在"常规"文件夹中找到打开分支指令。

图3.8:打开分支指令位置。

在这个新分支中,我们将构建传送带B行为的第一步。即开启传送带A 2秒(将盒子从传感器移动到推杆位置)。将定时器命名为"timerB_DB",并将赋值指令定义为"Motor1"。

图3.9:传送带B第一步。

让我们做第二步,即在2秒后激活电磁阀。为此,我们将在"Large_box"集成之后添加另一个分支,这次我们将使用一个TON定时器(在"定时器操作"文件夹中找到)。将定时器命名为"timerC_DB",将PT设置为2秒,并将"Solenoid_valve"定义为全局输出BOOL。

图3.10:传送带B第二步。
  • TON定时器是通电延时定时器指令。它通过在IN输入端接收1来激活,并在PT输入指定的时间过去后将输出Q设置为1,并在ET输出中返回当前时间。如果IN输入在计数器激活时多次设置为1,不会影响当前时间值。

使用此定时器,电磁阀将在传感器检测到小盒子后2秒被激活。

对于第三步,我们需要电机2在推杆激活的同时被激活5秒。在"timerC_DB"输出之后添加一个新分支。然后添加一个简单的TP定时器(带复位),将其命名为"timerD_DB",并设置为5秒。之后,添加一个赋值指令,将其命名为"Motor2"并将其定义为全局输出BOOL。

图3.11:传送带B第三步。

5、在TIA Portal中编程计数器

现在机器的行为已经实现,让我们添加计数器来测量大盒子和小盒子的数量。首先,在网络6中添加一个"Auto_mode"常开触点,然后是两个分支:一个通向"Large_box"常开触点,另一个通向"Small_box"常开触点,如下图所示。

图4.1:网络6条件。

在"Large_box"触点之后,添加一个CTU(加计数)指令,并将其命名为"CounterL_DB"(在调用选项窗口中)。您可以在"计数器操作"文件夹中找到它。

图4.2:CTU指令位置。
图4.3:在网络6中创建的CTU指令。
  • CTU指令计算CU输入设置为1的次数。它从PV输入中的值开始计数,并在CV输出中返回实际计数器值。您可以通过在R输入中设置1来将计数器重置为其初始值。

将PV输入保持为0(作为常量),并将"Stop"位分配给R输入。

图4.4:将"Stop"位分配为计数器的复位条件。

继续,为"Small_box"触点之后的计数器重复相同的步骤。

图4.5:创建小盒子计数器。

要检索当前计数器值,我们必须为CV输出分配整数标签。将两个标签"num_L"和"num_S"定义为全局内存INT,如下图所示。

图4.6:在计数器的CP输出处分配"num_L"和"num_S"。

6、在TIA Portal中编程数学和转换指令

在本教程的这一部分,我们将获取刚刚编程的计数器值,并对其进行一些数学运算以计算:盒子的总数和大/小盒子的百分比。

首先,我们将计算盒子的总数,即大盒子和小盒子数量的总和。为此,在网络7中添加一个"Auto_mode"常开触点,然后是一个ADD指令。您可以在"数学函数"文件夹中找到它。

图5.1:ADD指令位置。

将"num_L"分配给IN1,将"num_S"分配给IN2,然后将"total_box"定义为全局内存INT到OUT。

图5.2:在网络7中创建ADD指令。
  • ADD指令将IN1和IN2输入中的数值相加,并在OUT输出中返回结果。相加的输入和输出结果具有相同的数据类型。

现在让我们计算大盒子和小盒子的百分比。为此,我们首先必须将"num_L"、"num_S"和"total_box"从INT转换为REAL。为此,在网络8中添加一个"Auto_mode"常开触点,然后是一个CONVERT指令。您可以在"转换操作"文件夹中找到它。

图5.3:CONVERT指令位置。
图5.4:在网络8中创建CONV指令。
  • CONVERT指令将IN输入中设置的数据类型转换为OUT输出中返回的另一种数据类型。转换的性质由"??? to ???"插槽决定(例如INT到REAL)。

将转换设置为"INT到REAL",将"num_L"分配给IN输入,并将"num_L_real"定义为全局内存Real。

图5.5:设置CONV指令。

继续,为"num_S"和"total_box"重复相同的步骤。

图5.6:定义"num_S_real"和"total_box_real"。

要计算大盒子的百分比,我们必须将大盒子的数量除以盒子的总数,然后将结果乘以100。

在网络9中添加一个"Auto_mode"常开触点,然后是一个DIV(除法)指令。您可以在"数学函数"文件夹中找到它。

图5.7:DIV指令位置。

将"division"定义为局部临时REAL,并确保除法的类型被识别为real。

图5.8:创建DIV函数。
  • DIV指令将IN1中的值除以IN2中的值,并在OUT中返回结果。IN1、IN2和OUT具有相同的数据类型,并由DIV类型插槽设置。

现在我们必须将"division"中的值乘以100以获得百分比。为此,添加一个MUL(乘法)指令。您可以在"数学函数"文件夹中找到它。

图5.9:MUL指令位置。

如下图所示分配输入和输出。

图5.10:在网络9中创建MUL指令。
  • DIV指令将IN1中的值乘以IN2中的值,并在OUT中返回结果。IN1、IN2和OUT具有相同的数据类型,并由MUL类型插槽设置。

注意:您必须写100.0而不是简单的100,以便它被识别为实数。否则,它将被视为整数。

现在我们已经计算出大盒子的百分比"percent_large",我们可以重复这些步骤来计算小盒子的百分比。或者,我们可以简单地从100%中减去大盒子的百分比。由于只有两种类型的盒子,直接做减法要容易得多。为此,添加一个SUB指令(在"数学函数"中找到),并如下图所示定义输入和输出。

图5.11:在网络9中创建SUB指令。
  • SUB指令从IN1中的值中减去IN2中的值,并在OUT输出中返回结果。IN1、IN2和OUT具有相同的数据类型,并由SUB类型插槽设置。

7、在TIA Portal中编程比较和移动指令

在某些情况下,当计数器达到某个值时,您需要触发事件。在我们的例子中,我们希望在盒子总数达到1000时停止机器。

我们可以通过简单地使用一个"Auto_mode"复位指令来实现,该指令前面是一个CMP ==指令。您可以在"比较器操作"文件夹中找到它。

图6.1:CMP ==指令位置。

图6.2:在网络9中创建CMP指令。
  • CMP指令根据特定条件(在我们的例子中,相等==)将上值与下值进行比较。如果条件满足,程序将继续执行该行的其余部分。如果不满足,后面的指令将不会执行。两个比较的值必须具有相同的数据类型。

在这里,当"total_box"的值等于1000时,复位指令激活并将"Auto_mode"的值设置为0。

最后一件事来结束本教程是在机器停止后将我们创建的实数值重置为0,以防止下次启动时内存重叠。为此,我们将使用MOVE指令。

在网络10中添加一个"Auto_mode"复位指令,前面是一个MOVE指令。您可以在"移动操作"文件夹中找到它。

图6.3:MOVE指令位置。
  • Move函数将其输入的值复制到其输出。输入和输出必须具有相同的数据类型。
图6.4:在网络10中创建MOVE指令。

点击MOVE指令中的黄色星号两次以添加两个更多输出。并如下图所示填写标签。

图6.5:使用MOVE指令将值0写入三个输出。

这样,每次机器停止时,它都会将实数值恢复为0。

8、结束语

在本教程中,您学习了如何使用TIA Portal中的基本指令逐步编程一台简单的机器。

西门子不遗余力地使其开发环境对初学者和资深用户一样友好。得益于IEC 61131标准化,我们在本教程中探索的所有指令在其他开发环境中(如RSLogix 5000)都将类似。

作为练习,您可以尝试使用其他PLC制造商的其他环境来重现此项目,以充分发现它们之间的所有细微差别。


原文链接:An Introduction to Basic Ladder Logic Instructions in Siemens Tia Portal

汇智网翻译整理,转载请标明出处