แบบทดสอบสำหรับตำแหน่ง 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
ไปที่เมนู Config → OPC UA → Clients → OPC Connections
สร้างการเชื่อมต่อใหม่
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)
ผู้เข้าสอบต้องนำข้อมูลจาก OPC-UA Server ที่เชื่อมต่อแล้ว มาทำการเก็บใน Historian และสร้าง Dashboard เพื่อแสดงผล โดยมีเป้าหมายหลักดังนี้:
Energy Management – วิเคราะห์การใช้พลังงานไฟฟ้าโดยคำนวณค่าเฉลี่ย (Average kW) ทุก 15 นาที และดูแนวโน้มย้อนหลัง 3 ชั่วโมง
Temperature Monitoring – ตรวจสอบสภาวะการทำงานของ Chiller Motor โดยแสดงค่าอุณหภูมิย้อนหลัง 24 ชั่วโมง เพื่อหาความผิดปกติ
Production Monitoring – ประเมินผลผลิตจริงรายชั่วโมง โดยคำนวณ delta ของ cumulative counter และรวมยอดผลิตทั้งหมดย้อนหลัง 24 ชั่วโมง
ความสามารถในการ Browse Tags และนำข้อมูลเข้าสู่ระบบ Ignition
การ Configure Tag Historian เพื่อเก็บข้อมูลย้อนหลัง
การ Query ข้อมูลด้วย Power Chart และแสดงผล Visualization
การเข้าใจลักษณะข้อมูล (เช่น cumulative counter) และการประมวลผล (delta, average, raw)
ความสามารถในการใช้ วิธีอื่น (Scripting / Expression Tag) เพื่อแก้ปัญหาข้อมูล
Energy Management
แสดงค่า kW เฉลี่ยทุก 15 นาที ของ MDB Power Meter C01
แสดงข้อมูลย้อนหลัง 3 ชั่วโมง ในรูปแบบกราฟ
Tag Path: /Compomax HQ/Energy/Monitoring/MDB/C01/EqvActivePower
Temperature Monitoring
แสดงค่าอุณหภูมิของ Motor 3 ย้อนหลัง 24 ชั่วโมง
Tag Path: /Compomax HQ/HVAC/Chiller/Motor 3/Vibration sensor M3/VB3/TempertureC
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
ที่หน้า Gateway ให้เลือก Download Designer Launcher (อยู่ในเมนู Quick Links)
ติดตั้ง Designer Launcher → เมื่อเปิดจะเจอ Add Designer Connection
กรอกข้อมูลการเชื่อมต่อ:
Host: localhost หรือ IP ของ Gateway
Port: 8088 (default)
User/Password: admin / password (ค่า default, หรือ set ใหม่ตอนติดตั้ง)
กด Launch Designer → จะเปิด IDE (Ignition Designer)
Step 1: เลือก Tags จาก OPC-UA Server
เปิด Ignition Designer → ไปที่ Tag Browser (แถบด้านซ้ายล่าง)
คลิกขวาที่ OPC UA Server → เลือก Browse OPC Server
จะเห็น Tree Structure ของ Tags ที่ Server expose ออกมา
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)
คลิกที่ Tag → กด Drag & Drop มายังโฟลเดอร์ Tags → Default Tag Provider
ตอนนี้ Tag จะถูกบันทึกใน Ignition Designer และสามารถนำไปใช้งานต่อได้
Step 2: เก็บข้อมูลลง Tag Historian
คลิกขวาที่ Tag ใน Default Tag Provider → เลือก Edit Tag
ไปที่แท็บ History
ติ๊ก Enable History
ตั้งค่าดังนี้:
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
กด OK / Save
Tag จะเริ่มถูกเก็บใน Historian DB → สามารถ query ได้ผ่าน Tag History Binding หรือ system.tag.queryTagHistory
Step 3: Industrial Data Connectivity & Dashboarding
ผู้เข้าสอบต้องนำข้อมูลจาก OPC-UA Server ที่เชื่อมต่อแล้ว มาทำการเก็บใน Historian และสร้าง Dashboard เพื่อแสดงผลการวิเคราะห์
Tag Path: /Compomax HQ/Energy/Monitoring/MDB/C01/EqvActivePower
เป้าหมาย:
แสดงค่า kW เฉลี่ยทุก 15 นาที
ย้อนหลัง 3 ชั่วโมง
ขั้นตอนตัวอย่าง:
Browse OPC-UA → Drag Tag EqvActivePower ลงใน Tag Browser (default provider)
คลิกขวา → Edit Tag → เปิดใช้งาน Tag History (Enable History)
Sample Mode: Periodic
Sample Rate: 1 นาที
Database: เลือก DB ที่กำหนดไว้ (IgnitionDB)
เปิด Perspective → View → ใส่ Power Chart Component
Run Session (Preview) → กด + Add Tag บน Power Chart
เลือก Tag [default]EqvActivePower
ตั้งค่า:
Aggregation = Average
Interval = 15 minutes
Time Range = Last 3 hours
ตรวจสอบว่าเส้นกราฟแสดงค่าเฉลี่ย 15 นาทีถูกต้อง
Tag Path: /Compomax HQ/HVAC/Chiller/Motor 3/Vibration sensor M3/VB3/TempertureC
เป้าหมาย:
แสดงค่าอุณหภูมิย้อนหลัง 24 ชั่วโมง
Tag Path: Compomax HQ/Machine Monitoring/Forming/G7/FMXXX/Counter (เช่น FM055)
หมายเหตุ: Counter เป็น cumulative (สะสม) ต้องหาค่า delta รายช่วงเวลาเพื่อแสดงผลผลิตจริง
เป้าหมาย:
นับผลผลิตรายชั่วโมง
แสดงย้อนหลัง 24 ชั่วโมง
ให้ผู้เข้าสอบเลือก อย่างน้อย 1 วิธี ในการคำนวณ Delta ของ Counter และแสดงผล
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
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)
ผู้เข้าสอบต้องสร้าง Dashboard ใน Perspective ที่ประกอบด้วย:
Power Chart – Energy Management
แสดงค่า EqvActivePower
Aggregation = Average (15 minutes)
Time Range = Last 3 hours
Power Chart – Temperature Monitoring
แสดงค่า TemperatureC (Chiller Motor 3)
Aggregation = Raw (หรือ Min/Max)
Time Range = Last 24 hours
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 ดังนี้
Import the Project ที่ให้นี้
Create a database connection ชื่อ TestDB
Type: SQLite
Connection URL:
jdbc:sqlite:${data}/IIoT_Engineer/TestDB.db
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) );
Verify tables ถูกสร้างครบ
product: id, machine_name, counter_value, timestamp
vibration: id, name, temperature, timestamp
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):
เปิด Named Query ใน Ignition Designer
Analyze โค้ด SQL: ตรวจ logic / syntax / formatting / structure
Fix ให้ผลลัพธ์ตรง Expected Output Format ที่ระบุ
จัดทำ 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 ระดับระบบ
total production count (all time)
number of distinct machines
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