Object_Pascal_西门子SCL应用_系列1_初识SCL

      在这里介绍自动化的开发工具,貌似不合时宜, 因为论坛里面讨论的都是计算机领域的东西。

      这里借博客园的地方来谈谈自己对Pascal语言的一点看法, 不知道管理员是否会将帖子删除, 如果删除的话,我以后就不发了,如果不删除的话,以后我

就继续跟着这个主题继续发帖。

      我对SCL以前也是耳闻,现在也是初学, 将自己的一点学习心得和总结发出来供大家拍砖.......

      为什么学习SCL呢, 是因为我发现想利用LAD/FBD/STL做一些循环操作、微积分之类的操作实现起来有点困难,因此就想学习一个简单点语言来实现

工控中经常要用到的PID调节、微积分和一些复杂的数学计算。

      我不知道为什么在计算机领域,目前Pascal语言的应用为什么不如C/C++这个系列的语言应用广泛(Java、C#可以说是C语言这个系列的), 因为据我

所知,Pascal语言也定义了指针这样的操纵结构, 借助Delphi系列的语言在win下也可以和VC一样对系统函数进行强有力的使用,同样可以开发win下的驱动

程序,而在Linux下也有Kylix这样的Visual开发环境,为什么目前就没有以前那么好了呢? 在我的印象里面Delphi曾经是一个非常流行的开发工具,那为什么

没有以前那样的应用了呢?

      其实在自动化控制领域Pascal语言还是占有一席之地的(当然C语言也占有一席之地, 奇怪好像C语言在什么领域都有一席之地,看来C语言的统治地位,目前

是没法改变的,虽然Java的程序员一直高居榜首,但是C语言一直是应用范围最广的,在单片机、嵌入式、DSP、大型有限元、Matlab控制系统仿真、人工智能模拟,

以及其他大型的工程仿真和应用里面,C语言好像比其他任何语言应用都多,扯远了),Pascal在自动化控制领域是作为SCL语言存在的; 主流的PLC厂家都支持SCL

语言,像Siemens、RockWell等的主流产品都支持SCL编程。

      下面我们来看看西门子PLC的SCL语言。

1、S7 SCL功能介绍
1、1 与Step 7集成
   SCL支持Step 7中的程序/块的概念
用SCL可以创建以下Step 7的块
  1)OB组织块
  2)FC函数/功能
  3)FB功能块
  4)DB数据块
  5)UDT用户自定义数据类型
  在一个S7的项目中, SCL编制的程序能够与其他S7语言编制的块相结合和想互调用;编译好的SCL程序块
可以存储在S7的程序块文件夹(Blocks文件夹中),并且可以当做标准的S7块被调用。
  SCL程序用文本编辑器编辑(ASCII文本编辑器),很容易被导入和导出。
  S7 SCL编制的程序块可以编译成STL形式的语句, 编译成STL形式的程序将不能再在SCL中编辑,如果要编辑
SCL程序块,必须编辑其源文件。
1、2 开发环境
   S7 SCL提供了一个IDE的开发环境,通过这个环境可以与Step7进行协调工作,完成用户的程序编辑和编译任务。
开发环境的组件:
   1)编辑器: 进行SCL程序的编辑。
   2)批编译器: 将SCL源程序编译成MC7机器代码,生产的MC7机器代码可以在S7 300/400的PLC上运行,
                如CPU 315-2DP
   3)调试器:可以通过调试器对程序进行调试工作。

2、S7 SCL的功能
2.1 块库
   块库提供了预定义的块,
   1)系统功能
   2)IEC功能
   3)转换功能
   当在编辑程序的过程中,从库中选择一个块,则其参数模板自动调入正在进行处理的程序文件中。
2.2 编程模板
   S7 SCL提供了以套编程模板方便编程人员编辑源程序
    1)块及其调用模板
    2)块注释、块参数和常量模板
    3)程序控制结构模板
2.3 高级语言要素
    1)循环结构
    2)分支结构
    3)跳转结构
2.4 易用性功能
    1)全符号编程, 在Step7中创建的符号在SCL可以应用
    2)基于Pascal类型的注释
    3)基本和自定义数据类型
    4)显示交叉参考(Reference Cross)
    5)语言语法着色
    6)自动进行格式化(Indent)输入的内容
2.5 高级语言调试功能
    1)连续监视程序运行
    2)可单独设置断点进行监视
    3)Step-in功能(调试期间进入被调用块进行监视)

2.6 SCL的应用范围
    包含Pascal语言要素,同时也包含了输入/输出、定时器、计数器等PLC元素
    1) 复杂算法编程
    2) 数学函数编程
    3) 数据和配方管理
    4) 过程优化

3、开发SCL程序过程
3.1 创建新的的SCL源文件
    在进行编写SCL程序前必须建立一个新的SCL源文件,建立源文件是在S7程序的源文件夹里进行的。
    具体建立过程不再细说,同建立其他源文件的方法一样。
3.2 编辑SCL源程序
    可以通过IDE环境编辑源程序
3.3 调试源程序
    通过IDE的编译工具,可以检查程序的语法和句法错误。
    通过IDE的调试工具可以对程序进行调试。
3.4 编译成STL
    将远程程序编译成块文件
3.5 下载
    1)SCL的IDE环境进行下载,这样需要源程序
    2)在LAD /FBD /STL 编辑器中进行下载,这样需要将SCL编译成STL程序代码

4、SCL程序结构

     首先我们来看一个简单SCL源程序中的FUNCTION块

Exp:

FUNCTION FC11: REAL

 VAR_INPUT // 这里是函数的输入参数 x1: REAL ; x2: REAL ; x3: REAL ; x4: REAL ; END_VAR

VAR_OUTPUT //这里是函数是输入输出参数, 有点类似指针的操作,因为在函数里面操作的话,会影响传值的实参 Q2: REAL ; END_VAR

BEGIN //这里是函数体 // 从函数返回值 FC11:= SQRT( (x2 - x1)**2 + (x4 - x3) **2 ) ; Q2:= x1 ; END_FUNCTION //与Pascal不一样的地方,这里文件程序结尾不是 END.

   可以发现程序的FUNCTION的结构样式和Pascal的非常相似。

4.1 SCL源文件中的块
    能够在S7 SCL源程序代码中编程一定数量的块。块时Step 7程序的子单元,根据他们的功能、结构
或预期的用途进行组织。
4.1.1 Step 7/SCL 中的块类型
   1)组织块 OB
   2)函数  FC(相当于不带有静态存储区的C语言函数)
   3)函数块 FB(带背景数据, 相当于带有static数据类型的C语言函数)
   4)数据库 DB(分为共享数据块;相当于C语言中的全局变量。 背景数据块: 就是FB带的背景数据)
   5)UDT用户自定义数据类型(有点类型C语言中的Struct 和Delphi中的Record)
4.1.2 预定义块
    S7系统提供了一些预定义好的块,这些块在STEP 7标准包的CPU操作系统或库(S7 lib)中,如编程
通讯功能的SFC14/SFC 15,或者进行工程量转换的FC105/FC106.
4.2 块的逻辑结构/次序
   被调用块在被调用之前必须遵循一些规则:
   1)用户自定义数据类型UDTs必须在使用它的块之前定义
   2)由用户定义的数据类型UDT来进行声明(/定义)的数据块DB块必须跟在所引用的UDT之后
   3)被所有用户逻辑块(OB、FC、FB)访问的数据库DB块必须在被访问前定义
   4)指定给FB的实例数据块DB在FB功能块之后。
   5)组织块OB1,调用其他块,在最后出现.在OB1中被调用的块必须在被调用前定义
   6)在不同源文件中调用的块在文件编译到用户程序时必须已经存在
   7)SCL源文件也能够包含针对各个要编译的块的编译器设定信息,编译器选项在块中没有位置限制。
4.3 块的一般结构
  块包含下列区域:
   1) 块开始区域:  通过关键字和一个块名或符号块名标识,
       Exp:
            ORGANIZATION_BLOCK OB1    //定义组织块OB1的块头部
       或者:
            ORGANIZATION_BLOCK "main_cycle"   //"main_cycle"为OB1的标识符
       对于函数,需要指定函数类型,函数类型决定其返回值的数据类型, 如果无返回值则应指定关键字:VOID
       Exp:
            VOID FUCTION_BLOCK "StartMotor" 
   2)可选的块标题
     可选的块标题由关键字“TITLE=”引出
     Exp:
         TITLE="FUCTION TO CONTROL THE MOTOR"
     块标题或作为Step 7中的comment内容出现在资源管理器里
   3)可选的块注释
      在SCL中块注释可以扩展到多行, 每行由 “//” 开始
      SCL的注释与类Pascal语言一致
      Exp:
           //计算电机的速度
   4)块属性
     可选的条目
   5)块的系统属性
     可选的条目
   6)声明部分
      根据块类型的不同,会有不同的声明部分
   7)逻辑块中的语句部分
      或在数据块中实际值的给定(可选)
   8)逻辑块: 语句
   9)快结束
      END_ORGANIZATION_BLOCK, END_FUNCTION_BLOCK、END_FUNCTION
4.4 块的开始和结束
    一句块的不同类型,标准块的开始标识符和块名作为单个原文本的开始,块尾标准标识符结束该块。
   句法结构:
Exp:
标识符                     块类型                    句法
Function Block          FB                    FUNCTION_BLOCK Fb_Name
 功能块                                             ...
                                                      END_FUCNTION_BLOCK

Function                FC                      FUNCTION  fc_name:function type
功能                                                ...
                                                      END_FUNCTION

Organization Block    OB                   ORGANIZATION_BLOCK OB_NAME
 组织块                                            ...
                                                    END_ORGANIZATION_BLOCK

Data Block            DB                      DATA_BLOCK DB_NAME
数据块                                              ...
                                                     END_DATA_BLOCK

Shared data type      UDT                TYPE UDT_NAME
用户定义数据类型                              ...
                                                     END_TYPE

4.4.1 块名
    如上所列,xx_name当做块名, 参照以下语法:
    
      块关键字                    数字
   DB FB FC OB UDT          n
       标识符
       符号

数字可以是0到65535之间的值, 但是数据块标识符DB0 被保留,用户不能定义和使用
若使用符号名,必须为在Step7中为块定义一个标识符或符号名

Exp:
函数块
   FUNCTION_BLOCK  FB10  //利用块关键字定义
   ...
   END_FUNCTION_BLOCK

   FUNCTION_BLOCK  Cotroll_Block  //利用标识符进行定义
   ...
   END_FUNCTION_BLOCK

   FUNCTION_BLOCK  "Control block"  //利用全局符号进行定义
   ...
   END_FUNCTION_BLOCK

     通过上面简单的介绍,我们发现SCL真的就像VBScript与VB的关系一样,SCL就像Pascal的一个子集似的.

    如果管理员不删帖,我以后就慢慢把这个系列写完, 因为我发现在网络上关于SCL的讨论比较少,这里希望可以给工控界的朋友提供一个

可以讨论的地方......

你可能感兴趣的:(pascal)