在西門子TIA Portal的SCL(結構化控制語言)編程中,WHILE
循環是處理條件迭代任務的核心工具。它根據布爾表達式動態控制循環執行,適用于不確定循環次數的場景。下面從語法、執行流程、注意事項到實際案例全面解析。
一、WHILE
循環基本語法
WHILE <布爾表達式> DO // 循環體:執行的代碼塊 END_WHILE;
-
布爾表達式:循環條件,結果為
TRUE
時執行循環體,FALSE
時退出。 -
循環體:可包含任意SCL代碼(如計算、賦值、函數調用等)。
二、WHILE
循環執行流程
-
檢查布爾表達式:
-
若為
TRUE
?→ 執行循環體 → 返回步驟1。 -
若為
FALSE
?→ 跳過循環體 → 執行后續代碼。
-
流程圖:
三、關鍵注意事項
-
避免死循環:
-
必須確保循環體內存在修改條件的邏輯(如計數器遞增),否則PLC可能進入死循環導致看門狗超時停機。
-
錯誤示例:
WHILE TRUE DO // 永遠為真 → 死循環!// 無退出條件 END_WHILE;
-
-
循環效率優化:
-
循環體內避免復雜耗時操作(如嵌套多重循環),防止掃描周期過長。
-
-
變量初始化:
-
循環條件依賴的變量需在進入循環前正確初始化(如計數器歸零)。
-
四、實戰案例
案例1:計算1到100的累加和
VAR Counter : INT := 1; // 初始化計數器 Sum : INT := 0; // 初始化累加和 END_VAR WHILE #counter <= 100 DO //條件:#counter <= 100(即循環執行100次,覆蓋數字1~100)#sum := #sum + #counter; ?// 將當前計數器的值累加到總和中 ?#counter := #counter + 1; // 計數器自增(確保循環最終退出) ? END_WHILE; //當 #counter 增至101時,不滿足條件 <=100,循環結束。 //最終 #sum = 1 + 2 + ... + 100 = 5050。 // 結果:Sum = 5050 ?
-
首次執行:
#sum = 0 + (1+2+...+100) = 5050
?? -
第二次執行:
#sum = 5050 + (1+2+...+100) = 10100
?? -
后續執行:每次增加5050
案例2:尋找數組中的最大值
VAR Values : ARRAY[1..10] OF INT := [5, 9, 3, 17, 2, 8, 11, 4, 6, 13]; MaxValue : INT := Values[1]; // 假設第一個元素為最大值 Index : INT := 2; // 從第二個元素開始比較 END_VAR WHILE #Index <= 10 DO ?// 遍歷索引1~10(或0~9)的元素IF #Values[#Index] > #MaxValue THEN ?// 檢測當前元素是否大于已知最大值#MaxValue := #Values[#Index]; // 發現更大值則更新記錄 ?END_IF;#Index := #Index + 1; // 移動至下一個元素? END_WHILE;// 結果:MaxValue = 17
案例3:超時檢測(設備啟動超時報警)
VAR StartTimer : TIME := T#0s; // 啟動計時器 TimeoutLimit : TIME := T#10s; // 超時閾值 IsRunning : BOOL := FALSE; // 設備運行狀態 AlarmActive : BOOL := FALSE; // 報警輸出 END_VAR // 當設備開始啟動時 ? IF #StartCommand THEN ?//當收到啟動命令(StartCommand=TRUE)時#IsRunning := TRUE; //設置運行狀態標志 IsRunning=TRUE#StartTimer := T#0s; //將計時器 StartTimer 歸零(T#0s 表示0秒時間量) ? END_IF;// 超時檢測循環 ? WHILE #IsRunning AND (#StartTimer < #TimeoutLimit) DO //設備正在運行且未超時#StartTimer := #StartTimer + T#100ms; // 增加時間(在循環中模擬等待) ?IF #DeviceReady THEN //檢查設備就緒信號 DeviceReady#IsRunning := FALSE; // 若收到就緒信號,立即設置 IsRunning=FALSE 退出循環END_IF; END_WHILE;//退出循環后檢測計時器:? IF #StartTimer >= #TimeoutLimit THEN ?//超時 → 激活報警(AlarmActive=TRUE)#AlarmActive := TRUE; // 觸發報警 ? ELSE#AlarmActive := FALSE; //未超時 → 關閉報警(AlarmActive=FALSE) END_IF;
五、調試技巧
-
臨時變量監控:
-
在TIA Portal的“監控表”中添加循環變量(如
Counter
、Index
),實時觀察值的變化。
-
-
斷點調試:
-
在循環體內設置斷點,逐步執行分析邏輯。
-
-
看門狗處理:
-
若循環可能耗時較長,在循環體內調用
COMM_BLOCK
指令刷新通信看門狗。
-
總結
WHILE
循環在SCL中用于動態條件迭代,比FOR
循環更靈活,但需謹慎:
-
? 確保條件變量在循環體內被修改
-
? 避免無限循環
-
? 優化性能以防掃描周期超時
通過本文案例,可快速掌握其在累加計算、數據搜索、超時控制等場景的應用。實際項目開發中,建議結合函數塊(FB/FC)封裝復雜循環邏輯,提升代碼復用性和可讀性。