胡貞斌
(上海電器科學研究所(集團)有限公司,上海200063)
當前工業控制現場,可編制程序控制器PLC 大行其道,各種品牌百花齊放。控制過程中許多程序功能相同,可繼承與復用,但由于控制器PLC 的更換,編程人員不得不多次翻譯式的重新編寫與調試。由于編程人員業務水平及編程思路的差異,使得同樣功能存在不同程序表達,阻滯了程序標準化與知識延續的發展,隔斷了優秀程序算法的繼承,同時也給維護者帶來程序識讀障礙,造成時間浪費。
為解決此類問題,對程序功能塊在不同品牌PLC 控制器機型間的移植實現方法的需求變得尤為迫切。
程序移植的定義“軟件工程中,程序往往被視為有生命的機體,將源代碼從一種環境下放到另一種環境下運行也可以稱之為移植。”1程序移植需具備如下幾個特征:
1.1.1 源代碼具備可復制性;
1.1.2 源代碼具備通用可識性,更換環境后可運行。
根據IEC61131-3 對PLC 編程語言的規定,PLC 控制器適用圖形與文本兩類語言。
梯形圖LD、功能塊圖FBD 及順序功能SFC 三種編程語言均強調圖形的繪制,復制性欠佳,故使用圖形語言編制的程序在不同品牌PLC 間不可移植。
指令表IL 編程語言屬于文本語言,代碼具備可復制性,但是IL 為類匯編語言,為程序執行效率計,程序編程對PLC 硬件地址依賴性很強,程序移植的通用可識性欠佳。
結構文本ST 為類PASCAL 的語言,所使用的語句與關鍵詞符合高級語言的規定,多種PLC 機型均可識別并運行,故ST語言同時滿足程序移植的復制性與通用可識性的特征。
據此提出使用結構文本ST 編程語言編制程序功能塊實現PLC 程序在不同品牌機型中移植的方法。
當下工業現場工作中的PLC 機型多數均支持IEC61131-3標準,現選用過程控制中出現頻次較高的美國AB ControlLogix1756-L71、法國施耐德M580 系列CPUeP582020、德國西門子S7-300 系列CPU315 作為程序移植方法實現的研究對象。
本文以模擬量線性轉換功能塊的復制展現PLC 程序移植過程。
模擬量線性轉換的算法公式為:

其中:
Y:儀表所表示的物理量真實值;
X:儀表所對應的PLC 模擬量輸入模塊通道轉換的數字值;
Metermax:儀表所對應的物理量量程最大值;
Metermin:儀表所對應的物理量量程最小值;
Inputmax:PLC 模擬量模塊模數轉換可轉換數字量最大值;
Inputmin:PLC 模擬量模塊模數轉換可轉換數字量最小值;
2.2.1 程序變量定義

序號 功能類型 變量名稱 數值類型 說明1 輸入 AI-Input INT 模擬端口輸入值,對應公式中的X 2 輸入 r-MeterMax Real 儀表最大值(物理值量程)3 輸入 r-MeterMin Real 儀表最小值(物理值量程)4 輸入 I-ModelMax INT 模塊最大值(數字值量程)5 輸入 I-ModelMin INT 模塊最小值(數字值量程)6 輸入 r-HH-Alarm-Set Real 超高報警限值7 輸入 r-LL-Alarm-Set Real 超低報警限值8 輸入 r-H-Alarm-Set Real 高報警限值9 輸入 r-L-Alarm-set Real 低報警限值10 輸出 r-MeterValue Real 儀表實際物理值,對應公式中的Y 11 輸出 b-HH-Alarm Bool 超高報警12 輸出 b-LL-Alarm Bool 超低報警13 輸出 b-H-Alarm Bool 高報警14 輸出 b-L-Alarm Bool 低報警15 輸出 b-Max-Aalrm Bool 儀表上溢報警16 輸出 b-Min-Alarm Bool 儀表下溢報警
2.2.2 功能程序表述
2.2.2.1 首先根據ST 語言語法使用文本文件創建程序,如下:



2.2.2.2 西門子PLC S7-300 CPU315 的程序表述
將上述文本起始增加“FUNCTION "Analog" : Void{S7_Optimized_Access := 'FALSE' }VERSION : 0.1”在文件結尾增加“END_FUNCTION”,以ANSI 編碼保存為“*.SCL”文件。
在西門子編程軟件TIA Portal 中以“外部源文件”導入,使用“從源生成塊”功能,編寫的ST 程序成功導入,可運行。
導入成功的文件有如下特點:
西門子PLC 編譯器對局部變量的引用采用“#”作為前綴;
為保證導入中文注釋可讀,文件應以ANSI 編碼保存。
2.2.2.3 施耐德M580 eP580 2020 的程序表達與導入
施耐德M580 系列使用Unity Pro XL 軟件編程,軟件導入文件支持“*.xdb”類型,其可使用文本文件編輯,但是其在變量描述部分為XML 的描述語言,不符合ST 語言的結構,對于創建的ST 結構文本程序改動較大,故在程序移植過程中選用變量在編程軟件中定義,程序邏輯語句復制粘貼的方式進行。
創建步驟如下:
(1)創建DFB 并命名;
(2)將上述各變量在輸入、輸出相應位置定義;
(3)在DFB 段中增加程序并選擇語言為ST;
(4)將上述ST 程序Begin 以下復制進程序段中;
(5)編譯執行;
編譯過程中發現,施耐德PLC 編譯器對于“//”的單行注釋認為是非法的。
2.2.2.4 AB ControlLogix1756-L71 CPU 的程序表述
AB ControlLogix1756-L71CPU 使用RSLogix5000 軟件進行編程,其對于程序導入文件類型為“*.L5X”,可使用文本文件編輯,但是其對于變量定義及程序均使用XML 結構描述,如使用已編寫好的結構文本程序更改,工作量大且無法保證正確,故AB PLC 采用與施耐德PLC 類似的編程方式,在編譯器內定義變量,邏輯程序通過文本復制方式粘貼進入編譯運行。
創建步驟如下:
(1) 新 建“Add-OnInstructions” 并 選 擇 語 言 為“StructuredText”;
(2)在新建的Add-OnInstructions 功能塊內參數與本地變量中根據輸入輸出類型創建程序變量;
(3)在“Logic”中將上述ST 程序Begin 以下復制進程序段中;
(4)編譯運行。
從程序復制編譯后可見,AB PLC 由于數據結構的關系,其對數據類型是隱形強制轉換,故在程序中出現“INT_To_Real”函數在AB PLC 中無法識別,將函數去除后程序編譯運行正常。
3.1.1 存在問題
針對上述AB、施耐德及西門子(TIA 系列)三種品牌PLC 控制器在結構文本支持上的相異點,功能程序塊在此三種PLC 控制器間移植存在問題如下:
3.1.1.1 Bool 的表達方式
AB PLC 對Bool 量的結果表示為“0”與“1”,“True”與“False”的表示方法被編譯器認為是非法的,但是在施耐德與西門子(TIA 系列)PLC 中兩種表示方法均被接受。
3.1.1.2 變量的引用方式
AB 與施耐德PLC 在結構文本中對變量的引用是直接字符表達方式,而西門子(TIA 系列)在結構文本中對于全局變量使用引號“""”對于局部變量加“#”前綴表示。
3.1.1.3 浮點數書寫方式
AB 與西門子(TIA 系列)PLC 控制器,浮點數可以寫成整數形式,編譯器可根據變量定義的類型自主轉換,而施耐德PLC則必須寫成浮點數形式。
3.1.1.4 單行注釋的使用
在AB 與西門子(TIA 系列)PLC 中,“//”的單行注釋語句可以使用,而在施耐德PLC 中“//”注釋語句被編譯器認為是非法的。
3.1.2 解決方法
為實現程序功能塊在AB、施耐德及西門子(TIA 系列)三種品牌PLC 控制器間的移植,對上述問題提出如下解決辦法:
3.1.2.1 BOOL 變量賦值避免“True”與“False”的使用,在編程中保持“0”與“1”的數值表達方式,提高程序的通用性。
3.1.2.2 功能程序塊根據IEC6113-3 標準規定的結構化文本格式使用文本文件編程,在西門子等對標準支持比較高的PLC機型中通過導入方式完成,由編譯器自主增加變量引用前綴。
3.1.2.3 浮點數標準化書寫,根據實際使用的小數位書寫浮點數。
3.1.2.4 編程過程中使用“(*…*)”對單行語句進行注釋。
根據上述對AB、施耐德、西門子(TIA 系列)三種品牌PLC的移植試驗、異同比較及解決方法提出,可知使用結構化文本ST 編程語言編制程序功能塊在不同品牌機型中移植方法,程序編寫需具備如下幾個條件:
3.2.1 變量命名的標準化
程序變量的命名應遵守匈牙利變量命名法,即變量名由字母、數字、符號組成,并以變量類型的字母開頭,變量名長度小于31 字符,避免“#”符號的使用。
3.2.2 程序注釋的標準化
程序注釋應遵守IEC 61131-3 對注釋的規定,使用“(*…*)”格式。
3.2.3 賦值方式的統一化
程序中對BOOL 量的賦值應使用“0”與“1”的數值化賦值,避免“True”、“False”的使用。
3.2.4 特型函數引用的外置化
在實際編程過程中應避免對有品牌特征的函的使用,盡量使用通用的方法實現。如果是在編程中實現無法規避的函數,需在通用功能程序塊外完成轉換,加強程序塊的通用性。
筆者使用結構化文本語言實現了模擬量線性轉換、電機設備的手動控制、多臺水泵組合自動運行等功能程序塊在施耐德(Unity)、AB(RSLogix)、西門子(TIA)中的互相移植,實現功能程序的標準化,在排水泵站與污水處理廠等多個工程中應用,為筆者在工程調試中節省了時間。
通過筆者的工程實踐證實,使用結構化文本ST 編程語言編制程序功能塊實現PLC 程序在不同品牌機型中移植是一種可行的方法。
注釋
1百度百科“移植(科學術語)的解釋”https://baike.baidu.com/item/%E7%A7%BB%E6%A4%8D/4669209?fr=aladdin.