【SCL】博图SCL语言回顾和第一个面向对象程序

news2024/9/22 11:26:28

西门子SCL语言回顾复习和编写第1个面向对象程序

(形参:形参指的是指令上标记该指令要使用的数据位置的标识符;简单来说就是只有数据类型,没有实际的地址,在调用时可以写入)。

 (实参:实参指的是包含指令要使用的数据的存储单元(含%数据前缀)或常量,。用户指定的实参的数据类型必须与指令指定的形参所支持的数据类型之一匹配。就是需要实际地址)

文章目录

目录

前言

一、回顾

1.数据类型

2.表达式、定时器、边沿指令、转换指令、块结构、控制指令

 1.表达式

 2.定时器

3.边沿指令

 4.转换指令

5.块结构 

 6.控制指令

 二、面向对象编程(一键启停功能的功能块)

 1.控制要求

2.分析 

3.设计

 1.建立FB块和形参

 2.编写

3.调用代码和效果

4.多处调用 

1.多次调用(适合少量调用)

 2.在函数块中嵌套调用

 3.使用数组,多次调用

 4.另外在背景数据块中可以清晰的看到我们所写的块。

总结


前言

经过前面编程指令和scl应用的学习,我们掌握了一些SCL语言的知识;这一章我们简单回顾一下前面学过的知识和指令,然后学习一些面向对象编程的思路和一些方法,再编写一个面向对象的程序设计 “一键启停功能块”。


一、回顾

1.数据类型

数据类型分为基本数据类型、复杂数据类型、自定义数据类型 

 基本数据类型:位,字节,字,双字,浮点型,双精度浮点型,整型。

数据类型位大小数值类型数值范围常数示例地址示例
bool1二进制2#0或2#12#0I1.0、Q0.1
byte8无符号整数0到25512IB2
有符号整数-128到127-67IB10
16进制B#16#0到B#16#ff,16#0到16#ff16#fDB1.DBB4
word16无符号整数0到65535200Mw10
有符号整数-32768到32767-300DB1.DBW2
16进制16#0到16#ffffW#16#F1C0
DWord32无符号整数0到4294967295234762MD10
有符号整数-2147483648到2147483647-243561DB1.DBD8
16进制16#000000到16#ffffff16#B_01F6
Real32浮点型

-3.402823e+38到1.175495e-38

+1.175 495e-38到+3.402823e+38

 123.456,-3.4,1.0MD100、DB1.DBD8
LReal64双精度浮点型-1.7976931348623158e+308 到-2.2250738585072014e308
+0
+22250738585072014e308到
+1.7976931348623158e
+308
12345.123456789e40、1.2E+40DB name.var_name规则:
·不支持直接寻
址·可在
OB、FB或FC块接口数组中进行分配
USInt8无符号短整型0到25578,2#01001110MB0DB1.DBB4
SInt8短整型-128 到 127+50,16#50
UInt16无符号整型0到6553565295,0MW2、DB1.DBW2
Int16整型-32,768 到 32,76730000.+30000
UDInt32无符号双整型0到4294,967,2954042322160MD6、DB1.DBD8
DInt32双整型-2,147,483,648 到2,147,483,647-2131754992

 基本数据类型:时间(定时器相关)

数据类型大小范围常数输入示例
Time32-2,147,483.648 ms 到+2,147,483,647 msT#5m 30sT#1d 2h 15m 30s 45ms
Data16D#1990-1-1到D#2168-1231D#2009-12-31
Time_of_day32TOD#0:0:0.0 到TOD#23:59:59.999TOD#10:20:30.400

 基本数据类型:字符型(字符相关)

数据类型大小范围常数输入示例
char816#00到16#FF'A' t, '@'a'z’
Wchar1616#0000 到16#FFFFA,t,@,a,,亚洲字符、西里尔字符以及其它字符
Stringn+ 2字节n=(0到254字节)"ABC"
WStringn+ 2个字n=(0到65534个字)”a123@XYZ.COM"

 复杂数据类型:

数据类型大小范围常数输入示例
DTL(长格式日期和时间)12最小: DTL#1970-01-01-00:00:00.0最大:DTL#2262-0411:23:47:16.854 775807DTL#2008-12-1620:30:20.250
Byte组件数据类型值大小
0,1UINT1970到2554
2UINT1到12
3UINT1到31
4工作日UINT1(星期日)到 7(星期六)
5小时UINT0到23
6UINT0到59
7UINT0到59
8,9,10,11纳秒UINT0到 999 999 999

数据类型数组语法
ARRAY全部数组元素必须是同一数据类型。
数组可以是一维到六维数组。
用逗点字符分隔多维索引的最小最大值声明
不允许使用嵌套数组或数组的数组。
数组的存储器大小_= (一个元素的大小*数组中的元素的总数)
数组声明ARRAY[1..20] of REAL
 
“1维,20 个元素
ARRAY[1..2,3..4] of CHAR2维,4 个元素
数组地址ARRAY1[0]
 
ARRAY1元素0
ARRAY2[1,2]
ARRAY2 元素[1,2]
 
ARRAY3[i,j]如果i=3 且i=4,则对ARRAY3的元素[3,41 进行寻址

2.表达式、定时器、边沿指令、转换指令、块结构、控制指令

 1.表达式

 表达式有逻辑表达式、关系表达式、算术表达式。

逻辑表达式:&/and(与),OR(或),XOR(异或),NOT(取反);

关系表达式:=,>,<,<=,>=,<>,等一些;

算术表达式:+,-,*,/,%,等等。

 2.定时器

 关于定时器在前面说过使用方法以及简单案例,这里以TON为例记一下定时器使用技巧:
IEC定时器在调用的时候会需要指定其所对应的背景存储区,该存储区可以是专属背景DB块也可以是共享数据块中的Timer数据,也可以是FB中静态存储区中的Timer数据。
在编程的时候,不建议大家为每个定时器建立专属的背景DB块,这种方式比较浪费系统数据并且且容易混乱;

这里建议下面两种方式:
1.在OB块中使用定时器: 建立一个专用DB块,在DB块中使用数组的方式建立若干个定时器存储区

如下图:在“TECT”数据块中,分别为TON、TOF、TP定时器构建了5个定时器;

建立方法:在DB块中建立,如果是ton定时器,数据类型就是 Array[1..5] of TON_ TIME。

34ed7689df1248fb879b956fd964273c.png 2.在FB块中使用定时器

选择接口模式,这样当FB块被调用的时候,由于每个FB块都需要指定背景数据块,定时器都会被自动分配新的定时器地址,可以在FB编程之前,先定义相关的定时器存储区。

 如图:在块接口处的静态变量中,定义了10个定时器类型。(Array[1..10] of IEC_TIMER) 

0e25f3ef8db145dab2e84b51d3c1316f.png

 3.定时器调用

 我们用前面两种方法建立好之后,就可以使用了。

如图:块接口和DB块 

8468d0567b614cffa4c59cbb69711be3.png

 23204cbe1b694b62825d7e973dc7c5e7.png

3.边沿指令

 边沿指令是指 上升沿和下降沿,这里一样可以在FB块接口中建立,数据类型就是 R_TRIG,这里在DB块中不支持多重实例,所以建在接口处就可以了。

6329eeb4d3274032bebdc9da94570621.png

 4.转换指令

 1.隐式转换(大数据类型可以兼容小数据类型)

 隐式数据类型转换处理不同数据类型的操作数,自动转换数据类型以匹配最大的数据类型不需要显式转换;

 像DWORD型数据可以兼容WORD数据类型,这里会自动转换。例如:#MyDword:= #MyByte AND W#16#ff;

 2.显式转换

当出现逆向的数据类型计算或者整数与浮点数之间的数据计算时,将提示错误或报警信息。此时需要显式转换。 

 像Word类型转换为DWORD类型时,就需要显式转换,显式转换指令是:char_TO_int(),To两边是要转换的类型,括号里面是需要转换的。如图:

0a7b53ef026e434cad85bed4ffd2b66e.png

 6fa0f4f2dd4e430db5824e92584dab3e.png

5.块结构 

 8230c00c7ac94406a479689ca50ef3d9.png

 1.模块化编程

 模块化编程将复杂的自动化任务划分为对应于生产过程的技术功能的较小的子任务,每个子任务对应于一个称为“块的子程序,可以通过块与块之间的相互调用来组织程序。这样的程序易于修改、查错和调试。
块结构显著增加了PLC程序的组织透明性、可理解性和易维护性。
OB、FB、FC都包含代码,统称为代码块(Code)块
被调用的代码块又可以调用别的代码块,这种调用称为嵌套调用
在块调用中,调用者可以是各种代码块,被调用的块是OB之外的代码块。调用功能块时需要为它指定一个背景数据块。

2.FC块 

 功能(Function,FC)是用户编写的子程序,包含完成特定任务的程序FC调用它的块共享的输入、输出参数,执行完FC,将执行结果返回给调用它的代码块。功能(Function,FC)没有固定的存储区,功能执行结束后,其局部变量中的临时数据就丢失了。可以用全局变量来存储那些在功能执行结束后需要保存的数据。
在编程过程中,具备复用功能的FC块适合用在单扫描周期能完成的任务中,如线性转换程序,逻辑判断功能等。

 3.FB块

 功能块(FB)是用户编写的有自己的存储区(背景数据块)的块。FB的典型应用是执行不能在一个扫描周期结束的操作。每次调用功能块是,却需要指定一个背景数据块,背景数据块随功能块的调用而打开,在调用结束时自动关闭。功能块的输入、输出和静态变量(Static)用指定的背景数据块保存,但是不会保存临时局部变量(Temp)中的数据。功能块执行后,背景数据块中的数据不会丢失。IN复用型FB的显著特点是内部会使用上升沿、下降沿、定时器等功能指令

 两者区别:

 FB有自己的背景数据块,而且内部有静态变量区,可以写上升沿、下降沿、定时器等功能指令;

74aa88c60c75498cbfb91957a7d823d4.png

 FC没有上面这些,执行结束后里面的局部变量就没有了;

两者各有优缺。

 6.控制指令

 SCL语言编程中,常用的控制指令有:if  ,if else,if  elsif,case  of ,for 循环。比较常用的这些。 


 二、面向对象编程(一键启停功能的功能块)

  面向对象是指对一个对象来编程(这个对象可以是电机或者其他的,我们以它为中心来进行编程)

 1.控制要求

设计一个其有一键启停功能的功能块,具有以下功能: 

A.一键启停模式:操作启动按钮,按一下启动,再按一下停止。

B.运行模式:按住启动按钮,延迟时间到了之后设备启动。按下停止按钮,设备立即停止。

C.模式切换后立即停机。

2.分析 

 根据题目要求可以看:这里要求一个一键启停控制和一个定时器延时开启以及一个模式切换功能,这里分开来说一下。

一键启停:按下启动按钮电机启动,再次按下启动电机停止,这里用梯形图和scl分别实现一下 。

梯形图:用上升沿接通Inc加计数并置位电机线圈,这是MW20为1,当再次按下启动按钮,Inc增加为2,等于2时复位线圈并把MW20清零,可以循环使用。

40d1f682232944e885ebd70d463e9856.png

 SCL:这里由上升沿接通,对km线圈进行一个取反来实现功能(具体如图)。

4ef8cb5569834349a3df57817303280b.png

3.设计

 1.建立FB块和形参

 (形参:形参指的是指令上标记该指令要使用的数据位置的标识符;简单来说就是只有数据类型,没有实际的地址,在调用时可以写入)。

 (实参:实参指的是包含指令要使用的数据的存储单元(含%数据前缀)或常量,。用户指定的实参的数据类型必须与指令指定的形参所支持的数据类型之一匹配。就是需要实际地址)

 在FB块上方接口处,根据要求写入输入输出(这里写的就是形参)

84756acad25b4dbe9380d06d28b0d270.png

 将形参写好就可以编写了。

  

 2.编写

 A.一键启停模式:操作启动按钮,按一下启动,再按一下停止。

1.这里首先获取启动按钮上升沿和模式切换的上升下降沿;

#上升沿1(CLK := #启动按钮);
#上升沿2(CLK := #模式切换按钮);
#下降沿1(CLK := #模式切换按钮);

 使用启动按钮上升沿来完成一键启停:

IF #上升沿1.Q THEN  // 上升沿触发
        #km电机 := NOT #km电机;//对线圈进行取反
    END_IF;

B.运行模式:按住启动按钮,延迟时间到了之后设备启动。按下停止按钮,设备立即停止。

C.模式切换后立即停机。

2.这里分为一键启停和运行两种模式,模式切换按钮为0时,是一键启停,为1是运行模式(这是在定义形参时规定好的),为1时进入运行模式,当按住启动按钮一定时间后,设备启动。

#T[1].TON(IN := #模式切换按钮 & #启动按钮 & NOT #停止,
          PT := #设定时间);


IF #模式切换按钮 THEN  //当切换按钮为1时是运行模式
    
    IF #T[1].Q THEN
        #km电机 := 1;
    END_IF;
ELSE                  //为0,一键启停模式
    IF #上升沿1.Q THEN
        #km电机 := NOT #km电机;
    END_IF;

3.就是模式切换时立即停止和停止按钮,这里就用到模式切换的上升和下降沿,不管是从0变1还是从1变0,电机都会停止。

IF #停止 THEN
    #km电机 := 0;
END_IF;

IF #上升沿2.Q OR #下降沿1.Q THEN
    #km电机 := 0;
END_IF;

3.调用代码和效果

//获取按钮的上升沿或下降沿
#上升沿1(CLK := #启动按钮);
#上升沿2(CLK := #模式切换按钮);
#下降沿1(CLK := #模式切换按钮);

//模式切换停止,和停止按钮停止
IF #停止 THEN
    #km电机 := 0;
END_IF;
IF #上升沿2.Q OR #下降沿1.Q THEN
    #km电机 := 0;
END_IF;

//运行模式用到的延时定时器
#T[1].TON(IN := #模式切换按钮 & #启动按钮 & NOT #停止,
          PT := #设定时间);

//判断模式切换按钮的两种情况
IF #模式切换按钮 THEN      //为1时,运行模式
    
    IF #T[1].Q THEN
        #km电机 := 1;
    END_IF;
ELSE                       //为0时,一键启停
    IF #上升沿1.Q THEN
        #km电机 := NOT #km电机;
    END_IF;
    
END_IF;

代码写好后,在main(OB)中调用FB函数:两边是接口,我们写入相应的输入输出就可以啦!

 输入可以是M点,方便调试。

 效果:这里监视打开就可以调试了

4.多处调用 

这一个功能块写好后,可能很多地方都需要调用,这里有几种方法;

1.多次调用(适合少量调用)

在OB多拉出来几个,写入不同变量就可以了 

 2.在函数块中嵌套调用

我们新建一个FB(M_FB)在里面调用多次FB1,最后在OB中调用1个M_FB函数块就可以了,这种比较节省空间。 

 3.使用数组,多次调用

当我们要调用100次或更多是,可以用数组来建立;在函数接口处建立多个。

 按照下标可以调用;

 4.另外在背景数据块中可以清晰的看到我们所写的块。

 


总结

1.调试技巧:调用块过之后,写入相应变量,可以使用 Ctrl+F2和Ctrl+F3来快速置一或置零;

2.定时器技巧:可以在FB块 静态变量中建立定时器,不容易混乱,或在DB中建立;

3.边沿指令技巧:也可以在FB静态变量中建立,DB中不兼容;

4.编程习惯:在SCL中可以使用中文或英文来命名变量,可以根据个人来选择。每一个程序写好后都建议留下注释,方便他人或自己来看;

5.FB和FC的使用:可以根据控制要求或自己来选择。

本文将数据类型,表达式、定时器、边沿指令、转换指令、块结构、控制指令进行简单回顾和复习,然后一起编写了第一个面向对象的程序设计,好的,那么以上就是本篇文章的全部内容啦!另外,如有不足之处,可以在下面留言!

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

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

相关文章

并发编程学习(九):同步模式之顺序控制、交替打印

1、固定运行顺序例如&#xff1a;两个线程&#xff0c;运行是必须先2后1打印。1.1、Object之wait、notify版在同步代码块中&#xff0c;wait开始后&#xff0c;CPU将释放给另一个线程使用&#xff0c;直到①若wait(xxxx)&#xff0c;则x秒后当前线程被唤醒&#xff0c;继续占用…

STM32项目设计:基于stm32f103c8t6智能电梯系统

文章目录一、项目功能概述二、项目材料选择三、原理图设计四、PCB板设计五、主程序设计六、成品展示资料链接&#xff1a;待更新~ 哔哩哔哩视频链接&#xff1a;https://www.bilibili.com/video/BV17D4y1V7HG/?vd_sourcee5082ef80535e952b2a4301746491be0&#xff08;bilibili…

STM32G431——串口通信

蓝桥杯嵌入式——串口通信 目录 USART 电平标准-TTL 电平标准与 RS232 电平标准 232通信标准 USB转232 异步通信 串口配置 程序设计 重定向 串口发送函数 发送字符串 串口接收——中断 1.USART 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异…

集成测试最全详解,看完必须懂了

什么是集成测试 集成测试&#xff08;Integration Testing&#xff09;&#xff0c;也叫组装测试或联合测试。在单元测试的基础上&#xff0c;将所有模块按照设计要求&#xff08;如根据结构图&#xff09;组装成为子系统或系统&#xff0c;进行集成测试。 集成测试&#xff…

chatgpt的一些思考

结论国内同行对chatgpt的认识是不够的&#xff0c;太轻视这个模式的颠覆性认知chatgpt是对思维过程的仿真&#xff0c;rlhf过程就是通过强化学习方式在利用人思维过程训练模型chatgpt比搜索更通用化&#xff0c;搜索是对单个点信息的匹配&#xff0c;chatgpt是对思维链一个序列…

【python】多任务编程之线程、进程知识点详细总结

目录 多任务的执行方式 进程 概念 python多进程 线程 概念 python多线程 线程同步方式 线程等待 互斥锁 死锁 线程和进程对比 多任务的执行方式 进程 概念 python多进程 Windows下的main判断process进程类import multiprocessing import time def sing():for i i…

Unix环境高级编程_进程环境_启动代码,环境变量表,进程内存结构,库

这是《UNIX环境高级编程》第7章内容&#xff0c;这篇文章记录进程所需要的环境。 4 进程环境 程序加载到内存&#xff0c;运行起来后就成为了进程。就像人活着需要生活环境&#xff08;衣食住行的环境&#xff09;一样&#xff0c;进程也需要运行环境&#xff0c;进程所需要的…

Vue组件生命周期与钩子函数

组件生命周期 ​ 组件&#xff08;组件是可复用的 Vue 实例&#xff09;从创建到销毁的过程就是组件的生命周期&#xff0c;是一个时间段。 组件生命周期钩子函数 &#xff08;vue3与vue2生命周期钩子函数略有不同&#xff0c;本文以vue2为主&#xff09; ​ VUE 提供的生命…

科研快报 | 三代测序技术-海水微生物态,助力海水微生态及微生物基因组研究

PacBio研究专题二代测序读长偏短&#xff0c;环境宏基因组样品研究受到了很大限制。作者通过三代测序对来自地中海的冬季混合海水样本进行宏基因组测序。利用PacBio Sequel II平台的超长读长明显可以提升宏基因组的组装质量&#xff0c;又能显著提升MAGs质量。研究人员通过比较…

使用和登录Linux云服务器

目录 云服务器的购买 SSH登录云服务器 云服务器的购买 我们以腾讯云为例, 其他的服务器厂商也是类似。 1. 进入腾讯云官方网站&#xff1a;学生云服务器_云校园特惠套餐 - 腾讯云 (tencent.com) 2. 登陆网站(可以使用微信登陆) 3.购买云服务器 购买最低级即可&#xff0c;对于…

python - 科研文献作图复现1

记录阅读文献过程中&#xff0c;通过python复现原文的一些脚本 想要复现的文章原图如下所示 原文链接&#xff1a; https://file.scirp.org/Html/4-2430166_82999.htm 首先&#xff0c;对于原图进行简要观察。 这是一张折线图&#xff0c;绘制了6条不同颜色的折线来表示不同…

舆情监控软件免费下载,TOOM网络舆情监控软件服务流程?

舆情监测可以帮助个人和企业了解自己的网络形象&#xff0c;提高自我评价和评价能力&#xff0c;提升自我定位和竞争力。接下来简单了解舆情监控软件免费下载&#xff0c;TOOM网络舆情监控软件服务流程? 一、舆情监控软件免费下载 请登录TOOM舆情官网获取链接 1.企业客户&a…

SpringMVC(十三):SpringMVC拦截器介绍使用

文章目录 SpringMVC拦截器介绍使用 前言 一、拦截器使用 二、拦截器内容详解 1、preHandle方法 2、postHandle方法 3、afterCompletion方法 三、多个拦截器执行顺序 SpringMVC拦截器介绍使用 前言 在之前的系列文章里&#xff0c;我们学习了过滤器的知识。过滤器的作…

ejs模板在Express框架中的集成

在上一篇内容中已经使用了pug模板&#xff0c;那么本篇就来了解一下ejs模板在Express框架中的集成使用&#xff0c;ejs模板也是常用的模板引擎&#xff0c;支持在标签内直接编写javascript代码&#xff0c;通过javascript代码就能够生成HTML页面的&#xff0c;通过本期对ejs模板…

C++字符串全排列(递归法)和(迭代法)以及next_permutation底层原理详解

目录前言next_permutation的使用实现全排列的两种算法1. 递归法(全排列方便理解记忆的方法&#xff0c;作为备用方法)实现代码(无重复元素情况)有重复元素情况2. 迭代法(next_permutation底层原理)实现代码(有无重复不影响)前言 next_permutation/prev_permutation是C STL中的…

全国青少年软件编程(Python)等级考试一级考试真题2022年12月——持续更新.....

1.关于Python语言的注释,以下选项中描述错误的是?( ) A.Python语言有两种注释方式:单行注释和多行注释 B.Python语言的单行注释以#开头 C.Python多行注释使用###来做为标记 D.注释用于解释代码原理或者用途 正确答案:C 2.下列代码执行后最有可能绘制出的图形是?(…

网络原理(TCP/IP五层协议)(三)

目录4.滑动窗口(效率机制)5.流量控制(安全机制)6.拥塞控制(安全机制)7.延迟应答(效率机制)8.捎带应答(效率机制)9.面向字节流10.TCP的异常处理4.滑动窗口(效率机制) 滑动窗口存在的意义就是在保证可靠性的前提下&#xff0c;尽量提高传输效率。 在这里可以看到&#xff0c;由于…

JSP 学生成绩管理系统myeclipse定制开发sqlserver数据库网页模式java编程jdbc

一、源码特点 JSP 学生成绩管理系统是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为SQLServer2008&#x…

layui 富文本layedit编辑、存储和回显

一、创建一个富文本编辑框 先定义一个textarea标签&#xff0c;给定一个id值&#xff0c;向页面引入layedit&#xff0c;然后调用layedit.build(id, options)构建富文本框 //官方给出的模板 <textarea id"demo" style"display: none;"></textar…

Linux的目录相关操作

目录 前言 处理目录的常见命令 cd&#xff08;change directory&#xff0c;切换目录&#xff09; pwd&#xff08;print working directory&#xff0c;显示目前所在的目录&#xff09; mkdir&#xff08;make directory&#xff0c;建立新目录&#xff09; rmdir&#x…