ยินดีต้อนรับสู่ บทที่ 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#รายละเอียดตัวอย่างการประกาศ
BOOLboolค่าความจริง True/False (1 bit) ใช้กับปุ่มกด, ไฟสถานะxStart : BOOL := FALSE;
INTshortจำนวนเต็ม (-32,768 ถึง 32,767)iCounter : INT := 0;
REALfloatทศนิยม (Floating point) ใช้กับค่า Analog, อุณหภูมิrTemp : REAL := 25.5;
STRINGstringข้อความ (ASCII)sMessage : STRING := 'Hello';
TIMETimeSpanระยะเวลา (เช่น 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 มันอ่านรู้เรื่องกว่าเยอะ!