เอกสาร IAMMETER อย่างเป็นทางการ
อุปกรณ์ IAMMETER รองรับ Modbus/TCP เครื่องจำลองนี้จัดเตรียมรีจิสเตอร์แบบเดิมที่ใช้ร่วมกันและแมป SunSpec 203 แบบอ่านอย่างเดียวที่อธิบายไว้ด้านล่าง ศึกษาคำแนะนำอย่างเป็นทางการเกี่ยวกับความเข้ากันได้ของรุ่นอุปกรณ์จริง
เป้าหมายและเครื่องมือ
อ่านเฟส A ด้วยไคลเอนต์ Modbus หรือตัวอย่างไลบรารีมาตรฐาน Python ด้านล่าง ไม่จำเป็นต้องมีแพ็คเกจ Python
ใช้ชื่อโฮสต์และพอร์ต TCP ไม่ใช่ HTTPS URL หรือเส้นทางโมเดล จุดสิ้นสุดที่กำหนดค่าไว้แสดงอยู่ด้านล่าง
จุดสิ้นสุดของ Modbus
simulator.iammeter.com:502การตั้งค่าการเชื่อมต่อ
- เชื่อมต่อกับปลายทางด้านบน อ่าน 10 register เริ่มต้นที่ที่อยู่ 0
- ถอดรหัสแรงดันไฟฟ้า กระแสไฟฟ้า กำลังไฟฟ้าที่ใช้งานและพลังงานที่มีเครื่องหมายโดยใช้ตารางด้านล่าง
- ทำซ้ำหลังจากผ่านไปหลายวินาที: พลังงานจะเพิ่มขึ้นในขณะที่ทิศทางพลังงานที่สอดคล้องกันทำงานอยู่ การอ่านไม่ได้ขับเคลื่อนนาฬิกาจำลอง
| การตั้งค่า | ค่า |
|---|---|
| เจ้าภาพ | simulator.iammeter.com |
| พอร์ต TCP | 502 |
| รหัสฟังก์ชั่น | 03 หรือ 04 |
| รหัสหน่วย | ค่าใดๆ สะท้อนไม่เปลี่ยนแปลง |
| ที่อยู่เริ่มต้น | 0 |
| ลงทะเบียนนับ | 10 |
ถอดรหัสเฟส A
| ที่อยู่ | ชนิด | การแปลง |
|---|---|---|
| 0 | uint16 | ۞100 โวลต์ |
| 1 | uint16 | ۞100 ก |
| 2–3 | int32 | W |
| 4–5 | uint32 | KW800 กิโลวัตต์ชั่วโมง (นำเข้า) |
| 6–7 | uint32 | KW800 กิโลวัตต์ชั่วโมง (ส่งออก) |
| 8 | int16 | ۞1,000 PF |
ตัวอย่างไพธอน 3
import socket, struct
HOST, PORT = "simulator.iammeter.com", 502
def receive_exact(sock, size):
data = bytearray()
while len(data) < size:
chunk = sock.recv(size - len(data))
if not chunk:
raise ConnectionError("Connection closed")
data.extend(chunk)
return bytes(data)
# Transaction=1, protocol=0, length=6, Unit ID=1; FC03, address=0, count=10.
request = struct.pack(">HHHBBHH", 1, 0, 6, 1, 3, 0, 10)
with socket.create_connection((HOST, PORT), timeout=5) as sock:
sock.sendall(request)
transaction, protocol, length, unit = struct.unpack(">HHHB", receive_exact(sock, 7))
if transaction != 1 or protocol != 0 or unit != 1 or not 2 <= length <= 254:
raise ValueError("Invalid Modbus header")
pdu = receive_exact(sock, length - 1)
if pdu[:2] != bytes([3, 20]) or len(pdu) != 22:
raise ValueError("Unexpected response: " + pdu.hex())
raw = pdu[2:]
print("Voltage V:", struct.unpack_from(">H", raw, 0)[0] / 100)
print("Current A:", struct.unpack_from(">H", raw, 2)[0] / 100)
print("Active W:", struct.unpack_from(">i", raw, 4)[0])
print("Import kWh:", struct.unpack_from(">I", raw, 8)[0] / 800)
print("Export kWh:", struct.unpack_from(">I", raw, 12)[0] / 800)
print("PF:", struct.unpack_from(">H", raw, 16)[0] / 1000)ผลลัพธ์ที่คาดหวัง
แหล่งที่มา Inverter and grid เริ่มต้นส่งคืน A รุ่น, B ลงนามกำลังกริดและ C ค่าศูนย์ B และ C เริ่มต้นที่ที่อยู่ 10 และ 20 ค่า 32 บิตทั้งหมดจะใช้คำที่สูงก่อน โดยมีไบต์ขนาดใหญ่
ทุกรุ่นใช้แผนผังรีจิสเตอร์สามเฟสที่ใช้ร่วมกัน: พลังงานที่ใช้งาน 4000 kWh และพลังงานปฏิกิริยา 4000 kvarh อย่าใช้สเกลเฟสเดียวทางกายภาพ 3200
การเลือกแหล่งที่มาของเบราว์เซอร์และการตั้งค่า Reactive/NEM จะไม่เปลี่ยนแปลงบริการที่ใช้ร่วมกันนี้ รองรับการอ่านเท่านั้น
SunSpec 203: มิเตอร์ 3 เฟสแบบอ่านอย่างเดียว
SunSpec ใช้ตำแหน่งข้อมูล TCP เดียวกันกับรีจิสเตอร์แบบเดิม ใช้ฟังก์ชัน 03 และที่อยู่โปรโตคอลแบบศูนย์ เครื่องจำลองจะระบุเป็น WEM3050T รุ่น 203 เสมอ โดยไม่คำนึงถึงรุ่นเว็บหรือ Unit ID ที่เลือก
อ่านบล็อกเมตร 107 ทะเบียนที่ 40070 ทุกโพล ถอดรหัสค่าเป็นจำนวนเต็ม × 10^SF โดยอ่านค่าแต่ละค่าและตัวประกอบสเกลที่ลงนามในคำตอบเดียวกัน พลังงานอยู่ในหน่วย Wh; ตัวประกอบกำลังคือเปอร์เซ็นต์ มาตราส่วนสามารถเปลี่ยนแปลงได้เมื่อค่าเพิ่มขึ้น
จุดสิ้นสุดที่ใช้ร่วมกันเปิดเผยโมเดล 203 เท่านั้น การแมปเฟิร์มแวร์ 201 (WEM3080) และ 202 (WEM2067) ไม่ได้ถูกเลือกผ่านเพจเบราว์เซอร์หรือ Unit ID ไม่มีรุ่นโฟลต 211–214 ให้มา การใช้งานนี้ไม่ได้รับการรับรอง SunSpec
| ที่อยู่เริ่มต้น | ลงทะเบียนนับ | สารบัญ |
|---|---|---|
| 40000 | 2 | ซันเอส: 0x5375, 0x6E53 |
| 40002 | 68 | รุ่นทั่วไป 1 ความยาว 66: IAMMETER / WEM3050T / Simulator-1.0 / 1AD9B537 |
| 40070 | 107 | มิเตอร์จำนวนเต็ม รุ่น 203 ยาว 105 |
| 40177 | 2 | ปลายรุ่น 0xFFFF ยาว 0 |
การแก้ไขปัญหา
หมดเวลาการเชื่อมต่อ: ตรวจสอบพอร์ตที่แสดง ไฟร์วอลล์ และความสามารถในการเข้าถึง TCP หน้า HTTPS ที่ใช้งานได้ไม่ได้พิสูจน์ว่าสามารถเข้าถึงพอร์ต Modbus ได้
ค่าที่ไม่คาดคิด: ตรวจสอบการกำหนดที่อยู่แบบศูนย์ การลงนามอำนาจ ลำดับคำ และการปรับขนาด อย่าส่งเฟรม Modbus RTU ไปยังตำแหน่งข้อมูล TCP นี้