【虚拟工厂】SCL编写<机械手加盖模块>应用

news2024/11/26 15:36:53

使用scl来编写实虚拟工场中的一个机械手加盖应用项目

文章目录

目录

文章目录

前言

1.机械手加盖场景

2.了解各部分功能

3.命名变量找出输入输出

4.在博图建立变量

二、编写思路

1.分析

2.使用小模块化来编写

3.确定编程思路

三、编程

1.上料部分

2.机械手部分

3.对块进行连接

4.完整流程

四、完善和效果 

1.停止,复位,急停

2.加数,模式切换

3.效果

总结


前言

这章我们来编写一下虚拟工厂软件中的一个仿真应用——机械手加盖模块,本篇文章主要分为下面几个部分 :1.场景分析  2.编程思路 3.实现方法  4.编写控制程序 5.完善优化和总结。下面我们就通过这些步骤一步一步将应用案例完成,并对所学习的scl语言编程进行巩固和强化!


一、场景部分

 打开factoryio(虚拟工厂)软件,找到里面自带的一些工程场景,我们找到机械手加盖这一个。

1.机械手加盖场景

 

2.了解各部分功能

 打开场景后,尽快熟悉各个部位的功能和动作,传送带和传感器比较好理解,机械手的x,y,z轴和气动的一个挡块可以打开实训强制执行器来看一下是如何动作的;或者将上面的英文翻译一下,意思应该都差不多;总之熟悉各部分元件的功能。

3.命名变量找出输入输出

 各功能了解后,给它们写上相应的变量名称:

名字写好后,在驱动中找到PLCSIM 将相应的输入输出拖拽上去: 

4.在博图建立变量

 上面做好后,这里就将博图变量建一下;注:博图建变量时先确定是实际参数还是形式参数,如果是实际参数,在驱动底部将变量导出,然后在博图变量中导入就可以了;如果是形式参数就在FB块中建立变量。

这里是用的形参:




二、编写思路

 场景和变量做好后,下面就是编写思路部分了!

1.分析

 这是一个标准的加盖场景,这个场景中有一个控制台,两个传送带和两个气动挡块,还有一个机械手;虽然没有具体的控制要求,但是传送带,机械手和挡块这些部分是有基本控制的,就像传送带,要么运行要么停止;机械手也一样,基本的控制就是伸出缩回,下降上升,吸盘得电失电等。所以在这里我们基本可以知道一个大概的流程是什么样的啦!

这里并不是一定要有具体的控制要求才能写程序,只要有基本控制是一样可以的!

2.使用小模块化来编写

 简单分析过之后,我们的基本流程是:按下启动后,传送带进行上料,当料到达挡块位置后,传送带停止;机械手夹起料,伸出机械臂将料盖放在料的底座上,同时挡块抬起,让加过盖子的料继续传送,到达指定的地方;一个基本的流程就是这样了。

那我们要怎样进行编写呢!不错,和小标题一样 使用小模块化,具体就是将机械手写成一个块,传送带一个块,或者其他的一些写成一个块;最后根据具体化的控制流程在一个主程序里面按照要求来将各个块连接起来,完成要求!

3.确定编程思路

分析好之后,我们这里使用块来编写,机械手的控制时一个函数块,传送带是一个函数块,还有函数块是将它们联系起来,最后完成我们的加盖控制要求!




三、编程

 按照上面的思路我们建立相应的程序块:第一个是和虚拟工厂仿真连接的一个fc块,第二个和第四个是来写机械手后上料控制的块,第三个是实现具体控制的一个块。

 

1.上料部分

我们根据场景来看上料部分(传送带部分)的一个简单流程:按下启动后,两个传送带要开始运行,当运行到传感器位置后,传送带停止,这时挡块得电将两个料摆好,就完成了。

 (注:相应的变量是在块_1中建立的,所以这里使用的是块_1的背景数据,如果感觉这样很乱的话可以使用全局变量来编写)

程序如下:

变量A是一个触发条件,触发后执行下面的程序。 

   CASE "块_1_DB".A OF
        1:
            
            "块_1_DB".#传送带1 := 1;
            "块_1_DB".#传送带2 := 1;
            "块_1_DB".A := 2;
        2:
            
            IF "块_1_DB".PF[0].Q THEN
                "块_1_DB".传送带1 := 0;
                "块_1_DB".ZJ1 := 1;
            END_IF;
            IF "块_1_DB".PF[1].Q THEN
                "块_1_DB".传送带2 := 0;
                "块_1_DB".ZJ2 := 1;
            END_IF;
            
            IF "块_1_DB".ZJ1 & "块_1_DB".ZJ2 THEN
                
                "块_1_DB".ZJ1 := 0;
                "块_1_DB".ZJ2 := 0;
                "块_1_DB".A := 3;
            END_IF;
        3:
            "块_1_DB".挡块1 := 1;
            "块_1_DB".挡块2 := 1;
            IF "块_1_DB".挡块到位信号1 THEN
                "块_1_DB".挡块1 := 0;
                "块_1_DB".ZJ5 := 1;
            END_IF;
            IF "块_1_DB".挡块到位信号2 THEN
                "块_1_DB".挡块2 := 0;
                "块_1_DB".ZJ6 := 1;
            END_IF;
            IF "块_1_DB".ZJ5 & "块_1_DB".ZJ6 THEN
                "块_1_DB".I := 1;
                "块_1_DB".ZJ5 := 0;
                "块_1_DB".ZJ6 := 0;
                "块_1_DB".A := 0;
            END_IF;
    END_CASE;

上料效果:

 这里可来简单看一下!

 

2.机械手部分

上料部分完成后,下面就是机械手动作部分了(前面文章也写过的),这里就简单说一下基本控制:料到位后,机械手下降抓取料,然后上升,机械手伸出,伸出后下降,将料放进去,然后机械手上升,回到原位,就好了!

程序如下:

这里只用到了机械手的x轴后z轴,还是比较简单的。 

#TT[0].TON(IN := #BZ1,
               PT := T#1s);
    #TT[1].TON(IN := #BZ2,
               PT := T#1s);
    #TT[2].TON(IN := #BZ3,
               PT := T#1s);
    #TT[3].TON(IN := #BZ4,
               PT := T#1s);
    #TT[4].TON(IN := #BZ5,
               PT := T#1s);
    
    CASE "块_1_DB".W OF
        0:
            ;
        1:
            "块_1_DB".吸盘 := 1;
            
            "块_1_DB".机械手Z轴 := 1;
            IF "块_1_DB".抓取到位 THEN
                #BZ1 := 1;
                "块_1_DB".W := 2;
            END_IF;
        2:
            IF #TT[0].Q THEN
                "块_1_DB".机械手Z轴 := 0;
                #BZ2 := 1;
                #BZ1 := 0;
            END_IF;
            IF #TT[1].Q THEN
                #BZ2 := 0;
                "块_1_DB".W := 3;
            END_IF;
        3:
            "块_1_DB".机械手X轴 := 1;
            IF "块_1_DB".伸出缩回信号 THEN
                #BZ3 := 0;
            ELSE
                #BZ3 := 1;
            END_IF;
            IF #TT[2].Q THEN
                #BZ3 := 0;
                "块_1_DB".W := 4;
            END_IF;
        4:
            "块_1_DB".机械手Z轴 := 1;
            IF "块_1_DB".下降上升信号 THEN
                #BZ4 := 0;
            ELSE
                #BZ4 := 1;
            END_IF;
            IF #TT[3].Q THEN
                "块_1_DB".吸盘 := 0;
                "块_1_DB".机械手Z轴 := 0;
                #BZ5 := 1;
                #BZ4 := 0;
                "块_1_DB".W := 5;
            END_IF;
        5:
            IF #TT[4].Q THEN
                "块_1_DB".机械手X轴 := 0;   
                #BZ5 := 0;
                "块_1_DB".W := 6;
            END_IF;
        6:  
       
            "块_1_DB".M := 1;//机械手部分完成信号
            "块_1_DB".W := 0;
            
    END_CASE;

机械手效果:

 

3.对块进行连接

这两个块完成后,我们通过一个块_1来进行连接,按下启动后触发上料部分,上料完成后延时1s给一个信号,触发机械手部分。

 IF #启动 THEN
            #A := 1;
        END_IF;

     //I为1时代表上料完成,可以进行下一步
        IF #I = 1 THEN
            #BZ1 := 1;
        END_IF;
        
        //上料完成后延时1s,触发机械手部分
        //w为1是触发条件
        IF #T[0].Q THEN
            #W := 1;
            #I := 0;
            #BZ1 := 0;
        END_IF;
        
        //M为1是机械手完成信号
        IF #M = 1 THEN
            #A := 1;
            #M := 0;
        END_IF;

4.完整流程

机械手后上料完成后,我们还有一个挡块抬起让完成的料继续传送的动作,如果没有这一个后面就没法继续运行了。

 我们来看场景进行分析,在机械手缩回的那一步的同时,我们要让挡块2抬起,传送带2继续运行,直到走过料传感器3,我们再将挡块放下,那么这才是一个完整的流程。

 在机械手的第5步,我们让x轴缩回的同时,让挡块抬起,然后再触发传送带(上料部分),在上料部分中再加一个判断,当料到第3个传感器位置时,再让挡块落下。

机械手第5步: 

 5:
            IF #TT[4].Q THEN
                "块_1_DB".机械手X轴 := 0;
                "块_1_DB".挡块抬起2 := 1;
                
                #BZ5 := 0;
                "块_1_DB".W := 6;
            END_IF;

 上料部分判断:

    2:
            //判断是否到达第3个传感器
            IF "块_1_DB".PF[2].Q THEN
                "块_1_DB".挡块抬起2 := 0;
            END_IF;

 一个流程效果:

 




四、完善和效果 

这里我们对程序进行一个完善。

1.停止,复位,急停

场景的控制台中给我们了4个按钮,1个模式切换,还有一个计数的模拟器。 

下面我们来实现一下这几个按钮。 

 启动我们已经完成了,这里复位和停止我做了一个功能,按下后运行完这次后停止;急停是立即停止,松开后继续运行。
代码:

将急停放在主程序的最前面就可以了。 

 //复位按钮和停止按钮
        IF #复位 THEN
            #E := 1;
        END_IF;
        IF #停止 THEN
            ;
        ELSE
            #E := 1;
        END_IF;

当E=1的时候,在机械手里面进行一个判断,然让他们不循环就好了。

2.加数,模式切换

加数功能就是,每做好一个完整的料,就对一个变量进行加1,就可以了。

在上料部分进行加1。 

 2:
            //判断是否到达第3个传感器
            IF "块_1_DB".PF[2].Q THEN
                "块_1_DB".计件器 := "块_1_DB".计件器 + 1;
                "块_1_DB".挡块抬起2 := 0;
            END_IF;

模式切换功能就是,手动时是按一次启动按钮,系统执行一次;自动就是按一下启动按钮,系统一直执行。

在主程序进行一个选择,然后再机械手里面进行一个判断:

//模式切换部分
        //有自动和手动两个
        IF #手动 THEN
            #Z := 1;
        ELSIF #自动 THEN
            #Z := 2;
        END_IF;
 6:                            //判断是自动模式还是手动模式
            IF "块_1_DB".Z = 1 OR "块_1_DB".E = 1 THEN
                "块_1_DB".W := 8;    //手动模式
            ELSIF "块_1_DB".Z = 2 THEN
                "块_1_DB".W := 7;    //自动模式
            END_IF;
            
        7:
            "块_1_DB".M := 1;//机械手部分完成信号
            "块_1_DB".W := 0;
            ;
            
        8:
            "块_1_DB".传送带2 := 1;
            IF "块_1_DB".PF[2].Q THEN
                "块_1_DB".计件器 := "块_1_DB".计件器 + 1;
                "块_1_DB".挡块抬起2 := 0;
                "块_1_DB".传送带2 := 0;
                "块_1_DB".E := 0;
                "块_1_DB".W := 0;
            END_IF;
    END_CASE;

3.效果




总结

最后的最后,我们简单来总结一下吧!先说思路,这种分成小模块然后再组装的方法是很不错的,对于一些较大的案例或者有很多设备的项目会很有效果,要比全部写在一起好很多,如果程序哪里出了问题,我们只要找控制部分就可以了,前提是小模块必须是正确的!

然后关于这一个加盖小案例,只要保证两个小的功能块不出问题,那么程序就很容易啦!还有一点我在编写急停时,急停无法停掉两个传送带,不知道大家是不是这样,我暂时还没有找到好的方法!

好了,以上就是今天的内容啦,感谢大家的阅读!

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

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

相关文章

【数据结构】线性表和顺序表

Yan-英杰的主页 悟已往之不谏 知来者之可追 目录 1.线性表 2.顺序表 2.1 静态顺序表 2.2 动态顺序表 2.3移除元素 1.线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线…

新C++(14):移动语义与右值引用

当你在学习语言的时候,是否经常听到过一种说法,""左边的叫做左值,""右边的叫做右值。这句话对吗?从某种意义上来说,这句话只是说对了一部分。---前言一、什么是左右值?通常认为:左值是一个表示数据的表达式(…

Git版本控制管理

Git日志记录查看日志获取执行过的命令查看每一次提交记录比较文件差异还原文件git远程仓库克隆远程仓库移除无效的远程仓库Git远程仓库推送、抓送,和拉取Git远程仓库多人协作冲突问题Git远程仓库SSH协议推送Git分支查看分支创建分支修改分支切换分支推送至远程仓库分…

Python3实现“美颜”功能

导语利用Python实现美颜。。。这是之前在GitHub上下载的一个项目。。。似乎有些日子了。。。所以暂时找不到原项目的链接了。。。今天抽空看了下它源代码的主要思想,似乎挺简单的。。。于是决定用Python3自己复现一下。。。T_T感觉还是挺有趣的。。。Just have a tr…

源码分析Spring @Configuration注解如何巧夺天空,偷梁换柱。

前言 回想起五年前的一次面试,面试官问Configuration注解和Component注解有什么区别?记得当时的回答是: 相同点:Configuration注解继承于Component注解,都可以用来通过ClassPathBeanDefinitionScanner装载Spring bean…

IT服务发布管理过程文件

目的 规范发布管理的提交、审批、沟通、测试、回滚、实施等活动。 范围 适用于我公司的IT服务管理重大变更的内、外部发布。 术语定义 发布:将一个或多个变更交付、分发到实际运行环境中并可对其进行追溯。非项目的IT服务重大变更需要遵循本过程进行发布。发布主要包…

论文投稿指南——中文核心期刊推荐(工业经济)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…

使用TorchGeo进行地理空间深度学习

前言TorchGeo是一个PyTorch域库,提供特定于地理空间数据的数据集、采样器、转换和预训练模型。https://github.com/microsoft/torchgeo几十年来,地球观测卫星、飞机和最近的无人机平台一直在收集越来越多的地球表面图像。有了关于季节和长期趋势的信息&a…

【算法】算法基础入门详解:轻松理解和运用基础算法

😀大家好,我是白晨,一个不是很能熬夜😫,但是也想日更的人✈。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!&#x1f4…

查找Pycharm跑代码下载模型存放位置以及有关模型下载小技巧(model_name_or_path参数)

目录一、前言二、发现问题三、删除这些模型方法一:直接删除注意方法二:代码删除一、前言 当服务器连不上,只能在本地跑代码时需要使用***预训练语言模型进行处理 免不了需要把模型下载到本地 时间一长就会发现C盘容量不够 二、发现问题 正…

c++11 标准模板(STL)(std::unordered_map)(九)

定义于头文件 <unordered_map> template< class Key, class T, class Hash std::hash<Key>, class KeyEqual std::equal_to<Key>, class Allocator std::allocator< std::pair<const Key, T> > > class unordered…

Python进阶-----高阶函数zip() 函数

目录 前言&#xff1a; zip() 函数简介 运作过程&#xff1a; 应用实例 1.有序序列结合 2.无序序列结合 3.长度不统一的情况 前言&#xff1a; 家人们&#xff0c;看到标题应该都不陌生了吧&#xff0c;我们都知道压缩包文件的后缀就是zip的&#xff0c;当然还有r…

Mybatis源码分析系列之第四篇:Mybatis中代理设计模型源码详解

一&#xff1a; 前言 我们尝试在前几篇文章的内容中串联起来&#xff0c;防止各位不知所云。 1&#xff1a;背景 我们基于Mybatis作为后台Orm框架进行编码的时候&#xff0c;有两种方式。 //编码方式1 UserDao userDao sqlSession.getMapper(UserDao.class); userDao.quer…

[入门必看]数据结构1.1:数据结构的基本概念

[入门必看]数据结构1.1&#xff1a;数据结构的基本概念第一章 绪论1.1 数据结构的基本概念知识总览1.1.1 基本概念和术语数据类型、抽象数据类型&#xff1a;1.1.2 数据结构的三要素数据的逻辑结构数据的物理结构&#xff08;存储结构&#xff09;数据的运算知识回顾与重要考点…

【数据库概论】第十一章 数据库并发控制

第十一章 并发控制 在多处理机系统中&#xff0c;每个处理机可以运行一个事务&#xff0c;多个处理机可以同时运行多个事务&#xff0c;实现多个事务并行运行&#xff0c;这就是同时并发方式。当多个用户并发存取数据库时会产生多个事务同时存取同一事务的情况&#xff0c;如果…

ESP32设备驱动-红外寻迹传感器驱动

红外寻迹传感器驱动 1、红外寻迹传感器介绍 红外寻迹传感器具有一对红外线发射管与接收管,发射管发射出一定频率的红外线,当检测方向遇到障碍物(反射面)时,红外线反射回来被接收管接收,经过比较器电路处理之后,输出接口会输出一个数字信号(低电平或高电平,取决于电路…

Nginx配置实例-反向代理案例二

实现效果&#xff1a;使用nginx反向代理&#xff0c;根据访问的路径跳转到不同端口服务 nginx监听端口为9000&#xff0c; 访问 http://127.0.0.1:9000/edu/ 直接跳转到127.0.0.1:8080 访问 http://127.0.0.1:9000/vod/ 直接跳转到127.0.0.1:8081 一、准备工作 1. 准备两个tom…

TCP相关概念

目录 一.滑动窗口 1.1概念 1.2滑动窗口存在的意义 1.3 滑动窗口的大小变化 1.4丢包问题 二.拥塞控制 三.延迟应答 四.捎带应答 五.面向字节流 六.粘包问题 七.TIME_WAIT状态 八.listen第2个参数 九.TCP总结 一.滑动窗口 1.1概念 概念&#xff1a;双方在进行通信时&a…

2023年软考高级-系统分析师考试学习指导计划!

2023年软考高级-系统分析师考试学习指导计划&#xff01; 一、导学阶段 第一天 考试情况及备考攻略&#xff1a;https://www.educity.cn/xuanke/rk/rjsp/?sywzggw 考试介绍&#xff1a;https://www.educity.cn/wangxiao2/c410653/sp110450.html 考试经验分享&#xff1a;h…

如何在Linux中优雅的使用 head 命令,用来看日志简直溜的不行

当您在 Linux 的命令行上工作时&#xff0c;有时希望快速查看文件的第一行&#xff0c;例如&#xff0c;有个日志文件不断更新&#xff0c;希望每次都查看日志文件的前 10 行。很多朋友使用文本编辑的命令是vim&#xff0c;但还有个命令head也可以让轻松查看文件的第一行。 在…