
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
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 resmiSitus Web Dukungan TeknisTentang CRC di
Wikipedia