Ağ

Modbus'ta float değerin bayt sırası nasıl bulunur?

Kısa yanıt

Bir 32 bitlik float iki Modbus register'ına yayılır. Cihazlar bu iki register'ı ve içlerindeki baytları farklı sıralarla gönderebilir; sık görülenler ABCD, CDAB, BADC ve DCBA'dır. Bilinen bir değerle, örneğin 25.0 (0x41C80000) ile, dört sıra sınanır; seçilen sıra ikinci bir bilinen değerle doğrulanır.

Neden dört farklı sıra var?

Modbus protokolü 16 bitlik register'ları ve değerlerini tanımlar; float gibi veri tiplerini tanımlamaz. Bu yüzden 32 bitlik bir float'ı iki register'a bölüp hangi sırayla yazacağına cihaz üreticisi karar verir ve bunu belgeye yazar.

Float'ın dört baytını A (en yüksek anlamlı) ile D (en düşük anlamlı) olarak adlandırın. Modbus, her register içinde yüksek baytı önce gönderir (big-endian). Sıralar iki açıdan farklılaşır: hangi register'ın önce geldiği ve her register içindeki baytların yer değiştirip değiştirmediği.

ABCD doğal sıradır. CDAB iki register'ı yer değiştirir. BADC her register içindeki baytları yer değiştirir. DCBA tüm bayt dizisini tersine çevirir.

Örnek: 25.0 değeri dört sırada

Hipotetik bir örnek: sensör 25.0 değerini bildiriyor. IEEE 754 tek duyarlıkta 25.0 değeri 0x41C80000'dır: işaret 0, üs 10000011, kesir 1001 ile devam eden sıfırlar. Dört bayt A = 0x41, B = 0xC8, C = 0x00, D = 0x00'dır.

  • ABCD: register 1 = 0x41C8, register 2 = 0x0000 (ondalık 16840 ve 0)
  • CDAB: register 1 = 0x0000, register 2 = 0x41C8 (ondalık 0 ve 16840)
  • BADC: register 1 = 0xC841, register 2 = 0x0000
  • DCBA: register 1 = 0x0000, register 2 = 0xC841

Cihaz ABCD gönderiyor, siz CDAB olarak çözerseniz bitler 0x000041C8 olur. Bu, yaklaşık 2,4e-41 gibi sıfıra çok yakın bir değerdir ve hiçbir hata uyarısı vermez. Bu yüzden sonucu prosesin gerçekte gösterdiği değerle karşılaştırın.

Sık yapılan hatalar

Birinci hata adreslemedir. 40001 gibi register gösterimleri çoğu zaman 1 tabanlıdır; protokol adresi ise 0'dan başlar. Yani 40001 okumak için adres 0 istenir. Bazı kılavuzlar doğrudan 0 tabanlı adres verir, bu yüzden hangi kuralın geçerli olduğunu kontrol edin. Bir kaydırma hatası komşu register'ı okur ve komşu da makul bir sayıysa fark etmek zorlaşır.

İkinci hata, iki register'ı ayrı isteklerde okumaktır. İki okuma arasında süreç değişirse değer iki farklı anın karışımı olur. İki register'ı tek istekte okuyun.

Üçüncü hata, tek ve makul görünen bir değere güvenmektir. Bazı yanlış sıralar da makul sayılar üretebilir. Aynı karışıklık, ölçekli 16 bitlik bir tamsayıyı float gibi okumak gibi veri tipi hatalarını da gizleyebilir. Yerel bir göstergeden alınan ikinci bir bilinen değer en güvenilir kontroldür.

Sık sorulanlar

Float değeri hangi fonksiyon koduyla okumalıyım?

Holding register okumak için 03, input register okumak için 04 kullanılır. Float iki ardışık 16 bitlik register gerektirdiği için ikisini tek istekte okuyun. Hangi register tablosunun bu değeri içerdiğini cihaz belgesi gösterir.

Cihaz değeri tamsayı olarak saklıyorsa ne olur?

Bazı cihazlar değeri bir ölçek faktörüyle tek bir 16 bitlik tamsayı olarak saklar. Bu durumda kelime sırası sorusu yoktur; ölçek faktörü ve değerin işaretli mi işaretsiz mi olduğu cihaz belgesinden alınmalıdır.

Kaynaklar

Örnek sayılar varsayımsaldır; sahada doğrulanmış sonuç iddiası değildir.

Benzer sorular

Tüm sorular