西门子 S7-200 SMART 核心指令(布尔指令、传送指令、数学运算指令和比较指令)详解
西门子 S7-200 SMART 核心指令详解:从基础到物料分拣实战
在小型工业自动化场景中,西门子 S7-200 SMART PLC 凭借性价比高、编程简洁、稳定性强的特点,成为很多工程师的首选。而 PLC 编程的核心,离不开布尔指令、传送指令、数学运算指令和比较指令—— 这四类指令就像 “乐高积木”,几乎所有逻辑控制需求,都能通过它们的组合实现。
今天我们就从这四类指令的基础用法入手,再通过一个 “物料分拣控制系统” 的实战案例,带你掌握指令的协同应用,真正把理论落地到工业场景。
一、四大核心指令:从原理到实操
1. 布尔指令(位逻辑指令):模拟 “继电器电路”
布尔指令只处理 “0/1”(OFF/ON)信号,对应传统继电器控制系统中的触点(常开 / 常闭) 和线圈,是构建逻辑回路的基础。
指令类型 | 指令符号 | 功能说明 | 实操示例 |
常开触点 | LD/A/O | 读取信号的原始状态(ON 时导通) | LD I0.0(左母线接常开触点 I0.0) |
A I0.1(串联常开触点 I0.1) | |||
O I0.2(并联常开触点 I0.2) | |||
常闭触点 | LDN/AN/ON | 读取信号的取反状态(OFF 时导通) | LDN I0.0(左母线接常闭触点 I0.0) |
AN I0.1(串联常闭触点 I0.1) | |||
ON I0.2(并联常闭触点 I0.2) | |||
输出线圈 | = | 将逻辑结果输出到指定线圈(保持当前状态) | = Q0.0(逻辑成立时 Q0.0 为 ON) |
置位 / 复位 | S/R | 强制线圈为 ON/OFF 并保持(需反向指令解除) | S Q0.0,1(置位 Q0.0 为 ON) |
R Q0.0,1(复位 Q0.0 为 OFF) |
关键逻辑:比如 “按下按钮 I0.0,灯 Q0.0 亮;按下 I0.1,灯灭”,用布尔指令就能轻松实现 ——LD I0.0 → AN I0.1 → = Q0.0。
2. 传送指令(Move):数据的 “复制粘贴”
传送指令用于在 PLC 的不同存储区(如 VB、VW、VD)之间复制数据,且不改变源数据(类似电脑的 “复制 - 粘贴”,而非 “剪切”)。根据数据长度,分为三类常用指令:
指令名称 | 指令符号 | 数据长度 | 功能说明 | 实操示例 |
移动字节 | MOV_B | 1 字节(8 位) | 传递 0-255 的小数值 | MOVB 16#0F, VB10(十六进制 0F→VB10) |
移动字 | MOV_W | 2 字节(16 位) | 传递整数(-32768~32767) | MOVW VW100, VW200(VW100→VW200) |
移动双字 | MOV_DW | 4 字节(32 位) | 传递双整数或地址指针 | MOVD &VB50, VD300(VB50 地址→VD300) |
应用场景:比如模拟量传感器的数值(存在 AIW0),需要传递到中间变量 VW100 中处理,就用MOVW AIW0, VW100。
3. 数学运算指令:实现 “数值计算”
数学运算指令用于对整数、双整数或实数进行加减乘除,核心注意点是 “操作数类型必须一致”(比如不能用整数和实数直接相加)。
运算类型 | 指令符号 | 数据类型 | 功能说明 | 实操示例 |
整数加法 | ADD_I | 16 位整数 | 目标值 = 目标值 + 源值 | ADD_I VW10, VW20(VW20 = VW20+VW10) |
整数减法 | SUB_I | 16 位整数 | 目标值 = 目标值 - 源值 | SUB_I VW30, VW40(VW40 = VW40-VW30) |
整数乘法 | MUL_I | 16 位整数 | 目标值 = 目标值 × 源值(结果仍为 16 位,可能溢出) | MUL_I VW50, VW60(VW60 = VW60×VW50) |
完全整数乘法 | MUL | 16 位整数 | 结果为 32 位双整数(避免溢出) | MUL VW50, VD60(VW50×VW60→VD60) |
整数除法 | DIV_I | 16 位整数 | 目标值 = 目标值 ÷ 源值(不保留余数) | DIV_I VW70, VW80(VW80 = VW80÷VW70) |
实操提醒:如果计算结果可能超过 32767(比如 1000×50=50000),一定要用 “完全乘法指令(MUL)”,将结果存到双字寄存器(如 VD)中,避免数据溢出。
4. 比较指令:判断 “数值关系”
比较指令用于判断两个同类型数值的大小关系(等于、大于、小于等),条件成立时,指令对应的 “触点” 会导通,进而触发后续逻辑。
比较关系 | 指令格式(字 / 双整数) | 功能说明 | 实操示例 |
等于 | LDW=/LDD= | 两个值相等时触点导通 | LDW= VW10, VW20(VW10=VW20 时导通) |
不等于 | LDW</>LDD<> | 两个值不相等时触点导通 | LDD<> VD30, VD40(VD30≠VD40 时导通) |
大于 | LDW>/LDD> | 前值大于后值时触点导通 | LDW> VW50, VW60(VW50>VW60 时导通) |
大于等于 | LDW>=/LDD>= | 前值大于等于后值时触点导通 | LDD>= VD70, VD80(VD70≥VD80 时导通) |
小于 | LDW</LDD< | 前值小于后值时触点导通 | LDW< VW90, VW100(VW90<VW100 时导通) |
小于等于 | LDW<=/LDD<= | 前值小于等于后值时触点导通 | LDD<= VD110, VD120(VD110≤VD120 时导通) |
关键区别:比较指令的 “数据类型” 要和操作数匹配 —— 比如比较 16 位整数用LDW=,比较 32 位双整数用LDD=,不能混用。