Ağaç şerit testere ile metal kesmek

MAX485 modülü elime ulaştı. Aşağıdaki devreyi kurdum

1722037881831.png


DSC00568.JPG
 
Çıkışta kare dalga oluşması için 0x55 byte'ını sürekli olarak göndertiyorum kod içerisinde. Diferansiyel çıkışa bakında da doğru sinyal şeklini görüyorum.

1722038009875.png
 
V20 yi 230V şebekeye bağladım ve çalıştı. Sonra da gereken bağlantıları yaptım

DSC00570.JPG


1722083444334.jpeg
 
Şimdi dokümantasyona bakarak hangi verileri göndereceğimizi tespit edeceğiz. Öncelikle data linkin doğru çalıştığını teyit etmek için cihazın registerlerinden okuma yapacağım ve default olarak var olması gereken değerleri gördüğümden emin olacağım. Ondan sonra da, basılan tuşa göre bir dizi parametre yapılandırmasını gönderen program yazacak, o kadar.

1722083709467.png
 

Ekler

  • V20_op_instr_0823_en-US.pdf
    30.2 MB · Görüntüleme: 16
MODBUS komut yapısında son iki byte'ın CRC checksum olduğu belirtilmiş. Dokümanın ileriki sayfalarında de örnek bir CRC hesaplayıcı verilmiş.

C:
unsigned int crc_16 (unsigned char *buffer, unsigned int length)
{
    unsigned int i, j, temp_bit, temp_int, crc;
    crc = 0xFFFF;
    for ( i = 0; i < length; i++ )
    {
        temp_int = (unsigned char) *buffer++;
        crc ^= temp_int;
        for ( j = 0; j < 8; j++ )
        {
            temp_bit = crc & 0x0001;
            crc >>= 1;
            if ( temp_bit != 0 )
                crc ^= 0xA001;
        }
    }
}
 
paketi gönderdim V20 ye, hiç tık yok. Herhalde sadece paket göndermekle olmayacak bu iş.

C:
static unsigned int crc_16(unsigned char *buffer, unsigned int length)
{
    unsigned int i, j, temp_bit, temp_int, crc;
    crc = 0xFFFF;
    for (i = 0; i < length; i++)
    {
        temp_int = (unsigned char) *buffer++;
        crc ^= temp_int;
        for (j = 0; j < 8; j++)
        {
            temp_bit = crc & 0x0001;
            crc >>= 1;
            if (temp_bit != 0)
                crc ^= 0xA001;
        }
    }
    return crc;
}

static unsigned char cmd[10];
static unsigned long timer = 0;

void setup()
{
  Serial.begin(9600, SERIAL_8N1);
}

void loop()
{
  if ((millis() - timer) > 1000lu)
  {
    timer = millis();

    unsigned int count = 0;
    cmd[count++] = 0x01;   /* device address */
    cmd[count++] = 0x03;   /* function code (read holding registers) */
    cmd[count++] = 0x00;   /* register start (high) */
    cmd[count++] = 0x00;   /* register start (low) */
    cmd[count++] = 0x00;   /* register count (high) */
    cmd[count++] = 0x10;   /* register count (low) */

    unsigned int crc = crc_16(cmd, count);
    cmd[count++] = (crc >> 8) & 0xff;
    cmd[count++] = crc & 0xff;

    Serial.write(cmd, count);
  }
}

UART portundaki bilgi

1722099102038.png
 
Son düzenleme:
Bir de şimdi farkettim, ekranda A503 uyarısı veriyor, yani giriş voltajı çok düşük diyor. Tamam düşük, biliyoruz, ama motor çalıştırmayacağım. Eğer A503 ün anlamı "bu şekilde motor çalıştıramazsın" ise bu uyarıyı gözardı edebilirim, ama eğer bunun anlamı "RS485 devresi de çalışmaz" ise o zaman bu iş yatar. Bütün elektronik ekipman ve bilgisayarı atölyeye taşıyamam, programlama işini burada bitirmem lazım.
 
RS485 hattından sadece veri mi yollayacaksınız, veri okunmayacak galiba?
 
Sadece veri yollanacak. Ama doğru yollandığını kontrol etmek için parametreleri geri okumak istiyorum.
 
Siemens özelinde net bilgim yok ama, düşük voltaj alarmının haberleşmeyi etkileyecek bir durum olarak değerlendirmiyorum. Güç / inverter kısmı için yeterli voltaj yok ama kontrol kısmı bu alarmı üretebildiğine göre çalışıyor. Haberleşme komutlarına cevap vermesi beklenir.

Aklıma gelen kontrol noktaları:
- Baudrate ayarları (muhtemelen yapmışsınızdır ama tekrar kontrol etmekte fayda var. Zaman zaman sadece bir tarafın hızını değiştirip sonra bunlar niye haberleşmiyor diye saç baş yolmuşluğum olmuştur :) )
- Slave adres ler aynımı?
- İnverter modbus RTU modundamı? Verdiğiniz örnek kodlar bunu kullandığınızı gösteriyor.
- Hesaplanan CRC doğrumu? Bunu kontrol edebileceğiniz örnek bir paket yapısı varsa karşılaştırma yapılabilir.
- Crc byte leri (2 byte) haberleşme paket yapısına LSB ve MSB doğru sırada ekleniyormu?
- Fiziksel bağlantı doğru yapıldımı?

Yukarıdaki maddelerin tamamı bildiğinizi sandığım noktalar, ama tekrar kontrol etmekte fayda var.
 
Asıl kontrol noktasını unuttum. Buna geçmişte bende düştüm ve canım çok yanmıştı :)

Arduino gönderme modundan önde max485 entegresini transmit moda almak gerekiyor, gönderme bittikten sonrada tekrar receive moduna almak gerekiyor.
 
Sadece veri yollanacak. Ama doğru yollandığını kontrol etmek için parametreleri geri okumak istiyorum.
@taydin hocam, daha önce modbus kullandınızmı bilmiyorum. Sanki mesajlarınızdan daha önce tecrübe etmemiş olduğunüz izlemine kapılıyorum. Önerim ilk önce bilgisayar ile sürücü haberleştirin. Modbuspoll programı işinizi fazlasıyla görecektir.
 
Birde yukarıda paylaşılan modbus paket yapısını gösteren dokümanda bir tuhaflık var gibi.

CRC low ve high byte dizilimleri tutarsız. Aynı durum haberleşme paketinin diğer kısımları içinde geçerli olabilir.

Son bir nokta: max485 tx moduna alındıktan sonra ">=3.5 character" ile belirtilen zamanı beklemek gerekir. 9600 baud için 4ms veya daha uzun bir süre beklenmeli.


firefox_sFSOeIMbFz.png
 
Checksum için dokümandaki fonksiyonu kullanıyorum, ama farklı projelerden biliyorum CRC16 nın global bir standardı yok, herkes kafasına göre CRC16 hesaplıyor.

MODBUS parametre ayarlarına daha önce bakmıştım, fabrika ayarlarına göre kullanıyorum, yani 9600,8,N,1. Aygıt adresinin fabrika ayarı da 1. Protokol de MODBUS olarak seçili durumda.

@taydin hocam, daha önce modbus kullandınızmı bilmiyorum. Sanki mesajlarınızdan daha önce tecrübe etmemiş olduğunüz izlemine kapılıyorum. Önerim ilk önce bilgisayar ile sürücü haberleştirin. Modbuspoll programı işinizi fazlasıyla görecektir.

Daha önce hiç kullanmadım RS485. Çok uzun zaman önce buna benzeyen RS422 ile uğraşmıştım. PC den haberleştirmeye çalışmanın bana göre çok daha fazla bilinmeyeni var, en azından Arduinonun hardware'ini software'ini biliyoruz :)
 
Asıl kontrol noktasını unuttum. Buna geçmişte bende düştüm ve canım çok yanmıştı :)

Arduino gönderme modundan önde max485 entegresini transmit moda almak gerekiyor, gönderme bittikten sonrada tekrar receive moduna almak gerekiyor.

Hmm bu mantıklı. Bunu hiç gözönünde bulundurmadım bende :) Arduino transmit ederken her iki hattı da sürüyor, ama receive ederken sürmemesi gerekir. Muhtemelen problem burada. Değiştirip deniyorum şimdi.
 
RE ve DE yi arduino GPIO larına bağladım. Transmit için ikisi de 1, receive için ikisi de 0. Hala veri alamıyorum.

C:
#define PIN_DE 8
#define PIN_RE 9

static unsigned char cmd[10];
static unsigned long timer = 0;

static unsigned int crc_16 (unsigned char *buffer, unsigned int length)
{
  unsigned int i, j, temp_bit, temp_int, crc;
  crc = 0xFFFF;
  for ( i = 0; i < length; i++ )
  {
    temp_int = (unsigned char) *buffer++;
    crc ^= temp_int;
    for ( j = 0; j < 8; j++ )
    {
      temp_bit = crc & 0x0001;
      crc >>= 1;
      if ( temp_bit != 0 )
        crc ^= 0xA001;
    }
  }
  return crc;
}

static void tx_mode()
{
  digitalWrite(PIN_DE, 1);
  digitalWrite(PIN_RE, 1);
}

static void rx_mode()
{
  digitalWrite(PIN_DE, 0);
  digitalWrite(PIN_RE, 0);
}

void setup()
{
  Serial.begin(9600, SERIAL_8N1);
  pinMode(PIN_DE, OUTPUT);
  pinMode(PIN_RE, OUTPUT);
}

void loop()
{
  if ((millis() - timer) > 1000lu)
  {
    timer = millis();

    unsigned int reg_addr = 40301; // converter version

    unsigned int count = 0;
    cmd[count++] = 0x01;                    // device address
    cmd[count++] = 0x03;                    // function code (read holding registers)
    cmd[count++] = (reg_addr >> 8) & 0xff;  // register start (high)
    cmd[count++] = reg_addr & 0xff;         // register start (low)
    cmd[count++] = 0x00;                    // register count (high)
    cmd[count++] = 0x01;                    // register count (low)

    unsigned int crc = crc_16(cmd, count);
    cmd[count++] = (crc >> 8) & 0xff;
    cmd[count++] = crc & 0xff;

    tx_mode();
    delay(1);
    Serial.write(cmd, count);
    Serial.flush();
    delay(1);
    rx_mode();
  }
}

Doğrudan MAX485 çıkışına bakınca mantıklı veri gidiyor. Bir de CRC16 bytelarının yerini değiştireceğim bakalım.

1722111660255.png
 
Şimdi bir tane parametre buldum, r2025, reddedilen komut sayısını gösteriyor. Ben saniyede bir komut gönderiyorum, r2025 de saniyede bir artıyor :katil2: :kizgin1:

1722112359396.png
 
Gönderme öncesi beklemeyi 1ms yerine 4ms veya daha büyük denermisiniz.

Not: Yukarıda resimdede işaretleyerek göstermiştim. 3.5 karakteri 9600 baud da iletmek için gereken süreden fazla olmak zorunda.

C:
    tx_mode();
    delay(1); // buradaki gecikmeyi >4ms şeklinde denermisiniz.
    Serial.write(cmd, count);
    Serial.flush();
    delay(1);
    rx_mode();
 
Gönderme öncesi beklemeyi 1ms yerine 4ms veya daha büyük denermisiniz.

Not: Yukarıda resimdede işaretleyerek göstermiştim. 3.5 karakteri 9600 baud da iletmek için gereken süreden fazla olmak zorunda.

C:
    tx_mode();
    delay(1); // buradaki gecikmeyi >4ms şeklinde denermisiniz.
    Serial.write(cmd, count);
    Serial.flush();
    delay(1);
    rx_mode();

1 saniyede paket gönderiliyor. Oradaki 1 ms gecikmeyi sadece HiZ bölgeyi biraz ayırmak için koydum.
 

Çevrimiçi üyeler

Forum istatistikleri

Konular
6,517
Mesajlar
110,818
Üyeler
2,679
Son üye
eg3wie

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top