คำสั่ง Modbus TCP/IP
ให้ PLC Samkoon 2 ตัวคุยกันด้วย Modbus TCP/IP ผ่านสาย LAN ตั้ง IP ฝั่ง Client และ Server ใน SamSoar2022 ทดสอบ Ping แล้วใช้ DESTIP กับ MBUSTCP ส่งคำสั่งตาม Modbus Table เดิมจากตอน RS485
Modbus TCP/IP ใช้สาย LAN แทนสาย RS485 โดย PLC Client (Master เดิม) ตั้ง IP 192.168.1.200 และ Server (Slave เดิม) ตั้ง 192.168.1.201 Port 2000 ที่ Project Setting → Communication → Net ใน SamSoar2022 ใน Ladder ใช้ MOV เก็บ IP และ Port ลง D800–D804 (M8151 Always On) แล้ว DESTIP เปิดช่องสื่อสาร และ MBUSTCP ส่งคำสั่งตาม Modbus Table — Return Code 0 คือเชื่อมต่อได้ ส่วน Code 16 ของ MBUSTCP คือสื่อสารไม่ได้ เช่นสาย LAN หลุด
อัพเดทล่าสุด: 26 ตุลาคม 2569
จาก RS485 สู่สาย LAN
ตอนที่แล้ว PLC 2 ตัวคุยกันด้วย Modbus ผ่านสาย RS485 (สายไฟ 2 เส้น) ตอนนี้เปลี่ยนมาใช้สาย LAN แทน ข้อดีคือการส่งสัญญาณเสถียรกว่า และในอนาคตนำไปเชื่อมกับระบบ SCADA หรือระบบสมัยใหม่ได้ง่าย ซึ่งมักสื่อสารผ่านสาย LAN อยู่แล้ว
ต่ออุปกรณ์และสาย LAN
PLC ตัว Client, PLC ตัว Server และคอมพิวเตอร์ ต่อเข้าวง LAN เดียวกันผ่าน Switch หรือ Hub
ความยาวสาย LAN แต่ละช่วงไม่ควรเกิน 100 เมตร ถ้าต้องเดินสายยาวกว่านั้นให้คั่นด้วยอุปกรณ์อย่าง Switch เพื่อทวนสัญญาณ เช่นระยะ 300 เมตรให้แบ่งเป็นช่วงละ 100 เมตร การสื่อสารจะเสถียรกว่า
กำหนด IP Address
| อุปกรณ์ | เดิมเรียกว่า | IP Address |
|---|---|---|
| PLC Client (ผู้ส่งคำสั่ง) | Modbus Master | 192.168.1.200 |
| PLC Server (ผู้ให้ข้อมูล) | Modbus Slave | 192.168.1.201 |
| คอมพิวเตอร์ | — | IP อะไรก็ได้ในวงเดียวกัน |
IP ต้องไม่ซ้ำกับอุปกรณ์อื่นในวง LAN
เช็คว่าอยู่วงเดียวกันหรือไม่
- เปิด Command Prompt พิมพ์
ipconfig - ดูส่วน Ethernet Adapter (การ์ด Ethernet ที่ต่อกับ PLC) ที่ค่า IPv4
- Subnet Mask เป็นตัวกำหนด Network ID ถ้าเป็น 255.255.255.0 แปลว่า 3 Octet แรก (192.168.1) คือ Network ID ทุกอุปกรณ์ที่จะคุยกันต้องขึ้นต้นด้วย 192.168.1 ส่วนตัวเลขสุดท้ายแล้วแต่อุปกรณ์
เปลี่ยน IP ของคอมพิวเตอร์ (ถ้าอยู่คนละวง)
Control Panel → Network & Internet → Network & Sharing Center → คลิก Ethernet → Properties → ดับเบิลคลิก IPv4 แล้วตั้ง IP ให้อยู่วงเดียวกับ PLC
ตั้งค่า Communication ใน SamSoar2022
PLC Client
- เปิด Config → Project Setting → Communication → Net
- Protocol เปลี่ยนจาก TCP/IP slave เป็น TCP/IP master
- Local IP 192.168.1.200, Subnet mask 255.255.255.0 (Gateway ในคลิปเป็น 192.168.1.1)
- กด OK แล้ว Download Config ลง PLC ผ่านสาย USB-C ก่อน
PLC Server
- เปิดโปรเจกต์ว่างของตัว Slave ที่ทำไว้ตอนที่แล้ว ไปที่ Config → Project Setting → Communication → Net
- Protocol เลือก TCP/IP slave
- Local IP 192.168.1.201 (ไม่ซ้ำกับ Client)
- Slave Port: PLC Samkoon ตั้ง Default ไว้ที่ 2000 ส่วน Port ที่อุปกรณ์ Modbus TCP ส่วนใหญ่ใช้คือ 502 ถ้าต้องการเปลี่ยนให้แก้ที่ช่องนี้ ในคลิปยังไม่ได้คุยกับอุปกรณ์อื่นจึงใช้ 2000 (Station 1, Slave Handle Time 20 ms ตามค่าที่แสดง)
- กด OK แล้ว Download Config ผ่านสาย USB
Ping Test
หลังตั้ง IP แล้ว สับสวิตช์ PLC ไปที่ Stop แล้วกลับมา Run ทั้งสองตัว จากนั้นลอง Ping
ping 192.168.1.200
ping 192.168.1.201
ถ้ามี Reply กลับมาแปลว่าคอมพิวเตอร์คุยกับ PLC ได้ ถ้า Ping ไม่เจอให้เช็คว่าอุปกรณ์อยู่วงเดียวกันไหม Download Config ลง PLC แล้วหรือยัง สับสวิตช์ Run/Stop แล้วหรือยัง หรือลองปิดเปิดไฟใหม่
ภาพรวม 6 ขั้นตอน
- ต่ออุปกรณ์และสาย LAN
- ตั้ง Communication Parameters ใน Client และ Server
- สร้าง Modbus Table และกำหนดคำสั่งที่จะใช้
- เรียกคำสั่ง MOV เพื่อกำหนด IP ของ Modbus Server ปลายทาง
- ใช้คำสั่ง DESTIP ระบุ IP Address + Port ของปลายทาง + Client ID
- ใช้คำสั่ง MBUSTCP ระบุ Client ID และ Modbus Table เพื่อส่งคำสั่ง
ขั้นที่ 1 และ 2 ทำเสร็จแล้วด้านบน
Modbus Table
ใช้ตารางชื่อ commands ที่เขียนไว้ตอน RS485 ได้เลย เพราะต่างกันแค่สื่อที่ใช้สื่อสาร นี่คือข้อดีของการแบ่งโค้ดแล้วนำมาใช้ซ้ำ
| Index | Handle code | Slave register | Slave count | Master register | หน้าที่ |
|---|---|---|---|---|---|
| 0 | 0x05 Write single coil | K10000 | K1 | M1000 | เขียน Y0 ของ Server |
| 1 | 0x06 Write single register | K40000 | K1 | D1000 | เขียน D0 ของ Server |
| 2 | 0x01 Read coil | K10000 | K16 | M1100 | อ่าน Y0 เป็นต้นไป |
| 3 | 0x03 Read holding register | K40000 | K10 | D1100 | อ่าน D0 เป็นต้นไป |
| 4 | 0x01 Read coil | K30000 | K1 | M1200 | อ่าน M0 |
ทุกแถวใช้ TriggerMode เป็น ModbusMode_Loop ส่วนแถวที่อ่าน K20000 (Coil ที่ไม่มีอยู่จริง ใช้ทดสอบ Error ในตอนที่แล้ว) ให้ลบทิ้ง
Address นับจาก 0 (แนวทางทั่วไป) — Slave Register ใน Modbus Table ของ SamSoar2022 นับจาก 0 ใส่ตามตาราง Modbus Address ของ Samkoon ได้ตรงๆ (D0 = 40000, Y0 = 10000, M0 = 30000) ถ้าโปรแกรม Master นับจาก 1 (Base 1) ให้บวก 1 เช่น D0 = 40001
เขียน Ladder ฝั่ง Client
สร้าง Network ใหม่ชื่อ Modbus TCP/IP
- ใช้ M8151 (Always On) สั่ง
MOVค่า IP ของ Server ทีละ Octet ลง D800 ถึง D803 (192, 168, 1, 201) แล้วMOV K2000ลง D804 เป็น Port — ที่ต้องเป็น D804 เพราะ DESTIP ระบุแค่ Address เริ่มต้น D800 แล้วนับ D801, D802, D803, D804 ต่อไปเอง - สร้างคอนแทคช่วย M800 เรียกคำสั่ง DESTIP และ MBUSTCP
DESTIP — กำหนด IP ปลายทาง
| Parameter | ค่าในคลิป | ความหมาย |
|---|---|---|
| Address | D800 | Register เริ่มต้นที่เก็บ IP และ Port |
| Client ID | K1 | หมายเลขช่องสื่อสาร PLC รุ่นนี้เปิดช่องสื่อสารได้สูงสุด 6 ช่อง |
| Retry | K65535 | ค่าสูงสุดของ Unsigned Integer แปลว่าพยายามเชื่อมต่อเสมอ ถ้าการเชื่อมต่อหลุดก็จะพยายามต่อใหม่ |
| Return | D850 | Return Code บอกว่าการเชื่อมต่อมีปัญหาไหม |
| DESTIP Return Code | สถานะ |
|---|---|
| 0x00 | TCP connection successful |
| 0x01 | TCP connection started |
| 0x02 | TCP connecting |
| 0x03 | TCP connection timeout |
| 0x04 | TCP connection failed (fault) |
| 0x05 | TCP disconnected |
| 0x06 | TCP socket connection limit exceeded |
| 0x07 | TCP master function not enabled |
MBUSTCP — ส่งคำสั่งตาม Modbus Table
| Parameter | ค่าในคลิป | ความหมาย |
|---|---|---|
| Client ID | K1 | ต้องตรงกับ Client ID ใน DESTIP |
| Table | commands | ตารางคำสั่ง Modbus |
| Code | D860 | บอกว่าการส่งคำสั่งเกิดปัญหาอะไรหรือไม่ (คล้าย Code ของ MBUS ในตอนที่แล้ว) |
| Index | D861 | ลำดับคำสั่งใน Table ที่กำลังทำงาน (นับจาก 0) |
ทดสอบการทำงาน
- Download โปรแกรมลง PLC Client ผ่าน Network ได้เลย (Config → Communication Settings → Network เช็คว่าคุยกับ IP ที่ลงท้ายด้วย 200)
- กด Monitor แล้วสั่ง M800 ให้ติด ถ้า Index (D861) วิ่งไล่ไปเรื่อยๆ แปลว่าการสื่อสารปกติ
- Write Coil: สั่ง M1000 ของ Client ให้ ON → Y0 ของ Server ติด
- Read Coil: M1100 ของ Client อ่านค่า Y0 กลับมาเป็น ON
- Write Register: ใส่ค่า 555 ที่ D1000 ของ Client → ค่าถูกเขียนไปที่ D0 ของ Server และอ่านกลับมาที่ D1100 เป็น 555
- ถ้าต้องการยืนยัน เปิดโปรเจกต์ของ Server เลือก Network เป็น IP 201 แล้ว Monitor ดู D0 จะเห็นค่า 555 ที่เขียนมาจากตัวแรก
การจัดการ Error
- สาย LAN ของ Client หลุด → Code ของ MBUSTCP (D860) เป็น 16 นำค่านี้ไปแจ้งเตือนว่าการสื่อสารมีปัญหาได้ เสียบสายกลับแล้วรอสักพัก การสื่อสารจะกลับมาเหมือนเดิม
- Server ไฟดับ → เกิด Error 16 เช่นกัน เมื่อไฟกลับมา ระบบจะพยายามเชื่อมต่อใหม่ให้เองเพราะตั้ง Retry ไว้ที่ K65535
ใช้กับอุปกรณ์อื่น
หลักการเดียวกันนี้ใช้คุยกับอุปกรณ์อะไรก็ได้ที่รองรับ Modbus ไม่ว่าจะเป็น PLC, Sensor หรือ VFD สิ่งที่ต้องดูจากข้อมูลของผู้ผลิตคือ
- IP Address และ Port ของอุปกรณ์
- Coil หรือ Register ที่ต้องการอยู่ตำแหน่งไหน (และดูว่าคู่มืออุปกรณ์นับ Address จาก 0 หรือ 1 เพราะ SamSoar2022 นับจาก 0)
- อ่านหรือเขียนได้กี่ตัว
ตอนต่อไปจะเพิ่มความสามารถของ PLC ด้วย Extension Module
คำถามที่พบบ่อย
- Modbus TCP/IP ดีกว่า RS485 อย่างไร?
- การส่งสัญญาณผ่านสาย LAN เสถียรกว่า และในอนาคตนำไปเชื่อมกับ SCADA หรือระบบสมัยใหม่ได้ง่าย ใช้ Modbus Table และหลักการเดิมจาก RS485 ได้ทันที เปลี่ยนแค่สื่อเป็นสาย LAN (แต่ละช่วงไม่ควรเกิน 100 เมตร ถ้ายาวกว่านั้นคั่นด้วย Switch)
- Port ควรใช้ 2000 หรือ 502?
- PLC Samkoon ใช้ Port 2000 เป็นค่า Default ส่วน 502 คือ Port ที่อุปกรณ์ Modbus TCP ส่วนใหญ่ใช้ เปลี่ยนได้ที่ Slave Port ฝั่ง Server ให้ตรงกับอุปกรณ์ที่จะคุยด้วย ถ้าเป็น PLC Samkoon คุยกันเองใช้ 2000 ได้เลย
- ตั้งค่าแล้วยัง Ping ไม่ผ่านต้องทำอย่างไร?
- เช็คว่าคอมพิวเตอร์และ PLC อยู่วง LAN เดียวกัน (เช่น 192.168.1.x กับ Subnet Mask 255.255.255.0) Download Config ลง PLC แล้วหรือยัง สับสวิตช์ Run → Stop → Run แล้วหรือยัง ถ้ายังไม่ได้ลองปิดเปิดไฟ PLC ใหม่
- DESTIP กับ MBUSTCP ต้องตั้งค่าอย่างไร?
- ในคลิปใช้ DESTIP Address D800, Client ID K1, Retry K65535, Return D850 — D800 คือ Register แรกที่เก็บ IP (D800–D803) และ Port (D804) ส่วน MBUSTCP ใช้ Client ID K1 ตัวเดียวกัน, Table ชื่อ commands, Code D860 และ Index D861
- ต่อกับอุปกรณ์อื่นผ่าน Modbus TCP ได้ไหม?
- ได้ ทั้ง PLC, Sensor หรือ VFD ที่รองรับ Modbus ต้องดูข้อมูลจากผู้ผลิตว่า Coil หรือ Register ที่ต้องการอยู่ตำแหน่งไหน อ่านได้กี่ตัว แล้วกรอกลง Modbus Table
ควรอ่านก่อน:
มีคำถาม? ติดต่อทีมงาน
