modbus sorusu

Başlatan cseb, 03 Mart 2012, 14:15:16

cseb

arkadaşlar modbus ile ilgili bir çalışma yapmam gerekiyor. ancak algoritmasında anlayamadığım bir yer var. mesela aşağıdaki tabloya baktığımızda hex değerleri neye göre hesaplanarak yazılmış anlamadım.


camby

CD 6B 05 değerlerini sorduğunu varsayarak cevaplıyorum.

Ortada bir hesaplama yok , "1" nolu komut bit okuma komutu. Slave cihazında okunması istenen 20-38 arası bitlere tahmini değeler verilmiş ve bu değerler cevapta gönderilmiş.

Klein

Fonksiyon kodu hesaplanan bir değer değil.
Diğerleri ise:
start adres veriyi okumaya başlayacağımız adres. Burada kafa karıştıran şey  sanırım başlangıç adresinin 20 olması ama hex kodun 19 göstermesi.  Modbus sisteminde 2 tip adresleme kullanılır. 0 tabanlı ve 1 tabanlı.  1 tabanlı sistemde adresler 1 den başlar. örn 40001, 10001 gibi.  Ama gerçekte adresler 0'dan başlar  yani 40001 adresi aslında ilgili dizinin 0. elemanıdır. Bu yüzden  20-38 arasını istediğimizde başlangıç adresi olarak 19 yani  13Hex veririz.

quantity of outputs için verdiğimiz değer kaç adet veri istediğimizdir.  buradaki değerin de 13Hex olması tamamen tesadüf. 20-38 arasını 20 dahil olmak üzere istiyoruz. buda 19 adet veri sitiyoruz demek. 13 de 19 sayısının hex karşılığı.

gelelim cevap dizisine.
Bu sorgu  çıkış bitlerini okumak istediğimizi bildiren bir sorgu. Yani her bir adres bir bit. biz 19 bit istedik. Haberleşmenin yapısı gereği en az 8 bit gönderebildiğimiz için  19 yerine 24 bit gelmek zorunda. bunun için de byte count 3. Yani 3 byte.


cseb

Şİmdi anladım sağolasın. Peki mesela PLC den bilgi almak yada yazmak istediğimiz zaman da bu fonksiyon kodları her PLC için geçerli mi oluyor? Yani modbus protokolunde her fonksiyon için bir kod belirlenmiş ve bu kodlara göre işlem yaptırılıyor öylemi?

camby

Alıntı yapılan: Klein - 03 Mart 2012, 14:58:00
Modbus sisteminde 2 tip adresleme kullanılır. 0 tabanlı ve 1 tabanlı.  1 tabanlı sistemde adresler 1 den başlar. örn 40001, 10001 gibi.  Ama gerçekte adresler 0'dan başlar  yani 40001 adresi aslında ilgili dizinin 0. elemanıdır.

Hocam bu dediğinize baktım ama referanslarda göremedim şimdi. 0. eleman 40001 olması gerekir yazılmış hep.

Bir modbus uyumlu cihazda dediğinize göre 0 tabanlı olacak şekilde tanımlama yapabilir miyiz ?

Örnek : 40000 , 10000 gibi..

Klein

#5
yok tam olarak öyle değil.
PLC'ler 1 tabanlı sistem kullanılır. Aslında gerçek adres hep 0 dan başlar. ama gösterilirken 40001 , 10001 gibi gösterilir. 
0 tabanlı sistemde ise 40001 , 10001 gibi bir kavram yok.  holding reg 0,  coil 0 gibi.
Gerçekte 1 tabanlı da olsa , 0 tabanlı da her durumda istek 0 taban alınarak gönderilir.

Alıntı YapŞİmdi anladım sağolasın. Peki mesela PLC den bilgi almak yada yazmak istediğimiz zaman da bu fonksiyon kodları her PLC için geçerli mi oluyor? Yani modbus protokolunde her fonksiyon için bir kod belirlenmiş ve bu kodlara göre işlem yaptırılıyor öylemi?
Evet aynen öyle.

camby

hocam modbus uyumlu cıhaz tasarlıyorum , hangı sıstemı kullanmam daha dogru olur ?

Klein

Farketmez ki.  1 tabanlı da olsa , 0 tabanlı da  sonuçta   sorgu hep 0 tabanlı olarak gelecek.  PLC senden 40001'i isterken
fonksiyon 03  start 00 olarak gelecek. Bu ayrım dokümantasyonda önem kazanır.
Örneğin cihazın kullanma kılavuzunu hazırlıyorsun. Adresi 0 tabanlı verirsen Modbus haberleşmenin temelini bilenler anlar. Ama Sadece PLC ile uğraşanlar anlamayabilir. Bu nedenle dokümanları hazırlarken veya menüden bu adresleri kullanıcıya seçtirirken , adresleri 1 den başlatmak , kullanıcıların anlamasını kolaylaştırır.