《在S7300-400型PLC中使用高级语言编程》由会员分享,可在线阅读,更多相关《在S7300-400型PLC中使用高级语言编程(19页珍藏版)》请在金锄头文库上搜索。
1、在 S7300/400 型 PLC中使用高级语言编程S7-SCL是一种类似于 Pasical 、Deliphi的高级编程语言,其符合国际标准IEC 61131-3,也就是说支持该标准的任意厂家的PLC均可以使用与之相似的语言编 程。这种语言适合于处理复杂的逻辑和大量的数学运算,由于其具有高级语言的 编程结构,因此和 S7的 STL语句表编程方式比较起来有着更加方便的控制方式, 可以这样说, 只要是必须使用语句表的地方, 我们均可以考虑使用SCL,也许 STL 在执行时比 SCL更加高效,但事实上也不一定,首先SCL可以编译成 STL,同时 SCL设计时可以优化编程,而STL若运用不当,可能还会
2、将低效率。当然在目前 的这种系列的 PLC上, 效率对于我们来说已是次要的, 我们更关心的是编程结构。 就像在 PC机上,舍弃了汇编语言,而主要采用C/C+等高级语言。总体来说, SCL适合于编写标准功能块,由于在维护中,它和STL一样,不象 Lad 一样利于 维护,因此这些标准功能块都应该有文档说明,以便用户了解其功能。下面的内容主要是参考西门子的S7-SCL文档,对 SCL进行了系统的介绍, 最后给出了示例。这里假设读者是学过S7-300/400 编程,并曾经学过至少一种计算机高级编 程语言。一、软件的使用1、 创建一个新的 S7-SCL Source 文件打开工程项目 选择 CPU站 选
3、择 S7 Program选择 Sources 在右边窗口的空白处点右键选Insert New Object点击 SCL Source 双击创建的 SCL Source 文件,进入 SCL编辑界面。2、 块保护在 SCL Source 文件的开头添加关键字: KNOW_HOW_PROTECT,当打开由其创建的 块时,只能显示参数,而看不到内容。3、主菜单” Insert ”下的” Block Template ”可用于插入如OB,FB等各种块的 结构。” Control Structure”菜单可插入各种流程控制结构,这些都可以简化 编程。4、在运行程序之前, 首先必须对它进行编译, 可以编译整
4、个 Source 文件或者某 个被选择的块,通过选择菜单File Compile Selected Blocks。也可以把几 个 Source 文件一起进行编译,其方法是创建一个S7-SCL compilation control file.在该文件中依次输入需要编译的SCL Source 文件名,然后执行编译即可。二、语法规则1、编写 SCL Source 文件的一般规则 FB, FC, OB, DB以及用户定义的 UDT ,它们使用的任意数字号均可以在SCL Source 中编辑。 每种块类型都有它自己的结构。 每段落或者每个变量的声明以符号”; ”标志结束。 不区分大小写。 注释仅存在于
5、程序文档中,它不影响程序运行。 当一个功能块被调用时, 其背景数据块被自动创建, 因此它们不需要被编辑。 DB0 有特定用途,因此在程序中不能创建DB0. 2、 编写块的先后次序 被调用的块必须位于调用块之前。 UDT的定义必须位于其被使用的位置之前。 共享数据块必须位于那些使用它的所有块之前。三、数据类型1、数据类型预览 、基本数据类型2、补充、DATE_AND_TIME Data Type 其值的范围: DT#1990-01-01-0:0:0.0-DT#2089-12-31-23:59:59.999 该类型以 BCD 码形式存储。例如 20/Oct./1995 12:20:30 and 1
6、0 milliseconds显示如下: DATE_AND_TIME#1995-10-20-12:20:30.10 DT#1995-10-20-12:20:30.10 STRING e.g. 声明 VAR Text1 : String 123; /该字符串的最大容量为123 个字符 Text2 : String; /该字符串的默认容量为254 个字符 END_VAR 初始化: x : STRING7:=Address; /在使用 STRING 前,必须对它赋值。FUNCTION Test : STRING45 VAR_TEMP x : STRING45; END_VAR x := a; x :=
7、 concat (in1 := x, in2 := x); Test := x; /返回值 END_FUNCTION 数组类型 e.g. VAR CONTROLLER1 : /声明 3 行、4 列的二位整数数组,并对其初始化 ARRAY1.3,1.4 OF INT:= -54, 736, -83, 77, -1289, 10362, 385, 2, 60, -37, -7, 103 ; CONTROLLER2 : ARRAY1.10 OF REAL ; / 声明 10 个数的一维实数数组 END_VAR 注:数组的最大维数为6 维,数组的索引范围为 -32768 - 32767之间的任意整数。
8、所有的基本数据类型均可用于数组。数组可以使用变量进行索引,例如: arrname_1 i := arrname_2 j ; STRUCT 类型 e.g. 声明一个结构 MOTOR 中包含另一个结构DATA 。对结构声明时,可以初始化 元素,也可以在使用之前再初始化。 VAR MOTOR : STRUCT DATA : STRUCT LOADCURR : REAL ; VOLTAGE : INT := 5 ; END_STRUCT ; END_STRUCT ; END_VAR 结构以 WORD 的形式结尾,否则系统自动把丢失的字节补到结构中去。用户定义类型 UDT (使用关键字 TYPE ) T
9、YPE / 定义名字为 MEASVALUES的数据类型 MEASVALUES: STRUCT BIPOL_1 : INT := 5; BIPOL_2 : WORD := W#16#FFAA ; BIPOL_3 : BYTE := B#16#F1 ; BIPOL_4 : WORD := W#16#1919 ; MEASURE : STRUCT BIPOLAR_10V : REAL ; UNIPOLAR_4_20MA :REAL ; END_STRUCT; END_STRUCT; END_TYPE / 在 FB10中使用该类型 FUNCTION_BLOCK FB10 VAR MEAS_RANGE
10、: MEASVALUES; /创建 UDT数据 END_VAR BEGIN / 使用 UDT数据 MEAS_RANGE.BIPOL_1 := -4 ; MEAS_RANGE.MEASURE.UNIPOLAR_4_20MA := 2.7 ; END_FUNCTION_BLOCK POINTER 类型 e.g. / 定义功能块 FC100 FUNCTION FC100 : VOID /VOID 表明该功能不返回值 VAR_IN_OUT /定义 FC100的输入输出型参数N_out : INT; out : POINTER; /定义 POINTER 型数据类型,参数均为临时变量 END_VAR VA
11、R_TEMP / 定义临时变量 ret : INT; END_VAR BEGIN / 进入函数主体 / . ret := SFC79(N := N_out, SA := out); END_FUNCTION / 定义功能块 FB100 FUNCTION_BLOCK FB100 VAR / 定义静态变量,即离开块后仍旧保存状态的变量 ii : INT; aa : ARRAY1.1000 OF REAL; END_VAR BEGIN / . FC100(N_out := ii, out := aa); /调用 FC100 ,使用指针的方式传递整个数 组 / . END_FUNCTION_BLOCK
12、 ANY 类型 e.g. VAR_INPUT /输入型变量 iANY : ANY; /定义为 ANY END_VAR VAR_TEMP pANY : ANY; /定义为 ANY END_VAR CASE ii OF /CASE 分支语句 1: pANY := MW4; / 将 MW4 的地址赋给 pANY / of MW4 3.5: /等于 3,4,5 的情况下 pANY:= aINTii; / pANY contains the address / of the ii th / element of the aINT field; 100: pANY := iANY; / pANY cont
13、ains the value / of the iANY input variable ELSE pANY := NIL; / pANY contains the value / of the NIL pointer END_CASE; SFCxxx(IN := pANY); 四、局部变量和参数的声明1、变量静态变量:用于保持块的数据,该数据存在背景数据块中。 临时变量:仅在块运行过程中存在。 若多个变量的数据类型一致,可用如下方式: VALUE2, VALUE3,VALUE4,.: INT; 声明时可以初始化: VALUE :REAL := 20.25; 数组的初始化有两种方式: CONTR
14、OLLER1 : ARRAY 1.2, 1.2 OF INT := -54, 736, -83, 77; 当把相邻的数组元素赋相同的值时,例如,把A32 到 A311 的值设为 100.0: A3 : ARRAY1.12 OF REAL := 0.0, 10(100.0), 1.0; 2、块参数输入参数:用于接收当块被调用时的输入值,他们是只读的。 输出参数:传输当前值到这个调用块,在被调用块中应该对该参数赋值 输入/ 输出参数:用于接收当块被调用时的输入值, 并可以把结果返回到调用块。3、使用多重背景声明方式如下: Supply1 : FB10; / Supply1为 FB10的背景 DB
15、Supply2,Supply3,Supply4 : FB100; /为 FB100声明多个背景 DB Motor1 : Motor ; / Motor为某个 FB的符号名4、 变量的声明五、常量S7-SCL常量分位常量、 数字常量、字符常量、 时间常量 , 使用 CONST,END_CONST 声明。 e.g. CONST Number := 10 ; /整数常量 TIMEOFDAY1 := TIME#1D_1H_10M_22S_2MS ; / 时间常量 NAME := SIEMENS ; /字符串常量 NUMBER2 := 2 * 5 + 10 * 4 ; NUMBER3 := 3 + NUMBER2 ; END_CONST 1、 位常量Bool#false 位的值为 TRUE 或者 FALSE 8#177777 8 进制 DW#16#0000_0000 16 进制2、 整数常量,它有多种表达方式15 10 进制值为 15 2#1111 2 进制值为 15 16#F 16 进制值为 15 Value_2:=2#0101; / 2进制值为 5 Value_3:=8#17; / 10进制值为 14 Value_4:=16#F; / 16进制值为 15 Value_5:=INT#16#3f_ff /