ยินดีต้อนรับสู่ บทที่ 1: ปูพื้นฐาน Structured Text (ST) ครับ ในฐานะที่คุณเป็น Software Developer สาย C#/.NET ที่กำลังก้าวเข้าสู่โลกของ Industrial Automation ผมบอกได้เลยว่า Structured Text (ST) จะเป็นภาษาที่คุณรักที่สุดในบรรดาภาษา PLC ทั้ง 5 ภาษาตามมาตรฐาน IEC 61131-3 ครับ
นี่คือคู่มือฉบับรวบรัดที่จะช่วยคุณปรับจูน Mindset จากการมองวงจรไฟฟ้า (Ladder) มาเป็นการเขียน Code แบบที่คุณคุ้นเคย
1. ศึกแห่งภาษา: Ladder Logic (LD) vs. Structured Text (ST)
ทำไมเราถึงต้องย้ายมาเขียน ST? ในเมื่อ Ladder ก็ดูง่ายดี? คำตอบคือ “Complexity” (ความซับซ้อน) ครับ
- Ladder Diagram (LD): เปรียบเสมือนการวาด Wiring Diagram เหมาะมากสำหรับ Logic แบบ Boolean ง่ายๆ เช่น “ถ้ากดปุ่ม A และ Sensor B ทำงาน ให้ Motor C หมุน” มันเห็นภาพ Power Flow ชัดเจน ช่างไฟเข้าใจง่าย
- Structured Text (ST): คือ High-Level Language ที่มีรากฐานมาจากภาษา Pascal และ C มันเกิดมาเพื่อจัดการกับสิ่งที่ Ladder ทำได้ยากหรือทำไม่ได้เลย เช่น:
- Complex Math: การคำนวณสูตรคณิตศาสตร์ซับซ้อน ถ้าเขียนด้วย Ladder บล็อกจะต่อกันยาวเหยียดจนดูไม่รู้เรื่อง แต่ใน ST เขียนแค่บรรทัดเดียวจบ
- Loops & Iterations: การวนลูป
FOR,WHILEเพื่อจัดการข้อมูลใน Array จำนวนมาก ทำได้ง่ายและกระชับกว่ามาก - String Manipulation: การตัดต่อข้อความ หรือคุยกับ Barcode Scanner/Printer ภาษา ST จัดการได้เหมือน C# ครับ
Architect Verdict: ใช้ Ladder สำหรับ Safety Interlock ง่ายๆ แต่ถ้าเมื่อไหร่เริ่มมีการคำนวณ (Calculation), การวนลูป (Loops), หรือการจัดการข้อมูล (Data Handling) ให้เปลี่ยนมาใช้ ST ทันทีครับ
2. กฎเหล็กของ Syntax (The Grammar of ST)
ในฐานะ C# Developer คุณต้องระวังเรื่อง Syntax เล็กน้อยที่แตกต่างกันครับ
2.1 การจบประโยค (Semicolon)
เช่นเดียวกับ C# ทุกคำสั่ง (Statement) ใน ST ต้องจบด้วย Semicolon (;) เสมอ
iCount := iCount + 1; // อย่าลืม ; เด็ดขาด
2.2 การกำหนดค่า (Assignment Operator :=)
นี่คือจุดที่คนเขียน C# พลาดบ่อยที่สุด!
- C#: ใช้
=เพื่อ Assign ค่า - ST: ใช้
:=(Colon-Equal) เพื่อ Assign ค่าครับ
หลักการคือ: ตัวแปรทางซ้าย := ค่าทางขวา; (เอาค่าขวา ไปยัดใส่ตัวแปรซ้าย)
⚠️ ข้อควรระวัง: เครื่องหมาย
=ใน ST ใช้สำหรับการ เปรียบเทียบค่า (Comparison) เท่านั้น (เหมือน==ใน C#)
ตัวอย่างเปรียบเทียบ:
// การกำหนดค่า (Assignment)
MotorSpeed := 1500; // ✅ ถูกต้อง
MotorSpeed = 1500; // ❌ ผิด (นี่คือการเช็คว่า MotorSpeed เท่ากับ 1500 หรือไม่)
// การเปรียบเทียบ (Comparison in IF)
IF MotorSpeed = 1500 THEN ... // ✅ ถูกต้อง (เทียบเท่า if (MotorSpeed == 1500))
3. Data Types พื้นฐาน (The Variables)
ใน CODESYS เราต้องประกาศตัวแปรในส่วน VAR ... END_VAR เสมอ (คล้าย Field ใน Class) มาดู Type หลักๆ ที่คุณจะได้ใช้ครับ
| PLC Data Type | เทียบเท่า C# | รายละเอียด | ตัวอย่างการประกาศ |
|---|---|---|---|
| BOOL | bool | ค่าความจริง True/False (1 bit) ใช้กับปุ่มกด, ไฟสถานะ | xStart : BOOL := FALSE; |
| INT | short | จำนวนเต็ม (-32,768 ถึง 32,767) | iCounter : INT := 0; |
| REAL | float | ทศนิยม (Floating point) ใช้กับค่า Analog, อุณหภูมิ | rTemp : REAL := 25.5; |
| STRING | string | ข้อความ (ASCII) | sMessage : STRING := 'Hello'; |
| TIME | TimeSpan | ระยะเวลา (เช่น T#5s, T#100ms) | tDelay : TIME := T#5S; |
4. Hello World: The “Direct Online” Logic
โจทย์คลาสสิก: “กดปุ่ม (Switch) แล้วไฟ (Lamp) ติด”
ส่วนประกาศตัวแปร (Variable Declaration)
ทั้งสองภาษาใช้ส่วนประกาศตัวแปรเหมือนกัน:
PROGRAM PLC_PRG
VAR
xSwitch : BOOL; // Input Button
xLamp : BOOL; // Output Lamp
END_VAR
แบบ Ladder Logic (LD)
คุณต้องลากวาง Contact และ Coil มาต่อกันเหมือนวงจรไฟฟ้า
xSwitch xLamp
----| |----------------------( )----
คำอธิบาย: เมื่อ xSwitch ต่อวงจร (True), ไฟ xLamp จะครบวงจร (True)
แบบ Structured Text (ST)
เขียนบรรทัดเดียวจบ ด้วย Logic Assignment
// อ่านว่า: ให้ค่าของ xLamp เท่ากับค่าของ xSwitch
xLamp := xSwitch;
💡 Architect Insight: ถ้าโจทย์เปลี่ยนเป็น “กดปุ่ม Start ไฟติด, กด Stop ไฟดับ (Latching Circuit)”
- LD: ต้องวาด Coil, Contact ขนาน (OR) เพื่อ Latch ซึ่งมือใหม่จะงงเรื่อง Flow
- ST: เขียน Logic แบบ IF ที่คุณคุ้นเคยได้เลย:
IF xStartButton THEN xMotor := TRUE; ELSIF xStopButton THEN xMotor := FALSE; END_IF;เห็นไหมครับว่าสำหรับ Developer แล้ว ST มันอ่านรู้เรื่องกว่าเยอะ!
