Modbus RTU Frame Atölyesi

Salı öğleden sonra, şantiyede ikinci bir sürücüyü hatta almaya çalışıyordum. İlki HMI ile sorunsuz konuşuyordu; ikincisi sessiz. Kabloyu inceledim: sağlam. Terminal bloğu: sıkı. 120 Ω terminatörler: takılı. On beş dakikamı "sessizliğin" elektrik katmanında aradım — oysa hata byte katmanındaydı: iki slave'ın adresi aynıydı, cevaplar çarpışıyordu.

Bu atölyede siz master'sınız (HMI/PLC tarafı). Çerçeveyi byte byte kurarsınız: slave adresi, fonksiyon kodu, register, değer.CRC-16 (poly 0xA001, init 0xFFFF) canlı hesaplanır ve frame 3D'de RS-485 kablosunda akar. Slave modeli size normal cevap verir, istisna kodu döner (FC|0x80) ya da hiç cevap vermez — ve siz ayırt etmeyi öğrenirsiniz: istisna frame'dir (kısa, geçerli CRC'li), timeout ise sessizliktir.

RTU'nun anatomisi — kimsenin bilmediğini varsayarak

Modbus RTU'nun tuhaflığı bu: frame'leri ayıran hiçbir karakter yok. Ne başlangıç baytı var ne biterim; frame'leri ayıran şey sessizliğin kendisi: üst üste gelen iki gönderim arasında en az 3,5 karakter boşluk olmalı. 9600 baud'ta bir karakter 11 baud biti = 1,146 ms → üç buçuk karakter = 4,0 ms. Baud değişince bu sessizlik de değişir — ve "baud kopması" tam da bu yüzden 15 dakikalık sessizlik üretir. Kartların altındaki atölyede hepsini elle kurup yollayacaksınız.

FRAMEslave + FC + veri + CRC

ADU = [slave 1B][FC 1B][veri...][CRC 16, 2B]. CRC düşük baytı önce gider. Maksimum ADU 256 bayt. RTU'da frame'yi ayıran şey sessizliktir: 3,5 karakter boşluk(9600 → 4,0 ms; 19200 → 2,0 ms; 115200 → sabit 1,75 ms).

CRC-160xA001 · 0xFFFF

Polinom 0x8005, ters çevrilmiş 0xA001; başlangıç 0xFFFF. Kabloda tek bir bit dönse bile CRC değişir → uç frame'yi çöpe atar. Tuzak: bozuk CRC'ye slave sessiz kalır — istisna dönmez. Master için bu, zaman aşımından ayırt edilemez.

İSTİSNAFC|0x80 + kod

Mantıksal hatada slave gürültü yapar: [slave][FC|0x80][kod][CRC] — 5 baytlık, CRC'si geçerli cevap.02 yasa dışı adres, 03 yasa dışı değer, 05 ACK (meşgulüm, tekrar dene). Sessizlikten farkı budur: istisna bir frame'dir, timeout değildir.

RS-485diferansiyel · 32 düğüm

Diferansiyel çift: gürültüye karşı bağışıklık, tek kablo çifti. Segmentte en 32 düğüm, 9600 baud ve altında1200 m kablo. Her iki uca 120 Ω terminasyon — çekerseniz dalga yansıtır, hat "çalışır ama yalan söyler": arada bir kayıp byte.

Grafikte her gönderim bir çubuk: yeşil = normal cevap, turuncu = istisna, kırmızı = zaman aşımı (sessizlik), mor = master tarafında CRC hatası, gri = cevap yok (timeout). Çubukların yüksekliği cevabın vardırma süresi (git-gel + işlem).

Hat aktivitesi — son 40 sn

OKİstisnaTimeoutCRC hatası (cevap)

1, 2, 3 hatta · 5 hatta YOK (sessizlik dersi)

Arıza enjeksiyonu

Bu atölye gerçek bir Modbus RTU stack'inin frame katmanını öğretir: CRC-16/MODBUS (poly 0xA001, init 0xFFFF, XOR 0x0000) satır satır aynı algoritmayla çalışır — kontrol değeri "123456789" → 0x4B37. Slave modeli deterministiktir; istisna kodları modbus spesifikasyonundaki gibi FC|0x80 ile döner. 3D sahnede terminatörler, M12 konnektörler ve frame pulse'ları görünür — ama fizik (elektrik) burada sadeleştirilmiştir; byte katmanı birebir.

v1
M8 · Haberleşme

Kendin de yaz: OPLC Studio

Bu frame'i master programında sen yaz: adres, fonksiyon, CRC kontrolü, timeout ve retry mantığı Studio'da senin merdivenin olacak.

İlk dönem haberinin sahibi ol