Introduction(引言)西门子提供了极为直观且用户友好的开发环境,是初学者练习PLC编程的绝佳起点。
在本教程中,我们将通过在TIA Portal中使用LADDER(梯形图)语言编程一台简易纸箱分拣机,探索西门子环境中符合IEC 61131-3标准的基础指令。目的是展示这些指令如何在真实应用中被使用。
要跟随本教程操作,您需要安装TIA Portal。我们将使用TIA Portal v17,但您也可以使用其他版本。
无需其他硬件或软件。
我们构建的机器是一个将小箱和大箱从入口送入并按尺寸分拣的系统(我们假定仅有两种箱子:大箱(large)和小箱(small))。
该机器配备:

图1.1:纸箱分拣机示意图
该机器必须满足以下条件:

图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)。
定义完所有规格后,即可开始编写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:基础指令集
打开 "Bit Logic Operations(位逻辑操作)" 文件夹,将一个**常开触点(normally open contact)和一个置位指令(Set instruction)**拖至Network 1的横线上。

图2.6:添加常开触点与置位指令
接下来为每条指令关联地址。点击指令上方的红色问号,按图输入标签名。

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

图2.8:定义标签
弹出窗口中设置数据区域、数据类型和内存地址:

图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:复位指令位置

图2.13:Stop与auto_mode标签
复位指令将关联位强制设为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时,"Large_Box"=1,表示检测到大箱。
小箱逻辑同理,但PE_High使用常闭触点(normally closed contact)(位于"Bit logic operations"文件夹)。

图2.17:常闭触点位置
赋值指令标签命名为 "Small_box"。

图2.18:"Small_box"位赋值指令
常闭触点逻辑:
因此,"Small_box"=1 仅当 "PE_Low=1 且 PE_High=0" 时成立。
完成条件位定义后,开始编程推杆与电机行为。因规格要求基于时间的控制,我们将使用定时器。
在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定时器(脉冲定时器) 特性:
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将按规格运行。
因已有"Auto_mode"判断,无需重复添加。可在其后开分支(open branch)(位于"General"文件夹)构建传送带B逻辑。

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

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

图3.10:传送带B第二步
TON定时器特性:
此定时器确保电磁阀在检测到小箱2秒后激活。
第三步:电磁阀激活时,电机2同步运行5秒。在"timerC_DB"输出后开新分支,添加带复位的TP定时器:

图3.11:传送带B第三步
完成机器行为逻辑后,添加计数器统计大/小箱数量。
在Network 6中:

图4.1:Network 6条件设置
"Large_box"后添加 CTU(CounterUp,加计数器) 指令(位于"Counter operations"文件夹),调用时命名为 "CounterL_DB"。

图4.2:CTU指令位置

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

图4.4:将"Stop"位设为计数器复位条件
同理为"Small_box"分支创建计数器 "CounterS_DB"。

图4.5:创建小箱计数器
为读取计数值,需将CV输出关联至整数标签:

图4.6:将"num_L"和"num_S"关联至计数器CV输出
本节将对计数值进行运算,计算:
在Network 7中:

图5.1:ADD指令位置

图5.2:Network 7中创建ADD指令
ADD指令将IN1与IN2相加,结果输出至OUT,三者数据类型必须一致。
百分比计算需浮点运算,先将整数转换为实数(REAL):
在Network 8中:

图5.3:CONVERT指令位置

图5.4:Network 8中创建CONV指令
CONVERT特性:
设置为 "INT to REAL":

图5.5:设置CONV指令
同理转换"num_S"与"total_box":

图5.6:定义"num_S_real"与"total_box_real"
大箱百分比 = (大箱数 / 总数) × 100
在Network 9中:

图5.7:DIV指令位置

图5.8:创建DIV函数

图5.9:MUL指令位置

图5.10:Network 9中创建MUL指令
注意:必须输入 100.0 而非100,以确保被识别为实数
小箱百分比可直接用 100% - 大箱百分比 计算(因仅有两类箱子):
添加 SUB(减法) 指令:

图5.11:Network 9中创建SUB指令
使用 CMP ==(等于比较) 指令(位于"Comparator operations"文件夹)触发停机:

图6.1:CMP == 指令位置
图6.2:Network 9中创建CMP指令
CMP指令按指定条件(本例为"==")比较上下两个值:
为避免下次启动时内存残留,停机时需将实数变量清零。使用 MOVE(移动) 指令(位于"Move operations"文件夹):
在Network 10中:

图6.3:MOVE指令位置
图6.4:Network 10中创建MOVE指令
双击MOVE指令中的黄色星号,添加两个额外输出,分别关联:

图6.5:使用MOVE指令将0写入三个输出
如此,每次停机时自动将实数变量清零。
本教程逐步演示了如何仅使用基础指令在TIA Portal中编程一台简易机器。
西门子致力于打造对新手友好且对专家高效的开发环境。得益于IEC 61131标准,本教程探索的所有指令在其他PLC开发环境(如RSLogix 5000)中亦高度相似。
练习建议:尝试在其他厂商的PLC环境中复现本项目,深入体会各平台间的细微差异。