Modbus'ta 32 bit float: ABCD, CDAB, BADC ve DCBA bayt sıraları
Tamamen geçerli bir yazmaç çiftinin neden anlamsız bir sayıya dönüştüğü, IEEE 754 tek duyarlığın iki yazmaca nasıl bölündüğü ve doğru bayt ile kelime sırasının nasıl bulunacağı.
ASP Dijital · IT Hub3 dk okumaTürkçe
Tek sayı, dört bayt
32 bitlik IEEE 754 tek duyarlıklı bir sayının bir işaret biti, 8 bitlik bir üssü ve 23 bitlik bir kesri vardır. En anlamlıdan en az anlamlıya doğru dört bayt olarak yazıldığında 123,456 değeri 42 F6 E9 79 olur. Bu baytlara A, B, C ve D diyelim.
Bir Modbus yazmacı yalnızca 16 bit taşır; bu yüzden sayı iki yazmaca bölünür. Modbus, bir yazmaç içindeki iki baytın sırasını sabitler (hatta önce yüksek bayt), ancak 32 bitlik bir değerin yüksek yarısını hangi yazmacın taşıyacağını söylemez. Her üretici kendi kararını verir; sorun da buradan başlar.
Dört yaygın yerleşim
Yerleşim
Yaygın ad
İlk yazmaç
İkinci yazmaç
ABCD
Büyük uçlu (big-endian)
0x42F6
0xE979
CDAB
Kelime yer değiştirmiş
0xE979
0x42F6
BADC
Her kelime içinde bayt yer değiştirmiş
0xF642
0x79E9
DCBA
Küçük uçlu (little-endian)
0x79E9
0xF642
Adlar birer gelenektir ve farklı üreticiler aynı yerleşim için farklı sözcükler kullanır. Bir cihazı bir etikete güvenmek yerine, tablodaki gibi gerçek yazmaç içerikleriyle tanımlayın.
Yanlış sıra neye benzer?
Cihaz 123,456 değerini CDAB (E979 42F6) olarak gönderiyor ancak yazılımınız ABCD olarak çözüyorsa sonuç hafifçe değil, saçma biçimde yanlış çıkar:
Cihazın gönderdiği
Hattaki yazmaçlar
ABCD olarak çözülünce
ABCD
42F6 E979
123,456
CDAB
E979 42F6
−1,88 × 10²⁵
BADC
F642 79E9
−9,86 × 10³²
DCBA
79E9 F642
1,52 × 10³⁵
Astronomik büyüklükte değerler veya yalnızca gerçek değer küçük olduğu için makul görünen değerler, bayt ya da kelime sırasının yanlış olduğuna güçlü bir işarettir. İkinci durumda dikkatli olun: yanlış bir sıra bazı girdiler için yine de inandırıcı bir sayı üretebilir; bu yüzden tek bir başarılı okuma kanıt değildir.
Doğru sırayı nasıl bulursunuz?
Bildiğiniz bir değeri okuyun. Kendi yazdığınız bir set değerini veya ortam sıcaklığı gibi bariz değeri olan bir büyüklüğü kullanın.
Dört yerleşimi de çözün. İki yazmaç değerini PLC veri tipi dönüştürücüye yapıştırıp dört sonucu karşılaştırın. Yalnızca biri mantıklı çıkacaktır.
İkinci bir değerle doğrulayın. Farklı büyüklükte, proses izin veriyorsa negatif bir değer seçin; çünkü yanlış bir yerleşim özel değerlerde doğru olanla çakışabilir.
Kaydedin. Yerleşimi, o cihaz ve blok için yazmaç haritasına; adres, veri tipi ve ölçeklemenin yanına yazın.
Bazı cihazlar kelime sırası için bir yapılandırma ayarı sunar. Sizinki sunuyorsa bunu bilerek değiştirin ve ayarı belgeleyin; çünkü bir ürün yazılımı sıfırlaması varsayılana dönüş getirebilir.
Aynı sorun float’larla sınırlı değildir
INT32 ve UINT32 aynı dört yerleşime sahiptir ve aynı biçimde yanlış çıkar: 1’er 1’er artması gerekirken 65.536 atlayan bir sayaç genellikle kelime sırası sorunudur.
64 bitlik değerler (double, büyük sayaçlar) dört yazmaca yayılır ve daha da fazla permütasyona izin verir. Aynı disiplinle ele alın.
Metinler yazmaç başına iki karakter paketler; bir yazmaç içindeki karakter sırası da cihazlar arasında farklı olabilir.
Float tahmin etmek yerine tam sayıyı ölçekleyin
Birçok saha cihazı sorunu, belgelenmiş bir ölçekle 16 bitlik bir tam sayı sunarak önler; örneğin 2345 değeri 23,45 °C anlamına gelir. Bu, yanlış gitme yollarının sayısını yarıya indirir. Seçme şansınız varsa tam sayı ve ölçeği tercih edin; ölçeği yalnızca bir kez, uçta uygulayın ve çarpanı yazmaç haritasına yazın. Endüstriyel veri dönüştürücü yazmaç verisine ölçekleme uygular ve sonucu CSV veya JSON olarak dışa aktarır.
Makinenizi, veri akışınızı veya üretim hedefinizi birlikte değerlendirelim. Birkaç cümleyle durumunuzu yazın; ASP Dijital ekibi size e-posta ile dönsün.