Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Ramka MODBUS RTU w BC++

drednot 01 Paź 2008 12:20 4372 1
  • #1 01 Paź 2008 12:20
    drednot
    Poziom 15  

    Witam!

    Mam pewnien problem. Mianowicie muszę wysłać ramkę MODBUS RTU do sterownika w postaci mniej wiecej takiej: [01][01][00][00][00][64][3D][E1] (pierwsze dwa pola to kolejno adres sleva i funkcja, drugie dwa to adres pamieci w sterowniku, kolejne dwa do ilośc adresów pamieći o które pytamy, no i ostatenie dwa to suma kontrolna-bez nawiasów oczywiście;).
    Niestety programista ze mnie żaden, i mam nadzieje że mój problem okaże sie trywialny.

    1. Moj algorytm wogole nie chce konwertować ustawionej przeze mnie ramki z int do hex. Mogłby ktos wskazać mi błąd ?

    Code:

    //Ustalanie ramki MODBUS RTU

    unsigned char i,j;
    char buff[10];

    // tu ustawiamy tryb w jakim ma odbywac sie konwersja
    int mode;
    mode = 1; // dostepne tryby: 1, 2 oraz 3

    buf[0]=StrToInt(Edit3->Text);
    buf[1]=StrToInt(ComboBox3->Text);;
    buf[2]=StrToInt(Edit4->Text);;
    buf[3]=StrToInt(Edit5->Text);

    crc=CRC16 (&buf[0],4);
    buf[4]=crc>>8;
    buf[5]=crc;

    i=crc&0x00ff;
    crc>>=8;
    crc=(i<<8)|crc;
    IntToHex(crc,&hex[0]);


    for (i=0;i<4;i++) {

                    if (mode == 1) {
                            // uzywamy IntToHex
                            IntToHex(buf[i], 2);
                            temp += buf[i];

                    } else if (mode == 2) {
                            // uzywamy itoa (ANSI C style)
                            itoa(buf[i], buff, 16);
                            temp += buff;

                    } else if (mode == 3) {
                            // uzywamy sprintf (chyba najlepsza metoda)
                            sprintf(buff, "0x%x", buf[i]);
                            temp += buff;
                    }
            }

            IntToHex(buf[5]<<8|buf[4],&hex[0]);




            temp+=hex;

    Jak widać dane z kolejnych pozycji tablicy bufora, są zczytywane i w pętli osobno zamieniane na Hexa, po czym ładowane do zmiennej temp.

    2. Tu mam pytanie dodatkowe;) Czy tak moge wysyłać ramke w postaci Hexa na RS232 ?? (tylko prosze sie nie śmiać-inaczej nie umiałem tego zrobic)
    Code:

    //Zapisywanie danych do pamieci i wysylanie

            Memo1->Lines->Clear();
            Memo1->Lines->Add(temp);

            int rozmiar = Memo1->GetTextLen();

            if (rozmiar) {
              char *Bufor = new char[++rozmiar];
              Memo1->GetTextBuf(Bufor, rozmiar);
              memset(Buffer_O, 0, cbOut);

                    for (int i = 0; i < rozmiar; i++) {
                            *(Buffer_O) = *(Bufor + i);
                            WriteComm(hCommDev, 1);
                            FlushFileBuffers(hCommDev);
                    }

                    delete [] Bufor;
             }


    Za wszelkie podpowiedzi i pomoc bede bardzo wdzięczny!
    Pozdrawiam!

    PS Dołącze cały moj program, jakby ktoś chciał zerknąć. Pisałem go w Borland C++ Builder 6.0

    0 1
  • #2 12 Paź 2008 18:51
    drednot
    Poziom 15  

    OK sprawa sie wyjaśniła. Trzeba bardzo uważać na typy danych przekazywanych między funkcjami do portu RS. No i do samego wysyłania danych uzyłem TransmitCommChar. pozdrawiam!

    0