🚀 แบบทดสอบสำหรับตำแหน่ง Industrial Application Developer (Junior Position)
🚀

แบบทดสอบสำหรับตำแหน่ง Industrial Application Developer (Junior Position)

วัตถุประสงค์ของการทดสอบ:

การทดสอบนี้มีจุดมุ่งหมายเพื่อประเมินความสามารถของผู้สมัครในด้านการใช้เทคโนโลยี IIoT และการจัดการข้อมูลจากอุปกรณ์อุตสาหกรรมโดยใช้ซอฟต์แวร์ต่างๆ ในการเชื่อมต่อข้อมูลและสร้างการแสดงผลด้วย dashboard.

Note: This test is not about finishing 100% perfectly. We want to see how you think, solve problems, and present your approach.

Part 1: Industrial Data Connectivity & Dashboarding

1.1 การเชื่อมต่อกับ OPC UA

เป้าหมาย: เชื่อมต่อกับเซิร์ฟเวอร์ OPC UA และเข้าถึงข้อมูลจากอุปกรณ์อุตสาหกรรมที่ระบุ

รายละเอียดการเชื่อมต่อ:

  • Server Discovery URL: opc.tcp://18.141.27.34:3005/discovery

  • OPC-UA Server URL: opc.tcp://18.141.27.34:3005

  • Username/Password: Appomaxopc / Appomax2024

  • Security Policy: ไม่มีการใช้ Certificate (No certificate required, อาจต้องเพิ่ม Certificate ของเซิร์ฟเวอร์ลงใน Trusted Store เพื่อให้สามารถเชื่อมต่อได้)

  • การเข้ารหัสความปลอดภัย: None (ไม่มีการเข้ารหัส)

ซอฟต์แวร์ที่ใช้:

  • Ignition by Inductive Automation

    ดาวน์โหลดได้ที่: https://inductiveautomation.com/downloads/

    (เลือก Ignition เวอร์ชันล่าสุด, รองรับ Windows/Linux/Mac/Docker)

1.2 ขั้นตอนการเชื่อมต่อ OPC-UA Server บน Ignition

  • ติดตั้ง Ignition

    • ดาวน์โหลด installer และติดตั้งตาม OS ของคุณ

    • เปิด Gateway ผ่าน browser (http://localhost:8088)

  • เข้าสู่ Gateway Web Interface

  • สร้างการเชื่อมต่อใหม่

    • Click Create new OPC Connection

    • เลือก Add OPC UA Connection

  • กรอกข้อมูลการเชื่อมต่อ

    • Endpoint URL: opc.tcp://18.141.27.34:3005

    • Username/Password: Appomaxopc / Appomax2024

    • Security Policy: None

  • Save และ Verify Connection

    • กด Save

    • ตรวจสอบว่า Status = Connected

  • ตรวจสอบ Tag Browser

    • เปิด Ignition Designer → Project ของคุณ

    • ไปที่ Tag Browser → OPC UA Server

    • ค้นหา Tag Path ที่กำหนดในโจทย์ (Energy, HVAC, Production)

    • Confirm ว่าอ่านค่าได้จริง

หมายเหตุ:

  • โครงสร้างแท็ก OPC UA (รูปภาพแนบมาพร้อมแบบทดสอบ)

  • ตรวจสอบการเข้าถึงแท็กและค่าข้อมูลให้ถูกต้อง

1.3 การสร้างโมเดลข้อมูลและการคำนวณ (Industrial Data Connectivity & Dashboarding)

Analysis Objectives

ผู้เข้าสอบต้องนำข้อมูลจาก OPC-UA Server ที่เชื่อมต่อแล้ว มาทำการเก็บใน Historian และสร้าง Dashboard เพื่อแสดงผล โดยมีเป้าหมายหลักดังนี้:

  1. Energy Management – วิเคราะห์การใช้พลังงานไฟฟ้าโดยคำนวณค่าเฉลี่ย (Average kW) ทุก 15 นาที และดูแนวโน้มย้อนหลัง 3 ชั่วโมง

  2. Temperature Monitoring – ตรวจสอบสภาวะการทำงานของ Chiller Motor โดยแสดงค่าอุณหภูมิย้อนหลัง 24 ชั่วโมง เพื่อหาความผิดปกติ

  3. Production Monitoring – ประเมินผลผลิตจริงรายชั่วโมง โดยคำนวณ delta ของ cumulative counter และรวมยอดผลิตทั้งหมดย้อนหลัง 24 ชั่วโมง

สิ่งที่วัดจากการทดสอบ
  • ความสามารถในการ Browse Tags และนำข้อมูลเข้าสู่ระบบ Ignition

  • การ Configure Tag Historian เพื่อเก็บข้อมูลย้อนหลัง

  • การ Query ข้อมูลด้วย Power Chart และแสดงผล Visualization

  • การเข้าใจลักษณะข้อมูล (เช่น cumulative counter) และการประมวลผล (delta, average, raw)

  • ความสามารถในการใช้ วิธีอื่น (Scripting / Expression Tag) เพื่อแก้ปัญหาข้อมูล

รูปแบบของ Visualization:
  1. Energy Management

    • แสดงค่า kW เฉลี่ยทุก 15 นาที ของ MDB Power Meter C01

    • แสดงข้อมูลย้อนหลัง 3 ชั่วโมง ในรูปแบบกราฟ

    • Tag Path: /Compomax HQ/Energy/Monitoring/MDB/C01/EqvActivePower

  2. Temperature Monitoring

    • แสดงค่าอุณหภูมิของ Motor 3 ย้อนหลัง 24 ชั่วโมง

    • Tag Path: /Compomax HQ/HVAC/Chiller/Motor 3/Vibration sensor M3/VB3/TempertureC

  3. Production Monitoring

    • นับผลผลิตของเครื่องจักรในกลุ่ม G7 ย้อนหลัง 24 ชั่วโมงแบบรายชั่วโมง

    • Tag Path: Compomax HQ/Machine Monitoring/Forming/G7/FMXXX/Counter (FMXXX คือชื่อเครื่อง e.g.FM055)

    • Visualization ที่ต้องมี:

      • Gauge Chart: แสดงผลรวมของค่าผลผลิต

      • Trend Graph หรือ Bar Graph: แสดงแนวโน้มค่าผลผลิตย้อนหลัง

Step 0: ดาวน์โหลดและติดตั้ง Ignition Designer IDE

  1. ที่หน้า Gateway ให้เลือก Download Designer Launcher (อยู่ในเมนู Quick Links)

  2. ติดตั้ง Designer Launcher → เมื่อเปิดจะเจอ Add Designer Connection

  3. กรอกข้อมูลการเชื่อมต่อ:

    • Host: localhost หรือ IP ของ Gateway

    • Port: 8088 (default)

    • User/Password: admin / password (ค่า default, หรือ set ใหม่ตอนติดตั้ง)

  4. กด Launch Designer → จะเปิด IDE (Ignition Designer)

Step 1: เลือก Tags จาก OPC-UA Server

  1. เปิด Ignition Designer → ไปที่ Tag Browser (แถบด้านซ้ายล่าง)

  2. คลิกขวาที่ OPC UA Server → เลือก Browse OPC Server

  3. จะเห็น Tree Structure ของ Tags ที่ Server expose ออกมา

  4. Navigate ไปตาม Path ที่กำหนด:

    • /Compomax HQ/Energy/Monitoring/MDB/C01/EqvActivePower

    • /Compomax HQ/HVAC/Chiller/Motor 3/Vibration sensor M3/VB3/TempertureC

    • Compomax HQ/Machine Monitoring/Forming/G7/FMXXX/Counter (เช่น FM055)

  5. คลิกที่ Tag → กด Drag & Drop มายังโฟลเดอร์ Tags → Default Tag Provider

  6. ตอนนี้ Tag จะถูกบันทึกใน Ignition Designer และสามารถนำไปใช้งานต่อได้

Step 2: เก็บข้อมูลลง Tag Historian

  1. คลิกขวาที่ Tag ใน Default Tag Provider → เลือก Edit Tag

  2. ไปที่แท็บ History

  3. ติ๊ก Enable History

  4. ตั้งค่าดังนี้:

    • Database: เลือก DB ที่ config ไว้ใน Gateway (เช่น IgnitionDB)

    • Storage Provider: default (Ignition DB store)

    • Sample Mode: Periodic

    • Sample Rate:

      • Energy/Temperature → 1 นาที

      • Production Counter → 1 นาที

    • Deadband: (ถ้าอยากลดการเก็บข้อมูล) เช่น Analog = 0.1

  5. กด OK / Save

  6. Tag จะเริ่มถูกเก็บใน Historian DB → สามารถ query ได้ผ่าน Tag History Binding หรือ system.tag.queryTagHistory


Step 3: Industrial Data Connectivity & Dashboarding

ผู้เข้าสอบต้องนำข้อมูลจาก OPC-UA Server ที่เชื่อมต่อแล้ว มาทำการเก็บใน Historian และสร้าง Dashboard เพื่อแสดงผลการวิเคราะห์

Energy Management

Tag Path: /Compomax HQ/Energy/Monitoring/MDB/C01/EqvActivePower

เป้าหมาย:

  • แสดงค่า kW เฉลี่ยทุก 15 นาที

  • ย้อนหลัง 3 ชั่วโมง

ขั้นตอนตัวอย่าง:

  1. Browse OPC-UA → Drag Tag EqvActivePower ลงใน Tag Browser (default provider)

  2. คลิกขวา → Edit Tag → เปิดใช้งาน Tag History (Enable History)

    • Sample Mode: Periodic

    • Sample Rate: 1 นาที

    • Database: เลือก DB ที่กำหนดไว้ (IgnitionDB)

  3. เปิด Perspective → View → ใส่ Power Chart Component

  4. Run Session (Preview) → กด + Add Tag บน Power Chart

  5. เลือก Tag [default]EqvActivePower

  6. ตั้งค่า:

    • Aggregation = Average

    • Interval = 15 minutes

    • Time Range = Last 3 hours

  7. ตรวจสอบว่าเส้นกราฟแสดงค่าเฉลี่ย 15 นาทีถูกต้อง

Temperature Monitoring

Tag Path: /Compomax HQ/HVAC/Chiller/Motor 3/Vibration sensor M3/VB3/TempertureC

เป้าหมาย:

  • แสดงค่าอุณหภูมิย้อนหลัง 24 ชั่วโมง

Production Monitoring - Challenge Task (Open-ended)

Tag Path: Compomax HQ/Machine Monitoring/Forming/G7/FMXXX/Counter (เช่น FM055)

หมายเหตุ: Counter เป็น cumulative (สะสม) ต้องหาค่า delta รายช่วงเวลาเพื่อแสดงผลผลิตจริง

เป้าหมาย:

  • นับผลผลิตรายชั่วโมง

  • แสดงย้อนหลัง 24 ชั่วโมง

ให้ผู้เข้าสอบเลือก อย่างน้อย 1 วิธี ในการคำนวณ Delta ของ Counter และแสดงผล

  1. Scripting (Python in Ignition)

    from java.util import Date
    endTime = system.date.now()
    startTime = system.date.addHours(endTime, -24)
    paths = ["[default]Compomax HQ/Machine Monitoring/Forming/G7/FM055/Counter"]
    
    results = system.tag.queryTagHistory(
        paths=paths,
        startDate=startTime,
        endDate=endTime,
        intervalHours=1,
        aggregationMode="Range"
    )
    print results
    
    • ใช้ผลลัพธ์ Dataset ไป plot บน Table หรือ Chart

  2. Expression Tag

    • สร้าง Expression Tag ใหม่

    • Expression:

      diff({[default]Compomax HQ/Machine Monitoring/Forming/G7/FMXXX/Counter}, 1)
      
    • หรือ:

      rateOfChange({[default]Counter}, 1, "minutes")
      
    • ใช้สำหรับ real-time delta (ไม่ผ่าน Historian)

Deliverables (สิ่งที่ต้องส่ง)

ผู้เข้าสอบต้องสร้าง Dashboard ใน Perspective ที่ประกอบด้วย:

  1. Power Chart – Energy Management

    • แสดงค่า EqvActivePower

    • Aggregation = Average (15 minutes)

    • Time Range = Last 3 hours

  2. Power Chart – Temperature Monitoring

    • แสดงค่า TemperatureC (Chiller Motor 3)

    • Aggregation = Raw (หรือ Min/Max)

    • Time Range = Last 24 hours

  3. Production Monitoring (Challenge)

    • แสดง Hourly Delta ของ Counter (แทนค่า cumulative)

    • Time Range = Last 24 hours

    • Candidate สามารถเลือกวิธีการทำได้ Hint:

      • Script (system.tag.queryTagHistory)

      • Expression Tag (diff / rateOfChange)

    • อธิบายว่าทำไมเลือกวิธีนี้ และผลลัพธ์ได้อะไร

Part 2: SQL Query Debugging & Analytics

2.1 Setup Instructions

โปรดทำขั้นตอน Setup ดังนี้

  1. Import the Project ที่ให้นี้  

  2. Create a database connection ชื่อ TestDB

    • Type: SQLite

    • Connection URL:

      jdbc:sqlite:${data}/IIoT_Engineer/TestDB.db
      
  3. Create necessary tables โดยรัน SQL ต่อไปนี้ใน TestDB

    CREATE TABLE IF NOT EXISTS product (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      machine_name TEXT,
      counter_value INTEGER,
      timestamp TEXT,
      UNIQUE(machine_name, timestamp)
    );
    
    CREATE TABLE IF NOT EXISTS vibration (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      name TEXT,
      temperature REAL,
      timestamp TEXT,
      UNIQUE(name, timestamp)
    );
    
  4. Verify tables ถูกสร้างครบ

    • product: id, machine_name, counter_value, timestamp

    • vibration: id, name, temperature, timestamp

  5. Insert demo data

    • Launch Perspective → Tools → Launch Perspective → Launch Session

    • ไปที่แท็บ Insert Data

    • กดปุ่ม + เพื่อเพิ่มแถว

    • ตรวจว่า sample data แสดงในตารางสำเร็จ

2.2 Instructions (How to Debug)

สำหรับ Named Queries ต่อไปนี้ (มี suffix _Test อยู่ใน Ignition):

  1. เปิด Named Query ใน Ignition Designer

  2. Analyze โค้ด SQL: ตรวจ logic / syntax / formatting / structure

  3. Fix ให้ผลลัพธ์ตรง Expected Output Format ที่ระบุ

  4. จัดทำ Submission (SQL Debugging Report) ระบุ:

    • What was wrong (พบปัญหาอะไร)

    • What you changed (แก้ไขอะไร)

    • (Optional) The corrected query (SQL หลังแก้)

2.3 Production Queries

HourlyMachineCountByName_Test

  • Task: ให้คืนผล 1 แถวต่อชั่วโมง รวม counter_value ของเครื่องที่เลือก ด้วยพารามิเตอร์ :mach_name

  • Expected Columns: t_stamp, total_count

HourlyProductionCountByMachine_Test

  • Task: ให้คืนผล 1 แถวต่อชั่วโมง และ pivot รวม count ของแต่ละเครื่องเป็น หลายคอลัมน์

  • Expected Columns: t_stamp, <Machine_A>, <Machine_B>, …

ProductionSummaryData_Test

  • Task: คืนค่า Summary ระดับระบบ

    1. total production count (all time)

    2. number of distinct machines

    3. production count from the last hour

  • Expected Columns: total_count, total_machines, last_hour_count

TotalProductionByMachine_Test

  • Task: รวมผลผลิต ต่อเครื่อง (ไม่มี time filter)

  • Expected Columns: machine_name, total_count

2.4 Vibration Queries

HourlyAvgTemperaturePivot_Test

  • Task: คืนค่า อุณหภูมิเฉลี่ยรายชั่วโมง ต่อ sensor และ pivot เป็นคอลัมน์ (Sensor_X, Sensor_Y, …)

  • Expected Columns: t_stamp, Sensor_X, Sensor_Y, …

HourlyTemperatureStatsBySensor_Test

  • Task: คืนค่า min/avg/max รายชั่วโมง สำหรับ sensor เฉพาะ (parameter :sensor_name)

  • Expected Columns: t_stamp, min_temp, avg_temp, max_temp

  • VibrationSummaryData_Test

    • Task: คืนค่า Summary รวมของ vibration:

      • overall average temperature

      • minimum temperature

      • maximum temperature

      • total number of distinct sensors

    • Expected Columns: avg_temperature, min_temperature, max_temperature, total_sensors

Full Instruction in English:

2.5 Deliverables (สิ่งที่ต้องส่ง)

  • Video Presentation: อธิบายแนวทาง Debug และสาธิตผลลัพธ์หลังแก้สำเร็จ (screen recording สั้นและชัด)

  • SQL Debugging Report (PDF/Doc): สรุป Bug → Fix → Corrected SQL สำหรับทุก Named Query

  • Screenshots: ผลลัพธ์ตาราง/กราฟหลังแก้ไข

  • SQL Files: ไฟล์ .sql ของ query เวอร์ชันที่แก้แล้ว

2.6 เกณฑ์การให้คะแนน (Scoring)

  • Correctness ของผลลัพธ์ตาม Expected Output

  • Debugging Rigor: ระบุสาเหตุ, อธิบายการแก้, ใช้ SQL Functions เหมาะสม

  • Readability: โครงสร้าง SQL/CTE/Formatting ชัดเจน

  • Reusability: ใช้พารามิเตอร์ (เช่น :mach_name, :sensor_name) และ time window ได้ยืดหยุ่น

2.7 ข้อแนะนำเชิงเทคนิค (Hints)

  • ใช้ DATE_TRUNC / STRFTIME (SQLite) เพื่อ Group รายชั่วโมง

  • ระวัง NULL handling หลัง pivot/aggregate

  • ตรวจ time zone ของ timestamp ให้สอดคล้อง sample data

  • ใช้ UNIQUE constraint (ใน schema) เพื่อหลีกเลี่ยง duplicate records ตอน insert ทดสอบ


คำแนะนำสำหรับการทำและการส่งแบบทดสอบ

เมื่อทำแบบทดสอบเสร็จแล้ว กรุณาส่งผลลัพธ์ตามรายละเอียดดังนี้:

1. Video Presentation (การนำเสนอผลงาน)

  • บันทึกวิดีโอการนำเสนอผลงานของคุณ (สามารถใช้ Google Meet, Zoom recording, OBS หรือวิธีใดก็ได้)

  • ควรอธิบายสิ่งต่อไปนี้:

    Overview ของงานที่ทำ – คุณเลือกทำอะไรในแบบทดสอบ และทำไปได้ถึงไหน

    Demo การทำงาน – แสดงให้เห็นว่าโซลูชันที่คุณสร้างสามารถทำงานได้จริง

    SQL Query & Data Processing – อธิบาย logic หรือการประมวลผลข้อมูลที่คุณทำ

    Challenges & Learnings – ปัญหาที่พบ วิธีแก้ไข และสิ่งที่ได้เรียนรู้

หมายเหตุ: คุณไม่จำเป็นต้องทำครบ 100% แต่ขอให้แสดง วิธีคิด, วิธีแก้ปัญหา, และสิ่งที่คุณเรียนรู้

หากคุณทำได้ เกินจาก instruction เช่นใช้ Script, Expression, หรือ Visualization เพิ่มเติม → ถือเป็นข้อดีและเรายินดีเห็น

การส่ง:

อัปโหลดวิดีโอไปยัง Google Drive, YouTube (Unlisted) หรือ Dropbox และแนบลิงก์มาในการส่งงาน

2. Documentation (เอกสารอธิบายงาน)

ผู้เข้าสอบต้องแนบเอกสารที่อธิบายการทำงานของโซลูชัน ประกอบไปด้วย:

1. รายงานการทำงาน (Project Report) – (PDF หรือ Word Document)

ควรมีหัวข้อ:

  • Introduction – วัตถุประสงค์ของงาน

  • Tools & Software Used – ซอฟต์แวร์/เครื่องมือที่เลือก และเหตุผล

  • SQL Query & Processing Explanation – อธิบายการคำนวณหรือ query ที่ใช้

  • System Architecture – โครงสร้างของระบบที่คุณออกแบบ

  • Challenges & Solutions – ปัญหาและวิธีแก้ไข

  • Conclusion – สิ่งที่คุณเรียนรู้

2. Screenshot & Logs

  • ภาพหน้าจอผลลัพธ์จาก SQL Query

  • ภาพ Dashboard หรือ Visualization ที่ทำได้

  • Logs หรือ Output ที่แสดงว่าโค้ดทำงานถูกต้อง

3. SQL Query & Code Files

  • ไฟล์ .sql ของ query ที่ใช้

  • ไฟล์โค้ดที่ใช้ (Node-RED, Python, Ignition Script, หรืออื่น ๆ ถ้ามี)

3. วิธีการส่งไฟล์

  • อัปโหลดเอกสารและไฟล์ไปที่ Google Drive, Dropbox, หรือ OneDrive

  • ตั้งค่าเป็น Anyone with the link can view

  • ส่งลิงก์ไฟล์ + วิดีโอ ไปยังอีเมลของผู้คุมสอบ หรือผ่านแบบฟอร์มที่กำหนด

4. Deadline

  • กรุณาส่งภายใน 7 วัน หลังจากได้รับแบบทดสอบ

5. ข้อแนะนำเพิ่มเติม

  • เราให้ความสำคัญกับ วิธีคิด, เหตุผล, และการอธิบาย มากกว่าการทำเสร็จสมบูรณ์

  • คุณสามารถเลือกทำบางส่วน หรือทำได้มากน้อยตามเวลาและความถนัด

  • หากคุณมี idea หรือ skill ที่สามารถ ทำเกิน instruction ได้ เช่น เพิ่มการใช้ Script, Expression, หรือสร้าง Visualization ที่ advance ขึ้น → ยินดีและจะนับเป็นข้อดี

  • กรุณาใส่ ความคิดเห็นส่วนตัว ว่าทำไมเลือกวิธีนั้น และคุณคิดว่า approach ของคุณมีข้อดีอย่างไร

💡 เป้าหมายของแบบทดสอบ คือการวัดความสามารถในการ

  • วิเคราะห์ (Analysis)

  • ออกแบบ (Design)

  • นำเสนอแนวคิด (Presentation)

    เกี่ยวกับ Industrial IoT Data Processing

📥 Good Luck! 🚀 – Vikan Chirawatpongsa