西門子S7-1200PLC編程及應(yīng)用教程 課件 第6章 S7-1200 PLC的SCL編程基本概念_第1頁
西門子S7-1200PLC編程及應(yīng)用教程 課件 第6章 S7-1200 PLC的SCL編程基本概念_第2頁
西門子S7-1200PLC編程及應(yīng)用教程 課件 第6章 S7-1200 PLC的SCL編程基本概念_第3頁
西門子S7-1200PLC編程及應(yīng)用教程 課件 第6章 S7-1200 PLC的SCL編程基本概念_第4頁
西門子S7-1200PLC編程及應(yīng)用教程 課件 第6章 S7-1200 PLC的SCL編程基本概念_第5頁
已閱讀5頁,還剩96頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第六章

S7-1200PLC的SCL編程基本概念第六章S7-1200PLC的SCL編程基本概念

SCL語言1

簡單程序代碼示例2

表達式3

語句4-2-

數(shù)組5

指針6

程序塊的調(diào)用(SCL)7實操案例14多液體混合裝置控制86.1SCL語言SCL是StructuredControlLanguage的簡稱,即結(jié)構(gòu)化控制語言,是西門子為其S7-1200可編程邏輯控制器(PLC)系列提供的一種高級編程語言,由PASCAL語言演變而來。SCL語言不僅包含傳統(tǒng)PLC的元素,如輸入、輸出、定時器等,還包含高級編程語言的特性,如表達式、賦值運算、運算符、循環(huán)、選擇、分支、數(shù)組和高級函數(shù)等。IEC61131-3標準定義了五種PLC編程語言:1、梯形圖LD(LadderDiagram):形象化編程語言,以圖形符號方式表示電氣控制功能,類似于電氣繼電器圖。梯形圖中主要包括軟繼電器、能流、母線、邏輯解算等要素。6.1SCL語言2、功能塊圖FBD(FunctionBlockDiagram):圖形化編程語言,使用類似數(shù)字邏輯門電路的功能塊來表示輸入和輸出之間的邏輯。3、結(jié)構(gòu)化文本ST(StruturedText):文本形式編程語言,采用類似于Pascal或C語言的描述方式來描述各變量的運算關(guān)系,西門子也將其稱為SCL,適用于編寫復(fù)雜的控制邏輯和數(shù)據(jù)處理任務(wù)。4、指令表IL(InstructionList):文本形式編程語言,類似于匯編語言,是PLC最基礎(chǔ)的語言,指令表與梯形圖一一對應(yīng)。5、順序功能圖(SFC):圖形化編程語言,用于順序化操作控制場景的程序設(shè)計,SFC主要由狀態(tài)步、有向連線、轉(zhuǎn)換、轉(zhuǎn)換條件、動作等五部分組成。6.1SCL語言1、SCL語言的特點(1)SCL采用文本形式,符合IEC61131-3的國際編程標準,類似于傳統(tǒng)的高級編程語言如C或Pascal。(2)支持復(fù)雜的控制結(jié)構(gòu),如循環(huán)(for,while)、條件判斷(if/else)和嵌套控制。(3)可以高效處理大量數(shù)據(jù)和復(fù)雜的數(shù)據(jù)類型,如數(shù)組、結(jié)構(gòu)體等。(4)SCL支持結(jié)構(gòu)化編程,允許工程師定義函數(shù)、過程和模塊,促進代碼復(fù)用和模塊化,簡化復(fù)雜程序的開發(fā)和維護。6.1SCL語言2、SCL語言的優(yōu)勢(1)SCL可以方便地處理數(shù)組、結(jié)構(gòu)體和其他復(fù)雜數(shù)據(jù)類型,這對于需要進行大量數(shù)據(jù)計算和處理的任務(wù)更加得心應(yīng)手。(2)SCL的結(jié)構(gòu)化和模塊化特點使得代碼易于閱讀和維護。隨著工業(yè)自動化的需求變得日益復(fù)雜,SCL的使用率也在逐漸增長。3、SCL指令的規(guī)范(1)在SCL中所有的指令都須在英文狀態(tài)下輸入英文字符;6.1SCL語言(2)語句之間須用英文分號“;”進行分隔,在塊結(jié)束時,也需使用分號;(3)指令可跨行;(4)每一條ENDIF后面需要加英文分號表示指令的結(jié)束;(5)SCL的變量需先在變量表中定義,然后將變量放在雙引號內(nèi);(6)關(guān)鍵字一般全大寫,代表特定的語法結(jié)構(gòu);(7)單行注釋使用//。注釋段可以跨多行,注釋段以“(*”開始,以“*)”結(jié)束。(8)變量名可以包含字母、數(shù)字、空格以及下劃線,但是不能使用系統(tǒng)關(guān)鍵字。6.2簡單程序代碼示例啟動按鈕斷開時6.2簡單程序代碼示例啟動按鈕接通時6.3表達式表達式由運算符和操作符組成,用來計算值或表示某種關(guān)系的公式。通過運算符可以將不同的表達式連接在一起。操作數(shù)是使用運算符運算的對象,包括常量、變量或表達式。算術(shù)表達式在SCL中用于執(zhí)行基本的數(shù)學運算。算術(shù)運算符可以處理當前CPU所支持的各種數(shù)據(jù)類型。兩個或多個不同數(shù)據(jù)類型的數(shù)據(jù)使用算術(shù)運算符進行運算,運算結(jié)果取決于最長數(shù)據(jù)位的數(shù)據(jù)類型。例如:2個長度不同的有符號的整數(shù),即INT和DINT做加法運算會產(chǎn)生DINT結(jié)果值。6.3表達式關(guān)系表達式對兩個操作數(shù)的值進行比較,當滿足比較條件時,比較結(jié)果為1(TRUE),否則比較結(jié)果為0(FALSE)。關(guān)系表達式中可使用的數(shù)據(jù)類型包括整數(shù)或浮點數(shù)、位字符串、字符串、TIME、日期和時間等。具體常用的關(guān)系運算符見表6-1所示

運算符含義=等于<>不等于<小于>大于<=小于等于>=大于等于6.3表達式邏輯表達式用于處理布爾值和實現(xiàn)邏輯運算。常用的邏輯運算符包括:AND:與運算。僅當兩個操作數(shù)都為真時結(jié)果為真。OR:或運算。當任意一個操作數(shù)為真時結(jié)果為真。NOT:非運算。將布爾值取反時結(jié)果為真。XOR:異或運算。當且僅當兩個操作數(shù)中有一個為真結(jié)果為真。

這些邏輯運算符常見于PLC控制程序中的條件判斷和控制流程中。通常,邏輯表達式在IF語句、CASE語句、WHILE循環(huán)等結(jié)構(gòu)中使用,以確定執(zhí)行哪部分代碼或控制流程6.3表達式運算符的優(yōu)先級:與高級語言的運算類似,SCL中的運算符也有不同的優(yōu)先級。優(yōu)先級數(shù)字越小,參與運算的優(yōu)先級越高。算術(shù)運算符的優(yōu)先級見表6-2所示。6.3表達式6.4語句SCL的語句是指在西門子TIAPortal編程環(huán)境中,用于實現(xiàn)各種控制邏輯和功能的編程指令。SCL的語句類似于高級編程語言中的語句,具有結(jié)構(gòu)化和模塊化的特點。SCL語句包括IF-THEN、CASE-OF、FOR-TO-DO、WHILE-DO、REPEAT-UNTIL、CONTINUE、EXIT和RETURN等多種類型。1、賦值語句賦值語句是SCL中最常見的指令,其作用是將一個表達式或者變量的值通過賦值運算符分配給賦值運算符左邊的另外一個變量或結(jié)構(gòu)體等數(shù)據(jù)類型。賦值運算符的格式是一個冒號加等號,均是在英文狀態(tài)下的符號。賦值表達式輸入完后再加上分號就構(gòu)成了賦值語句。6.4語句(1)單賦值運算:將一個表達式或變量或常量賦值給單個變量,如:"Tag_1":=1;//將數(shù)值1賦值給變量Tag_1"Tag_2":="Tag_3";//將變量Tag_3的值賦給變量Tag_2"Tag_4":="Tag_5"/123;//將變量Tag_5的值除以123后賦給Tag_4(2)多賦值運算:執(zhí)行多賦值運算時,一個指令中可執(zhí)行多個賦值運算,如:"Tag_1":="Tag_2":="Tag_3"=66;//此時Tag_1、Tag_2、Tag_3都被賦值為66,實現(xiàn)了多個變量同時被賦值(3)組合賦值運算:執(zhí)行組合賦值運算時,可在賦值運算中組合使用操作符“+”、“-”、“*”和“/”。"Tag_1"+="Tag_2";//執(zhí)行"Tag_1":="Tag_1"+"Tag_2";也可多次組合賦值運算。示例:"Tag_1"+="Tag_2"+="Tag_3"/="Tag_4";//此時,將按以下順序執(zhí)行賦值運算://先執(zhí)行"Tag_3":="Tag_3"/"Tag_4";//接著執(zhí)行"Tag_2":="Tag_2"+"Tag_3";//最后執(zhí)行"Tag_1":="Tag_1"+"Tag_2";6.4語句(4)結(jié)構(gòu)體的賦值運算:如果結(jié)構(gòu)體相同而且結(jié)構(gòu)體中成員的數(shù)據(jù)類型和名稱也相同,則可以將整個結(jié)構(gòu)體分配給另一個結(jié)構(gòu)體?;蛘甙岩粋€變量或常數(shù)賦值給結(jié)構(gòu)體中的變量。"數(shù)據(jù)塊_1".Static_1:="數(shù)據(jù)塊_1".Static_2;//把整個結(jié)構(gòu)體Static_1賦值給另外一整個結(jié)構(gòu)體Static_2"數(shù)據(jù)塊_1".Static_1.長度:="數(shù)據(jù)塊_1".Static_2.長度:="Tag_1";(*把變量Tag_1賦值給結(jié)構(gòu)體Static_1中的長度變量和結(jié)構(gòu)體Static_2中的長度變量*)"數(shù)據(jù)塊_1".Static_1.寬度:=1;(*把常數(shù)1賦值給結(jié)構(gòu)體中Static_1的寬度變量*)6.4語句(5)數(shù)組的賦值運算"數(shù)據(jù)塊_1".數(shù)組A[2,2]:="數(shù)據(jù)塊_1".數(shù)組A[2,4]:=99;//把一個常數(shù)賦值給兩個二維數(shù)組變量"數(shù)據(jù)塊_1".數(shù)組A[2,2]:="數(shù)據(jù)塊_1".數(shù)組A[2,4]:="Tag_3";//把一個變量賦值給兩個二維數(shù)組變量"數(shù)據(jù)塊_1".數(shù)組A[1,5]:=55;//把常數(shù)賦值給一個數(shù)組變量6.4語句6.4語句條件語句(IF)(1)IF分支語句語句格式為:IF<條件1>THEN<指令1>;END_IF;如果滿足條件1,則將執(zhí)行THEN后的指令1。如果不滿足條件1,則跳到END_IF后的下一條指令開始繼續(xù)執(zhí)行。這種結(jié)構(gòu)下,有可能執(zhí)行指令1,也可能什么都不執(zhí)行。(2)IF和ELSE分支語句格式為:IF<條件1>THEN<指令1>ELSE<指令2>END_IF;如果滿足條件1,則執(zhí)行THEN后的指令1。如果不滿足條件1,則執(zhí)行ELSE后的指令2。任何時候只選擇指令1和指令2中的其中一條指令執(zhí)行。6.4語句(3)IF、ELSEIF和ELSE分支語句格式為:IF<條件1>THEN<指令1>ELSIF

<條件2>THEN<指令2>ELSE<指令3>END_IF;6.4語句如果滿足條件1,則執(zhí)行THEN后的指令1。執(zhí)行完指令1后,程序?qū)腅ND_IF后繼續(xù)執(zhí)行。如果不滿足條件1,則判斷條件2是否成立。如果條件2成立,則執(zhí)行THEN后的指令2。執(zhí)行完指令2后,程序?qū)腅ND_IF后繼續(xù)執(zhí)行。如果條件1和條件2都不滿足,則執(zhí)行ELSE后的指令3,再執(zhí)行END_IF后的程序部分。每次運行時只會選擇<指令1><指令2><指令3>中的其中一個執(zhí)行。6.4語句選擇語句(CASE)CASE語句的具體格式如下:CASE<表達式或變量>OF<常量1>:<指令1>;<常量2>:<指令2>;……<常量n>:<指令n>;ELSE<指令n+1>END_CASE;6.4語句如果表達式或變量的值等于常量1,則執(zhí)行<指令1>,然后直接跳轉(zhuǎn)到END_CASE處,該語句結(jié)構(gòu)執(zhí)行結(jié)束,繼續(xù)往下執(zhí)行。如果等于常量2,則執(zhí)行<指令2>,跳轉(zhuǎn)到END_CASE處繼續(xù)往下執(zhí)行;以此類推,如果等于常量n,則執(zhí)行<指令n>,然后跳轉(zhuǎn)到END_CASE處繼續(xù)往下執(zhí)行。如果都不等于ELSE前的任何一個常量,則執(zhí)行ELSE后的<指令n+1>。ELSE是一個可選的語法部分,可以省略。如果有ELSE,那么在列出的所有n+1個指令中,必有且僅有一個指令被執(zhí)行。如果沒有ELSE,當ELSE前面列出的n個常量全部都不滿足的時候,將直接跳轉(zhuǎn)到END_CASE結(jié)束該語句,也就是沒有執(zhí)行任何<指令>。6.4語句循環(huán)語句(1)FOR循環(huán)在SCL中,F(xiàn)OR循環(huán)是一種常用的循環(huán)結(jié)構(gòu),用于迭代執(zhí)行代碼塊。FOR循環(huán)參數(shù)見表6-3所示,F(xiàn)OR循環(huán)語句結(jié)構(gòu)如下:表6-3FOR循環(huán)參數(shù)說明參數(shù)說明循環(huán)變量必需。整型(Int或Dint),用作循環(huán)計數(shù)器初始值必需。指定控制變量初始值的簡單表達式終值必需。確定控制變量最終值的簡單表達式步值可選。每次循環(huán)后<循環(huán)變量>的變化量。布值與循環(huán)變量具有相同的數(shù)據(jù)類型。如果未指定步值,則每次循環(huán)之后,運行變量的值加1。不能在執(zhí)行FOR語句期間更改步值。6.4語句FOR<循環(huán)變量>:=<初始值>TO<終值>BY<步值>DO<代碼塊>END_FOR;FOR循環(huán)的工作原理如下:①初始化循環(huán)變量為指定的初始值,這兩個值的數(shù)據(jù)類型必須與控制變量的相同。②檢查循環(huán)變量是否小于等于終值。如果是,則繼續(xù)執(zhí)行循環(huán)體;如果不是,則跳出循環(huán)執(zhí)行END_FOR后面的指令。③執(zhí)行循環(huán)體內(nèi)的代碼。④循環(huán)變量按指定的步長遞增,然后返回步驟2。6.4語句【例6-1】使用FOR循環(huán)計算從1到50的所有整數(shù)的總和。圖6-3【例6-1】代碼與監(jiān)控6.4語句如圖6-3所示,Sum_1變量的初值為0,第一次循環(huán)時循環(huán)變量Number_1的值為1,執(zhí)行代碼將Sum_1的值由0變?yōu)?,關(guān)鍵字BY給出步數(shù)為1。第2次循環(huán)時循環(huán)變量Number_1按步數(shù)加1,Number_1變?yōu)?,執(zhí)行循環(huán)代碼1+2將3賦給Sum_1,第三次循環(huán)時Number_1按步數(shù)加1變?yōu)?,執(zhí)行循環(huán)代碼3+3賦給Sum_1。如此循環(huán),直至Number_1的值變?yōu)?0,此時依然滿足循環(huán)條件,因此執(zhí)行代碼將50加上之前的求和總量,接下來Number_1的值變?yōu)?1,超出了循環(huán)終值51,因此循環(huán)結(jié)束,求FOR循環(huán)求得和值為1275。6.4語句(2)WHILE循環(huán)使用“滿足條件時執(zhí)行”指令可以重復(fù)執(zhí)行程序循環(huán),直至不滿足執(zhí)行條件為止。WHILE循環(huán)參數(shù)見表6-4所示,其語句結(jié)構(gòu)如下:WHILE<條件>DO<指令>;END_WHILE;WHILE循環(huán)的工作原理是先判斷,再執(zhí)行,即①先判斷條件;②可以重復(fù)執(zhí)行程序循環(huán);③直至不滿足執(zhí)行條件為止。6.4語句6.4語句表6-4WHILE循環(huán)參數(shù)說明參數(shù)說明條件必需。值為TRUE或FALSE的邏輯表達式。(“null”條件被視為FALSE)指令可選。在條件值不滿足之前執(zhí)行的一條或多條語句?!纠?-2】求整數(shù)1+2+3+...50的和。6.4語句圖6-4【例6-2】代碼與監(jiān)控6.4語句如圖6-4所示,先給Sum_1變量賦初值0,Number_1變量賦初值1。第一次WHILE循環(huán)時先判斷WHILE循環(huán)條件,Number_1的值滿足<=50,接著執(zhí)行執(zhí)行Sum_1+Number_1,即Sum_1+1,將和值賦值給Sum_1,然后Number_1的值加1變?yōu)?。第二次循環(huán)時候在WHILE條件處滿足循環(huán)條件,接著執(zhí)行Sum_1+Number_1即Sum_1+2,將和值賦值給Sum_1,然后Number_1的值加1變?yōu)?。第三次循環(huán)時候在WHILE條件處滿足循環(huán)條件,接著執(zhí)行Sum_1+Number_1即Sum_1+3賦值給Sum_1,然后Number_1的值加1變?yōu)?,為下一次執(zhí)行Sum_1+4做好準備。6.4語句以此類推,當執(zhí)行第50次循環(huán)的時候,Sum_1的值變?yōu)镾um_1+50,Number_1的值變?yōu)?0+1=51,不滿足下一次的循環(huán)條件,因此退出循環(huán)。用WHILE循環(huán)求得和值為1275。(3)REPEAT指令在SCL中,REPEAT指令也是一種用于循環(huán)執(zhí)行代碼塊的控制結(jié)構(gòu),它提供了一個基于條件的循環(huán),直到滿足特定條件才停止。REPEAT指令通常用于在循環(huán)開始前不知道確切的循環(huán)次數(shù)的情況下。REPEAT指令參數(shù)見參數(shù)見表6-5所示,REPEAT指令格式如下:6.4語句REPEAT<指令>;UNTIL<條件>END_REPEAT;REPEAT指令的工作原理是先執(zhí)行,后判斷。REPEAT后面的指令為循環(huán)體,UNTIL后面的條件為循環(huán)結(jié)束的條件。循環(huán)指令至少執(zhí)行一次,然后在每次循環(huán)迭代結(jié)束后檢查UNTIL條件。如果條件滿足,循環(huán)終止;如果條件不滿足,繼續(xù)執(zhí)行循環(huán)體。6.4語句表6-5REPEAT指令參數(shù)說明參數(shù)說明條件必需。一個或多個用以下兩種方式表達的表達式:值為TRUE或FALSE的數(shù)字表達式或字符串表達式?!皀ull”條件被視為FALSE。指令可選。在條件值為TRUE之前執(zhí)行的一條或多條語句。6.4語句【例6-3】求整數(shù)1+2+3+...50的和圖6-5【例6-3】代碼與監(jiān)控6.4語句如圖6-5所示,先給Sum_1變量賦初值0,Number_1變量賦初值1。第一次REPEAT循環(huán)時先執(zhí)行REPEAT循環(huán)體,即Sum_1+1,將和值賦值給Sum_1,然后Number_1的值加1變?yōu)?,最后判斷Number_1的值是否滿足>50,不滿足因此繼續(xù)第二次循環(huán)。第二次循環(huán)時候先執(zhí)行Sum_1+Number_1即Sum_1+2,將和值賦值給Sum_1,然后Number_1的值加1變?yōu)?。第三次循環(huán)時候先執(zhí)行Sum_1+Number_1即Sum_1+3賦值給Sum_1,然后Number_1的值加1變?yōu)?,為下一次執(zhí)行Sum_1+4做好準備。以此類推,當執(zhí)行第50次循環(huán)的時候,Sum_1的值變?yōu)镾um_1+50,Number_1的值變?yōu)?0+1=51,此時滿足REPEAT的循環(huán)條件,因此退出循環(huán)。用WHILE循環(huán)求得和值為1275。6.4語句(4)CONTINUE語句在SCL中,使用CONTINUE“復(fù)查循環(huán)條件”指令,可以結(jié)束FOR、WHILE或REPEAT循環(huán)的當前程序運行。執(zhí)行該指令后,將再次計算繼續(xù)執(zhí)行程序循環(huán)的條件開始下一個循環(huán)。該指令將影響其所在的程序循環(huán)。CONTINUE的語法格式為:CONTINUE;6.4語句CONTINUE語句只有CONTINUE一個關(guān)鍵詞加英文分號。CONTINUE指令只能在循環(huán)結(jié)構(gòu)語句中使用,如FOR、WHILE或REPEAT循環(huán)。使用CONTINUE后,循環(huán)體中的所有剩余代碼都將被跳過,因此要確保在跳過當前迭代后不會引發(fā)未初始化的變量或邏輯錯誤。CONTINUE語句的流程圖如右圖所示。6.4語句【例6-4】用CONTINUE語句求自然數(shù)0到100之間所有奇數(shù)之和。圖6-7【例6-4】代碼與監(jiān)控6.4語句如圖6-7所示,在WHILE循環(huán)的循環(huán)體中首先讓Number_1不斷加1,將Number_1除以2的余數(shù)賦值給Number_2,如果余數(shù)是0,說明是偶數(shù)則不執(zhí)行循環(huán)體中CONTINUE后面的語句即將數(shù)值累加到Sum_1中,程序會重新回到WHILE中的條件判斷語句,如果余數(shù)不是0,那么將執(zhí)行CONTINUE后面的累加指令。當Number_1的數(shù)值變成99,進入循環(huán)體中的加1操作變成100,因為是偶數(shù)所以直接跳到WHILE條件語句處,因為不符合條件所以直接跳到END_WHILE結(jié)束大循環(huán),Number_1的值也停留在100,求得所有奇數(shù)和值為2500。6.4語句(5)EXIT語句在SCL中,EXIT是立即退出循環(huán)語句。使用“立即退出循環(huán)”指令,可以隨時取消FOR、WHILE或REPEAT循環(huán)的執(zhí)行,而無需考慮是否滿足條件。在循環(huán)結(jié)束(END_FOR、END_WHILE或END_REPEAT)后繼續(xù)執(zhí)行程序。該指令將影響其所在的程序循環(huán),如圖6-8所示。立即退出循環(huán)指令格式為:EXIT;6.4語句【例6-5】用EXIT語句求自然數(shù)0到100之間所有偶數(shù)之和。圖6-9【例6-5】代碼與監(jiān)控6.4語句如圖6-9例子中,我們定義了一個Int變量Sum_1來存儲偶數(shù)的總和,并將其初始化為0。定義了一個Int型變量Number_1作為循環(huán)計數(shù)器,從0開始。定義了一個Int型變量Number_2來判斷Number_1的奇偶性質(zhì)。使用WHILETRUE創(chuàng)建一個無限循環(huán)。在每次循環(huán)迭代中,檢查Number_1是否為偶數(shù),如果是,則將其加Sum_1中。遞增Number_1的值,并在Number_1超過100時使用EXIT語句退出循環(huán)。6.4語句跳轉(zhuǎn)語句(GOTO)使用GOTO“跳轉(zhuǎn)”語句允許程序跳轉(zhuǎn)到指定的標簽位置,從而改變程序的執(zhí)行流程。GOTO指令類似于西門子S7-200的JMP無條件跳轉(zhuǎn)指令。使用GOTO指令的注意事項有:①在OB/FB/FC中使用GOTO指令時,必須新建SCL程序塊,特別是在OB中只有新建SCL語言的OB塊才能使用GOTO指令,若以插入SCL程序段的方式將無法支持使用GOTO指令。②跳轉(zhuǎn)標簽和“跳轉(zhuǎn)”指令必須在同一個塊中。在一個塊中,跳轉(zhuǎn)標簽的名稱只能指定一次。每個跳轉(zhuǎn)標簽可以是多個跳轉(zhuǎn)指令的目標。6.4語句③不允許從“外部”跳轉(zhuǎn)到程序循環(huán)內(nèi),但允許從循環(huán)內(nèi)跳轉(zhuǎn)到“外部”。④雖然GOTO和標簽提供了編程的靈活性,但代碼中過多地使用GOTO語句會導(dǎo)致程序結(jié)構(gòu)混亂,不斷跳轉(zhuǎn)的代碼也不利于程序的理解和維護,因此需謹慎使用GOTO語句。GOTO語句的語法格式為:GOTO<跳轉(zhuǎn)標簽>......<跳轉(zhuǎn)標簽>:<指令>;...6.4語句【例6-6】用GOTO語句求自然數(shù)0到100之間所有奇數(shù)之和。圖6-10【例6-6】代碼與監(jiān)控6.4語句如圖6-10示例中,首先給Sum_1和Number_1變量賦初值,然后在WHILE循環(huán)的循環(huán)體中編寫Label1標簽指令讓Number_1不斷加1,接著在IF語句中對Number_1除以2的余數(shù)進行判斷,余數(shù)為0說明是偶數(shù)則跳轉(zhuǎn)到Label1標簽指令繼續(xù)執(zhí)行Number_1加1操作,如果余數(shù)不為0說明是奇數(shù)那么將執(zhí)行ELSE后面的累加指令。當Number_1的數(shù)值變成98,進入循環(huán)體中的Label1加1操作變成99,因為是奇數(shù)所以進行累加,當下一次循環(huán)返回WHILE條件語句處時,因為不符合條件所以直接跳到END_WHILE結(jié)束大循環(huán),Number_1的值也停留在99,求得所有奇數(shù)和值為2500。6.4語句退出塊(RETURN)指令使用“退出塊”指令,可以終止當前處理塊中的程序執(zhí)行,并在調(diào)用塊中繼續(xù)執(zhí)行。如果該指令出現(xiàn)在塊結(jié)尾處,則可以跳過。該語句的格式為:RETURN;【例6-7】RETURN語句的用法6.4語句圖6-11【例6-7】代碼6.4語句如圖6-11示例中,使用一個CASE語句,根據(jù)Number_1值的不同,跳轉(zhuǎn)到不同的標簽,當Number_1等于1時跳轉(zhuǎn)到label_1標簽,Sum_1=1,然后RETURN結(jié)束程序塊;當Number_1等于2時跳轉(zhuǎn)到label_2標簽,Sum_1=2,然后RETURN結(jié)束程序塊;當Number_1等于3時跳轉(zhuǎn)到label_3標簽,Sum_1=3,然后RETURN結(jié)束程序塊;當Number_1等于4時跳轉(zhuǎn)到label_4標簽,Sum_1=4,然后RETURN結(jié)束程序塊;在FC塊中編寫RETURN程序,在FC塊的接口區(qū),Input_1放在FC塊的input參數(shù)中,OUT_1放在FC塊的output參數(shù)中。在OB塊中調(diào)用該FC塊,打開監(jiān)視狀態(tài),修改Input_1的值,觀察輸出的值。如圖6-12所示。6.4語句圖6-12【例6-7】調(diào)試監(jiān)控狀態(tài)6.4語句注釋用于解釋程序,幫助讀者理解程序,不影響程序的運行。對程序進行正確地注釋是良好的編程習慣??赏ㄟ^以下幾種方式為文本塊接口中的變量添加注釋:①行注釋行注釋以“//”開頭,僅延續(xù)到到行尾。行注釋可以不在代碼行首,但是跨行后不連續(xù),若跨行需重新加行注釋符號“//”?!纠?-8】//這是一個單行注釋。②注釋段注釋段以“(*”開始,以“*)”結(jié)束。該注釋可跨多個行。括號內(nèi)“(*...*)”的文本將處理為注釋信息。6.4語句【例6-9】(*這是一個注釋段:本項目工程使用西門子S7-1200PLC,CPU型號1214C/AC/DC/RLY,訂貨號6ES7214-1BG40-0XB0,固件版本V4.2,軟件版本為TIAPortalV16。*)③多語言注釋多語言注釋是一個以“(/*”開始,以“*/)”結(jié)束的單元。即,只能對整個注釋進行標記或選擇,而不能選擇其中一部分。多語言注釋不能相互嵌套,但在注釋行和注釋段中使用。所不同的是,在多語言注釋中不能使用注釋行或簡單的注釋段?!纠?-10】(/*該注釋可翻譯為其它項目語言。*/)6.5數(shù)組1、Array(數(shù)組)是一種數(shù)據(jù)結(jié)構(gòu),是一種由固定數(shù)量、固定編號、同一種數(shù)據(jù)類型的元素組成的集合。數(shù)組中每一個元素都有一個編號,這個編號也稱為索引或下標。數(shù)組可以在OB、FC、FB和DB的塊接口編輯器中創(chuàng)建。但是無法在PLC變量編輯器中創(chuàng)建數(shù)組。在SCL中,目前只能聲明固定元素數(shù)量的數(shù)組。6.5數(shù)組數(shù)組的特點有:1、數(shù)組中全部元素的數(shù)據(jù)類型必須是相同的,這里的數(shù)據(jù)類型可以是數(shù)組之外的其他任何數(shù)據(jù)類型,比如Int型、Real型等。2、數(shù)組的下標可以為負,但起始下標必須小于或等于結(jié)束下標。3、數(shù)組可以是一維到六維數(shù)組,SCL語言支持最多六維數(shù)組。4、用兩個英文點號分隔同一維的最小最大值聲明,用英文逗號隔開不同維度。5、不允許使用嵌套數(shù)組或數(shù)組的數(shù)組。6、數(shù)組的存儲器大小=(一個元素的大小*數(shù)組中的元素的總數(shù))6.5數(shù)組數(shù)組在使用前要先聲明,具體見表6-6所示。聲明一維數(shù)組的語法格式為:Array[min..max]of<type>。其中:min-數(shù)組的起始(最低)下標max-數(shù)組的結(jié)束(最高)下標type-數(shù)據(jù)類型之一,例如BOOL、Char聲明多維數(shù)組的語法格式為:Array[索引1_min..索引1_max,索引N_min..索引N_max]of<type>6.5數(shù)組表6-6數(shù)組的聲明數(shù)組索引有效索引類型數(shù)組索引規(guī)則常量或變量USInt,Sint,Uint,Int,UDInt,DInt限值:-32768到+32767有效:常量和變量混合有效:常量表達式無效:變量表達式6.5數(shù)組要在塊接口編輯器中創(chuàng)建一維數(shù)組,命名好數(shù)組名稱如數(shù)組_A,數(shù)據(jù)類型需選擇“Array[0..1]of”,然后在下拉列表中選擇需要的數(shù)據(jù)類型如“Array[0..1]ofBOOL”。點擊數(shù)據(jù)類型單元格右側(cè)的下三角圖標,在“數(shù)組限值”中以英文兩點..隔開分別輸入輸入數(shù)組的起始下標和結(jié)束下標,即完成了一維數(shù)組的創(chuàng)建。此時數(shù)組_A包含數(shù)組_A[0]和數(shù)組_A[1]兩個一維BOOL變量,如圖6-13所示。圖6-13數(shù)組聲明組態(tài)6.5數(shù)組如果要創(chuàng)建多維數(shù)組,則在“數(shù)組限值”中在一維數(shù)組的基礎(chǔ)上以英文逗號隔開輸入多組起始下標和結(jié)束下標即可,具體見表6-7所示。表6-7多維數(shù)組聲明示例名稱數(shù)據(jù)類型數(shù)組維數(shù)說明數(shù)組_AARRAY[2..3]ofChar一維數(shù)組數(shù)組_A[2]、數(shù)組_A[3]2個Char元素數(shù)組_BARRAY[-3..-2]ofReal一維數(shù)組數(shù)組_B[-3]、數(shù)_B[-2]2個Real元素數(shù)組_CARRAY[5..6,-4..-3]ofBool二維數(shù)組數(shù)組_C[5,-4]、數(shù)組_C[5,-3]、數(shù)組_C[6,-4]、數(shù)組_C[6,-3]4個Bool元素數(shù)組_DARRAY[0..1,2..3,4..5]ofByte三維數(shù)組數(shù)組_D[0,2,4]、數(shù)組_D[0,2,5]、數(shù)組_D[0,3,4]、數(shù)組_D[0,3,5]、數(shù)組_D[1,2,4]、數(shù)組_D[1,2,5]、數(shù)組_D[1,3,4]、數(shù)組_D[1,3,5]8個Byte元素6.5數(shù)組數(shù)組的引用格式為:數(shù)組名+方括號+索引。如:數(shù)組_A[3]是對數(shù)組_A數(shù)組索引號為3的元素的引用。"數(shù)據(jù)塊_1".數(shù)組_A[2,2]:=99;//把一個常數(shù)賦值給一個二維數(shù)組變量“Tag_1”:="數(shù)據(jù)塊_1".數(shù)組A[1,5];//把索引號為[1,5]的二維數(shù)組變量賦值給Tag_1變量【例6-11】根據(jù)圖6-14所示,用SCL語言求數(shù)組A_1中所有數(shù)組的和。6.5數(shù)組a)數(shù)組A_1設(shè)定起始值

b)代碼與監(jiān)控圖6-14【例6-11】數(shù)組元素的引用6.6指針在西門子S7-1200PLC中,使用SCL編程時,指針是一個重要的概念,它提供了對數(shù)據(jù)存儲位置的引用,使得程序可以更加靈活和高效地操作數(shù)據(jù)。指針是存儲其他變量地址的變量。在S7-1200SCL中,你可以使用指針來訪問和操作存儲在PLC內(nèi)存中的數(shù)據(jù)。西門子的指針包括Pointer、Any、Variant三種指針類型。S7-300/400/1500支持Pointer和Any類型,S7-1200只支持Variant類型。6.6指針Variant數(shù)據(jù)類型可以指向PLC中不同數(shù)據(jù)類型的變量或參數(shù)(包括數(shù)組、結(jié)構(gòu)體、自定義數(shù)據(jù)類型)的變量或參數(shù)。比Any功能更強大。Variant指針可以指向結(jié)構(gòu)和單獨的結(jié)構(gòu)元素。Variant數(shù)據(jù)類型的操作數(shù)不會占用背景數(shù)據(jù)塊或者工作存儲器的任何空間,但是會占用CPU上的裝載存儲器的存儲空間。Variant數(shù)據(jù)類型的參數(shù)是對已經(jīng)存在的變量的引用,相當于被引用變量的別名。只能在FC/FB/OB的形參中聲明某個參數(shù)的類型為Variant,而不能在DB數(shù)據(jù)塊和FB塊的靜態(tài)變量聲明Variant類型的元素。6.6指針在對FC/FB的Variant形參賦實參時,可以是任何類型的變量,調(diào)用該FC和FB時,在傳遞變量值的同時,而且會傳遞變量的類型。具體與Variant有關(guān)的常用指令見表6-8所示:表6-8Variant類型指令與說明指令功能指令說明確定數(shù)據(jù)類型TypeOf():檢查VARIANT變量的數(shù)據(jù)類型(該指令僅適用于SCL,且只能與IF或CASE指令一起使用。)可使用該指令將VARIANT變量指向的數(shù)據(jù)類型與任何其它變量的數(shù)據(jù)類型進行比較。也可以與PLC數(shù)據(jù)類型作比較。讀取VARIANT指向的數(shù)據(jù)VariantGet:讀取VARIANT變量值可使用該指令將單個變量的值移到另一個變量中。這兩個變量的數(shù)據(jù)類型必須匹配。將數(shù)據(jù)分配給VARIANT變量VariantPut:寫入VARIANT變量值可使用該指令將單個變量的值移到另一個變量中。這兩個變量的數(shù)據(jù)類型必須匹配。6.6指針【例6-12】一個加法FB塊,實現(xiàn)功能為當Input形參是二個Input類型,二數(shù)相減,輸出給OUTPUT_1。如果Input形參是二個REAL類型,二數(shù)相減,輸出給OUTPUT_2。如圖6-15所示。圖6-15【例6-12】Variant類型的應(yīng)用6.7程序塊的調(diào)用(SCL)對于程序塊的調(diào)用,調(diào)用可以項目樹程序塊中選中FC或FB塊拖拽入程序編輯區(qū)域,也可以在調(diào)用塊中直接輸入被調(diào)用塊的名稱進行調(diào)用。FC的調(diào)用在SCL中對FC調(diào)用的格式為:"FC塊名稱"(輸入形參:=實參,輸出形參=>實參,輸入輸出形參:=實參...);FC調(diào)用需要確保所有形參都有對應(yīng)實參。如果沒有參數(shù)的FC也需要有括號。6.7程序塊的調(diào)用(SCL)【例6-13】基于SCL語言使用FC實現(xiàn)兩臺電機的起保停。如圖6-16所示第一步,首先刪除默認的OB1,新建SCL的OB1塊;圖6-16第一步6.7程序塊的調(diào)用(SCL)【例6-13】基于SCL語言使用FC實現(xiàn)兩臺電機的起保停。圖6-17第二步如圖6-17所示第二步,點添加新塊,新建FC的SCL程序塊,塊名稱修改為起保停,語言選擇SCL6.7程序塊的調(diào)用(SCL)【例6-13】基于SCL語言使用FC實現(xiàn)兩臺電機的起保停。圖6-18第三步如圖6-18所示第三步:在FC接口區(qū)內(nèi)定義形參;6.7程序塊的調(diào)用(SCL)【例6-13】基于SCL語言使用FC實現(xiàn)兩臺電機的起保停。如圖6-19所示第四步:在FC程序區(qū)內(nèi)編寫起保停程序;如圖6-20所示第五步:在OB塊內(nèi)調(diào)用FC,以變量表中的變量填充實參;圖6-19第四步圖6-20第五步6.7程序塊的調(diào)用(SCL)【例6-13】基于SCL語言使用FC實現(xiàn)兩臺電機的起保停。圖6-21第六步如圖6-21所示第六步:編譯無誤后,下載到PLC,在OB塊打開監(jiān)控進行調(diào)試。當Button_1按下,電機Motor_1為TRUE,當Button_1復(fù)位后電機Motor_1仍能保持TRUE,實現(xiàn)自鎖。當按下停止按鈕Button_2,電機Motor_1恢復(fù)FALSE狀態(tài)。當Button_3按下,電機Motor_2為TRUE,當Button_3復(fù)位后電機Motor_2仍能保持TRUE,實現(xiàn)自鎖。當按下停止按鈕Button_4,電機Motor_2恢復(fù)FALSE狀態(tài)。6.7程序塊的調(diào)用(SCL)【例6-13】基于SCL語言使用FC實現(xiàn)兩臺電機的起保停。圖6-21第六步如圖6-21所示第六步:編譯無誤后,下載到PLC,在OB塊打開監(jiān)控進行調(diào)試。當Button_1按下,電機Motor_1為TRUE,當Button_1復(fù)位后電機Motor_1仍能保持TRUE,實現(xiàn)自鎖。當按下停止按鈕Button_2,電機Motor_1恢復(fù)FALSE狀態(tài)。當Button_3按下,電機Motor_2為TRUE,當Button_3復(fù)位后電機Motor_2仍能保持TRUE,實現(xiàn)自鎖。當按下停止按鈕Button_4,電機Motor_2恢復(fù)FALSE狀態(tài)。6.7程序塊的調(diào)用(SCL)在SCL中FB單個實例調(diào)用的格式為:"背景數(shù)據(jù)塊名稱"(輸入形參:=實參,輸出形參=>實參,輸入輸出形參:=實參...);一般情況下,F(xiàn)B的簡單數(shù)據(jù)類型形參可以沒有對應(yīng)實參,復(fù)雜數(shù)據(jù)類型的輸入、輸出也可以沒有對應(yīng)實參,所以FB可以隱藏或不隱藏不出現(xiàn)的形參。如果沒有參數(shù)的FB也需要有括號。當FB的參數(shù)全部顯示或只顯示了分配的參數(shù),鼠標右鍵單擊被調(diào)用FB的背景數(shù)據(jù)塊,將對應(yīng)出現(xiàn)"僅顯示分配的參數(shù)"或"顯示所有參數(shù)",從而改變FB參數(shù)的全部顯示或部分顯示狀態(tài)。6.7程序塊的調(diào)用(SCL)【例6-14】基于SCL語言使用FB實現(xiàn)兩臺電機的起保??刂疲旊姍C運行時對應(yīng)的LED燈點亮。圖6-22第二步第一步,首先刪除默認的OB1,新建SCL的OB1塊;(同例6-13)如圖6-22所示第二步:點添加新塊,新建FB的SCL程序塊,塊名稱修改為起保停,語言選擇SCL;6.7程序塊的調(diào)用(SCL)【例6-14】基于SCL語言使用FB實現(xiàn)兩臺電機的起保停控制,當電機運行時對應(yīng)的LED燈點亮。圖6-23第三步如圖6-23所示第三步:在FB接口區(qū)內(nèi)定義形參;6.7程序塊的調(diào)用(SCL)【例6-14】基于SCL語言使用FB實現(xiàn)兩臺電機的起保??刂?,當電機運行時對應(yīng)的LED燈點亮。圖6-24第四步如圖6-24所示第四步:在FB程序區(qū)內(nèi)編輯程序;6.7程序塊的調(diào)用(SCL)【例6-14】基于SCL語言使用FB實現(xiàn)兩臺電機的起保??刂?,當電機運行時對應(yīng)的LED燈點亮。圖6-25第五步如圖6-25所示第五步:在數(shù)據(jù)塊DB中定義兩臺電機起保停的實參,實參和FB內(nèi)的形參數(shù)據(jù)類型匹配6.7程序塊的調(diào)用(SCL)【例6-14】基于SCL語言使用FB實現(xiàn)兩臺電機的起保??刂?,當電機運行時對應(yīng)的LED燈點亮。圖6-26第六步如圖6-26所示第六步:在OB塊中調(diào)用兩次星三角啟動FB塊,直接將FB塊用鼠標拖動至OB塊內(nèi),為每次FB塊的單個實例(背景DB)分配好名稱編號6.7程序塊的調(diào)用(SCL)【例6-14】基于SCL語言使用FB實現(xiàn)兩臺電機的起保??刂疲旊姍C運行時對應(yīng)的LED燈點亮。圖6-27第七步如圖6-27所示第七步:將數(shù)據(jù)塊中的實參變量分配到“起保停_DB2”和“起保停_DB3”后面括號內(nèi)對應(yīng)的形參;6.7程序塊的調(diào)用(SCL)【例6-13】基于SCL語言使用FC實現(xiàn)兩臺電機的起保停。圖6-21第六步如圖6-21所示第六步:編譯無誤后,下載到PLC,在OB塊打開監(jiān)控進行調(diào)試。當Button_1按下,電機Motor_1為TRUE,當Button_1復(fù)位后電機Motor_1仍能保持TRUE,實現(xiàn)自鎖。當按下停止按鈕Button_2,電機Motor_1恢復(fù)FALSE狀態(tài)。當Button_3按下,電機Motor_2為TRUE,當Button_3復(fù)位后電機Motor_2仍能保持TRUE,實現(xiàn)自鎖。當按下停止按鈕Button_4,電機Motor_2恢復(fù)FALSE狀態(tài)。6.7程序塊的調(diào)用(SCL)【例6-14】基于SCL語言使用FB實現(xiàn)兩臺電機的起保??刂?,當電機運行時對應(yīng)的LED燈點亮。圖6-28第八步如圖6-28所示第八步:編譯無誤后,下載到PLC,在OB塊打開監(jiān)控進行調(diào)試。當Motor_1Start按下,電機Motor1_KM為TRUE,Motor1_LED點亮,當Motor_1Stop復(fù)位后電機1Motor_KM和Motor1_LED仍能保持TRUE,實現(xiàn)自鎖。當按下停止按鈕Motor1_Stop,Motor1_KM和Motor1_LED恢復(fù)FALSE狀態(tài)。電機2同理。6.7程序塊的調(diào)用(SCL)【例6-14】基于SCL語言使用FB實現(xiàn)兩臺電機的起保??刂疲旊姍C運行時對應(yīng)的LED燈點亮。圖6-28第八步如圖6-28所示第八步:編譯無誤后,下載到PLC,在OB塊打開監(jiān)控進行調(diào)試。當Motor_1Start按下,電機Motor1_KM為TRUE,Motor1_LED點亮,當Motor_1Stop復(fù)位后電機1Motor_KM和Motor1_LED仍能保持TRUE,實現(xiàn)自鎖。當按下停止按鈕Motor1_Stop,Motor1_KM和Motor1_LED恢復(fù)FALSE狀態(tài)。電機2同理。6.7程序塊的調(diào)用(SCL)在SCL中,和LAD一樣,多重實例調(diào)用只存在于FB調(diào)用FB的情況中。多重背景調(diào)用的格式是:#多重背景(輸入形參:=實參,輸出形參=>實參,輸入輸出形參:=實參...);定時器做為一種特殊的FB塊具有背景數(shù)據(jù)塊,因此我們以FB調(diào)用定時器為例說明FB的多重實例的應(yīng)用。6.7程序塊的調(diào)用(SCL)【例6-15】基于SCL語言使用FB實現(xiàn)兩臺電機的星三角啟動控制,兩臺電機的星三角切換時間分別為5秒和10秒。圖6-29第三步第一步,首先刪除默認的OB1,新建SCL的OB1塊;(同例6-13)第二步:點添加新塊,新建FB的SCL程序塊,塊名稱修改為星三角啟動,語言選擇SCL(同例6-13);如圖6-29所示第三步:在FB接口區(qū)定義形參;6.7程序塊的調(diào)用(SCL)【例6-15】基于SCL語言使用FB實現(xiàn)兩臺電機的星三角啟動控制,兩臺電機的星三角切換時間分別為5秒和10秒。圖6-30第四步如圖6-30所示第四步:在FB程序區(qū)編輯星三角啟動SCL程序,在FB塊中調(diào)用定時器T1時,選中右側(cè)基本指令欄中的TON直接拖拽到程序中,在彈出的調(diào)用選項中選擇以多重實例的方式調(diào)用定時器,此時#T1后面出現(xiàn)包含形參的括號。6.7程序塊的調(diào)用(SCL)【例6-15】基于SCL語言使用FB實現(xiàn)兩臺電機的星三角啟動控制,兩臺電機的星三角切換時間分別為5秒和10秒。圖6-31第五步如圖6-31所示第五步:在數(shù)據(jù)塊DB中定義兩臺電機星三角啟動的實參,實參和FB內(nèi)的形參數(shù)據(jù)類型匹配6.7程序塊的調(diào)用(SCL)【例6-15】基于SCL語言使用FB實現(xiàn)兩臺電機的星三角啟動控制,兩臺電機的星三

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論