西門子自動化工業與技術研發
西門子工控機電源廠商去年對他們的電源模塊做了升級,但隨后在某現場出現了一系列的故障,工控機的電源連續損壞,因此,我們緊急赴現場進行了檢測。
我們在現場了解到,IPC的電源損壞的部件是其內部前端的保險管,由于該保險管被燒壞,導致電源模塊無法正常供電(圖1)。
這就意味著,現場可能出現過大電流。而且我們了解到,現場經常是頭一天晚上下班后,工人將現場主回路直接斷電,此時,工控機均處于開機狀態。而第二天早上,工人直接將主回路的電源合閘后,工控機直接上電,但此時就發現有的工控機不能工作了,再檢查時就發現是工控機的電源燒壞。
除此之外,該設備的每個控制柜旁邊都裝有一個空調,該空調在啟動瞬間也會產生一定的高壓脈沖干擾。同時,該空調本身還有一個控制開關,該開關在開閉過程中,也會產生高壓脈沖干擾
經過換算,在空開閉合瞬間的高頻干擾電壓幅值為4000V左右,而壓縮機啟動瞬間幅值的干擾信號幅值大概為1500V左右。
至此,我們大致得出結論,應該是現場出現過較大的沖擊電流,導致設備電源損壞。
之后,我們又進行了大量的測試,主要是針對現場的情況進行檢測,以及對電源防護措施進行了一系列的對比測試,這里就不再詳細敘述了。當然,我們也針對電源模塊本身的內部設計是否存在隱患,與電源廠家進行了溝通。廠家經過檢測,判斷現場出現大電流導致設備損壞的可能性比較大。
根據上述情況,我們在現場提出了一些建議:
1. 現場加強設備上電、斷電的規范管理,要求現場為控制柜供電的總電源不得帶負載上電、斷電。
2. 修改工控機的BIOS,將“狀態保持模式”參數項修改為“DISABLE”,即上電后,不能直接開機,而是通過IPC前部的開關按鈕進行開機操作。
3. 在IPC的電源前增加浪涌等保護設備,保證供電電源質量。
之后,經過一段時間的觀察,現場沒有再出現過電源燒壞的情況。這個Case拿出來跟大家分享,一方面是提醒我們的工控機用戶在使用西門子IPC的過程中需要注意的一些問題,另外也是提醒廣大的工程師,注意工業現場的用電規范,否則有可能導致我們的設備出現一些意想不到的情況。
1.3存儲器32位地址指針
32位地址指針用于I、Q、M、L、數據塊等存儲器中位、字節、字及雙字的尋址,32位的地址指針使用一個雙字表示,第0位~第2位作為尋址操作的位地址,第3位~第18位作為尋址操作的字節地址,第19位~第31位沒有定義,32位地址指針的格式如下:
訪問時需要使用地址存儲器標識符及32位地址指針,地址尋址表示格式為:
地址存儲器標識符 [32位地址指針],例如指針存儲于LD20中,裝載M存儲器一個字節表示為:
前面介紹的存儲器16位指針,特定用于T、C、程序塊的尋址,使用一個INT格式的值表示,每次值加1,指向的對象地址加1,例如,T1、T2,其中的“1”、“2”就是指針的直接變化(好像沒有說明白!)。32地址指針使用一個DINT格式的值表示,指向的是I、Q、M、L、數據塊等存儲器中位,每次值加1,指向的地址區位的號加1,區別就是在這里。一個字節是8個位,如果指向的是字節每次就要加8的倍數,例如地址MB[LD20],LD20值為0,則表示MB0,LD20值為8,則表示MB1,如果指向的是字每次就要加16的倍數,以此類推。
如果將32位指針按照16位指針的方式使用就會出問題,例如MB[LD20],LD值為10,指向地址為MB1.2,程序編譯沒有問題(語法正確),下載下去造成CPU停機,原因就是地址長度錯誤。在第三部分介紹定時器循環調用的示例程序中,TRIG1和TRIG2就是使用32指針迭代的,例如 A M [LD20],每次LD值加1,由于顯示的問題別屏蔽了,所以程序量還有有一點的。前面也提到了優化的問題,16位和32指針由于使用方法不同,不能簡單地合并。
32位指針也可以使用另外一種形式表示,就是使用P#X.Y,P表示指針,#表示特定符號,X表示字節地址,Y表示位地址,P#X.Y可以與DINT格式的值相互轉換,DINT值=X*8+Y,
例如P#2.0轉換DINT格式為16,P#3.1轉換DINT格式為25。在指針尋址時可以使用指針的格式也可以使用DINT格式進行運算。使用32位地址指針尋址參考下面的示例程序:
OPN DB 1 //打開DB1。
OPN DI 3 //打開DB3,最多可以同時打開兩個DB塊。
L 4 //裝載4到累加器1中。
SLD 3 //累加器1中數值左移3位,在程序中經常見到,
左移3位就是將原值乘以8
T MD 20 //將邏輯操作結果傳送到MD20中,MD20包含地址指針為P#4.0。
L P#20.0 //將地址指針P#20.0裝載到MD24中。
T MD 24
L 320 //320就是P#40.0裝載到MD28中。
T MD 28
L DBW [MD 20] //裝載DB1.DBW4。
L DBW [MD 24] //裝載DB1.DBW20。
+I //相加
L DIW [MD 28] //裝載DB3.DBW40。
-I //相減。
T DIW 2 //將運算結果傳送到DB3.DBW2中。
使用32位地址指針尋址數據塊地址時,數據塊必須先打開,然后才能尋址,數據塊尋址方法參考下面的示例程序,如果直接使用指令對完整數據格式地址(例如地址DB1.DBB[MD100])進行間接尋址被視為非法。
使用LOOP 指令與32位地址指針可以進行循環操作(這是固定的操作模式,在程序中一看到LOOP指令就要想到地址的迭代),假設一個編程應用:一個INT變量(MW2)與一個數組(假設存儲于DB1中,包含100個元素為INT的數組)存儲的值相比較,如果數值相同,指出個相同數值存儲在DB塊中的位置(數組中的位置)。使用通常的編程方法,需要逐個進行比較,程序量比較大,如果實際需要與1000個數值比較,將占用大量的存儲空間,使用LOOP指令與地址指針相結合可以輕松解決上述問題,參考下面的示例程序:
L 0 //初始化MW100和MD4。
T MW 100
T MD 4
OPN DB 1 //打開DB1。
L 100 //循環操作的次數,100次。
next: T MW 100 //將循環100次裝載到MW100中,固定格式。
L MW 2 // 進行比較的數值存儲于MW2。
L DBW [MD 4] //與DB塊中存儲的值進行比較,開始地址為DBW0。
==I //如果數值相等跳到m1。
JC m1
L MD 4 //將地址指針加2(每個相鄰的INT地址相差2)。
L P#2.0
+D
T MD 4
L MW 100 //次數減1,跳回next,如果MW100等于0,跳出
LOOP next //循環操作LOOP指令,LOOP指令固定格式。
m1: FP M 10.0 //如果數值相等,記錄MD4指針的位置,轉換
為數組的位置((地址值/P#2.0)+1)值并存儲
于MD8中。
JCN m2 //為0跳轉到m2。
L MD 4
L P#2.0
/D
+ 1
T MD 8
m2: NOP 0
地址的循環操作只是減少了程序量,CPU掃描時間不會減少。
1.4存儲器32位地址指針-S7-1500的處理方式
與16位指針的處理方式是一樣的,還是使用數組進行循環迭代。上面的應用如果在S7-1500中編寫則非常方便,示例程序參考圖11。
使用變量“START_COMP”作為開始信號,如果比較值“COMP_Value”與數組的元素“A.B["INDEX"]”不相等(INDEX缺省為0),則變量“INDEX”加1,如果大于等于100,則將“INDEX”清0,然后復位開始信號“START_COMP”;如果比較值“COMP_Value”與數組中的元素“A.B["INDEX"]”相等,則將變量“INDEX”中的值傳送到結果“RESULT”中,然后將“INDEX”清0并復位開始信號“START_COMP”。
程序比較簡單,使用LAD即可編程程序,對編程人員的要求不高,如果使用SCL編寫程序可能更加簡單