資源描述:
《西門子PLC中使用SCL語言編程地技巧》由會員上傳分享,免費在線閱讀,更多相關內容在工程資料-天天文庫。
1、實用文檔在西門子PLC中使用SCL語言編程的技巧前言:兩年半前我就在工控網上發(fā)表了有關SCL編程的知識<<在S7300400型PLC中使用高級語言編程>>,但發(fā)表完后,即使我自己都從沒有把任何使用SCL編寫的程序用到實際控制中,當時的感覺是使用SCL編程到處受限,沒有STL語言靈活和強大。直到最近使用施耐德的Unity軟件編程,并使用這種已經國際標準化的文本語言(等同于西門子的SCL語言),才體會到它的優(yōu)點:<1>、程序容易閱讀,便于診斷和維護;<2>、程序容易在不同廠家之間的PLC之間轉換。西門子的STL語言是強大,但難于閱
2、讀,編寫程序也需要異常小心,其最強大的可能是它的寄存器尋址(類似于一些計算機高級語言中的地址指針),SCL沒有這個功能,那就多費一些程序代碼來實現同樣的功能,程序是否優(yōu)秀更應該看重程序的架構和提高程序生產效率的標準化,好的PLC程序不應該只有自己明白,而是讓更多的人明白。在西門子PLC中使用SCL語言的場合一般是編寫標準功能塊FB,其編程方式和西門子的其他編程語言,如梯形圖Lad、語句表STL是完全不同的,同時為了實現程序的國際標準化,即為了方便的將程序代碼移植到不同廠家的PLC系統上,盡量不要在SCL中使用西門子獨有的功能塊
3、。標準文案實用文檔1、在FB塊中使用結構編寫FB塊的準則,就是其使用的內部變量盡量與外部隔離,除了像PLC的新啟動/重啟動標志,以及一些方波/脈沖波等全局變量可以在FB塊中使用外,其他的任何全局變量都不應該在FB內部使用,即使是自定義結構也應該在FB中單獨定義,在FB塊中使用結構應該在靜態(tài)類型變量中定義,如下:VAR//StaticVariablesIM:STRUCT//DatastructureofInternalFlagsH1_AFCountImp:BOOL:=False;//AuxFlagCounterImpulseH1
4、_CountImp:BOOL:=False;//CounterImpulseH1_ELCountMV:BOOL:=False;//EndlessCounterMaximumValueEND_STRUCT;//otherdatastructure…END_VAR在使用這些結構時,可以按照如下方式:IM.H1_CountImp:=Imp;2、在SCL中替代Set/Reset指令的方法標準文案實用文檔SCL中不存在Set/Reset指令,或者說也沒有必要使用。在SCL中,不使用排他條件Else的條件語句就是一個Set/Reset指令
5、。如下編程:IFTHENVariablename:=1;END_IF;其等同于:(S)若加上Else條件,如下:IFTHENVariablename:=1;ELSEVariablename:=0;END_IF;則等同于:()一條完整的包含置位和復位的語句可以使用如下方式編程:標準文案實用文檔IFTHENVariablename:=1;END_IF;IFTHENVariablename:=0;END_IF;其等效于SR指令,若將上面的兩個條件語句的先后次序顛倒一下,則等效于RS指令。3、簡化程序指令<1>、盡量使用賦值語句替代那
6、些不用于SR/RS指令的BOOL型賦值條件語句,如下:IFfnAdd&(button=false)THENpus1:=true;ELSEpus1:=false;END_IF;其等效于pus1:=fnAdd&(NOTbutton),這樣使程序看起來更加簡潔和容易閱讀。<2>、對于非BOOL型賦值語句則不能這如上簡化,而是可以通過SEL函數實現:IFfnAdd&(button=false)THENpus1:=value1;ELSEpus1:=value2;END_IF;其等效于pus1:=SEL(G:=fnAdd&(button=
7、false),IN0:=value2,IN1:=value1);使用該函數時注意兩點:<1>、參數名不能省略;<2>、當選擇條件G為TRUE時,選擇后一個參數值IN1,為FALSE時,選擇前一個參數值IN0,這點與計算機C語言等正好相反。<3>、XOR指令有著比AND和OR更為復雜的表達,能使用XOR的地方應該盡量使用IF(condition1AND(NOTcondition2))OR(condition2AND標準文案實用文檔(NOTcondition1))THENResult:=true;ELSEResult:=false
8、;END_IF;其等效于Result:=condition1XORcondition2;XOR功能就是兩條件不同輸出TRUE,相同輸出FALSE4、脈沖沿檢測功能使用以下兩條語句替代脈沖上升沿檢測函數,譬如檢測button_Input上升沿的代碼如下:Puls:=button