求一个关于快递分拣的plc程序,使用西门子1200 点击:212 | 回复:3



Dcijan

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 0回
  • 年度积分:233
  • 历史总积分:233
  • 注册:2026年2月25日
发表于:2026-02-27 09:39:12
楼主
求助帖188分-未结帖
一个关于快递扫码分类的西门子plc1200模拟仿真。内容就是有3种快递码,扫到1号码快递皮带传到一号口,1灯亮,气缸推入一号口;扫到2号码快递皮带传到二号口,2灯亮,气缸推入二号口;扫到3号码快递皮带传到三号口,3灯亮,气缸推入三号口;快递码三种随机
此帖发自小程序


victor329

  • [版主]
  • 精华:1帖
  • 求助:27帖
  • 帖子:376帖 | 2678回
  • 年度积分:1257
  • 历史总积分:117987
  • 注册:2008年5月16日
发表于:2026-03-07 13:10:54
1楼

一个基于西门子 S7-1200 PLC 的快递扫码分类模拟仿真方案

1. 系统设计与 I/O 分配表

首先,我们需要定义输入(传感器/扫码枪信号)和输出(电机、指示灯、气缸)。

符号名称地址数据类型注释
输入 (Inputs)


Sensor_Start%I0.0Bool启动按钮/皮带运行允许
Scanner_Trigger%I0.1Bool扫码枪触发信号 (上升沿有效)
Code_Value%MW10Int扫码读取的数值 (1, 2, 或 3)
Sensor_Pos1%I0.2Bool1号口到位传感器 (可选,用于精确定位)
Sensor_Pos2%I0.3Bool2号口到位传感器
Sensor_Pos3%I0.4Bool3号口到位传感器
输出 (Outputs)


Motor_Belt%Q0.0Bool皮带传送电机
Light_1%Q0.1Bool1号口指示灯
Cylinder_1%Q0.2Bool1号口推料气缸
Light_2%Q0.3Bool2号口指示灯
Cylinder_2%Q0.4Bool2号口推料气缸
Light_3%Q0.5Bool3号口指示灯
Cylinder_3%Q0.6Bool3号口推料气缸
中间变量 (M区/DB)


Current_Code%MD20Int当前锁存的快递码
Timer_Delay%T1Timer气缸动作延时定时器
Step_Index%MW30Int状态机步骤索引

2. 控制逻辑流程 (状态机设计)

为了处理“随机扫码”和“动作执行”的时间差,我们采用一个简单的状态机 (State Machine) 逻辑:

  1. 待机状态 (Step 0): 皮带运行 (Motor_Belt=1),等待扫码信号。

  2. 扫码捕获 (Step 1): 检测到 Scanner_Trigger 上升沿,读取 Code_Value 存入 Current_Code,并根据代码点亮对应的灯。

  3. 定位延时 (Step 2): 快递在皮带上运行到对应气缸位置所需的时间(模拟时间,例如 2秒)。

  4. 执行推料 (Step 3): 对应气缸伸出 (Cylinder_x=1)。

  5. 复位 (Step 4): 气缸缩回,清除状态,回到待机状态。

3. PLC 程序实现 (SCL 语言示例)

在 TIA Portal 中创建一个功能块 (FB) 或直接在 OB1 中使用 SCL 编写如下逻辑。SCL 更适合处理这种多分支判断逻辑。

// 定义局部静态变量或全局变量 // Current_Code: 存储当前扫码结果 // Action_Timer: 用于模拟皮带传输时间的定时器 (TON) // 1. 初始化与皮带控制 IF "Sensor_Start" THEN     "Motor_Belt" := TRUE; // 皮带常转 ELSE     "Motor_Belt" := FALSE;     // 急停时复位所有输出     "Light_1" := FALSE; "Cylinder_1" := FALSE;     "Light_2" := FALSE; "Cylinder_2" := FALSE;     "Light_3" := FALSE; "Cylinder_3" := FALSE;     "Current_Code" := 0; END_IF; // 2. 扫码信号处理 (上升沿检测) // 假设使用系统指令 R_TRIG 检测 Scanner_Trigger IF "Scanner_Trigger" AND NOT "Scanner_Trigger_Prev" THEN     "Current_Code" := "Code_Value"; // 锁存扫码值          // 复位之前的灯     "Light_1" := FALSE; "Light_2" := FALSE; "Light_3" := FALSE;          // 根据代码点亮对应的灯     CASE "Current_Code" OF         1: "Light_1" := TRUE;         2: "Light_2" := TRUE;         3: "Light_3" := TRUE;         ELSE              // 无效码处理,可加报警             "Current_Code" := 0;      END_CASE;          // 启动传输延时定时器 (假设需要2秒到达推料口)     "Action_Timer".IN := TRUE;     "Action_Timer".PT := T#2s;  END_IF; "Scanner_Trigger_Prev" := "Scanner_Trigger"; // 更新上升沿记忆位 // 3. 执行推料逻辑 (当定时器完成时) IF "Action_Timer".Q AND "Current_Code" > 0 THEN     // 复位定时器输入以便下次触发     "Action_Timer".IN := FALSE;           CASE "Current_Code" OF         1:              "Cylinder_1" := TRUE; // 1号气缸推出             "Light_1" := FALSE;   // 动作开始后灭灯 (可选)         2:              "Cylinder_2" := TRUE; // 2号气缸推出             "Light_2" := FALSE;         3:              "Cylinder_3" := TRUE; // 3号气缸推出             "Light_3" := FALSE;     END_CASE;          // 设置一个短延时让气缸保持伸出,然后复位 (这里用简单的计数器或第二个定时器逻辑)     // 为简化演示,假设下一个扫描周期或外部传感器反馈后复位     // 实际项目中通常由 "气缸伸出到位传感器" 触发缩回,或者延时1秒后自动缩回          // 简单自动复位逻辑:动作完成后延时0.5秒缩回     IF "Retract_Timer".Q THEN          "Cylinder_1" := FALSE;          "Cylinder_2" := FALSE;          "Cylinder_3" := FALSE;          "Current_Code" := 0; // 清空当前码,准备下一次          "Retract_Timer".IN := FALSE;     ELSE          "Retract_Timer".IN := TRUE;          "Retract_Timer".PT := T#0.5s;     END_IF;      ELSE     "Retract_Timer".IN := FALSE;     "Retract_Timer".Q := FALSE; // 复位定时器状态 END_IF;

4. 梯形图 (LAD) 逻辑思路图解

如果你更习惯使用梯形图,逻辑结构如下:

  1. 网络 1 (皮带控制):

    • Sensor_Start (常开) ---> (Motor_Belt) 线圈。

  2. 网络 2 (扫码锁存):

    • 使用 P_TRIG 指令检测 Scanner_Trigger

    • 当触发时,执行 MOVE 指令:将 Code_Value 移动到 Current_Code

    • 同时复位所有气缸输出。

  3. 网络 3 (指示灯逻辑):

    • Current_Code == 1 (比较指令) ---> (Light_1)

    • Current_Code == 2 (比较指令) ---> (Light_2)

    • Current_Code == 3 (比较指令) ---> (Light_3)

  4. 网络 4 (传输延时):

    • P_TRIG 的输出 (作为启动条件) ---> TON 定时器 (设定时间=模拟传输时间)。

  5. 网络 5 (气缸动作):

    • 定时器完成位 (Q) AND (Current_Code == 1) ---> (Cylinder_1)

    • 定时器完成位 (Q) AND (Current_Code == 2) ---> (Cylinder_2)

    • 定时器完成位 (Q) AND (Current_Code == 3) ---> (Cylinder_3)

  6. 网络 6 (自动复位):

    • 使用第二个定时器,在气缸动作后延时 0.5s,复位 Current_Code 为 0,并复位所有气缸线圈。


以上,仅供参考!

回复本条

    

稳住别浪

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 130回
  • 年度积分:0
  • 历史总积分:150
  • 注册:2021年4月24日
发表于:2026-03-12 14:12:55
2楼

### 西门子S7-1200快递扫码分类模拟仿真方案 我将为你设计一套完整的S7-1200 PLC程序,实现快递扫码分类的模拟控制,包含随机快递码生成、皮带输送、指示灯控制和气缸推料逻辑,可直接在TIA Portal中仿真运行。 #### 一、硬件配置(仿真) | 地址       | 类型   | 功能说明                | |------------|--------|-------------------------| | I0.0       | 输入   | 系统启动按钮(常开)    | | I0.1       | 输入   | 系统停止按钮(常闭)    | | I0.2       | 输入   | 扫码触发信号(模拟扫码)| | Q0.0-Q0.2  | 输出   | 1/2/3号口指示灯         | | Q0.3-Q0.5  | 输出   | 1/2/3号口气缸推料       | | Q0.6       | 输出   | 皮带运行指示灯          | | Q1.0       | 输出   | 皮带电机运行            | #### 二、PLC程序(TIA Portal V17/V18) ```awl // 程序组织单元:OB1(主循环) NETWORK 1: 系统启停控制 TITLE = 系统总开关 VAR    Start : BOOL := FALSE; // 系统启动标志    Stop : BOOL := FALSE;  // 系统停止标志    Belt_Run : BOOL := FALSE; // 皮带运行标志 END_VAR // 启动按钮(I0.0)置位启动标志,停止按钮(I0.1)复位 Start := "I0.0" OR (Start AND NOT Stop); Stop := "I0.1"; Belt_Run := Start AND NOT Stop; // 皮带电机和指示灯控制 "Q1.0" := Belt_Run; // 皮带电机运行 "Q0.6" := Belt_Run; // 皮带运行指示灯 NETWORK 2: 随机快递码生成(模拟扫码) TITLE = 随机生成1-3号快递码 VAR    Scan_Trigger : BOOL := FALSE; // 扫码触发    Express_Code : INT := 0; // 快递码(1/2/3)    Random_Value : INT := 0; // 随机数缓存    T1 : TON; // 扫码间隔定时器(防止重复触发) END_VAR // 扫码触发信号(I0.2),并添加1秒延时防止重复触发 Scan_Trigger := "I0.2" AND NOT T1.Q; T1(IN:=Scan_Trigger, PT:=T#1S); // 1秒延时 // 当扫码触发且系统运行时,生成1-3随机数 IF Scan_Trigger AND Belt_Run THEN    Random_Value := RAND(); // 生成0-32767随机数    Express_Code := MOD(Random_Value, 3) + 1; // 转换为1-3 END_IF; NETWORK 3: 快递分类控制 TITLE = 按快递码控制指示灯和气缸 VAR    Cylinder1_Timer : TON; // 1号气缸动作定时器    Cylinder2_Timer : TON; // 2号气缸动作定时器    Cylinder3_Timer : TON; // 3号气缸动作定时器 END_VAR // 1号快递处理逻辑(2秒气缸动作,自动复位) IF Express_Code = 1 THEN    "Q0.0" := TRUE; // 1号灯亮    Cylinder1_Timer(IN:=TRUE, PT:=T#2S); // 气缸动作2秒    "Q0.3" := Cylinder1_Timer.Q; // 1号气缸推出 ELSE    "Q0.0" := FALSE; // 1号灯灭    Cylinder1_Timer(IN:=FALSE); // 定时器复位    "Q0.3" := FALSE; // 1号气缸复位 END_IF; // 2号快递处理逻辑 IF Express_Code = 2 THEN    "Q0.1" := TRUE; // 2号灯亮    Cylinder2_Timer(IN:=TRUE, PT:=T#2S);    "Q0.4" := Cylinder2_Timer.Q; // 2号气缸推出 ELSE    "Q0.1" := FALSE; // 2号灯灭    Cylinder2_Timer(IN:=FALSE);    "Q0.4" := FALSE; // 2号气缸复位 END_IF; // 3号快递处理逻辑 IF Express_Code = 3 THEN    "Q0.2" := TRUE; // 3号灯亮    Cylinder3_Timer(IN:=TRUE, PT:=T#2S);    "Q0.5" := Cylinder3_Timer.Q; // 3号气缸推出 ELSE    "Q0.2" := FALSE; // 3号灯灭    Cylinder3_Timer(IN:=FALSE);    "Q0.5" := FALSE; // 3号气缸复位 END_IF; NETWORK 4: 快递码复位 TITLE = 处理完成后复位快递码 // 所有气缸动作完成后,复位快递码,等待下一次扫码 IF Cylinder1_Timer.Q OR Cylinder2_Timer.Q OR Cylinder3_Timer.Q THEN    IF T1.Q THEN // 扫码延时结束后        Express_Code := 0; // 复位快递码    END_IF; END_IF; ``` #### 三、仿真操作步骤 1. **环境准备**:   - 打开TIA Portal V17/V18,创建S7-1200(如1214C)项目   - 导入上述程序,编译无错误后,进入“仿真”模式 2. **操作流程**:   - 强制置位`I0.0`(启动按钮),此时`Q0.6`(皮带指示灯)和`Q1.0`(皮带电机)亮   - 强制置位`I0.2`(扫码触发),PLC自动生成1-3随机快递码   - 对应编号的指示灯(Q0.0/Q0.1/Q0.2)亮起,2秒后对应气缸(Q0.3/Q0.4/Q0.5)动作   - 气缸动作完成后,自动复位,等待下一次扫码   - 强制置位`I0.1`(停止按钮),系统停止运行 #### 四、程序关键说明 1. **随机数生成**:使用`RAND()`函数生成随机数,通过`MOD`取余转换为1-3的快递码,模拟真实扫码的随机效果 2. **防重复触发**:添加1秒延时定时器(T1),避免单次扫码触发多次分类动作 3. **气缸控制**:每个气缸对应独立的定时器,动作时间设为2秒,模拟实际推料过程,时间可根据需求调整(修改`PT:=T#2S`中的数值) 4. **逻辑保护**:只有系统启动后,扫码和分类逻辑才会生效,确保操作安全 ### 总结 1. **核心逻辑**:通过随机数模拟扫码结果,根据快递码(1/2/3)分别控制对应指示灯亮和气缸推料,2秒后自动复位 2. **运行条件**:需先启动系统(I0.0),触发扫码(I0.2)才会执行分类逻辑,停止按钮(I0.1)可紧急停止 3. **仿真要点**:在TIA Portal中强制置位输入点(I0.0/I0.2),观察输出点(Q0.0-Q0.5/Q1.0)的状态变化,验证逻辑正确性 你可根据实际需求调整气缸动作时间、扫码间隔等参数,若需要添加皮带输送位置检测(如光电开关),可在程序中增加I0.3-I0.5作为各出口的到位检测信号,进一步完善逻辑。

回复本条

    

独松

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 4回
  • 年度积分:0
  • 历史总积分:137
  • 注册:2019年9月16日
发表于:2026-03-19 04:37:27
3楼

I/O表:

变量名称地址数据类型注释
Barcode_ScannerIW10Int扫码枪输入的快递码 (1, 2, 3)
Lamp_1Q0.0Bool1号口指示灯
Cylinder_1Q0.1Bool1号口气缸
Lamp_2Q0.2Bool2号口指示灯
Cylinder_2Q0.3Bool2号口气缸
Lamp_3Q0.4Bool3号口指示灯
Cylinder_3Q0.5Bool3号口气缸


程序:

// 复位所有输出 "Lamp_1" := FALSE; "Cylinder_1" := FALSE; "Lamp_2" := FALSE; "Cylinder_2" := FALSE; "Lamp_3" := FALSE; "Cylinder_3" := FALSE; // 根据扫码结果进行判断 CASE "Barcode_Scanner" OF    1:  // 扫到1号码        "Lamp_1" := TRUE;        "Cylinder_1" := TRUE;        // 可以添加定时器,控制气缸推出一定时间后收回            2:  // 扫到2号码        "Lamp_2" := TRUE;        "Cylinder_2" := TRUE;        // 可以添加定时器,控制气缸推出一定时间后收回            3:  // 扫到3号码        "Lamp_3" := TRUE;        "Cylinder_3" := TRUE;        // 可以添加定时器,控制气缸推出一定时间后收回            ELSE        // 可选:处理无效码或错误情况        // 例如,触发一个报警灯 END_CASE;

回复本条

    

热门招聘
相关主题

官方公众号

智造工程师