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ğı.
· 3 dkModbus veri tabloları, 0 ve 1 tabanlı adresler, yaygın fonksiyon kodları ve istisna yanıtları için başvuru niteliğinde bir rehber; klasik birer birer kayma tuzağı açıklanıyor.
Bir Modbus cihazı verisini dört tabloda sunar. Hangisini okuyup yazdığınız, fonksiyon kodunu ve her öğenin boyutunu belirler.
| Tablo | Öğe | Erişim | Klasik gösterim | Fonksiyon kodları |
|---|---|---|---|---|
| Bobinler (coils) | 1 bit | Okuma / yazma | 0xxxx | 01, 05, 15 |
| Ayrık girişler | 1 bit | Salt okunur | 1xxxx | 02 |
| Giriş yazmaçları | 16 bit | Salt okunur | 3xxxx | 04 |
| Tutma yazmaçları | 16 bit | Okuma / yazma | 4xxxx | 03, 06, 16 |
Beş haneli “4xxxx” gösterimi bir dokümantasyon geleneğidir: ilk hane tabloyu, kalan haneler 1’den başlayan yazmaç sayısını belirtir. Yani 40001, ilk tutma yazmacıdır. Hat üzerinde ise istek sıfır tabanlı bir ofset taşır; dolayısıyla ilk tutma yazmacının adresi 0x0000’dır.
Klasik örnek 40108 numaralı tutma yazmacıdır. Protokol adresi 107, yani 0x006B’dir. “108 ile 110 arası yazmaçları oku” diyen bir doküman ile “başlangıç adresi 0x006B, adet 3” diyen bir çerçeve aynı isteği anlatır.
Birer birer kayma sorunlarının çoğunun kökü budur. Bazı üreticiler 1 tabanlı referansları (40001), bazıları sıfır tabanlı adresleri (0, 1, 2) belgeler; bazı yapılandırma araçları ofseti sizin yerinize ekler veya çıkarır. 9.999’un üzerindeki yazmaçlar için birçok dokümanda altı haneli biçim (400001) kullanılır. Asla tahmin etmeyin: dokümantasyonunuzun ve yazılımınızın hangi geleneği kullandığını öğrenin.
| Kod | Ad | İstek başına sınır |
|---|---|---|
| 01 | Bobin oku | 2.000 bobin |
| 02 | Ayrık giriş oku | 2.000 giriş |
| 03 | Tutma yazmacı oku | 125 yazmaç |
| 04 | Giriş yazmacı oku | 125 yazmaç |
| 05 | Tek bobin yaz (0xFF00 = açık, 0x0000 = kapalı) | 1 bobin |
| 06 | Tek yazmaç yaz | 1 yazmaç |
| 15 (0x0F) | Çoklu bobin yaz | 1.968 bobin |
| 16 (0x10) | Çoklu yazmaç yaz | 123 yazmaç |
Modbus RTU üzerinden 17 numaralı (0x11) birimden 40108’den başlayarak üç tutma yazmacını okuyalım:
11 03 00 6B 00 03 76 87
│ │ │ │ └─ CRC-16 (önce düşük bayt)
│ │ │ └─ adet: 3 yazmaç
│ │ └─ başlangıç adresi: 0x006B = 107 (40108 numaralı yazmaç)
│ └─ fonksiyon 03: tutma yazmaçlarını oku
└─ birim (slave) adresi: 17
Modbus TCP üzerinde aynı istekte CRC yoktur ve istek, 7 baytlık bir MBAP başlığıyla (işlem kimliği, protokol kimliği 0, uzunluk ve birim kimliği) başlar:
00 01 00 00 00 06 11 03 00 6B 00 03
Her iki biçimi de oluşturup CRC’yi Modbus çerçeve oluşturucu ile kontrol edebilirsiniz.
Bir cihaz isteği yerine getiremediğinde, fonksiyon koduna 0x80 ekleyip ardından bir istisna kodu içeren bir yanıt döner. 11 83 02 yanıtı “fonksiyon 03 başarısız: geçersiz veri adresi” anlamına gelir.
| Kod | Anlamı | Tipik neden |
|---|---|---|
| 01 | Geçersiz fonksiyon | Cihaz o fonksiyon kodunu desteklemiyor |
| 02 | Geçersiz veri adresi | Eşlenmemiş yazmaç veya bir kaymış başlangıç adresi |
| 03 | Geçersiz veri değeri | İzin verilen aralığın dışında adet |
| 04 | Sunucu cihaz hatası | Cihaz geçerli bir isteği işlerken arızalandı |
Denediğiniz ilk yazmaçta “geçersiz veri adresi” almak, 0 tabanlı ile 1 tabanlı karışıklığının veya eşlenmiş bir bloğun sonunu aşan okumanın klasik işaretidir.
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.