西門子工廠自動化工程有限公司 劉陽
隨著中國工業化進程越來越廣泛、深入,對從屬于各個工業領域的控制系統要求也越來越高,越來越精細。本文嘗試討論工業控制軟件編制的一些基本原則和基本方法。
對于所有工藝過程的控制,在編制控制軟件的過程中需要圍繞下列目標進行:
(1)滿足工藝過程或流程;
(2)保證人員設備安全;
(3)完備的故障診斷;
(4)現場調試維護方便;
(5)軟件拓展性。
為了保證控制軟件能達到以上目標,軟件的規范化和標準化是必要的途徑。
毋庸置疑,任何工業軟件都是為了滿足特定的工藝要求設計、編制的。比如,
一套控制高爐的DCS程序要滿足管理高爐及附屬設施的要求;要滿足高爐特定工藝流程的要求。
一套工業起重機的控制程序要滿足管理起重機各個機構的要求;要滿足各個機構連鎖要求;要滿足起重機的各種標準要求。
再比如,冶金系統中的帶鋼處理線,應該滿足開卷、卷曲工藝、活套工藝、處理工藝等要求。
在工業軟件的編程原則中。滿足工藝過程的控制是編程原則中最低要求。
由于控制工藝千差萬別,在本文中不著重討論。
這里略微討論一下不同領域的工業過程編程時的相似性。
雖然各個工業領域有著完全不同的控制對象、控制方法和控制策略,控制軟件也不盡相同。但在編制工業軟件的過程中還發現存在著另外一種現象,就是有些不同行業的工藝看似毫無關系,但究其本質是很相似的,這些相似系統的控制軟件也有相似性。在編程相似系統時可相互參照或者直接照搬,但要考慮差異。以下舉例說明。
2.1.1 例1:起重機和鉆機起升機構的手柄處理
起重機和石油鉆機都有起升機構。操作人員通常使用手柄對這兩種設備的起升機構實現操控。軟件處理這兩類起升機構手柄的程序有相同之處,也有不同之處。
相同點:
手柄推出角度與起升機構的速度呈現一定關系,通??梢蕴幚頌閮绲年P系。
不同點:
在起重機中,手柄向前推,吊鉤向下運行,手柄向后拉,吊鉤向上運行。
在鉆機中,手柄向前推,吊鉤向上運行,手柄向后拉,吊鉤向下運行。
引起這種差異的原因是司機室的位置不同。絕大多數起重機的司機室在上方,而石油鉆機的司機室在下方。但他們有相似處就是,手柄向前推,大勾向遠離操作者的方向運行,手柄向后拉,大勾向著靠近操作者的方向運行。雖然有差異,但都是符合人體工程學原理,讓操作者感覺操作順暢、自然。
如果編程者手中掌握了起重機手柄處理程序。那么很自然的,將這個程序稍加改動后,就可以應用到石油鉆機行業。
2.1.2 例2:船舶混合動力推進與鋼鐵行業-帶鋼控制-活套
混合推進:
在水中航行的船舶由螺旋槳推進。傳統推進方式是采用柴油機經過減速箱直接帶動螺旋槳從而推動船舶航行。隨著大功率變頻系統的應用和技術進步。目前可以采用電機帶動螺旋槳的方式推進船舶,被稱為船舶電力推進。在電力推進中,有一種推進方式是混合推進方式。柴油機和電機通過減速箱共同推進螺旋槳。在此推進方式中又分為兩種操作模式PTI和PTO。第一種方式,電機吸收柴油機功率,并將吸收的功率輸出到船用電網,達到節能的效果。第二種方式,電機輸出功率與柴油機共同帶動螺旋槳,達到增加推進功率的目的。
活套控制:
在冶金行業,帶鋼控制在很多工藝流程中都需要?;钐卓刂剖菐т摽刂浦泻苤匾囊画h?;钐坠に嚳梢宰鳛閹т撛谌肟陂_卷和出口卷曲之間的緩沖帶。活套時而吸收帶鋼,時而釋放帶鋼以達到平衡帶鋼在入口和出口的速度差。在活套吸收帶鋼時,活套電機向外輸出能量,在釋放帶鋼時,活套電機向電網輸出電能。
這兩種工藝看似從屬于不同的工業領域,但實現方法是相似的。在大家熟知的驅動雙閉環控制策略中,都可以通過使速度環飽和,進行轉矩限制或者功率限制的編程方式實現活套或者混合推進的工藝要求。
從這兩個例子可以得到啟示,雖然很多領域整體的控制對象不同,工藝過程迥異,但不同工藝過程中的子過程時而極其相似。
對于任何工藝過程,人員和設備的安全性都是最重要的。
在工業控制軟件中,安全的概念,需要貫徹編程和調試的始終。
2.2.1 例1:2012.7.23 甬溫線動車組事故
下面是官方發布的7.23 甬溫線動車組事故原因分析。
“當溫州南站列控中心采集驅動單元采集電路電源回路中保險管F2遭雷擊熔斷后,采集數據不再更新,錯誤地控制軌道電路發碼及信號顯示,使行車處于不安全狀態。雷擊也造成5829AG軌道電路發送器與列控中心通信故障,使從永嘉站出發駛向溫州南站的D3115次列車超速防護系統自動制動,在5829AG區段內停車。因軌道電路發碼異常,司機三次轉目視行車模式起車受阻,7分40秒后才轉目視行車模式以低于20公里/小時的速度向溫州南站緩慢行駛,未能及時駛出5829閉塞分區。因溫州南站列控中心未能采集到前行D3115次列車在5829AG區段的占用狀態信息,使溫州南站列控中心管轄的5829閉塞分區及后續兩個閉塞分區防護信號錯誤地顯示綠燈,向D301次列車發送無車占用碼,導致D301次列車駛向D3115次列車并發生追尾?!?/p>
經驗表明,絕大多數事故的發生都是系統的多個安全缺陷同時出現導致的。從官方報道來看,甬溫線事故存在人為和技術兩個層面的缺陷才造成這么重大的事故。讓我們來探討一下其中的技術缺陷:對于高速鐵路“閉塞區”這么重要的信號系統,應該至少采用2種以上工作機制不同的閉塞信號系統。即使有一套信號系統故障,由于另一套系統采用與故障系統不同的工作機制,第二套系統在相同狀態下故障的可能性很低。這樣可以保證系統的安全性。
2個編程問題。
第一個編程問題在于,系統異常情況下,不能順暢的人為干預進入目視行車模式。這個問題,后面敘述“解鎖”概念時詳細說明。第二個編程問題在于該信號系統的編程者沒有建立“故障安全”的編程概念和編程思路。這里引出“故障安全”的概念。“Fail-safe”這個詞是我們熟知的一個詞匯。該詞匯的全稱為“故障導致安全”、“Fail to safe”。這一重要原則不僅應該在硬件設計上體現,也應該體現在軟件編程中。在甬溫線例子中,雷擊造成的通訊故障本應該導致信號系統自動進入安全狀態。具體講,當程序發現通訊故障后,應自動將“5829閉塞區及相鄰閉塞區置為有列車存在”。而悲劇在于當通訊故障后,程序并未將相鄰的“5829閉塞區置為有列車存在”。后車收到該5829閉塞區無列車信號后,以正常高速前進與前車發生追尾,釀成悲劇。
另一例事故與甬溫線編程缺陷類似,如下。
2.2.2 例2:某柴油機生產廠家老8號測試臺火災
在某知名柴油發動機生產廠老8號測試臺上,由于軟件考慮欠缺,導致火災,幸未造成人員傷亡。
柴油機測試臺是由測試儀器、控制系統、變頻器、變頻電機及相連的柴油機組成。而新上的老8號測試臺要求包含動態(ETC)測試功能。動態測試的要求是:根據相關標準測試臺在30分鐘內不停地變換轉矩和轉速用以測試柴油機是否達到排放標準的測試。以往我國這種測試臺都采用全盤進口方式。老8號測試臺是第一套中國人擁有完全自主知識產權的ETC測試臺。在整個調試過程中,包括ETC功能在內的所有功能均工作良好,未發現問題。但某夜此測試臺出現著火事故。
經分析發現。由于增加了ETC功能,此測試臺較之以往測試臺增加了驅動系統中的高速處理板,用以快速處理轉速和轉矩PID調節。此處理板內部包含CPU。雖然在當晚工作結束后,操作工將控制系統的電源斷開,但未斷開驅動系統的電源。導致此快速處理板和驅動系統仍就工作。變頻器仍在以極其小的轉矩驅動電機。但因為轉矩太小,無法克服摩擦,從感官看,電機未轉動。操作人員以為系統已經停機,隨即離開。但該CPU內的一個積分器經過長時間緩慢積分,電機輸出的轉矩最終突破靜摩擦閥值,使電機運轉。而直連軸的柴油機內部潤滑油已經排出,致使柴油機無潤滑轉動,導致內缸過熱引燃附近易燃物造成火災。
事故原因在于項目增加了一個帶有CPU的控制板。在編程此控制板時未考慮通訊中斷后觸發安全動作,造成事故。修復方法:應將該CPU板與控制系統的通訊中斷作為變頻器停機的充分條件。
2.2.3 復雜系統與簡單系統
筆者強調復雜系統是因為復雜系統與簡單系統不同。簡單系統,即使程序有問題,也不會產生嚴重后果,請看如下實例。
驅動系統主從控制的2個例子刨析簡單系統與復雜系統在安全性方面重要區別
起重設備4臺提升電機主從同步,與盾構機12臺鉆進電機主從同步。
初看,12臺鉆進電機的控制對象多,顯得復雜。其實不然。
從小尺度角度講,盾構機是水平方向鉆進,即使沒有主從控制和故障安全的處理程序,在鉆進機構故障的情況下,也不會產生嚴重后果,最多造成故障停機,耽誤工程進度。而大型起重機的起升機構額定載荷可以達到幾千噸。如果程序有瑕疵最嚴重時將導致重物失控下墜,造成嚴重后果。
所以,較之盾構機的鉆進機構,起重機和鉆機的起升機構更復雜。
通過上面幾個實例,就可以知道工業軟件的安全性是很重要的。如果說,我們發現辦公軟件經常出現一些小問題,那不會造成嚴重后果。但工業控制軟件就完全不一樣了。如果由于程序工程師在編程時未考慮周到造成現場人身事故,那將是難以承受的事情。所以,工業軟件最重要的問題是安全問題。筆者認為,寧可讓被控對象不動,也不要不安全的亂動;寧可讓被控對象安全的生產次品,也不能不安全的生產正品;寧可在物料上安全的浪費,也不能不安全的冒險運行??傊?,人的安全最重要。
如果工業控制軟件實現了工藝要求和安全功能,那么這個工藝過程是可以運行的。其中的控制軟件也算及格,但離好程序的標準還有差距。
一套復雜系統的工業軟件至少還應該有如下考慮。
2.3.1 規范化和標準化
規范化標準化的軟件帶來如下好處:
(1)軟件拓展性強
幾乎每個項目都會發生這樣的事情。最初按照工藝要求編制好的程序,到現場調試階段發現需要增加一些新功能。那么用標準化和規范化原則編制的軟件通過調用一些標準程序,很容易實現新功能。編程者不用在現場絞盡腦汁進行從底層開始的編程。
(2)不同的工藝過程可以使用大量相同的子程序
即使是相距甚遠的工藝過程,它們也可以使用大量相同底層子程序。比如和變頻器通訊、模擬量處理、電動閥門控制、機床刀庫管理、閉環調節、報警處理等。
(3)程序層次分明
實現程序規范化和標準化的一個方法就是將復雜過程分解成若干個子過程。再將若干個子過程再次細化為更小的若干子過程。這樣的程序層次分明,可讀性、可調試性增強。
2.3.2 現場調試維護方便
程序層次分明、充足的注釋、對象歸類都可以使現場調試方便。
一個層次分明的程序顯然比雜亂的蜘蛛網式結構的程序要容易調試。
好的注釋是使程序調試方便的一個重要方法。如果能用20%~30%的編程時間編寫注釋和說明,將會是現場調試者的福音?,F場調試者總是不怕注釋冗長,而怕注釋不夠。
將編程處理的對象歸類可以達到減少對象類型減小程序復雜性的目的,從而也有益程序調試。
好程序的特點是結構清晰,分類明顯,善于組合調用標準程序。好程序讓人讀起來有一種韻律感。
2.3.3 故障診斷
好的程序要使最終用戶容易判斷哪里有故障,從而及時的采取適當措施避免因故障導致的損失繼續擴大。
自動/手動,連鎖/解鎖,正常/異常的概念,有相似性也有不同點,往往交織在一起。
這里特別強調“解鎖、手動或者異常操作(日本的系統稱之為“非常操作”)的功能”。在編程時不能只考慮“連鎖-自動-正常”操作模式,而忽略“解鎖-手動-異?!辈僮髂J?。在許多工藝過程控制中,尤其在被控對象異常時,是非常需要人為干預工藝過程的。圖1是DCS系統中手動解鎖后人工干預系統輸出的畫面。
2.4.1 例1:甬溫線事故
甬溫線事故暴露出這方面的問題。如上面的官方分析。前車司機發現信號系統故障后,3次嘗試將列車改為目視行車模式但都失敗,到第四次才成功。這是典型的系統軟件設計缺陷。本例中,目視行車模式相當于手動、解鎖、異常的操作模式。在自動/手動、連鎖/解鎖、正常/異常的操作模式中,只要系統探測到人為申請進入手動、解鎖、異常操作模式的動作,那么除非是在極其特殊的情況下,系統需要判斷是否有誤操作以外,都應該優先讓系統進入手動、解鎖、異常的操作模式。解決誤操作方法是讓操作者多次確認。一旦確認,系統就應該毫無保留的為人為干預留出接口,給操作者處理異常情況留出足夠的操作空間和操作權限。
2.4.2 例2:DCS PID 自動/手動轉換
所有DCS產品的PID調節器都包含自動和手動操作模式,并且是無擾切換。PID的手動控制就體現“手動/解鎖/異?!辈僮髂J降木?。
2.4.3 例3:船級社規范中描述的“越控”功能
在船用設備某些特定的功能中,各國的船級社都強制要求必須包含“越控”功能。所謂“越控”功能,就是類似“解鎖”的操作模式,這也體現了“手動/解鎖/異?!辈僮髂J酱嬖诘谋匾?。
2.4.4 例4:汽車組裝線

圖1 DCS系統中手動解鎖后人工干預系統輸出的畫面
汽車組裝線是一個長達數百米的連續生產線。通常情況是組裝線承載產品以緩慢速度前行。未組裝完全的汽車在組裝線上的各個工位進行組裝。出現異常情況時,各個工位都可以“暫?!鄙a線,以便操作者進行故障處理。
好的程序是有層次感的。層次多的程序可以處理復雜邏輯。層次少的程序只能處理簡單工藝問題。人們應摒棄從輸入點做邏輯直接輸出的編程方式,這種編程方式沒有中間層,編程要有層次感,因為有層次的程序可以帶來諸多好處。
程序層次主要包括2個含義:程序結構有層次和在輸入和輸出之間帶有特定意義的中間層變量。
要解決一個復雜的工藝過程,首先,需要分解一個復雜的過程。把復雜過程合理分為多個簡單子過程。合理劃分各個過程和子過程的關鍵是找到這些簡單任務之間的明確界限,界定清楚后,就可以封裝這些簡單子過程。
其次,針對各個子過程進行編程。此時就不要考慮太多其他層級的過程,而是專心研究和琢磨如何實現這個過程的編程。這樣使思路十分清晰,編程也變得輕松。
編制工業程序就是將總過程分解為若干子過程。子過程中又可以分解為若干層級更低的子過程。直到將子過程分解到十分容易編程或者是在現有庫中找到相應子程序為止。
在新編程一個子過程(子程序)時,要考慮預留,保證子程序的拓展性。就是說,雖然這個子過程是為了完成上層任務而開發的,但仍要考慮其他任務調用此子過程的可能性??紤]子過程的通用性就必然會加強子過程的拓展性。
以上就是所謂的程序的層次性。隨著程序的層次的增加,中間變量自然就有層次了。
下面舉例說明編程層次。
2.5.1 例1:某知名車廠總裝線變頻控制提升機
Integra標準是SIEMENS為全球各地的奔馳轎車組裝線開發的PLC程序標準,但該標準沒有SIEMENS MD型號變頻器驅動程序,為此,筆者開發了與integra標準接口的MD變頻器驅動程序FC690。
起初開發FC690是為了實現整車升降臺的控制工藝。但在FC690中并不關注所控制的變頻器到底是驅動升降臺還是輥道。FC690的上級程序根據工藝要求和連鎖條件對FC690接口信號進行設定從而控制輥道或者升降臺。在編程FC690時編程者只關心與變頻器的接口,不關心控制對象。而上層程序只關心所控制對象,不關心如何控制變頻器。這個例子顯示了程序層次和封裝的重要。
另外,開發完這個子程序,還有2個步驟需要進行:全面的測試和編寫完整的使用文檔。
2.5.2 例2:CP300絞車電機選擇相關功能
在中石油自主開發的第一套300英尺樁腿式海上石油鉆井平臺中,4臺絞車變頻電機的控制任務是一個復雜任務。該任務要求,4臺電機中以任意數量、任意組合方式驅動絞車運行。為了達到這個控制任務,可以將這個復雜任務分解為若干層次的子任務加以實現。
(1)“電機選擇”子程序。選擇任意4臺電機。每一臺電機調用一次子程序。調用結束,就得到該電機“被選擇”和“被激活”的2個中間層變量。上層程序共調用4次該子程序,就得到了4臺電機中哪一臺或哪幾臺電機被使用的信息。
被選擇的意義是,選擇了該電機驅動絞車,但不一定使用絞車;被激活的意義是選擇了該電機驅動絞車,并且使用絞車。每一臺電機的“被選擇”和“被激活”是垂直關系,而每一臺電機都有“被選擇”和“被激活”的中間層次,不同電機的“被選擇”層次是橫向關系,同樣不同電機的“被激活”層次也是橫向關系。
有了這2層,程序其它部分會大量引用這2個層次的8個中間結果。
(2)“主電機選擇”子程序。子程序必須判斷在若干被選擇的電機中哪一臺電機作為其中的主電機。判斷主電機的目的是為了在后續程序中做主-從控制,保證多臺電機輸出的轉矩相同。
(3)“選擇主電機信息作為絞車整體的狀態反饋”子程序,FC1020 (Arear_Switch)。
起初,FC1020是為2007年出口匈牙利鉆機機開發的,用于2臺電機的選擇。但當時考慮到日后可能會用于4臺電機,所以在封裝FC1020時就多預留出2臺。隨著鉆機設備的升級,目前就出現了4臺絞車的情況,很自然,就用到了4年前開發的FC1020。不用做任何修改,直接引用,減少了編程時間和調試時間,顯示了程序可拓展性的重要性。
本例中,要實現控制4臺變頻電機的任務,需要6次調用3個子程序。在各個子任務之間有橫向聯系也有縱向聯系,編程每個子程序都不難,甚至從庫中直接調用,不用編程。將這些子程序聯系起來的是從子程序中得到的中間變量。有了這些中間變量,再調用變頻器的接口程序,就可以很好的控制絞車的4臺電機。
這兩個實例,展示了好的程序層次極其重要,它往往可以簡化編程工作。
在自動化設備投入運行后,可能會出現各種故障。完備的故障診斷是最終用戶所需要的。故障診斷一般分為系統故障(電氣、PLC信息和故障)和過程故障(如超溫報警)。系統故障需要電氣自動化人員處理,過程故障需要設備操作人員處理。
如果將2個數字量和一個模擬量作為一個基本對象(Basic Object),簡單外部設備看作一個BO,如泵類負載變頻器、電機起動器、復雜外部設備看作2~3個BO,如帶位置反饋的電動閥門、帶有轉矩控制的變頻器等。
通常程序提供的診斷數量不應小于該項目BO數量的1.5~2倍,這樣的診斷數量可以稱為比較完備的診斷。
巧用變址尋址可以簡化程序處理。筆者曾用一臺PLC處理276臺智能電機起動器。
子程序“SimocodeCOM”,FC769,建立從智能電機啟動器到電機啟動器數據庫(“SimocodeCOM_DB”,DB769)的連接。
子程序“MCC_1”,FC761,“MCC_2”,FC762,建立從軟件其他部分和人機界面到電機啟動器數據庫的連接。如圖2所示。

圖2 處理電機啟動器程序-數據結構圖
在FC769中多次調用了標準子程序處理智能電機啟動器FC1024“STD_SimocodeCOM”。這個子程序是處理算法相同的智能起動器。FC1024內部主要結構是一個循環體。循環次數在輸入參數Max_Index中定義。在循環體內使用了變址尋址的方式處理數據。圖3是一次批處理19個智能起動器的例子。

圖3 一次批處理19個智能起動器
只要在FC769中調用若干次FC1024,就可以處理整個系統所管理的上百個電機啟動器。
在本例,若不采用變址尋址的方式編程,而采用逐一對上百個電機起動器編程的方式,那程序量將會成倍增長,程序處理時間也會增加很多,適當使用變址尋址可簡化程序處理。
2.8 HMI
這里講的HMI(Human Machine Interface)是廣義HMI,不僅包括屏幕,也包括按鈕、指示燈和顯示儀表。
設計和編程HMI系統要注意以下3個原則。
2.8.1 原則1:系統處于的狀態需要表達清楚
程序工程師必須使操作人員或者維護人員通過HMI界面明白系統處于何種狀態。
2.8.2 原則2:聚焦操作人員的想法
程序工程師必須使操作人員或者維護人員不偏離系統預設的操作或步驟。
2.8.3 原則3:操作簡單直觀
程序工程師必須使操作人員或者維護人員對工藝過程易于操作。甬溫線前車司機多次嘗試更改列車模式失敗,就是一個反例。大概是由于更改操作模式的方法并不簡單、并不直觀,也沒有必要的操作提示。
程序就是算法對數據的操作。工業控制軟件也是如此,常用的控制程序語言包括梯形圖、語句表、SCL語言(類PASCAL)、CFC、SFC。
可以證明,所有邏輯運算都可以用“與”“或”“非”邏輯等效替換。就是說以上所有語言都可以實現邏輯控制,那為什么還有這么多種語言呢。原因就在于方便程序調試,方便程序拓展。
如順序控制SFC。完全是邏輯運算,但為了使順序控制更貼近人類的思維,為了方便程序調試、拓展和維護,很多工業軟件都特別包括順序控制,筆者曾用簡單邏輯運算搭建過一個稱重和配料的順序控制系統。結果表明,完全可以實現。但程序難以理解,不便調試,不便拓展和維護,更不便其他人員維護。
每一種語言都有各自的特點,這也是每種語言自身存在的價值。
邏輯運算為主的以梯形圖為好,直觀,調試方便。
簡單運算和變址尋址往往采用語句表。
高級語言。不關注執行的具體細節,而直接關注運算或者方法。復雜算法的程序用這種語言為好。同時,SCL具有數組類型可以實現簡單變址尋址功能。
在老8號動態測試臺的例子中,PLC將1800秒內產生的3組轉矩和轉速信號共10800個數據按照有關標準算法進行計算,得到本次測試是否符合要求的判據,這就用到了大量的運算功能,采用的就是SCL語言。

圖4 CFC連續控制圖
直接面向信號流程或者過程流程控制的,采用CFC控制。所有DCS系統,都支持CFC編程。鋼鐵行業中帶鋼控制,船舶電力推進的程序處理,電機驅動控制中雙閉環調節等都可采用CFC語言處理。

圖5 SFC順序控制圖
帶有鮮明的順序執行的特征。SFC控制一個過程按程序一步一步執行,并可以通過條件向其它步驟跳轉。比如,稱重配料過程、帶鋼控制中的自動上卷、CDQ工業吊車自動執行程序等。SFC編程關注3個因素。第一,步驟。就是被控對象所處的狀態;第二,動作。在一個步驟下可以執行一個或多個動作;第三,跳轉條件,在各個步驟之間轉換的條件。
工業控制軟件不僅觸及工業生產領域,也觸及人們生活的各個領域,和人們生活密切相關,比如機場行李傳送系統,集中采暖鍋爐控制系統等。工業軟件在各個領域大量應用的過程中,程序工程師們也編制了大量的控制程序。隨著這些程序的積累,工程師們總結歸納了工業軟件編制的一些特點。這些特點也決定著工業軟件越來越向著高級化的方向發展。工業軟件編程的趨勢是編寫很多子程序、子過程,將它們管理在庫中。需要控制哪些過程,就調用相應的子程序完成對該過程的控制,這與目前的編程方式不同。目前編程人員必須同樣關注程序底層的內容和底層的過程,而工業控制軟件發展趨勢是試圖使編程人員從繁冗的底層編程中解放出來。