Endüstriyel protokoller

Modbus adresleme ve fonksiyon kodları: 40001 neden 0 numaralı yazmaç

Modbus 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.

Dört veri tablosu

Bir Modbus cihazı verisini dört tabloda sunar. Hangisini okuyup yazdığınız, fonksiyon kodunu ve her öğenin boyutunu belirler.

TabloÖğeErişimKlasik gösterimFonksiyon kodları
Bobinler (coils)1 bitOkuma / yazma0xxxx01, 05, 15
Ayrık girişler1 bitSalt okunur1xxxx02
Giriş yazmaçları16 bitSalt okunur3xxxx04
Tutma yazmaçları16 bitOkuma / yazma4xxxx03, 06, 16

40001 neden 0 numaralı yazmaç?

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.

Yaygın fonksiyon kodları

KodAdİstek başına sınır
01Bobin oku2.000 bobin
02Ayrık giriş oku2.000 giriş
03Tutma yazmacı oku125 yazmaç
04Giriş yazmacı oku125 yazmaç
05Tek bobin yaz (0xFF00 = açık, 0x0000 = kapalı)1 bobin
06Tek yazmaç yaz1 yazmaç
15 (0x0F)Çoklu bobin yaz1.968 bobin
16 (0x10)Çoklu yazmaç yaz123 yazmaç

Bir isteğin anatomisi

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.

İstisna yanıtları

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.

KodAnlamıTipik neden
01Geçersiz fonksiyonCihaz o fonksiyon kodunu desteklemiyor
02Geçersiz veri adresiEşlenmemiş yazmaç veya bir kaymış başlangıç adresi
03Geçersiz veri değeriİzin verilen aralığın dışında adet
04Sunucu 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.

Devreye almadan önce kısa kontrol listesi

  • Dokümantasyonunuzun 0 tabanlı mı 1 tabanlı mı olduğunu ve yazılımınızın ofset ekleyip eklemediğini doğrulayın.
  • Tabloyu (bobin, ayrık giriş, giriş yazmacı, tutma yazmacı) doğrulayın ve eşleşen fonksiyon kodunu kullanın.
  • Tüm bloğu okumadan önce değerini bildiğiniz tek bir yazmacı okuyun.
  • 32 bitlik değerler için bayt ve kelime sırasını netleştirin: Modbus’ta 32 bit float yazısına bakın.
  • Her kararı yazmaç haritasına kaydedin. Yazmaç haritası doğrulama kontrol listesi size sırayı verir; seri ile Ethernet arasındaki seçim Modbus TCP ve RTU yazısında (İngilizce) ele alınır.
BİR SONRAKİ ADIM

Hesaplamadan uygulamaya.

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.

ASP Dijital ile görüşün