ทดสอบการสื่อสาร Modbus Protocol ด้วย QModBus

Modbus protocol ถือเป็นมาตรฐานโพรโทคอลการสื่อสารหนึ่งที่ได้รับความนิยมและใช้กันอย่างแพร่หลายในอุตสาหกรรมปัจจุบัน เนื่องจากตัว Modbus นั้นมีข้อดีอยู่หลายอย่างเช่นติดตั้งง่าย ใช้งานสะดวก การสื่อสารมีความเสถียร และที่สำคัญคือเป็น Open Protocol สำหรับผู้ใดที่ต้องการใช้งานก็สามารถนำไปพัฒนาต่อยอดได้โดยไม่มีค่าใช้จ่าย อีกทั้งสามารถเชื่อมต่ออุปกรณ์หรือเซ็นเซอร์ต่าง ๆ ได้มากถึง 247 ตัว โดยทั่วไปแล้ว Modbus นั้นจะมี Master อยู่ 1 ตัวเพื่อใช้ในการส่งคำสั่งไปยังอุปกรณ์ Slave ซึ่งสามารถมีไอดีได้ตั้งแต่ 1 – 247 โดยที่ Master นั้นจะทำการส่งคำสั่งอ่านหรือเขียนข้อมูลลงไปยัง Register ที่ใช้เก็บข้อมูลของอุปกรณ์ที่ต้องการได้เพียงแค่ระบุเลขไอดีเท่านั้น

มาถึงตรงนี้แล้ว หากใครที่ยังสงสัย หรือต้องการข้อมูลเพิ่มเติมก็สามารถย้อนไปดูบทความที่ทาง บริษัท NDR Solution Co. Ltd. ของเราเขียนไว้ได้ ตั้งแต่เรื่องของ Fieldbus network เบื้องต้น และ Modbus Introduction หรือแม้แต่ มาทำความรู้จัก RS-485 กันเถอะ ซึ่งทางเรานั้นได้มีการเขียนบทความที่เกี่ยวข้องไว้หลากหลายบทความเลยทีเดียว สามารถไปเลือกอ่านรายละเอียดเพิ่มเติมกันได้เลยนะครับ

แน่นอนครับว่าในบทความนี้จะไม่ได้มาพูดถึงรายละเอียดยิบย่อยต่าง ๆ ของ Modbus Protocol แต่อย่างใด แต่จะมาพูดถึงการใช้งาน Modbus แบบง่าย ๆ ด้วยโปรแกรมที่ชื่อ QModBus กัน มาดูกันครับว่าเราจะสามารถใช้งานเจ้า QModBus ในการสื่อสารกับอุปกรณ์ที่ใช้ Modbus Protocol กันอย่างไรได้บ้าง เราไปเริ่มกันเลยครับ

ก่อนอื่นเลยคงต้องขอแนะนำเจ้าโปรแกรม QModBus กันสักเล็กน้อย

QModBus [1] นั้นถูกพัฒนาขึ้นโดยบริษัท EDC Electronic Design Chemnitz GmbH ซึ่งเป็นโปรแกรมแบบ GUI (Graphical user interface) ที่พัฒนาขึ้นเพื่อใช้ในการสื่อสาร Modbus Protocol โดยเฉพาะ ตัวโปรแกรม QModBus จะทำตัวเสมือนเป็น Master ในการส่งคำสั่งอ่านหรือเขียนไปยัง Register ของ Slave ที่ต้องการ ซึ่งเราสามารถเลือกได้ว่าเราจะอ่านหรือเขียน Register เป็นรายตัว (Single Register) หรือครั้งละหลาย ๆ Register (Multiple Registers) ก็สามารถทำได้เช่นกัน พูดถึงในส่วน Ineterface ของโปรแกรม QModBus นั้นก็ไม่ได้มีความซับซ้อนแต่อย่างใด ตัวโปรแกรมออกแบบมาให้สามารถใช้งานได้ง่าย มีการแสดงข้อมูลในส่วนของ Request/Response เพื่อให้เราสามารถเห็นการตอบสนองของข้อมูลระหว่างตัวโปรแกรมที่เป็น Master กับอุปกรณ์ที่เป็น Slave ที่เราสื่อสารได้อีกด้วย

รูปที่ 1 QModBus [1]

แนะนำการติดตั้งโปรแกรม QModBus

ขั้นตอนแรกเราต้องทำการติดตั้งโปรแกรม QModBus กันก่อน โดยตัวอย่างที่จะแสดงต่อไปนี้จะ based-on Windows OS แต่อย่างไรก็ตาม QModBus สามารถติดตั้งได้แบบ Cross-platform เลยเนื่องจาก QModBus นั้นถูกพัฒนาด้วยคิวท์ (Qt) ทำให้สามารถทำงานได้บนระบบปฏิบัติการอื่น ๆ เช่น Linux ได้อีกด้วย สามารถไปดาวน์โหลดตัวติดตั้งโปรแกรมได้ที่หน้าเว็บหลักของ QModBus [1] หรือจะเป็นใน Github [3] ก็ได้เช่นกัน จากนั้นให้ทำการติดตั้งโปรแกรม QModBus ง่าย ๆ เพียงกด Next ตามขั้นตอนการติดตั้งได้เลยครับ

โดยโปรแกรม QModBus ที่ทางเราติดตั้งนั้นจะใช้เป็น Version 0.3.0 สำหรับการยกตัวอย่างการใช้งานในครั้งนี้ หลังจากที่เราได้ทำการติดตั้งโปรแกรม QModBus เรียบร้อยแล้วนั้น ให้ทำการเปิดโปรแกรม QModBus ขึ้นมา จะได้ GUI แสดงขึ้นมาดังรูปที่ 2 จะเห็นได้ว่าหน้าตาของโปรแกรมค่อนข้าง User-friendly เลยทีเดียวใช่ไหมล่ะครับ

รูปที่ 2 ตัวอย่าง GUI ของโปรแกรม QModBus

การใช้งานโปรแกรม QModBus เบื้องต้น

ก่อนที่เราจะเริ่มการใช้งานนั้น เราจำเป็นต้องมีอุปกรณ์ที่จะใช้ในการทดลองซึ่งจะประกอบไปด้วย

  • สาย USB to RS485 จำนวน 1 เส้น [ตัวอย่างเช่น USB-RS485] และ
  • อุปกรณ์ที่มีการสื่อสารด้วยโพรโทคอล Modbus 1 ตัว [ตัวอย่างเช่น Energy Analyzer]

เมื่อมีอุปกรณ์พร้อมแล้ว ก็ให้ทำการเสียบสาย USB to RS485 เข้ากับคอมพิวเตอร์ของเรา จากนั้นให้เราทำการเชื่อมต่อสาย A (หรือ D+) และ B (หรือ D-) ของ USB to RS485 ไปยังอุปกรณ์ที่เราต้องการจะสื่อสารด้วย QModBus ให้เรียบร้อย

ถัดมาจะเป็นในส่วนของการใช้งานโปรแกรม QModBus หลัก ๆ แล้วตัวโปรแกรม QModBus จะมีโหมดการทำงานอยู่ 3 โหมดด้วยกัน ได้แก่

  • Modbus RTU
  • Modbus TCP
  • Modbus ASCII

ซึ่ง Modbus แต่ละประเภทจะเป็นอย่างไรนั้นสามารถไปอ่านข้อมูลเพิ่มเติมได้ที่บทความ Modbus Introduction ในหัวข้อ “ชนิดของโพรโทคอล Modbus”  ซึ่งจะพูดถึงรายละเอียดของแต่ละชนิดไว้เรียบร้อยแล้ว ไปติดตามที่บทความนี้ได้เลยครับ

ทีนี้เรามาเริ่มทดสอบการใช้งานกัน โดยหลังจากที่เราได้ทำการเปิดโปรแกรม QModBus ขึ้นมาแล้วนั้น ให้เราเลือกรูปแบบการสื่อสารแบบที่เราต้องการใช้งาน ซึ่งในบทความนี้จะใช้ Modbus RTU เป็นโหมดหลักดังตัวอย่างในรูปที่ 3 ในการแสดงตัวอย่างการใช้งานโปรแกรมนะครับ

 

รูปที่ 3 เลือกโหมดการทำงาน Modbus RTU

เมื่อได้ทำการเลือกโหมดแล้ว ให้เราติ๊กที่ Active จากนั้นให้เลือกพอร์ต USB to RS485 ของเราดังตัวอย่างรูปที่ 4 จะเห็นว่าในส่วนของ Serial port ได้ทำการเลือก “COM5” ซึ่งเป็นพอร์ตของ USB ที่เสียบกับคอมพิวเตอร์ของเรา ถัดมาให้เราทำการตั้งค่าต่าง ๆ ตามอุปกรณ์ที่เราจะสื่อสารด้วย โดยในตัวอย่างนี้จะใช้ Baud Rate = 115200 / Data bits = 8 / Stop bits = 1 และ Parity = none ครับ

รูปที่ 4 ตัวอย่างการตั้งค่าการสื่อสารกับอุปกรณ์

เมื่อได้ทำการตั้งค่าเรียบร้อยแล้ว ก็พร้อมที่จะทดสอบส่งคำสั่งอ่านหรือเขียนไปยังอุปกรณ์ของเราแล้วล่ะครับ ซึ่งในตัวอย่างนี้จะต่อ USB to RS485 เข้ากับอุปกรณ์หนึ่งซึ่งเป็นอุปกรณ์ที่ทางบริษัทของเราได้ทำการพัฒนาขึ้นมา จะขอเรียกว่าเป็นบอร์ดพัฒนา (Development Board) นะครับ 

แต่ก่อนที่เราจะสื่อสารกับอุปกรณ์ของเราได้นั้น เราจำเป็นจะต้องรู้ว่าอุปกรณ์ของเรานั้นมีเลข Device ID (Slave ID) อะไร เพื่อที่จะได้สื่อสารกันระหว่าง Master และ Slave ได้ถูกต้อง จากนั้นเราจะต้องระบุได้ว่าจะเรียกอ่านหรือเขียนข้อมูลไปยัง Register ใด จำนวน Register ที่ต้องการจะอ่านหรือเขียนทั้งหมดเท่าไหร่ อาจจะอ่าน Register ครั้งละตัว (Single Register) หรืออ่าน Register ครั้งละหลาย ๆ ตัว (Multiple Register)  โดยในตัวอย่างนี้บอร์ดพัฒนาที่ทางเราได้นำมาใช้ในการยกตัวอย่างนั้น จะมีเลข Device ID เป็น “6” และต้องการอ่านไปที่ “Holding Register” ของอุปกรณ์ เพื่ออ่านค่าต่าง ๆ ดังนี้

  • Device ID     @0x0000     -> หมายเลขประจำตัวบอร์ดพัฒนา
  • Firmware Version   @0x0001     -> เฟิร์มแวร์เวอร์ชันของบอร์ดพัฒนา
  • Mac Address H @0x0002 (byte 5-4) -> Mac address บิทสูง
  • Mac Address M @0x0003 (byte 3-2) -> Mac address บิทกลาง
  • Mac Address L @0x0004 (byte 1-0) -> Mac address บิทต่ำ

จากตัวอย่างที่กล่าวมา สามารถสรุปข้อมูลได้ว่า

  • Slave Id = 6
  • Function Code = Read Holding Registers (0x03)
  • Start Address = 0
  • Number of coils = 5
จากนั้นให้เราทำการใส่ค่าต่าง ๆ นี้ลงไปยังช่อง Modbus Request จากนั้นก็ให้ทำการกด “Send” เพื่อทำการส่งคำสั่งอ่านลงไปยังอุปกรณ์ของเราได้ทันที หากการส่งคำสั่งไปยังอุปกรณ์ของเรานั้นสำเร็จ จะมีข้อมูลขึ้นในช่อง Register ด้านล่างซึ่งจะเป็นข้อมูลจำเพาะที่เราทำการ Request ไปยังตัว Slave ดังตัวอย่างรูปที่ 5 นั่นเอง
 

รูปที่ 5 ส่งคำสั่งอ่าน Holding Register ไปยังอุปกรณ์ปลายทาง

จากรูปที่ 5 นี้จะเห็นได้ว่าข้อมูลที่ได้ออกมาสามารถจำแนกได้ดังนี้

  • Register 0 @0x0000 -> Device ID = 6
  • Register 1 @0x0001 -> Firmware Version = 21
  • Register 2 @0x0002 -> Mac Address H = 3211 หรือ 0x0C8B
  • Register 3 @0x0003 -> Mac Address M = 38213 หรือ 0x9545 และ
  • Register 4 @0x0004 -> Mac Address L = 49208 หรือ 0xC038

โดยหากนำค่า Mac Address ของบอร์ดพัฒนานี้มาเรียงกันนั้นก็จะได้ “0C8B9545C038” เป็นต้น

แต่ในทางกลับกัน หากระบุค่าจำเพาะบางอย่างไม่ถูกต้อง หรือการสื่อสารมีการผิดพลาด ก็จะไม่สามารถส่งคำสั่งไปยังอุปกรณ์ได้ ดังตัวอย่างในรูปที่ 6 ซึ่งจะยกตัวอย่างในการส่งคำสั่งไปยังอุปกรณ์หมายเลข 5 แต่ในทางปฏิบัติแล้วนั้น ทางเราไม่ได้มีการเชื่อมต่ออุปกรณ์ที่มีเลข Device ID หมายเลข 5 อยู่ ทำให้ไม่สามารถทำการสื่อสารกับอุปกรณ์ Slave หมายเลข 5 ได้นั่นเอง หรืออาจจะเป็นกรณีอื่นตัวอย่างเช่น เราทำการส่ง Request การอ่านค่าไปยัง Register ที่ไม่มีอยู่ในตัวอุปกรณ์ของเรา ก็จะทำให้เกิดการส่งคำสั่งล้มเหลวได้เช่นกัน

รูปที่ 6 ตัวอย่างการส่งคำสั่งไปยังอุปกรณ์ปลายทางล้มเหลว

นอกจากส่งคำสั่งไปยังอุปกรณ์ปลายทางเพื่อ Request การอ่านค่าแล้ว QModBus ยังสามารถทำการเขียนข้อมูลลงไปยัง Register ของอุปกรณ์ของเราได้อีกด้วย โดยการตั้งค่าเพียงเปลี่ยนจาก Read Holding Register (0x03) ไปเป็น Write Single Register (0x06) หรือ Write Multiple Registers (0x10) โดยในตัวอย่างนี้จะขอเลือกยกตัวอย่างเป็น Write Multiple Register (0x10) เพื่อทำการเขียนค่า ID ของ CAN Bus ลงไปยังบอร์ดพัฒนาของเรานะครับ แน่นอนครับว่าเราจำเป้นที่จะต้องรู้ตำแหน่ง (Address) ที่เก็บค่านี้เสียก่อน โดยในตัวอย่างนี้ตำแหน่งที่ทำการเก็บค่า CAN Bus ID จะมีอยู่ 2 ตำแหน่งดังนี้

  • CAN_ID_H @0x0013 -> CAN ID บิทสูง
  • CAN_ID_L @0x0014 -> CAN ID บิทต่ำ

เมื่อเราทราบตำแหน่งที่เราจะทำการเขียนข้อมูลลงไปยังอุปกรณ์ของเราแล้ว ให้เรากรอกค่าลงไปยังช่อง Modbus Request อีกเช่นเคย แต่มีข้อสังเกตุเล็กน้อยคือ เลขตำแหน่ง (Address) ที่เราทราบนั้นเป็นเลข Hexadecimal ซึ่งเป็นฐาน 16 แต่ตัวโปรแกรม QModBus นั้นจะให้ผู้ใช้ทำการระบุค่าต่าง ๆ เป็นเลขฐาน 10 หรือ Decimal นั่นแสดงว่าเราไม่สามารถใส่เลข “13” ไปตรง ๆ ในช่อง Start Register ได้ แต่จะต้องเป็นเลข “19” เนื่องจาก 13 ในฐาน 16 นั้นมีค่าเท่ากับ 19 ในฐาน 10 นั่นเองครับ 

จากตัวอย่างที่กล่าวมา สามารถสรุปข้อมูลได้ว่า

  • Slave Id = 6
  • Function Code = Write Multiple Registers (0x10)
  • Start Address = 19
  • Number of coils = 2

หลังจากที่เราได้ทำการตั้งค่าเรียบร้อยแล้วนั้น สิ่งที่ต้องทำต่อไปก็คือใส่ข้อมูลจำเพาะที่เราต้องการจะเขียนลงไปยัง Register ดังกล่าวทั้งสองตำแหน่ง ซึ่งวิธีการก็จะตรงไปตรงมาคือ ในช่องของ Register ด้านล่างนั้นจะมีคอลัมน์ที่ชื่อ “Data” ให้เราทำการดับเบิลคลิกไปที่ตำแหน่งที่ต้องการ ตัวอย่างเช่นดังรูปที่ 7 ในช่องของ Register 19 นั้น จะใส่ข้อมูลที่ต้องการเขียนลงไปยัง CAN ID บิทสูง (CAN_ID_H) ด้วยเลข 4660 และเขียนลงไปยัง CAN ID บิทต่ำ (CAN_ID_L) ด้วยเลข 43981 จากนั้นให้ทำการกด “Send” เพื่อทำการส่งคำสั่งลงไปยังอุปกรณ์ที่ต้องการ ซึ่งจะสามารถสังเกตสถานะได้จากมุมด้านล่างซ้ายมือ จะเป็นสีเขียวดังแสดงในรูปที่ 7 ว่าได้ทำการส่งข้อมูลไปยังปลายทางสำเร็จแล้ว หรืออาจจะดูจากช่องทางด้านขวามือในส่วนของ Modbus requests/responses ก็ได้ จะเห็นว่ามี response กลับมาเมื่อมีการส่งข้อมูลไปสำเร็จแล้วนั่นเอง

รูปที่ 7 ตัวอย่างการส่งคำสั่งเขียนข้อมูลลงไปยัง Register ของอุปกรณ์ปลายทาง

จากรูปที่ 7 จะสามารถจำแนกข้อมูลที่จะทำการส่งไปยังอุปกรณ์ได้ดังนี้

  • Register 19 @0x0013 -> CAN ID H = 4660 หรือ 0x1234 และ
  • Register 20 @0x0014 -> CAN ID L = 43981 หรือ 0xABCD

โดยหากบอร์ดพัฒนาได้รับค่า CAN ID ที่ส่งมาจาก QModBus แล้ว เมื่อนำค่าที่ได้มาเรียงกันตามลำดับ ก็จะได้ CAN ID หมายเลข “0x1234ABCD” สำหรับอุปกรณ์ชิ้นนี้ เป็นต้น 

เป็นอย่างไรกันบ้างครับสำหรับบทความในวันนี้ หวังว่าคงจะเป็นประโยชน์ให้กับเพื่อน ๆ ทุกคนได้รู้จักกับซอฟต์แวร์ที่ใช้ในการทดสอบการสื่อสาร Modbus protocol อย่าง QModBus ได้มากขึ้น ทั้งรูปแบบการใช้งานการส่งคำสั่งไปยังอุปกรณ์ที่เราต้องการเพื่ออ่านค่า หรือเขียนค่าลงไปยัง Register บนอุปกรณ์นั้น ๆ ซึ่งจากตัวอย่างที่กล่าวไปทั้งหมดทั้งมวลนี้ ผู้เขียนบทความได้นำอุปกรณ์ที่อยู่ใกล้ตัวมาใช้ในการนำเสนอบทความ แต่ในความเป็นจริงแล้วอุปกรณ์ที่สามารถเชื่อมต่อกับ Modbus Protocol ได้นั้นมีหลากหลายแบบด้วยกัน ไม่ว่าจะเป็นอุปกรณ์ที่สามารถสื่อสาร Modbus ได้ เช่นเซ็นเซอร์แบบต่าง ๆ บอร์ดพัฒนาที่ทางเราได้นำมาเป็นตัวอย่าง รวมถึงมิเตอร์วัดพลังงาน เป็นต้น ถ้าหากอุปกรณ์เหล่านั้นซัพพอร์ดโพรโทคอล Modbus แล้วละก็ QModBus ก็ถือเป็นเครื่องมือทางเลือกหนึ่งที่จะใช้ในการทดสอบการสื่อสาร Modbus protocol ได้ครับ

Content Reference

  • QModBus – a free ModBus master application: Link

Created by Noppameth Pawitpanich