Ağaç şerit testere ile metal kesmek

Şimdi baktım spesifik olarak hangi hata sayacı artıyor diye, ve artan sayaç r2026

1722115659669.png


Ama bunun ne olduğu ile ilgili hiçbir bilgi yok dokümanda.

Şu anda son durumda, dokümana uygun şekilde CRC low ve high şeklinde yerleştiriyorum.

Parity ile ilgili de denemeler yaptım, orada tuhaflıklar var. Fabrika ayarlarında V20 "even parity" istiyor. Ama Arduino "even parity" ile gönderince parity hatası sayaçları artıyor. V20 yi "odd parity" olarak yapılandırdım. Arduino da "odd parity" olarak gönderiyor, gene parity sayaçları artıyor. Ama V20 yi "no parity" yaparsam, Arduino da "no parity" ile gönderirse artık hata sayaçları artmıyor. Tuhaf.
 
RS485 terminasyon dirençleri de takılı değil. Kablo uzunluğu 20 cm, baud rate de 9600, terminasyonun bir probleme sebep olmaması lazım diye düşünüyorum. Zaten skop görüntülerine bakınca da sinyalin gayet keskin ve tertemiz olduğu görünüyor.
 
Arduino notasyonuna çok alışık değilim onun için delay(1) kullanımını 1ms şeklinde yorumladım. Max485 i tx moduna aldıktan sonra veriyi göndermeden önce en az 4ms kadar beklemek gerekiyor. 1sn bu şartı fazlasıyla karşılıyor.

CRC konusunda, seed değeri ve kullanılan polinoma göre çıkan sonuç değişir. Modbus crc hesaplamada
Seed = 0xFFFF ve polinom olarak 0xA001 kullanılır.

Nadiren hesaplanan crcin tersi alınarakda kullanılabiliyor.
 
485 modülde 120 ohm direnç olması gerekir. Bu kadar kısa mesafede bir tarafda olması yeterli olur.
 
Arduino notasyonuna çok alışık değilim onun için delay(1) kullanımını 1ms şeklinde yorumladım. Max485 i tx moduna aldıktan sonra veriyi göndermeden önce en az 4ms kadar beklemek gerekiyor. 1sn bu şartı fazlasıyla karşılıyor.

delay milisaniye alıyor. Ama ana döngü 1 saniye aralıklarla mesaj gönderiyor.
 
delay milisaniye alıyor. Ama ana döngü 1 saniye aralıklarla mesaj gönderiyor.


Max485 TX moduna al
5ms bekle
seri gönder
...
sonraki işlemler

Kodunuzda ilgili yeri aşağıdaki şekilde düzenleyip denermisiniz.
C:
    tx_mode();
    delay(5); // buradaki gecikmeyi >4ms şeklinde denermisiniz.
    Serial.write(cmd, count);
    Serial.flush();
    delay(1);
    rx_mode();
 
Kodunuzda ilgili yeri aşağıdaki şekilde düzenleyip denermisiniz.

Denedim, birşey değişmedi. Zaten neden değişsin? 1 saniye aralıklarla paketi göndereceğine, 1.005 saniye aralıklarla göndermiş oldu ...
 
Şimdi MAX485 çıkışları arasında 120 Ω direnç bağladım, gene zerre kadar bir fark yok. r2026 saniyede bir artıyor ...
 
Dokümanda terminasyonu şöyle göstermiş

1722116957980.png


En uzaktaki aygıta bakınca, orada ilave dirençlerle biaslama yapmış, N- yi şaseye, P+ yı da 10V a pull etmiş. Yani normalde 10V ve şase mi görmek istiyor bu alet?
 
Benim kanaatim donanımsal bağlantıdan ziyade yazılım tarafında sorun var.

Denedim, birşey değişmedi. Zaten neden değişsin? 1 saniye aralıklarla paketi göndereceğine, 1.005 saniye aralıklarla göndermiş oldu ...

Paketleri hangi peryotta gönderdiğiniz durumu kast etmiyorum.

Yukarıda paylaştığınız modbus protokul resmi üzerinde işaretlediğim >=3.5.. şeklindeki ifadenin anlamı master veri gönderme durumuna geçtikten sonra, hemen datayı seri porta basma, en az bu kadar bekle sonra veriyi gönder demek. Buda 9600 bauda 3.5 karakter (35 bit veri ) gönderme süresinden küçük olamaz demek. Hesaplanınca ~4ms kadar bir değer çıkıyor.

Not: 35 bit = 3.5x (1 start + 8 data + 0 parity + 1 stop)
 
1.5 k ve 470 i de bağladım V20 nin terminallerine. Hiç fark yok. Ve hat da tam HiZ olmuyor, çünkü ben MAX485 i receive moduna soktuğum anda P+ da 2.8 V, P- de de 2.2 V var.
 
Stm32 ve modbus kullandığım projede gönderme rutini ile ilgili kısmı paylaşayım. Bu projede gelen verileri kesme ile alıyordum.

Haberleştiğim cihaz enerji analizör cihazıydı. CRC hesaplama ve veri yapısı verdiğiniz siemens e benziyor.

Gönderme ve crc ile ilgili kısımları aşağıdaki şekilde. Belki bir yararı olur.


C:
uint16_t ModRTU_CRC(uint8_t *buf, uint8_t start, uint8_t len) {

    uint16_t crc = 0xFFFF;
    uint8_t pos;

    for (pos = start; pos < len; pos++) {
        crc ^= (uint16_t)buf[pos];

        for (int i = 8; i != 0; i--) {
            if ((crc & 0x0001) != 0) {
                crc >>= 1;
                crc ^= 0xA001;
            }
            else
                crc >>= 1;
        }
    }
    return crc;
}


void modbus_tx(uint16_t adres, uint16_t ncnt)
{
    uint8_t *p8;
    uint16_t crcm16;
    uint8_t mtx_paket[8] ; //  adr cmd adrH adrL cntH cntL crcH crcL
    
    mtx_paket[0] = SLAVE_ADRES;
    mtx_paket[1] = 0x03;
    mtx_paket[2] = (uint8_t)(adres >> 8);
    mtx_paket[3] = (uint8_t)(adres & 0x00FF);

    mtx_paket[4] = (uint8_t)(ncnt >> 8);
    mtx_paket[5] = (uint8_t)(ncnt & 0x00FF);

    crcm16 = ModRTU_CRC((uint8_t*)mtx_paket,0,6);

    p8 = (uint8_t*)&crcm16;
    mtx_paket[6] = *p8;
    p8++;
    mtx_paket[7] = *p8;


    MAX485_TX_MODE();
    osDelay(5); //  wait dead time
    rx_buffer_temizle();
    HAL_UART_Transmit(&huart6,mtx_paket,sizeof(mtx_paket),500);
    MAX485_RX_MODE();

}
 
Yukarıda paylaştığınız modbus protokul resmi üzerinde işaretlediğim >=3.5.. şeklindeki ifadenin anlamı master veri gönderme durumuna geçtikten sonra, hemen datayı seri porta basma, en az bu kadar bekle sonra veriyi gönder demek. Buda 9600 bauda 3.5 karakter (35 bit veri ) gönderme süresinden küçük olamaz demek. Hesaplanınca ~4ms kadar bir değer çıkıyor.

Ama o zaman V20, MAX485 in tx mode girdiği anı algılıyor ve o andan itibaren en az 3.5 karakter gecikme mi gerektiriyor? MAX485 tx moda geçtiği anda P+ 5V a yakın bir değere geliyor, P- de 0V a yakın bir değere geliyor. rx modda iken ise P+ 2.8V da, P- de 2.2 V da.

Bence V20, MAX485 in tx moda geçtiğini algılamıyor. V20, start bitine bakıyor. Start biti gördükten sonra da paketi okuyor, paketi işlemek için de kendisine 3.5 karakterlik bir süre ayırıyor.
 
Evet haklısınız, 3.5 karakter bekleme peş peşe paket göndermelerde her paket arasında en az bu kadar bir zaman boşluğunu ifade diyor.
 
Senin CRC fonksiyonu deneyeyim bakalım. Belki de CRC yi beğenmiyor ama alakasız hata veriyor.
 
Veri yollandıktan sonra hemen alıcı durumuna almalısınız ve hattı dinlemelisiniz.
Hatta sadece bir adet 120R olmalı.
(P+) - (P-) > 200mV şartı sağlanmalı.
 
Bir fark yaratmadı. Döndürülen CRC değeri de aynı her iki fonksiyonun. Kodun geri kalanı da efektif olarak aynı görünüyor bana ...
 
Veri yollandıktan sonra hemen alıcı durumuna almalısınız ve hattı dinlemelisiniz.
Hatta sadece bir adet 120R olmalı.
(P+) - (P-) > 200mV şartı sağlanmalı.

transmit sonrasındaki 1 ms delayi kaldırdım. Birşey değişmedi. rx moddaki voltaj farkı da 600 mV gibi.
 
PC üzerindeki modbus programları veya micropython kullanabilen bir modül ile çok daha hızlı ilerlersiniz.
Ben bir röle grubuna komut yollamıştım. Dönüş değeri önemsizdi, çalıştığım kişi istemedi. Aynı sistem ile kendi röle grubumu yapmıştım.

 
Çok basit bir şeyi gözden kaçırıyorum herhalde, o yüzden bunu sonuçlandırmak istiyorum, öğrenilecek birşey var burada :)

PC ile yapmak için hazır USB/RS485 dönüştürücü alayım dedim aslında, ama o dönüştürücünün veya kullanacağım yazılımın da yaratacağı sürprizler olabilir. Benim windows çok eski, hiç güncelleme almamış 8.1 var, o da kendine göre sorunlara sebep olabilir diye hiç o işe girmedim.

En azından arduinoda herşeyi osiloskop ile görebiliyoruz, devre şeması var, kaynak kodu var.
 

Çevrimiçi üyeler

Forum istatistikleri

Konular
6,951
Mesajlar
118,748
Üyeler
2,824
Son üye
selocan32

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