PID TUNER BY MODBUS TCP/IP

PID คืออะไร ?

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

ที่มาของภาพ : https://th.wikipedia.org/

MODBUS คืออะไร ?

Modbus เป็นหนึ่งในมาตรฐานการสื่อสารแบบอนุกรม (Serial Communications protocol) ที่ใช้งานอย่างแพร่หลายในระบบอัตโนมัติอุตสาหกรรม (Industrial Automation Systems : IAS) เพื่อสร้างการเชื่อมโยงข้อมูลระหว่างอุปกรณ์ต่างๆ เช่น อุปกรณ์ควบคุมพีแอลซี (Programmable Logic Controllers : PLC) อุปกรณ์ตรวจวัด (Sensor) อุปกรณ์เครื่องกล อุปกรณ์ขับเร้า (Actuator) หน่วยตรวจวัดระยะไกล (Remote Terminal Unit : RTU) รวมถึงระบบคอมพิวเตอร์ที่ใช้ในการควบคุมและแสดงสถานะของอุปกรณ์ต่างๆ (Supervisory control and Data acquisition : SCADA)

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

credit: NECTEC

MODBUS TCP/IP

ในงานนี้เราจะใช้ MODBUS TCP/IP เข้ามาใช้ในการสื่อสารกับตัวหุ่นยนต์ทรงตัว 2 ล้อ (Robot Balancing 2 Wheels) โดยมี ESP32 เป็นตัว Controller ของตัวหุ่นยนต์ แน่นอนว่า ESP32 มีข้อดีคือสามารถทำงานร่วมกับ Network ได้แบบไร้สายผ่านทางการเชื่อมต่อผ่าน WIFI นั่นจึงทำให้ทางเราคิดโปรเจ็คเล็กๆขึ้นมา กลับมาที่ MODBUS TCP/IP ต่อ MODBUS TCP/IP นั้นอยู่บนพื้นฐานของ MODBUS RTU หมายความว่า MODBUS TCP/IP นั้นครอบอยู่บน MODBUS RTU โดย MODBUS RTU จะใช้สายการสื่อสารแบบอนุกรมด้วย RS – 485(คือต้อง มีสายสื่อสารอ่ะ) เนื่องจากว่า MODBUS TCP/IP มีความสามารถในการสื่อสารไร้สายผ่านทาง WIFI ได้เราจึงได้นำมันมาใช้งาน

วัตถุประสงค์

  • ลดเวลาการปรับตั้ง Kp Ki Kd
  • เป็น IoT
  • ใช้งานง่าย

ภาพรวม

ทางเราได้แบ่งการทำงานเป็น 2 ส่วน

  • PC เขียน Software จูน PID โดยใช้ Qt Creator โดยเป็น MODBUS TCP/IP MASTER(CLIENT)
  • Arduino เขียนการควบคุมหุ่นยนต์และตัว MODBUS TCP/IP SLAVE(SERVER)

Qt Creator & ARDUINO IDE

เป็น Software แบบ Opensource เพื่อพัฒนาโปรแบบแบบ Graphic User Interface ทางเราได้นำมาใช้เนื่องจากคุ้นเคยเป็นอย่างดีและเขียนภาษา C++ ได้โดยโปรแกรมที่เรานำมาเขียนนั้นไม่ได้พัฒนาขึ้นมาเองทั้งหมดเนื่องจากคงต้องใช้เวลานานมากๆในการเขียน Library MODBUS ทางเราได้ไปเจอผู้พัฒนาชาวรัสเซียซึ่งท่านนี้ได้เปิดเผย Source Code ของโปรแกรม เราจึงได้หยิบมาพัฒนาต่อกับโปรเจ็คนี้ครับ

Link Original Software : https://github.com/seem-sky/QModBus

ARDUINO IDE

ต้องติดตั้ง Library เพิ่มเข้าไปสามารถ Search หา ได้ภายในโปรแกรมตามนี้ครับ

Link Document : https://github.com/emelianov/modbus-esp8266/tree/master/documentation

Software PID TUNER

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

ภาพ Software ดั้งเดิม

ต่อมาจะเป็น Software ที่เรานำมาปรับแต่งเพื่อให้ใช้กับงานจูน PID

ภาพ Software ที่เรานำมาพัฒนาเพิ่มเติมแล้ว

ข้อจำกัดของ Software

  • ใช้ทศนิยมสูงสุด 1 ตำแหน่งเท่านั้น
  • ต้องดู IP ADDRESS ตลอดแล้วนำมาใส่เอง
  • ยังไม่มีกราฟเพื่อหา Time settling ต้องดูผลลัพธ์ที่ล้อของหุ่นยนต์เลย

ข้อจำกัดของ Protocol MODBUS TCP/IP

เนื่องจาก Protocol นี้มีข้อจำกัดอยู่ที่ว่าไม่สามารถ รับ – ส่ง จำนวนที่เป็นเลขทศนิยม(Float) ดังนั้นจึงต้องมีการตั้งรหัสการสื่อสารเข้ามาระหว่าง Software กับ ESP32

การถอดรหัสการสื่อสารที่เราทำการสร้างขึ้นมาเอง

เราได้แบ่งเป็น 2 ส่วนคือ

  • Software PID TUNER(MASTER) แบ่งเป็น 2 ฟังก์ชัน คือ อ่านค่า และ เขียนค่า แน่นอนว่าค่า Kp Ki Kd ไม่มีทางเป็นจำนวนเต็มดังนั้นเราจึงได้ทำการเพิ่มเติม การคูณ 10 กรณีที่จะเขียนค่า และ หาร 10 กรณีที่เราทำการอ่านค่าที่ได้รับมา
  • ESP32(SLAVE) แบ่งเป็น 2 ฟังก์ชัน คือ อ่านค่า และ เขียนค่า กรณีนี้เราจะทำตรงกันข้ามคือ การคูณ 10 กรณีที่จะอ่านค่าเพื่อนำไปใช้เป็นตัวคูณ และอ่านค่าเพื่อส่งไปหา MASTER โดยการ คูณ 10
void MainWindow::on_KpWrite_clicked()
{
    double value  = (ui->KpNum->text().toDouble())*10;
    int addr = 100;
    mb.write_reg(addr, value);
}

void MainWindow::on_KiWrite_clicked()
{
    double value  = (ui->KiNum->text().toDouble())*10;
    int addr = 101;
    mb.write_reg(addr, value);
}

void MainWindow::on_KdWrite_clicked()
{
    double value  = (ui->KdNum->text().toDouble())*10;
    int addr = 102;
    mb.write_reg(addr, value);
}

Source Code บางส่วน บน Software PID TUNER ที่เราได้ทำการพัฒนาขึ้นมา ใน Code นี้หมายถึง Event เมื่อทำการกดปุ่ม Write ก็จะนำค่าในช่องที่เราพิมพ์(Line Edit) ไปคูณ 10

สรุปผล

เพิ่มเติม

เราใช้ภาษา C++ ทั้งหมดในการเขียนโปรแกรมทุกส่วนโดยครอบคลุมเนื่อหา Object Oriented รวมไปถึง Event Driving (Signal and Slots in Qt Creator)

หากต้องการสอบถามเพิ่มเติมโปรดติดต่อที่ : [email protected]

Link PID TUNER Software : https://github.com/KomKGT/PID_Tuner

Link Balance Robot by ESP32 : https://github.com/KomKGT/Balance_Robot

ผู้จัดทำ

วุฒิชัย พิพัฒน์มโนมัย 65340700410
[ARDUINO and MODBUS TCP/IP on ESP32]
คมกริช ตระหง่านไพบูลย์ 65340700402
[Qt Creator and MODBUS TCP/IP on PC Software PID TUNER]