บทความฉบับนี้สอนการเขียนโปรแกรม Python เพื่อนำไปประยุกต์การใช้งานในลักษณะ MODBUS Gateway โดยการอ่านค่า เซ็นเซอร์ Robotiq FT 300 ผ่าน MODBUS RTU
โดยการเชื่อมต่อ KUNBUS RevPi Controller เช่น RevPi Core หรือ RevPi Connect เข้ากับเซ็นเซอร์ วัดแรง และแรงบิด Robotiq FT 300 Force Torque Sensor
มีการใช้พอร์ต RS-485และฟีเจอร์ MODBUS Master Virtual Module ของ RevPi
ซึ่งในที่นี้ RevPi Connect จะทำหน้าเป็น MODBUS Master และ Robotiq FT 300 จะทำหน้าที่เป็น MODBUS Slave
อุปกรณ์ Revolution Pi เช่น RevPi Core และ RevPi Connect ถูกพัฒนาขึ้น เพื่อทดแทน Raspberry Pi (RPi) สำหรับ งานอุตสาหกรรม
หากผู้อ่านมีข้อสงสัยเพิ่มเติม กรุณา ติดต่อ ทีมงาน เทคสแควร์
การกำหนดค่าเริ่มต้น
- ทำการ เชื่อมต่อ อุปกรณ์ ทั้งหมด ตามบทความ การใช้งาน RevPi ผ่านโปรโตคอล SSH แบบรีโมท
- ทำการ กำหนดค่า RevPi Connect ให้สามารถ เริ่มต้น การทำงานด้วย GUI Mode ได้ ตามบทความ สอนการกำหนดค่าอุปกรณ์ RevPi Core / RevPi Connect ให้เริ่มต้นการทำงานด้วย GUI Mode
- ทำการ กำหนดค่า RevPi Connect ให้สามารถ ใช้งาน Remote Desktop ได้ ตามบทความ สอนการใช้ Remote Desktop กับ RevPi Core / RevPi Connect
อุปกรณ์ประกอบ
- คอมพิวเตอร์ จำนวน 1 เครื่อง
- อุปกรณ์ RevPi Connect จำนวน 1 ตัว
- อุปกรณ์ Robotiq FT 300 จำนวน 1 ตัว
- แหล่งจ่ายไฟ 24V DC จำนวน 2 ชุด
ขั้นตอนการเชื่อมต่อสัญญาณ
1) เซ็นเซอร์ วัดแรง และแรงบิด Robotiq FT 300 Force Torque Sensor สามารถวัดแรงได้ 3 แกน (Fx, Fy, Fz) ในย่าน +/- 300 N และวัดแรงบิดได้ 3 แกน (Mx,My,Mz) ในย่าน +/- 30 N-m และสามารถทำการส่งค่าที่วัดได้ ออกมาทาง MODBUS RTU หรือ RS-485
หลังจากทำการจ่ายไฟเลี้ยงให้อุปกรณ์ทั้ง 2 ตัว แล้ว ให้ทำการต่อสายตาม Diagram ด้านล่าง
2) เปิดหน้า Web Browser บนคอมพิวเตอร์ และพิมพ์ IP Address ของอุปกรณ์ RevPi Connect และ ทำการ Login ตาม รายละเอียด ดังต่อไปนี้
- Username: admin
- Password: ดูได้จากสติ้กเกอร์ด้านข้างของอุปกรณ์ RevPi
3) จะปรากฏหน้าต่าง Web Server ของ อุปกรณ์ RevPi Connect ให้เลือกแทบ SERVICES เพื่อทำการกด Enabled Modbus Master และกดปุ่ม SAVE ALL
4) ให้เลือกแทบ APPS แล้วทำการ Click ที่ปุ่ม START เพื่อเริ่มต้นโปรแกรม PiCtory
5) ให้ทำการลาก ไอคอน ModbusRTU Master ในกลุ่ม Virtual Devices จากเมนูทางด้านซ้าย มาอยู่ด้านข้างของรูป RevPi Connect (ในช่อง empty ข้างใดก็ได้)
6) กำหนดค่าพอร์ต RS-485 ของ RevPi Connect ให้ตรงกับ Robotiq FT 300 ตามรูปด้านล่าง
7) เนื่องจาก ผู้ใช้สามารถ กำหนดค่าเกี่ยวกับ MODBUS เพื่ออ่านค่าจาก Robotiq FT 300 ได้หลายค่า ในตัวอย่างนี้จะทดสอบการอ่านค่า Production year, Serial number, Force X, Force Y และ Force Z จึงทำการกำหนดค่า Value Editor ของ ModbusRTU MASTER ที่เพิ่มขึ้นมา เป็นชื่อตามรูปด้านล่าง
8) คลิกขวาที่ รูป ModbusRTU MASTER ที่เพิ่มขึ้นมา แล้วเลือกเมนู Extended Data จะปรากฎหน้าต่าง Extended Data ของ ModbusRTUMaster ตัวนี้ขึ้นมา ให้ทำการกำหนดค่าของ ModbusRTUMaster ให้สอดคล้องกับการกำหนดค่าก่อนหน้า ตามรูปด้านล่าง
จากนั้นให้ทำการบันทึกค่าตามขั้นตอนดังต่อไปนี้
- เลือกเมนู File -> Save As
- เลือกเมนู File -> Save as Start-Config.
- เลือกเมนู File -> Load Start-Config.
- เลือกเมนู Tools -> Reset Driver แล้วกดปุ่ม OK
9) ใช้โปรแกรม PuTTY จากคอมพิวเตอร์ หรือ เปิดโปรแกรม Terminal ที่อุปกรณ์ RevPi Connect แล้วพิมพ์คำสั่งด้านล่าง เพื่อทดสอบการอ่านค่าจาก Robotiq FT 300 ผ่าน MODBUS RTU
- piTest -1 -r Year
- piTest -1 -r SN1
- piTest -1 -r Fx
- piTest -1 -r Fy
- piTest -1 -r Fz
10) เลือกเมนู File และ Export เพื่อทำการสร้างไฟล์ Offset List ที่จะใช้อ้างอิงตำแหน่งของ Address ในการ เขียนโปรแกรม ด้วยภาษา Python โดยให้เลือกเป็นโหมด Offset list (Template เป็น e02.json)
ในที่นี้ ได้ผลลัพธ์ ของไฟล์ OffsetList.txt เป็นตามรายการด้านล่าง
- Year 11 //WORD
- SN1 13 //WORD
- Fx 15 //WORD
- Fy 17 //WORD
- Fz 19 //WORD
Year หมายถึง ปีที่เซ็นเซอร์ตัวนี้ถูกผลิต มี Offset ที่ Address 11
SN1 หมายถึง หลายเลขอุปกรณ์ ส่วนที่ 1 (จากทั้งหมด 4 ส่วน) มี Offset ที่ Address 13
Fx หมายถึง ค่าแรงที่วัดได้ ในแนวแกน x มี Offset ที่ Address 15
Fy หมายถึง ค่าแรงที่วัดได้ ในแนวแกน y มี Offset ที่ Address 17
Fz หมายถึง ค่าแรงที่วัดได้ ในแนวแกน z มี Offset ที่ Address 19
11) ใช้โปรแกรม VNC Viewer เข้าไปยังอุปกรณ์ RevPi Connect แล้วเปิดโปรแกรม Python 3 (IDLE)
11) พิมพ์คำสั่งตามรายการด้านล่าง เพื่อทดสอบการอ่านค่าทั้งหมด
import time
import struct
import fcntl
techsquare=open("/dev/piControl0","wb+",0)
techsquare.seek(11)
Year=int.from_bytes(techsquare.read(2),byteorder='little')
techsquare.seek(13)
SN1=int.from_bytes(techsquare.read(2),byteorder='little')
techsquare.seek(15)
Fx=int.from_bytes(techsquare.read(2),byteorder='little')
techsquare.seek(17)
Fy=int.from_bytes(techsquare.read(2),byteorder='little')
techsquare.seek(19)
Fz=int.from_bytes(techsquare.read(2),byteorder='little')
print(Year,SN1,Fx,Fy,Fz)
หากทำตามขั้นตอนนี้เรียบร้อย จะสามารถอ่านค่า Year, SN1, Fx, Fy และ Fx ออกมาได้อย่างถูกต้อง