arduino modbus kütüphanesi etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Daha önce endüstriyel ürünlerin haberleşme metodlarından blogumuzda bahsetmiştik.RS485 endüstride sıkça kullanılan bir haberleşme alt yapısı.Alt yapısı diyorum lakin ne zaman RS485 duyulsa akıllara hemen modbus gelir ki bu yanlış bir düşüncedir.RS485 sadece bir alt yapıdır ve üst yapısında ise yazılımsal olarak protokoller oturur ve en sık kullanılan modbus haberleşme protokolü de bunlardan sadece bir tanesidir.
Bu yazımızda sizlere derin olarak modbus haberleşme metodundan bahsetmeyeceğim.Daha önceki yazılarımızı incelerseniz,bloğumuzda modbus ile ilgili detaylı bilgi edinebilirsiniz.
Yazımızın konusu arduino ile RS485 fiziksel alt yapı üzerinden modbus haberleşme olacak.
Peki ilk olarak hepimizin bildiği ya da şimdi öğreneceği üzere arduino kartlarımızda RX ve TX pinleri bulunmakta ancak RS485 alt yapısı bulunmamaktadır.Bu durumda ihtiyacımız olan rs485 alt yapısından gelecek olan verileri bize rx ve tx pinleri üzerinden aktarabilecek bir arabirim elemanı olacaktır.
Yaklaşık olarak 10Tl civarına edinebileceğiz aşağıdaki resimde görünen rs485 dönüştürücüyü edinebilirsiniz.
Peki bu kart nasıl işler.İlk olarak dikkatinizi çekmiştir üzerinde max485 çipi bulunmakta ve bu çip bize rs485 (A ve B) pinleri üzeriden gelen verileri Rx Tx TTL sinyallerine dönüştürmektedir.
RO: arduino tarafında Rx pinine
RE ve DE ortaklanıp arduinoda bizim belirleyeceğimiz ve haberleşmede enable edeceğimiz pine
DI: arduino tarafında Tx pinine bağlanacak
Yukarıdaki şemada genel olarak modbus haberleşecek cihazlar ve sistemler arasında nasıl bir network oluşturulacağı gösterilmiştir.Burada dikkat edilmesi gereken modbus ağına gelecek her cihaz arasında paralel bir bağlantı olmasıdır.Bu ne demek ? her bir cihazımızın rs485 tarafındaki A pinleri diğer cihazların A pinlerine atlamalı olarak gidecek ve bu durum yine B pini için de tekrarlanacaktır.
Modbus haberleşmede en önemli husus master-slave mantığıdır.Şunu unutmamak gerekir master slave den veri çekebilir ve slavdeki verilere müdahale edebilir.Ancak slave masterdaki verilere müdahale edemez.Yani burada müdür her zaman master dır :)
Diğer önemli husus genellikle bu soru gelir.Bir modbus ağında sadece 1 adet master olabilir slave sayısı ise teorik olarak 255 adet olabilir :) ve her slave farklı bir adrese sahip olmak durumundadır (0-254) arasında.
Birden fazla master kullanmak istediğiniz 2 master arasında farklı bir modbus networkü kurarak masterlardan birini 2. network ağında slave hale getirmeniz mümkün olabilir.Fazlaca mühendislik gerektirebilir endüstriyel bir cihazınız 2. bir seri haberleşme taşımıyor ise.
Gelelim modbus kütüphanelerine ve açıklamalarına:
Modbus master ve slave kütüphanelerine buradan erişebilirsiniz.
Modbus Master Cihaz:
#include <SimpleModbusMaster.h>
#define baud 9600 // haberleşme rate i
#define timeout 1000// paket zaman aşımı
#define polling 200// ne kadar hızlı veri çekilecek
#define retry_count 10 // hata vermeden önce deneme sayısı
//daha önce bahsettiğimiz enable pin RE ve DE ortak bağlantıya gidecek
#define TxEnablePin 2
#define LED 9
// master üzerinde kaç adet register tutulacak
#define TOTAL_NO_OF_REGISTERS 1
enum
{
PACKET1,
PACKET2,
TOTAL_NO_OF_PACKETS // değiştirmeyin ekleyeceğiniz registerları yukarı ekleyin
};
//registerlar için paketler oluşturuluyor
Packet packets[TOTAL_NO_OF_PACKETS];
//master registerları izin dizi tanımlandı
unsigned int regs[TOTAL_NO_OF_REGISTERS];
void setup()
{
// paketler oluşturuluyor
modbus_construct(&packets[PACKET1], 1, READ_HOLDING_REGISTERS, 0, 1, 0);
modbus_construct(&packets[PACKET2], 1, PRESET_MULTIPLE_REGISTERS, 1, 1, 0);
// cihaz master olarak ve haberleşme değerlerine bağımlı olarak oluşturuluyor
modbus_configure(&Serial, baud, SERIAL_8N2, timeout, polling, retry_count, TxEnablePin, packets, TOTAL_NO_OF_PACKETS, regs);
pinMode(LED, OUTPUT);
}
void loop()
{
modbus_update();
regs[0] = analogRead(0); // enum içinde 0. indexe tanımlı registera değer yazılıyor
// her modbus update ile bu değer slave lere gönderiliyor
}
Modbus Slave Cihaz :
#include <SimpleModbusSlave.h>
#define LED 9
enum
{
// slave üzerindeki regesterlarımızı tanımlıyoruz.
// ilk register 0 numaralı adrese sahip olur ve sonrasındaki her register için adres 1 artar.
ADC_VAL,
PWM_VAL,
HOLDING_REGS_SIZE // Yine buna dokunmuyoruz.Register sayımızı tutar ve otomatik artar
};
unsigned int holdingRegs[HOLDING_REGS_SIZE]; // register dizisi oluşturu
////////////////////////////////////////////////////////////
void setup()
{
/* parameters(HardwareSerial* SerialPort,
long baudrate,
unsigned char byteFormat,
unsigned char ID,
unsigned char transmit enable pin,
unsigned int holding registers size,
unsigned int* holding register array)
*/
/* modbus parametre açıklamaları:
SERIAL_8N2: 1 start bit, 8 data bit, 2 stop bits
SERIAL_8E1: 1 start bit, 8 data bit, 1 Even parity bit, 1 stop bit
SERIAL_8O1: 1 start bit, 8 data bit, 1 Odd parity bit, 1 stop bit
*/
//
modbus_configure(&Serial, 9600, SERIAL_8N2, 1, 2, HOLDING_REGS_SIZE, holdingRegs);
modbus_update_comms(9600, SERIAL_8N2, 1);
pinMode(LED, OUTPUT);
}
void loop()
{
modbus_update();
holdingRegs[ADC_VAL] = analogRead(A0); // master 0.1.0 paketinde bu değeri okuyor.
analogWrite(LED, holdingRegs[PWM_VAL]>>2); //master 1.1.0 dan gelen veri pwm olarak basılıyor
}