MODBUS

ByDeveloper

ม.ค. 26, 2021

Modbus คือ โปรโตคอล (Protocol) การสื่อสารที่พัฒนาขึ้นโดยบริษัท Modicon Systems ด้วยรูปแบบง่ายๆ เป็นรูปแบบการส่งข้อมูลระหว่างอุปกรณ์อิเล็กทรอนิกส์ ซึ่งเป็นโปรโตคอลพื้นฐานและนิยมใช้งานอย่างแพร่หลายในงานอุตสาหกรรม เพื่อเชื่อมโยงข้อมูลระหว่างอุปกรณ์ต่างๆ 

ซึ่งการสื่อสาร Modbus แบ่งออกเป็น 2 ระบบคือ Modbus RTU (เป็นพอร์ตการสื่อสารแบบอนุกรม RS232, RS485, RS422) และ Modbus TCP/IP (LAN) โดยความแตกต่างอยู่ที่ความเร็ว ระยะทางในการรับส่งข้อมูลและโปรโทคอลการสื่อสารที่ใช้ โดย Modbus RTU สามารถรับส่งได้ระยะทางสูงสุดถึง 1.2 กิโลเมตร (ที่ความเร็ว 57.6 kbps) ในขณะที่ Modbus TCP สามารถรับส่งได้ระยะทางได้ 100 เมตร(ที่ความเร็วสูงสุดถึง 100 Mbps)   

MODBUS RTU เป็นการสื่อสารแบบอนุกรม (Serial Communications protocol) โดยการส่งข้อมูลไปตามสายสัญญาร Serial ระหว่างอุปกรณ์ในลักษณะ Master/Slave ซึ่งเป็นการสื่อสารจากอุปกรณ์แม่ (Master) เครื่องเดียว ไปยังอุปกรณ์ลูก (Slave) ได้หลายเครื่องโดยสามารถกำหนดหมายเลขอุปกรณ์ (ID) ได้

Master สามารถติดต่อกับ Slave แต่ละตัวได้หรือสามารถส่งเป็น Message ถึง Slave ทุกตัวได้จะตอบสนองสิ่งที่ Master ต้องการเท่านั้น สิ่งที่ Master ส่งให้จะประกอบด้วย Slave Address, Function Code (คำสั่งหรือสิ่งที่ต้องการให้ทำ), Data และ Checksum ส่วนข้อมูลที่ Slave ส่งกลับมาจะประกอบด้วยคำสั่งที่ให้ทำหรือข้อมูลต่างๆ และ Checksum (Cyclic Redundancy Check: CRC)

Modbus RTU โดยทั่วไปจะถูกเก็บ 4 รูปแบบคือ 

  • Output coil
  • Input contacts
  • Input register
  • Holding register

โดย Output Coil และ Input contacts แต่ละ Address จะเก็บค่าเพียง 1 บิต หรือมีค่าได้แค่ “0” กับ “1” เปรียบเสมือนค่าการเปิด-ปิด ของอุปกรณ์สวิตช์หรือดีเลย์

ส่วน Input register และ Holding register สามารถเก็บค่าเป็นตัวเลขได้ถึง 16 บิต เปรียบเสมือนค่าที่มาจากอุปกรณ์ตรวจวัดที่ส่งข้อมูลมา

Register
Register Address Type Description
OUTPUT COIL 00001 – 09999 Read – Write Bit Digital Output “0”,”1”
INPUT CONTACTS 10001 – 19999 Read – Only Bit Digital Input “0”,”1”
INPUT REGISTER 30001 – 39999 Read -Only 16 Bit Analog Input
HOLDING REGISTER 40001 – 49999 Read – Write 16 Bit Analog Output

ฟังก์ชันการทำงานสามารถแบ่งหน้าที่ต่างๆ ได้ตามรหัส โดยหลักๆแล้ว จะมีฟังก์ชันการทำงานอยู่ 2 แบบ คือ การอ่าน (Read) และเขียน (Write) ข้อมูลแบบ Digital “0” กับ “1”และ ข้อมูลแบบ Analog โดยมีขนาด 16 บิต หรือ 0000 ถึง FFFF

Modbus Function Code
Function Code (Dec) Register Type Descriptions
01 Read Coil แสดงสถานะของ Digital Output (0 = OFF, 1 = ON)
02 Read Discrete Input แสดงสถานะของ Digital Input (0 = OFF, 1 = ON)
03 Read Holding แสดงค่าของ Analog Output
04 Read Input แสดงค่าของ Analog Input
05 Write Single Coil เขียนค่ากลับไปยัง Digital Output (เขียนค่าได้ทีละ 1 register)
06 Write Single Holding เขียนค่ากลับไปยัง Analog Output (เขียนค่าได้ทีละ 1 register)
15 Write Multiple Coil เขียนค่ากลับไปยัง Digital Output (เขียนค่าได้ทีละหลาย register)
16 Write Multiple Holding เขียนค่ากลับไปยัง Analog Output (เขียนค่าได้ทีละหลาย register)

ตัวอย่าง

การอ่านค่าของ Holding register ที่แอดเดรส 40103 ถึง 40105 จากอุปกรณ์ Slave หมายเลข 21

ดังนั้น Frame Message (ไม่รวม Start และ End bits) ที่ถูกส่งไป คือ 15 03 0066 0003 E6C6 โดย

ชุดข้อความสำหรับการอ่านค่าจาก Holding register (Request)

  • 15 คือ Station address (21 DEC = 15 HEX) 
  • 03 คือ Function code (การอ่านค่าที่ Holding registers)
  • 0066 คือ Address ของ register ตัวแรก (40103 – 40001 = 102 DEC= 66 HEX)
  • 0003 คือ จำนวน Registers ที่ต้องการอ่าน (ทั้งหมด 3 ตัว คือ 40103 ถึง 40105)
  • E6C6 คือ ค่า CRC (Cyclic Redundancy Check) สำหรับเช็คความผิดพลาดของชุดข้อมูล

ชุดข้อความที่ตอบกลับมา (Response)

ส่วน Frame message (ไม่รวม Start และ End bits) ที่ตอบกลับมาคือ 06 XXXX XXXX XXXX

  • 06 คือ จำนวน byte ของข้อมูลที่ตอบกลับมา

  • XXXX XXXX XXXX คือ ข้อมูลของทั้ง 3 ตำแหน่ง ที่ตอบกลับมา (ตำแหน่งละ 2 bytes)

MODBUS TCP คือ โปรโตคอลที่ครอบ Modbus RTU เพื่อใช้การสื่อสารแบบอีเทอร์เน็ต (Ethernet-based protocol) ด้วย TCP/IP (Transmission control protocol) ที่ port 502 แทนการสื่อสารแบบอนุกรม ซึ่งจะใช้ Gateway ติอต่อและแปลงรูปแบบการสื่อสารข้อมูล โดยการสื่อสารของ Modbus RTU จะถูก Gateway แปลงให้เป็น Modbus TCP/IP เพื่อใช้ในการติดต่องสื่อสารนาเครือข่าย Ethernet

การสื่อสารแบบอีเทอร์เน็ตสำหรับ Modbus TCP

ชุดข้อความเริ่มต้นด้วย Modbus application protocol (MBAP) Header ซึ่งประกอบด้วย Transaction ID, Protocol ID, Length, Unit ID ซึ่งเพิ่มเติมขึ้นมาจาก Modbus RTU ส่วนชุดข้อมูล Function cod และ Data จะยังคงเหมือนเดิม ยกเว้นชุดข้อมูล CRC (checksum) แต่จะใช้ checksum  ของ TCP แทนดังแสดงในรูปข้างล่างนี้

จากรูป Modbus Application Protocol (MBAP) จะประกอบด้วยข้อมูล 7 bytes ซึ่งจะว่างหน้า Modbus RTU มีรายละเอียดดังนี้

  • Transaction/invocation Identifier (2 Bytes): ใช้จับคู่การแลกเปลี่ยนข้อมูลเมื่อมี Message หลายๆ ชุด ถูกส่งออกมาด้วย TCP เดียวกันด้วย Client ตัวใดตัวหนึ่ง โดยไม่ต้องรอลำดับการ Response
  • Protocol Identifier (2 bytes): ในส่วนจะมีค่าเป็น 0 เสมอ
  • Length (2 bytes): เป็นการระบุจำนวน Byte ที่รวมจำนวน byte ของ unit identifier, function cod, และ data fields
  • Unit Identifier (1 byte): เป็นการระบุ ID ของ Server ที่อยู่ในระบบสื่อสารอาจตั้งเป็น 00 ถึง FF ก็ได้

ตัวอย่าง

การอ่านค่าของ holding register # 40103 ถึง 40105 จาก slave หมายเลข 21 เหมือนในตัวอย่างของ Modbus RTU ที่กล่าวมาก่อนหน้านี้

ในกรณีของ Modbus TCP frame message จะเป็น 0001 0000 0006 15 03 0066 0003

  • 0001 คือ Transaction identifier
  • 0000 คือ Protocol identifier
  • 0006 คือ จำนวน byte ของข้อมูลที่ต่อจากไบต์นี้
  • 15 คือ Module identifier หรือ station address (21 ในระบบเลขฐาน 10 จะมีค่าเท่ากับ 15 ในเลขฐาน 16)
  • 03 คือ Function code (การอ่านค่าจาก Holding registers)
  • 0066 คือ Address ของ register ตัวแรก (40103-40001 = 102 = 66 hex)
  • 0003 คือ จำนวน Registers ที่ต้องการอ่าน (ทั้งหมด 3 ตัว คือ 40103 40104 และ 40105)

เขียนบทความโดย ปณต ลัยมณี