用不同的 PLC 寫同一段程式

西門子 S7–1200, 台達 DVP, AB Studio 5000

Yu
5 min readMay 25, 2022

範例程式

寫法 1 : 台達 DVP PLC 的寫法

最常見的寫法。
TMR : 是 ON DELAY TIMER 的指令。時間單位是 INT 型,一個時間單位是 100 ms。數值為 10 表示是 1 秒。
INC : 是 +1 指令。

台達 DVP PLC 的程式

把 POU 加到循環掃描的 Task 裡。

把 POU 加到循環掃描的 Task 裡

寫法 2 : AB Studio 5000 的寫法

新增一個新的子 Routine,命名為「POU」。

在循環掃描 MainRoutine 透過 JSR 指令呼叫子 Routine「POU」。

呼叫子程式

在 Controller Tags 裡建立 TIMER, INT …等需要用到的變數。

Controller Tags 是全域變數表。建立在 Controller Tags 的變數可以被多個 Routine 呼叫。

T0 不是記憶體位址的絕對名稱,可以取任何名字。這次只是為了方便與台達的 PLC 做對照才命名為 T0。

INT 型的 D0 也可以取任何名字,同樣是為了對照才叫 D0。

在 Controller Tags 裡建立變數

TON : 是 ON DELAY TIMER 的指令。時間單位是 DINT 型,一個時間單位是 1 ms。數值為 1000 表示是 1 秒。

ONS : 表示正緣觸發的指令,需要用到 2 個 BOOL 變數。前面放 T0.DN,上面放 T0_TEMP。T0_TEMP 是用來記錄在上個 SCAN TIME 的時候 T0.DN 是 ON 還是 OFF。

AB Studio 5000 的程式

寫法 3 : 把西門子 S7–1200 寫的像台達 DVP PLC

西門子 PLC 一開始最讓我困擾的部分是不知道要從哪邊下手,竟然沒有 POU 或 Routine!。可以把所有的東西都寫在 Main (OB1) 裡,但程式一多就會變得雜亂不容易讀、不方便管理。

以 IEC 61131–3 的方式來說,Task 就是 OB,POU 可以是 FB 或 FC。

這個範例我建了一個 FC 當 POU。把 FC 放在 Main (OB1) 裡的動作相當於是把 POU 排到循環掃描的 Task 裡。

Main (OB1) 呼叫 FC (POU 排入 Task)

建立一個 Global DB,建立 TIMER, INT …等需要用到的變數。

DB 是變數表。Global DB 是全域變數表。Global DB 裡的變數不屬於任何 FB,是可以被任何 OB / FC / FB 呼叫使用的全域變數。

IEC_TIMER : 是一種 TIMER 的資料型態,其實就是一個 FB。T0 不是記憶體位址的絕對名稱,可以取任何名字。這次只是為了方便與台達的 PLC 做對照才命名為 T0。

INT 型的 D0 也可以取任何名字,同樣是為了對照才叫 D0。

建立一個 Global DB (建立一個全域變數表)

TON : 是 ON DELAY TIMER 的指令。時間單位是 TIME 型。用 T#1S 或 T#1000MS 表示 1 秒。

|P| : 表示正緣觸發的指令,需要用到 2 個 BOOL 變數。上面放 T0.Q,下面放 T0_TEMP。T0_TEMP 是用來記錄在上個 SCAN TIME 的時候 T0.Q 是 ON 還是 OFF。

西門子 S7-1200 PLC 的程式

結論

我以前是這樣寫,所以覺得西門子的 PLC 不好用。

POU (Program Organization Units) : IEC 61131–3 定義的程式組織單元。有 3 種分別是 Program, Functions, Function Blocks。本文中用到的「POU」都是表示 Program 的意思,可以分配到 Task 的 Program。

FB (Function Blocks) : 大部分中文翻譯是「功能塊」,有實體 (Instance) 可以儲存變數的子程式。應用範圍很廣泛,例如 : TIMER, COUNTER。算式以外的指令,幾乎都是 Function Blocks。

FC (Functions) : 大部分中文翻譯是「功能」,沒有實體 (Instance) 的子程式。大部分是計算式或搬移指令,例如 : ADD, SUB, DIV, MOD, MOVE。

--

--