เนื้อหาวันที่ : 2010-04-22 17:43:26 จำนวนผู้เข้าชมแล้ว : 15164 views

มารู้จักโปรโตคอล Modbus (ตอน 1)

การสื่อสารข้อมูลนั้นจำเป็นต้องมีการสื่อสัญญาณ การเชื่อมต่อ และที่ขาดไม่ได้เช่นกัน นั้นคือภาษาในการสื่อสารหรือทางเทคนิคเรียกว่า โปรโตคอล (Protocol) มีโปรโตคอลมากมายในระบบงานอุตสาหกรรมแต่โปรโตคอลตัวหนึ่งที่ใช้กันมากในงานอุตสาหกรรมและรู้จักกันดีนั้นคือโปรโตคอล Modbus

การสื่อสารข้อมูลในงานอุตสาหกรรม 
ตอนที่ 7 มารู้จักโปรโตคอล Modbus (ตอน 1)

.
พิชิต จินตโกศลวิทย์ 
pichitor@yahoo.com
.

.

การสื่อสารข้อมูลนั้นจำเป็นต้องมีการสื่อสัญญาณ การเชื่อมต่อ และที่ขาดไม่ได้เช่นกัน นั้นคือภาษาในการสื่อสารหรือทางเทคนิคเรียกว่า โปรโตคอล (Protocol) มีโปรโตคอลมากมายในระบบงานอุตสาหกรรมแต่โปรโตคอลตัวหนึ่งที่ใช้กันมากในงานอุตสาหกรรมและรู้จักกันดีนั้นคือโปรโตคอล Modbus    

.

โปรโตคอล Modbus เป็นโปรโตคอลที่ถูกพัฒนาโดยบริษัทผู้ผลิต PLC (Programmable Logic Controller) ชื่อบริษัท Modicon ของประเทศสหรัฐอเมริกาซึ่งปัจจุบันได้ถูกควบรวมกิจการเป็นส่วนหนึ่งของบริษัท Schneider Electric 

.

รูปที่ 1 PLC และ มิเตอร์ที่ใช้ Modbus

.

โปรโตคอล Modbus เป็นโปรโตคอลที่มีโครงสร้างค่อนข้างง่าย และอ้างอิงถึง OSI เพียงไม่กี่ชั้น ดังนั้นมันจึงเป็นที่นิยม โดยเฉพาะในอุปกรณ์ประเภท PLC และดิจิตอลมิเตอร์ รวมทั้งระบบที่ต้องการความเร็วสูงในการตอบสนองเช่น โรงผลิตไฟฟ้า เป็นต้น

.

รูปที่ 2 การอ้างอิงของ Modbus บนโมเดล OSI

.
1. ภาพรวมทั่วไป

ตัวมาตรฐาน Modbus ประกอบด้วยโปรโตคอลในระดับแอพลิเคชั่น (OSI ชั้นที่ 7) ที่ใช้การสื่อสารแบบไคลเอนต์/เซิร์ฟเวอร์ (Client/Server) ระหว่างอุปกรณ์ที่ถูกเชื่อมต่อกับระบบบัสของเครือข่าย 

.

โปรโตคอล Modbus ใช้โครงสร้างการสื่อสารแบบไคลเอนต์/เซิร์ฟเวอร์ โดยมีโหมดการทำงานแบบ รีเควสต์/เรสปอนส์ (Request/Response) หรือการร้องขอและการตอบสนอง โดยไม่มีวิธีการควบคุมการเข้าถึงสื่อ (Media Access Control) ที่ถูกใช้ในเลเยอร์ที่ 2 โมเดลไคลเอนต์/เซิร์ฟเวอร์มีรูปแบบเมสเสจ (Message) อยู่ 4 ชนิดหลัก จากมุมมองของไคลเอนต์และเซิร์ฟเวอร์ 

.
* Modbus Request เมสเสจร้องขอส่งลงบนเครือข่ายที่ฝั่งไคลเอนต์เพื่อที่จะเริ่มต้นทำทรานแซคชั่น (Transaction)
* Modbus Confirmation เมสเสจตอบสนองเพื่อยืนยันการทำงานที่ฝั่งไคลเอนต์
* Modbus Indication เมสเสจร้องขอที่ถูกรับที่ฝั่งเซิร์ฟเวอร์
* Modbus Response เมสเสจตอบสนองที่ถูกส่งจากเซิร์ฟเวอร์
.

การส่งรับเมสเสจของโมเดลไคลเอนต์/เซิร์ฟเวอร์ จะถูกใช้เพื่อแลกเปลี่ยนข้อมูลระหว่างสองอุปกรณ์ หรือระหว่างซอฟต์แวร์ เช่น HMI/SCADA กับอุปกรณ์ที่ใช้โปรโตคอล Modbus ดังรูปที่ 3

.

รูปที่ 3 การแลกเปลี่ยนเมสเสจของ Modbus

.

ในกรณีที่ทุกอย่างเป็นปกติ การแลกเปลี่ยนข้อมูลระหว่างไคลเอนต์และเซิร์ฟเวอร์จะเป็นรูปที่ 5 ไคลเอนต์(อุปกรณ์ที่เป็นมาสเตอร์) จะเริ่มทำการร้องขอข้อมูล ตัวโปรโตคอล Modbus ส่วนใหญ่จะทำงานอยู่ที่ชั้นที่ 7 จะสร้างฟอร์แมตข้อมูลที่เรียกว่า POU (Protocol Data Unit) ซึ่งประกอบด้วยรหัสฟังก์ชั่น หรือ Function Code และข้อมูลที่ทำการร้องขอ ณ ที่ระดับ OSI

.

ชั้นที่ 2 ข้อมูล PDU จะถูกเพิ่มเติมจนเป็น ADU (Application Data Unit) โดยการเพิ่มฟิลด์ที่เกี่ยวกับการระบุอุปกรณ์ เช่น หมายเลขสแลฟ และ ค่าสำหรับใช้ในการตรวจสอบว่าข้อมูลผิดพลาด (Error Detection) 

.

รูปที่ 4 รูปแบบเฟรม Modbus

.

เซิร์ฟเวอร์ (อุปกรณ์สแลฟ) จะทำงานตามคำขอและเริ่มตอบสนองการร้องขอ การปฎิสัมพันธ์ระหว่างไคลเอนต์ละ เซิร์ฟเวอร์ถูกแสดงดังรูปที่ 5

รูปที่ 5 ปฏิสัมพันธ์แบบ ไคลเอนต์/เซิร์ฟเวอร์ ของ Modbus

.
หลักการมาสเตอร์/สแลฟ ของ Modbus

Modbus ที่วิ่งบนการสื่อสารแบบอนุกรม หรือ Serial Communication จะมีเพียงมาสเตอร์เพียงตัวเดียวเท่านั้นที่เชื่อมต่ออยู่กับบัสพร้อมกับสแลฟหลายตัว แต่สามารถมีจำนวนสแลฟสูงสุดอยู่ที่ 247 การสื่อสารโดย Modbus จะต้องเริ่มต้นที่ตัวมาสเตอร์เสมอ ตัวสแลฟจะไม่สามารถตอบสนองหรือส่งข้อมูลใด ๆ ได้ ถ้าไม่มีการร้องขอจากมาสเตอร์ และ ระหว่างสแลฟด้วยกันเองจะไม่มีการสื่อสารระหว่างกัน 

.
มาสเตอร์สามารถส่งการร้องขอไปยังสแลฟได้ 2 วิธีดังต่อไปนี้

โหมดยูนิคาสต์ (Unicast Mode) ในโหมดนี้มาสเตอร์จะใช้แอดเดรสหรือหมายเลขแบบระบุตัวสแลฟ หลังจากที่สแลฟรับและประมวลผลการร้องขอ สแลฟจะตอบกลับโดยเฟรมจะมีแอดเดรสของตัวมันตอบกลับไปยังมาสเตอร์ ในโหมดนี้การสื่อสารจะมี 2 เมสเสจ คือเมสเสจการร้องขอจากมาสเตอร์ และเมสเสจการตอบสนองจากสแลฟ โดยที่แต่ละเมสเสจต้องมีหมายเลขแอดเดรสอยู่ในช่วงจาก 1 ถึง 247 และไม่ซ้ำกันจึงจะมีความอิสระจากสแลฟตัวอื่น ๆ

.

รูปที่ 6 การร้องขอแบบยูนิคาสต์

.

โหมดบรอดคาสต์ (Broadcast Mode) ในโหมดนี้มาสเตอร์สามารถส่งการร้องขอไปยังทุกสแลฟในเวลาเดียวกัน แต่จะไม่มีเมสเสจตอบกลับมาจากสแลฟใด ๆ การร้องขอในโหมดนี้มักเป็นคำสั่งประเภทเขียน ทุกสแลฟต้องยอมรับคำขอนี้สำหรับฟังก์ชั่นประเภทเขียน แอดเดรสหมายเลข 0 ถูกใช้ในกำหนดเมสเสจให้เป็นเมสเสจบรอดคาสต์

.

รูปที่ 7 การร้องขอแบบบรอดคาสต์

.

การกำหนดหมายเลขแอดเดรสของ Modbus
โปรโตคอล Modbus สามารถใช้หมายเลขได้จำนวน 256 หมายเลข

แอดเดรสหมายเลข 0 ถูกจองไว้สำหรับบรอดคาสต์ สแลฟทุกตัวต้องรับรู้และตอบสนองต่อแอดเดรสนี้ยกเว้นฟังก์ชั่นประเภทอ่านข้อมูล

.
ไดอะแกรมสถานะของมาสเตอร์/สแลฟ (Master/Slaves State Diagram)
     ในชั้นดาต้าลิงก์ของ Modbus จะประกอบด้วยสองส่วนดังต่อไปนี้
     * โปรโตคอล มาสเตอร์/สแลฟ
     * โหมดการส่ง (RTU และ ASCII)
.

ซินแทกซ์ของไดอะแกรมสถานะ (Syntax of State Diagram)
     เพื่อความเข้าใจในไดอะแกรมสถานะ ซินแทกซ์นี้จะช่วยให้เข้าใจยิ่งขึ้น

รูปที่ 8 ซินแทกซ์ของไดอะแกรมสถานะ

.

เมื่อ Trigger หรือเกิดการเปลี่ยนแปลงขึ้นในระบบโดยที่ระบบอยู่ในสถานะ A แล้วสถานะ A ของระบบจะเปลี่ยนไปยังสถานะ B ถ้า Guard Condition หรือเงื่อนไขถูกต้องเป็นจริง และระบบจะทำดำเนินการตามฟังก์ชั่นที่ถูกตั้งไว้

.

ไดอะแกรมสถานะของมาสเตอร์ (Master State Diagram)

รูปที่ 9 ไดอะแกรมสถานะของมาสเตอร์

.

-  สถานะว่าง คือไม่มีการร้องขอ สถานะหรือสเตตนี้จะเริ่มหลังจากเริ่มเปิดใช้งานอุปกรณ์ หลังจากที่ได้ส่งการร้องขอ มาสเตอร์จะออกจากสถานะว่าง และจะไม่ส่งการร้องขอที่สองในเวลาเดียวกัน

.

-  เมื่อการร้องขอแบบยูนิคาสต์ได้ถูกส่งไปยังสแลฟ มาสเตอร์จะไปอยู่ที่สถานะรอการตอบกลับ และตัวจับเวลาเพื่อรอการตอบสนองก็จะเริ่มนับเวลาซึ่งมันจะป้องกันไม่ให้มาสเตอร์รอการตอบกลับอย่างไม่มีที่สิ้นสุด เวลาในการรอการตอบสนองจะขึ้นอยู่กับการตั้งค่าของผู้ใช้หรือผู้ผลิต

.

-  เมื่อได้รับการตอบกลับ มาสเตอร์จะตรวจสอบการตอบกลับ ก่อนที่จะประมวลผลข้อมูลภายใน การตรวจสอบอาจจะตรวจเจอข้อผิดพลาดได้ ยกตัวอย่างการตอบกลับอาจจะมาจากสแลฟที่ไม่ได้ถูกร้องขอ หรือมีความผิดพลาดในเฟรมที่รับมา ในกรณีที่การตอบกลับมาจากตัวสแลฟที่ไม่ต้องการ ตัวจับเวลารอการตอบกลับก็ยังวิ่งจับเวลารอต่อไป ในกรณีตรวจเจอความผิดพลาดในเฟรมอาจจะมีการส่งการร้องขอซ้ำอีกครั้ง

.

-  ถ้าไม่มีการตอบกลับ ตัวจับเวลารอการตอบกลับจนหมดเวลา พร้อมทั้งแจ้งความผิดพลาดให้ระบบ แล้วมาสเตอร์จะเปลี่ยนไปอยู่ในสถานะว่าง และส่งการร้องขอซ้ำ จำนวนการส่งซ้ำจะขึ้นอยู่กับการตั้งค่าของผู้ใช้หรือผู้ผลิต

.

-  เมื่อมีการร้องขอแบบบรอดคาสต์ส่งลงบนบัสจะต้องไม่มีการตอบกลับใดใดจากสแลฟ ดังนั้นเวลาการรอจะขึ้นอยู่กับมาสเตอร์เพื่อรอให้ทุกสแลฟประมวลผลการร้องขอล่าสุดจนเสร็จสิ้น ก่อนที่จะส่งการร้องขอใหม่ ระยะเวลาหน่วงนี้ถูกเรียกว่า Turnaround Delay ดังนั้นมาสเตอร์จะไปอยู่ที่สถานะรอการหน่วงเวลาจำนวน 1 รอบทรานแซคชั่น ก่อนที่จะกลับไปอยู่ที่สถานะว่างและส่งการร้องขออื่น ๆ ต่อไป

.

-  ในโหมดยูนิคาสต์ ระยะเวลารอการตอบสนองต้องนานเพียงพอสำหรับรอให้สแลฟประมวลผลการร้องขอพร้อมระยะเวลาในการส่งการตอบรับ ในโหมดบรอดคาสต์เวลา Turnaround ต้องนานเพียงพอสำหรับสแลฟในการประมวลผลพร้อมทั้งการรอรับการร้องขอใหม่ ดังนั้นเวลา Turnaround ต้องสั้นกว่าเวลาการรอการตอบสนองปกติ โดยทั่วไปแล้วเวลาการรอการตอบสนองจะอยู่ที่ 1 วินาทีที่บรอดเรต 9,600 bps และเวลา Turnaround ควรอยู่ที่ 100 มิลลิวินาที ถึง  200 มิลลิวินาที

.
ไดอะแกรมสถานะของสแลฟ (Slave State Diagram)

รูปที่ 10 ไดอะแกรมสถานะของสแลฟ

.

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

.
ไดอะแกรมเวลาการสื่อสารของมาสเตอร์/สแลฟ (Master/Slave Communication Time Diagram)
     ไดอะแกรมเวลาแสดงเวลา 3 ช่วงเหตุการณ์ระหว่างการสื่อสารของมาสเตอร์/สแลฟ

รูปที่ 11 ไดอะแกรมเวลาการสื่อสารของมาสเตอร์/สแลฟ

.
การส่งข้อมูลแบบอนุกรม

มีสองโหมดในการส่งข้อมูลแบบอนุกรมที่ถูกนิยามใน Modbus นั้นคือ โหมด RTU และ ASCII แต่ละโหมดได้ถูกนิยามการเข้ารหัสในเมสเสจและการส่งบิตข้อมูลบนสายสื่อสารแบบอนุกรม โหมดการส่งข้อมูลต้องเหมือนกันทั้งสองด้านของการสื่อสารแบบอนุกรม 

.

Modbus RTU สมควรเป็นโหมดที่ทุกอุปกรณ์ที่สนับสนุนโปรโตคอล Modbus ต้องสนับสนุน ส่วน Modbus ASCII เป็นเพียงโหมดทางเลือกที่ใช้ในระบบงานบางระบบเท่านั้น อุปกรณ์ควรสามารถเลือกโหมดตามที่ผู้ใช้ต้องการไม่ว่าจะเป็น RTU และ ASCII โดยที่โหมดดีฟอลต์ต้องเป็นโหมด RTU

.
โหมด RTU

เมื่ออุปกรณ์สื่อสารใช้โหมด Modbus RTU แต่ละ 8 บิตในเมสเสจจะถูกแบ่งเป็น 2 ส่วน ส่วนละ 4 บิตเพื่อแทนที่หรือแสดงด้วยอักขระ ASCII 2 อักขระ ข้อดีของโหมด RTU คือสามารถลดจำนวนไบต์ที่ใช้ส่งข้อมูลได้เกือบครึ่งหนึ่งเมื่อเทียบกับโหมด ASCII แต่ละเมสเสจต้องส่งข้อมูลเป็นไบต์ต่อเนื่องกัน

.
ฟอร์แมตที่ใช้ส่งแต่ละไบต์ (จำนวน 11 บิต) ในโหมด RTU
ระบบการเข้ารหัส ไบนารี 8 บิต
จำนวนบิตต่อไบต์ 1 บิตเริ่ม
                        8 บิตข้อมูล ส่งบิต LSB ก่อน
                        1 บิตสำหรับพาริตี้
                        1 บิตหยุด
.

โดยปกติจะใช้โหมด RTU จะใช้อีเวนพาริตี้ (Even Parity) แต่พาริตี้อื่นก็สามารถใช้ได้ เพื่อที่ให้แน่ใจว่าอุปกรณ์สามารถทำงานกับอุปกรณ์อื่นได้ อุปกรณ์ควรสนับสนุนการส่งแบบไม่มีพาริตี้ (No Parity) ถ้าไม่มีพาริตี้จะต้องมีบิตหยุดจำนวน 2 บิตในการส่งข้อมูลจำนวนหนึ่งไบต์

.

รูปที่ 12 ฟอร์แมตในการส่งข้อมูลหนึ่งไบต์ของ Modbus RTU

.
การส่งเฟรมของ Modbus RTU

เมสเสจของ Modbus RTU จะถูกจัดว่าเป็นเฟรมที่มีจุดเริ่มและจุดจบของเฟรมชัดเจน คุณสมบัตินี้ทำให้อุปกรณ์ที่รับเฟรมสามารถรับรู้จุดเริ่มต้นของเมสเสจและสามารถรับรู้ว่าเมสเสจจบเมื่อไร เมสเสจครึ่ง ๆ กลาง ๆ จะสามารถตรวจสอบเจอและจะถูกทิ้งไป

.
ใน Modbus RTU แต่ละเมสเสจจะต้องถูกคั้นด้วยสถานะว่างอย่างน้อยเป็นระยะเวลาในการส่งจำนวน 3.5 อักขระ ดังรูปที่ 13

รูปที่ 13 การส่งเฟรมของ Modbus RTU

.

ตลอดทั้งเมสเสจ เฟรมต้องส่งอักขระอย่างต่อเนื่องกัน ถ้ามีช่วงว่างมากกว่า 1.5 อักขระเกิดขึ้นระหว่าง 2 อักขระ เมสเสจนั้นจะต้องถูกตีความว่าไม่สมบูรณ์และถูกเพิกเฉยและทิ้งโดยตัวรับเมสเสจ

.

รูปที่ 14 ช่วงว่างภายในเมสเสจของ Modbus RTU

.
ไดอะแกรมสถานะของ Modbus RTU

รูปที่ 15 ไดอะแกรมสถานะของ Modbus RTU

.

- การเปลี่ยนจากสถานะเริ่มต้นไปยังสถานะว่าง ต้องรอหน่วงเวลา t3.5 เพื่อทำให้แน่ใจระยะช่วงระหว่างเฟรม
- สถานะว่างคือสถานะปกติที่ไม่มีการส่งและรับ
- ในโหมด RTU การสื่อสารต้องจะกลับมาที่สถานะว่าง เมื่อไม่มีการส่งข้อมูลใดใดนานมากกว่าช่วงเวลา  3.5 อักขระ
- เมื่อการเชื่อมต่ออยู่ในสถานะว่าง แต่ละอักขระที่ถูกส่งบนบัสจะถูกตรวจสอบว่าเป็นจุดเริ่มต้นของเฟรม หลังจากตรวจเจอ สถานะการเชื่อมต่อจะย้ายไปอยู่แอกตีฟ จุดจบของเฟรมสามารถคาดการณ์ได้

.

- เมื่อฟิลด์หมายเลขแอดเดรสได้ถูกวิเคราะห์ว่าเป็นเฟรมของอุปกรณ์นั้นๆ ถ้าเฟรมไม่มีข้อผิดพลาดจนถูกทิ้ง หลังจากตรวจเจอจุดจบของเฟรม การคำนวณ CRC และการตรวจสอบก็จะถูกดำเนินการ  เพื่อที่จะลดเวลาในการประมวลผลของการรับเฟรม หมายเลขแอดเดรสของอุปกรณ์จะถูกตรวจสอบทันทีโดยไม่จำเป็นต้องรอจนจบเฟรม ส่วนตัว CRC จะถูกคำนวณก็ต่อเมื่อเฟรมนั้นเป็นของอุปกรณ์หรือเป็นเมสเสจประเภทบรอดคาสต์

.
การตรวจสอบ CRC

Modbus RTU มีฟิลด์สำหรับตรวจสอบความผิดพลาดที่ใช้หลักการของ CRC (Cyclical Redundancy Checking) โดยค่าจะคำนวณจากข้อมูลภายในเมสเสจ ตัว CRC มีไว้ตรวจสอบเนื้อหาจริง ๆ ภายในเมสเสจทั้งหมดโดยอิสระจากการตรวจสอบของพาริตี้ที่ใช้ตรวจสอบเบื้องต้นในแต่ละอักขระ ตัว CRC จะมีทั้งหมด 16 บิตโดยแบ่งเป็นจำนวน 2 ไบต์

.

CRC จะถูกเติมต่อท้ายของเมสเสจโดยที่ไบต์ต่ำจะถูกเติมก่อนตามด้วยไบต์สูง ดังนั้นไบต์สูงของ CRC จะถูกส่งเป็นลำดับสุดท้ายของเมสเสจของ Modbus RTU

.

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

.

การคำนวณ CRC เริ่มที่การตั้งค่าเริ่มต้นขนาด 16 บิตเข้าไปที่ตัวรีจิสเตอร์ที่มีทุกบิตมีค่าเท่ากับหนึ่ง หลังจากนั้นเริ่มนำข้อมูลแต่ละไบต์ของเมสเสจเข้ามาคำนวณกับค่าภายในรีจิสเตอร์ ระหว่างการคำนวณ CRC แต่ละไบต์จะถูกดำเนินการ XOR (Exclusive OR) กับค่าในรีจิสเตอร์ แล้วผลรับที่ได้ก็จะถูกชิฟต์ (Shift) หนึ่งบิตไปยังทิศทางทาง LSB พร้อมทั้งเติมบิตค่าเท่ากับศูนย์ที่ตำแหน่ง MSB 

.

ตัวบิตที่ถูกชิฟต์ออกจะถูกนำมาตรวจสอบ ถ้ามีค่าเท่ากับหนึ่งแล้วค่าในรีจิสเตอร์จะถูกทำ XOR กับรหัสโพลีโนเมียล (Polynomial Code) โดยผลลัพธ์ก็ถูกนำไปเก็บที่รีจิสเตอร์ตัวเดิม แต่ถ้ามีค่าเท่ากับศูนย์ จะไม่ทำการ XOR กระบวนการนี้จะถูกทำซ้ำจนกระทั้งมีการชิฟต์จำนวนแปดครั้งหรือแปดบิต หลังจากการชิฟต์ครั้งที่แปด ไบต์ถัดไปจะถูกทำ XOR กับค่าในรีจิสเตอร์ปัจจุบัน และทำตามขั้นตอนเดิมจำนวนแปดครั้ง ค่าสุดท้ายของรีจิสเตอร์หลังจากที่ทุกไบต์ของเมสเสจได้ถูกนำมาคำนวณนั้นก็คือค่า CRC

.

รูปที่ 16 โฟลชาร์ตการคำนวณ CRC

.

รูปที่ 17 การคำนวณ CRC ของข้อมูล 0x1D

.
รหัสจำลองของการคำนวณ CRC ด้วยภาษา C
unsigned short CRC16 (puchMsg, usDataLen)/* The function returns the CRC as a unsigned short type */
     unsigned char *puchMsg;/* message to calculate CRC upon*/
     unsigned short usDataLen;/* quantity of bytes in message*/
     {
     unsigned char uchCRCHi = 0xFF;/* high byte of CRC initialized */
     unsigned char uchCRCLo = 0xFF;/* low byte of CRC initialized */
     unsigned uIndex;/* will index into CRC lookup table */
     while (usDataLen--)/* pass through message buffer */
     {
     uIndex = uchCRCLo ^ *puchMsgg++;/* calculate the CRC */
     uchCRCLo = uchCRCHi ^ auchCRCHi[uIndex};
     uchCRCHi = auchCRCLo[uIndex];
     }
     return (uchCRCHi << 8 | uchCRCLo);
     }
.
โหมด ASCII

เมื่ออุปกรณ์ถูกตั้งค่าให้ใช้โหมด Modbus ASCII (American Standard Code for Information Interchange) แต่ละไบต์ในเมสเสจจะถูกส่งโดยใช้ 2 อักขระของรหัส ASCII 

.

โหมดนี้ถูกใช้ในการเชื่อมต่อ ถ้าอุปกรณ์ไม่สามารถใช้โหมด RTU อันเนื่องประสิทธิภาพฮาร์ดแวร์และการจัดการตัวจับเวลามีไม่เพียงพอ โหมดนี้โดยภาพรวมมีประสิทธิผลต่ำกว่าโหมด RTU เพราะแต่ละไบต์ข้อมูลต้องการ 2 อักขระ ASCII

.
ยกตัวอย่าง ไบต์ข้อมูล 0x5B จะถูกเข้ารหัสเป็นสองอักขระ ASCII คือ 0x35 และ 0x42 (0x35=”5” และ 0x42=”B” ในตาราง ASCII)
     ฟอร์แมตที่ใช้ส่งแต่ละไบต์ (จำนวน 11 บิต) ในโหมด ASCII
     ระบบการเข้ารหัส เลขฐาน 16 ใช้อักขระ ASCII 0-9, A-F
     จำนวนบิตต่อไบต์1 บิตเริ่ม
     7 บิตข้อมูล ส่งบิต LSB ก่อน
     1 บิตสำหรับพาริตี้
     1 บิตหยุด
.

โดยปกติโหมด ASCII จะใช้ อีเวนพาริตี้ (Even Parity) แต่พาริตี้อื่น ๆ ก็สามารถใช้ได้ เพื่อที่ให้แน่ใจว่าอุปกรณ์สามารถทำงานกับอุปกรณ์อื่นได้ อุปกรณ์สมควรสนับสนุนโนพาริตี้ (No Parity) หรือไม่มีพาริตี้ ถ้าไม่มีพาริตี้จะต้องมีบิตหยุดจำนวน 2 บิต

.

รูปที่ 18 ฟอร์แมตในการส่งข้อมูลหนึ่งไบต์ของ Modbus ASCII

.
การส่งเฟรมของ Modbus ASCII

เมสเสจของ Modbus ASCII จะถูกจัดเป็นเฟรมที่มีจุดเริ่มและจุดจบของเฟรม เช่นเดียวกับ Modbus RTU คุณสมบัตินี้ทำให้อุปกรณ์ที่รับเฟรมสามารถรับรู้จุดเริ่มต้นของเมสเสจและสามารถรับรู้ว่าเมสเสจจบเมื่อไร เมสเสจครึ่ง ๆกลาง ๆ จะสามารถูกตรวจสอบเจอ

.

ใน Modbus ASCII แต่ละเมสเสจจะต้องถูกแบ่งแยกด้วยอักขระที่ความหมายพิเศษที่ได้กำหนดไว้ก่อนแล้ว เช่น เป็นจุดเริ่มต้นของเฟรมและจุดจบของแฟรม เมสเสจทุกเมสเสจต้องเริ่มต้นอักขระโคลอน “:” รหัส ASCII 0x3A) และจบด้วยอักขระเป็นคู่นั้นคือ CRLF (รหัส ASCII 0xD และ 0xA) หรือการขึ้นบรรทัดใหม่นั้นเอง

.

อักขระที่ใช้ได้ในการส่งคืออักขระ ASCII ที่ใช้สื่อถึงเลขเดี่ยวในฐาน 16 (0-9, A-F) อุปกรณ์จะคอยตรวจอักขระ “:” เมื่อมันตรวจเจอมันจะพยายามแปลความหมายทุกอักขระจนกระทั่งเจอจุดจบของเฟรม

.

รูปที่ 19 การส่งเฟรมของ Modbus ASCII

.

แต่ละไบต์ข้อมูลต้องการ 2 อักขระ ASCII สำหรับการเข้ารหัส ขนาดข้อมูลสูงสุดของ Modbus ASCII จะมีขนาดเป็นสองเท่าของ Modbus RTU (252) เป็นผลให้ขนาดข้อมูลสูงสุดของ Modbus ASCII อยู่ที่ 512 ไบต์

.
ไดอะแกรมสถานะของ Modbus ASCII

รูปที่ 20 ไดอะแกรมสถานะของ Modbus ASCII

.

* สถานะว่างคือสถานะปกติไม่มีการส่งและรับ
* แต่ละการรับอักขระ “:” หมายความถึงจุดเริ่มต้นของเมสเสจใหม่ ถ้าเมสเสจกำลังประมวลผลการรับอยู่และได้รับอักขระ “:” อีก  เมสเสจปัจจุบันที่กำลังแปลจะถูกตีความว่าไม่สมบูรณ์และถูกทิ้งไป รวมทั้งบัฟเฟอร์จะถูกเคลียร์เริ่มใหม่อีกด้วย
* หลังจากตรวจเจอจุดจบของเฟรม LRC จะถูกคำนวณและตรวจสอบว่าถูกต้องหรือไม่ เพื่อที่จะลดเวลาในการประมวลผล แอดเดรสจะถูกวิเคราะห์ตั้งแต่แรกโดยไม่ต้องรอถึงจุดจบของเฟรม

.
การตรวจสอบ LRC

ในโหมด Modbus ASCII เมสเสจจะมีการตรวจสอบความผิดพลาดโดยใช้วิธีการ LRC (Longitudinal Redundancy Checking) โดยจะคำนวณบนเนื้อหาของเมสเสจโดยไม่รวมตัว “:” และ “CRLF” 

.

ตัว LRC จะมีขนาดเพียงหนึ่งไบต์ ค่า LRC จะถูกคำนวณโดยอุปกรณ์ที่ส่งเมสเสจและต่อท้ายเข้าไปในเมสเสจ อุปกรณ์ที่รับเมสเสจจะคำนวณ LRC ระหว่างการรับเมสเสจ และเปรียบเทียบกับค่ากับค่า LRC ที่มากับเมสเสจ ถ้าค่าไม่เท่ากันแสดงว่ามีความผิดปกติเกิดขึ้น อีกวิธีการหนึ่งคือการคำนวณ LRC ใหม่รวมกับค่า LRC ที่มากับเมสเสจค่าที่ได้จะต้องเป็นศูนย์จึงหมายความว่าเมสเสจนั้นไม่ผิดพลาด

.

ค่า LRC ถูกคำนวณโดยวิธีการบวกค่าแต่ละไบต์ในเมสเสจเข้าด้วยกันโดยไม่สนใจค่าที่ทดเกินขนาดแปดบิต และทำการ 2’s Complement ผลบวกให้กลายเป็นทางด้านลบ 

.
ในโหมด ASCII ค่า LRC จะถูกเปลี่ยนเป็นรหัส ASCII โดยใช้สองไบต์แล้วจัดวางไว้ที่ท้ายเมสเสจก่อน “CRLF”

รูปที่ 21 ตัวอย่างการคำนวณ LRC

.
* รหัสจำลองของการคำนวณ LRC ด้วยภาษา C

static unsigned char LRC(auchMsg, usDataLen)/* the function returns the LRC as a type unsigned char*/
     unsigned char *auchMsg;/* message to calculate LRC upon*/
     unsigned short usDataLen;/* quantity of bytes in message*/
     {
     unsigned char uchLRC = 0;/* LRC char initialized*/
     while (usDataLen––)/* pass through message buffer*/
     uchLRC += *auchMsg++; /* add buffer byte without carry */
     return ((unsigned char)(–((char)uchLRC)));/* return twos complement */
     }

.

เอกสารอ้างอิง

1. J.E Goldman and P.T Rawles, Applied Data Communications. Addison-Wesley, New York,2001
2. J. Fulcher, An Introduction to Microcomputer Systems: Architecture and Interfacing. Addison-Wesley, Sydney,1989
3. S. Mackay, E. Wright, D. Reynders and .J Park, Practical Industrial Data Network: Design, Installation and Troubleshooting. IDC Technologies, Perth,2004
4. J.R. Vacca, High-speed Cisco Networks: Planning, Design, and Implemention. CRC Press LLC, Florida,2001   
5. MODBUS.ORG, MODBUS Over Serial Line Specification and Implementation Guide V1.0, 2002  

สงวนลิขสิทธิ์ ตามพระราชบัญญัติลิขสิทธิ์ พ.ศ. 2539 www.thailandindustry.com
Copyright (C) 2009 www.thailandindustry.com All rights reserved.

ขอสงวนสิทธิ์ ข้อมูล เนื้อหา บทความ และรูปภาพ (ในส่วนที่ทำขึ้นเอง) ทั้งหมดที่ปรากฎอยู่ในเว็บไซต์ www.thailandindustry.com ห้ามมิให้บุคคลใด คัดลอก หรือ ทำสำเนา หรือ ดัดแปลง ข้อความหรือบทความใดๆ ของเว็บไซต์ หากผู้ใดละเมิด ไม่ว่าการลอกเลียน หรือนำส่วนหนึ่งส่วนใดของบทความนี้ไปใช้ ดัดแปลง โดยไม่ได้รับอนุญาตเป็นลายลักษณ์อักษร จะถูกดำเนินคดี ตามที่กฏหมายบัญญัติไว้สูงสุด