Modbus Adresleme
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.
400001 Holding register 1
300010 Input register 10
000005 Coil 5
100003 Discrete input 3
400020.7 Holding register 20, bit 7Adres alanı şu kurala uyar:
- İlk hane
0,1,3veya4olmalı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 hane | Modbus alanı | Erişim | Okuma fonksiyonu | Yazma fonksiyonu | Kullanılabilen veri tipleri |
|---|---|---|---|---|---|
0 | Coil (çıkış biti) | Okuma/Yazma | FC01 Read Coils | FC05 Write Single Coil | Yalnızca Bool |
1 | Discrete input (giriş biti) | Sadece okuma | FC02 Read Discrete Inputs | — | Yalnızca Bool |
3 | Input register | Sadece okuma | FC04 Read Input Registers | — | Bool (bit ekiyle) ve sayısal tipler |
4 | Holding register | Okuma/Yazma | FC03 Read Holding Registers | FC06 / 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 Based | Adres | Cihaza gönderilen protokol adresi |
|---|---|---|
| İşaretli (varsayılan) | 400001 | 0 |
| İşaretli (varsayılan) | 400100 | 99 |
| İşaretli değil | 400000 | 0 |
| İşaretli değil | 400100 | 100 |
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ğin400020.0, 20 numaralı holding register'ın en düşük bitidir. - Bool olmayan tipler:
3ve4adreslerinde 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 Tipi | Kapladığı register | Açıklama |
|---|---|---|
| Bool | Coil/discrete input'ta 1 bit; register'da 1 bit | Register içinde bit eki gerekir |
| Byte | 1 | Register'ın düşük baytı (bit 0–7), işaretsiz |
| Sbyte | 1 | Register'ın düşük baytı (bit 0–7), işaretli |
| Word | 1 | 16 bit işaretsiz tamsayı |
| Int | 1 | 16 bit işaretli tamsayı |
| DWord | 2 | 32 bit işaretsiz tamsayı |
| DInt | 2 | 32 bit işaretli tamsayı |
| Real | 2 | 32 bit IEEE 754 kayan noktalı sayı |
| LWord | 4 | 64 bit işaretsiz tamsayı |
| ULInt | 4 | 64 bit işaretsiz tamsayı |
| LInt | 4 | 64 bit işaretli tamsayı |
| LReal | 4 | 64 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 Bit | R0 | R1 | Yaygın adı |
|---|---|---|---|
| İşaretli (varsayılan) | W0 (düşük) | W1 (yüksek) | Word swap / CDAB |
| İşaretli değil | W1 (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 Bit | R0 | R1 | R2 | R3 |
|---|---|---|---|---|---|
| İşaretli | İşaretli | W0 | W1 | W2 | W3 |
| İşaretli | İşaretli değil | W2 | W3 | W0 | W1 |
| İşaretli değil | İşaretli | W1 | W0 | W3 | W2 |
| İşaretli değil | İşaretli değil | W3 | W2 | W1 | W0 |
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
| Adres | Veri Tipi | Veri Uzunluğu | Sadece Okuma | Anlamı |
|---|---|---|---|---|
000001 | Bool | 1 | Hayır | Coil 1 (ör. motor start komutu) |
100004 | Bool | 1 | Evet | Discrete input 4 (ör. kapı kontağı) |
300001 | Word | 1 | Evet | Input register 1, 16 bit işaretsiz |
300011 | Real | 1 | Evet | Input register 11–12, kayan noktalı ölçüm |
400001 | Int | 1 | Hayır | Holding register 1, 16 bit işaretli set değeri |
400101 | DInt | 1 | Hayır | Holding register 101–102, 32 bit sayaç |
400201 | LReal | 1 | Evet | Holding register 201–204, 64 bit enerji değeri |
400050.3 | Bool | 1 | Hayır | Holding 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
| Belirti | Kontroller |
|---|---|
| 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 Bad | Tag 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üyor | Zero 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 oluyor | Bloktaki 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ıyor | Adresin 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çilemiyor | Modbus String tag'leri 2.10'da desteklenmez; bkz. Veri Uzunluğu ve String. |