ตารางคำสั่ง Modbus

Note

หน้านี้ใช้กับกล่องเสียงที่สั่งซื้อแบบ Modbus ซึ่งเป็นตัวที่ทางร้านจำหน่าย

ถ้าเป็นเครื่องที่ได้มาจากที่อื่น อาจเป็นแบบคำสั่งเฉพาะ ดูหน้านั้นแทน

ตั้งค่าพอร์ต

ค่า

ความเร็ว

9600

ข้อมูล · หยุด · พาริตี้

8 · 1 · ไม่มี

ที่อยู่อุปกรณ์

1

ฟังก์ชันที่รองรับ

03 06 10

Danger

🔴 ที่อยู่เป็น 1 คงที่ ผู้ใช้ตั้งเองไม่ได้

คู่มือเขียนไว้ตรง ๆ ว่า Slave address: 0x01 by default, if you need to modify, please specify in advance (users can not modify)

และไม่มีรีจิสเตอร์สำหรับตั้งที่อยู่ — รีจิสเตอร์ 1 กับ 2 คู่มือเขียนว่าไม่ได้ใช้

ต่างจากหัวอ่าน RFID ที่เขียนที่อยู่ใหม่ได้เอง อย่าเอาวิธีเดียวกันมาใช้

รีจิสเตอร์

ที่อยู่

ใช้ทำ

ค่า

อ่าน/เขียน

0001

ไม่ได้ใช้

0002

ไม่ได้ใช้

0003

โฟลเดอร์เสียง

0255

อ่านและเขียน

0004

ความดัง

028

อ่านและเขียน

Warning

ตารางในคู่มือจบด้วย …… แปลว่าอาจมีรีจิสเตอร์อื่นที่ไม่ได้พิมพ์ไว้

อย่าเดาแล้วเขียนลงไป — เขียนรีจิสเตอร์ที่ไม่รู้ว่าคืออะไรอาจไปโดน ค่าตั้งต้นจากโรงงาน ถ้าต้องการอะไรที่ไม่มีในตารางให้ถามผู้ผลิต

ลำดับการสั่ง

ส่งความดังก่อน แล้วค่อยสั่งเล่น เพราะเป็นคนละรีจิสเตอร์ เขียนพร้อมกันในเฟรมเดียวไม่ได้

ถ้าสั่งเล่นก่อน เสียงจะดังตามค่าเดิมที่ค้างอยู่

ตัวอย่างเฟรม

ทุกเฟรมข้างล่างนี้คำนวณด้วยโปรแกรม ไม่ได้พิมพ์มือ และตรวจกับตัวอย่างในคู่มือแล้ว

เขียน — ฟังก์ชัน 06

ทำอะไร

เฟรมที่ส่ง

ความดัง 28 (สูงสุด)

01 06 00 04 00 1C C9 C2

ความดัง 15

01 06 00 04 00 0F 88 0F

ความดัง 0 (เงียบ)

01 06 00 04 00 00 C8 0B

เล่น AW002

01 06 00 03 00 02 F8 0B

เล่น AW004

01 06 00 03 00 04 78 09

เล่น AW005

01 06 00 03 00 05 B9 C9

หยุด

01 06 00 03 00 00 79 CA

ลำโพงตอบกลับด้วยเฟรมเดิมทุกไบต์ ตามมาตรฐาน Modbus

อ่าน — ฟังก์ชัน 03

อ่านโฟลเดอร์กับความดังพร้อมกันสองรีจิสเตอร์

ส่ง   01 03 00 03 00 02 34 0B
ตอบ   01 03 04 00 07 00 09 8B F4
            │  └─┬─┘ └─┬─┘
            │    │     └── ความดัง = 9
            │    └──────── โฟลเดอร์ = 7 คือ AW007
            └───────────── จำนวนไบต์ข้อมูล = 4

Danger

🔴 ตรวจไบต์ที่สามให้เป็น 04 เสมอ

คำสั่งอ่านที่เราส่งออกไปขึ้นต้นด้วย 01 03 เหมือนคำตอบเป๊ะ ถ้าสาย RS485 สะท้อนกลับมา แล้วโค้ดดูแค่สองไบต์แรก จะรับเฟรมของตัวเองเป็นค่าจริง แล้วแปลได้เป็น

  • โฟลเดอร์ 768 — ซึ่งเกิน 255

  • ความดัง 564 — ซึ่งเกิน 28

ค่าที่เป็นไปไม่ได้ทั้งคู่ แต่ถ้าไม่ตรวจก็จะเอาไปใช้ต่อเงียบ ๆ

CRC

CRC16 มาตรฐาน Modbus — พหุนาม 0xA001 ค่าเริ่มต้น 0xFFFF ส่งไบต์ต่ำก่อนไบต์สูง

def crc16(data):
    c = 0xFFFF
    for b in data:
        c ^= b
        for _ in range(8):
            c = (c >> 1) ^ 0xA001 if c & 1 else c >> 1
    return bytes([c & 0xFF, (c >> 8) & 0xFF])   # ต่ำก่อนสูง

Tip

สลับไบต์ CRC เป็นความผิดพลาดที่เจอบ่อยที่สุด — อาการคือลำโพงเงียบสนิท เหมือนสายขาด

ตรวจง่าย ๆ ด้วยการเทียบเฟรมที่โปรแกรมสร้างกับตารางข้างบน ถ้าสองไบต์ท้ายกลับกันแสดงว่าเจอแล้ว

ตรวจโค้ดก่อนต่อของจริง

ก่อนเสียบของจริง ให้โปรแกรมพิมพ์เฟรมออกมาแล้วเทียบกับตารางข้างบน เร็วกว่าไล่หาปัญหาตอนต่ออุปกรณ์แล้วมาก

Important

อ่านค่ากลับมาดูก่อนเขียนทับเสมอ ใช้ฟังก์ชัน 03

จะได้รู้ว่าของจริงตั้งไว้เท่าไร และเป็นการยืนยันว่าสายกับภาษาถูกต้อง ก่อนที่จะไปแก้อะไร