PLCปานกลาง · Intermediate16 นาที

คำสั่ง 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

ชุดอุปกรณ์สำหรับบทความนี้

ราคาชุดอุปกรณ์

฿3,690

จาก 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 Master192.168.1.200
PLC Server (ผู้ให้ข้อมูล)Modbus Slave192.168.1.201
คอมพิวเตอร์—IP อะไรก็ได้ในวงเดียวกัน

IP ต้องไม่ซ้ำกับอุปกรณ์อื่นในวง LAN

เช็คว่าอยู่วงเดียวกันหรือไม่

  1. เปิด Command Prompt พิมพ์ ipconfig
  2. ดูส่วน Ethernet Adapter (การ์ด Ethernet ที่ต่อกับ PLC) ที่ค่า IPv4
  3. 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

  1. เปิด Config → Project Setting → Communication → Net
  2. Protocol เปลี่ยนจาก TCP/IP slave เป็น TCP/IP master
  3. Local IP 192.168.1.200, Subnet mask 255.255.255.0 (Gateway ในคลิปเป็น 192.168.1.1)
  4. กด OK แล้ว Download Config ลง PLC ผ่านสาย USB-C ก่อน

PLC Server

  1. เปิดโปรเจกต์ว่างของตัว Slave ที่ทำไว้ตอนที่แล้ว ไปที่ Config → Project Setting → Communication → Net
  2. Protocol เลือก TCP/IP slave
  3. Local IP 192.168.1.201 (ไม่ซ้ำกับ Client)
  4. Slave Port: PLC Samkoon ตั้ง Default ไว้ที่ 2000 ส่วน Port ที่อุปกรณ์ Modbus TCP ส่วนใหญ่ใช้คือ 502 ถ้าต้องการเปลี่ยนให้แก้ที่ช่องนี้ ในคลิปยังไม่ได้คุยกับอุปกรณ์อื่นจึงใช้ 2000 (Station 1, Slave Handle Time 20 ms ตามค่าที่แสดง)
  5. กด 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 ขั้นตอน

  1. ต่ออุปกรณ์และสาย LAN
  2. ตั้ง Communication Parameters ใน Client และ Server
  3. สร้าง Modbus Table และกำหนดคำสั่งที่จะใช้
  4. เรียกคำสั่ง MOV เพื่อกำหนด IP ของ Modbus Server ปลายทาง
  5. ใช้คำสั่ง DESTIP ระบุ IP Address + Port ของปลายทาง + Client ID
  6. ใช้คำสั่ง MBUSTCP ระบุ Client ID และ Modbus Table เพื่อส่งคำสั่ง

ขั้นที่ 1 และ 2 ทำเสร็จแล้วด้านบน

Modbus Table

ใช้ตารางชื่อ commands ที่เขียนไว้ตอน RS485 ได้เลย เพราะต่างกันแค่สื่อที่ใช้สื่อสาร นี่คือข้อดีของการแบ่งโค้ดแล้วนำมาใช้ซ้ำ

IndexHandle codeSlave registerSlave countMaster registerหน้าที่
00x05 Write single coilK10000K1M1000เขียน Y0 ของ Server
10x06 Write single registerK40000K1D1000เขียน D0 ของ Server
20x01 Read coilK10000K16M1100อ่าน Y0 เป็นต้นไป
30x03 Read holding registerK40000K10D1100อ่าน D0 เป็นต้นไป
40x01 Read coilK30000K1M1200อ่าน 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

  1. ใช้ 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 ต่อไปเอง
  2. สร้างคอนแทคช่วย M800 เรียกคำสั่ง DESTIP และ MBUSTCP
Modbus TCP/IP Client (192.168.1.201:2000)
M8151 เขียน IP + Port ลง D800–D804, M800 เปิดช่องสื่อสารด้วย DESTIP แล้วส่งคำสั่งตาม Modbus Table commands ด้วย MBUSTCP
N0Modbus TCP/IP
M8151 Always On → IP 192.168.1.201 ลง D800–D803 และ Port 2000 ลง D804
M8151MOVK192, D800MOVK168, D801MOVK1, D802MOVK201, D803MOVK2000, D804
M800 → DESTIP เปิด Client ID 1 ไปยัง IP ใน D800 (Retry ต่อเนื่อง) และ MBUSTCP ส่งคำสั่งตาม Table commands
M800DESTIPD800, K1, K65535, D850MBUSTCPK1, commands, D860, D861
นำเข้าไฟล์ใน SamSoar2022: File → Import → เลือกไฟล์ .csv

DESTIP — กำหนด IP ปลายทาง

Parameterค่าในคลิปความหมาย
AddressD800Register เริ่มต้นที่เก็บ IP และ Port
Client IDK1หมายเลขช่องสื่อสาร PLC รุ่นนี้เปิดช่องสื่อสารได้สูงสุด 6 ช่อง
RetryK65535ค่าสูงสุดของ Unsigned Integer แปลว่าพยายามเชื่อมต่อเสมอ ถ้าการเชื่อมต่อหลุดก็จะพยายามต่อใหม่
ReturnD850Return Code บอกว่าการเชื่อมต่อมีปัญหาไหม
DESTIP Return Codeสถานะ
0x00TCP connection successful
0x01TCP connection started
0x02TCP connecting
0x03TCP connection timeout
0x04TCP connection failed (fault)
0x05TCP disconnected
0x06TCP socket connection limit exceeded
0x07TCP master function not enabled

MBUSTCP — ส่งคำสั่งตาม Modbus Table

Parameterค่าในคลิปความหมาย
Client IDK1ต้องตรงกับ Client ID ใน DESTIP
Tablecommandsตารางคำสั่ง Modbus
CodeD860บอกว่าการส่งคำสั่งเกิดปัญหาอะไรหรือไม่ (คล้าย Code ของ MBUS ในตอนที่แล้ว)
IndexD861ลำดับคำสั่งใน Table ที่กำลังทำงาน (นับจาก 0)

ทดสอบการทำงาน

  1. Download โปรแกรมลง PLC Client ผ่าน Network ได้เลย (Config → Communication Settings → Network เช็คว่าคุยกับ IP ที่ลงท้ายด้วย 200)
  2. กด Monitor แล้วสั่ง M800 ให้ติด ถ้า Index (D861) วิ่งไล่ไปเรื่อยๆ แปลว่าการสื่อสารปกติ
  3. Write Coil: สั่ง M1000 ของ Client ให้ ON → Y0 ของ Server ติด
  4. Read Coil: M1100 ของ Client อ่านค่า Y0 กลับมาเป็น ON
  5. Write Register: ใส่ค่า 555 ที่ D1000 ของ Client → ค่าถูกเขียนไปที่ D0 ของ Server และอ่านกลับมาที่ D1100 เป็น 555
  6. ถ้าต้องการยืนยัน เปิดโปรเจกต์ของ 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

ควรอ่านก่อน: