工控网首页
>

应用设计

>

在S7300/400型PLC中使用高级语言编程

在S7300/400型PLC中使用高级语言编程

2005/8/9 10:03:00
S7-SCL是一种类似于Pasical、Deliphi的高级编程语言,其符合国际标准IEC 61131-3,也就是说支持该标准的任意厂家的PLC均可以使用与之相似的语言编程。这种语言适合于处理复杂的逻辑和大量的数学运算,由于其具有高级语言的编程结构,因此和S7的STL语句表编程方式比较起来有着更加方便的控制方式,可以这样说,只要是必须使用语句表的地方,我们均可以考虑使用SCL,也许STL在执行时比SCL更加高效,但事实上也不一定,首先SCL可以编译成STL,同时SCL设计时可以优化编程,而STL若运用不当,可能还会将低效率。当然在目前的这种系列的PLC上,效率对于我们来说已是次要的,我们更关心的是编程结构。就像在PC机上,舍弃了汇编语言,而主要采用C/C++等高级语言。总体来说,SCL适合于编写标准功能块,由于在维护中,它和STL一样,不象Lad一样利于维护,因此这些标准功能块都应该有文档说明,以便用户了解其功能。   下面的内容主要是参考西门子的S7-SCL文档,对SCL进行了系统的介绍,最后给出了示例。   这里假设读者是学过S7-300/400编程,并曾经学过至少一种计算机高级编程语言。 一、 软件的使用 1、 创建一个新的S7-SCL Source 文件 打开工程项目à选择CPU站à选择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、在运行程序之前,首先必须对它进行编译,可以编译整个Source文件或者某个被选择的块,通过选择菜单File > Compile Selected Blocks。也可以把几个Source文件一起进行编译,其方法是创建一个S7-SCL compilation control file.在该文件中依次输入需要编译的SCL Source文件名,然后执行编译即可。 二、语法规则 1、编写SCL Source文件的一般规则 ● FB, FC, OB, DB以及用户定义的UDT,它们使用的任意数字号均可以在SCL Source中编辑。 ● 每种块类型都有它自己的结构。 ● 每段落或者每个变量的声明以符号”;”标志结束。 ● 不区分大小写。 ● 注释仅存在于程序文档中,它不影响程序运行。 ● 当一个功能块被调用时,其背景数据块被自动创建,因此它们不需要被编辑。 ● DB0有特定用途,因此在程序中不能创建DB0. 2、 编写块的先后次序 ● 被调用的块必须位于调用块之前。 ● UDT的定义必须位于其被使用的位置之前。 ● 共享数据块必须位于那些使用它的所有块之前。 三、 数据类型 1、数据类型预览 Ⅰ、基本数据类型
2、补充 <1>、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 10 milliseconds显示如下: DATE_AND_TIME#1995-10-20-12:20:30.10 DT#1995-10-20-12:20:30.10 <2>STRING e.g. 声明 VAR Text1 : String [123]; //该字符串的最大容量为123个字符 Text2 : String; //该字符串的默认容量为254个字符 END_VAR 初始化:x : STRING[7]:=Address; //在使用STRING前,必须对它赋值。 FUNCTION Test : STRING[45] VAR_TEMP x : STRING[45]; END_VAR x := a; x := concat (in1 := x, in2 := x); Test := x; //返回值 END_FUNCTION <3>数组类型 e.g. VAR CONTROLLER1 : //声明3行、4列的二位整数数组,并对其初始化 ARRAY[1..3,1..4] OF INT:= -54, 736, -83, 77, -1289, 10362, 385, 2, 60, -37, -7, 103 ; CONTROLLER2 : ARRAY[1..10] OF REAL ; //声明10个数的一维实数数组 END_VAR 注:数组的最大维数为6维,数组的索引范围为-32768 --- 32767之间的任意整数。所有的基本数据类型均可用于数组。数组可以使用变量进行索引,例如: arrname_1[ i ] := arrname_2[ j ] ; <4>STRUCT类型 e.g. 声明一个结构MOTOR中包含另一个结构DATA。对结构声明时,可以初始化元素,也可以在使用之前再初始化。 VAR MOTOR : STRUCT DATA : STRUCT LOADCURR : REAL ; VOLTAGE : INT := 5 ; END_STRUCT ; END_STRUCT ; END_VAR 结构以WORD的形式结尾,否则系统自动把丢失的字节补到结构中去。 <5>用户定义类型UDT (使用关键字TYPE) TYPE //定义名字为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 : MEASVALUES; //创建UDT数据 END_VAR BEGIN // 使用UDT数据 MEAS_RANGE.BIPOL_1 := -4 ; MEAS_RANGE.MEASURE.UNIPOLAR_4_20MA := 2.7 ; END_FUNCTION_BLOCK <6>POINTER类型 e.g. //定义功能块FC100 FUNCTION FC100 : VOID //VOID表明该功能不返回值 VAR_IN_OUT //定义FC100的输入输出型参数 N_out : INT; out : POINTER; //定义POINTER型数据类型,参数均为临时变量 END_VAR VAR_TEMP //定义临时变量 ret : INT; END_VAR BEGIN //进入函数主体 // ... ret := SFC79(N := N_out, SA := out); END_FUNCTION //定义功能块FB100 FUNCTION_BLOCK FB100 VAR //定义静态变量,即离开块后仍旧保存状态的变量 ii : INT; aa : ARRAY[1..1000] OF REAL; END_VAR BEGIN // ... FC100(N_out := ii, out := aa); //调用FC100,使用指针的方式传递整个数组 // ... END_FUNCTION_BLOCK <7>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:= aINT[ii]; // pANY contains the address // of the ii th // element of the aINT field; 100: pANY := iANY; // pANY contains 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; 数组的初始化有两种方式: CONTROLLER1 : ARRAY [1..2, 1..2] OF INT := -54, 736, -83, 77; 当把相邻的数组元素赋相同的值时,例如,把A3[2]到A3[11]的值设为100.0: A3 : ARRAY[1..12] OF REAL := 0.0, 10(100.0), 1.0; 2、块参数 输入参数: 用于接收当块被调用时的输入值,他们是只读的。 输出参数: 传输当前值到这个调用块,在被调用块中应该对该参数赋值 输入/输出参数:用于接收当块被调用时的输入值,并可以把结果返回到调用块。 3、使用多重背景 声明方式如下: Supply1 : FB10; // Supply1为FB10的背景DB 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
投诉建议

提交

查看更多评论
其他资讯

查看更多

工业自动化设计高级参考

使用西门子的SCL语言编写ABB变频器的总线控制程序块

PLC的面向对象编程

简化监控软件的编程方法