您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 软件工程 > 在S7300400型PLC中使用高级语言编程
在S7300/400型PLC中使用高级语言编程S7-SCL是一种类似于Pasical、Deliphi的高级编程语言,其符合国际标准IEC61131-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-SCLSource文件打开工程项目à选择CPU站à选择S7Programà选择Sources在右边窗口的空白处点右键选InsertNewObjectà点击SCLSource双击创建的SCLSource文件,进入SCL编辑界面。2、块保护在SCLSource文件的开头添加关键字:KNOW_HOW_PROTECT,当打开由其创建的块时,只能显示参数,而看不到内容。3、主菜单”Insert”下的”BlockTemplate”可用于插入如OB,FB等各种块的结构。”ControlStructure”菜单可插入各种流程控制结构,这些都可以简化编程。4、在运行程序之前,首先必须对它进行编译,可以编译整个Source文件或者某个被选择的块,通过选择菜单FileCompileSelectedBlocks。也可以把几个Source文件一起进行编译,其方法是创建一个S7-SCLcompilationcontrolfile.在该文件中依次输入需要编译的SCLSource文件名,然后执行编译即可。二、语法规则1、编写SCLSource文件的一般规则●FB,FC,OB,DB以及用户定义的UDT,它们使用的任意数字号均可以在SCLSource中编辑。●每种块类型都有它自己的结构。●每段落或者每个变量的声明以符号”;”标志结束。●不区分大小写。●注释仅存在于程序文档中,它不影响程序运行。●当一个功能块被调用时,其背景数据块被自动创建,因此它们不需要被编辑。●DB0有特定用途,因此在程序中不能创建DB0.2、编写块的先后次序●被调用的块必须位于调用块之前。●UDT的定义必须位于其被使用的位置之前。●共享数据块必须位于那些使用它的所有块之前。三、数据类型1、数据类型预览Ⅰ、基本数据类型2、补充1、DATE_AND_TIMEDataType其值的范围:DT#1990-01-01-0:0:0.0---------DT#2089-12-31-23:59:59.999该类型以BCD码形式存储。例如20/Oct./199512:20:30and10milliseconds显示如下:DATE_AND_TIME#1995-10-20-12:20:30.10DT#1995-10-20-12:20:30.102STRINGe.g.声明VARText1:String[123];//该字符串的最大容量为123个字符Text2:String;//该字符串的默认容量为254个字符END_VAR初始化:x:STRING[7]:='Address';//在使用STRING前,必须对它赋值。FUNCTIONTest:STRING[45]VAR_TEMPx:STRING[45];END_VARx:='a';x:=concat(in1:=x,in2:=x);Test:=x;//返回值END_FUNCTION3数组类型e.g.VARCONTROLLER1://声明3行、4列的二位整数数组,并对其初始化ARRAY[1..3,1..4]OFINT:=-54,736,-83,77,-1289,10362,385,2,60,-37,-7,103;CONTROLLER2:ARRAY[1..10]OFREAL;//声明10个数的一维实数数组END_VAR注:数组的最大维数为6维,数组的索引范围为-32768---32767之间的任意整数。所有的基本数据类型均可用于数组。数组可以使用变量进行索引,例如:arrname_1[i]:=arrname_2[j];4STRUCT类型e.g.声明一个结构MOTOR中包含另一个结构DATA。对结构声明时,可以初始化元素,也可以在使用之前再初始化。VARMOTOR:STRUCTDATA:STRUCTLOADCURR:REAL;VOLTAGE:INT:=5;END_STRUCT;END_STRUCT;END_VAR结构以WORD的形式结尾,否则系统自动把丢失的字节补到结构中去。5用户定义类型UDT(使用关键字TYPE)TYPE//定义名字为MEASVALUES的数据类型MEASVALUES:STRUCTBIPOL_1:INT:=5;BIPOL_2:WORD:=W#16#FFAA;BIPOL_3:BYTE:=B#16#F1;BIPOL_4:WORD:=W#16#1919;MEASURE:STRUCTBIPOLAR_10V:REAL;UNIPOLAR_4_20MA:REAL;END_STRUCT;END_STRUCT;END_TYPE//在FB10中使用该类型FUNCTION_BLOCKFB10VARMEAS_RANGE:MEASVALUES;//创建UDT数据END_VARBEGIN//使用UDT数据MEAS_RANGE.BIPOL_1:=-4;MEAS_RANGE.MEASURE.UNIPOLAR_4_20MA:=2.7;END_FUNCTION_BLOCK6POINTER类型e.g.//定义功能块FC100FUNCTIONFC100:VOID//VOID表明该功能不返回值VAR_IN_OUT//定义FC100的输入输出型参数N_out:INT;out:POINTER;//定义POINTER型数据类型,参数均为临时变量END_VARVAR_TEMP//定义临时变量ret:INT;END_VARBEGIN//进入函数主体//...ret:=SFC79(N:=N_out,SA:=out);END_FUNCTION//定义功能块FB100FUNCTION_BLOCKFB100VAR//定义静态变量,即离开块后仍旧保存状态的变量ii:INT;aa:ARRAY[1..1000]OFREAL;END_VARBEGIN//...FC100(N_out:=ii,out:=aa);//调用FC100,使用指针的方式传递整个数组//...END_FUNCTION_BLOCK7ANY类型e.g.VAR_INPUT//输入型变量iANY:ANY;//定义为ANYEND_VARVAR_TEMPpANY:ANY;//定义为ANYEND_VARCASEiiOF//CASE分支语句1:pANY:=MW4;//将MW4的地址赋给pANY//ofMW43..5://等于3,4,5的情况下pANY:=aINT[ii];//pANYcontainstheaddress//oftheiith//elementoftheaINTfield;100:pANY:=iANY;//pANYcontainsthevalue//oftheiANYinputvariableELSEpANY:=NIL;//pANYcontainsthevalue//oftheNILpointerEND_CASE;SFCxxx(IN:=pANY);四、局部变量和参数的声明1、变量静态变量:用于保持块的数据,该数据存在背景数据块中。临时变量:仅在块运行过程中存在。若多个变量的数据类型一致,可用如下方式:VALUE2,VALUE3,VALUE4,....:INT;声明时可以初始化:VALUE:REAL:=20.25;数组的初始化有两种方式:CONTROLLER1:ARRAY[1..2,1..2]OFINT:=-54,736,-83,77;当把相邻的数组元素赋相同的值时,例如,把A3[2]到A3[11]的值设为100.0:A3:ARRAY[1..12]OFREAL:=0.0,10(100.0),1.0;2、块参数输入参数:用于接收当块被调用时的输入值,他们是只读的。输出参数:传输当前值到这个调用块,在被调用块中应该对该参数赋值输入/输出参数:用于接收当块被调用时的输入值,并可以把结果返回到调用块。3、使用多重背景声明方式如下:Supply1:FB10;//Supply1为FB10的背景DBSupply2,Supply3,Supply4:FB100;//为FB100声明多个背景DBMotor1:Motor;//Motor为某个FB的符号名4、变量的声明五、常量S7-SCL常量分位常量、数字常量、字符常量、时间常量,使用CONST…END_CONST声明。e.g.CONSTNumber:=10;//整数常量TIMEOFDAY1:=TIME#1D_1H_10M_22S_2MS;//时间常量NAME:='SIEMENS';//字符串常量NUMBER2:=2*5+10*4;NUMBER3:=3+NUMBER2;END_CONST1、位常量Bool#false位的值为TRUE或者FALSE8#1777778进制DW#16#0000_000016进制2、整数常量,它有多种表达方式1510进制值为152#11112进制值为1516#F16进制值为15Value_2:=2#0101;//2进制值为5Value_3:=8#17;//10进制值为14Value_4:=16#F;//16进制值为15Value_5:=INT#16#3f_ff//16进制值,类型被定义3、Real常量NUM4:=-3.4;NUM5:=4e2;NUM6:=real#1.5;4、字符常量(单个字符)Charac_1:='B';Charac_2:=char#43;Charac_3:=char#'B';//字符’B’CHARACTER:='$41';//字符'A'5、字符串常量NAME:='SIEMENS';6、日期常量TIMEVARIABLE1:=DATE#1995-11-11;TIMEVARIABLE2:=D#1995-05-05;7、时间常量Interval1:=TIME#10.5S;Interval2:=T#3D_2S_3MS;8、Time-of-Day常量TIMEOFDAY1:=TIME_OF_DAY#12:12:12.2;TIMEOFDAY2:=TOD#11:11:11;9、DateandTime常量TIMEOFDAY1:=DATE_AND_TIME#1995-01-01-12:12:12.2;TIMEOFDAY2:=DT#1995-02-02-11:11:11;六、CPU的内存区域1、可以直接操作字节、字、位STATUSBYTE:=IB10;STATUS_3:=I1.1;MEASVAL:=IW20;2、可以通过索引对位、字、字节操作,该索引可以是变量MEASVAL_1:=IW[COUNTER];//若COUNTER=5,则MEASVAL_1的值为IW5OUTLABEL:=I[BYTENO,BITNO];//若BYTENO=3,BITNO=1,则OUTLABEL=I3.1注:当获取的数据类型是BYTE,WORDorDWORD,时,使用一个索引参数,当获取的数据类型为BOOL时,必须使用两个索引参数
本文标题:在S7300400型PLC中使用高级语言编程
链接地址:https://www.777doc.com/doc-7037570 .html