New: the AI firewall watches the whole platform and explains each incident in plain words. See how it works

Modbus register’larını her saniye mi göndermeli, değişince mi? Gateway yazılımında kararsızım

Modbus register’larını her saniye mi göndermeli, değişince mi? Gateway yazılımında kararsızım

Solved 7 6

Tez projemde bir Pi 4 gateway yazıyorum. RS-485 üzerinden 3 Modbus RTU cihazı okuyor: bir elektromanyetik debimetre (anlık debi ve toplam, float, 2 register) ve iki PT100 transmitter. pymodbus ile her saniye hepsini okuyup her saniye v1/gw/telemetry ile gönderiyorum.

Danışmanım “her saniye göndermek saçma” dedi ama nasıl yapmam gerektiğini söylemedi 🙂 Sorularım: register değişince mi gönderilir, periyodik mi? Değişmeyen bir değer için cihazın hâlâ yaşadığını nasıl anlarım? Bir de debimetrenin float değeri bazen 1.4e-38 gibi saçma geliyor.

♥ 0

Her saniye göndermek mesaj kotasını hızlı yer, cihaz başına ayda 2.5 milyonun üstü.

Sahadan selamlar.
♥ 0

Binalarda biz sıcaklık için 1 dakikalık periyot kullanıyoruz, yetiyor.

♥ 0

Ama debimetrede kısa süreli tepeleri kaçırmamam lazım, onu nasıl yapacağım?

♥ 1

Okumayı hızlı, göndermeyi seyrek yap, ikisi ayrı şeyler. Biz su tarafında böyle kuruyoruz:

  • Pi her saniye okumaya devam etsin.
  • Her değer için bir ölü bant: PT100’de 0.2 °C, debide %1 gibi. Değer son gönderilenden ölü banttan fazla saparsa gönder.
  • Hiç değişmese bile her 5 dakikada bir heartbeat olarak gönder.
  • Tepeler için anlık debiye güvenme, debimetrenin toplam (totalizer) register’ını gönder. Arada ne olursa olsun toplam kaybolmaz, Hermetry’de increase ile saatlik hacmi alırsın.

Mesaj sayısı için: bir mesajın içinde kaç kayıt olduğu önemli değil, mesaj başına sayılıyor. Değişenleri biriktirip 30 saniyede bir ts’li dizi olarak tek mesajda gönderirsen hem kotaya hem detaya iyi gelir.

1.4e-38 kelime sırası. İki 16 bitlik register’ı ters birleştiriyorsun. Debimetrenin dokümanına bak, çoğu CDAB kullanıyor:

import struct
hi, lo = rr.registers[0], rr.registers[1]
abcd = struct.unpack(">f", struct.pack(">HH", hi, lo))[0]
cdab = struct.unpack(">f", struct.pack(">HH", lo, hi))[0]

Kota hesabı burada: Mesaj kotası ve kullanım

Ağ geçidi yine bağlanıyor…
Accepted solution♥ 5

Heartbeat’i seçerken offline alarmı düşün. Profilin Inactivity timeout’u varsayılan 600 saniye, heartbeat bundan kısa olmalı yoksa sessiz ama sağlam bir cihaz için alarm açılır.

Kayıtta yoksa olmamıştır.
♥ 0

Teşekkürler Hakan Bey, Esra Hanım. Ölü bant 0.2 °C ve %1, heartbeat 5 dakika, 30 saniyede bir toplu gönderim. Debimetre CDAB’ymiş, değerler düzeldi. Bir günde mesaj sayısı 86 binden 3 bin civarına indi, danışmanım da mutlu.

♥ 0

Kelime sırasını anlamanın en kolay yolu: debimetrenin ekranında bilinen bir değer varken iki birleştirmeyi de yazdır, hangisi ekranla tutuyorsa o.

♥ 0
Viewing 8 posts – 1 through 8 (of 8 total)
  • You must be logged in to reply to this topic.

Join the conversation

Sign in to ask and answer, like helpful posts and mark the reply that solved your problem. Every contribution earns points and levels.

Share