




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、在S7300/400型PLC中使用高級語言編程S7-SCL是一種類似于Pasical、Deliphi的高級編程語言,其符合國際標準IEC 61131-3,也就是說支持該標準的任意廠家的PLC均可以使用與之相似的語言編程。這種語言適合于處理復雜的邏輯和大量的數學運算,由于其具有高級語言的編程結構,因此和S7的STL語句表編程方式比較起來有著更加方便的控制方式,可以這樣說,只要是必須使用語句表的地方,我們均可以考慮使用SCL,也許STL在執行時比SCL更加高效,但事實上也不一定,首先SCL可以編譯成STL,同時SCL設計時可以優化編程,而STL若運用不當,可能還會將低效率。當然在目前的這種系列的P
2、LC上,效率對于我們來說已是次要的,我們更關心的是編程結構。就像在PC機上,舍棄了匯編語言,而主要采用C/C+等高級語言。總體來說,SCL適合于編寫標準功能塊,由于在維護中,它和STL一樣,不象Lad一樣利于維護,因此這些標準功能塊都應該有文檔說明,以便用戶了解其功能。 下面的內容主要是參考西門子的S7-SCL文檔,對SCL進行了系統的介紹,最后給出了示例。 這里假設讀者是學過S7-300/400編程,并曾經學過至少一種計算機高級編程語言。 一、 軟件的使用1、 創建一個新的S7-SCL Source 文件 打開工程項目選擇CPU站選擇S7 Program選擇Sources在右邊窗口的空白處點
3、右鍵選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
4、Blocks。也可以把幾個Source文件一起進行編譯,其方法是創建一個S7-SCL compilation control file.在該文件中依次輸入需要編譯的SCL Source文件名,然后執行編譯即可。 二、語法規則1、編寫SCL Source文件的一般規則 FB, FC, OB, DB以及用戶定義的UDT,它們使用的任意數字號均可以在SCL Source中編輯。 每種塊類型都有它自己的結構。 每段落或者每個變量的聲明以符號”;”標志結束。 不區分大小寫。 注釋僅存在于程序文檔中,它不影響程序運行。 當一個功能塊被調用時,其背景數據塊被自動創建,因此它們不需要被編輯。 DB0有特定用途
5、,因此在程序中不能創建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 10 milliseconds顯示如下:DATE_AND_TIME#1995-10-20-12:20:30.10DT#1995-10-
6、20-12:20:30.10 STRINGe.g. 聲明VARText1 : String 123; /該字符串的最大容量為123個字符Text2 : String; /該字符串的默認容量為254個字符END_VAR 初始化:x : STRING7:=Address; /在使用STRING前,必須對它賦值。 FUNCTION Test : STRING45VAR_TEMPx : STRING45;END_VARx := a;x := concat (in1 := x, in2 := x);Test := x; /返回值END_FUNCTION 數組類型e.g.VARCONTROLLER1 :
7、/聲明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之間的任意整數。所有的基本數據類型均可用于數組。數組可以使用變量進行索引,例如:arrname_1 i := arrname_2 j ; STRUCT類型e.g. 聲明一個結構MOTOR中包含另一個結構DATA。對結構
8、聲明時,可以初始化元素,也可以在使用之前再初始化。VARMOTOR : STRUCTDATA : STRUCTLOADCURR : REAL ;VOLTAGE : INT := 5 ;END_STRUCT ;END_STRUCT ;END_VAR結構以WORD的形式結尾,否則系統自動把丟失的字節補到結構中去。 用戶定義類型UDT (使用關鍵字TYPE)TYPE /定義名字為MEASVALUES的數據類型MEASVALUES: STRUCTBIPOL_1 : INT := 5;BIPOL_2 : WORD := W#16#FFAA ;BIPOL_3 : BYTE := B#16#F1 ;BIPO
9、L_4 : WORD := W#16#1919 ;MEASURE : STRUCTBIPOLAR_10V : REAL ;UNIPOLAR_4_20MA :REAL ;END_STRUCT;END_STRUCT;END_TYPE/在FB10中使用該類型FUNCTION_BLOCK FB10VARMEAS_RANGE : MEASVALUES; /創建UDT數據END_VARBEGIN/ 使用UDT數據MEAS_RANGE.BIPOL_1 := -4 ;MEAS_RANGE.MEASURE.UNIPOLAR_4_20MA := 2.7 ;END_FUNCTION_BLOCK POINTER類型e
10、.g./定義功能塊FC100FUNCTION FC100 : 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_BLOCK FB100VAR /定義靜態變量,即離開塊后仍舊保存狀態的變量ii : INT;aa
11、 : ARRAY1.1000 OF REAL;END_VARBEGIN/ .FC100(N_out := ii, out := aa); /調用FC100,使用指針的方式傳遞整個數組/ .END_FUNCTION_BLOCK ANY類型e.g.VAR_INPUT /輸入型變量iANY : ANY; /定義為ANYEND_VARVAR_TEMPpANY : ANY; /定義為ANYEND_VARCASE ii OF /CASE分支語句1: pANY := MW4; / 將MW4的地址賦給pANY/ of MW43.5: /等于3,4,5的情況下pANY:= aINTii; / pANY cont
12、ains the address/ of the ii th/ element of the aINT field;100:pANY := iANY; / pANY contains the value/ of the iANY input variableELSEpANY := NIL; / pANY contains the value/ of the NIL pointerEND_CASE;SFCxxx(IN := pANY); 四、局部變量和參數的聲明1、變量 靜態變量:用于保持塊的數據,該數據存在背景數據塊中。臨時變量:僅在塊運行過程中存在。若多個變量的數據類型一致,可用如下方式:V
13、ALUE2, VALUE3,VALUE4,.: INT;聲明時可以初始化:VALUE :REAL := 20.25;數組的初始化有兩種方式:CONTROLLER1 : 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、塊參數 輸入參數: 用于接收當塊被調用時的輸入值,他們是只讀的。輸出參數: 傳輸當前值到這個調用塊,在被調用塊中應該對該參數賦值輸入/輸出參數:用于接收當塊被調用時的輸入值
14、,并可以把結果返回到調用塊。 3、使用多重背景 聲明方式如下:Supply1 : FB10; / Supply1為FB10的背景DBSupply2,Supply3,Supply4 : FB100; /為FB100聲明多個背景DBMotor1 : Motor ; / Motor為某個FB的符號名 4、 變量的聲明五、常量S7-SCL常量分位常量、數字常量、字符常量、時間常量,使用CONSTEND_CONST聲明。e.g.CONSTNumber := 10 ; /整數常量TIMEOFDAY1 := TIME#1D_1H_10M_22S_2MS ; /時間常量NAME := SIEMENS ; /字
15、符串常量NUMBER2 := 2 * 5 + 10 * 4 ; NUMBER3 := 3 + NUMBER2 ;END_CONST 1、 位常量 Bool#false 位的值為TRUE或者FALSE8#177777 8進制DW#16#0000_0000 16進制 2、 整數常量,它有多種表達方式 15 10進制值為152#1111 2進制值為1516#F 16進制值為15Value_2:=2#0101; / 2進制值為5Value_3:=8#17; / 10進制值為14Value_4:=16#F; / 16進制值為15Value_5:=INT#16#3f_ff / 16進制值,類型被定義 3、
16、 Real常量 NUM4:= -3.4 ;NUM5:= 4e2 ;NUM6:= real#1.5; 4、 字符常量(單個字符) Charac_1 := B;Charac_2 := char#43; Charac_3 := char#B; /字符BCHARACTER := $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 ;
17、 8、 Time-of-Day常量 TIMEOFDAY1:= TIME_OF_DAY#12:12:12.2 ;TIMEOFDAY2:= TOD#11:11:11 ; 9、Date and Time常量 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 :=I
18、WCOUNTER; /若COUNTER=5,則MEASVAL_1的值為IW5OUTLABEL :=IBYTENO, BITNO; / 若BYTENO=3,BITNO=1,則OUTLABEL=I3.1注:當獲取的數據類型是BYTE, WORD or DWORD,時,使用一個索引參數,當獲取的數據類型為BOOL時,必須使用兩個索引參數,分別指定字節號和位號。3、對數據塊的操作STATUSBYTE :=DB101.DB10; /字節操作STATUS_2:= DB12.DXWNO, BITNO; /位操作,支持索引STATUSBYTE :=Status_data.DWCOUNTER; /字操作,支持索
19、引MEASVAL :=Measdata.DW20;STATUS_1 :=WORD_TO_BLOCK_DB(INDEX).DW10;注:和Lad及STL語言比較起來,SCL在對數據塊中的字、字節等操作時,少一個”B”字符。七、表達式、操作符和地址1、操作符預覽八、控制流程1、IF選擇語句IF condition THENELSIF condition THEN / ELSIF語句可以不使用,或者使用一個或者多個ELSE / ELSE語句可以不使用END_IF ;e.g.IF ARRAYINDEX = INDEX THENCONTINUE ;END_IF ;2、CASE選擇語句CASE intVa
20、riant OF1 : DISPLAY:= OVEN_TEMP;2 : DISPLAY:= MOTOR_SPEED;3.10: DISPLAY:= INT_TO_DINT (TW); /可以指定連續的值QW4:= 16#0004;11,13,19: DISPLAY:= 99; /也可以把一系列值列出來QW4:= 16#0005;ELSE: / ELSE:可以省略DISPLAY:= 0;TW_ERROR:= 1;END_CASE ; 3、FOR循環語句FUNCTION_BLOCK FOR_EXAVARINDEX: INT ;IDWORD: ARRAY 1.50 OF STRING;END_VAR
21、BEGINFOR INDEX := 1 TO 50 BY 2 DO /從1到50,增量為2IF IDWORD INDEX = KEY THENEXIT; /退出循環END_IF;END_FOR;END_FUNCTION_BLOCK注:一些關鍵字EXIT 退出其所在的循環。CONTINUE 終止當前循環的執行,控制程序進入下一循環。RETURN 退出當前正在被執行的塊。4、WHILE循環WHILE INDEX = 50 AND IDWORDINDEX KEY DO /兩個條件均滿足才執行循環INDEX := INDEX + 2;END_WHILE ; 5、REPEAT循環REPEATINDEX
22、:= INDEX + 2 ; /該語句與WHILE的區別是UNTIL之前的語句總是先執行一次UNTIL INDEX 50 OR IDWORDINDEX = KEY /這兩條件之一若滿足,則退出循環END_REPEAT ; 6、GOTO跳轉語句IF A B THENGOTO LAB1 ; /若條件滿足,則跳到LAB1處ELSIF A C THENGOTO LAB2 ;END_IF ;/ . . .LAB1: INDEX := 1 ;GOTO LAB3 ;LAB2: INDEX := 2 ;7、調用塊絕對地址調用,例如:FB10.DB20(X1:=5,X2:=78,.); /參數可以任意排列FC3
23、1 (X1:=5, Q1:=Checksum) ;符號地址調用,例如:DRIVE.ON (X1:=5,X2:=78,.);DISTANCE (X1:=5, Q1=:Checksum) ;每一個功能塊有一個輸入隱藏參數EN,和一個輸出隱藏參數ENO,這兩個參數是系統設定的,均為BOOL型,不需要聲明,但在編程中可以使用,例如:/若MY_ENABLE為FALSE,則FC85不會被執行,只有為TRUE,才會執行Result := FC85(EN:= MY_ENABLE, PAR_1:= 27); FB30.DB30 (Parameter supply);IF ENO THEN /若FB30的調用沒有
24、問題,則/ . . .ELSE/ . . .END_IF; 九、定時器和計數器1、計數器S_CU 增計數器S_CD 減計數器S_CUD 增/減計數器e.g.S_CUD (C_N=C12, /絕對調用定時器,指定計數器號CD:=I0.0,CU:=I0.1,S:=I0.2 & I0.3, /置位條件PV:=120, /設定計數器值R:=FALSE, /復位條件CV:=binVal, /輸出參數,二進制計數值Q:=actFlag); /輸出參數,計數器的狀態FUNCTION_BLOCK COUNTVAR_INPUTCount: ARRAY 1.4 of STRUCTC_N INT;PV : WORD
25、;END_STRUCT;END_VARFOR I:= 1 TO 4 DO /動態調用計數器S_CD(C_N=CountI.C_NO, S:=true, PV:= CountI.PV);END_FOR;FUNCTION_BLOCK COUNTERVAR_INPUTMYCounter:COUNTER;END_VARCurrVal:=S_CD(C_N=MyCounter,.); /動態調用計數器 2、定時器定時器有5種,依次為:S_PULSE S_PEXT S_ODT S_ODTS S_OFFDT VARCurrTime : S5time;BiVal : word;ActFlag : bool;EN
26、D_VAR/在調用定時器時,部分參數可以省略,但左邊的賦值變量一定不能省略。CurrTime:=S_ODT(T_N=T10, /絕對調用,制定定時器號S:=TRUE, /置位條件TV:=T#1s, /設定定時器值R:=FALSE, /復位條件BI:=biVal,Q:=actFlag);FUNCTION_BLOCK TIMEVAR_INPUTMY_TIMER: ARRAY 1.4 of STRUCTT_N INT;TV : WORD;END_STRUCT;END_VARFOR I:= 1 TO 4 DOCurrTime:= S_ODT(T_N=MY_TIMERI.T_NO, S:=true,MY
27、_TIMERI.TV);END_FOR; FUNCTION_BLOCK TIMERVAR_INPUTmytimer:TIMER;END_VARCurrTime:=S_ODT(T_N=mytimer,.); 十、S7-SCL中的標準功能1、數據類型轉換函數隱式轉換,其依照的順序為:BOOL BYTE WORD DWORDINT DINT REAL e.g.VARPID_CTRLLER_1 : BYTE ;PID_CTRLLER_2 : WORD ;END_VARIF (PID_CTRLLER_1 PID_CTRLLER_2) THEN . /此時PID_CTRLLER_1被轉換成WORD當然,也
28、可以使用以下功能顯示的轉換: BOOL_TO_BYTE 、 BOOL_TO_DWORD 、BOOL_TO_WORD 、BYTE_TO_DWORD 、BYTE_TO_WORD 、 CHAR_TO_STRING 、DINT_TO_REAL 、INT_TO_DINT 、INT_TO_REAL、WORD_TO_DWORD BYTE_TO_BOOL :Copies the least significant bitDINT_TO_TOD :Copies the bit string YDINT_TO_BOOL :DWORD_TO_BOOL(DINT_TO_DWORD(x) YDINT_TO_BYTE :
29、DWORD_TO_BYTE(DINT_TO_DWORD(x) YDINT_TO_STRING :DI_STRNG YDINT_TO_BCD(x)DINT_TO_BCD_DWORD(x)2、ROUND和TRUNCROUND():將REAL數四舍五入取整返回DINTTRUNC():舍棄REAL數的小數部分取整返回DINT 3、一般數學函數例子:RESULT := ABS (-5) ; /5RESULT := SQRT (81.0); /9RESULT := SQR (23); /529RESULT := EXP (4.1); /60.340 .RESULT := EXPD (3); /1_000P
30、I := 3. 141 592 ;RESULT := SIN (PI / 6) ; /0.56、移位函數ROL、ROR、SHL、SHR例子:RESULT := ROL (IN:=BYTE#2#1101_0011, N:=5); /2#0111_1010 ,左移5位 ,移出的填充到右邊空位RESULT := ROR (IN:=BYTE#2#1101_0011, N:=2); /2#1111_0100 ,右移2位 ,移出的填充到左邊空位RESULT := SHL (IN:=BYTE#2#1101_0011, N:=3); /2#1001_1000 ,左移3位,空余部分用0填充RESULT := S
31、HR (IN:=BYTE#2#1101_0011, N:=2); /2#0011_0100 ,右移2位,空余部分用0填充 7、字符串函數由于PLC編程中字符、字符串的使用比較少,這里不詳敘,感興趣的可以參考西門子文檔中的 14.4 Functions for Processing Strings (P293-P303) 8、 選值函數最大值函數/用于獲取這些參數中的最大值,參數最多可以有32個,其參數類型除了S5TIME以外,任意其他數/子類型均可以,但所有的參數數據類型必須一致。A:=MAX(IN1:=a, IN2:=b, IN3:=c, IN4:=d.);最小值函數/用于獲取這些參數中的最
32、小值,參數最多可以有32個,其參數類型除了S5TIME以外,任意其他數/子類型均可以,但所有的參數數據類型必須一致。A:=MIN(IN1:=a, IN1:=b, IN1:=c, IN1:=d);極限值函數A:=LIMIT(MN:=5, IN:= Execution steps, MX:= 10);MUX函數A:=MUX(K:=SELECT, IN0:= Steps, IN1:=Number, IN2:=Total);9、系統功能/功能塊、標準庫SCL像其他語言一樣,可以調用各種功能塊,包括系統功能、功能塊SFC/SFB 十一、示例 (均在PLC-SIM上測試通過)1、編寫位偏移程序傳遞M變量的
33、起始字節和位、偏移量,然后根據偏移量,算出當前M變量的字節和地址。例如針對M5.4,若給定偏移量1,則當前還是M5.4,若給定2,則為M5.5,依次類推,若給定偏移量6,則為M6.1/根據偏移量來設定字節和位FUNCTION FC200: voidVAR_INPUT /輸入變量byteNINT; /指定M起始字節號bitNINT; /指定起始位號bitNum:INT; /指定位數END_VARVAR_OUTPUT /輸出變量currBit:INT; /當前位currByte:INT; /當前字節END_VARVAR_TEMPtmp:INT;END_VARBEGINtmp:=(bitNo+bit
34、Num-1)DIV 8;currByte:=byteNo+tmp;currBit:=bitNo+bitNum-(8*tmp+1);END_FUNCTION2、功能選擇程序 假設某個機床有若干過手動功能,使用兩個按鈕”+”和”-“,按一次”+”,功能號加一,然后相應的功能選擇指示燈被點亮,譬如,當前功能3被選中,與之對應的指示燈亮,這時按一次按鈕”+”,則功能4被選中,與之對應的指示燈亮,而與功能3對應的指示燈滅,同時,當功能號到達最大值時,若再按一次按鈕”+”,則功能號轉到1,重新開始循環,按鈕”-“與”+”正好相反,用于控制功能號遞減。同時要求,當按住某個按鈕超過1s時,則功能號每過200m
35、s鐘加一或者減一。/主要控制功能FC10/FUNCTION FC10: VOIDVAR_INPUT /輸入變量fnAdd:BOOL; /接收+按鈕fnSub:BOOL; /接收-按鈕 byteNINT; /指定M起始字節號,這些M位與相應得某個功能對應。bitNINT; /指定起始位號bitNum:INT; /指定總的位數END_VARVAR /靜態變量pus1:BOOL; /記錄按鈕+的脈沖pus2:BOOL; /記錄按鈕-的脈沖button:BOOL; /確定按鈕+或者按鈕-被按下currNINT; /記錄當前的功能號 currBit:INT; /當前位currByte:INT; /當前字節/定時器輸出p1:BOOL;p2:BOOL;p11:BOOL; /記錄按鈕+的時鐘p111:BOOL;p22:BOOL; /記錄按鈕-的時鐘
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 軌道交通線網云平臺系統用戶需求書-中心部分網絡安全專用技術要求
- 特許經營項目合同協議
- 瑜伽館教練用工合同協議
- 畜肉類供貨合同協議
- 電鏟大修合同協議書模板
- 生產經營合作合同協議
- 電子售合同協議
- 電商員工勞務合同協議
- 獨棟商業整租合同協議
- 白芍買賣合同協議書范本
- 行政事業單位內部控制制度之合同管理制度
- 大學生心理健康與發展學習通超星期末考試答案章節答案2024年
- 《平行四邊形》全章復習教學設計
- (新版)高級考評員職業技能鑒定考試題庫(含答案)
- 2025年高考語文第一輪復習:高考文言文閱讀挖空練習高考語文文言文備考總復習(全國)
- 2024秋期國家開放大學《公共政策概論》一平臺在線形考(形考任務1至4)試題及答案
- 藥劑科考試試題
- 2024年中國醫養及康復醫療產業發展研究報告
- 扎實推動科技創新和產業創新深度融合
- 聲紋鑒定知識考核試題
- 養殖業勞動合同樣本
評論
0/150
提交評論