Kami menerima data dari konter Mercury 203.2T di RS-485



Mengatur koleksi bacaan jarak jauh dari meteran listrik bukanlah tugas yang sulit, meteran itu lebih pintar dan lebih pintar setiap tahun dan harus mengirim semuanya sendiri, tetapi tidak, tentu saja ada informasi, tetapi tersebar. Produsen peralatan rupanya juga ingin menghasilkan uang dengan menjual perangkat lunak mereka. Saya menulis artikel ini untuk menghemat waktu bagi semua orang yang memiliki tugas serupa.

Mulai


Perusahaan perlu mengotomatiskan koleksi bacaan dari meter listrik, sekitar dua puluh lembar. Untuk melakukan ini diperlukan dengan cepat dan semurah mungkin. Oleh karena itu, mereka memutuskan untuk mengumpulkan data menggunakan Zabbix yang sudah digunakan, tetapi untuk terhubung ke konter, perlu untuk menulis skrip kecil, lebih lanjut tentang itu di bawah ini. Ternyata koleksi bacaan hanyalah salah satu parameter yang perlu dikumpulkan, PC dengan Debian on board bertanggung jawab atas sisanya, sehingga tidak sulit untuk terhubung ke konter melalui port COM. Tentu saja, bagi kebanyakan orang, akan lebih nyaman menggunakan jaringan lokal dan mendapatkan informasi dari sakelar industri atau konverter antarmuka.

Dari opsi koneksi, Anda juga dapat mempertimbangkan port optik, meskipun Anda harus membeli perangkat tambahan, di sisi lain, Anda tidak perlu melepas segel.



Terminal untuk menghubungkan ke meter terletak di bawah penutup yang disegel.
Oleh karena itu, kami harus menyetujui perusahaan jaringan yang kami perlukan untuk melepas segel, melakukan pekerjaan, menyegel meter. Tetapi pada akhirnya, kesepakatan tercapai dan dimungkinkan untuk dengan tenang menangani solusi dari masalah utama.



Pemecahan masalah


Sebagai berikut dari dokumentasi resmi.

Penghitung mengambil string input byte dari format ADDR-CMD-CRC, dan memberikan ADDR-CMD-DATA-CRC, di mana:

  • ADDR - Nama Penghitung (untuk Mercury 203.2T - sama dengan nomor seri)
  • CMD - Perintah Kode
  • DATA - Data tergantung pada permintaan
  • CRC - kode byte redundansi 2 byte dihitung pada semua byte sebelumnya dari paket ini. Dari penjelasan ini, tidak jelas apa yang harus ditulis di bidang checksum.

Tanda hubung dalam urutan tidak digunakan, di sini digunakan untuk memisahkan blok logis.

Pertama-tama, hubungkan ke penghitung menggunakan program konfigurator standar dan, dengan menggunakan sniffer, lihat paket yang dikirimkan, cari tahu checksum mana yang harus ditambahkan ke bagian akhir. Di bawah, garis diterima dari konter.



Menggunakan kalkulator online CRC , kami mencari tahu apa yang kami butuhkan untuk menghitung CRC-16 (Modbus) dengan 0xA001 polinomial.

Sedikit python


Ada cukup banyak tautan ke algoritma perhitungan, jadi saya tidak akan membahasnya. Untuk pengembangan, saya menggunakan Python 3

def crc16(data): crc = 0xFFFF l = len(data) i = 0 while i < l: j = 0 crc = crc ^ data[i] while j < 8: if (crc & 0x1): mask = 0xA001 else: mask = 0x00 crc = ((crc >> 1) & 0x7FFF) ^ mask j += 1 i += 1 if crc < 0: crc -= 256 result = data + chr(crc % 256).encode() + chr(crc // 256).encode('latin-1') return result 

Sekarang mari kita coba untuk mendapatkan nomor seri dari konter dan periksa CRC. Anda perlu menginstal modul pyserial

 import serial import struct import time sn = 26222790 #   ser = serial.Serial('/dev/ttyUSB0', 9600, serial.EIGHTBITS, serial.PARITY_NONE, serial.STOPBITS_ONE) print ('Connected:', ser.isOpen()) # \x2f -      chunk = struct.pack('>L', int(sn)) chunk += b'\x2f' chunk = crc16(chunk) #          ser.write(chunk) time.sleep(1) out = ser.read_all() ser.close() print ('Check CRC:', out[-2:] == crc16(out[:-2])[-2:]) print ('Result string:', ':'.join('{:02x}'.format(c) for c in out)) 

Hebat! Sekarang kita mendapatkan nilai untuk energi yang dikonsumsi pada tarif pertama dan kedua, pada kenyataannya, kita hanya perlu mengubah bidang tim dan menguraikan hasilnya.

 chunk += b'\x27' t1 = ''.join('{:02x}'.format(c) for c in out[5:9]) t2 = ''.join('{:02x}'.format(c) for c in out[9:13]) print ('T1 =', float(t1)*0.01, '(*)', 'T2 =', float(t2)*0.01, '(*)') 

Semuanya berfungsi. Versi terakhir skrip diposting di git . Di masa depan, saya berencana untuk menambahkan dukungan untuk bekerja di jaringan lokal.

Untuk pengembangan, Mercury-221 USB -> COM Adapter digunakan, tetapi Anda dapat langsung menghubungkan penghitung ke port COM.



Referensi:

Informasi yang berguna tentang menghubungkan meter ada di sini.
Dokumentasi di situs web resmi
Situs Web Dukungan Teknis
Tentang CRC di Wikipedia

Source: https://habr.com/ru/post/id418209/


All Articles