文章目錄
- 前言
- 一、功能概述
- 二、程序編寫
- 1. 需求分析
- 2. 編寫運行時間累計功能塊
- 3. 創建自定義數據類型
- 1. 時間排序數據類型
- 2. 多備多投數據類型
- 3. 多備多投切換數據類型
- 4. 編程
- 1. 創建DB數據塊
- 1. 多備多投數據塊
- 2. 多備多投切換數據塊
- 2. 創建FB功能塊
- 三、程序調用
- 總結
前言
在之前的文章中,我們討論了通過SCL語言實現電機主備互投《西門子PLC常用底層邏輯塊分享_電機主備互投》,和多臺電機按時間排序均衡運行《電機主備互投功能優化_多臺設備均衡運行》的方法。
但實際現場中,經常會遇見4用1備、3用2備、2用2備、2用3備等復雜情況,如果對每種情況分別編程,會使程序過于冗雜,故本文提供一種多備多投的實現方法,假設現場有5臺水泵,可根據現場要求,自由選擇主動泵數量和備用泵數量,實現主備泵自由切換。
一、功能概述
假設有5臺水泵,5臺水泵的運行邏輯如下:
- 具有以下幾種情況:4用1備、2用2備、2用3備、3用2備、1用1備、1用4備等任意組合;
- 主泵同時啟動,觸發切換命令后,按照運行時間由小到大的順序切換備用泵或主泵;
- 每臺水泵都有故障信號,當某臺泵出現故障或運行信號丟失時,能自動切換到其它泵;
- 故障出現后,水泵的運行時間需要保持不變,不能丟失;
- 每臺水泵有3種狀態:1. 作為主泵;2. 作為備用泵;3. 不投用;
- 有故障的水泵自動停止,并且不允許啟動,直到故障解除;
- 可選擇投用或不投用“多備多投”功能。
二、程序編寫
1. 需求分析
- 參考文章《電機主備互投功能優化_多臺設備均衡運行》的思路,根據5臺電機的運行時間,計算出由小到大對應的序號,遍歷1-5,每次啟動都啟動序號1對應的電機;
- 當水泵處于故障狀態、不投用狀態、運行狀態時,可將該水泵的運行時間設置為最大值,即可跳過該水泵,啟動下一臺。
2. 編寫運行時間累計功能塊
可參考文章西門子PLC常用底層邏輯塊分享_設備運行時間統計。
根據該文章可編寫FC塊“運行時間累計”,并新建數據類型“時鐘”。具體步驟這里不再贅述。
3. 創建自定義數據類型
1. 時間排序數據類型
圖1
2. 多備多投數據類型
圖2
3. 多備多投切換數據類型
圖3
4. 編程
1. 創建DB數據塊
1. 多備多投數據塊
圖4
2. 多備多投切換數據塊
圖5
2. 創建FB功能塊
新建FB塊“水泵多備多投”,添加如下變量。
圖6
編寫如下程序:
REGION 功能已啟用、已停止IF #PumpSwitch.StaCmd THEN#PumpSwitch.Running := 1;ELSIF#PumpSwitch.StpCmd THEN#PumpSwitch.Running := 0;END_IF;END_REGIONREGION 調用程序"運行時間累計"(Start := #PumpControl[1].Run,Clock_1Hz := #Clock_1Hz,"Time" := #PumpControl[1].RunTime);"運行時間累計"(Start := #PumpControl[2].Run,Clock_1Hz := #Clock_1Hz,"Time" := #PumpControl[2].RunTime);"運行時間累計"(Start := #PumpControl[3].Run,Clock_1Hz := #Clock_1Hz,"Time" := #PumpControl[3].RunTime);"運行時間累計"(Start := #PumpControl[4].Run,Clock_1Hz := #Clock_1Hz,"Time" := #PumpControl[4].RunTime);"運行時間累計"(Start := #PumpControl[5].Run,Clock_1Hz := #Clock_1Hz,"Time" := #PumpControl[5].RunTime);END_REGIONREGION 計算運行時間FOR #PumpSwitch.N[0] := 1 TO 5 DO#PumpSwitch.Set[#PumpSwitch.N[0]]."Time" :=#PumpControl[#PumpSwitch.N[0]].RunTime.Day * 86400 +#PumpControl[#PumpSwitch.N[0]].RunTime.Hour * 60 * 60 +#PumpControl[#PumpSwitch.N[0]].RunTime.Min * 60 +#PumpControl[#PumpSwitch.N[0]].RunTime.Second; // 程序判斷用時間#PumpSwitch.TimeOut[#PumpSwitch.N[0]] := #PumpSwitch.Set[#PumpSwitch.N[0]]."Time"; // 實際顯示時間END_FOR;END_REGIONREGION 計算主泵、備泵、運行泵數量#NumMinPump := 0;FOR #PumpSwitch.N[1] := 1 TO 5 DOIF #PumpControl[#PumpSwitch.N[1]].ControlWord = 1 THEN#NumMinPump := #NumMinPump + 1;END_IF;END_FOR;#PumpSwitch.NumMinPump := #NumMinPump; // 計算主泵數量#NumBackupPump := 0;FOR #PumpSwitch.N[2] := 1 TO 5 DOIF #PumpControl[#PumpSwitch.N[2]].ControlWord = 2 THEN#NumBackupPump := #NumBackupPump + 1;END_IF;END_FOR;#PumpSwitch.NumBackupPump := #NumBackupPump; // 計算備泵數量#NumRun := 0;FOR #PumpSwitch.N[3] := 1 TO 5 DOIF #PumpControl[#PumpSwitch.N[3]].Run THEN#NumRun := #NumRun + 1;END_IF;END_FOR;REGION 泵切換命令IF #NumRun < #PumpSwitch.#NumRun THEN#SwitchPump := 1;ELSE#SwitchPump := 0;END_IF;#SwitchPumpR_TRIG(CLK := #SwitchPump); // 如果此刻運行泵數量小于上一時刻運行泵數量,則說明有泵停機,觸發泵切換信號END_REGION#PumpSwitch.#NumRun := #NumRun; // 計算運行泵數量REGION 運行泵數量不足報警IF (#PumpSwitch.#NumRun < #PumpSwitch.NumMinPump) AND #PumpSwitch.Running THEN#PumpSwitch.NumFlt := 1;ELSE#PumpSwitch.NumFlt := 0;END_IF;END_REGIONEND_REGIONREGION 無設備運行時,復位啟動命令IF #PumpSwitch.#NumRun = 0 THENFOR #PumpSwitch.N[6] := 1 TO 5 DO#PumpSwitch.Pump[#PumpSwitch.N[6]] := 0;END_FOR;END_IF;END_REGIONREGION 故障停機FOR #PumpSwitch.N[12] := 1 TO 5 DOIF #PumpControl[#PumpSwitch.N[12]].Flt OR(#PumpControl[#PumpSwitch.N[12]].ControlWord = 3)THEN#PumpSwitch.Pump[#PumpSwitch.N[12]] := 0;END_IF;END_FOR;END_REGIONREGION 按時間順序計算序號REGION 故障處理FOR #PumpSwitch.N[8] := 1 TO 5 DOIF #PumpControl[#PumpSwitch.N[8]].Flt OR(#PumpControl[#PumpSwitch.N[8]].ControlWord = 3) OR#PumpControl[#PumpSwitch.N[8]].RunTHEN#PumpSwitch.Set[#PumpSwitch.N[8]]."Time" := 4294967295; // UDInt的最大值為4294967295END_IF;END_FOR; // 將故障泵和沒有投用和正在運行的泵時間設為最大值END_REGION// 初始化序號數組FOR #PumpSwitch.I := 1 TO 5 DO#PumpSwitch.Set[#PumpSwitch.I].Sequence := 1; // 初始序號為1END_FOR;// 計算每個元素的序號FOR #PumpSwitch.I := 1 TO 5 DOFOR #PumpSwitch.J := 1 TO 5 DOIF #PumpSwitch.Set[#PumpSwitch.J]."Time" < #PumpSwitch.Set[#PumpSwitch.I]."Time" THEN#PumpSwitch.Set[#PumpSwitch.I].Sequence := #PumpSwitch.Set[#PumpSwitch.I].Sequence + 1; // 遇到更小的數,序號增加ELSIF(#PumpSwitch.Set[#PumpSwitch.J]."Time" = #PumpSwitch.Set[#PumpSwitch.I]."Time") AND (#PumpSwitch.J < #PumpSwitch.I) THEN#PumpSwitch.Set[#PumpSwitch.I].Sequence := #PumpSwitch.Set[#PumpSwitch.I].Sequence + 1; // 處理相同數值的情況,按順序遞增序號END_IF;END_FOR;END_FOR;FOR #PumpSwitch.N[13] := 1 TO 5 DO// 將啟動順序放入存儲區,便于上位機顯示#PumpSwitch.SequenceOut[#PumpSwitch.N[13]] := #PumpSwitch.Set[#PumpSwitch.N[13]].Sequence;END_FOR;END_REGIONREGION 根據時間順序切換IF NOT #PumpSwitch.StpCmd THENCASE #PumpSwitch.Step OF0:IF #PumpSwitch.StaCmd AND #PumpSwitch.EnSwitch THEN#PumpSwitch.Step := 1;END_IF;#PumpSwitch.Pump[1] := 0;#PumpSwitch.Pump[2] := 0;#PumpSwitch.Pump[3] := 0;#PumpSwitch.Pump[4] := 0;#PumpSwitch.Pump[5] := 0;1:FOR #PumpSwitch.N[7] := 1 TO 5 DOIF #PumpControl[#PumpSwitch.N[7]].ControlWord = 1 THEN#PumpSwitch.Pump[#PumpSwitch.N[7]] := 1;END_IF;END_FOR; // 所有主泵同時啟動#PumpSwitch.Step := 2;2:REGION 觸發泵切換命令IF #SwitchPumpR_TRIG.Q AND #PumpSwitch.EnSwitch THENFOR #PumpSwitch.N[9] := 1 TO 5 DOIF (#PumpSwitch.SequenceOut[#PumpSwitch.N[9]] = 1) ANDNOT #PumpControl[#PumpSwitch.N[9]].Flt ANDNOT #PumpControl[#PumpSwitch.N[9]].Run ANDNOT (#PumpControl[#PumpSwitch.N[9]].ControlWord = 3) THENEXIT; // 找到啟動順序為1對應的泵的序號#PumpSwitch.N[9]END_IF;END_FOR;#PumpSwitch.Pump[#PumpSwitch.N[9]] := 1;END_IF;END_REGIONEND_CASE;ELSE#PumpSwitch.Pump[1] := 0;#PumpSwitch.Pump[2] := 0;#PumpSwitch.Pump[3] := 0;#PumpSwitch.Pump[4] := 0;#PumpSwitch.Pump[5] := 0;#PumpSwitch.N[9] := 0;#PumpSwitch.Step := 0;#PumpSwitch.EnSwitch := 0;END_IF;END_REGIONREGION 賦值FOR #PumpSwitch.N[11] := 1 TO 5 DOIF #PumpSwitch.Clear THEN#PumpControl[#PumpSwitch.N[11]].RunTime.Clear := 1;ELSE#PumpControl[#PumpSwitch.N[11]].RunTime.Clear := 0;END_IF;END_FOR;IF NOT "AlwaysFALSE" THEN#PumpSwitch.StaCmd := 0;#PumpSwitch.StpCmd := 0;#PumpSwitch.Clear := 0;END_IF;END_REGION
三、程序調用
在主程序中調用FB塊“水泵多備多投”。
圖7
程序分析:
- 實際應用時,#PumpControl[1].Run - #PumpControl[5].Run關聯水泵1 - 5的運行反饋信號,#PumpSwitch.Pump[1] - #PumpSwitch.Pump[5]關聯水泵1 - 5的啟動命令,#PumpControl[1].Flt - #PumpControl[5].Flt關聯水泵1 - 5的故障信號;
- 變量EnSwitch作為使能信號,只有EnSwitch置1時,功能才會正常投用,否則就算按下StaCmd啟動按鈕也不會實現主備互投;
- EnSwitch復位后,主備互投功能取消,此時可自由啟停任意水泵;
- 按下StpCmd停止按鈕后,所有水泵停止運行,EnSwitch自動復位;
- 當實際運行泵的數量小于應該運行的數量,會觸發NumFlt運行泵數量不足報警,提醒操作員及時處理故障;
- 可在上位機畫面中為每臺泵添加“選擇框控件”,關聯ControlWord變量,ControlWord=1表示作為主泵,ControlWord=2表示作為備泵,ControlWord=3表示該泵不投用;
- 程序會根據選擇的主泵數量和備泵數量,自動判斷當前的主備互投模式。
總結
本文提供了一種結構化的水泵多備多投方法,可作為標準塊應用于生產實際中。