Skip to content

Modbus Adresleme ​

Yaklaşık 8 dk okuma

Bu sayfa Modbus Seri, Modbus Serial over Ethernet ve Modbus TCP cihazlarındaki tag'lerin Adres, Veri Tipi ve Veri Uzunluğu alanlarının nasıl yorumlandığını anlatır. Üç Modbus bağlantı tipi aynı adres kurallarını kullanır. Kanal ve cihaz ayarları için Modbus Seri (RTU/ASCII), Modbus Serial over Ethernet ve Modbus TCP sayfalarına bakın.

Adres biçimi ​

Modbus tag adresi, alan türünü belirten bir rakam ile register (veya bit) numarasından oluşur. Yaygın yazım 6 hanelidir (400001); 5 haneli yazım (40001) da aynı register'ı gösterir. Register içindeki bir bite erişmek için adresin sonuna nokta ve bit numarası eklenir.

text
400001      Holding register 1
300010      Input register 10
000005      Coil 5
100003      Discrete input 3
400020.7    Holding register 20, bit 7

Adres alanı şu kurala uyar:

  • İlk hane 0, 1, 3 veya 4 olmalıdır.
  • İlk haneden sonra yalnız rakamlar gelir ve bu sayı 0–65535 aralığında olmalıdır (ör. 400001, 40001, 465535). İşaret, boşluk veya ek bölüm kullanılmaz.
  • Bit eki noktadan sonra 0–15 arası bir sayıdır ve yalnız Bool register tag'lerinde kullanılır (bkz. Bit adresleme).

Adres bu kurallara veya tag'in veri tipine uymazsa tag tablosunda "Adres ModbusTcp adres paterni ile eşleşmiyor." biçiminde bir uyarı görünür; mesajda cihazın bağlantı tipi yer alır. Aynı kural sunucuda da uygulanır; kurala uymayan tag kaydedilmez ve hata mesajında nedeni görünür. Gelişmiş Tag olarak işaretlenen tag'lerde ve _ConnError, _TagQualityBad cihaz sistem adreslerinde bu kontrol yapılmaz (bkz. Tag Yönetimi).

Alan türleri ​

İlk haneModbus alanıErişimOkuma fonksiyonuYazma fonksiyonuKullanılabilen veri tipleri
0Coil (çıkış biti)Okuma/YazmaFC01 Read CoilsFC05 Write Single CoilYalnızca Bool
1Discrete input (giriş biti)Sadece okumaFC02 Read Discrete Inputs—Yalnızca Bool
3Input registerSadece okumaFC04 Read Input Registers—Bool (bit ekiyle) ve sayısal tipler
4Holding registerOkuma/YazmaFC03 Read Holding RegistersFC06 / FC16 (aşağıya bakın)Bool (bit ekiyle) ve sayısal tipler

Holding register yazmalarında kullanılan fonksiyon, değerin kapladığı register sayısına göre seçilir:

  • Tek register'lık değerler (Byte, Sbyte, Int, Word): FC06 Write Single Register
  • Birden fazla register'lık değerler (DInt, DWord, Real, LInt, ULInt, LWord, LReal): FC16 Write Multiple Registers
  • Register içindeki bit (Bool): önce FC03 ile register'ın güncel değeri okunur, yalnızca hedef bit değiştirilir ve değer FC06 ile geri yazılır.

1 ve 3 ile başlayan adresler cihazda salt okunurdur. Bu tag'leri Sadece Okuma olarak işaretleyin; işaretlenmese bile servis bu adreslere yazma isteği göndermez ve hatayı servis loguna yazar.

Zero Based ayarı ​

Cihazın Ayarlar sekmesindeki Zero Based seçimi, adresteki numaranın protokolde hangi register'a karşılık geldiğini belirler.

Zero BasedAdresCihaza gönderilen protokol adresi
İşaretli (varsayılan)4000010
İşaretli (varsayılan)40010099
İşaretli değil4000000
İşaretli değil400100100

Cihaz dokümanında register'lar 1'den başlayarak numaralandırılmışsa (ör. "40001") Zero Based işaretli kalmalıdır. Doküman protokol adresini 0'dan başlayarak veriyorsa (ör. "adres 0x0000") seçimi kaldırın. Okunan değerler beklenen register'ın bir öncesine veya sonrasına aitse önce bu ayarı kontrol edin.

Zero Based işaretliyken 400000 adresi de 0 numaralı register'a karşılık gelir; karışıklığı önlemek için bu durumda adresleri 1'den başlatın. Adresteki numara en fazla 65535 olabilir. Birden fazla register kaplayan değerlerde son register da cihazın adres aralığında kalmalıdır.

Bit adresleme ​

  • Coil ve discrete input (0, 1): Her adres tek bir bittir. Veri tipi yalnız Bool olabilir ve adrese bit eki yazılmaz.
  • Register içindeki bit (3, 4): Veri tipi Bool olan register tag'lerinde bit eki zorunludur. Bit numarası 0–15 arasındadır; 0 en düşük anlamlı bittir. Örneğin 400020.0, 20 numaralı holding register'ın en düşük bitidir.
  • Bool olmayan tipler: 3 ve 4 adreslerinde bit eki kullanılmaz.

Bu kurallar tag tablosunda ve sunucuda kayıt sırasında denetlenir; örneğin .16 gibi bir bit eki, coil adresinde bit eki, Bool olmayan bir coil tag'i veya bit ekli bir Int tag'i kaydedilmez.

Holding register bitine yazma oku-değiştir-yaz yöntemiyle yapılır. 2WinScada aynı bağlantı üzerinden yaptığı kendi yazmalarını sıraya alır; ancak PLC programının veya başka bir sistemin aynı register'ı iki işlem arasında değiştirmesine karşı koruma sağlamaz.

Veri tipleri ​

Veri TipiKapladığı registerAçıklama
BoolCoil/discrete input'ta 1 bit; register'da 1 bitRegister içinde bit eki gerekir
Byte1Register'ın düşük baytı (bit 0–7), işaretsiz
Sbyte1Register'ın düşük baytı (bit 0–7), işaretli
Word116 bit işaretsiz tamsayı
Int116 bit işaretli tamsayı
DWord232 bit işaretsiz tamsayı
DInt232 bit işaretli tamsayı
Real232 bit IEEE 754 kayan noktalı sayı
LWord464 bit işaretsiz tamsayı
ULInt464 bit işaretsiz tamsayı
LInt464 bit işaretli tamsayı
LReal464 bit IEEE 754 kayan noktalı sayı

Byte ve Sbyte tag'lerine yazılırken register'ın yüksek baytı sıfır olarak yazılır. Register'ın yüksek baytını ayrı okuyan bir seçenek yoktur; gerekiyorsa register'ı Word olarak okuyup değeri ifade veya gelişmiş tag ile ayırın.

Veri Tipi listesindeki Otomatik seçeneği Modbus cihazlarında desteklenmez.

Veri Uzunluğu ve String ​

  • Veri Uzunluğu her zaman 1 olmalıdır. Modbus cihazlarında dizi (tek tag ile ardışık birden fazla değer) desteklenmez; her değer için ayrı bir tag tanımlayın.
  • String veri tipi Modbus cihazlarında desteklenmez ve listede seçilemez.

Uzunluğu 1'den büyük veya String tipinde tag'ler tag tablosunda ve sunucuda reddedilir.

Eski sürümden kalan tag'ler

Bu kurallara (adres, bit eki, String, Veri Uzunluğu) uymayan, eski sürümde kaydedilmiş tag'ler silinmez. Çalışma zamanında okunmaz, Bad kalitede kalır ve nedeni servis loguna bir kez yazılır; bu tag'lere yazma da reddedilir. Düzeltmek için tag'in adresini, veri tipini veya uzunluğunu kurala uygun hale getirip kaydedin; yalnız açıklamayı değiştirerek kaydetmek reddedilir.

Word sırası (32 ve 64 bit değerler) ​

Her register içindeki bayt sırası Modbus standardına göre sabittir (yüksek bayt önce); bu sırayı değiştiren bir ayar yoktur. Birden fazla register kaplayan değerlerde register'ların sırası cihazın Ayarlar sekmesindeki iki seçimle belirlenir.

Aşağıdaki tablolarda R0 tag adresindeki ilk register'ı, W0 değerin en düşük anlamlı word'ünü gösterir.

32 bit değerler (DWord, DInt, Real):

İlk Word Low 32 BitR0R1Yaygın adı
İşaretli (varsayılan)W0 (düşük)W1 (yüksek)Word swap / CDAB
İşaretli değilW1 (yüksek)W0 (düşük)Big-endian / ABCD

64 bit değerler (LInt, ULInt, LWord, LReal):

İlk Word Low 32 Bitİlk DWord Low 64 BitR0R1R2R3
İşaretliİşaretliW0W1W2W3
İşaretliİşaretli değilW2W3W0W1
İşaretli değilİşaretliW1W0W3W2
İşaretli değilİşaretli değilW3W2W1W0

Cihaz dokümanı "high word first" veya "big-endian" diyorsa İlk Word Low 32 Bit seçimini kaldırın; 64 bit değerlerde ayrıca İlk DWord Low 64 Bit seçimini de kaldırın.

İlk DWord Low 64 Bit seçimi

64 bit tag kullanıyorsanız İlk DWord Low 64 Bit kutucuğunu cihaz dokümanına göre bilinçli olarak işaretleyip veya işaretini kaldırıp kaydedin.

Bu ayarlar aynı cihazdaki tüm tag'lere uygulanır. Aynı cihazda farklı word sırası kullanan değerler varsa bunlardan biri için değeri iki Word tag olarak okuyup ifade ile birleştirin.

Okuma grupları ve Blok Büyüklüğü ​

2WinScada tag'leri okurken istek sayısını azaltmak için yakın adresleri tek istekte birleştirir:

  • Önce aynı Güncelleme Süresi[s] değerine sahip tag'ler bir araya getirilir; her grup kendi süresiyle okunur.
  • Her grupta aynı alan türündeki (coil, discrete input, input register, holding register) tag'ler adrese göre sıralanır.
  • Bir tag, önceki tag'in bitiminden en fazla 30 adres uzaktaysa ve toplam uzunluk cihazın Blok Büyüklüğü değerini aşmıyorsa aynı isteğe eklenir; aksi halde yeni bir istek başlatılır.

Blok Büyüklüğü register alanlarında register sayısını, coil ve discrete input alanlarında bit sayısını sınırlar (varsayılan 32). Modbus standardı tek istekte en fazla 125 register ve 2000 bit okumaya izin verir; birçok cihaz daha düşük bir sınır uygular. Cihaz "Illegal Data Address" veya "Illegal Data Value" hatası veriyorsa ya da arada tanımsız adresler bulunan bir bloğu reddediyorsa Blok Büyüklüğü değerini düşürün.

Bir okuma isteği hata verirse o istekteki tag'lerin kalitesi Bad olur; diğer istekler okunmaya devam eder.

Örnekler ​

AdresVeri TipiVeri UzunluğuSadece OkumaAnlamı
000001Bool1HayırCoil 1 (ör. motor start komutu)
100004Bool1EvetDiscrete input 4 (ör. kapı kontağı)
300001Word1EvetInput register 1, 16 bit işaretsiz
300011Real1EvetInput register 11–12, kayan noktalı ölçüm
400001Int1HayırHolding register 1, 16 bit işaretli set değeri
400101DInt1HayırHolding register 101–102, 32 bit sayaç
400201LReal1EvetHolding register 201–204, 64 bit enerji değeri
400050.3Bool1HayırHolding register 50'nin 3. biti

Ölçekleme, birim ve diğer ortak tag alanları için Tag Yönetimi sayfasına bakın. Tekrar kullanılabilir Modbus register listeleri Cihaz Profilleri ile tanımlanabilir.

Sorun giderme ​

BelirtiKontroller
Adres kaydedilmiyor, "adres paterni ile eşleşmiyor" uyarısıAdresin 0, 1, 3 veya 4 ile başladığını, numaranın 0–65535 arasında olduğunu ve bit ekinin bit adresleme kurallarına uyduğunu (yalnız Bool register tag'lerinde, 0–15) kontrol edin.
Yükseltmeden sonra tag BadTag 2.10 kurallarına uymuyor (String, Veri Uzunluğu > 1 veya geçersiz adres). Servis logundaki nedene göre tag'i düzeltip kaydedin.
Değer bir register kaymış görünüyorZero Based seçimini cihaz dokümanındaki numaralandırmaya göre ayarlayın.
32/64 bit değer anlamsız veya çok büyükİlk Word Low 32 Bit ve İlk DWord Low 64 Bit seçimlerini, Veri Tipi değerini ve Veri Uzunluğu değerinin 1 olduğunu kontrol edin.
Gruptaki tüm tag'ler Bad oluyorBloktaki adreslerden biri cihazda tanımlı olmayabilir. Blok Büyüklüğü değerini düşürün veya tanımsız adresleri farklı bir Güncelleme Süresi[s] ile ayrı okuyun.
Yazma çalışmıyorAdresin 0 veya 4 ile başladığını, Sadece Okuma seçimini, kullanıcı yetkisini ve cihazın yazmaya izin verdiğini kontrol edin.
String tipi seçilemiyorModbus String tag'leri 2.10'da desteklenmez; bkz. Veri Uzunluğu ve String.

2WinScada 2.10