原创:SCL学习心得
,今天看见有兄弟找scl中文资料,小弟我就当是抛砖引玉吧
2004.1.14
1、 SCL程序可以在CPU314及其以上的S7(包括400)中运行。
2、 SCL程序创建在”S7 Program”-”Sources”下面。
S7-Program
-Blocks(e.g. FB,OB)
-Sources(e.g.SCL source file)
-Symbols
3、 程序结构
FB FUNCTION_BLOCK fb_name
END_FUNCTION_BLOCK
FC FUNCTION fc_namefunction type
END_FUNCTION
OB ORGANIZATION_BLOCK ob_name
END_ORGANIZATION_BLOCK
DB DATA_BLOCK db_name
END_DATA_BLOCK
UDT TYPE udt_name
END_TYPE
4、 属性定义和程序注释
例如:
FUNCTION_BLOCK FB10
This is a block comment.
TITLE = ’Mean_Value’
VERSION ’2.1’
KNOW_HOW_PROTECT
AUTHOR AUT_1
5、 变量定义
Data Syntax FB FC OB DB UDT
Constants CONSTdeclaration listEND_CONST X X X
Labels LABELdeclaration listEND_LABEL X X X
Temporary Variables VAR_TEMP declaration listEND_VAR X X X X X X
Static variables VARdeclaration listEND_VAR X X X X X
Input parameters VAR_INPUTdeclaration listEND_VAR X X
Output parameters VAR_OUTPUTdeclaration listEND_VAR X X
Inout parameters VAR_IN_OUTdeclaration listEND_VAR X X
6、FC结构
FUNCTION FC11 REAL如果不需要返回值,用VOID关键字
VAR_INPUT
x1 REAL ;
x2 REAL ;
x3 REAL ;
x4 REAL ;
END_VAR
VAR_OUTPUT
Q2 REAL ;
END_VAR
BEGIN
Return value from function
FC11= SQRT( (x2 - x1)2 + (x4 - x3) 2 ) ;
Q2= x1 ;
END_FUNCTION
7、自己写了一个简单的程序
OB1:
FC1用SCL编写:
FUNCTION fc1INT
VAR_INPUT
aINT;
END_VAR
begin
fc1=a+10;
end_FUNCTION
运行后:每次m0.0从0变1,就调用FC1一次,mw18里面的数据加10。
2004.1.15
问题:SCL如何调用其他SCL以及用LAD等编写的程序?
写一个有循环、判断等基本语句组成的程序。
参数使用问题?(直接使用实际地址?参数传递问题)
如何在线调试SCL程序(debug)
1、 在SCL里面调用LAD或者STL写的块
先用STL或者LAD创建一个FC2:
定义一个输入参数:in1(int型);一个输出参数:out1(int型)
语句表如下:
L #in1
L #in1
+I
T #out1
NOP 0
在下面写的SCL里面调用FC2:
FUNCTION fc1INT
VAR_INPUT
aINT;
END_VAR
VAR_TEMP
bINT;
end_var
begin
fc1=a+10;
fc2(in1=a,out1=b);
fc1=b;
end_FUNCTION
2、在SCL里面调用其他SCL写的块
FUNCTION fc1INT
VAR_INPUT
aINT;
END_VAR
VAR_TEMP
bINT;
end_var
BEGIN
fc3(in1=a,out1=b);调用fc3
fc1=b;
end_FUNCTION
FUNCTION fc3void无返回值
VAR_INPUT
in1INT;
END_VAR
VAR_OUTPUT
out1INT;
end_var
begin
out1=in1+10;
end_FUNCTION
3、一个带有循环、判断等基本语句的程序
FUNCTION fc4VOID
VAR_INPUT
in1BOOL;
in2INT;
END_VAR
VAR_OUTPUT
out1BOOL;
out3BOOL;
out2INT;
END_VAR
VAR定义一个静态变量,用来存储块调用之间的数据
temp1BOOL;
END_VAR
VAR_TEMP
temp2INT;
END_VAR
BEGIN
IF in1=false AND temp1=true THEN检验下跳沿
out1=true;
ELSE
out1=false;
END_IF;
IF in1=true AND temp1=false THEN检验上跳沿
out3=true;
ELSE
out3=false;
END_IF;
temp1=in1;
FOR temp2=1 TO 10 BY 2 DO省略了关键字by,就默认加1
out2=in2+out2;
END_FOR;
END_FUNCTION
4、SCL中直接使用绝对地址
FUNCTION fc1VOID
BEGIN
in1=in1+10;in1在符号表里面已经定义为int型,存储区为mw0
IF m0.0=false then这里直接引用实际地址
m0.0=true;
ELSE
m0.0=false;
END_IF;
end_FUNCTION
5、如何在线调试SCL程序
注:仅400可以设置断点(breakpoint)以及单步执行