DM150为P1,直线坐标轴上定义为Ay,是BCD码,数值为10
DM151为P2,直线坐标轴上定义为Ax,是HEX十六进制数5,转化为BCD码,数值为5
那么由DM150和DM151可以组成坐标轴上的一点A(5,10)
同理,
DM152为P3,直线坐标轴上定义为By,是BCD码,数值为50
DM153为P4,直线坐标轴上定义为Bx,是HEX十六进制数19,转化为BCD码,数值为25
那么由DM152和DM153可以组成坐标轴上的一点B(25,50)
那么由A、B两点可以组成一条直线,直线的表达式为y=2x,如何得出的么,相信楼主应该学过直线方程。
然后现在已知一点x的坐标,也就是DM100,是BCD码,数值为100,就是要求出相应这点在直线上的y坐标。代入方程,得出y=200,这个是BCD码,但是写入DM200的时候,PLC会自动把它转化成HEX十六进制数,就是0512。
这样解释应该明白了吧~
在SCL程序编写中,在逻辑控制或者数据处理分析中,有一类指令我们用得最多,就是程序控制指令,常见的入IF ,Case ,For 和While 等。下面我仔细的讲解,有疑问可以留言提出:图1 程序控制指令
IF .. THEN 指令
IF 指令含有含有三个分支,分别是Then ,Else 和ElsIF。
图2 IF 语句
图3 浮点数比较条件
IF语句应该是SCL里面最常用的语句了,常用于条件判断。判断类型可以是BOOL类型,可以是浮点类型等等,基本上所有类型都可以判断,只要比较的两个变量类型是一样。
在图2中,AByte 是Byte 类型,因为1在0..255之间,所以1会自动转化为Byte类型。如果比较的是Abyte类型是256,会是什么样子呢?读者可以自己写的程序,试验一下,看看结果,会加深你对数据类型的理解。
上面程序中,首先比如AByte是否和1相等,如果相等则Outvalue的值为1,然后和2比较,如果和2相等,那么OuValue值为2,如果都满足条件OuValue 的输出值则为5。
上述的IF条件语句,也可以用CASE语句来进行表示。CASE的比较类型没有IF 范围广,只有整形才能做为比较条件。
CASE指令
图4 IF语句的CASE表达方式
从CASE语句表述中,我们发现语句相对于IF表达式来说,更加清晰简单明了,所以如果需要用到整形条件作为判断,尽量用CASE来实现,会提高效率。
FOR 指令
FOR指令常用来对数组类型数据进行批量处理,在上一期讲解中已经举过一个例子,下面举个稍微复杂点的例子。
图5 FOR循环语句
在FOR程序,我们对数组的每一个索引值进行赋值,同时判断索引值的奇偶性来进行赋值 *** 作。
图6 FOR循环语句2
在上面的程序里面,我们发现有一个关键字Continue .当FOR循环执行到该语句的时候,Continue下面的程序都不会执行。所以,当iCout小于15的时候,AArray[iCount]:=iCount赋值语句不会执行。
还有一个地方有点区别,就是FOR 语句后面,多了一个关键字 BY 。BY的含义是For 执行的间隔按照BY的设定来执行。如果后面设定为1,则0..99全部执行;如果设定为2,则执行顺序为0,2,4,6,8的顺序来执行。
上述的FOR循环语句,我们同样可以采用WHILE循环来实现。
WHILE 指令
图7 WHILE指令
WHILE循环的表达方式和FOR循环基本类型,但是我们注意一点,这里面对循环变量,手动进行进行递进。如果没有这一句,iCount的值一直为0,循环条件iCount<100将一直为True,WHILE循环会一直执行。所以切记一定执行该语句。
我们还注意到一个关键字EXIT,当执行到该指令的时候,WHILE循环会停止执行,FOR指令也是一样。所以上面的程序,运行下来的情况是,数组的赋值只执行到AArray[81]结束。
GOTO指令
goto指令主要用来执行跳转过程,可以带来程序 *** 作的便利性,一般不推荐使用。若 *** 作不当,则会打乱整个程序的逻辑性。
在图7 中,如果iCount 大于90,那么,程序就会跳出WHILE 循环执行指定标签lable13地方程序#iCount=0,继续从头开始执行WHILE循环。当然这个 *** 作是毫无意义的,这里只是举个例子而已。
SCL作为IEC61131-3编程语言的一种,由于其高级语言的特性,特别适合复杂运算、复杂数学函数应用的场合。本文以FactoryIO软件中的物料分拣案例作为硬件基础,介绍如何通过SCL来实现编程。图片
图1-1物料分拣设备场景
图片
图1-2设备IO信号分配
PART2
功能描述
该设备有四条输送线,分别是进料输送线1、出料输送线1、进料输送线2、出料输送线2,在进料输送线末端各有一个视觉传感器,用于识别产品的型号,在出料输送线的首端分别有两个气缸,用于产品的分拣。
其动作流程如图所示:
图片
图1-3设备动作流程图
PART3
项目案例功能实现
该项目按照新建FacotyIO任务场景,导出变量表,新建博图项目、导入变量,新建SCL功能块,编写SCL程序,设备仿真调试几个步骤进行。
1.新建FactoryIO任务场景;
图片
图1-4新建物料分拣场景
本案例中使用的FactoryIO场景是V2.5.0版本,使用的是其自带的分拣工作站场景。
2.选择驱动器类型为西门子S7-PLCSIM并导出变量表;
图片
图1-5导出场景变量表
图片
图1-6导出标签(变量表)
3.新建博图项目,并导入变量表;
图片
图1-7导入变量表
注意:新建的项目使用FactoryIO提供的工程模板。
4.新建SCL功能块;
图片
图1-8新建SCL功能并在OB1中调用
5.编写SCL程序
图片
图1-9设备模式程序
图片
图1-10自动控制程序
图片
图1-11 设备停止及信号输出
图片
图1-11关联PLC变量
6.设备仿真调试,先将PLC进行仿真,FactoryIO再连接仿真器调试。
图片
图1-12启动博图PLCSIM仿真
图片
图1-13Factory IO连接PLCSIM
注意:连接成功后,在状态栏中会有一个绿色对勾的标识,之后可以在场景视图中进行仿真调试了。
PART4
总结
此案例是基于FactoryIO仿真硬件,使用SCL语言编写的控制程序。通过此案例,可以让初学者掌握SCL的基本 *** 作、编程思路和编程方法。首先scl语言和lad(梯形图)语言都是可编程控制器中的一种编程语言,用来编写程序。
另外SCL(Structured Control Language 结构化控制语言) 具有以下特点:
适用于 S7-300 (推荐CPU314以上), S7-400,S7-1200,S7-1500, C7 and WinAC
SCL 为 PLC 做了优化处理,它不仅仅具有 PLC 典型的元素(例如 输入/输出,定时器,计数器,符号表),而且具有高级语言的特性, 例如:表达式,赋值运算,运算符,循环, 选择,分支,数组 ,高级函数等。
SCL 其非常适合于如下任务:
复杂运算功能
复杂数学函数
数据管理
过程优化
2.相关问题
关于scl语言的相关问题可以参考西门子官网手册:
文档链接:https://support.industry.siemens.com/cs/attachments/109481384/2008928131135970.pdf
3.scl语言的编写环境
scl的编写环境可以在单独的一个块里面,也可以在一小段程序里面,并且可以和其它的语言混合编写,简称混编。例如:程序段2是lad编写,程序段3是scl编写。
这里我们添加新块fc,选择scl语言就可以了,下面是在fc块中的编写环境。(这里可以看出和C语言有些相似)和平常写程序时一样,上面是常用的指令,右侧是基本指令,中间是写程序的地方。
二、表达式和运算符
1.算术表达式
1.介绍
1、算术表达式既可以是一个数字值,也可以是由带有算术运算符的两个值或表达式组合而成。
2、算术运算符可以处理当前 CPU 所支持的各种数据类型。如果在该运算中有2个 *** 作数,那么可根据以下条件来确定结果的数据类型:
如果这 2个 *** 作数均为有符号的整数,但长度不同,那么结果将采用长度较长的那个整数数据类型例如:INT + DINT = DINT
如果1个 *** 作数为有符号整数,另一个 *** 作数为无符号整数,那么结果将采用另一个长度较大的有符号数据类型(包括无符号)例如:SINT+SUINT=INT
如果这 2 个 *** 作数均为无符号整数,但长度不同,那么结果将采用长度较长的那个整数数据类型,例如:USINT + UDINT = UDINT
3、如果,一个 *** 作数为整数,另一个为浮点数,那么结果将采用浮点数的数据类型,例如,INT +REAL= REAL
4、如果两个 *** 作数均为浮点数,但长度不同,结果将采用长度较长的那个浮点数的数据类型,例如:REAL+LREAL=LREAL
2.算术表达式使用
算术表达式有:加法, 减法, 乘法,除法,模运算和幂运算。
创建一个数据块,使用一个结构体变量(struct)变量类型为int,C是最后的结果;
然后C:=A+B,就是将A+B的和放到C里面,其中:=是赋值的意思。
最后打开仿真,输入数值,就可以计算出结果;这里是以加法举例,后面的乘除取模和幂运算大致相同。
3.例题
使用scl语言计算这个公式:(A*(B+C))的2次方/4
这样套进去就可以了。
2.关系表达式
1.介绍
关系表达式就是由 = 、<>、>、<、>=、<= 组成的表达式。如果条件成立为:TRUE,不成立为:FALSE;比较后的结果必须是放在Boll量类型的变量中。
数据类型中的所有变量都可以进行比较:整数/浮点数、二进制数、字符串。
对于以下数据类型/数据组,只能比较相同类型的变量像:TIME、LTIME日期和时间、ARRAY。
比较浮点数
1、比较浮点数时,待比较的 *** 作数必须具有相同的数据类型,而无需考虑具体的“IEC 检查”(IEC Check) 设置。2、对于无效运算的运算结果(如,-1的平方根),这些无效浮点数(NaN)的特定位模式不可比较。即,如果一个 *** 作数的值为 NaN,则比较表达式“==:等于”和“<>:不等于”的结果将为 FALSE。
比较字符串
比较字符串时,系统将对各字符的代码进“a”大于“A”)。并按照从行比较(如,左到右的顺序进行比较。第一个不同的字符将确定比较的结果。
比较定时器、日期和时间
系统无法比较无效定时器、日期和时间的位模式1、如DT#2015-13-33-25:62:99.999 999 999)如果某个 *** 作数的值无效,则指令“手:等于即,的结果将为FALSE<>:不等干
2、并非所有时间类型都可以直接相互比较,如需要将其显式转换为其它时简类型S5TIME。此时然后再进行比较(如,TIME),
3、如果要比较不同数据类型的日期和时间,则需将较小的日期或时间数据类型显式转换为较大的日期或时间数据类型。。例如,比较日期和时间数据类型DATE和DTL时,将基于DTL进行比较
如果显式转换失败,则比较结果为 FALSE
比较 WORD 数据类型的变量与S5TIME 数据类型的变量
将WORD 数类型的变量与 S5TIME 数据类型的变量进行比较时,这两种变量都将转换为 TIME 数据类型。WORD变量将解释为一个 S5TIME 值。如果这两个变量中的某个变量无法转换,则不进行比较且输出结果 FALSE。如果转换成功,则系统将基于所选的比较指令进行比较 *** 作。
比较结构
1、结构比较功能仅适用于固件版本为 V4.2及以上版本的S7-1200系列CPU,以及固件版本为V2.0及以上版本的S7-1500系列CPU2、如果两个变量的结构数据类型相同,则可以比较这两个结构化 *** 作数的值。比较结构化变量时,待比较 *** 作数的数据类型必须相同,而无需考虑具体的“IEC 检查(IEC Check) 设置。但一个 *** 作数为VARIANT,而另一个为 ANY时除外。创建程序时,如果数据类型未知,则可使用 VARIANT 数据类型。这样,就可比较任意数据类型的结构化变量 *** 作数。此外,还可以比较VARIANT或ANY 数据类型的变量。
ARRAY 数据类型
1、元素的数据类型必须相同。
2、两个 ARRAY 的维数必须相同。3、所有维数的元素数量必须相同,而具体的ARRAY 限值无需相同
2.使用
相等为TRUE,不相等为FALSE。
3.逻辑表达式
1、逻辑表达式由两个 *** 作数和逻辑运算符(取反:NOT,与:AND/&,或:OR,异或:XOR)组成。
2、逻辑运算符可以处理当前 CPU 所支持的各种数据类型。如果两个 *** 作数都是 BOOL数据类型则逻辑表达式的结果也为BOOL数据类型。如果两个 *** 作数是位字符串,则结果也为位字符串。
3、逻辑表达式中一个 *** 作数为 BOOL 类型而另一个为位字符串时,必须先将BOOL类型的 *** 作数显式转换为位学符串类型
1.取反 (NOT)
取反指令可以将1变为0,将0变为1;是按2进制位取反。
2.与(AND/&)
与指令(按位与):全1为1,有0为0.
3.或(OR)
或指令(按位或):有1为1,全0为0。
4.异或(XOR)
异或指令:相同为0,相异为1。
4.运算符的优先级
运算符及其运算顺序
-通过运算符可以将表达式连接在一起或相互嵌套。
表达式的运算顺序取决于运算符的优先级和括号。基本原则如下所示
1、算术运算符优先于关系运算符,关系运算符优先于逻辑运算符。
2、同等优先级运算符的运算顺序则按照从左到右的顺序进行。
3、赋值运算的计算按照从右到左的顺序进行括号中的运算的优先级最高
5.赋值运算
1、通过赋值运算,可以将一个表达式的值分配给一个变量。赋值表达式的左侧为变量,右侧为表达式的值。2、函数名称也可以作为表达式。赋值运算将调用该函数,并返回其函数值,赋给左侧的变量。
3、赋值运算的数据类型取决于左边变量的数据类型。右边表达式的数据类型必须与该数据类型一致。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)