การใช้งาน Index และ Offset ใน PLC HMI - Data Sampling
สอนใช้ Index Z ใน Samkoon PLC เก็บค่า D0 ทุก 100 ms ลง D10 เป็นต้นไปแล้ววาดกราฟด้วย Data Group Display และใช้ Offset ของ Bit Button ใน HMI เลือก Output Y0–Y7 จากปุ่มเดียว
เอา Z มาต่อท้าย Address เช่น D10Z0 หรือ M200Z1 แล้ว PLC จะอ่านเป็น D10 + Z0 หรือ M200 + Z1 ใช้เก็บค่า D0 ทุก 100 ms ลง D10, D11, D12 … เพื่อวาดกราฟ ส่วนฝั่ง HMI ใช้ช่อง Offset ของ Bit Button เลื่อนปุ่ม M400 ไปเป็น M401–M407 ได้โดยไม่ต้องสร้างปุ่มใหม่
อัพเดทล่าสุด: 26 ตุลาคม 2569
Index กับ Offset ช่วยอะไร
ถ้าเข้าใจเรื่อง Index (หรือ Offset) เราจะเปลี่ยนตำแหน่งของ Data Register ใน PLC หรือ HMI ได้อย่างอิสระ คลิปนี้ยกตัวอย่าง 2 ระบบ
- Data Sampling — เก็บค่าที่อ่านเข้ามา (ในคลิปจำลองด้วย D0) ทุก 100 ms ไว้หลายตำแหน่งเรียงกัน แล้วเอาไปแสดงเป็นกราฟบน HMI หรือส่งให้อุปกรณ์อื่น ถ้าไม่รู้เรื่อง Index ต้องเขียนโค้ดยาวมาก
- Offset Coil — ให้ผู้ใช้เลือกช่อง Output (Y0–Y7) จากหน้าจอ แล้วกดปุ่มเดียวสั่ง Output ช่องนั้น เหมาะกับกรณีที่ยังไม่รู้ว่าปลายทางลูกค้าจะต่อสายอุปกรณ์เข้ากับ Output ช่องไหน
อุปกรณ์ในคลิปคือ PLC FAT-16MT-DC-E ต่อกับหน้าจอ Samkoon 7 นิ้ว เขียนโปรแกรมด้วย SamSoar2022 และ SKTool
หลักการทำงานของ Index Z
ปกติเรารู้จัก Input = X, Coil = Y, Coil ตัวช่วย (Auxiliary Coil) = M และเก็บข้อมูลใน Data Register = D ตัวที่เพิ่มเข้ามาคือ Z ซึ่งเอาไปต่อท้าย Address ได้ เช่น M200Z1 หมายถึง M200 + ค่าใน Z1
| ค่า Z1 | M200Z1 คือ |
|---|---|
| 0 | M200 |
| 1 | M201 |
| 2 | M202 |
ในคลิปเขียนโปรแกรมทดสอบไว้ใน Network "How index works" — ถ้า M100 ติดให้ M200Z1 ติด และกด M101 (ขอบขาขึ้น) เพื่อ INC ค่า Z1 ทีละ 1 ส่วน M200, M201, M202 ต่อไปขับ M300, M301, M302 เพื่อให้เห็นว่าตอนนี้ Coil ตัวไหนติด
ผลที่เห็นในคลิป
- Z1 = 0 → M100 ติดแล้ว M200 ติด (M300 ติดตาม)
- กด M101 หนึ่งครั้ง Z1 = 1 → M100 ติดแล้ว M201 ติดแทน
- กดอีกครั้ง Z1 = 2 → M202 ติด
Z ต่อท้ายได้ทั้งตัว M และตัว D แล้วแต่งาน
ตัวอย่างที่ 1: Data Sampling ทุก 100 ms
โปรแกรม PLC
อธิบายทีละขั้น
- สร้างข้อมูลจำลอง — M10 ติดแล้ว INC D0 แบบไม่ใช้ขอบขาขึ้น จึงเพิ่มทุก Scan และวิ่งเร็วมาก D0 เป็นค่า 16 bit มีเครื่องหมาย จึงวิ่งจาก -32768 ขึ้นไปถึง 32767 แล้ววนรอบใหม่ (ในงานจริง D0 คือค่าที่อ่านจากเซนเซอร์)
- Timer 100 ms — ถ้า M0 ติดและ M1 (หน้าสัมผัส NC) ไม่ติด จะเรียก
TONที่ TV0 ฐานเวลา 100 ms ตั้ง Set Value เป็น K1 คือครบทุก 100 ms (จะใช้ Coil พิเศษที่กะพริบทุก 100 ms แทนก็ได้ แต่ในคลิปใช้ TON) - เก็บค่าตาม Index — เมื่อ T0 ติด (ขอบขาขึ้น) จะ MOV ค่า D0 ไปเก็บที่
D10Z0แล้ว INC Z0 เพิ่มอีก 1 และสั่ง M1 ติด - รีเซ็ต Timer — M1 ติดทำให้หน้าสัมผัส NC ในขั้นที่ 2 เปิด Timer ถูกรีเซ็ตแล้วนับใหม่ รอบถัดไป T0 ติดอีกครั้ง ค่าจะไปเก็บที่ D10 + 1 = D11, D12, D13 … ต่อไปเรื่อยๆ
- วนกลับ — เมื่อ Z0 เท่ากับ 9 จะ MOV K0 ไปที่ Z0 ให้กลับไปเริ่มเก็บที่ D10 ใหม่
สังเกตจาก Monitor ในคลิป — D10–D18 มีค่า แต่ D19 เป็น 0 ตลอด เพราะ Z0 ถูกตั้งกลับเป็น 0 ทันทีที่ขึ้นถึง 9 ในรอบเดียวกัน โปรแกรมนี้จึงเก็บจริง 9 ค่า (D10–D18) ถ้าต้องการให้ครบ 10 ค่า (D10–D19) ให้เปลี่ยนเงื่อนไขเป็น Z0 = K10
หน้าจอ HMI
หน้า Data Sampling ในคลิปมีปุ่ม M10 (Generate Data) ช่องแสดงค่า D0 ปุ่ม M0 (เริ่มเก็บข้อมูลทุกๆ 100ms) และกราฟ ซึ่งใช้ออบเจกต์ Data Group Display (Datagroup display) จากแถบเครื่องมือด้านขวาของ SKTool
Data Group Display ต่างจาก Trend Chart ตรงที่ Trend Chart สนใจ Address เดียว เช่น D0 ว่าย้อนหลังไป 1 ชั่วโมงมีค่าอะไรบ้าง ส่วน Data Group Display วาดค่าของ Address หลายตัวที่เรียงกัน (D10 ถึง D19) ณ เวลานั้น
ค่าที่ตั้งในคลิป
| ช่อง | ค่า | ความหมาย |
|---|---|---|
| Read Trigger bit | M0 | Bit ที่ติดแล้วเริ่มอ่านข้อมูลมาแสดงบนกราฟ |
| Control address | D10 | ตำแหน่งเริ่มต้นของข้อมูล |
| Display points | 10 | จำนวนจุดที่อ่าน (D10 เป็นต้นไป 10 ตัว) |
| Clear Trigger bit | LB0 | Bit สำหรับล้างข้อมูลในกราฟ |
| Data type | 16-Bit Signed Int | ให้ตรงกับชนิดข้อมูลที่เก็บ |
ช่วงของแกน X และแกน Y ตั้งได้ที่แท็บ XY axis (ในคลิปแกน Y ตั้ง Min -32768 และ Max 32767 ตามช่วงของ D0)
ตัวอย่างที่ 2: Offset Coil เลือก Output จากหน้าจอ
ผู้ใช้เลือกค่าใน LW0 (Local Word ของหน้าจอ) เช่นเลือก 6 แล้วกดปุ่ม Output Y6 จะติด เลือก 7 ก็ไปออก Y7 ระบบแบบนี้ทำด้วย Index Z ฝั่ง PLC ก็ได้ แต่ HMI มีฟังก์ชัน Offset ของปุ่มที่ช่วยทุ่นแรง ตัวอย่างนี้จึงใช้ Offset จาก HMI
โปรแกรม PLC
ฝั่ง PLC เขียนแค่บรรทัดเดียว คือ map M400–M407 ไปที่ Y0–Y7
K8M400 คือ M400 จำนวน 8 ตัว (M400–M407) และ K8Y0 คือ Y0 จำนวน 8 ตัว (Y0–Y7) ดังนั้น M400 ติด → Y0 ติด, M405 ติด → Y5 ติด, M407 ติด → Y7 ติด
หน้าจอ HMI
- สร้าง Stepping Button ที่ Write address = LW0 ตั้ง Total States = 8 (State Type: Value, Data Type 16-Bit Unsigned Int) จะได้ปุ่มที่กดเลือกค่า 0–7
- สร้าง Bit Button ตัวเดียว (Function: Invert, Mode: Press execute) ให้ผู้ใช้กดสั่ง Output
- ที่ Write Address ใส่ M400 แล้วติ๊ก Offset และใส่ LW0 (ช่อง Monitor Address ที่ตั้งให้ตรงกับ Write Address ก็มี Offset = LW0 เช่นกัน)
ค่าที่ใช้เป็น Offset จะเป็น LW ของหน้าจอหรือค่า D ใน PLC ก็ได้ ขอให้เป็นตัวเลข เช่นให้ผู้ใช้กรอกเองว่าจะเลื่อนไป 5 หรือ 6 ตำแหน่ง
ผลการทำงาน
- LW0 = 0 → กดปุ่มแล้ว M400 ติด → Y0 ติด
- LW0 = 3 → ปุ่มกลายเป็น M403 → Y3 ติด
- LW0 = 7 → ปุ่มกลายเป็น M407 → Y7 ติด
ตอนเปลี่ยนค่า LW0 ปุ่มจะกะพริบนิดหนึ่ง เพราะเหมือนเปลี่ยนไปเป็นปุ่มอีกตัว
สรุป
- ใช้ Index Z ทำ Data Sampling เก็บค่าลง Data Register ที่เรียงกันโดยไม่ต้องเขียนโค้ดทีละตำแหน่ง
- ใช้ Offset ของปุ่มใน HMI เปลี่ยน Address ที่ปุ่มสั่งงาน โดยไม่ต้องสร้างปุ่มแยกทุก Address
- ระบบจะ Dynamic ขึ้น เพราะตัวแปรที่โค้ดใช้งานเปลี่ยนได้ตามค่าที่รับเข้ามา
บทถัดไป
คำสั่ง FMOV ใน Samkoon PLC - Move ข้อมูลหลายตัวแปรพร้อมกัน
มีคำถาม? ติดต่อทีมงาน
