西门子PLC SCL语言开发学习笔记(二)
今天来讲下scl两个关键的点
一、按键事件
比如地址I0.0是某个按钮的状态,他只有True和False两个状态,所以我们要获得按下事件需要我们自己模拟。
#KeyPress := "Btn1" AND NOT #LastKey;
#LastKey := "Btn1";
这样通过对#KeyPress判断是否为True即可获得一次点击事件,相当于 |P|
把上一次的存起来,然后判断按下,如果你想把按键放在松开时也可以。
因为大多数事情都是用按键触发的,掌握这一点才能开始跑代码。
二、定时器
PLC在梯形图中使用定时器很困难,比如TON 5秒,需要输入一直保持True,持续5s后输出变为True,TOF则需要输入从True变成False,然后持续5秒后输出False,自带各种逻辑,一旦碰到复杂的条件判断头都晕了,我是只能做到间隔时间打开几个灯,但要做另一个按钮还能间隔关上就不会了。
我们写程序的只需要一个计时器就好了,不需要你带这么多乱七八糟的逻辑,我们自己决定到时间了干嘛就好了。
1) 使用TON TORN
使用TON很简单,让一个变量保持True,然后判断输出是否时间到了,时间到了既可以做事情了,同时让输入变为False。
TORN则还含有Reset功能,他能累计计时,同时能取到计时了多久,下面这个程序展示了一开始就给TimerStart设置为True,开始计时并变灯的情况。
下面是代码块,不要忘了这是被循环不断执行的,大概功能是第五秒打开一个灯,第10秒再打开一个,到15秒重置, 为了代码简单理解就不加各种为了严谨的判断了
#TimerStart := TRUE; // 随便打开一下,就不写事件了
"IEC_Timer__DB".TONR(IN := #TimerStart,
PT := T#15S, // 计时15秒
Q => #TmpOut, //计时完毕,我们不去用这个
R:= #Reset,
ET => #Time1);// ET为取出计时了多久
IF #Reset THEN
#Reset := FALSE;
END_IF;
IF #Time1 >= T#5s THEN
"Light1" := TRUE;
END_IF;
IF #Time1 >= T#10s THEN
"Light2" := TRUE;
END_IF;
IF #TmpOut THEN
"Light1" := FALSE;
"Light2" := FALSE;
#Reset := TRUE;
END_IF;
2)时钟存储器位
首先右键PLC进入属性

找到时钟存储器位

我们把地址放到100那里去,这样子这几个存储器里,就会有震荡,不断在True False之间来回变化,比图1HZ会在一秒的开始变为True,到一半变为False,再下一秒开始变True,通过他的变化就能计时了
下面这个程序,再按下按钮1后亮一个灯,过5秒再亮一个,再过5秒再亮一个,关闭时也是间隔灭灯,不考虑打开过程中关闭等情况。
IF #TT <> "Clock_1Hz" THEN //一个不断根据震荡时间增加的Count 计数器
#Count += ;
END_IF;
#TT := "Clock_1Hz";
#KeyPress := "Btn1" AND NOT #LastKey;
#LastKey := "Btn1";
IF #KeyPress AND NOT "Light1" THEN // 开灯事件
#TurnOn := TRUE;
#TurnOff := FALSE;
#Count := ; //重置计数器
END_IF;
IF #KeyPress AND "Light1" THEN // 关灯事件
#TurnOn := FALSE;
#TurnOff := TRUE;
#Count := ;
END_IF;
IF #TurnOn THEN // 持续处理开灯
"Light1" := TRUE;
IF #Count >= * THEN
"Light2" := TRUE;
ELSIF #Count >= THEN
"Light3" := TRUE;
END_IF;
END_IF;
IF #TurnOff THEN
"Light1" := FALSE;
IF #Count >= THEN
"Light2" := FALSE;
ELSIF #Count >= THEN
"Light3" := FALSE;
END_IF;
END_IF;
3) 时间函数
其实PLC里面本来也有很多时间函数,比如获取当前机器时间,比较时间差等,我们完全可以很灵活的去使用这些方法,变得和编程无异,这里就不介绍了
结语:我们可以识别按钮事件,然后获得了好用的计时器后,scl的逻辑处理剩下的就都是写代码了和调方法了,没有什么能难倒我们程序员了
SCL逻辑比梯形图更严谨明白,复杂逻辑控制更简单,是我们程序员的好帮手。
以后会继续挖掘SCL的写法,教大家SCL能代替梯形图的写法,做到是个程序员就无门槛
暂时告一段落
西门子PLC SCL语言开发学习笔记(二)的更多相关文章
- 西门子PLC-1200 SCL语言开发学习笔记 (一)
一.简介和背景 PLC一般使用梯形图开发,但是梯形图适合电工使用而不是程序员使用,对我们来说开发困难,门槛高,幸好PLC的开发标准还带了类pascal的高级语言,在西门子这里叫SCL语言,这对于我们程 ...
- python-django开发学习笔记二
1.简述 1.1 开发环境 该笔记所基于的开发环境为:windows8.python2.7.5.psycopg2-2.4.2.django1.5.4.pyCharm-2.7.3.以上所描述的软件.插件 ...
- 软件开发学习笔记 <二>软件开发模型、Up、Rup、敏捷Up
软件开发过程(process) 是一个将用户需求转化为软件系统所需要的活动的集合. 软件生命周期(SDLC,Software Devlopment Life Cycle) 软件从孕育.诞生.成长.成熟 ...
- 基于.NET的CAD二次开发学习笔记二:AutoCAD .NET中的对象
1.CAD对象:一个CAD文件(DWG文件)即对应一个数据库,数据库中的所有组成部分,看的见(包括点.多段线.文字.圆等)和看不见(图层.线型.颜色等)的都是对象,数据库本身也是一个对象. 直线.圆弧 ...
- 单片机C语言开发学习笔记---动态的数码管
在郭天祥的那本书中,有一个通过按键控制数码管的例子,在运行这个例子的时候,我发现当按键按下的时候,第一位数码管会熄掉,这是为什么呢? 后来在网上找到了原因,当我按下按键不松开的时候,接下来要运行的代码 ...
- ECharts实例开发学习笔记二——时间轴
记录一下ECharts时间轴的使用,首先是照着官方的示例做一遍,在这里不要忘了引入timelineOption.js,后面介绍如何动态创建时间轴的记录数,即根据需求可伸缩显示有多少天或者年月等轴标记数 ...
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
- Go语言学习笔记二: 变量
Go语言学习笔记二: 变量 今天又学了一招如何查看go的版本的命令:go version.另外上一个笔记中的代码还可以使用go run hello.go来运行,只是这种方式不会生成exe文件. 定义变 ...
- amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules
amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules 一.总结 1.见名知意:见那些class名字知意,见函数名知意,见文件名知意 例如(HISTORY.md Web 组件更新历史 ...
随机推荐
- linux学习 (Linux就该这么学)
明天周五了,7点准时上课,加油努力学习,12月份要考试了,心里没有底,加油吧!感觉要学的真多,! redhat7,,安装图形界面 yum install -y
- Mybatis 中实体类的编写
一个实体类对应一个数据表 一个属性对应一个字段 默认情况下类名和属性名都采用 “下划线转驼峰” 的命名方式.但具体采用什么样的命名方式并不重要(方式一致即可),在后面使用这些对象的时候,可以通过 re ...
- java多线程系列11 juc包下的队列
队列分为两类 阻塞队列 BlockingQueue提供如下两个支持阻塞的方法: (1)put(E e): 尝试把e元素放如BlockingQueue中,如果该队列的元素已满,则阻塞该线程. ...
- Maven学习 五 Maven项目创建(1)jar项目
第一步:Maven项目的创建 File->new->Maven project. 点击下一步 上方的两个多选框选上,第一个是不使用archetype 原型模板,第二个是使用默认工作空间 点 ...
- centos7.2 下 nginx 开机启动
1.在系统服务目录里创建nginx.service文件 1 vi /lib/systemd/system/nginx.service 内容如下 1 2 3 4 5 6 7 8 9 10 11 12 1 ...
- 1.MFC架构分析
1.架构代码文件的结构 主要由四个部分组成 1.资源文件Resource.h:主要定义资源的ID 2.预编译文件:stdafx.h 可以用来解决头文件包含冲突的问题,定义一些需要全局性包含的文件. 3 ...
- gitlab 搭建自己的源代码管理器
首先 gitlab 是不支持 windows.mac os 的,具体支持的系统参照官网的 1.安装虚拟机 ubuntu16.04 需要注意的一点:gitlab 服务器 与 客户端必须在一个局域网内( ...
- Android开发 - ImageView加载Base64编码的图片
在我们开发应用的过程中,并不是所有情况下都请求图片的URL或者加载本地图片,有时我们需要加载Base64编码的图片.这种情况出现在服务端需要动态生成的图片,比如: 二维码 图形验证码 ... 这些应用 ...
- vue高级组件之provide / inject
转载:https://blog.csdn.net/Garrettzxd/article/details/81407199 在vue中不同组件通信方式如下 1.父子组件,通过prop 2.非父子组件,通 ...
- 我的FP感悟
FP概要: 我主要总结了以下5点: 函数是一等公民: 函数的参数是函数,返回值是函数,类型还是函数... 舍弃语句,拥抱表达式: 表达式就一定有返回值. 无副作用: 不修改外部系统的状态. immut ...