西门子SCL心得

西门子S7 SCL语言学习手记
 
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_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
    
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 CONST
  declaration list
  END_CONST X X X
  Labels LABEL
  declaration list
  END_LABEL X X X
  Temporary Variables VAR_TEMP declaration list
  END_VAR X X X
   X X X
  Static variables VAR
  declaration list
  END_VAR
   X X X X X
  Input parameters VAR_INPUT
  declaration list
  END_VAR
   X X
  Output parameters VAR_OUTPUT
  declaration list
  END_VAR
   X X
  In/out parameters VAR_IN_OUT
  declaration list
  END_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 fc1:INT
  VAR_INPUT
   a:INT;
  END_VAR
  begin
  fc1:=a+10;
  end_FUNCTION
  
  运行后:每次m0.0从0变1,就调用FC1一次,mw18里面的数据加10。
  
问题: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 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
5、如何在线调试SCL程序
  注:仅400可以设置断点(breakpoint)以及单步执行
  
  
学习基本完毕!已经了解了编写SCL程序的基本方法!
  
  在数据转换方面,SCL和LAD有一些区别,SCL的数据转换有两种类型:
  ? Implicit数据转换,即如果数据类型不匹配,Scl会自动进行默认的数据转换
  Classes Conversion Order
  Any_bit Bool>byte>Word>Dword
  Any_num INT>DINT>Real
  例如两个数相加,一个是int型,一个是real型,则在编译的时候int型数据会被系统转换为real型再进行运算,结果只能存放在real型中。
  ? Explicit 数据转换
  由用户程序用相应的功能块进行数据转换。
  
  而LAD没有Implicit数据转换,参与运算的两个数必须类型一致。
  
  如果给变量赋值,比如:mw0:=a1;(这里a1是定义好的int型的临时变量),则编译会提示出错“错误的数据类型“,这是因为编译器不认为mw0是一个有效的int型变量,除非在符号表里面定义了一个符号比如f11为mw0,int型,则f11:=a1;可以编译通过;
  
  另外DB块的使用与LAD/STL也有所不同,在LAD或者STL里面如果要按照db里面定义的符号名来调用db里面的变量,则必须事先给db定义一个名字,然后写成"DB1_IN".P1(db1_in是事先定义好的db的符号名,p1则是db1中的dbw0存储区)。而在scl中,则可以写成:db1.p1(事先无效定义db的符号名)或者db1_in.p1都可以
  
  DATE_AND_TIME类型的数据不能直接赋值(编译不会报错),可以按照数据结构分解赋值:
  DATE_AND_TIME是按照下面的结构:
  1BYTE YEAR
  1BYTE MONTH
  1BYTE DAY
  1BYTE HOUR
  1BYTE MINUTE
  1BYTE SECOND
  1BYTE MSD(MOST SIGNIFICANT DECADE) OF MS
  1BYTE MSD(LEAST SIGNIFICANT DECADE) OF MS
  1BYTE WEEKDAY
  
  OB块的temp变量,Help里面说:“To execute, each OB alwaysrequires 20 bytes of local data for the operating system. You mustdeclare an array for this with an identifier.”
  实际上为了编程方便,可以手动定义变量而不用系统模板定义的20byte的array(数组)。因为有些变量不是byte类型的。手动定义变量必须主意必须把所有变量定义完成,否则会因为变量定义的不够造成temp数据区不够大,就不能返回任何结果!!!
  
关于FC和FB的区别
  对于需要在运行过程中需要“记住”的中间变量,可采用静态变量。但是由于FC的每个静态变量是固定的地址存储,那么FC每次被调用都是读写同一个静态变量,如果FC在一次循环中被多次调用,则静态变量在每次循环中被多次读写;而FB的静态变量则是由指定的DB存储因此每个被调用的FB都有其独立的存储空间,则如果FB在一次循环中被多次调用,其静态变量也只是被读写一次。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页