ตารางคำสั่ง Modbus
Note
หน้านี้ใช้กับกล่องเสียงที่สั่งซื้อแบบ Modbus ซึ่งเป็นตัวที่ทางร้านจำหน่าย
ถ้าเป็นเครื่องที่ได้มาจากที่อื่น อาจเป็นแบบคำสั่งเฉพาะ ดูหน้านั้นแทน
ตั้งค่าพอร์ต
ค่า |
|
|---|---|
ความเร็ว |
9600 |
ข้อมูล · หยุด · พาริตี้ |
8 · 1 · ไม่มี |
ที่อยู่อุปกรณ์ |
|
ฟังก์ชันที่รองรับ |
|
Danger
🔴 ที่อยู่เป็น 1 คงที่ ผู้ใช้ตั้งเองไม่ได้
คู่มือเขียนไว้ตรง ๆ ว่า Slave address: 0x01 by default, if you need to modify, please specify in advance (users can not modify)
และไม่มีรีจิสเตอร์สำหรับตั้งที่อยู่ — รีจิสเตอร์ 1 กับ 2 คู่มือเขียนว่าไม่ได้ใช้
ต่างจากหัวอ่าน RFID ที่เขียนที่อยู่ใหม่ได้เอง อย่าเอาวิธีเดียวกันมาใช้
รีจิสเตอร์
ที่อยู่ |
ใช้ทำ |
ค่า |
อ่าน/เขียน |
|---|---|---|---|
|
ไม่ได้ใช้ |
— |
— |
|
ไม่ได้ใช้ |
— |
— |
|
โฟลเดอร์เสียง |
|
อ่านและเขียน |
|
ความดัง |
|
อ่านและเขียน |
Warning
ตารางในคู่มือจบด้วย …… แปลว่าอาจมีรีจิสเตอร์อื่นที่ไม่ได้พิมพ์ไว้
อย่าเดาแล้วเขียนลงไป — เขียนรีจิสเตอร์ที่ไม่รู้ว่าคืออะไรอาจไปโดน ค่าตั้งต้นจากโรงงาน ถ้าต้องการอะไรที่ไม่มีในตารางให้ถามผู้ผลิต
ลำดับการสั่ง
ส่งความดังก่อน แล้วค่อยสั่งเล่น เพราะเป็นคนละรีจิสเตอร์ เขียนพร้อมกันในเฟรมเดียวไม่ได้
ถ้าสั่งเล่นก่อน เสียงจะดังตามค่าเดิมที่ค้างอยู่
ตัวอย่างเฟรม
ทุกเฟรมข้างล่างนี้คำนวณด้วยโปรแกรม ไม่ได้พิมพ์มือ และตรวจกับตัวอย่างในคู่มือแล้ว
เขียน — ฟังก์ชัน 06
ทำอะไร |
เฟรมที่ส่ง |
|---|---|
ความดัง 28 (สูงสุด) |
|
ความดัง 15 |
|
ความดัง 0 (เงียบ) |
|
เล่น |
|
เล่น |
|
เล่น |
|
หยุด |
|
ลำโพงตอบกลับด้วยเฟรมเดิมทุกไบต์ ตามมาตรฐาน 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
จะได้รู้ว่าของจริงตั้งไว้เท่าไร และเป็นการยืนยันว่าสายกับภาษาถูกต้อง ก่อนที่จะไปแก้อะไร