ABB ACS580 มี Modbus RTU มาในตัว (Embedded Fieldbus หรือ EFB) ไม่ต้องซื้อการ์ดเสริม แต่คู่มือมันหนามากและตัวเลขสเกลกระจายอยู่คนละที่กัน

บทความนี้คือสิ่งที่ผมทดสอบกับไดรฟ์จริงจนได้ค่าที่ตรงกับหน้าจอ keypad ทุกตัว

ตั้งค่าที่ตัวไดรฟ์ก่อน

พารามิเตอร์ตั้งเป็น
58.01Modbus RTU
58.03Slave ID (เลือกเอง)
58.049600
58.058 EVEN 1
58.14No action
58.330 (addressing mode)
58.06Refresh ← ต้องกดทุกครั้งหลังแก้อะไรในกลุ่ม 58

⚠️ สองตัวที่คนพลาดบ่อย:

  • 58.05 เป็น 8E1 ไม่ใช่ 8N1 — อุปกรณ์ Modbus ส่วนใหญ่ใช้ 8N1 แต่ ABB ตั้งมาเป็น even parity ถ้าฝั่ง ESP32 ตั้ง SERIAL_8N1 จะคุยกันไม่รู้เรื่องเลย
  • 58.33 ต้องเป็น 0 ไม่งั้นอ่าน parameter register ไม่ได้ (process data ยังอ่านได้ ทำให้หลงคิดว่าต่อสำเร็จแล้ว)

และอย่าลืมว่า ACS580 ต้องคุมทิศทางรับ/ส่งเอง ใช้โมดูล RS-485 ที่มีขา RE/DE ไม่ใช่แบบ auto-direction (รายละเอียดอยู่ในบทความเรื่องเลือกโมดูล RS-485)

Process Data — อ่านได้เสมอ

แอดเดรสที่ใช้ในโค้ดคือ register − 40001

แอดเดรสregisterคืออะไรสเกล
040001Control Word (เขียน)0x047E = พร้อม/หยุด · 0x047F = RUN
140002Reference 1 (เขียน Hz)20000 = 100% ของความถี่สูงสุด
340004Status Wordbit0=Ready 1=Active 2=Running 3=Fault 7=Warning 8=AtSetpoint
440005Actual 1 = ความถี่จริง20000 = ความถี่สูงสุด

กับดักสองข้อตรงนี้

Status Word อยู่ที่แอดเดรส 3 ไม่ใช่ 4 — ผมเสียเวลาไปนานเพราะไล่นับต่อจาก reference แล้วคิดว่าต้องเป็น 2 หรือ 4

สเกลคือ 20000 ไม่ใช่ 10000 ซึ่งต่างจากไดรฟ์หลายยี่ห้อ ถ้าใช้ 10000 ค่าจะออกมาเป็นครึ่งเดียวพอดี ทำให้หลงคิดว่าไดรฟ์วิ่งช้ากว่าที่สั่ง

1
2
3
4
5
6
7
8
9
// สั่งความถี่
uint16_t hzToReg(float hz, float maxHz) {
  return (uint16_t)(hz / maxHz * 20000.0);
}

// อ่านความถี่กลับ
float regToHz(uint16_t raw, float maxHz) {
  return raw * maxHz / 20000.0;
}

Parameter Register — อ่านทีละตัวเท่านั้น

สูตรแปลง: register = 40000 + (กลุ่ม × 100) + ดัชนี แล้ว แอดเดรส = register − 40001

พารามิเตอร์แอดเดรสหารหน่วย
01.07 กระแสมอเตอร์1061A (หยาบ — เป็นจำนวนเต็ม)
01.08 กระแส %1071%Ie
01.10 แรงบิด %109100%
01.11 แรงดัน DC bus11010V
01.13 แรงดันขาออก1121V
01.14 กำลังขาออก11310kW
01.15 กำลัง %11410%Pn
04.01 ฟอลต์ปัจจุบัน4001รหัส
05.10 อุณหภูมิบอร์ดควบคุม5091°C
05.11 อุณหภูมิอินเวอร์เตอร์5101%

ตัวหารที่ใช้คือค่าตามหน้าจอ (display value) ไม่ใช่ค่า FbEq ในคู่มือ — จุดนี้ทำให้หลายคนได้ค่าผิดสเกลไปสิบเท่า

⚠️ ต้องอ่านทีละตัว (count = 1)

พารามิเตอร์บางตัวเป็น 32 บิต ซึ่ง EFB อ่านไม่ได้เลย จะตอบ exception กลับมา และถ้าคุณอ่านเป็นบล็อกที่คร่อมตัว 32 บิตเข้าไป ทั้งบล็อกจะพังไปด้วย ไม่ใช่แค่ตัวเดียว

พารามิเตอร์ที่อ่านไม่ได้: 01.06 (ความถี่ — ใช้ Actual1 ที่แอดเดรส 4 แทน), 01.50/01.51 (kWh/GWh), 05.01/05.02/05.04 (ตัวนับชั่วโมง)

ถ้าจำเป็นต้องใช้ตัวนับพลังงานจริง ๆ มีสองทาง: ให้ ESP32 นับเวลาเดินเครื่องเอง หรือ map เข้า Data I/O ผ่าน 58.106 ขึ้นไป แล้วอ่านที่แอดเดรส 5 เป็นต้นไป

เกร็ดที่ต้องรู้ถ้าจะสั่งงานจริง

รอบต่อนาที (RPM) มีสเกลซ้อนอีกชั้น

01.01 ที่แอดเดรส 100 ไม่ได้เป็น 1 = 1 rpm แต่เป็น 20000 = ค่าใน 46.01 (Speed scaling)

ต้องอ่าน 46.01 (แอดเดรส 4600, หาร 1) มาก่อน แล้วค่อยคำนวณ:

1
2
float rpm = raw * speedScaling / 20000.0;
// ตัวอย่าง: raw 4806 กับ 46.01 = 1500  →  4806 × 1500 / 20000 = 360.45 rpm

ตรงกับที่หน้าจอ keypad แสดงพอดี

สั่งหมุนกลับทาง ต้องตั้งสองพารามิเตอร์

ส่งค่า reference ติดลบอย่างเดียวไม่พอ ต้องตั้งด้วย:

  • 20.21 Direction = Request (0)
  • 30.13 Minimum frequency = −50.00 Hz (ค่าดิบ −500, หาร 10)

ถ้า 30.13 ยังเป็น 0 ค่าลบที่ส่งไปจะถูกตัดทิ้ง แล้วมอเตอร์จะไปหยุดที่ 0 Hz แทนที่จะหมุนกลับ

เขียนพารามิเตอร์ผ่าน FC06 ได้

ตั้งค่าไดรฟ์จากระยะไกลได้เลย เช่น เขียน 20.21 ที่แอดเดรส 2020 หรือ 30.13 ที่แอดเดรส 3012 — สะดวกมากถ้าทำหน้าเว็บควบคุมบน ESP32

แรงดันขาออกที่วัดด้วยมัลติมิเตอร์จะไม่ตรง

ถ้าเอามัลติมิเตอร์ไปวัดขาออกของอินเวอร์เตอร์แล้วได้ค่าแปลก ๆ (ผมวัดได้ 309V ขณะที่ register บอก 192–200V) register คือค่าที่ถูก เพราะขาออกเป็นสัญญาณ PWM ซึ่งมัลติมิเตอร์ทั่วไปวัดไม่ได้ ไดรฟ์คำนวณค่าจริงตามเส้น V/f ของมันเอง

ระวังเรื่อง Control Word ตอนใช้งานจริง

ถ้าจะให้คนกดปุ่ม start/stop ที่หน้าไดรฟ์ตามปกติ อย่าส่ง Control Word ไปเรื่อย ๆ เพราะถ้า CW เป็น 0 ไดรฟ์จะขึ้นเตือน Emergency stop (OFF2) — ให้ปล่อย 20.01 เป็น terminal แล้วใช้ Modbus อ่านค่าอย่างเดียว

การส่ง CW แบบ keep-alive ควรทำเฉพาะตอนทดสอบที่ต้องการสั่ง RUN ผ่าน fieldbus จริง ๆ เท่านั้น

สรุปสิ่งที่ต้องระวัง

  1. 8E1 ไม่ใช่ 8N1
  2. 58.33 = 0 ไม่งั้นอ่าน parameter ไม่ได้
  3. 58.06 Refresh ทุกครั้งหลังแก้กลุ่ม 58
  4. Status Word อยู่แอดเดรส 3
  5. สเกล 20000 ไม่ใช่ 10000
  6. อ่าน parameter ทีละตัว ห้ามอ่านเป็นบล็อก
  7. ใช้โมดูล RS-485 ที่คุม DE เองได้