之前CPU架構中提到M-R有五個模擬軟體核心可以執行五個程式單元,如下圖:
除了初始化程式是上電後執行一次外,另外有 Task 0, 1, 2, 3, 背景 等五個 Task,分別由五核分別執行。其中依照屬性不同分了:PLC掃描執行程式跟動態觸發依序執行程式兩大類:
- PLC 掃描執行程序:
- Task 0:只有需即時反應掃瞄時間要求短的事件、與內部控制環或DMCNET通訊同步的程序建議放到這裡。
- Task背景:不在乎掃描週期的程序,例如:人機互動、一般DIO、三色燈…程式不論寫多長都不會影響Task_0掃描時間!
- 動態觸發依序執行程序:
- Task 1,2,3:動態觸發,由 Task 0, Task背景 PLC響應某個節點後來觸發。
Task 1,2,3 預設是動態觸發性質的Task,也可以設定為周期執行程序。
關於為什麼需要多工的環境,大家可參考這兩篇文章:
我們內部是採用分時多工機制,將每一個 ms分為4個時槽 (slot),
Task 0會在每個 ms的 Solt 0開始執行,若有觸發 Task 1的POU將在該 ms的 Slot 1開始執行,若有觸發 Task 2的POU將在該 ms的 Slot 2開始執行,Task 3 在 Slot 3 開始執行,而Task 背景沒有預設的執行時間。時槽時間耗盡時一定會進入多工切換不會延遲,這是硬即時的多工必要條件!當時槽指定的 Task 已經執行停止或在等待階段可進行背景轉任給其背景程式,讓一個Slot 執行不只一個 Task;而一個 Task 執行時間超過自己的Slot時,若下個Slot 沒有指派Task則可以延續該Slot繼續執行,讓一個Task 可以利用多個Slot執行。
彙整多工切換的原則只有下列三點,清晰可見!
- 時槽已有指定的工作,則執行該工作
- 時槽未有指定的工作,則執行前一時槽的工作
- 工作已完成或需等待而該時槽還有剩餘時間,則執行該工作對應的背景工作
每個Task對應的背景Task,關係如下:
解讀如下:當 Task 1, 2, 3工作結束或需等待會將時槽轉讓給 Task 0 執行,當 Task 0 工作結束或需要等待則會將時槽轉讓給 Task B(背景)執行
以下例來說
- Task 0 在Slot 0開始執行,當Slot 0結束時因為 slot 1 有指派 Task 1所以根據 Rule 1會切換給 Task 1 執行。
- Task 1 在Slot 1開始執行,當Slot 1結束時因為 slot 2 有指派 Task 2所以根據 Rule 1會切換給 Task 2 執行。
- Task 2 在Slot 2開始執行,Slot 2 還沒結束就已經執行結束,且Slot 2還有剩餘時間,根據Rule 3 會切換給他的背景工作 (Task 0)繼續執行。
- Task 0在 Slot 2 後段接續執行到當 Slot 2 結束時因為 Slot 3有指派 Task 3 所以根據 Rule 1會切換給 Task 3 執行。
- Task 3 在Slot 3開始執行,Slot 3 還沒結束就已經執行結束,且Slot 3還有剩餘時間,根據Rule 3 會切換給他的背景工作 (Task 0)繼續執行。
- Task 0在 Slot 3 中段接續執行一下子就結束了,且Slot 3還有剩餘時間,根據Rule 3 會切換給他的背景工作 (Task B)繼續執行。直到這個 ms 結束。
在這一個 ms裡動態觸發形式的 task 2, 3已經執行結束,但 Task 1還沒有執行結束,會在下一個 ms 繼續執行,而 Task 0 跟 Task B 因為PLC循環程式每個 ms都會執行。所以下個ms的示意圖如下:
解讀如下:
- Task 0 在Slot 0開始執行,當Slot 0結束時因為 Slot 1 有指派 Task 1所以根據 Rule 1會切換給 Task 1 執行。
- Task 1 在Slot 1開始執行,當Slot 1結束時因為 Slot 2 沒有指派 Task 所以根據 Rule 2會繼續利用 Slot 2 的時間執行 。
- Task 1 在 Slot 2 執行一段時間執行結束了,而Slot 2 還有剩餘時間根據Rule 3 會切換給他的背景工作 (Task 0)繼續執行。
- Task 0 在 Slot 2 中斷執行一段時間後也結束了,而Slot 2 還有剩餘時間根據Rule 3 會切換給他的背景工作 (Task B)繼續執行。
- Task B 在 Slot 2 結束後,因為 Slot 3 沒有指派 Task 所以根據 Rule 2 會繼續在 Slot 3 執行。
多工切換的現象可以在 ezASD 的專案面板上的觀察到,如下圖
下圖則演示 Task 2 有一個動態觸發的程式被執行:
大家也可參考這一篇多工切換的解講: 一次搞懂多工排程