【SCL】博图scl语言应用项目:装配流水线模拟控制

news2024/11/19 5:27:51

使用西门子博图SCL语言和factoryio软件来编写应用案例——装配流水线模拟控制项目

文章目录

目录

前言

一、应用:装配流水线模拟控制

1.控制要求

2.完善控制要求和场景 

1.布置场景(factoryio)

2.控制要求 

3.变量表(I/O分配)  

3.编写程序

1.编写准备 

2.编写 

3.完整程序图 



前言

读万卷书,行万里路;

前面几章学过了SCL指令的使用部分,这一章我们通过应用案例(装配流水线模拟控制)来继续学习SCL语言;理论和实践相辅相成,两者相结合可以更好的掌握我们学习的知识!

这里仿真调试会用到博图仿真和factoryio(虚拟工厂) 的模拟仿真来实现整体效果。

下面进入正文:


一、应用:装配流水线模拟控制

1.控制要求

按下启动开关按钮,起动整个传送系统,工件开始在传送带移位。扭子开关打到 OFF
装配流水线停止工作。 A B C 三个灯模拟的是三个操作, D E F G 四组灯模拟的是
传送带。 工件从 1 号位装入,分别在 A (操作 1 )、 B (操作 2 )、 C (操作 3 )三个工位完
成三种装配操作,经最后一个工位后送入仓库; D E F G 均是 3 个灯一组的模拟传送
带,这些工位均用于传送工件。工件在传送带上开始传送,经过 DEFG 传送之后进行 A
作,再经过 DEFG 传送之后进行 B 操作,再经过 DEFG 传送之后进行 C 操作,然后经过 DEFG
传送到仓库 H
控制流程图:

 I/O分配:

输入输出
名称作用地址名称作用地址
ON启动I0.0

A

A操作Q0.0
OFF停止I0.1BB操作Q0.1
CC操作Q0.2
DD传送带Q0.3
EE传送带Q0.4
FF传送带Q0.5
GG传送带Q0.6
HH仓库Q0.7

具体运行动作:

 题目要求大概就是,有一个工件在环形传送带上(由DEFG4节传送带组成),运行1圈后,进行A操作;运行2圈后,进行B操作;第3圈是C操作,最后再运行1圈放入仓库。


2.完善控制要求和场景 

 这个题也用梯形图编写过,但是整体效果有缺失,题目要求1圈后A操作,但并没有时间限制,到最后进入仓库也是没有要求,以及如何将工件放到操作台上,题目里没有细说;

在前面使用虚拟工厂来布置环境时,为了整体效果加上了一个机械臂,操作台和仓库,完成效果很好!所以本篇所写的是改进后的 装配模拟控制项目应用;原题可以参考前面梯形图写过的那篇。

 1.布置场景(factoryio)

具体的场景布置如图:4个2m的传送带,4个1/4圆的环形传送带(2个1组,代表题目中的1条传送带),1个机械臂, 1个三色灯,3个传感器,1个配电箱2个按钮;

 

2.控制要求 

 大概控制流程:按下启动按钮,传送带依次运行将工件运至G传感器位置,机械臂将料放到操作台,第1次进行A操作,时间到后,再将工件放到传送带进行传送,第2次进行B操作,然后第3次C操作;当运行第4次时,机械臂将工件放到仓库传送带,传送带运行让工件消失,机械臂回到原位,停止。在运行时按下停止按钮,根据当前状态进行不同停止。

 (以下要求是我自己设置的,大家可以根据自己设置的来编写)

 具体控制要求:

1. 启动部分:

1. 按下启动按钮,D传送带运行,2s后E传送带运行,4s后F传送带运行D传送带停止,F运行2s后G传送带运行,E传送带停止,G运行2S后,D传送带再次运行,当碰到G传感器后,传送带全部停止;碰到传感器后,吸盘得电,1s后机械手下降,延时0.5s,时间到后机械手缩回,计时1.5s,1.5s时间到后,机械臂左转,再1.5s后 机械手下降,并计时1.5s ,时间到后,吸盘失电,机械手缩回,料到位传感器得电,1s后工件开始进行A操作,计时加工6s,时间到后指示灯灭,吸盘得电,计时1s,1s后,机械手下降,计时1.5s,1.5s后机械手缩回,缩回1s后,机械臂右转,计时1s机械手下降,下降1s后,吸盘失电,机械手缩回,再次计时1.5s后,传送带部分再次运行,进行B、C操作;

2. 当工件ABC操作加工后,机械手再次吸起工件然后左转,延时1s后,机械臂伸出,计时2.5s,1s后机械手下降,当仓库传感器得电后,仓库传送带运行,然后机械臂,机械手缩回,计时2s,2s后机械臂回到原位,仓库停止,至此工作流程完成。

2. 停止部分:当按下停止按钮后,系统判断当前状态,根据不同的状态来停止

第一种情况:工件还在传送带内,按下停止后,系统将工件运回原位后停止,并且不影响下次启动;

第二种情况:机械手在搬运工件或在搬运的途中,或者工件正在加工,按下停止后,机械臂等待工件加工完成,并将工件放在初始位,然后机械臂返回初始位停止,不影响下次启动;

第三种情况:机械手要将工件放入仓库时或运行途中,按下停止,机械并应先运行完当前工作并返回初始位后停止,不影响下次启动。

3.变量表(I/O分配)  

分配变量时,可以先写在虚拟工厂里面的,写好后导出文件,在博图变量表里面导入就可以了! 

I/O分配: 

输入输出
名称作用地址名称作用地址
ON启动I0.0D传送带传送Q0.0
OFF停止I0.1E传送带1传送Q0.1
仓库传感器传感器I0.2E传送带2传送Q0.2
左转右转传感器传感器I0.3F传送带传送Q0.3
料到位传感器传感器I0.4G传送带1传送Q0.4

G传感器

传感器I0.5G传送带2传送Q0.5
机械手伸出到位传感器传感器I0.6A操作指示灯指示灯Q0.6
机械手下降上升传感器传感器I0.7B操作指示灯指示灯Q0.7
C操作指示灯指示灯Q1.0
ABC操作台操作台Q1.1
仓库传送Q1.2
吸盘吸盘Q1.3
机械手伸出伸出Q1.4
机械臂伸出伸出Q1.5
机械臂右转右转Q1.6
机械臂左转左转Q1.7

factoryio变量:

 


3.编写程序

1.编写准备 

1.博图软件建立新项目,写入I/O变量;2.创建factoryio软件新项目,布置场景并放置变量;3.博图仿真和factoryio进行连接。

 


 

2.编写 

1.启动部分: 

1. 按下启动按钮,D传送带运行,2s后E传送带运行,4s后F传送带运行D传送带停止,F运行2s后G传送带运行,E传送带停止,G运行2S后,D传送带再次运行,

 看下题目可以发现,前3次都是相同的,是在做同一个动作,那么我们只要写一次流程,再循环三次,分别判断一下是第几次,然后亮不同颜色的指示灯就可以了。

这里可以直接使用if语句,再接定时器,来实现前面的要求,但是写到后期会很乱,定时器很多!再者还要循环3次,所以这里我们可以果断选择case of语句,传不同的数给变量进行不同的操作,在循环时会比较方便。

首先要在数据块DB中建一个变量流程步(int类型),流程步为0时,如果按下ON,就传1,传送带启动运行,使用定时器和输出点来进入下一步,这样一步一步走下来,4节传送带部分就完成了!

CASE "数据块_1".流程步 OF
        //第0步,按下启动按钮,流程步为1,并将定时器输出和变量进行初始化;
    0:
        IF "ON" THEN
            "数据块_1".流程步 := 1;
           
        END_IF;
        //第1步,D传送带运行,2s后流程步为2;
    1:
        "D传送带" := 1;
        "IEC_Timer_0_DB_9".TON(IN := "D传送带" & NOT "G传送带1",
                               PT := T#2s,
                               Q => "输出点1");
        IF "输出点1" THEN
            "数据块_1".流程步 := 2;
        END_IF;
        //第2步,E传送带运行,4s后流程步为3;
    2:
        "E传送带1" := 1;
        "E传送带2" := 1;
        "IEC_Timer_0_DB_10".TON(IN := "E传送带1",
                                PT := T#4s,
                                Q => "输出点2");
        IF "输出点2" THEN
            "数据块_1".流程步 := 3;
        END_IF;
        //第3步,F传送带运行D传送带停止,F运行2s后G传送带运行,E传送带停止,
        //G运行2S后,流程步为4;
    3:
        "F传送带" := 1;
        "D传送带" := 0;
        "IEC_Timer_0_DB_11".TON(IN := "F传送带",
                                PT := T#2s,
                                Q => "输出点3");
        IF "输出点3" THEN
            "G传送带1" := 1;
            "G传送带2" := 1;
            "E传送带1" := 0;
            "E传送带2" := 0;
        END_IF;
        "IEC_Timer_0_DB_12".TON(IN := "G传送带1",
                                PT := T#2s,
                                Q => "输出点4");
        IF "输出点4" THEN
            "数据块_1".流程步 := 4;
        END_IF;
     //第4步,D传送带再次运行,当碰到G传感器后,传送带全部停止,流程步为5;   
    4:
        "D传送带" := 1;
        //限制,当按下停止时,此传感器不得电
        IF "数据块_1".变量J=0 THEN
            "F_TRIG_DB_1"(CLK := "G传感器",
                          Q => "下降沿1");
        END_IF;
        
        IF "下降沿1" THEN
            "D传送带" := 0;
            "E传送带1" := 0;
            "E传送带2" := 0;
            "F传送带" := 0;
            "G传送带1" := 0;
            "G传送带2" := 0;
            "数据块_1".流程步 := 5;
        END_IF;

然后再看下面的控制要求:

当碰到G传感器后,传送带全部停止;碰到传感器后,吸盘得电,1s后机械手下降,延时0.5s,时间到后机械手缩回,计时1.5s,1.5s时间到后,机械臂左转,再1.5s后 机械手下降,并计时1.5s ,时间到后,吸盘失电,机械手缩回,料到位传感器得电,1s后工件开始进行A操作,计时加工6s,时间到后指示灯灭,吸盘得电,计时1s,1s后,机械手下降,计时1.5s,1.5s后机械手缩回,缩回1s后,机械臂右转,计时1s机械手下降,下降1s后,吸盘失电,机械手缩回, 

 当碰到传感器后,传送带停止,就要进行机械手部分的控制,这里就是按着要求来进行计时机械手伸出或下降等等。到这里第一个A操作加工流程就完成了!

     //第5步,吸盘得电,1s后机械手下降,用机械手伸出到位传感器接通0.5s延时;
    5:
        
        "吸盘" := 1;
        "IEC_Timer_0_DB".TON(IN := "吸盘",
                             PT := T#1s,
                             Q => "输出点5");
        
        IF "输出点5" THEN
            "机械手伸出" := 1;
        END_IF;
        
        "IEC_Timer_0_DB_1".TON(IN := "机械手伸出到位传感器",
                               PT := T#0.5s,
                               Q => "输出点6");
        IF "输出点6" THEN
            "数据块_1".流程步 := 6;
        END_IF;
        //第6步,时间到后机械手缩回,计时1.5s;
    6:
        "机械手伸出" := 0;
        "中继3" := 1;
        "IEC_Timer_0_DB_2".TON(IN := "中继3",
                               PT := T#1.5s,
                               Q => "输出点7");
        IF "输出点7" THEN
            "数据块_1".流程步 := 7;
            "中继3" := 0;
        END_IF;
        //第7步,1.5s时间到后,机械臂左转,1.5s后到流程步8;
    7:
        "中继4" := 1;
        "机械臂左转" := 1;
        
        "IEC_Timer_0_DB_4".TON(IN := "机械臂左转",
                               PT := T#1.5s,
                               Q => "输出点9");
       
        IF "输出点9"THEN
            "中继4" := 0;
            "数据块_1".流程步 := 8;            
        END_IF;
       //第8步,机械手下降,计时1.5s 
    8:
        "中继6" := 1;
        "机械手伸出" := 1;
        "中继5" := 0;
        "IEC_Timer_0_DB_3".TON(IN := "机械手伸出",
                               PT := T#1.5s,
                               Q => "输出点10");
        IF "输出点10" THEN
            
            "数据块_1".流程步 := 9;
        END_IF;
        //第9步,时间到后,吸盘失电,机械手缩回,1s后进行工件加工;
    9:
        "吸盘" := 0;
        "中继7" := 1;
        "中继6" := 0;
        "机械手伸出" := 0;
        "IEC_Timer_0_DB_5".TON(IN := "中继7",
                               PT := T#1s,
                               Q => "输出点11");
               
                IF "输出点11" THEN
                    "中继7" := 0;
                    "A操作指示灯" := 1;
                    "数据块_1".流程步 := 10;
                END_IF;         
                
        END_CASE;
        //第10步,工件加工6s
    10:
        "IEC_Timer_0_DB_6".TON(IN := "A操作指示灯",
                               PT := T#6s,
                               Q => "输出点12");
        IF "输出点12" THEN
            "数据块_1".流程步 := 11;
            
        END_IF;
        //第11步,时间到后指示灯灭,吸盘得电,计时1s
    11:
             "C操作指示灯" := 0;
             "B操作指示灯" := 0;
            "A操作指示灯" := 0;
            "吸盘" := 1;
            "IEC_Timer_0_DB_7".TON(IN := "吸盘",
                                   PT := T#1s,
                                   Q => "输出点13");
            IF "输出点13" THEN
                "数据块_1".流程步 := 12;
            END_IF;
            //第12步,1s后,机械手下降,计时1.5s
        12:
            
            "机械手伸出" := 1;
            "IEC_Timer_0_DB_8".TON(IN:="机械手伸出",
                                   PT:=T#1.5s,
                                   Q=>"输出点14");
            IF "输出点14" THEN
                "数据块_1".流程步 := 13;
            END_IF;
            //第13步,1.5s后机械手缩回,1s后,机械臂右转,计时1s
        13:
            "机械手伸出" := 0;
            "中继8" := 1;
            "IEC_Timer_0_DB_13".TON(IN:="中继8",
                                    PT:=T#1s,
                                    Q=>"输出点15");
            IF "输出点15" THEN
                "机械臂右转" := 1;
            END_IF;
            
            "IEC_Timer_0_DB_14".TON(IN := "机械臂右转",
                                    PT := T#1s,
                                    Q => "输出点16");
              IF "输出点16" THEN
                  "数据块_1".流程步 := 14;
                  "中继8" := 0;
              END_IF;
      //第14步,机械手下降,计时1s,吸盘失电,1.5s后进行下一步
      14:
          "机械手伸出" := 1;
          "IEC_Timer_0_DB_15".TON(IN := "机械手伸出",
                                  PT := T#1s,
                                  Q => "输出点17");
          IF "输出点17" THEN
              "中继9" := 1;
              "吸盘" := 0;
              "机械手伸出" := 0;
          END_IF;
    
          "IEC_Timer_0_DB_16".TON(IN := "中继9",
                                  PT := T#1.5s,
                                  Q => "输出点18");
           
            IF "输出点18" THEN
                "数据块_1".流程步 := 15;
                "中继9" := 0;
            END_IF;
           

这里我们可以连接虚拟工厂来看一下效果:(GIF有点模糊,但大致流程是可以看到的)

 第1个流程做好之后,后面两次只要循环就好了!看要求:

再次计时1.5s后,传送带部分再次运行,进行B、C操作; 

时间到之后,再进行BC操作;那么这里我们要在流程里面加一些条件来判断当前是第几个循环 ,然后每个循环进行不同的操作。

进入第15步后,将机械臂左转右转清零 ,再将上面使用过的定时器复位,这里用到定时器复位指令  RESET_TIMER()括号中是要清零的定时器,最后再将流程步赋值为1,进行循环;

 15:
            "机械臂右转" := 0;
            "机械臂左转" := 0;
            RESET_TIMER("IEC_Timer_0_DB");
            RESET_TIMER("IEC_Timer_0_DB_1");
            RESET_TIMER("IEC_Timer_0_DB_2");
            RESET_TIMER("IEC_Timer_0_DB_3");
            RESET_TIMER("IEC_Timer_0_DB_4");
            RESET_TIMER("IEC_Timer_0_DB_5");
            RESET_TIMER("IEC_Timer_0_DB_6");
            RESET_TIMER("IEC_Timer_0_DB_7");
            RESET_TIMER("IEC_Timer_0_DB_8");
            RESET_TIMER("IEC_Timer_0_DB_9");
            RESET_TIMER("IEC_Timer_0_DB_10");
            RESET_TIMER("IEC_Timer_0_DB_11");
            RESET_TIMER("IEC_Timer_0_DB_12");
            RESET_TIMER("IEC_Timer_0_DB_13");
            RESET_TIMER("IEC_Timer_0_DB_14");
            RESET_TIMER("IEC_Timer_0_DB_15");
            RESET_TIMER("IEC_Timer_0_DB_16");
            "数据块_1".流程步 := 1;
            

 在循环中我们要加入相应判断:在第7步时,用左转右转传感器来对变量I进行+1操作,如果变量I<=3,就继续向下走,当变量=4时就跳入16,进行其他操作;

       //第7步,1.5s时间到后,机械臂左转,1.5s后到流程步8;
    7:
        "中继4" := 1;
        "机械臂左转" := 1;
        //用左转右转传感器对变量I进行加数
        "R_TRIG_DB"(CLK :=  "左转右转传感器",
                    Q => "上升沿4");
        IF "上升沿4" THEN
            "数据块_1".变量I := "数据块_1".变量I + 1;
        END_IF;
        
        "IEC_Timer_0_DB_4".TON(IN := "机械臂左转",
                               PT := T#1.5s,
                               Q => "输出点9");
        //如果变量I<=3次,就接着到第8步,如果变量等于4就到第16步
        IF "输出点9"&"数据块_1".变量I<=3 THEN
            "中继4" := 0;
            "数据块_1".流程步 := 8;
            
        ELSIF "输出点9" & "数据块_1".变量I=4 THEN
            "中继4" := 0;
            "数据块_1".流程步 := 16;
            
        END_IF;

 当运行到第9步时,如果变量<=3,就进入一个小的case语句,第1次A操作,第2次B操作,然后C操作,完成之后进行下一步;当变量=4的时候,就跳出进行其他操作;

 //第9步,时间到后,吸盘失电,机械手缩回,1s后进入case语句中,判断次数进行工件加工;
    9:
        "吸盘" := 0;
        "中继7" := 1;
        "中继6" := 0;
        "机械手伸出" := 0;
        "IEC_Timer_0_DB_5".TON(IN := "中继7",
                               PT := T#1s,
                               Q => "输出点11");
        //第4次跳出,到流程步17
        IF "数据块_1".变量I = 4 THEN
            "数据块_1".流程步 := 17;
        END_IF;
       //前3次对工件进行加工,并亮不同的指示灯 
        CASE "数据块_1".变量I OF
                //A操作
             1:
                IF "输出点11" THEN
                    "中继7" := 0;
                    "A操作指示灯" := 1;
                    "数据块_1".流程步 := 10;
                END_IF;
                //B操作
            2:
                IF "输出点11" THEN
                    "中继7" := 0;
                    "B操作指示灯" := 1;
                    "数据块_1".流程步 := 10;
                END_IF;
                //C操作
            3:
                IF "输出点11" THEN
                    "中继7" := 0;
                    "C操作指示灯" := 1;
                    "数据块_1".流程步 := 10;
                END_IF;
                
        END_CASE;

 前面3次完成后,我们接着往下看:

 2. 当工件ABC操作加工后,机械手再次吸起工件然后左转,延时1s后,机械臂伸出,计时2.5s,1s后机械手下降,当仓库传感器得电后,仓库传送带运行,然后机械臂,机械手缩回,计时2s,2s后机械臂回到原位,仓库停止,至此工作流程完成。

当ABC都完成后,第4次要放入仓库传送带上,就要用到机械臂,机械手还是和上面相同。

在第7步时,变量=4,就进入第16步;

 机械臂伸出,时间到后再回到第8步,进行机械手的伸出和缩回;

 //第16步,当变量I=4时,跳到这一步,机械臂伸出,计时2.5s ,并跳到第8步
      //让机械手伸出放工件,然后缩回;
      16:
          "机械臂伸出" := 1;
    "IEC_Timer_0_DB_17".TON(IN:="机械臂伸出",
                            PT:=T#2.5s,
                            Q=>"输出点20");
    IF "输出点20" THEN
        "数据块_1".流程步 := 8;
    END_IF;
   

 回到第8步进行机械手伸出和缩回,到第9步后,判断变量=4,就跳入第17步;

 8:
        "中继6" := 1;
        "机械手伸出" := 1;
        "中继5" := 0;
        "IEC_Timer_0_DB_3".TON(IN := "机械手伸出",
                               PT := T#1.5s,
                               Q => "输出点10");
        IF "输出点10" THEN
            
            "数据块_1".流程步 := 9;
        END_IF;
        //第9步,时间到后,吸盘失电,机械手缩回,1s后进入case语句中,判断次数进行工件加工;
    9:
        "吸盘" := 0;
        "中继7" := 1;
        "中继6" := 0;
        "机械手伸出" := 0;
        "IEC_Timer_0_DB_5".TON(IN := "中继7",
                               PT := T#1s,
                               Q => "输出点11");
        //第4次跳出,到流程步17
        IF "数据块_1".变量I = 4 THEN
            "数据块_1".流程步 := 17;
        END_IF;

 在17步时,通过仓库传感器来让传送带运行,机械臂缩回,2s后右转到原位,再将仓库和变量复位为零。

   
    //第17步,如果仓库传感器得电,仓库传送带运行,然后机械臂缩回,计时2s,2s后机械臂右转;
17:
    "中继11" := 1;
    IF "仓库传感器" THEN
        "仓库" := 1;
    END_IF;
    "机械臂伸出" := 0;
    "IEC_Timer_0_DB_18".TON(IN:="中继11",
                            PT:=T#2s,
                            Q=>"输出点21");
    IF "输出点21" THEN
        "中继11" := 0;
        "机械臂右转" := 1;
        "数据块_1".流程步 := 18;
    END_IF;
  //第18步,右转后,仓库停止,并将输出点、左转右转、变量、机械手下降次数、流程步复位清零; 
18:
    "仓库" := 0;
    RESET_TIMER("IEC_Timer_0_DB_17");
    RESET_TIMER("IEC_Timer_0_DB_18");
    "机械臂右转" := 0;
    "机械臂左转" := 0;
    "数据块_1".变量I := 0;
    "数据块_1".机械手下降次数 := 0;
    "数据块_1".流程步 := 0;

 写到这里,4次流程都可以运行了!我们看下效果怎样:前三次都基本相同,从第4步开始。

 


 


 2.停止部分:

启动流程完成后,我们已经完成一大半啦!最后就是停止部分了。

在实际运行中,传送带停止不会太随意,一般按下停止后会回到初始位,或者立即停止,在上电后回到初始位;这道题也是这样,不是立即停止;

下面我们看要求: 

第一种情况:工件还在传送带内,按下停止后,系统将工件运回原位后停止,并且不影响下次启动;

 第一种情况比较简单,首先我们要判断工件是否还在传送带内,然后按下停止,等运行到初始位时,停止;

 这里我们还是用case语句来进行编写;按下OFF后,判断是否在传送带上;如果 IF "D传送带" OR "E传送带1" OR "F传送带" OR "G传送带1" 这4个传送带有1个为1,就将变量J赋值为1,进行下一步;

//当按下停止按钮后,判断当前状态,根据不同的状态来停止
CASE "数据块_1".变量J OF
    0:
        IF "OFF" THEN
           
            IF "D传送带" OR "E传送带1" OR "F传送带" OR "G传送带1" THEN
                
                "数据块_1".变量J := 1;
          
            
        END_IF;

 当变量J=1时,或许一个G传感器下降沿,当条件满足,将传送带全部停止,输出点、变量和流程步复位;并且不影响下次启动。

  //停止的第一种情况:工件还在传送带内,按下停止后,将工件运回原位后停止,
        //不影响下次启动。
    1:
        "F_TRIG_DB"(CLK:="G传感器",
                    Q=>"下降沿3");
        
        IF "下降沿3" THEN
           
            "D传送带" := 0;
            "E传送带1" := 0;
            "E传送带2" := 0;
            "F传送带" := 0;
            "G传送带1" := 0;
            "G传送带2" := 0;
           
            RESET_TIMER("IEC_Timer_0_DB_9");
            RESET_TIMER("IEC_Timer_0_DB_10");
            RESET_TIMER("IEC_Timer_0_DB_11");
            RESET_TIMER("IEC_Timer_0_DB_12");
           
            "数据块_1".流程步 := 0;
            "数据块_1".变量I := 0;
            "数据块_1".变量J := 0;
           
        END_IF;

 OK!第一种停止情况解决!

下面看第二种情况:

第二种情况:机械手在搬运工件或在搬运的途中,或者工件正在加工,按下停止后,机械臂等待工件加工完成,并将工件放在初始位,然后机械臂返回初始位停止,不影响下次启动;

 这种是要先找到机械手运行部分的条件来判断是不是第2种情况,我们找到像吸盘得电或机械手下降这些都可以证明是机械手运行部分的条件就可以了;

 这里我将所有有关的都写了进去,像机械手下降次数(是防止机械手在下降的途中被按下停止),还有变量I<=3(是防止在机械臂左转的时候按下停止),料到位传感器和操作指示灯(是防止在放料和加工料是按下停止);当第二种情况成立时,将变量J赋值为2,进入下面;


            ELSIF "吸盘" OR "吸盘" & "机械手伸出" OR "吸盘" & "机械手伸出到位传感器" OR
                "数据块_1".机械手下降次数<>0 OR "数据块_1".变量I<=3 & "吸盘" OR
                "料到位传感器" OR "A操作指示灯"OR "B操作指示灯"OR "C操作指示灯" THEN
                
                "数据块_1".变量J := 2;

 进到第2步后,我们要等到机械臂运行到初始位置是来进行停止;输出点12是操作加工6s后的输出;还有料到位、输出点17(是机械手机械手缩回的输出)和机械臂右转;

初始位条件成立后,将定时器输出、流程步、变量等等都清零,让我们能够再次重新启动。

 //按下停止的第2种情况:机械手在搬运工件或在搬运的途中,或者工件正在加工;按下停止后返回
      //初始位,传送带停止;
    2:
        
        IF "输出点12"& "料到位传感器"=0 & "机械臂右转" & "输出点17"  THEN
            
            RESET_TIMER("IEC_Timer_0_DB");
            RESET_TIMER("IEC_Timer_0_DB_1");
            RESET_TIMER("IEC_Timer_0_DB_2");
            RESET_TIMER("IEC_Timer_0_DB_3");
            RESET_TIMER("IEC_Timer_0_DB_4");
            RESET_TIMER("IEC_Timer_0_DB_5");
            RESET_TIMER("IEC_Timer_0_DB_6");
            RESET_TIMER("IEC_Timer_0_DB_7");
            RESET_TIMER("IEC_Timer_0_DB_8");
            RESET_TIMER("IEC_Timer_0_DB_9");
            RESET_TIMER("IEC_Timer_0_DB_10");
            RESET_TIMER("IEC_Timer_0_DB_11");
            RESET_TIMER("IEC_Timer_0_DB_12");
            "机械臂右转" := 0;
            "机械臂左转" := 0;
            "数据块_1".机械手下降次数 := 0;
            "数据块_1".流程步 := 0;
            "数据块_1".变量I := 0;
            "数据块_1".变量J := 0;
        END_IF;

 最后就是第3种停止情况:

 第三种情况:机械手要将工件放入仓库时或运行途中,按下停止,机械并应先运行完当前工作并返回初始位后停止,不影响下次启动。

 这个停止情况是运行到第4时,按下停止;和上面基本相同,就找第4次运行时的动作来做条件;

 机械手下降次数和左转右转次数以及机械臂等等。


            ELSIF "吸盘" & "数据块_1".机械手下降次数=4 OR "数据块_1".变量I=4 & "吸盘" OR
                "机械臂伸出" OR "输出点20" OR "仓库传感器" THEN
                
                "数据块_1".变量J := 3;
            END_IF;
            
      

 当第3种条件成立,(输出点21是机械臂缩回时间的输出;机械臂右转得电;输出点17是机械手缩回的输出)也将定时器输出点复位,变量,流程步等都复位。

     //按下停止的第三种情况:机械手要将工件放入仓库时,先运行完当前工作,然后停止。
    3:
        IF "输出点21" & "机械臂右转" & "输出点17" THEN
            RESET_TIMER("IEC_Timer_0_DB");
            RESET_TIMER("IEC_Timer_0_DB_1");
            RESET_TIMER("IEC_Timer_0_DB_2");
            RESET_TIMER("IEC_Timer_0_DB_3");
            RESET_TIMER("IEC_Timer_0_DB_4");
            RESET_TIMER("IEC_Timer_0_DB_5");
            RESET_TIMER("IEC_Timer_0_DB_6");
            RESET_TIMER("IEC_Timer_0_DB_7");
            RESET_TIMER("IEC_Timer_0_DB_8");
            RESET_TIMER("IEC_Timer_0_DB_9");
            RESET_TIMER("IEC_Timer_0_DB_10");
            RESET_TIMER("IEC_Timer_0_DB_11");
            RESET_TIMER("IEC_Timer_0_DB_12");
            RESET_TIMER("IEC_Timer_0_DB_13");
            RESET_TIMER("IEC_Timer_0_DB_14");
            RESET_TIMER("IEC_Timer_0_DB_15");
            RESET_TIMER("IEC_Timer_0_DB_16");
            RESET_TIMER("IEC_Timer_0_DB_17");
            RESET_TIMER("IEC_Timer_0_DB_18");
            "机械臂右转" := 0;
            "机械臂左转" := 0;
            "数据块_1".机械手下降次数 := 0;
            "数据块_1".流程步 := 0;
            "数据块_1".变量I := 0;
            "数据块_1".变量J := 0;
        END_IF;

 到这里停止部分就完成了,我们随便试一下,看效果怎么样:

 好的!那么这个传送带模拟控制程序到这里就完成啦!


3.完整程序图 

下图是完整的程序编写: 

 


 

总结

上面就是 《装配流水线模拟控制》的内容;大概看一下流程还是很多的,主要是我将每个动作都细分为流程步了,一步一步写的;大家在编写此程序是可以将多步合在一起,整体也会简便许多的;关于这个应用案例,写得不是特别详细,像上升沿下降沿和定时器复位指令;这些可以自己代入项目应用一下,基本上就可以掌握了;最主要的是想通过这个应用项目让大家在写程序时有一个自己的思路,这样编写起来会好很多;这个案例用if语句很不好写(自己的感觉),在编写时写到第4步就感觉很乱了,后面想了想:在梯形图编时,我一般会用传送指令来写,那在这里怎么就不行了呢!上面代码和思路可供大家参考一下!下面的一个应用是 使用scl来写 交通灯模拟控制这个应用,大家可以写写!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/147962.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Cocos Creator Protobuf的js版本使用

一、基础知识参考Protocol Buffers 在游戏中的应用Protobuf语言指南android与PC&#xff0c;C#与Java 利用protobuf 进行无障碍通讯【Socket】1.性能好/效率高现在&#xff0c;俺就来说说Google公司为啥放着好端端的XML不用&#xff0c;非要另起炉灶&#xff0c;重新造轮子。一…

10.0、Linux-磁盘管理简单初体验

10.0、Linux-磁盘管理简单初体验 列出文件系统整体的磁盘使用量 -> df -h ( 检查磁盘空间使用量 ) 查看目录中所有的文件磁盘空间使用情况 -> du -a -h 根目录下每个目录所占空间大小容量 -> du -sm /* Mac 或者想使用 Linux 挂载我们的一些本地磁盘或者文件 挂载&am…

时隔 20 年,这个编程语言再次“称王”!

↓推荐关注↓综合整理&#xff1a;程序员的那些事&#xff08;id: iProgrammer&#xff09;近日&#xff0c;全球知名的编程语言流行度排行榜网站 TIOBE 公布了 1 月编程指数信息。前三的编程语言是Python、C 和C&#xff0c;第四为Java&#xff0c;第五是C#。TIOBE 的 2022 年…

MyBatis#1(快速入门与Mapper代理)

一.MyBatis简介1.MyBatis是一款优秀的持久层框架,可用于简化JDBC的开发2.持久层: 负责将数据保存到数据库的那一层代码JavaEE的三层架构: 表现层, 业务层, 持久层3.框架:框架就是一个半成品软件, 是一套可重用的, 通用的, 软件基础代码模型优点: 高效, 规范, 通用, 可扩展二.My…

ESP32设备驱动-BMP180气压温度传感器驱动

BMP180气压温度传感器驱动 1、BMP180介绍 BMP180 是Bosch Sensortec 新推出的数字气压传感器,性能非常高,可用于智能手机,平板电脑和运动设备等高级移动设备。它遵循BMP085并带来许多改进,如较小的尺寸和数字接口的扩展。超低功耗低至3μA,使BMP180成为移动设备节能的领…

EfficientFormer: Vision Transformers at MobileNet Speed

Paper name EfficientFormer: Vision Transformers at MobileNet Speed Paper Reading Note URL: https://arxiv.org/pdf/2206.01191.pdf TL;DR 本文目标是回答一个问题&#xff1a;transformer 是否可以在比 cnn 运行更快的时候同时精度更高&#xff1f;本文提出了 Effic…

3. R获取数据的三种途径、读入文件、写入文件、读写excel文件、读写R文件

课程视频链接&#xff1a;https://www.bilibili.com/video/BV19x411X7C6?p1 本笔记参照该视频&#xff0c;笔记顺序做了些调整【个人感觉逻辑顺畅】&#xff0c;并删掉一些不重要的内容 系列笔记目录【持续更新】&#xff1a;https://blog.csdn.net/weixin_42214698/category_…

后端人眼中的Vue(三)

五、高级 5.1、计算 5.1.1、computed ​ 在之前的购物车的案例当中&#xff0c;我们已经实现了购物车价格的计算&#xff0c;但是有些时候我们需要在其他很多地方也展示价格&#xff0c;所以每展示一次&#xff0c;我们就需要调用一次计算价格的方法&#xff0c;所以Vue给了…

OV7670 摄像头模块介绍

OV7670摄像头模块简介OV7670是OV&#xff08;OmniVision&#xff09;公司生产的一颗1/6寸的CMOSVGA图像传感器。该传感器体积小、工作电压低&#xff0c;提供单片VGA摄像头和影像处理器的所有功能。通过SCCB总线控制&#xff0c;可以输出整帧、子采样、取窗口等方式的各种分辨率…

Visio 学习笔记 —— Visio 的键盘快捷方式

Visio 学习笔记 —— Visio 的键盘快捷方式常用热键常用对话框文本操作快速访问工具栏参考资料常用热键 操作热键指针工具Ctrl 1文本工具Ctrl 2连接线Ctrl 3连接点工具Ctrl Shift 1裁剪工具Ctrl Shift 2文本块工具Ctrl Shift 4组合所选的形状Ctrl G解散组合Ctrl Sh…

Verilog语法笔记(夏宇闻第三版)-结构说明语句

目录 initial语句&#xff1a; always语句&#xff1a; task和function说明语句&#xff1a; task和function说明语句的不同点&#xff1a; task说明语句&#xff1a; function说明语句&#xff1a; Verilog语言中的任何过程模块都从属于以下四种结构的说明语句&#xff…

【GNN】图基本知识代码、nxworks包的基本使用

一个写得很好的博客&#xff1a; 图或网络中的中心性&#xff1a;点度中心性、中介中心性、接近中心性、特征向量中心性、PageRank 特征向量中心性&#xff08;eigenvector centrality&#xff09; 特征向量中心性的基本思想是&#xff0c;一个节点的中心性是相邻节点中心性的函…

Reactive思考

最近在学习响应式编程&#xff0c;由此翻看了很多资料&#xff0c;在此把思考过程记录下 目录 来由 规范 具体实现 历史 1. Servlet的尝试 1.1 Async实现demo 2. web应用层 2.1 web-flux 2.2 web-flux/web-mvc 与 spring-web架构关系 3. DBConnection层 相关可能混淆…

STL中vector怎么扩容

STL vector扩容 vector容器 vector被称为向量容器&#xff0c;该容器擅长在尾部插入或删除元素&#xff0c;时间复杂度为O(1)&#xff1b;而对于在vector容器头部或者中部插入或删除元素&#xff0c;则花费时间要长一些&#xff08;移动元素需要耗费时间&#xff09;&#xf…

十九、Kubernetes中Pod调度第一篇

1、概述 在默认情况下&#xff0c;一个Pod在哪个Node节点上运行&#xff0c;是由Scheduler组件采用相应的算法计算出来的&#xff0c;这个过程是不受人工控制的。但是在实际使用中&#xff0c;这并不满足的需求&#xff0c;因为很多情况下&#xff0c;我们想控制某些Pod到达某些…

Gradle学习笔记之插件

文章目录插件的作用插件的分类和使用脚本插件对象插件第三方插件用户自定义插件buildSrc项目编写步骤其他项目/模块引用步骤java插件常用属性插件的作用 插件可以帮助我们促进代码的重用、项目更高程度的模块化、自动化和便捷化&#xff0c;减少功能类似代码的编写&#xff0c…

【数据结构与算法】 | 用队列实现栈

用队列实现栈 链接&#xff1a; https://leetcode.cn/problems/implement-stack-using-queues/ 1. 要求 2. 思路 栈的性质是先进后出&#xff0c;队列的性质是先进先出。 题目要求是用两个队列来完成栈的实现&#xff0c;那么大思路就是通过倒腾数据来完成。 3. 代码实现…

JAVA系列 多线程 Thread类 耦合 线程调度 如何创建线程 弱耦合 完全解耦 思维结构整理

这估计是我JAVA系列 基础知识点梳理的最后一篇文章了吧 之后一段时间 我打算去看看之前承诺更新的JAVA的一些项目了 然后我要好好玩一段时间游戏 然后跟某些好朋友见面 所以后面会忙一点 然后就是很多同学 六级还没有考 估计很多人是开学再考把 这个假期就不要玩的太厉害了 没事…

人员超员识别系统 yolov5

人员超员识别系统通过yolov5深度学习网络模型对现场画面进行实时监测&#xff0c;监测到画面中区域人数超过规定人数时&#xff0c;立即抓拍存档预警。YOLO系列算法是一类典型的one-stage目标检测算法&#xff0c;其利用anchor box将分类与目标定位的回归问题结合起来&#xff…

一篇彻底解决:Fatal error compiling: 无效的目标发行版: 11 -> [Help 1]

先在这声明,如果我的方法没有解决你的问题,那你直接私信我,我第一时间帮你解决,送佛送到西!!! 这个问题&#xff0c;主要原因就是JDK的版本问题&#xff0c;“无效的目标发行版&#xff1a;11”的意思是你在某个位置配置了JDK11&#xff0c;但是在其他位置配置的并不是11&…