บทที่ 25: ฝึกเขียนโปรแกรมเชื่อมต่อกับ Modbus RTU Relay โดยใช้พอร์ต RS485
Modbus RTU Relay เป็นชุดบอร์ด Relay สําหรับใช้สั่งงานควบคุมผ่านทางพอร์ต สื่อสารอนุกรมโดยใช้การเชื่อมต่อสื่อสารผ่านสัญญาณ RS485 แบบ Half Duplex ด้วย Protocol การสื่อสารแบบ Modbus RTU หรือ AT Command รองรับการเชื่อมต่อสื่อสารระยะไกลแบบ Multi-drop ตามมาตรฐาน RS485 สามารถเชื่อมต่ออุปกรณ์ร่วมกันในระบบบัสเดียวกันได้มากถึง 32 อุปกรณ์ โดยสามารถกําหนดค่า Slave Address ได้อิสระจาก Dip Switch มีคําสั่งรองรับการทํางานแบบ PLC ทั้งการสั่ง ON/OFF โดยตรง และ Toggle และ Inter-Locking (ON1/OFF ช่องอื่นๆ หรือ ON2/OFF ช่องอื่น หรือ OFF ทั้งหมด) หรือ แบบ Momentary (ON เป็นเวลา 0.5 วินาทีแล้ว OFF เอง) และ Delay (ON เป็นเวลานานตามเวลาที่กําหนดไว้แล้ว OFF เอง) เป็นต้น

ข้อกําหนดในการติดต่อสื่อสาร จะใช้การสื่อสารแบบอนุกรม ผ่านระบบสัญญาณ RS485 แบบ
Half Duplex ด้วย Modbus RTU Protocol โดยจะใช้ Dip Switch[1..6] สําหรับทําหน้าที่กําหนดค่า Slave Device Address ระหว่าง 0x00 – 0x3F โดย Switch[1] แทน A0 Switch[2] แทน A1 ไล่เรียงไปจนถึง
Switch[6] แทน A5 ตามลําดับ โดยตําแหน่ง Switch ที่ ON จะมีค่าเป็น “1” และ Switch ที่ OFF จะมีค่า
เป็น “0” โดยในการสื่อสารจะมีข้อกําหนดของค่าพารามิเตอร์ของการสื่อสารอนุกรมเป็นดังนี้
-
Baudrate 9600 BPS
-
Data 8 bit
-
None Parity
-
1 Stop Bit

สามารถอ่านข้อมูลเพิ่มเติมเกี่ยวกับ Modbus RTU Relay 8 channel ได้จากลิ้งค์ด้านล่าง
25.1. ในการทดลองในบทความนี้ เราจะนำตัว ESP-32 เชื่อมต่อกับ Modbus RTU Relay 8 channel ผ่านทางพอร์ต RS485 โดยทำการเชื่อมต่อตามรูปด้านล่าง โดยทำการเซต Address ของ Modbus RTU Relay เป็น 0x01



25.2. ทำการดาวน์โหลดโปรแกรมตัวอย่างตามลิ้งค์ด้านล่าง จากนั้นทำการเปิดโปรแกรมตัวอย่าง จากนั้นทำการอัปโหลดไปยัง ESP-32
https://github.com/tenergyinnovation/Arduino-Learning-Kit-v2.0/tree/master/Modbus_RTU_Relay8
25.3. จากนั้นทำการเลื่อน DIP Switch ของ RS485 ไปอยู่ที่ตำแหน่ง ON ดูการทำงานของ Modbus RTU Relay และดูสถานะที่หน้าต่าง ๆ Serial Monitor

อธิบายการทำงานของโค้ด
-
บรรทัดที่ 1-4 เป็นการกำหนดค่าให้กับพอร์ต RS485 โดยการ include ไลบรารี่ modbusRTU.h เข้ามาใช้งาน
-
ในฟังก์ชัน setup ทำการกำหนดค่า baud rate ให้กับ Serial port และ RS485
-
ในฟังก์ชัน loop จะมี for-loop สำหรับสั่งเปิด-ปิด Modbus RTU Relay ทั้ง 8 ตัวหรือ 8 channel และแสดงสถานะของรีเลย์แต่ละตัวหลังจากทำการเปิดและปิดเป็นที่เรียบร้อยแล้ว โดยมีคำสั่งที่ใช้หลัก ๆอยู่สองคำสั่งคือ
-
คำสั่งควบคุมการทำงานรีเลย์
relayControl_modbusRTU(address, channel, state)
address = แอดเดรสของ Modbus RTU Relay โดยเซตที่ตัว DIP Switch ของตัวรีเลย์
channel = คือรีเลย์ตัวที่ 1 – 8
state = สถานะที่ต้องการให้รีเลย์แต่ละตัว ON หรือ OFF
-
คำสั่งแสดงสถานะของรีเลย์แต่ละตัว โดยค่าที่ส่งกลับมาจะเป็นค่า 1 (ON) หรือ 0 (OFF)
relayStatus_modbusRTU( address, channel)
address = แอดเดรสของ Modbus RTU Relay โดยเซตที่ตัว DIP Switch ของตัวรีเลย์
channel = คือรีเลย์ตัวที่ 1 – 8
แบบฝึกหัดสำหรับทบทวนความเข้าใจและประยุกต์ใช้งานจริง
-
ทำการประยุกต์ใช้โปรแกรม Blynk จากบทเรียนที่ผ่านมา โดยสั่งให้ทำการเปิด-ปิด Modbus RTU Relay ทั้ง 8 ตัว ผ่านปุ่มกดใน Blynk
-
จำลองระบบ smart farm โดยให้ออกแบบการทำงานของ Modbus RTU Relay ดังนี้
-
Relay1 – Relay4 ควบคุมปั๊มจ่ายน้ำ 4 ตัว จะสั่งงานผ่านแอปพลิเคชัน Blynk สั่งงานด้วยปุ่มกด
-
Relay5 ควบคุมการเปิด-ปิดระบบจ่ายระอองน้ำ ทำงานตามความชื้นในอากาศ โดยค่าความชื้นในอากาศมีค่าความชื้นสัมพัทธ์ต่ำกว่า 60% ให้ Relay5=ON แต่ถ้าสูงกว่า 60% ให้ Relay5 = OFF
-
Relay6 ควบคุมการทำงานของปั๊ม ทำงาน ON-OFF ตามเวลาที่ตั้งไว้ในแอปพลิเคชัน Blynk
-
Relay7 จะเป็นตัวจ่ายน้ำเข้าถังเก็บน้ำ โดยถ้าน้ำต่ำกว่าระดับที่ตั้งไว้จะทำการเปิด ในการเช็คระดับน้ำจะให้อัลตร้าโซนิคเซนเซอร์เป็นตัวเช็คระดับน้ำ โดยให้เขียนโปรแกรมว่า ถ้าระยะวัตถุเกิน 5 เมตร ให้ Relay7=ON แต่ถ้าไกล้กว่า 5 เมตรให้ Relay7=OFF
-
Relay8 จะเปิด-ปิด ระบบให้แสงสว่าง โดยใช้ตัว LDR เป็นเซนเซอร์เช็คแสงสว่างในสภาพแวดล้อม โดยถ้าไม่มีแสงสว่างให้ Relay8=ON แต่ถ้ามีแสงสว่างเข้ามาให้ Relay8=OFF
-




Leave a Reply