西門子PLC結構化編程_水處理系統水泵多備多投

文章目錄

  • 前言
  • 一、功能概述
  • 二、程序編寫
    • 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臺水泵的運行邏輯如下:

  1. 具有以下幾種情況:4用1備、2用2備、2用3備、3用2備、1用1備、1用4備等任意組合;
  2. 主泵同時啟動,觸發切換命令后,按照運行時間由小到大的順序切換備用泵或主泵;
  3. 每臺水泵都有故障信號,當某臺泵出現故障或運行信號丟失時,能自動切換到其它泵;
  4. 故障出現后,水泵的運行時間需要保持不變,不能丟失;
  5. 每臺水泵有3種狀態:1. 作為主泵;2. 作為備用泵;3. 不投用;
  6. 有故障的水泵自動停止,并且不允許啟動,直到故障解除;
  7. 可選擇投用或不投用“多備多投”功能。

二、程序編寫

1. 需求分析

  1. 參考文章《電機主備互投功能優化_多臺設備均衡運行》的思路,根據5臺電機的運行時間,計算出由小到大對應的序號,遍歷1-5,每次啟動都啟動序號1對應的電機;
  2. 當水泵處于故障狀態、不投用狀態、運行狀態時,可將該水泵的運行時間設置為最大值,即可跳過該水泵,啟動下一臺。

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
程序分析:

  1. 實際應用時,#PumpControl[1].Run - #PumpControl[5].Run關聯水泵1 - 5的運行反饋信號,#PumpSwitch.Pump[1] - #PumpSwitch.Pump[5]關聯水泵1 - 5的啟動命令,#PumpControl[1].Flt - #PumpControl[5].Flt關聯水泵1 - 5的故障信號;
  2. 變量EnSwitch作為使能信號,只有EnSwitch置1時,功能才會正常投用,否則就算按下StaCmd啟動按鈕也不會實現主備互投;
  3. EnSwitch復位后,主備互投功能取消,此時可自由啟停任意水泵;
  4. 按下StpCmd停止按鈕后,所有水泵停止運行,EnSwitch自動復位;
  5. 當實際運行泵的數量小于應該運行的數量,會觸發NumFlt運行泵數量不足報警,提醒操作員及時處理故障;
  6. 可在上位機畫面中為每臺泵添加“選擇框控件”,關聯ControlWord變量,ControlWord=1表示作為主泵,ControlWord=2表示作為備泵,ControlWord=3表示該泵不投用;
  7. 程序會根據選擇的主泵數量和備泵數量,自動判斷當前的主備互投模式。

總結

本文提供了一種結構化的水泵多備多投方法,可作為標準塊應用于生產實際中。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/78795.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78795.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/78795.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

QT:自定義ComboBox

實現效果: 實現combobox的下拉框區域與item區域分開做UI交互顯示。 支持4種實現效果,如下 效果一: 效果二: 效果三: 效果四: 實現邏輯: ui由一個toolbutton和combobox上下組合成,重點在于combobox。 我設置了4種枚舉,ButtonWithComboBox對應效果一;OnlyButt…

VS2022+OpenCasCade配置編譯

一、Open CASCADE Technology介紹及安裝&#xff08;windows10&#xff09; Open CASCADE Technology&#xff08;簡稱OCCT&#xff09;是一款開源的 3D CAD/CAM/CAE 軟件開發平臺&#xff0c;廣泛應用于工業設計、工程仿真、制造等領域。開源OCC對象庫是一個面向對象C類庫&…

【OSG學習筆記】Day 12: 回調機制——動態更新場景

UpdateCallback 在OpenSceneGraph&#xff08;OSG&#xff09;里&#xff0c;UpdateCallback是用來動態更新場景的關鍵機制。 借助UpdateCallback&#xff0c;你能夠實現節點的動畫效果&#xff0c;像旋轉、位移等。 NodeCallback osg::NodeCallback 是一個更通用的回調類&…

全新升級:BRAV-7601-T003高性能無風扇AI邊緣計算系統,助力智能未來!

在數字化與智能化飛速發展的今天&#xff0c;AI邊緣計算正成為各行各業的核心驅動力。BRAV-7601作為一款高性能無風扇AI邊緣計算系統&#xff0c;憑借其強大的硬件配置與豐富的擴展能力&#xff0c;為車路協同、特種車輛車載、機器視覺、醫療影像等領域提供了卓越的解決方案。最…

刪除 Git 遠程記錄并重新設置

刪除 Git 遠程記錄并重新設置 以下是在 Windows 平臺上刪除當前項目的 Git 遠程記錄并重新設置遠程存儲庫的步驟&#xff1a; 步驟一&#xff1a;查看當前遠程倉庫 首先&#xff0c;檢查當前設置的遠程倉庫&#xff1a; git remote -v這會顯示所有已配置的遠程倉庫及其 URL…

有哪些和PPT自動生成有關的MCP項目?

隨著AI技術的快速發展, Model Context Protocol(MCP) 作為一種連接大型語言模型(LLMs)與外部工具的開放協議,正在重塑自動化辦公領域。在PPT自動生成場景中,MCP通過標準化接口實現了AI模型與設計工具、數據源的無縫整合。以下從技術框架、項目案例、應用場景三個維度展開…

PostgreSQL psql 命令和常用的 SQL 語句整理

PostgreSQL psql 命令和常用的 SQL 語句整理 1、登錄PostgreSQL數據庫2、psql 命令3、數據庫操作4、模式操作5、表操作6、數據操作7、索引操作8、視圖操作9、權限操作 1、登錄PostgreSQL數據庫 在系統的命令行界面&#xff08;如 Windows 的 cmd 或者 PowerShell、Linux 的終端…

【unity游戲開發入門到精通——UGUI】文本輸入控件 —— InputField舊控件

注意&#xff1a;考慮到UGUI的內容比較多&#xff0c;我將UGUI的內容分開&#xff0c;并全部整合放在【unity游戲開發——UGUI】專欄里&#xff0c;感興趣的小伙伴可以前往逐一查看學習。 文章目錄 前言1、文本輸入控件2、InputField舊文本輸入控件組成 一、InputField文本輸入…

獲得ecovadis徽章資格標準是什么?ecovadis評估失敗的風險

EcoVadis徽章資格標準 EcoVadis徽章是對企業在可持續發展&#xff08;環境、勞工與人權、商業道德、可持續采購&#xff09;方面表現的認可。獲得徽章需滿足以下條件&#xff1a; 完成評估&#xff1a; 企業必須完成EcoVadis的問卷評估&#xff0c;并提交所有必要文件。 評分…

Python初學 有差異的知識點總結(一)

目錄 一、基礎語法規則 1.注釋 2.代碼編寫 二、基礎語法 1.變量 2.數據類型 3.數據類型的轉換 &#xff08;1&#xff09;隱式轉換 &#xff08;2&#xff09;顯示轉換 4.標識符 5.運算符 6.字符串 &#xff08;1&#xff09;定義 &#xff08;2&#xff09;拼接 …

Java面試場景深度解析

Java面試場景深度解析 在互聯網大廠Java求職者的面試中&#xff0c;經常會被問到關于Java項目中的各種技術場景題。本文通過一個故事場景來展示這些問題的實際解決方案。 第一輪提問 面試官&#xff1a;馬架構&#xff0c;歡迎來到我們公司的面試現場。請問您對Java內存模型…

【數據可視化藝術·應用篇】三維管線分析如何重構城市“生命線“管理?

在智慧城市、能源管理、工業4.0等領域的快速發展中&#xff0c;地下管線、工業管道、電力通信網絡等“城市血管”的復雜性呈指數級增長。傳統二維管理模式已難以應對跨層級、多維度、動態變化的管線管理需求。三維管線分析技術應運而生&#xff0c;成為破解這一難題的核心工具。…

Spring-全面詳解(學習總結)

一&#xff1a;概述 1.1 為什么學 解決了兩個主要問題 1. 2 學什么 1.3 怎么學 二&#xff1a;系統架構 作用&#xff1a;web開發、微服務開發、分布式系統開發 容器&#xff1a;用于管理對象 AOP:面向切面編程&#xff08;不驚動原始程序下對其進行加強&#xff09; 事…

企業架構之旅(2):解鎖TOGAF ADM

文章目錄 一、什么是 TOGAF ADM二、TOGAF ADM 的關鍵階段架構愿景&#xff08;Phase A&#xff09;業務架構&#xff08;Phase B&#xff09;信息系統架構&#xff08;Phase C&#xff09;技術架構&#xff08;Phase D&#xff09;機會與解決方案&#xff08;Phase E&#xff0…

MySQL 中 SQL 語句的詳細執行過程

MySQL 中 SQL 語句的詳細執行過程 當一條 SQL 語句在 MySQL 中執行時&#xff0c;它會經歷多個階段的處理。下面我將詳細描述整個執行流程&#xff1a; 1. 連接階段 (Connection) 客戶端與 MySQL 服務器建立連接服務器驗證用戶名、密碼和權限連接器負責管理連接狀態和權限驗…

ETL架構、數據建模及性能優化實踐

ETL&#xff08;Extract, Transform, Load&#xff09;和數據建模是構建高性能數據倉庫的核心環節。下面從架構設計、詳細設計、數據建模方法和最佳實踐等方面系統闡述如何優化性能。 一、ETL架構設計優化 1. 分層架構設計 核心分層&#xff1a; 數據源層&#xff1a;對接O…

快速上手Prism WPF 工程

1、Prism 介紹 ?定位?&#xff1a; Prism 是 ?微軟推出的框架&#xff0c;專為構建 ?模塊化、可維護的復合式應用程序? 設計&#xff0c;主要支持 WPF、Xamarin.Forms、UWP 等平臺。?核心功能?&#xff1a; ?模塊化開發?&#xff1a;將應用拆分為獨立模塊&#xff0c…

React 單一職責原則:優化組件設計與提高可維護性

單一職責原則&#xff08;SRP&#xff09; 在 React 中&#xff0c;組件是構建 UI 的核心單位&#xff0c;而良好的組件設計是保證應用質量和可維護性的關鍵。單一職責原則是一種設計原則&#xff0c;也適用于 React 組件的開發。它強調每個組件應該只關注一個職責&#xff0c…

css網格布局Grid

一、網格布局適應場景 當涉及到的布局是二維布局&#xff08;元素不止一行或者一列&#xff09;且比較復雜的時候&#xff0c;可以用網格布局&#xff0c;看下面的一個例子&#xff1a; 上圖上一個四行三列的網格&#xff0c;布局相對比較復雜。如果你用別的布局方案&#xff…

利用Python生成Xilinx FPGA ROM IP核 .coe初始化文件

以下是一個 Python 腳本&#xff0c;用于生成 Xilinx IP ROM 的.coe 格式初始化文件&#xff0c;假設ROM 深度為 1024&#xff0c;數據位寬為 32bit&#xff0c;使用隨機的 32 位無符號數進行初始化&#xff1a; import random# 定義ROM的深度和數據位寬 rom_depth 1024 data…