การตีความข้อมูล MODBUS
เหตุใดการสื่อสารจึงสำเร็จ แต่ค่าที่อ่านได้กลับผิด?
การรับส่งที่สำเร็จส่งมอบเนื้อหาในรีจิสเตอร์ แต่ไม่ได้พิสูจน์ว่าแอปพลิเคชันควรตีความเนื้อหานั้นอย่างไร ค่า 32 บิตต้องมีการจัดเรียงเวิร์ดทั้งคำ ชนิดข้อมูล การปรับสเกล และหน่วยที่ถูกต้อง อีกทั้งต้องมีจังหวะการอัปเดตที่สอดคล้องกัน เริ่มจากตารางรีจิสเตอร์ของอุปกรณ์และเก็บคำตอบดิบไว้ สิ่งเหล่านี้เป็นแนวคิดทั่วไป ไม่ใช่การกำหนดค่าเครื่องมือวัดรุ่นใดโดยเฉพาะ หรือการรับประกันสแนปช็อตแบบอะตอมมิก
ไบต์
รีจิสเตอร์มาตรฐานขนาด 16 บิตถูกส่งเป็นสองไบต์ที่เรียงตามลำดับ
เวิร์ด
ประกอบเวิร์ดทั้งคำกลับเป็นค่าโดยใช้ตารางของอุปกรณ์และชนิดข้อมูลที่ถูกต้อง
จังหวะเวลา
ตรวจสอบว่าทั้งสองเวิร์ดเป็นส่วนหนึ่งของการอัปเดตเดียวกันที่สอดคล้องกันหรือไม่
ยืนยันรูปแบบการระบุที่อยู่ จำนวนรีจิสเตอร์ ชนิดข้อมูล สเกล และหน่วย
บันทึกคำขออ่านที่ได้รับอนุญาตหนึ่งรายการและคำตอบที่ตรงกัน
ตรวจสอบพฤติกรรมการอัปเดตและเวลาประทับของแคชเกตเวย์ หากมี
รายการตรวจสอบสำหรับการเลือกและการตรวจยืนยัน — ขยาย
| รายการตรวจสอบ | สิ่งที่ต้องยืนยัน | วิธีตรวจสอบ |
|---|---|---|
| การเข้ารหัส | ลำดับไบต์และลำดับเวิร์ดทั้งคำ | เปรียบเทียบไบต์ดิบกับตารางรีจิสเตอร์อย่างเป็นทางการ |
| ความหมาย | ชนิดข้อมูล สเกล และหน่วย | ตรวจสอบค่าที่ทราบอยู่แล้วหลายค่า |
| ความเป็นปัจจุบัน | การอัปเดตที่สอดคล้องกันและอายุแคช | อ่านรายละเอียดการทำงานและหลักฐานเวลาประทับ |
เครื่องมือวัดแสดงค่า 25 ขณะที่คอมพิวเตอร์แสดงค่าทศนิยมที่ไม่น่าเป็นไปได้ และบันทึกการสื่อสารรายงานว่าสำเร็จ สายเคเบิลหรือใยแก้วนำแสงไม่จำเป็นต้องชำรุดเสมอไป ข้อมูลอาจมาถึงครบถ้วนแล้วถูกตีความผิดในภายหลัง การทำความเข้าใจลำดับเวิร์ดของ Modbus ไม่จำเป็นต้องใช้สมการเต็มหน้า ลองติดตามว่ารีจิสเตอร์มีอะไรอยู่ ข้อความส่งข้อมูลนั้นอย่างไร และซอฟต์แวร์ประกอบค่ากลับอย่างไร เพื่อแยกแยะระหว่างการส่งผ่านที่สำเร็จกับค่าที่อ่านได้อย่างถูกต้อง

เริ่มจากช่องเก็บข้อมูลที่มีหมายเลข
Modbus กำหนดกฎสำหรับการแลกเปลี่ยนข้อมูลของอุปกรณ์อุตสาหกรรม เมื่ออ่าน holding register หรือ input register ให้จินตนาการว่าพื้นที่ข้อมูลของอุปกรณ์เป็นแถวของช่องเก็บข้อมูลที่มีหมายเลข รีจิสเตอร์แต่ละตัวเก็บข้อมูล 16 บิต หรือสองไบต์ โดยแต่ละไบต์มีแปดบิต สิ่งเหล่านี้เป็นหน่วยข้อมูลเชิงตรรกะ ไม่ได้หมายความว่าเครื่องมือวัดมีชิปแยกกันเรียงเป็นแถวอยู่จริง
หมายเลขบอกซอฟต์แวร์ว่าต้องไปดูที่ใด แต่ไม่ได้อธิบายอย่างครบถ้วนว่าข้อมูลที่เก็บไว้คืออะไร สองไบต์เดียวกันอาจแทนจำนวนเต็มไม่มีเครื่องหมายหรือชุดแฟล็กสถานะ ตารางรีจิสเตอร์ของอุปกรณ์อธิบายว่าข้อมูลหมายถึงอุณหภูมิ ความดัน พลังงาน หรือสิ่งอื่น ให้มองตารางนี้เหมือนรายการบรรจุสินค้า โดยที่อยู่ ชนิดข้อมูล หน่วย การปรับสเกล และเงื่อนไขความใช้ได้ต้องอยู่ด้วยกัน การคัดลอกเพียงที่อยู่จึงไม่เพียงพอ
ตรวจสอบรูปแบบการระบุที่อยู่ด้วย คู่มืออาจใช้หมายเลขอ้างอิง holding register เช่น 40001 ขณะที่ข้อความใช้ค่าออฟเซ็ตเริ่มต้น ซอฟต์แวร์บางตัวแปลงค่าให้ผู้ใช้โดยอัตโนมัติ เปรียบเทียบกับตัวอย่างคำขอในเอกสารเดียวกันเพื่อระบุว่าอินเทอร์เฟซต้องการหมายเลขอ้างอิงหรือค่าออฟเซ็ต วิธีนี้ช่วยหลีกเลี่ยงการอ่านข้อมูลทั้งชุดเหลื่อมไปหนึ่งช่อง การสลับเวิร์ดซ้ำ ๆ เพื่อชดเชยข้อผิดพลาดของที่อยู่มีแต่จะทำให้วินิจฉัยได้ยากขึ้น
ไบต์ใดออกจากรีจิสเตอร์ก่อน?
ค่ารีจิสเตอร์ตัวอย่าง 0x1234 สามารถแยกเป็นไบต์ 12 และ 34 ได้ การเขียนเลขฐานสิบหกเป็นเพียงวิธีบันทึกข้อมูลดิบแบบกระชับ ไม่ใช่การคำนวณขั้นสูงที่จำเป็นต้องทำหน้างาน การเข้ารหัสรีจิสเตอร์มาตรฐานของ Modbus วางไบต์สูง 12 ไว้ก่อนไบต์ต่ำ 34 ซอฟต์แวร์ฝั่งรับใช้ลำดับนี้เพื่อกู้คืนเนื้อหา 16 บิตเดิม
คำอธิบายนี้กล่าวถึงลำดับไบต์ในข้อความ ซึ่งต้องไม่สับสนกับลำดับของบิตอนุกรมแต่ละบิตภายในไบต์ รูปแบบการจัดเก็บในหน่วยความจำคอมพิวเตอร์เป็นอีกเรื่องหนึ่ง รูปแบบการจัดเก็บตามธรรมชาติของโปรเซสเซอร์ไม่ได้ให้อำนาจแอปพลิเคชันเปลี่ยนการเข้ารหัสข้อความของโพรโทคอล ข้อมูลที่ดักจับแสดงไบต์ของข้อความ ส่วนดีบักเกอร์อาจแสดงค่าหน่วยความจำที่ผ่านการแปลงแล้ว ระบุจุดที่สังเกตข้อมูลให้ชัดก่อนเปรียบเทียบ
เมื่อใช้สองรีจิสเตอร์จึงมีเรื่องลำดับเวิร์ด
ค่า 32 บิตไม่สามารถเก็บในรีจิสเตอร์ 16 บิตเพียงตัวเดียวได้ และโดยปกติจะใช้รีจิสเตอร์สองตัวที่อยู่ติดกัน นอกเหนือจากลำดับไบต์ภายในแต่ละรีจิสเตอร์ ยังมีคำถามอีกข้อว่า รีจิสเตอร์ที่มาก่อนเก็บ 16 บิตสูง หรือ 16 บิตต่ำของค่าทั้งหมด นั่นคือลำดับเวิร์ดที่กล่าวถึงในที่นี้ อุปกรณ์และการกำหนดค่าอาจแตกต่างกัน ดังนั้นการรองรับ Modbus เพียงอย่างเดียวจึงไม่ได้ยืนยันว่าจะใช้การจัดเรียงแบบเดียวกัน
ตัวอย่างเช่น 25.0 ในรูปแบบจำนวนจุดลอยตัวความแม่นยำเดี่ยว IEEE 754 มีสี่ไบต์คือ 41 C8 00 00 ตารางรีจิสเตอร์ตัวอย่างหนึ่งวาง 41C8 ไว้ในรีจิสเตอร์ N และ 0000 ไว้ใน N+1 ส่วนอีกตารางสลับสองเวิร์ดนี้ ทั้งสองแบบให้ค่า 25.0 เมื่ออ่านและประกอบกลับตามตารางของตนเอง การนำการตีความแบบแรกไปใช้กับแบบที่สองอาจให้ค่าผิดโดยสิ้นเชิง แม้การรับส่งจะสำเร็จ ตัวอย่างเหล่านี้ใช้เพื่อการอธิบาย ไม่ใช่ที่อยู่หรือการตั้งค่าของเครื่องมือวัดจริง

การสลับเวิร์ดต่างจากการสลับไบต์ภายในเวิร์ด
ลองจินตนาการถึงหนังสือสองเล่ม แต่ละเล่มมีหน้าบนและหน้าล่างแทนข้อมูลรวมสี่ไบต์ การสลับตำแหน่งหนังสือคล้ายกับการสลับเวิร์ด 16 บิตสองคำ ส่วนการสลับหน้าภายในแต่ละเล่มคล้ายกับการสลับไบต์ภายในเวิร์ด การดำเนินการเหล่านี้กระทบขอบเขตข้อมูลคนละระดับ ป้ายกำกับในซอฟต์แวร์ เช่น big-endian, little-endian หรือ swap อาจหมายถึงระดับที่ต่างกัน จึงไม่สามารถระบุการแปลงได้จากชื่อเมนูเพียงอย่างเดียว
บันทึกไบต์ดิบทั้งสี่ตามลำดับที่รับมา และเขียนลำดับที่ซอฟต์แวร์ใช้ประกอบค่ากลับไว้ข้างกัน เปลี่ยนการตั้งค่าการตีความที่ระบุได้ชัดเจนครั้งละรายการ แล้วเปรียบเทียบกับตารางรีจิสเตอร์อย่างเป็นทางการ หลีกเลี่ยงการใช้การสลับแบบเดียวกันกับทุกจุดโดยไม่ตรวจสอบ หรือถือว่าตัวเลขที่ดูสมเหตุสมผลเพียงค่าเดียวพิสูจน์ว่าตารางทั้งหมดถูกต้อง ค่าใกล้ศูนย์อาจซ่อนข้อผิดพลาดด้านลำดับได้ จึงควรตรวจสอบค่าที่ทราบอยู่แล้วหลายค่าซึ่งแตกต่างกันอย่างชัดเจน
CRC ที่ท้ายเฟรม Modbus RTU เป็นรหัสตรวจจับข้อผิดพลาดที่ช่วยตรวจสอบว่าเนื้อหาที่ส่งเปลี่ยนแปลงไปหรือไม่ หากอุปกรณ์ตั้งใจส่งข้อมูลแบบเวิร์ดต่ำก่อน CRC ของข้อมูลนั้นก็อาจถูกต้องได้ การที่ซอฟต์แวร์ตีความข้อมูลภายหลังเป็นแบบเวิร์ดสูงก่อนจะไม่ทำให้ CRC รายงานข้อผิดพลาดในการตีความนั้น การอ่านที่อยู่อื่นที่ยังถูกต้องตามกฎก็อาจผ่านการตรวจสอบได้เช่นกัน เก็บหลักฐานแยกกันระหว่างสิ่งที่รับมาและวิธีที่ใช้ตีความ
ไบต์เดียวกันอาจต้องตีความต่างกัน
ลำดับที่ถูกต้องเป็นเพียงข้อกำหนดหนึ่งเท่านั้น จำนวนเต็ม 32 บิตกับค่าจุดลอยตัว 32 บิตใช้การตีความต่างกัน รูปแบบจุดลอยตัวสามารถแทนค่าเศษส่วนได้ แต่ไม่ได้หมายความว่าข้อมูลทุกชุดที่มีสี่ไบต์ควรถอดรหัสเป็นค่าจุดลอยตัว จำนวนเต็มมีเครื่องหมายรองรับค่าลบ ส่วนจำนวนเต็มไม่มีเครื่องหมายใช้การตีความช่วงค่าที่ต่างออกไป ให้ยึดตัวเลือกเหล่านี้จากเอกสารอุปกรณ์ แทนการคาดเดาจากความสมเหตุสมผลของค่าบนหน้าจอ
การปรับสเกลและหน่วยก็เป็นส่วนหนึ่งของกระบวนการตีความ หากตารางรีจิสเตอร์ระบุชัดเจนว่าจำนวนเต็มดิบ 253 หมายถึง 25.3 องศาเซลเซียส ซอฟต์แวร์ควรใช้ข้อตกลงนั้น แทนที่จะแสดง 253 องศาเซลเซียส นี่เป็นตัวอย่างแยกจากค่าจุดลอยตัว 25.0 ข้างต้น ตรวจสอบรหัสแทนค่าที่ใช้ไม่ได้ ตัวบ่งชี้สถานะออฟไลน์ และบิตสงวนด้วย การนำรหัสพิเศษที่หมายถึงไม่มีข้อมูลไปพล็อตเป็นค่าการวัดปกติอาจทำให้ดูเหมือนเกิดความผิดปกติในกระบวนการอย่างน่าเชื่อถือทั้งที่ไม่จริง

แม้ลำดับถูกต้อง ก็ยังต้องมีจังหวะการเก็บตัวอย่างที่สอดคล้องกัน
เมื่ออ่านรีจิสเตอร์สองตัวด้วยคำขอแยกกัน อุปกรณ์อาจอัปเดตระหว่างการอ่านได้ ลองพิจารณาตัวนับไม่มีเครื่องหมายขนาด 32 บิตในตัวอย่าง ซึ่งเปลี่ยนจาก 0000 FFFF เป็น 0001 0000 การอ่านเวิร์ดสูงเก่า 0000 แล้วตามด้วยเวิร์ดต่ำใหม่ 0000 จะได้ 0000 0000 ผลลัพธ์นี้ไม่ใช่ค่าเก่าที่ครบถ้วนและไม่ใช่ค่าใหม่ที่ครบถ้วน ปัญหาคือความสอดคล้องของการเก็บตัวอย่าง
การอ่านรีจิสเตอร์สองตัวที่ต่อเนื่องกันในคำขอเดียวมักลดช่วงเวลาที่เกิดจากการใช้คำขอแยกกัน แต่ไม่ได้พิสูจน์ว่าอุปกรณ์ทุกตัวให้สแนปช็อตแบบอะตอมมิก ตรวจสอบเอกสารรายละเอียดการทำงานเกี่ยวกับการล็อกค้างข้อมูล พฤติกรรมการรีเฟรช หมายเลขลำดับ หรือเวลาประทับที่ระบุการอัปเดตเดียวกันอย่างสอดคล้อง หากเกตเวย์แคชข้อมูล ให้บันทึกเวลาอัปเดตแคชด้วย ข้อความที่เพิ่งส่งกลับมาไม่จำเป็นต้องมีค่าที่เพิ่งวัด และการโพลถี่ขึ้นไม่สามารถทดแทนกลไกรักษาความสอดคล้องได้
กำหนดหน้าที่ความรับผิดชอบตลอดเส้นทางการสื่อสาร
เว็บไซต์ของ FCTELE แสดงข้อมูลโมเด็มใยแก้วนำแสง Modbus แบบติดราง DIN สำหรับงานอุตสาหกรรม รุ่น FCP-D8G สำหรับส่งผ่านการสื่อสารอนุกรม Modbus แบบจุดต่อจุดผ่านใยแก้วนำแสง สิ่งนี้แสดงให้เห็นการแบ่งหน้าที่ที่มีประโยชน์ คือ ลิงก์ใยแก้วนำแสงทำหน้าที่ส่งผ่านข้อมูลการสื่อสาร ขณะที่ตารางรีจิสเตอร์ของเครื่องมือวัดกำหนดความหมายของข้อมูล การใช้โมเด็มใยแก้วนำแสง Modbus ไม่ได้ยืนยันว่าจะรู้จำลำดับเวิร์ดของค่าจุดลอยตัวของเครื่องมือวัดทุกชนิด แปลงหน่วย หรือสร้างสแนปช็อตการวัดที่ซิงโครไนซ์กันได้โดยอัตโนมัติ ตรวจสอบความสามารถจริงกับเอกสารของผลิตภัณฑ์รุ่นที่เกี่ยวข้อง
เริ่มตรวจสอบด้วยอุปกรณ์หนึ่งตัวและจุดแบบอ่านอย่างเดียวหนึ่งจุดที่ได้รับอนุญาต บันทึกคำขอและคำตอบจากธุรกรรมเดียวกัน ยืนยันอุปกรณ์เป้าหมาย รหัสฟังก์ชัน ข้อตกลงการระบุที่อยู่เริ่มต้น และจำนวนรีจิสเตอร์ จากนั้นตรวจสอบรีจิสเตอร์ดิบ ลำดับเวิร์ด ชนิดข้อมูล การปรับสเกล หน่วย และเวลาอัปเดต การตรวจสอบความถูกต้องครบถ้วนที่ผ่านเป็นเพียงขั้นตอนหนึ่ง ไม่ใช่หลักฐานว่าการตีความเพื่อใช้งานทางธุรกิจถูกต้อง อธิบายและจัดทำเอกสารกระบวนการอ่านทั้งหมดนี้ก่อนขยายไปยังจุดอื่น บันทึกดังกล่าวจะช่วยรองรับการตรวจสอบอย่างเป็นระบบเมื่อเปลี่ยนเครื่องมือวัดหรือชุดซอฟต์แวร์
หากจุดหนึ่งอ่านได้ถูกต้องด้วยเครื่องมือในพื้นที่ แต่ผิดเมื่ออ่านผ่านลิงก์ใยแก้วนำแสง ให้เปรียบเทียบคำตอบดิบจากอุปกรณ์เดียวกันภายใต้การกำหนดค่าเดียวกัน จากนั้นตรวจสอบการเลือกช่องสัญญาณ การตั้งค่าการสื่อสารอนุกรม และบันทึกเหตุการณ์ ไบต์ดิบที่เหมือนกันแต่แสดงค่าต่างกันชี้ไปที่การตั้งค่าตัวถอดรหัส ส่วนไบต์ที่ต่างกันหรือธุรกรรมที่ไม่ตรงกันจำเป็นต้องตรวจสอบเพิ่มเติมตามเส้นทางการสื่อสาร ลำดับนี้ช่วยลดการเปลี่ยนฮาร์ดแวร์โดยไม่จำเป็น โดยไม่มองข้ามความขัดข้องในการส่งผ่านที่เกิดขึ้นจริงว่าเป็นเพียงปัญหาลำดับเวิร์ด
เอกสารอ้างอิงและขอบเขต
องค์กร Modbus: รีจิสเตอร์และรูปแบบข้อมูล; โพรโทคอลแอปพลิเคชัน V1.1b3 หัวข้อ 4.2: การเข้ารหัสไบต์; Schneider Electric: การแมปรีจิสเตอร์และตัวอย่างลำดับเวิร์ด; Schneider Electric: การอ่านค่าจุดลอยตัวที่สลับเวิร์ด; ข้อมูลโมเด็มใยแก้วนำแสง FCTELE FCP-D8G Modbus (ภาษาจีน). การตั้งค่าของบุคคลที่สามไม่ได้ยืนยันความสามารถของผลิตภัณฑ์ FCTELE ภาพประกอบและตัวอย่างเป็นคำอธิบายที่จัดทำขึ้นโดยอิสระ ไม่ใช่ผลการวัดหรือคำแนะนำการเดินสาย
แปลจากบทความทางเทคนิคภาษาจีน: อ่านบทความต้นฉบับภาษาจีน.
คำถามที่พบบ่อย
เหตุใดการรับส่ง Modbus ที่สำเร็จจึงยังแสดงค่าผิดได้?
การส่งผ่านและการตีความเป็นคนละเรื่องกัน ตรวจสอบอุปกรณ์เป้าหมาย ข้อตกลงการระบุที่อยู่ จำนวนรีจิสเตอร์ ลำดับเวิร์ด ชนิดข้อมูล การปรับสเกล หน่วย และเวลาอัปเดต CRC ที่ถูกต้องไม่ได้พิสูจน์ว่าการตีความเพื่อใช้งานทางธุรกิจถูกต้อง
การสลับรีจิสเตอร์สองตัวเหมือนกับการสลับไบต์หรือไม่?
ไม่เหมือนกัน อย่างหนึ่งเปลี่ยนตำแหน่งของเวิร์ด 16 บิตทั้งคำ ส่วนอีกอย่างอาจเปลี่ยนตำแหน่งไบต์ภายในเวิร์ด ตรวจสอบตารางของอุปกรณ์และวิธีประกอบค่ากลับที่ใช้จริง แทนการยึดเพียงป้ายกำกับเมนู
คำขออ่านรีจิสเตอร์สองตัวเพียงครั้งเดียวรับประกันว่าเป็นการเก็บตัวอย่าง ณ เวลาเดียวกันหรือไม่?
ไม่รับประกัน การอ่านแบบบล็อกอาจลดช่วงเวลาที่เกิดจากคำขอแยกกัน แต่สแนปช็อตแบบอะตอมมิก การล็อกค้างข้อมูล และพฤติกรรมการรีเฟรชขึ้นอยู่กับการออกแบบการทำงาน ข้อมูลที่แคชไว้ในเกตเวย์ก็ต้องตรวจสอบเวลาอัปเดตด้วย
อ่านเพิ่มเติม
PLC หลายตัวและฮับ Modbus · การจัดเฟรมไบต์และการเก็บตัวอย่างของ UART


