แก้ปัญหาข้อมูล 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
ปัญหา: ค่าที่ PLC อ่านจาก Modbus ไม่ตรงกับอุปกรณ์
ตัวอย่างในคลิปมาจากลูกค้าที่อ่านค่า pressure จากอุปกรณ์ Modbus โปรแกรม Modbus Poll อ่านได้ 0.0896543 แต่พอใช้ PLC เป็น Master อ่านค่าเดียวกัน กลับได้ค่าที่ผิดเพี้ยน
สาเหตุ: Endianness ไม่เหมือนกัน
ข้อมูลยาว 32 bit ถูกส่งเป็น 16 bit สองตัว อุปกรณ์ Modbus บางตัวเรียง 16 bit หน้ากับ 16 bit หลังสลับกับที่ PLC เรียง เรียกว่า Endianness ไม่เหมือนกัน
ตัวอย่างค่าที่ PLC อ่านได้ในคลิป
| Address | Datatype | ค่า |
|---|---|---|
| D0 (16 bit แรก) | WORD | 15796 |
| 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— ตำแหน่งเก็บผลที่สลับแล้ว
ผลลัพธ์
กด Simulate แล้วดู D20 แบบ FLOAT ใน Monitor จะได้ 0.088189 เป็นค่าที่ถูกต้องในหลักเดียวกับที่ Modbus Poll อ่านได้
ถ้าเจอค่าที่อ่านผ่าน Modbus แล้วแปลกๆ แบบนี้ อย่าลืมลองสลับ Endian ก่อน
บทถัดไป
วิธีแก้ปัญหาการสื่อสาร Modbus บน PLC | ตรวจสอบสถานะเชื่อมต่อ
คำถามที่พบบ่อย
- 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
มีคำถาม? ติดต่อทีมงาน
