【SCL】1200应用项目: 四节传送带机械手模拟控制

news2024/9/27 12:17:39

使用SCL编写小应用:四节传送带模拟和机械手模拟控制

文章目录

目录

文章目录

前言

一、四节传送带模拟控制

1.控制要求

2.参考图

3.接线图和I/0分配

4.编写程序

1.逆序启动

 2.顺序停止

 3.故障输入

 4.调试

 5.完整代码

二、机械手控制

1.控制要求

2. 接线图和I/0分配

3.编写程序 

总结


前言

前面我们学习了第1个面向对象编程,使用FB块和形参;本章继续来练习两个scl语言应用!


一、四节传送带模拟控制

1.控制要求

M1-M4 是四条皮带机运转指示,A、B、C、D 是四条皮带机故障输入。
起动后,先起动最末的皮带机 M4,1s 后再依次起动 M3,1s 后再依次起动 M2,1s 后
再依次起动 M1;停止时,先停止皮带机 M1,1s 后再停止 M2,1s 后再停止 M3,1s 后再停
止 M4;当某条皮带机有重物时,该皮带机前面的应立即停止,该皮带机运行 1s 后停止,再
1s 后接下去的一台停止,依此类推。

2.参考图

 这里M1到M4用指示灯表示,4个开关表示4个故障输入,右下角是ON和OFF。

3.接线图和I/0分配

 I/0分配:

输入输出
名称作用地址名称作用地址
ON启动I0.0M1电机1Q0.0
OFF停止I0.2M2电机2

Q0.1

A故障输入I0.3M3电机3Q0.3
B故障输入I0.4M4电机4Q0.3
C故障输入I0.5
D故障输入I0.6

接线图:

这里PLC的输入和输出接上断路器是防止短路。 

4.编写程序

看题可以发现,这里主要有三点:逆序启动,顺序停止,故障输入。

1.逆序启动

起动后,先起动最末的皮带机 M4,1s 后再依次起动 M3,1s 后再依次起动 M2,1s 后
再依次起动 M1;

 这里可以用一个1秒脉冲来触发启动,使用1s的上升沿来对A变量进行加1,再用case语句进行判断,启动就可以完成了。

#T[1].TON(IN := #启动标志 & NOT #SC ,
          PT := T#1s,
          Q => #SC);
#P_R[1](CLK := #SC);
IF #P_R[1].Q THEN
    #A := #A + 1;
END_IF;

//启动部分
CASE #A OF
        
    0:
        IF #启动 THEN
            #C := 0;
            #M4 := 1;
            #启动标志 := 1;
        END_IF;
    1:
        #M3 := 1;
        
    2:
        #M2 := 1;
        
    3:
        #M1 := 1;
        #启动标志 := 0;
        #A := 0;
END_CASE;

 2.顺序停止

 和启动的思路相同,用case语句来实现:

#T[2].TON(IN := #标志2 & NOT #SC1,
          PT := T#1s,
          Q => #SC1);

#P_R[2](CLK := #SC1);

IF #P_R[2].Q THEN
    #B := #B + 1;
END_IF;
//停止部分
CASE #B OF
           
    0:
        IF #停止 & NOT #启动标志 THEN
            #标志2 := 1;
            #M1 := 0;
        END_IF;
    1:
        #M2 := 0;
            
    2:
        #M3 := 0;
            
    3:
        
        #M4 := 0;
        #标志2 := 0;
        #B := 0;
END_CASE;

 3.故障输入

当某条皮带机有重物时,该皮带机前面的应立即停止,该皮带机运行 1s 后停止,再
1s 后接下去的一台停止,依此类推。

 可以用M2来示例:当故障输入B被按下,前面的M1立即停止,M2运行1s停止,M3和M4相同。

既然还是都是1s那就可以用1个定时器来脉冲:

进入case语句后先判断是哪个故障输入,如果是B就将C赋值为2,上一台电机M1清零,当C不等于0的时候,定时器触发产生脉冲,对D进行++,然后在下面的小case语句中,将M2,M3,M4间隔1s停止,最后将变量清零,就结束。另外3个相同。

#T[3].TON(IN := #C <> 0 & NOT #SC2 ,
          PT := T#1s,
          Q => #SC2);
#P_R[3](CLK := #SC2);

IF #P_R[3].Q THEN
    #D := #D + 1;
END_IF;
//故障输入部分
CASE #C OF
    0:
        IF #故障输入1 THEN
            #C := 1;
            ;
        ELSIF #故障输入2 THEN
            #M1 := 0;
            #C := 2;
            ;
        ELSIF #故障输入3 THEN
            #M1 := 0;
            #M2 := 0;
            #C := 3;
            ;
        ELSIF #故障输入4 THEN
            #M1 := 0;
            #M2 := 0;
            #M3 := 0;
            #C := 4;
            ;
            
        END_IF;
    1:
        CASE #D OF
            1:
                #M1 := 0;
            2:
                #M2 := 0;
            3:
                #M3 := 0;
            4:
                #M4 := 0;
                #B := 0;
                #C := 0;
                #D := 0;
                
        END_CASE;
        
    2:
        CASE #D OF
            1:
                #M2 := 0;
            2:
                #M3 := 0;
            3:
                #M4 := 0;
                #B := 0;
                #C := 0;
                #D := 0;
        END_CASE;
        
    3:
        
        CASE #D OF
           
            1:
                #M3 := 0;
            2:
                #M4 := 0;
                #B := 0;
                #C := 0;
                #D := 0;
        END_CASE;
    4:
        CASE #D OF
                
            1:
                #M4 := 0;
                #B := 0;
                #C := 0;
                #D := 0;
        END_CASE;
   
END_CASE;

 4.调试

最后在主程序调用,写入相应的变量就完成啦! 

 

 5.完整代码

(*#M1-M4 是四条皮带机运转指示,A、B、C、D 是四条皮带机故障输入。
起动后,先起动最末的皮带机 M4,1s 后再依次起动 M3,1s 后再依次起动 M2,1s 后
再依次起动 M1;停止时,先停止皮带机 M1,1s 后再停止 M2,1s 后再停止 M3,1s 后再停
止 M4;当某条皮带机有重物时,该皮带机前面的应立即停止,该皮带机运行 1s 后停止,再
1s 后接下去的一台停止,依此类推。*)

#T[1].TON(IN := #启动标志 & NOT #SC ,
          PT := T#1s,
          Q => #SC);
#T[2].TON(IN := #标志2 & NOT #SC1,
          PT := T#1s,
          Q => #SC1);
#P_R[1](CLK := #SC);
#P_R[2](CLK := #SC1);
IF #P_R[1].Q THEN
    #A := #A + 1;
END_IF;
IF #P_R[2].Q THEN
    #B := #B + 1;
END_IF;

//启动部分
CASE #A OF
        
    0:
        IF #启动 THEN
            #C := 0;
            #M4 := 1;
            #启动标志 := 1;
        END_IF;
    1:
        #M3 := 1;
        
    2:
        #M2 := 1;
        
    3:
        #M1 := 1;
        #启动标志 := 0;
        #A := 0;
END_CASE;

//停止部分
CASE #B OF
           
    0:
        IF #停止 & NOT #启动标志 THEN
            #标志2 := 1;
            #M1 := 0;
        END_IF;
    1:
        #M2 := 0;
            
    2:
        #M3 := 0;
            
    3:
        
        #M4 := 0;
        #标志2 := 0;
        #B := 0;
END_CASE;


#T[3].TON(IN := #C <> 0 & NOT #SC2 ,
          PT := T#1s,
          Q => #SC2);
#P_R[3](CLK := #SC2);

IF #P_R[3].Q THEN
    #D := #D + 1;
END_IF;
//故障输入部分
CASE #C OF
    0:
        IF #故障输入1 THEN
            #C := 1;
            ;
        ELSIF #故障输入2 THEN
            #M1 := 0;
            #C := 2;
            ;
        ELSIF #故障输入3 THEN
            #M1 := 0;
            #M2 := 0;
            #C := 3;
            ;
        ELSIF #故障输入4 THEN
            #M1 := 0;
            #M2 := 0;
            #M3 := 0;
            #C := 4;
            ;
            
        END_IF;
    1:
        CASE #D OF
            1:
                #M1 := 0;
            2:
                #M2 := 0;
            3:
                #M3 := 0;
            4:
                #M4 := 0;
                #B := 0;
                #C := 0;
                #D := 0;
                
        END_CASE;
        
    2:
        CASE #D OF
            1:
                #M2 := 0;
            2:
                #M3 := 0;
            3:
                #M4 := 0;
                #B := 0;
                #C := 0;
                #D := 0;
        END_CASE;
        
    3:
        
        CASE #D OF
           
            1:
                #M3 := 0;
            2:
                #M4 := 0;
                #B := 0;
                #C := 0;
                #D := 0;
        END_CASE;
    4:
        CASE #D OF
                
            1:
                #M4 := 0;
                #B := 0;
                #C := 0;
                #D := 0;
        END_CASE;
   
END_CASE;

 



 

二、机械手控制

1.控制要求

按下启动按钮,传送带 A 启动运转,当传感器 S( 扭子开关拨到 ON) 检测到物体时,传
送带 A 停止运转, B 传送带启动运转,机械手下降 L1 亮,拨动 SQ1 到位, L1 灭,抓取物
L3 亮,抓到物体 SQ3 输出信号后机械手上升 L2 亮, S SQ1 复位,货物抓走后转送带 A
再启动;拨动 SQ2 到位, L2 灭,机械手左转 L5 亮,拨动 SQ5 到位, L5 灭,机械手下降
L1 亮, SQ2 复位,拨动 SQ1 到位, L1 灭,松开物体 L3 灭, SQ3 拨到 OFF ,机械手上升
L2 亮, SQ1 复位,拨动 SQ2 到位, L2 灭,机械手右转 L4 亮, SQ5 复位,拨动 SQ4 到位,
L4 灭,再按下 S ,依次循环下去。抬起启动按钮,模拟信号指示灯都灭。

2. 接线图和I/0分配

输入输出
名称作用地址名称作用地址
ON启动I0.0A传送带Q0.0
OFF停止I0.1B传送带Q0.1
S传感器I0.2L1指示灯Q0.2
SQ1限位I0.3L2指示灯Q0.3
SQ2限位I0.4L3指示灯Q0.4
SQ3限位I0.5L4指示灯Q0.5
SQ4限位I0.6L5指示灯Q0.6
SQ5限位I0.7

3.编写程序 

看控制要求和控制参考图,这里用case语句可以一步一步写下来。

到最后再赋值为1,可以接着循环运行。 

IF #OFF THEN
    #L1 := 0;
    #L2 := 0;
    #L3 := 0;
    #L4 := 0;
    #L5 := 0;
    #A := 0;
    #B := 0;
    #W := 0;
END_IF;


CASE #W OF
        
    0:
        IF #ON THEN
            #A := 1;
            #W := 1;
        END_IF;
    1:
        IF #S THEN
            #A := 0;
            #B := 1;
            #L1 := 1;
            #W := 2;
        END_IF;
    2:
        IF #SQ1 THEN
            #L1 := 0;
            #L3 := 1;
            #W := 3;
        END_IF;
    3:
        IF #SQ3 THEN
            #L2 := 1;
            #A := 1;
            #W := 4;
        END_IF;
    4:
        IF #SQ2 THEN
            #L2 := 0;
            #L5 := 1;
            #W := 5;
        END_IF;
    5:
        IF #SQ5 THEN
            #L5 := 0;
            #L1 := 1;
            #W := 6;
        END_IF;
    6:
        IF #SQ1 THEN
            #L1 := 0;
            #L3 := 0;
            #W := 7;
        END_IF;
    7:
        IF #SQ3 = 0 THEN
            #L2 := 1;
            #W := 8;
        END_IF;
    8:
        IF #SQ2 THEN
            #L2 := 0;
            #L4 := 1;
            #W := 9;
        END_IF;
        
    9:
        IF #SQ4 THEN
            #L4 := 0;
            #W := 10;
        END_IF;
    10:
        #W := 1;
END_CASE;

 

总结

以上就是今天的内容,我们下一篇见!

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

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

相关文章

JVM内存模型深度剖析与优化

1. Java语言的跨平台特性 2. JVM整体结构及内存模型 堆存放着对象信息每个线程都会分配一块属于自己的内存空间&#xff08;栈空间&#xff09; 每个方法都会分配一块内存空间&#xff08;栈桢&#xff09;&#xff0c;上图 compute()方法 和 main()方法 都会分配到各自的栈桢空…

git 学习笔记

Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件,可以敏捷高效地处理任何或小或大的项目。Git 与常用的版本控制工具 CVS, Subversion 等不同&#xff0c;它采用了分布式版本库的方式&#xff0c;不需要服务器端软件支持。 一、安装配置…

线性神经网络(sotfmax回归)

sotfmax回归定义网络架构softmax运算softmax回归实现&#xff08;MNIST数据集&#xff09;数据集的处理读取数据集查看形状数据可视化读取小批量整合所有组件神经网络的搭建加载数据集初始化模型参数定义softmax函数定义模型定义损失函数&#xff08;难点&#xff09;分类精度训…

有序表之跳表

文章目录1、前言2、跳表简介3、理解“跳表”4、用跳表查询到底有多快5、跳表是不是很浪费内存6、高效的动态插入和删除7、跳表索引动态更新8、跳表代码实现1、前言 在开始讲解跳表之前&#xff0c;先来说一说积压结构。 何为积压结构&#xff1f;就是当数据达到了一定程度&am…

【ROS2实践】Vmware17下安装ubuntu22.04和ros2-humble

一、简介 ROS2-foxy已经不再维护&#xff0c;ROS2-humble成为主角&#xff0c;因而该转变一下开发场景了。如何安装&#xff1f;官方文档没有错&#xff0c;然而&#xff0c;照着做却无法进行。实超中遇到的需要变通的地方&#xff0c;官网是不给你提供解决的&#xff0c;本文给…

宽刈幅干涉高度计SWOT(Surface Water and Ocean Topography)卫星进展(待完善)

以下信息搬运自SWOT官方网站等部分文献资料&#xff0c;如有侵权请联系&#xff1a;sunmingzhismz163.com 排版、参考文献、部分章节待完善 概况 2022年12月16日地表水与海洋地形卫星SWOT (Surface Water and Ocean Topography)在加利福尼亚州范登堡航天基地由SpaceX猎鹰9号(Sp…

mysql面试题(最全)

1. 数据库三大范式是什么&#xff1f; 什么是范式&#xff1f; 范式是数据库设计时遵循的一种规范&#xff0c;不同的规范要求遵循不同的范式。 最常用的三大范式 第一范式(1NF)&#xff1a;属性不可分割&#xff0c;即每个属性都是不可分割的原子项。(实体的属性即表中的列)…

ESXi主机CVE-2021-21972漏洞复现安全处置建议

一、漏洞简介 vSphere 是 VMware 推出的虚拟化平台套件&#xff0c;包含 ESXi、vCenter Server 等一系列的软件。其中 vCenter Server 为 ESXi 的控制中心&#xff0c;可从单一控制点统一管理数据中心的所有 vSphere 主机和虚拟机。 vSphere Client&#xff08;HTML5&#xf…

【博客624】MAC地址表、ARP表、路由表(RIB表)、转发表(FIB表)

MAC地址表、ARP表、路由表(RIB表/FIB表) MAC地址表 MAC地址表是交换机等网络设备记录MAC地址和端口的映射关系&#xff0c;代表了交换机从哪个端口学习到了某个MAC地址&#xff0c;交换机把这个信息记录下来&#xff0c;后续交换机需要转发数据的时候就可以根据报文的目的MAC地…

SpringBoot社区版专业版带你配置热部署

&#x1f49f;&#x1f49f;前言 ​ 友友们大家好&#xff0c;我是你们的小王同学&#x1f617;&#x1f617; 今天给大家打来的是 SpringBoot社区版专业版带你配置热部署 希望能给大家带来有用的知识 觉得小王写的不错的话麻烦动动小手 点赞&#x1f44d; 收藏⭐ 评论&#x1…

C++类基础(十七)

类的继承——补充知识 ● public 与 private 继承&#xff08;C Public, Protected and Private Inheritance&#xff09; 改变了类所继承的成员的访问权限 //公有继承 struct Base { public:int x; private:int y; protected:int z; }; struct Derive : public Base //公有继承…

【数据结构与算法】时间复杂度与空间复杂度

目录 一.前言 二.时间复杂度 1.概念 二.大O的渐进表示法 概念&#xff1a; 总结&#xff1a; 三.常见时间复杂度计算举例 例1 例2 例3 例4 例5.计算冒泡排序的时间复杂度 例6.二分算法的时间复杂度 例7.阶乘递归Fac的时间复杂度 例8.斐波那契递归的时间复杂度 …

【MyBatis】| MyBatis的注解式开发

目录 一&#xff1a;MyBatis的注解式开发 1. Insert注解 2. Delete注解 3. Update注解 4. Select注解 5. Results注解 一&#xff1a;MyBatis的注解式开发 MyBatis中也提供了注解式开发⽅式&#xff0c;采⽤注解可以减少Sql映射⽂件的配置。 当然&#xff0c;使⽤注…

推荐几款好用的数据库管理工具

本文主要介绍几款常用的数据库管理软件&#xff08;客户端&#xff09;&#xff0c;包括开源/免费的、商用收费的&#xff0c;其中有一些是专用于 MySQL 数据库的&#xff0c;例如 MySQL Workbench、phpMyAdmin&#xff0c;有一些是支持多种 SQL、NoSQL 数据库的&#xff0c;例…

Kubernetes集群维护—备份恢复与升级

Etcd数据库备份与恢复 需要先安装etcd备份工具yum install etcd -y按不同安装方式执行不同备份与恢复kubeadm部署方式&#xff1a; 备份&#xff1a;ETCDCTL_API3 etcdctl snapshot save snap.db --endpointshttps://127.0.0.1:2379 --cacert/etc/kubernetes/pki/etcd/ca.cr…

知其然更要知其所以然,聊聊SQLite软件架构

SQLite是一个非常受欢迎的数据库&#xff0c;在数据库排行榜中已经进入前十的行列。这主要是因为该数据库非常小巧&#xff0c;而且可以支持Linux、Windows、iOS和Andriod的主流的操作系统。 SQLite非常简单&#xff0c;是一个进程内的动态库数据库。其最大的特点是可以支持不同…

spring的了解以及项目构建

spring理念&#xff1a; 使现有的技术更容易使用&#xff0c;其本身是一个大杂烩&#xff0c;整合了现有的技术框架。 ssh&#xff1a; struct2 spring hibernate ssm &#xff1a;springmvc spring mybatis 优点&#xff1a; spring 是一个免费的开源框架&#xff08;容器…

特征归一化(Normalization)和Batch Normalization的理解

一、理解BN必备的前置知识&#xff08;BN, LN等一系列Normalization方法的动机&#xff09; Feature Scaling&#xff08;特征归一化/Normalization&#xff09;:通俗易懂理解特征归一化对梯度下降算法的重要性 总结一下得出的结论&#xff1a; &#xff08;以下举的例子是针对…

创建基于Vue2.0开发项目的两种方式

前天开始接触基于Vue2.0的前端项目&#xff0c;实际操作中肯定会遇到一些问题&#xff0c;慢慢摸索和总结。   其实&#xff0c;作为开发一般企事业单位应用的小项目&#xff0c;前端的懂一点HTMLCSSJavaScroptJQueryJson&#xff08;或者Xml&#xff09;&#xff0c;后端懂一…

PGLBox全面解决图训练速度、成本、稳定性、复杂算法四大问题!

图神经网络&#xff08;Graph Neural Network&#xff0c;GNN&#xff09;是近年来出现的一种利用深度学习直接对图结构数据进行学习的方法&#xff0c;通过在图中的节点和边上制定聚合的策略&#xff0c;GNN能够学习到图结构数据中节点以及边内在规律和更加深层次的语义特征。…