หน้าแรกคู่มือPLCModbus Protocolแก้ปัญหาข้อมูล Modbus แสดงผลแปลกๆ

บทที่ 4 จาก 9 ใน Modbus Protocol

PLCขั้นสูง · Advanced2 นาที

แก้ปัญหาข้อมูล Modbus แสดงผลแปลกๆ

PLC อ่านค่า Floating Point จากอุปกรณ์ Modbus แล้วได้ค่าเพี้ยน เพราะ Endianness ไม่ตรงกัน แก้ด้วยคำสั่ง ROLD หมุน 16 bit สลับ Word หน้ากับ Word หลัง ทดสอบใน SamSoar2022 ให้ดู

ค่า 32-bit (Floating Point) ที่ PLC อ่านจากอุปกรณ์ Modbus แล้วเพี้ยน มักเกิดจาก Endianness ต่างกัน — 16-bit แรกกับ 16-bit หลังสลับตำแหน่งกัน แก้ได้ด้วยคำสั่ง ROLD หมุน 16 bit เพื่อสลับ High Word กับ Low Word ก่อนแปลงเป็น Float เช่น ROLD D0 K16 D20 แล้วอ่านค่าที่ถูกต้องจาก D20

อัพเดทล่าสุด: 26 ตุลาคม 2569

ชุดอุปกรณ์สำหรับบทความนี้

ราคาชุดอุปกรณ์

฿3,690

ปัญหา: ค่าที่ PLC อ่านจาก Modbus ไม่ตรงกับอุปกรณ์

ตัวอย่างในคลิปมาจากลูกค้าที่อ่านค่า pressure จากอุปกรณ์ Modbus โปรแกรม Modbus Poll อ่านได้ 0.0896543 แต่พอใช้ PLC เป็น Master อ่านค่าเดียวกัน กลับได้ค่าที่ผิดเพี้ยน

สาเหตุ: Endianness ไม่เหมือนกัน

ข้อมูลยาว 32 bit ถูกส่งเป็น 16 bit สองตัว อุปกรณ์ Modbus บางตัวเรียง 16 bit หน้ากับ 16 bit หลังสลับกับที่ PLC เรียง เรียกว่า Endianness ไม่เหมือนกัน

ตัวอย่างค่าที่ PLC อ่านได้ในคลิป

AddressDatatypeค่า
D0 (16 bit แรก)WORD15796
D1 (16 bit ที่สอง)WORD-25441
D0 (D0 ต่อกับ D1)FLOAT-1.053769E-21

พอนำ D0 กับ D1 มาต่อกันแล้วแสดงผลเป็น Floating Point จะได้ -1.053769E-21 ซึ่งผิดชัดเจน

วิธีแก้: สลับ 16 bit ด้วยคำสั่ง ROLD

ให้เอา 16 bit ท้ายมาไว้ข้างหน้าแทน โดยใช้คำสั่ง ROLD (ROL แบบ Double Word) ซึ่งหมุน bit ไปทางซ้ายตามจำนวนที่กำหนด ส่วน ROL ใช้กับข้อมูลแบบ WORD

ROLD  Input  Move  Output
ROLD  D0     K16   D20
  • Input D0 — ข้อมูล 32 bit ที่ต้องการสลับ (D0 กับ D1)
  • Move K16 — จำนวน bit ที่หมุน หมุน 16 bit คือสลับ Word หน้ากับ Word หลัง
  • Output D20 — ตำแหน่งเก็บผลที่สลับแล้ว
ROLD — สลับ Word หน้ากับ Word หลังของค่า 32-bit
หมุน D0 ไป 16 bit แล้วเก็บผลที่ D20 (ตัวอย่างนี้ใช้ M8151 ให้ทำงานตลอด)
N0
D20 = D0 ที่สลับ Word หน้ากับ Word หลังแล้ว
M8151ROLDD0, K16, D20
นำเข้าไฟล์ใน SamSoar2022: File → Import → เลือกไฟล์ .csv

ผลลัพธ์

กด Simulate แล้วดู D20 แบบ FLOAT ใน Monitor จะได้ 0.088189 เป็นค่าที่ถูกต้องในหลักเดียวกับที่ Modbus Poll อ่านได้

ถ้าเจอค่าที่อ่านผ่าน Modbus แล้วแปลกๆ แบบนี้ อย่าลืมลองสลับ Endian ก่อน

บทถัดไป

วิธีแก้ปัญหาการสื่อสาร Modbus บน PLC | ตรวจสอบสถานะเชื่อมต่อ

1 นาทีปานกลาง · Intermediate

คำถามที่พบบ่อย

Endianness คืออะไร ทำไมค่าที่อ่านได้ถึงเพี้ยน?
Endianness คือลำดับการเรียง Word ของข้อมูล 32-bit ใน Modbus ข้อมูล 32-bit ถูกส่งเป็น Register 16-bit สองตัว ผู้ผลิตบางรายวาง High Word ไว้ก่อน บางรายวาง Low Word ไว้ก่อน เมื่อ PLC ต่อ Register สองตัวเข้าด้วยกันผิดลำดับ ค่า Float ที่ได้จะไม่ตรงกับหน้าจออุปกรณ์ เช่น อุปกรณ์อ่านได้ 0.089 แต่ PLC อ่านได้ค่าแปลก
คำสั่ง ROLD ใช้อย่างไร?
ROLD D0 K16 D20 — D0 คือ Register ต้นทาง (Double Word D0–D1), K16 คือจำนวน bit ที่หมุน (16 bit = สลับครึ่งบนกับครึ่งล่าง) และ D20 คือ Register ปลายทาง จากนั้นนำ D20 ไปแสดงผลเป็น Floating Point แทน D0
จะรู้ได้อย่างไรว่าต้องสลับ Endian หรือไม่?
เทียบค่าใน PLC กับค่าที่อุปกรณ์หรือโปรแกรมอย่าง Modbus Poll อ่านได้ หากไม่ตรงกันให้ลอง ROLD ดู ถ้าหลังสลับแล้วได้ค่าที่สมเหตุสมผล (ในคลิปได้ 0.088189) แสดงว่าเป็นปัญหา Endianness
ปัญหานี้เกิดกับข้อมูลชนิดไหน?
เกิดกับข้อมูล 32-bit ที่กินสอง Register เช่น Float และ Double Word (32-bit Integer) ส่วนข้อมูล 16-bit ใน Register เดียวไม่ได้รับผลกระทบจากการสลับ Word