当前位置:首页>java>西门子PLC编程入门:用TIA Portal实现简易分拣机控制系统

西门子PLC编程入门:用TIA Portal实现简易分拣机控制系统

  • 2026-09-10 22:37:08
西门子PLC编程入门:用TIA Portal实现简易分拣机控制系统

Introduction(引言)西门子提供了极为直观且用户友好的开发环境,是初学者练习PLC编程的绝佳起点。

在本教程中,我们将通过在TIA Portal中使用LADDER(梯形图)语言编程一台简易纸箱分拣机,探索西门子环境中符合IEC 61131-3标准的基础指令。目的是展示这些指令如何在真实应用中被使用。


Prerequisites(前提条件)

要跟随本教程操作,您需要安装TIA Portal。我们将使用TIA Portal v17,但您也可以使用其他版本。

无需其他硬件或软件。


一、定义纸箱分拣机的规格

我们构建的机器是一个将小箱和大箱从入口送入并按尺寸分拣的系统(我们假定仅有两种箱子:大箱(large)和小箱(small))。

该机器配备:

  • 两个按钮(push buttons):一个用于启动,一个用于停止。
  • 两个光电数字传感器(PhotoElectric / PE digital sensors):一个位于另一个上方,用于检测进入的是大箱还是小箱(大箱比小箱更高)
  • 大箱直接通过传送带A(Conveyor A)进入大箱收集区。
  • 小箱则由气缸(pneumatic cylinder)(由电磁阀控制)推至传送带B(Conveyor B),再送入小箱收集区。
  • 每条传送带由其电机以恒定速度驱动。

图1.1:纸箱分拣机示意图

该机器必须满足以下条件:

  • 若大箱进入:两个传感器同时触发。从传感器位置到大箱收集区的传送时间为5秒。
  • 若小箱进入:仅低位传感器触发。从传感器到气缸的传送时间为2秒,再从传送带B到小箱收集区为5秒
  • 统计小箱/大箱数量及其总数
  • 计算小箱/大箱的百分比
  • 当总数达到1000个箱子时自动停机

图1.2:机器工作流程图

我们假设所有部件接线如下图所示:

图1.3:动力回路图

两台电机均为三相异步电机,分别由接触器KM1和KM2控制。

图1.4:控制回路图

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


二、在TIA Portal中创建新项目

定义完所有规格后,即可开始编写PLC程序。

启动TIA Portal,首屏点击 "Create a new project(创建新项目)",命名为 "Box sorting machine(纸箱分拣机)",点击 "Create(创建)"。

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

在下一界面点击 "Configure a device(配置设备)"。

图2.2:选择“配置设备”

进入设备配置界面后,点击 "Add a new device(添加新设备)",展开文件夹 "Controllers -> SIMATIC S7-1500 -> CPU -> CPU 1511-1 PN",选择型号 6ES7 511-1AK02-0AB0 CPU。

选择此CPU并非强制,您可自由选择。

图2.3:选择S7-1500 CPU

等待软件初始化项目直至主界面出现。

在项目树中打开 "Program blocks(程序块)" 文件夹,双击 "Main [OB1]"。

图2.4:打开主程序块OB1

这是项目的主组织块(OB1 = Organization Block 1),属于循环执行块——只要CPU处于RUN模式,其中的指令将被反复执行。为简化起见,本教程仅使用此块进行编程。

屏幕右侧为指令列表(Instructions),可随时通过点击右侧 "Instructions" 标签访问。

本教程将仅聚焦于基础指令(Basic instructions),它们已包含满足所有需求的必要工具。

图2.5:基础指令集


在TIA Portal中编程位逻辑操作

打开 "Bit Logic Operations(位逻辑操作)" 文件夹,将一个**常开触点(normally open contact)和一个置位指令(Set instruction)**拖至Network 1的横线上。

图2.6:添加常开触点与置位指令

  • 常开触点用于查询关联位的状态:若为1则继续执行后续指令;若为0则跳过
  • 置位指令将关联位状态强制设为1,并保持该状态直至被其他指令改变

接下来为每条指令关联地址。点击指令上方的红色问号,按图输入标签名。

图2.7:标签命名

红色下划线表示标签尚未定义。右键点击标签,选择 "Define tag(定义标签)"。

图2.8:定义标签

弹出窗口中设置数据区域、数据类型和内存地址:

  • 将 "Start" 定义为 Global input BOOL(全局输入布尔型),系统自动分配首地址 %I0.0
  • 将 "auto_mode" 定义为 Global memory(全局内存)

图2.9:定义Start标签

提示:随时可通过项目树中 "PLC tags -> Default tag table" 查看所有标签列表

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

完成定义后,标签下方红色下划线消失,正确地址显示于上方。

图2.11:Start与auto_mode标签

通过这两条指令,每次按下Start按钮,"auto_mode"内存位将被置1。后续功能将以此位状态作为执行条件。

接下来添加按下Stop按钮时将"auto_mode"复位为0的逻辑:在Network 2中拖入一个常开触点和一个复位指令(Reset Instruction)。

图2.12:复位指令位置

  • 将触点标签 "Stop" 定义为 Global input BOOL(自动分配地址 I 0.1)
  • 复位指令关联 "auto_mode"

图2.13:Stop与auto_mode标签

复位指令将关联位强制设为0,并保持该状态直至被改变。

至此按钮逻辑完成。接下来编程传感器逻辑:

  • 大箱判定条件:两个传感器同时为1
  • 小箱判定条件:低位传感器为1且高位传感器为0

在Network 3中添加两个常开触点,分别命名为 "PE_Low" 和 "PE_High",均定义为 Global input BOOL。

图2.14:PE_Low与PE_High常开触点

其后添加赋值指令(Assignment instruction)(位于"Bit logic operations"文件夹)。

图2.15:赋值指令位置

拖入指令,命名为 "Large_box",定义为 Local temp BOOL(局部临时布尔型)。

图2.16:"Large_box"位赋值指令

赋值指令将前序逻辑运算结果复制至关联位:

  • 若前序结果为1,则该位=1
  • 若前序结果为0,则该位=0

如此,当两个传感器同时为1时,"Large_Box"=1,表示检测到大箱。

小箱逻辑同理,但PE_High使用常闭触点(normally closed contact)(位于"Bit logic operations"文件夹)。

图2.17:常闭触点位置

赋值指令标签命名为 "Small_box"。

图2.18:"Small_box"位赋值指令

常闭触点逻辑:

  • 若关联位=0,则继续执行后续指令
  • 若关联位=1,则跳过后续指令

因此,"Small_box"=1 仅当 "PE_Low=1 且 PE_High=0" 时成立。


三、在TIA Portal中编程定时器

完成条件位定义后,开始编程推杆与电机行为。因规格要求基于时间的控制,我们将使用定时器。

传送带A(大箱)行为

在Network 4中添加两个常开触点:"Auto_mode" 和 "Large_box"。

图3.1:"Auto_mode"与"Large_box"条件判断

从 "Timer operations(定时器操作)" 文件夹拖入 TP指令。

图3.2:TP定时器指令位置

放置指令后弹出 "Call options(调用选项)" 窗口,要求创建存储定时器数据的数据块(DB, Data Block)。命名为 "timerA_DB" 并确认。

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

注:每次创建定时器或计数器时均会弹出此窗口,DB编号可保持自动分配

图3.4:创建timerA_DB的TP定时器

TP定时器(脉冲定时器) 特性:

  • 当 IN 输入=1时启动
  • Q输出在 PT(预设时间) 内保持为1
  • ET输出返回当前计时值
  • 若在计时期间IN多次置1,不影响当前计时值

PT输入需TIME数据类型,格式为 "T# + 时间值 + 单位"。本例需5秒,故输入 "T#5s"。

图3.5:设置定时器为5秒

⚠️ 重要:若保持当前逻辑,将导致机器故障——因复位IN输入不会重置当前时间,若5秒内多个大箱通过,Q输出仅维持5秒一次。解决方案:在IN输入前添加 "Reset timer(复位定时器)" 指令(位于"Timer operations"文件夹)。

图3.6:复位定时器指令

将复位指令关联至 "timerA_DB"。

如此,每次IN置1前先复位定时器,确保每次检测均重新计时。

注:本教程后续所有定时器均采用此逻辑

最后在Q输出后添加赋值指令,命名为 "Motor1",定义为 Global output BOOL(全局输出布尔型)。

图3.7:"Motor1"位赋值

至此,电机1将按规格运行。

传送带B(小箱)行为

因已有"Auto_mode"判断,无需重复添加。可在其后开分支(open branch)(位于"General"文件夹)构建传送带B逻辑。

图3.8:开分支指令位置

第一步:在分支中实现"检测到小箱后,传送带A运行2秒(将箱子送至推杆位置)"。定时器命名为 "timerB_DB",赋值指令仍关联 "Motor1"。

图3.9:传送带B第一步

第二步:2秒后激活电磁阀。在"Large_box"判断后另开分支,使用 TON定时器(接通延时定时器)(位于"Timer operations"文件夹)。

  • 定时器命名为 "timerC_DB"
  • PT设为 "T#2s"
  • 赋值指令命名为 "Solenoid_valve",定义为 Global output BOOL

图3.10:传送带B第二步

TON定时器特性:

  • IN=1时启动计时
  • PT时间到达后Q输出置1
  • ET返回当前计时值
  • 计时期间IN多次置1不影响计时

此定时器确保电磁阀在检测到小箱2秒后激活。

第三步:电磁阀激活时,电机2同步运行5秒。在"timerC_DB"输出后开新分支,添加带复位的TP定时器:

  • 命名为 "timerD_DB"
  • PT设为 "T#5s"
  • 赋值指令命名为 "Motor2",定义为 Global output BOOL

图3.11:传送带B第三步


四、在TIA Portal中编程计数器

完成机器行为逻辑后,添加计数器统计大/小箱数量。

在Network 6中:

  • 添加"Auto_mode"常开触点
  • 其后分两支:一支接"Large_box",一支接"Small_box"

图4.1:Network 6条件设置

"Large_box"后添加 CTU(CounterUp,加计数器) 指令(位于"Counter operations"文件夹),调用时命名为 "CounterL_DB"。

图4.2:CTU指令位置

图4.3:Network 6中创建的CTU指令

CTU特性:

  • CU输入每置1一次,计数值+1
  • 从 PV(预设值) 开始计数
  • CV输出返回当前计数值
  • R输入=1时复位计数器
  • PV保持为0(常量)
  • R输入关联 "Stop" 位(停机时复位计数器)

图4.4:将"Stop"位设为计数器复位条件

同理为"Small_box"分支创建计数器 "CounterS_DB"。

图4.5:创建小箱计数器

为读取计数值,需将CV输出关联至整数标签:

  • "num_L":大箱数量,定义为 Global memory INT
  • "num_S":小箱数量,定义为 Global memory INT

图4.6:将"num_L"和"num_S"关联至计数器CV输出


五、在TIA Portal中编程数学与转换指令

本节将对计数值进行运算,计算:

  • 箱子总数
  • 大/小箱百分比

计算总数

在Network 7中:

  • 添加"Auto_mode"常开触点
  • 其后添加 ADD(加法) 指令(位于"Math functions"文件夹)
  • IN1 = "num_L",IN2 = "num_S"
  • OUT = "total_box"(定义为 Global memory INT)

图5.1:ADD指令位置

图5.2:Network 7中创建ADD指令

ADD指令将IN1与IN2相加,结果输出至OUT,三者数据类型必须一致。

计算百分比

百分比计算需浮点运算,先将整数转换为实数(REAL):

在Network 8中:

  • 添加"Auto_mode"常开触点
  • 其后添加 CONVERT(转换) 指令(位于"Conversion operations"文件夹)

图5.3:CONVERT指令位置

图5.4:Network 8中创建CONV指令

CONVERT特性:

  • 将IN输入的数据类型转换为OUT输出的指定类型
  • 转换类型由"??? to ???"槽位决定(如INT to REAL)

设置为 "INT to REAL":

  • IN = "num_L"
  • OUT = "num_L_real"(定义为 Global memory Real)

图5.5:设置CONV指令

同理转换"num_S"与"total_box":

  • "num_S" → "num_S_real"
  • "total_box" → "total_box_real"

图5.6:定义"num_S_real"与"total_box_real"

百分比计算

大箱百分比 = (大箱数 / 总数) × 100

在Network 9中:

  1. DIV(除法) 指令(位于"Math functions"文件夹)
    • IN1 = "num_L_real"
    • IN2 = "total_box_real"
    • OUT = "division"(定义为 Local temp REAL)
    • 确保DIV类型为REAL

图5.7:DIV指令位置

图5.8:创建DIV函数

  1. MUL(乘法) 指令
    • IN1 = "division"
    • IN2 = "100.0"(必须带小数点,否则被识别为整数)
    • OUT = "percent_large"(定义为 Global memory Real)

图5.9:MUL指令位置

图5.10:Network 9中创建MUL指令

注意:必须输入 100.0 而非100,以确保被识别为实数

小箱百分比可直接用 100% - 大箱百分比 计算(因仅有两类箱子):

添加 SUB(减法) 指令:

  • IN1 = 100.0
  • IN2 = "percent_large"
  • OUT = "percent_small"

图5.11:Network 9中创建SUB指令


六、在TIA Portal中编程比较与移动指令

达到1000箱时停机

使用 CMP ==(等于比较) 指令(位于"Comparator operations"文件夹)触发停机:

  • 比较"total_box"与1000
  • 若相等,则执行后续的"Auto_mode"复位指令

图6.1:CMP == 指令位置

图6.2:Network 9中创建CMP指令

CMP指令按指定条件(本例为"==")比较上下两个值:

  • 条件成立则继续执行后续指令
  • 条件不成立则跳过
  • 两比较值数据类型必须一致

停机时重置实数变量

为避免下次启动时内存残留,停机时需将实数变量清零。使用 MOVE(移动) 指令(位于"Move operations"文件夹):

在Network 10中:

  • 先置位"Auto_mode"复位条件
  • 其前添加MOVE指令,将常量0复制至多个输出

图6.3:MOVE指令位置

图6.4:Network 10中创建MOVE指令

双击MOVE指令中的黄色星号,添加两个额外输出,分别关联:

  • "num_L_real"
  • "num_S_real"
  • "total_box_real"

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

如此,每次停机时自动将实数变量清零。


Conclusion(结论)

本教程逐步演示了如何仅使用基础指令在TIA Portal中编程一台简易机器。

西门子致力于打造对新手友好且对专家高效的开发环境。得益于IEC 61131标准,本教程探索的所有指令在其他PLC开发环境(如RSLogix 5000)中亦高度相似。

练习建议:尝试在其他厂商的PLC环境中复现本项目,深入体会各平台间的细微差异。

最新文章

随机文章