俺花了两个上午的时间,初步了解了scl的使用方法,在此给各位汇报交流一下:
所需软件:step7v5.2+scl5.1+plcsim5.2
资料:scl手册(安装scl软件后带的)
第一天上午:
1、启动scl后,如何创建新程序?
SCL程序创建在”S7 Program”-”Sources”下面。
S7-Program
-Blocks(e.g. FB,OB)
-Sources(e.g.SCL source file)
-Symbols
2、程序怎么写?
程序结构
FB: FUNCTION_BLOCK fb_name
END_FUNCTION_BLOCK
FC: FUNCTION fc_name:function 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
3、笔者就创建一个简单的fc块吧,然后在ob里面调用
FUNCTION fc1:INT//返回值为整型,如果不需要返回,声明为void
VAR_INPUT//定义一个输入参数
a:INT;
END_VAR
begin
fc1:=a+10;
end_FUNCTION//块结束
然后编译通过,在ob里面调用,运行plcsim,单步执行,看结果,通过!
第二天上午:研究以下问题
SCL如何调用其他SCL以及用LAD等编写的程序?
写一个有循环、判断等基本语句组成的程序。
参数使用问题?(直接使用实际地址?参数传递问题)
1、 在SCL里面调用LAD或者STL写的块
先用STL或者LAD创建一个FC2:
定义一个输入参数:in1(int型);一个输出参数:out1(int型)
语句表如下:
L #in1
L #in1
+I
T #out1
NOP 0
在下面写的SCL里面调用FC2:
FUNCTION fc1:INT
VAR_INPUT
a:INT;
END_VAR
VAR_TEMP
b:INT;
end_var
begin
//fc1:=a+10;
fc2(in1:=a,out1:=b);
fc1:=b;
end_FUNCTION
2、在SCL里面调用其他SCL写的块
FUNCTION fc1:INT
VAR_INPUT
a:INT;
END_VAR
VAR_TEMP
b:INT;
end_var
BEGIN
fc3(in1:=a,out1:=b);//调用fc3
fc1:=b;
end_FUNCTION
FUNCTION fc3:void//无返回值
VAR_INPUT
in1:INT;
END_VAR
VAR_OUTPUT
out1:INT;
end_var
begin
out1:=in1+10;
end_FUNCTION
3、一个带有循环、判断等基本语句的程序
FUNCTION fc4:VOID
VAR_INPUT
in1:BOOL;
in2:INT;
END_VAR
VAR_OUTPUT
out1:BOOL;
out3:BOOL;
out2:INT;
END_VAR
VAR//定义一个静态变量,用来存储块调用之间的数据
temp1:BOOL;
END_VAR
VAR_TEMP
temp2:INT;
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 fc1:VOID
BEGIN
in1:=in1+10;//in1在符号表里面已经定义为int型,存储区为mw0
IF m0.0=false then//这里直接引用实际地址
m0.0:=true;
ELSE
m0.0:=false;
END_IF;
end_FUNCTION