胡貞斌
(上海電器科學(xué)研究所(集團(tuán))有限公司,上海200063)
當(dāng)前工業(yè)控制現(xiàn)場(chǎng),可編制程序控制器PLC 大行其道,各種品牌百花齊放??刂七^程中許多程序功能相同,可繼承與復(fù)用,但由于控制器PLC 的更換,編程人員不得不多次翻譯式的重新編寫與調(diào)試。由于編程人員業(yè)務(wù)水平及編程思路的差異,使得同樣功能存在不同程序表達(dá),阻滯了程序標(biāo)準(zhǔn)化與知識(shí)延續(xù)的發(fā)展,隔斷了優(yōu)秀程序算法的繼承,同時(shí)也給維護(hù)者帶來程序識(shí)讀障礙,造成時(shí)間浪費(fèi)。
為解決此類問題,對(duì)程序功能塊在不同品牌PLC 控制器機(jī)型間的移植實(shí)現(xiàn)方法的需求變得尤為迫切。
程序移植的定義“軟件工程中,程序往往被視為有生命的機(jī)體,將源代碼從一種環(huán)境下放到另一種環(huán)境下運(yùn)行也可以稱之為移植?!?程序移植需具備如下幾個(gè)特征:
1.1.1 源代碼具備可復(fù)制性;
1.1.2 源代碼具備通用可識(shí)性,更換環(huán)境后可運(yùn)行。
根據(jù)IEC61131-3 對(duì)PLC 編程語言的規(guī)定,PLC 控制器適用圖形與文本兩類語言。
梯形圖LD、功能塊圖FBD 及順序功能SFC 三種編程語言均強(qiáng)調(diào)圖形的繪制,復(fù)制性欠佳,故使用圖形語言編制的程序在不同品牌PLC 間不可移植。
指令表IL 編程語言屬于文本語言,代碼具備可復(fù)制性,但是IL 為類匯編語言,為程序執(zhí)行效率計(jì),程序編程對(duì)PLC 硬件地址依賴性很強(qiáng),程序移植的通用可識(shí)性欠佳。
結(jié)構(gòu)文本ST 為類PASCAL 的語言,所使用的語句與關(guān)鍵詞符合高級(jí)語言的規(guī)定,多種PLC 機(jī)型均可識(shí)別并運(yùn)行,故ST語言同時(shí)滿足程序移植的復(fù)制性與通用可識(shí)性的特征。
據(jù)此提出使用結(jié)構(gòu)文本ST 編程語言編制程序功能塊實(shí)現(xiàn)PLC 程序在不同品牌機(jī)型中移植的方法。
當(dāng)下工業(yè)現(xiàn)場(chǎng)工作中的PLC 機(jī)型多數(shù)均支持IEC61131-3標(biāo)準(zhǔn),現(xiàn)選用過程控制中出現(xiàn)頻次較高的美國(guó)AB ControlLogix1756-L71、法國(guó)施耐德M580 系列CPUeP582020、德國(guó)西門子S7-300 系列CPU315 作為程序移植方法實(shí)現(xiàn)的研究對(duì)象。
本文以模擬量線性轉(zhuǎn)換功能塊的復(fù)制展現(xiàn)PLC 程序移植過程。
模擬量線性轉(zhuǎn)換的算法公式為:
其中:
Y:儀表所表示的物理量真實(shí)值;
X:儀表所對(duì)應(yīng)的PLC 模擬量輸入模塊通道轉(zhuǎn)換的數(shù)字值;
Metermax:儀表所對(duì)應(yīng)的物理量量程最大值;
Metermin:儀表所對(duì)應(yīng)的物理量量程最小值;
Inputmax:PLC 模擬量模塊模數(shù)轉(zhuǎn)換可轉(zhuǎn)換數(shù)字量最大值;
Inputmin:PLC 模擬量模塊模數(shù)轉(zhuǎn)換可轉(zhuǎn)換數(shù)字量最小值;
2.2.1 程序變量定義
序號(hào) 功能類型 變量名稱 數(shù)值類型 說明1 輸入 AI-Input INT 模擬端口輸入值,對(duì)應(yīng)公式中的X 2 輸入 r-MeterMax Real 儀表最大值(物理值量程)3 輸入 r-MeterMin Real 儀表最小值(物理值量程)4 輸入 I-ModelMax INT 模塊最大值(數(shù)字值量程)5 輸入 I-ModelMin INT 模塊最小值(數(shù)字值量程)6 輸入 r-HH-Alarm-Set Real 超高報(bào)警限值7 輸入 r-LL-Alarm-Set Real 超低報(bào)警限值8 輸入 r-H-Alarm-Set Real 高報(bào)警限值9 輸入 r-L-Alarm-set Real 低報(bào)警限值10 輸出 r-MeterValue Real 儀表實(shí)際物理值,對(duì)應(yīng)公式中的Y 11 輸出 b-HH-Alarm Bool 超高報(bào)警12 輸出 b-LL-Alarm Bool 超低報(bào)警13 輸出 b-H-Alarm Bool 高報(bào)警14 輸出 b-L-Alarm Bool 低報(bào)警15 輸出 b-Max-Aalrm Bool 儀表上溢報(bào)警16 輸出 b-Min-Alarm Bool 儀表下溢報(bào)警
2.2.2 功能程序表述
2.2.2.1 首先根據(jù)ST 語言語法使用文本文件創(chuàng)建程序,如下:
2.2.2.2 西門子PLC S7-300 CPU315 的程序表述
將上述文本起始增加“FUNCTION "Analog" : Void{S7_Optimized_Access := 'FALSE' }VERSION : 0.1”在文件結(jié)尾增加“END_FUNCTION”,以ANSI 編碼保存為“*.SCL”文件。
在西門子編程軟件TIA Portal 中以“外部源文件”導(dǎo)入,使用“從源生成塊”功能,編寫的ST 程序成功導(dǎo)入,可運(yùn)行。
導(dǎo)入成功的文件有如下特點(diǎn):
西門子PLC 編譯器對(duì)局部變量的引用采用“#”作為前綴;
為保證導(dǎo)入中文注釋可讀,文件應(yīng)以ANSI 編碼保存。
2.2.2.3 施耐德M580 eP580 2020 的程序表達(dá)與導(dǎo)入
施耐德M580 系列使用Unity Pro XL 軟件編程,軟件導(dǎo)入文件支持“*.xdb”類型,其可使用文本文件編輯,但是其在變量描述部分為XML 的描述語言,不符合ST 語言的結(jié)構(gòu),對(duì)于創(chuàng)建的ST 結(jié)構(gòu)文本程序改動(dòng)較大,故在程序移植過程中選用變量在編程軟件中定義,程序邏輯語句復(fù)制粘貼的方式進(jìn)行。
創(chuàng)建步驟如下:
(1)創(chuàng)建DFB 并命名;
(2)將上述各變量在輸入、輸出相應(yīng)位置定義;
(3)在DFB 段中增加程序并選擇語言為ST;
(4)將上述ST 程序Begin 以下復(fù)制進(jìn)程序段中;
(5)編譯執(zhí)行;
編譯過程中發(fā)現(xiàn),施耐德PLC 編譯器對(duì)于“//”的單行注釋認(rèn)為是非法的。
2.2.2.4 AB ControlLogix1756-L71 CPU 的程序表述
AB ControlLogix1756-L71CPU 使用RSLogix5000 軟件進(jìn)行編程,其對(duì)于程序?qū)胛募愋蜑椤?.L5X”,可使用文本文件編輯,但是其對(duì)于變量定義及程序均使用XML 結(jié)構(gòu)描述,如使用已編寫好的結(jié)構(gòu)文本程序更改,工作量大且無法保證正確,故AB PLC 采用與施耐德PLC 類似的編程方式,在編譯器內(nèi)定義變量,邏輯程序通過文本復(fù)制方式粘貼進(jìn)入編譯運(yùn)行。
創(chuàng)建步驟如下:
(1) 新 建“Add-OnInstructions” 并 選 擇 語 言 為“StructuredText”;
(2)在新建的Add-OnInstructions 功能塊內(nèi)參數(shù)與本地變量中根據(jù)輸入輸出類型創(chuàng)建程序變量;
(3)在“Logic”中將上述ST 程序Begin 以下復(fù)制進(jìn)程序段中;
(4)編譯運(yùn)行。
從程序復(fù)制編譯后可見,AB PLC 由于數(shù)據(jù)結(jié)構(gòu)的關(guān)系,其對(duì)數(shù)據(jù)類型是隱形強(qiáng)制轉(zhuǎn)換,故在程序中出現(xiàn)“INT_To_Real”函數(shù)在AB PLC 中無法識(shí)別,將函數(shù)去除后程序編譯運(yùn)行正常。
3.1.1 存在問題
針對(duì)上述AB、施耐德及西門子(TIA 系列)三種品牌PLC 控制器在結(jié)構(gòu)文本支持上的相異點(diǎn),功能程序塊在此三種PLC 控制器間移植存在問題如下:
3.1.1.1 Bool 的表達(dá)方式
AB PLC 對(duì)Bool 量的結(jié)果表示為“0”與“1”,“True”與“False”的表示方法被編譯器認(rèn)為是非法的,但是在施耐德與西門子(TIA 系列)PLC 中兩種表示方法均被接受。
3.1.1.2 變量的引用方式
AB 與施耐德PLC 在結(jié)構(gòu)文本中對(duì)變量的引用是直接字符表達(dá)方式,而西門子(TIA 系列)在結(jié)構(gòu)文本中對(duì)于全局變量使用引號(hào)“""”對(duì)于局部變量加“#”前綴表示。
3.1.1.3 浮點(diǎn)數(shù)書寫方式
AB 與西門子(TIA 系列)PLC 控制器,浮點(diǎn)數(shù)可以寫成整數(shù)形式,編譯器可根據(jù)變量定義的類型自主轉(zhuǎn)換,而施耐德PLC則必須寫成浮點(diǎn)數(shù)形式。
3.1.1.4 單行注釋的使用
在AB 與西門子(TIA 系列)PLC 中,“//”的單行注釋語句可以使用,而在施耐德PLC 中“//”注釋語句被編譯器認(rèn)為是非法的。
3.1.2 解決方法
為實(shí)現(xiàn)程序功能塊在AB、施耐德及西門子(TIA 系列)三種品牌PLC 控制器間的移植,對(duì)上述問題提出如下解決辦法:
3.1.2.1 BOOL 變量賦值避免“True”與“False”的使用,在編程中保持“0”與“1”的數(shù)值表達(dá)方式,提高程序的通用性。
3.1.2.2 功能程序塊根據(jù)IEC6113-3 標(biāo)準(zhǔn)規(guī)定的結(jié)構(gòu)化文本格式使用文本文件編程,在西門子等對(duì)標(biāo)準(zhǔn)支持比較高的PLC機(jī)型中通過導(dǎo)入方式完成,由編譯器自主增加變量引用前綴。
3.1.2.3 浮點(diǎn)數(shù)標(biāo)準(zhǔn)化書寫,根據(jù)實(shí)際使用的小數(shù)位書寫浮點(diǎn)數(shù)。
3.1.2.4 編程過程中使用“(*…*)”對(duì)單行語句進(jìn)行注釋。
根據(jù)上述對(duì)AB、施耐德、西門子(TIA 系列)三種品牌PLC的移植試驗(yàn)、異同比較及解決方法提出,可知使用結(jié)構(gòu)化文本ST 編程語言編制程序功能塊在不同品牌機(jī)型中移植方法,程序編寫需具備如下幾個(gè)條件:
3.2.1 變量命名的標(biāo)準(zhǔn)化
程序變量的命名應(yīng)遵守匈牙利變量命名法,即變量名由字母、數(shù)字、符號(hào)組成,并以變量類型的字母開頭,變量名長(zhǎng)度小于31 字符,避免“#”符號(hào)的使用。
3.2.2 程序注釋的標(biāo)準(zhǔn)化
程序注釋應(yīng)遵守IEC 61131-3 對(duì)注釋的規(guī)定,使用“(*…*)”格式。
3.2.3 賦值方式的統(tǒng)一化
程序中對(duì)BOOL 量的賦值應(yīng)使用“0”與“1”的數(shù)值化賦值,避免“True”、“False”的使用。
3.2.4 特型函數(shù)引用的外置化
在實(shí)際編程過程中應(yīng)避免對(duì)有品牌特征的函的使用,盡量使用通用的方法實(shí)現(xiàn)。如果是在編程中實(shí)現(xiàn)無法規(guī)避的函數(shù),需在通用功能程序塊外完成轉(zhuǎn)換,加強(qiáng)程序塊的通用性。
筆者使用結(jié)構(gòu)化文本語言實(shí)現(xiàn)了模擬量線性轉(zhuǎn)換、電機(jī)設(shè)備的手動(dòng)控制、多臺(tái)水泵組合自動(dòng)運(yùn)行等功能程序塊在施耐德(Unity)、AB(RSLogix)、西門子(TIA)中的互相移植,實(shí)現(xiàn)功能程序的標(biāo)準(zhǔn)化,在排水泵站與污水處理廠等多個(gè)工程中應(yīng)用,為筆者在工程調(diào)試中節(jié)省了時(shí)間。
通過筆者的工程實(shí)踐證實(shí),使用結(jié)構(gòu)化文本ST 編程語言編制程序功能塊實(shí)現(xiàn)PLC 程序在不同品牌機(jī)型中移植是一種可行的方法。
注釋
1百度百科“移植(科學(xué)術(shù)語)的解釋”https://baike.baidu.com/item/%E7%A7%BB%E6%A4%8D/4669209?fr=aladdin.
科學(xué)技術(shù)創(chuàng)新2021年14期