แสดงบทความที่มีป้ายกำกับ Modbus Protocol แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ Modbus Protocol แสดงบทความทั้งหมด

วันพฤหัสบดีที่ 20 กรกฎาคม พ.ศ. 2560

Modbus communication

Modbus communication เป็นการสื่อสารระหว่างPLCกับอุปกรณ์ต่างๆ เช่นเซ็นเซอร์ อุปกรณ์ที่ใช้ในการสื่อสารของPLC FX คือ FX3U-485ADP-MBและFX3U-232ADP-MB (MB คือ modbus) ในหัวข้อนี้จะกล่าวถึงการสื่อสารกับเซ็นเซอร์วัดค่าออกซิเจนรุ่น OXY-LC-485
1.การ wiring
Picture1482
2. การเดินสายไฟในการสื่อสารแบบ MODBUS
Picture1483
3. การตั้งค่าการสื่อสารที่PLCและเซ็นเซอร์
การ ตั้งค่ารูปแบบการสื่อสารคือการตั้งค่ารายละเอียดต่างๆเช่นdata length ความเร็วในการสื่อสาร(baud rate) เป็นต้น โดยจะต้องค่าที่PLCและเซ็นเซอร์ให้ตรงกัน การตั้งค่าการสื่อสารที่PLC ทำได้โดยเขียนค่าคงที่ไปยัง special data register  กรณีใช้ Ch1 ตั้งค่าที่ D8400
กรณีใช้ Ch1 ตั้งค่าที่ D8420
การ เลือกรูปแบบการสื่อสารขึ้นอยู่กับการกำหนดของผู้ใช้งานรูปที่3 เป็นรายละเอียดการสื่อสารซึ่งเป็นค่าเริ่มต้นของเซ็นเซอร์ เราสามารถกำหนดแตกต่างจากนี้ก็ได้
Picture1484
ส่วน การตั้งค่ารูปแบบการสื่อสารที่อุปกรณ์อื่นๆ จะต้องเขียนค่าคงที่ไปยังหน่วยความจำของอุปกรณ์นั้น โดยจะต้องทราบว่า หน้าที่ของหน่วยความจำของอุปกรณ์นั้นคืออะไร การเขียนข้อมูลจะต้องใช้คำสั่ง ADPRW หน่วยความจำของอุปกรณ์ที่ใช้กำหนดหน้าที่และการทำงานเรียกว่า Holding register
Picture1485
ตัวอย่าง เช่นต้องการตั้งค่า baud rate ของ  OXY-LC-485 ให้เท่ากับ 9600 ก็ทำได้โดยการเขียนค่าคงที่ K2 ไปยัง Holding register 9C47 เป็นต้น
Picture1486
4. การตั้งค่ารูปแบบการสื่อสารของPLC โดยการเขียนค่าคงที่ไปยังรีจิสเตอร์พิเศษ D8400,D8420
กรณีใช้ Ch1 ตั้งค่าที่ D8400
กรณีใช้ Ch2 ตั้งค่าที่ D8420
ตัวอย่างนี้ใช้ ch2
ตาราง D8400 และ D8420
Picture1487
เราสามารถกำหนดค่าต่างๆได้เอง ตารางที่ 2เป็นตัวอย่างการเลือกค่าการสื่อสารสำหรับPLC
Picture1488
เนื่อง จากใช้ch2 ดังนั้นการตั้งค่ารูปแบบการสื่อสารทำได้โดยการเขียนค่าคงที่ไปยังรีจิสเตอร์ พิเศษD8420 ค่าคงที่คือค่าของบิต0ถึงบิต15 ที่เรากำหนดไว้ตามตารางที่3.75 ซึ่งค่าb0ถึงb15ที่ได้คือ 0001 0000 1000 0001 (เลขฐาน2)
Picture1489
การ เขียนค่าคงที่ไปD8420 จะใช้เลขฐาน2โดยตรงไม่ได้ จะต้องใช้เลขฐาน10หรือเลขฐาน16 และการใช้เลขฐาน16จะง่ายกว่า เนื่องจากการเปลี่ยนเลขฐาน2เป็นเลขฐาน16 ทำได้ง่ายกว่าการเปลี่ยนเลขฐาน2 เป็นเลขฐาน10 เมื่อเราใช้เลขฐาน16 จะได้ค่าที่เขียนไปD8420คือH1081 วงจรรูปที่3.241 เป็นการเขียนค่าคงที่ H1081ไปยังD8420 การเขียนค่าไปD8420 กำหนดให้ใช้หน้าสัมผัส M8411 (กรณีCh1ใช้M8038)
Picture1490
ตัวอย่างกรณีCh1
Picture1491
5. การตั้งค่า Protocol (ch1=D8401,Ch2=D8421)
Picture1492
เนื่อง จากใช้ch2 ดังนั้นการตั้งค่าprotocol ทำได้โดยการเขียนค่าคงที่ไปยังรีจิสเตอร์พิเศษD8421 เนื่องจากPLC คืออุปกรณ์master ดังนั้นb4=0 และเลือกการใช้งานเป็นแบบRTU ก็จะได้ b8=0 ซึ่งค่าb0ถึงb15ที่ได้คือ 0000 0000 0000 0001 (เลขฐาน2)
Picture1493
เมื่อเปลี่ยน 0000 0000 0000 0001 เป็นเลขฐาน16จะได้ H01Picture1494
นอกจากนั้นก็มีค่าต่างๆที่จำเป็นคือ
Picture1495
รายละเอียดของspecial register อ่านได้จากmanual modbus communication
สรุปค่าที่เขียนให้กับPLCคือ
Picture1496
6. การตั้งค่าการสื่อสารของเซ็นเซอร์
เรา ไม่ต้องตั้งค่าการสื่อสารที่เซ็นเซอร์อีก ถ้าเราใช้ค่าdefault ของเซ็นเซอร์ ดังนั้นจะต้องตั้งค่าการสื่อสารของPLCให้ตรงกับเซ็นเซอร์ก็พอ จากหัวข้อที่แล้ว เป็นการตั้งค่าcommunicationที่ตรงแล้ว คือ baud=9600, parity = none , stopbits= 1 bit มาถึงตรงนี้เราสามารถใช้คำสั่ง ADPRW อ่านค่าจากเซ็นเซอร์ได้เลย
Picture1497
ใน การใช้งานเซ็นเซอร์ เราต้องการอ่านค่าจากเซ็นเซอร์ดังนั้นก็จะต้องทราบว่า holding register อะไรของเซ็นเซอร์ที่เราต้องการอ่าน จากตาราง input registers 7532 คือ holding register ที่เก็บค่าออกซิเจนของเซ็นเซอร์
Picture1498
7. คำสั่ง Modbus read/write
คือคำสั่งที่อนุญาตให้ MODBUS master สื่อสารกับ slave รูปแบบคำสั่งคือ
Picture1499
Picture1500
S คือจำนวน slave  เราใช้เซ็นเซอร์หนึ่งตัว ดังนั้นเท่ากับ 01H
S1 คือ command code เป็นคำสั่งที่เราต้องการสั่ง sensor ซึ่งต้องดูจากตารางด้านล่าง เช่น H04 คือ read input register (อ่านค่า input register ของ slave)
S2       S3       S4/D  คือ command parameter
Picture1501
สรุปวงจรทั้งหมดคือ
Picture1502
Picture1503
command code
Picture1504
จาก วงจร เมื่อ PLC RUN M8002 ON จะทำให้ M0 ON และทำให้คำสั่ง ADPRW ทำงาน โดยการเขียนค่าคงที่ 1 ไปยัง 9C41 และสั่งเซ็นเซอร์ให้ ON เพื่อวัดค่าออกซิเจน
เมื่อส่งข้อมูลไปยังเซ็นเซอร์แล้ว M8029จะ ON โดยอัตโนมัติ และรีเซ็ต M0
ส่วนคำสั่ง ADPRW อีกบรรทัดจะอ่านค่าจาก input register 7531 และนำค่าไปเก็บที่ D100 และเราก็นำค่าไปใช้งานในโปรแกรม

วันจันทร์ที่ 21 มีนาคม พ.ศ. 2559

Modbus Protocol คืออะไร

     Modbus Protocol 

โปรโตคอล MODBUS เป็นโปรโตคอลเพื่อสื่อสารข้อมูลอินพุต/เอาต์พุตและรีจีสเตอร์ภายใน PLC ซึ่งถูกคิดค้นโดย Modicon (ปัจจุบันคือบริษัท Schneider Electric) โปรโตคอล MODBUS ได้เป็นที่ยอมรับกันอย่างกว้างขวางในการติดต่อสื่อสารที่เป็นแบบ Network Protocol อันเนื่องมาจาก MODBUS เป็นระบบเปิด, ไม่มีค่าใช้จ่าย, เชื่อมต่อและพัฒนาง่าย พร้อมทั้งยังสามารถนำโปรโตรคอลนี้ไปใช้งานในอุปกรณ์อื่นๆ เช่น Digital Power Meter, RTU (Remote Terminal Unit), Remote I/O, PLC เป็นต้น นอกจากนี้ MODBUS ยังสามารถรองรับและใช้งานร่วมกับ Application จำพวก SCADA และ HMI Software ได้อีกด้วย
โปรโตคอล MODBUS เป็นการสื่อสารข้อมูลในลักษณะ Master/Slave ซึ่งเป็นการสื่อสารจากอุปกรณ์แม่ (Master) เครื่องเดียว ส่วนใหญ่มักเป็นซอฟต์แวร์คอมพิวเตอร์หรืออุปกรณ์แสดงผล HMI ไปยังอุปกรณ์ลูก (Slave) ได้หลาย ๆ เครื่อง โดยสามารถกำหนดหมายเลขอุปกรณ์ได้สูงสุด 255 เครื่อง โดยมีลักษณะการส่งข้อมูล 2 แบบ คือ ข้อมูลแบบแอสกี (ASCII) และข้อมูลแบบเลขฐานสอง (Binary) ในโปรโตคอล MODBUS ที่สื่อสารข้อมูลแบบ ASCII จะเรียก MODBUS ASCII และโปรโตคอล MODBUS ที่สื่อสารข้อมูลแบบเลขฐานสอง จะเรียก MODBUS RTU ทำให้มีความแตกต่างในการกำหนดค่าพอร์ตสื่อสาร

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


MODBUS RTU
เฟรมข้อมูลในโหมด RTU ประกอบด้วยข้อมูลแสดงตำแหน่งแอดเดรส 1 ไบต์, หมายเลขฟังก์ชัน 1 ไบต์, ข้อมูลที่ทำการรับส่งจำนวนมากสุดไม่เกิน 252 ไบต์ และรหัสตรวจสอบความถูกต้องของข้อมูลแบบ CRC (Cyclical Redundancy Checking) ขนาด 2 ไบต์ ค่า CRC นี้เป็นค่าที่คำนวณมาจากข้อมูลทุกไบต์ ไม่รวมบิต Start, Stop และ Parity Check โดยที่ตัว Slave ตัวที่ส่งข้อมูลออกมาจะสร้างรหัส CRC แล้วส่งตามท้ายไบต์ข้อมูลออกมา หลังจากนั้นเม่อ Master ได้รับเฟรมข้อมูลและถอดข้อมูลออกจากเฟรมแล้วจะทำการคำนวณค่า CRC ตามสูตรเดียวกับ Slave เพื่อทำการเปรียบเทียบค่า CRC ทั้ง 2 ค่าว่าตรงกันหรือไม่ หากไม่ตรงกันแสดงว่าเกิดความผิดพลาดในการรับส่งข้อมูลในโหมด RTU การรับส่งข้อมูล 1 ไบต์ ไม่ว่าจะเป็นข้อมูลส่วนใดภายในเฟรมจะต้องทำการส่งบิตข้อมูลรวม 11 บิต คือ บิตเริ่มต้น (Start) 1 บิต, บิตข้อมูล 8 บิต, บิตตรวจสอบ Parity ของข้อมูล 1 บิตและบิตหยุด 1 บิต (Stop) 1 บิต หรือหากเลือกแบบไม่มีบิต Parity ก็จะเป็นแบบ Stop แทน 2 บิต สำหรับการกำหนดให้มีบิต Parity นั้น สามารถเลือกเป็นแบบคู่ (Even Parity) หรือคี่ (Odd Parity) ก็ได้ และหากต้องการออกแบบให้สอดคล้องกับอุปกรณ์ที่มีใช้กันทั่วไปมากที่สุด ควรเลือกแบบคู่โดยที่สามารถปรับเปลี่ยนเป็นแบบคี่หรือไม่มีการตรวจสอบ Parity (No Parity) ได้ด้วย
ลักษณะเฟรมข้อมูลของ MODBUS RTU
ลักษณะข้อมูลแต่ละไบต์ของ MODBUS RTU

MODBUS ASCII
การรับส่งข้มูลในโหมด ASCII นั้นมีความแตกต่างจากโหมด RTU ตรงที่ในโหมด RTU ข้อมูลที่จะส่งขนาด 1 ไบต์ นำมารวมกับบิตประกอบต่างๆ ก็สามารถส่งออกไปได้เลย แต่สำหรับโหมด ASCII จะมองข้อมูล 1 ไบต์ นั้นออกมาเป็นตัวอักษร 2 ตัว เช่น ค่า 0x5B ซึ่งเป็นเลขฐานสิบหก ก็จะถูกมองเป็นตัวอักษร ‘5’ และตัวอักษร ‘B’ จากนั้นก็จะทำการค้นหารหัส ASCII ของตัวอักษรทั้ง 2 ตัวนั้น ซึ่งได้แก่ 0x35 สำหรับ ‘5’ และ 0x42 สำหรับ ‘B’ แล้วทำการส่งรหัส ASCII ทั้ง 2 ค่านี้ออกไป ซึ่งจะได้ผลเท่ากับการส่งค่า 0x5B ซึ่งเป็นข้อมูลขนาด 1 ไบต์ ในโหมด RTU

จะเห็นได้ว่าการส่งข้อมูลในโหมด ASCII จะต้องทำงานมากกว่าการส่งข้อมูลในโหมด RTU ซึ่งทำให้อัตราเร็วในการสื่อสารมีค่าต่ำกว่า สาเหตุที่เป็นแบบนี้ก็เพราะว่า โหมด ASCII ได้ถูกออกแบบมาสำหรับอุปกรณ์ที่ไม่มีความสามารถในการกำหนดช่วงระยะห่างของ เวลาในการส่งเฟรมข้อมูล อย่างเช่นในโหมด RTU ที่อุปกรณ์สามารถกำหนดได้ว่าจะส่งเฟรมข้อมูลแต่ละเฟรมออกมาด้วยเวลาห่างกัน เท่าใด และอุปกรณ์ที่รอรับข้อมูลก็ต้องสามารถตรวจจับและแยกแยะได้ว่าเฟรมข้อมูลแต่ ละเฟรมที่รับเข้ามานั้นมีระยะเวลาห่างกันภายในช่วงเวลาที่กำหนดหรือไม่ เพื่อทำให้สามารถตรวจสอบหาจุดเริ่มต้นและจุดสิ้นสุดของเฟรมข้อมูลแต่ละเฟรม ได้ แต่ในความเป็นจริงยังมีอุปกรณ์อีกหลายชนิดที่ไม่มีความสามารถพิเศษนี้ จึงต้องใช้วิธีอื่นที่จะช่วยให้สามารถรับรู้จุดเริ่มต้นและจุดสิ้นสุดของ เฟรมข้อมูลได้ นั่นได้แก่โหมด ASCII ซึ่งในโหมดนี้จะเริ่มต้นเฟรมข้อมูลด้วยการส่งรหัส ASCII ที่กำหนดให้หมายถึงจุดเริ่มต้น คือ 0x3A ซึ่งตรงกับตัวอักษร ‘:’ ตามด้วยแอดเดรสของ Slave, หมายเลขฟังก์ชัน, ข้อมูล, รหัสตรวจสอง RLC และรหัส ASCII 2 ตัว ที่กำหนดให้หมายถึงจุดสิ้นสุด คือ รหัส 0x0D และ 0x0A คือรหัส CR (Carriage Return) และ LF (Line Feed) ตามลำดับ โดยในขณะที่บัสข้อมูลว่างจากการรับส่งข้อมูล อุปกรณ์ทุกตัวจะคอยตรวจสอบข้อมูลในบัสว่ามีการส่งรหัส ASCII ของ ‘:’ ออกมาหรือไม่ ถ้ามีก็จะรับรู้ว่าขณะนี้ได้มีการเริ่มต้นส่งเฟรมข้อมูลออกมาแล้ว ก็จะเข้ากระบวนการรับข้อมูลต่อไป
ลักษณะเฟรมข้อมูลของ MODBUS ASCII
ลักษณะข้อมูลแต่ละไบต์ของ MODBUS ASCII

MODBUS จะบริการให้อุปกรณ์ติดต่อสื่อสารกันผ่าน Serial Port (RS-232/422/485) แต่ในปัจจุบันได้มีการพัฒนาให้อุปกรณ์สามารถติดต่อสื่อสารกับอุปกรณ์ที่อยู่ บนเครือข่าย Ethernet ซึ่งอุปกรณ์ที่ใช้การสื่อสารแบบ MODBUS Protocol ส่วนใหญ่จะเป็น PLCs, DCSs, HMIs, Instruments อย่างไรก็ตาม MODBUS จำเป็นต้องมีอุปกรณ์จำพวก Gateway และ Bridge ในการติดต่อสื่อสารระหว่าง Serial Line กับ Ethernet


MODBUS TCP/IP
MODBUS TCP/IP ถูกพัฒนาขึ้นโดยมีวัตถุประสงค์เพื่อจะนำการสื่อสารแบบ Internet มาใช้กับอุปกรณ์จำพวก Ethernet Device ระยะในการใช้งานสำหรับการเดินสาย (สาย LAN) คือ 100 เมตร โดยสามารถขยายระยะในการสื่อสารได้โดยการใช้อุปกรณ์ Repeater หรือในระบบ LAN จะเรียกอุปกรณ์นี้ว่า Hub หรือ Switch ก็จะสามารถลากสายได้อีก 100 เมตร และยังสามารถต่อ Repeater ขยายระยะทางได้โดยไม่จำกัด ในการสื่อสารโดยทั่วไปมีความเร็ว 100,000,000 บิตต่อวินาที (100 Mbps) และเชื่อมต่ออุปกรณ์ได้ไม่จำกัดจำนวน




MODBUS TCP/IP
MODBUS ASCII/RTU ที่จะติดต่อสื่อสารกับ MODBUS TCP เพื่อให้ใช้งานในเครือข่าย Ethernet จะใช้ Gateway ติดต่อและแปลงรูปแบบการสื่อสารข้อมูล โดยการสื่อสารของ MODBUS RTU/ASCII จะเป็นการสื่อสารผ่านทาง RS-232/422/485 นั้นจะถูก Gateway แปลงให้เป็น MODBUS TCP เพื่อใช้ในการติดต่อสื่อสารในเครือข่าย Ethernet ต่อไป



การแปลง MODBUS Serial เป็น MODBUS Ethernet