在這裡介紹自動化的開發工具,貌似不合時宜, 因為論壇裡面討論的都是電腦領域的東西。
這裡借部落格園的地方來談談自己對Pascal語言的一點看法, 不知道管理員是否會將文章刪除, 如果刪除的話,我以後就不發了,如果不刪除的話,以後我
就繼續跟著這個主題繼續發帖。
我對SCL以前也是耳聞,現在也是初學, 將自己的一點學習心得和總結髮出來供大家拍磚.......
為什麼學習SCL呢, 是因為我發現想利用LAD/FBD/STL做一些迴圈操作、微積分之類的操作實現起來有點困難,因此就想學習一個簡單點語言來實現
工控中經常要用到的PID調節、微積分和一些複雜的數學計算。
我不知道為什麼在電腦領域,目前Pascal語言的應用為什麼不如C/C++這個系列的語言應用廣泛(Java、C#可以說是C語言這個系列的), 因為據我
所知,Pascal語言也定義了指標這樣的操縱結構, 藉助Delphi系列的語言在win下也可以和VC一樣對系統函數進行強有力的使用,同樣可以開發win下的驅動
程式,而在Linux下也有Kylix這樣的Visual開發環境,為什麼目前就沒有以前那麼好了呢? 在我的印象裡面Delphi曾經是一個非常流行的開發工具,那為什麼
沒有以前那樣的應用了呢?
其實在自動化控制領域Pascal語言還是佔有一席之地的(當然C語言也佔有一席之地, 奇怪好像C語言在什麼領域都有一席之地,看來C語言的統治地位,目前
是沒法改變的,雖然Java的程式員一直高居榜首,但是C語言一直是應用範圍最廣的,在單片機、嵌入式、DSP、大型有限元、Matlab控制系統模擬、人工智慧類比,
以及其他大型的工程模擬和應用裡面,C語言好像比其他任何語言應用都多,扯遠了),Pascal在自動化控制領域是作為SCL語言存在的; 主流的PLC廠家都支援SCL
語言,像Siemens、RockWell等的主流產品都支援SCL編程。
下面我們來看看西門子PLC的SCL語言。
1、S7 SCL功能介紹
1、1 與Step 7整合
SCL支援Step 7中的程式/塊的概念
用SCL可以建立以下Step 7的塊
1)OB組織塊
2)FC函數/功能
3)FB功能塊
4)DB資料區塊
5)UDT使用者自訂資料類型
在一個S7的項目中, SCL編製的程式能夠與其他S7語言編製的塊相結合和想互調用;編譯好的SCL程式塊
可以儲存在S7的程式塊檔案夾(Blocks檔案夾中),並且可以當做標準的S7塊被調用。
SCL程式用文字編輯器編輯(ASCII文字編輯器),很容易被匯入和匯出。
S7 SCL編製的程式塊可以編譯成STL形式的語句, 編譯成STL形式的程式將不能再在SCL中編輯,如果要編輯
SCL程式塊,必須編輯其源檔案。
1、2 開發環境
S7 SCL提供了一個IDE的開發環境,通過這個環境可以與Step7進行協調工作,完成使用者的程式編輯和編譯任務。
開發環境的組件:
1)編輯器: 進行SCL程式的編輯。
2)批編譯器: 將SCL來源程式編譯成MC7機器代碼,生產的MC7機器代碼可以在S7 300/400的PLC上運行,
如CPU 315-2DP
3)調試器:可以通過調試器對程式進行調試工作。
2、S7 SCL的功能
2.1 塊庫
塊庫提供了預定義的塊,
1)系統功能
2)IEC功能
3)轉換功能
當在編輯程式的過程中,從庫中選擇一個塊,則其參數模板自動調入進行中處理的程式檔案中。
2.2 編程模板
S7 SCL提供了以套編程模板方便編程人員編輯來源程式
1)塊及其調用模板
2)塊注釋、塊參數和常量模板
3)程式控制結構模板
2.3 進階語言要素
1)迴圈結構
2)分支結構
3)跳轉結構
2.4 易用性功能
1)全符號編程, 在Step7中建立的符號在SCL可以應用
2)基於Pascal類型的注釋
3)基本和自訂資料類型
4)顯示交叉參考(Reference Cross)
5)語言文法著色
6)自動進行格式化(Indent)輸入的內容
2.5 進階語言調試功能
1)連續監視程式運行
2)可單獨設定斷點進行監視
3)Step-in功能(調試期間進入被調用塊進行監視)
2.6 SCL的應用範圍
包含Pascal語言要素,同時也包含了輸入/輸出、定時器、計數器等PLC元素
1) 複雜演算法編程
2) 數學函數編程
3) 資料和配方管理
4) 過程最佳化
3、開發SCL程式過程
3.1 建立新的的SCL源檔案
在進行編寫SCL程式前必須建立一個新的SCL源檔案,建立源檔案是在S7程式的源檔案夾裡進行的。
具體建立過程不再細說,同建立其他源檔案的方法一樣。
3.2 編輯SCL來源程式
可以通過IDE環境編輯來源程式
3.3 調試來源程式
通過IDE的編譯工具,可以檢查程式的文法和句法錯誤。
通過IDE的調試工具可以對程式進行調試。
3.4 編譯成STL
將遠程程式編譯成塊檔案
3.5 下載
1)SCL的IDE環境進行下載,這樣需要來源程式
2)在LAD /FBD /STL 編輯器中進行下載,這樣需要將SCL編譯成STL程式碼
4、SCL程式結構
首先我們來看一個簡單SCL來源程式中的FUNCTION塊
Exp:
FUNCTION FC11: REAL
VAR_INPUT // 這裡是函數的輸入參數 x1: REAL ; x2: REAL ; x3: REAL ; x4: REAL ;END_VAR
VAR_OUTPUT //這裡是函數是輸入輸出參數, 有點類似指標的操作,因為在函數裡面操作的話,會影響傳值的實參 Q2: REAL ;END_VAR
BEGIN //這裡是函數體 // 從函數傳回值 FC11:= SQRT( (x2 - x1)**2 + (x4 - x3) **2 ) ; Q2:= x1 ;END_FUNCTION //與Pascal不一樣的地方,這裡檔案程式結尾不是 END.
可以發現程式的FUNCTION的結構樣式和Pascal的非常相似。
4.1 SCL源檔案中的塊
能夠在S7 SCL來源程式代碼中編程一定數量的塊。塊時Step 7程式的子單元,根據他們的功能、結構
或預期的用途進行組織。
4.1.1 Step 7/SCL 中的塊類型
1)組織塊 OB
2)函數 FC(相當於不帶有靜態儲存區的C語言函數)
3)函數塊 FB(帶背景資料, 相當於帶有static資料類型的C語言函數)
4)資料庫 DB(分為共用資料區塊;相當於C語言中的全域變數。 背景資料區塊: 就是FB帶的背景資料)
5)UDT使用者自訂資料類型(有點類型C語言中的Struct 和Delphi中的Record)
4.1.2 預定義塊
S7系統提供了一些預定義好的塊,這些塊在STEP 7標準包的CPU作業系統或庫(S7 lib)中,如編程
通訊功能的SFC14/SFC 15,或者進行工程量轉換的FC105/FC106.
4.2 塊的邏輯結構/次序
被調用塊在被調用之前必須遵循一些規則:
1)使用者自訂資料類型UDTs必須在使用它的塊之前定義
2)由使用者定義的資料類型UDT來進行聲明(/定義)的資料區塊DB塊必須跟在所引用的UDT之後
3)被所有使用者邏輯塊(OB、FC、FB)訪問的資料庫DB塊必須在被訪問前定義
4)指定給FB的執行個體資料區塊DB在FB功能塊之後。
5)組織塊OB1,調用其他塊,在最後出現.在OB1中被調用的塊必須在被調用前定義
6)在不同源檔案中調用的塊在檔案編譯到使用者程式時必須已經存在
7)SCL源檔案也能夠包含針對各個要編譯的塊的編譯器設定資訊,編譯器選項在塊中沒有位置限制。
4.3 塊的一般結構
塊包含下欄區域:
1) 塊開始地區: 通過關鍵字和一個塊名或符號塊名標識,
Exp:
ORGANIZATION_BLOCK OB1 //定義組織塊OB1的塊頭部
或者:
ORGANIZATION_BLOCK "main_cycle" //"main_cycle"為OB1的標識符
對於函數,需要指定函數類型,函數類型決定其傳回值的資料類型, 如果無傳回值則應指定關鍵字:VOID
Exp:
VOID FUCTION_BLOCK "StartMotor"
2)可選的塊標題
可選的塊標題由關鍵字“TITLE=”引出
Exp:
TITLE="FUCTION TO CONTROL THE MOTOR"
塊標題或作為Step 7中的comment內容出現在資源管理員裡
3)可選的塊注釋
在SCL中塊注釋可以擴充到多行, 每行由 “//” 開始
SCL的注釋與類Pascal語言一致
Exp:
//計算電機的速度
4)塊屬性
可選的條目
5)塊的系統屬性
可選的條目
6)聲明部分
根據塊類型的不同,會有不同的聲明部分
7)邏輯塊中的語句部分
或在資料區塊中實際值的給定(可選)
8)邏輯塊: 語句
9)快結束
END_ORGANIZATION_BLOCK, END_FUNCTION_BLOCK、END_FUNCTION
4.4 塊的開始和結束
一句塊的不同類型,標準塊的開始標識符和塊名作為單個原文本的開始,塊尾標準標識符結束該塊。
句法結構:
Exp:
標識符 塊類型 句法
Function Block FB FUNCTION_BLOCK Fb_Name
功能塊 ...
END_FUCNTION_BLOCK
Function FC FUNCTION fc_name:function type
功能 ...
END_FUNCTION
Organization Block OB ORGANIZATION_BLOCK OB_NAME
組織塊 ...
END_ORGANIZATION_BLOCK
Data Block DB DATA_BLOCK DB_NAME
資料區塊 ...
END_DATA_BLOCK
Shared data type UDT TYPE UDT_NAME
使用者定義資料類型 ...
END_TYPE
4.4.1 塊名
如上所列,xx_name當做塊名, 參照以下文法:
塊關鍵字 數字
DB FB FC OB UDT n
標識符
符號
數字可以是0到65535之間的值, 但是資料區塊標識符DB0 被保留,使用者不能定義和使用
若使用符號名,必須為在Step7中為塊定義一個標識符或符號名
Exp:
函數塊
FUNCTION_BLOCK FB10 //利用塊關鍵字定義
...
END_FUNCTION_BLOCK
FUNCTION_BLOCK Cotroll_Block //利用標識符進行定義
...
END_FUNCTION_BLOCK
FUNCTION_BLOCK "Control block" //利用全域符號進行定義
...
END_FUNCTION_BLOCK
通過上面簡單的介紹,我們發現SCL真的就像VBScript與VB的關係一樣,SCL就像Pascal的一個子集似的.
如果管理員不刪帖,我以後就慢慢把這個系列寫完, 因為我發現在網路上關於SCL的討論比較少,這裡希望可以給工控界的朋友提供一個
可以討論的地方......