//---------------------------------------------------------------------------


#include <vcl.h>
#include <stdio.h>
#pragma hdrstop

#include "MAIN.h"
#include "NASTAVPORTForm.h"
#include "NASTAVENI.h"
#include "CRC16.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;


/*---------------------------------funkce main---------------------------------*/
__fastcall TMainForm::TMainForm(TComponent* Owner)
        : TForm(Owner)
{
char port[5],parita[5],stopbit[1];                                              // pomocné pole znaků

        Adresar=GetCurrentDir()+"\\INDIKATOR.INI";                                              // cesta k souboru INDIKATOR.INI
        TIniFile *ini=new TIniFile(Adresar);                                                    // načtení souboru INDIKATOR.INI
        CisloPortu=ini->ReadInteger("PORT","Port",1);                                           // načtení čísla portu
        BaudRate=ini->ReadInteger("NASTAVENI","Bitů za sekundu",1);                             // načtení komunikační rychlosti
        Parita=ini->ReadInteger("NASTAVENI","Parita",1);                                        // načtení parity
        ByteSize=ini->ReadInteger("NASTAVENI","Datových bitů",1);                               // načtení počtu datových bitů
        ReadIntervalTimeout = ini->ReadInteger("CASOVANI","ReadIntervalTimeout",1);             // načtení časování
        ReadTotalTimeoutMultiplier=ini->ReadInteger("CASOVANI","ReadTotalTimeoutMultiplier",1); // načtení časování
        ReadTotalTimeoutConstant=ini->ReadInteger("CASOVANI","ReadTotalTimeoutConstant",1);     // načtení časování
        WriteTotalTimeoutMultiplier=ini->ReadInteger("CASOVANI","WriteTotalTimeoutMultiplier",1); // načtení časování
        WriteTotalTimeoutConstant=ini->ReadInteger("CASOVANI","WriteTotalTimeoutConstant",1);     // načtení časování
        delete ini;
        Serial=NULL;

        try{
                Serial=new TSerial(CisloPortu);                                 // pokus o otevření portu
                Serial->BaudRate=(TBaudRate)BaudRate;                           // nastavení přenosové rychlosti
                Serial->Parity=(TParity)Parita;                                 // nastavení parity
                Serial->ByteSize=(TByteSize)ByteSize;                           // nastavení počtu přenášených bitů
                Serial->SetupComm(256,256);                                     // velikost vstupního a výstupního bufferu sériového portu (byte)
                Serial->ReadIntervalTimeout=ReadIntervalTimeout;                // maximální doba mezi příchodem dvou znaků (ms)
                Serial->ReadTotalTimeoutMultiplier=ReadTotalTimeoutMultiplier;  // násobitel použitý pro výpočet celkové time-out operace čtení (ms)
                Serial->ReadTotalTimeoutConstant=ReadTotalTimeoutConstant;      // konstanta použitý pro výpočet celkové time-out operace čtení (ms)
                Serial->WriteTotalTimeoutMultiplier=WriteTotalTimeoutMultiplier;// násobitel použitý pro výpočet celkové time-out operace zápisu (ms)
                Serial->WriteTotalTimeoutConstant=0;                            // konstanta použitý pro výpočet celkové time-out operace zápisu (ms)
        }
        catch(Exception &e){                                                    // port se nepodařilo otevřít
                if(!NastavPort)                                                 // otevření okna pro výběr sériového portu
                        Application->CreateForm(__classid(TNastavPort), &NastavPort);
                NastavPort->Caption=e.Message;
                NastavPort->CisloPortu=1;
                NastavPort->ShowModal();
                Application->Terminate();
        }

        Caption=Application->Title+AnsiString(" (COM")+CisloPortu+AnsiString(")"); // výpis čísla portu v záhlaví

        sprintf(port,"COM%i",Serial->Number);                                   // podle čísla com portu převod na řetezec znaků
        switch(Serial->Parity){                                                 // podle čísla parity převod na řetězec
                case 0: sprintf(parita,"žádná");break;                          // převod na řetězec "žádná"
                case 1: sprintf(parita,"lichá");break;                          // převod na řetězec "lichá"
                case 2: sprintf(parita,"sudá");break;                           // převod na řetězec "sudá"
        }

        switch(Serial->StopBits){                                               // podle čísla stopbitu převod na žetězec znaků
                case 0: sprintf(stopbit,"1");break;                             // převod na řetězec "1"
                case 2: sprintf(stopbit,"2");break;                             // převod na řetězec "2"

        }
        Label6->Caption = port;                                                 // výpis čísla portu na panelu Parametry komunikace
        Label8->Caption = Serial->BaudRate;                                     // výpis komunikační rychlosti na panelu Parametry komunikace
        Label14->Caption = Serial->ByteSize;                                    // výpis počtu přenášených bitů na panelu Parametry komunikace
        Label10->Caption = parita;                                              // výpis parity na panelu Parametry komunikace
}
/*----------------------------------destruktor---------------------------------*/
__fastcall TMainForm::~TMainForm()
{
        delete(Serial);                                                         // destruktor
}
/*--------------------------funkce tlačítka Nastavení--------------------------*/
void __fastcall TMainForm::NastaveniClick(TObject *Sender)
{
        NastavForm->Show();                                                     // otevření okna s nastavením komunikace
}
/*-----------------------------funkce tlačítka BACK----------------------------*/
void __fastcall TMainForm::Button1Click(TObject *Sender)
{
 int i;                                                                         // pomocná promenná pro cyklus for
 int CRC;                                                                       // pomocná proměnná pro kontrolní součet
 int RXpos = 0;                                                                 // pomocná proměnná pro pozici v přijímacím poli
 char *TXpos;                                                                   // ukazatel na char
        if(ComboBox1->ItemIndex == -1){                                         // test výběru modbus adresy
                 MessageBox(Handle,"Neplatná modbus adresa!","indikátor",MB_ICONINFORMATION); // při nezadaní modbus adresy výpis chyby
        }
        else{                                                                   // modbus adresa je zadaná
                TXpos = TX_DATA;                                                // složení modbus zprávy pro odeslání
                *TXpos++ = modbus_adresa;        	                        // 1. byte modbus adresa
                *TXpos++ = Button_Events;                                       // 2. byte zápis stavu tlačítek
                *TXpos++ = 0x01;                                                // 3. byte počet bytů stavu tlačítek
                *TXpos++ = 0x20;                                                // 4. byte stav tlačítka
                CRC = CRC16(TX_DATA,TXpos-TX_DATA);                             // výpočet CRC
                *TXpos++ = (CRC>>8);                                            // 5. byte CRC(horní byte z int)
                *TXpos++ = CRC;                                                 // 6. byte CRC(spodní byte z int)

                for(i=0;i<TXpos-TX_DATA;i++){		                        // cyklus zaslání bytů
                        Serial->WriteByte(TX_DATA[i]);                          // zaslání na port
                }

                for(i=0;i<6;i++){                                               // cyklus čtení bytů z portu
                        Serial->ReadByte(&RX_DATA[i]);                          // zápis do pole přijatých bytů
                        RXpos++;			                        // inkrementace pozice v poli přijatých bytů
                }

                if(RX_DATA[0]!=modbus_adresa){                                  // test prvního přijatého bytu
                        MessageBox(Handle,"Slave zařízení neodpovídá!","indikátor",MB_ICONINFORMATION); // jestliže se nerovná zadané modbus adrese výpis chyby
                }
                else{                                                           // první přijtý byte je adresa slave
                        if(RX_DATA[1]==0xE6)RXpos = 5;                          // test druhého přijtého bytu jetliže obsahuje chybovou funkci je počet přijatých bytu 5
                        CRC = (RX_DATA[RXpos-1] << 8 | RX_DATA[RXpos-2]);       // čtení CRC z přijaté zprávy a převod dvou bytu na jeden int
                        if (CRC == (CRC16(RX_DATA,RXpos-2))){                   // výpočet a porovnání CRC
                                if((RX_DATA[1]==0xE6)&&(RX_DATA[2]==0x01))MessageBox(Handle,"Kód chyby 0x01 - Neplatný kód funkce!","Chybová funkce funkce 0xE6",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                if((RX_DATA[1]==0xE6)&&(RX_DATA[2]==0x02))MessageBox(Handle,"Kód chyby 0x02 - Počet bytů mimo rozsah!","Chybová funkce funkce 0xE6",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                if((RX_DATA[1]==0xE6)&&(RX_DATA[2]==0x03))MessageBox(Handle,"Kód chyby 0x03 - Chybný počet přijatých bytů v slave stanici!","Chybová funkce funkce 0xE6",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                        }
                        else{                                                   // přijaté CRC a vypočtené se nerovná
                                MessageBox(Handle,"Chyba kontrolního součtu CRC!","indikátor",MB_ICONINFORMATION); // výpis chyby
                        }
                }
                Label76->Caption = TX_DATA[0];                                  // výpis 1. vyslaného bytu
                Label77->Caption = TX_DATA[1];                                  // výpis 2. vyslaného bytu
                Label78->Caption = TX_DATA[2];                                  // výpis 3. vyslaného bytu
                Label79->Caption = TX_DATA[3];                                  // výpis 4. vyslaného bytu
                Label80->Caption = TX_DATA[4];                                  // výpis 5. vyslaného bytu
                Label81->Caption = TX_DATA[5];                                  // výpis 6. vyslaného bytu
                Label82->Caption = TX_DATA[6];                                  // výpis 7. vyslaného bytu
                Label83->Caption = TX_DATA[7];                                  // výpis 8. vyslaného bytu
                Label84->Caption = TX_DATA[8];                                  // výpis 9. vyslaného bytu
                Label85->Caption = TX_DATA[9];                                  // výpis 10. vyslaného bytu
                Label86->Caption = TX_DATA[10];                                 // výpis 11. vyslaného bytu

                Label65->Caption = RX_DATA[0];                                  // výpis 1. přijatého bytu
                Label66->Caption = RX_DATA[1];                                  // výpis 2. přijatého bytu
                Label67->Caption = RX_DATA[2];                                  // výpis 3. přijatého bytu
                Label68->Caption = RX_DATA[3];                                  // výpis 4. přijatého bytu
                Label69->Caption = RX_DATA[4];                                  // výpis 5. přijatého bytu
                Label70->Caption = RX_DATA[5];                                  // výpis 6. přijatého bytu
                Label71->Caption = RX_DATA[6];                                  // výpis 7. přijatého bytu
                Label72->Caption = RX_DATA[7];                                  // výpis 8. přijatého bytu
                Label73->Caption = RX_DATA[8];                                  // výpis 9. přijatého bytu
                Label74->Caption = RX_DATA[9];                                  // výpis 10. přijatého bytu
                Label75->Caption = RX_DATA[10];                                 // výpis 11. přijatého bytu

                for(i=0;i<6;i++){                                               // cyklus vynulování vysílacího a přijímacího pole
                        RX_DATA[i]=0;                                           // vynulování přijímacího pole
                        TX_DATA[i]=0;                                           // vynulování vysílacího pole
                }
        }
}
/*-----------------------------funkce tlačítka MENU----------------------------*/
void __fastcall TMainForm::Button2Click(TObject *Sender)
{
 int i;                                                                         // pomocná promenná pro cyklus for
 int CRC;                                                                       // pomocná proměnná pro kontrolní součet
 int RXpos = 0;                                                                 // pomocná proměnná pro pozici v přijímacím poli
 char *TXpos;                                                                   // ukazatel na char
        if(ComboBox1->ItemIndex == -1){                                         // test výběru modbus adresy
                 MessageBox(Handle,"Neplatná modbus adresa!","indikátor",MB_ICONINFORMATION); // při nezadaní modbus adresy výpis chyby
        }
        else{                                                                   // modbus adresa je zadaná
                TXpos = TX_DATA;                                                // složení modbus zprávy pro odeslání
                *TXpos++ = modbus_adresa;        	                        // 1. byte modbus adresa
                *TXpos++ = Button_Events;                                       // 2. byte zápis stavu tlačítek
                *TXpos++ = 0x01;                                                // 3. byte počet bytů stavu tlačítek
                *TXpos++ = 0x40;                                                // 4. byte stav tlačítka
                CRC = CRC16(TX_DATA,TXpos-TX_DATA);                             // výpočet CRC
                *TXpos++ = (CRC>>8);                                            // 5. byte CRC(horní byte z int)
                *TXpos++ = CRC;                                                 // 6. byte CRC(spodní byte z int)

                for(i=0;i<TXpos-TX_DATA;i++){		                        // cyklus zaslání bytů
                        Serial->WriteByte(TX_DATA[i]);                          // zaslání na port
                }

                for(i=0;i<6;i++){                                               // cyklus čtení bytů z portu
                        Serial->ReadByte(&RX_DATA[i]);                          // zápis do pole přijatých bytů
                        RXpos++;			                        // inkrementace pozice v poli přijatých bytů
                }

                if(RX_DATA[0]!=modbus_adresa){                                  // test prvního přijatého bytu
                        MessageBox(Handle,"Slave zařízení neodpovídá!","indikátor",MB_ICONINFORMATION); // jestliže se nerovná zadané modbus adrese výpis chyby
                }
                else{                                                           // první přijtý byte je adresa slave
                        if(RX_DATA[1]==0xE6)RXpos = 5;                          // test druhého přijtého bytu jetliže obsahuje chybovou funkci je počet přijatých bytu 5
                        CRC = (RX_DATA[RXpos-1] << 8 | RX_DATA[RXpos-2]);       // čtení CRC z přijaté zprávy a převod dvou bytu na jeden int
                        if (CRC == (CRC16(RX_DATA,RXpos-2))){                   // výpočet a porovnání CRC
                                if((RX_DATA[1]==0xE6)&&(RX_DATA[2]==0x01))MessageBox(Handle,"Kód chyby 0x01 - Neplatný kód funkce!","Chybová funkce funkce 0xE6",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                if((RX_DATA[1]==0xE6)&&(RX_DATA[2]==0x02))MessageBox(Handle,"Kód chyby 0x02 - Počet bytů mimo rozsah!","Chybová funkce funkce 0xE6",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                if((RX_DATA[1]==0xE6)&&(RX_DATA[2]==0x03))MessageBox(Handle,"Kód chyby 0x03 - Chybný počet přijatých bytů v slave stanici!","Chybová funkce funkce 0xE6",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                        }
                        else{                                                   // přijaté CRC a vypočtené se nerovná
                                MessageBox(Handle,"Chyba kontrolního součtu CRC!","indikátor",MB_ICONINFORMATION); // výpis chyby
                        }
                }
                Label76->Caption = TX_DATA[0];                                  // výpis 1. vyslaného bytu
                Label77->Caption = TX_DATA[1];                                  // výpis 2. vyslaného bytu
                Label78->Caption = TX_DATA[2];                                  // výpis 3. vyslaného bytu
                Label79->Caption = TX_DATA[3];                                  // výpis 4. vyslaného bytu
                Label80->Caption = TX_DATA[4];                                  // výpis 5. vyslaného bytu
                Label81->Caption = TX_DATA[5];                                  // výpis 6. vyslaného bytu
                Label82->Caption = TX_DATA[6];                                  // výpis 7. vyslaného bytu
                Label83->Caption = TX_DATA[7];                                  // výpis 8. vyslaného bytu
                Label84->Caption = TX_DATA[8];                                  // výpis 9. vyslaného bytu
                Label85->Caption = TX_DATA[9];                                  // výpis 10. vyslaného bytu
                Label86->Caption = TX_DATA[10];                                 // výpis 11. vyslaného bytu

                Label65->Caption = RX_DATA[0];                                  // výpis 1. přijatého bytu
                Label66->Caption = RX_DATA[1];                                  // výpis 2. přijatého bytu
                Label67->Caption = RX_DATA[2];                                  // výpis 3. přijatého bytu
                Label68->Caption = RX_DATA[3];                                  // výpis 4. přijatého bytu
                Label69->Caption = RX_DATA[4];                                  // výpis 5. přijatého bytu
                Label70->Caption = RX_DATA[5];                                  // výpis 6. přijatého bytu
                Label71->Caption = RX_DATA[6];                                  // výpis 7. přijatého bytu
                Label72->Caption = RX_DATA[7];                                  // výpis 8. přijatého bytu
                Label73->Caption = RX_DATA[8];                                  // výpis 9. přijatého bytu
                Label74->Caption = RX_DATA[9];                                  // výpis 10. přijatého bytu
                Label75->Caption = RX_DATA[10];                                 // výpis 11. přijatého bytu

                for(i=0;i<6;i++){                                               // cyklus vynulování vysílacího a přijímacího pole
                        RX_DATA[i]=0;                                           // vynulování přijímacího pole
                        TX_DATA[i]=0;                                           // vynulování vysílacího pole
                }
        }
 }
/*----------------------------funkce tlačítka SELECT---------------------------*/
void __fastcall TMainForm::Button3Click(TObject *Sender)
{
 int i;                                                                         // pomocná promenná pro cyklus for
 int CRC;                                                                       // pomocná proměnná pro kontrolní součet
 int RXpos = 0;                                                                 // pomocná proměnná pro pozici v přijímacím poli
 char *TXpos;                                                                   // ukazatel na char
        if(ComboBox1->ItemIndex == -1){                                         // test výběru modbus adresy
                 MessageBox(Handle,"Neplatná modbus adresa!","indikátor",MB_ICONINFORMATION); // při nezadaní modbus adresy výpis chyby
        }
        else{                                                                   // modbus adresa je zadaná
                TXpos = TX_DATA;                                                // složení modbus zprávy pro odeslání
                *TXpos++ = modbus_adresa;        	                        // 1. byte modbus adresa
                *TXpos++ = Button_Events;                                       // 2. byte zápis stavu tlačítek
                *TXpos++ = 0x01;                                                // 3. byte počet bytů stavu tlačítek
                *TXpos++ = 0x60;                                                // 4. byte stav tlačítka
                CRC = CRC16(TX_DATA,TXpos-TX_DATA);                             // výpočet CRC
                *TXpos++ = (CRC>>8);                                            // 5. byte CRC(horní byte z int)
                *TXpos++ = CRC;                                                 // 6. byte CRC(spodní byte z int)

                for(i=0;i<TXpos-TX_DATA;i++){		                        // cyklus zaslání bytů
                        Serial->WriteByte(TX_DATA[i]);                          // zaslání na port
                }

                for(i=0;i<6;i++){                                               // cyklus čtení bytů z portu
                        Serial->ReadByte(&RX_DATA[i]);                          // zápis do pole přijatých bytů
                        RXpos++;			                        // inkrementace pozice v poli přijatých bytů
                }

                if(RX_DATA[0]!=modbus_adresa){                                  // test prvního přijatého bytu
                        MessageBox(Handle,"Slave zařízení neodpovídá!","indikátor",MB_ICONINFORMATION); // jestliže se nerovná zadané modbus adrese výpis chyby
                }
                else{                                                           // první přijtý byte je adresa slave
                        if(RX_DATA[1]==0xE6)RXpos = 5;                          // test druhého přijtého bytu jetliže obsahuje chybovou funkci je počet přijatých bytu 5
                        CRC = (RX_DATA[RXpos-1] << 8 | RX_DATA[RXpos-2]);       // čtení CRC z přijaté zprávy a převod dvou bytu na jeden int
                        if (CRC == (CRC16(RX_DATA,RXpos-2))){                   // výpočet a porovnání CRC
                                if((RX_DATA[1]==0xE6)&&(RX_DATA[2]==0x01))MessageBox(Handle,"Kód chyby 0x01 - Neplatný kód funkce!","Chybová funkce funkce 0xE6",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                if((RX_DATA[1]==0xE6)&&(RX_DATA[2]==0x02))MessageBox(Handle,"Kód chyby 0x02 - Počet bytů mimo rozsah!","Chybová funkce funkce 0xE6",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                if((RX_DATA[1]==0xE6)&&(RX_DATA[2]==0x03))MessageBox(Handle,"Kód chyby 0x03 - Chybný počet přijatých bytů v slave stanici!","Chybová funkce funkce 0xE6",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                        }
                        else{                                                   // přijaté CRC a vypočtené se nerovná
                                MessageBox(Handle,"Chyba kontrolního součtu CRC!","indikátor",MB_ICONINFORMATION); // výpis chyby
                        }
                }
                Label76->Caption = TX_DATA[0];                                  // výpis 1. vyslaného bytu
                Label77->Caption = TX_DATA[1];                                  // výpis 2. vyslaného bytu
                Label78->Caption = TX_DATA[2];                                  // výpis 3. vyslaného bytu
                Label79->Caption = TX_DATA[3];                                  // výpis 4. vyslaného bytu
                Label80->Caption = TX_DATA[4];                                  // výpis 5. vyslaného bytu
                Label81->Caption = TX_DATA[5];                                  // výpis 6. vyslaného bytu
                Label82->Caption = TX_DATA[6];                                  // výpis 7. vyslaného bytu
                Label83->Caption = TX_DATA[7];                                  // výpis 8. vyslaného bytu
                Label84->Caption = TX_DATA[8];                                  // výpis 9. vyslaného bytu
                Label85->Caption = TX_DATA[9];                                  // výpis 10. vyslaného bytu
                Label86->Caption = TX_DATA[10];                                 // výpis 11. vyslaného bytu

                Label65->Caption = RX_DATA[0];                                  // výpis 1. přijatého bytu
                Label66->Caption = RX_DATA[1];                                  // výpis 2. přijatého bytu
                Label67->Caption = RX_DATA[2];                                  // výpis 3. přijatého bytu
                Label68->Caption = RX_DATA[3];                                  // výpis 4. přijatého bytu
                Label69->Caption = RX_DATA[4];                                  // výpis 5. přijatého bytu
                Label70->Caption = RX_DATA[5];                                  // výpis 6. přijatého bytu
                Label71->Caption = RX_DATA[6];                                  // výpis 7. přijatého bytu
                Label72->Caption = RX_DATA[7];                                  // výpis 8. přijatého bytu
                Label73->Caption = RX_DATA[8];                                  // výpis 9. přijatého bytu
                Label74->Caption = RX_DATA[9];                                  // výpis 10. přijatého bytu
                Label75->Caption = RX_DATA[10];                                 // výpis 11. přijatého bytu

                for(i=0;i<6;i++){                                               // cyklus vynulování vysílacího a přijímacího pole
                        RX_DATA[i]=0;                                           // vynulování přijímacího pole
                        TX_DATA[i]=0;                                           // vynulování vysílacího pole
                }
        }
}
/*-----------------------------funkce tlačítka DOWN----------------------------*/
void __fastcall TMainForm::Button4Click(TObject *Sender)
{
 int i;                                                                         // pomocná promenná pro cyklus for
 int CRC;                                                                       // pomocná proměnná pro kontrolní součet
 int RXpos = 0;                                                                 // pomocná proměnná pro pozici v přijímacím poli
 char *TXpos;                                                                   // ukazatel na char
        if(ComboBox1->ItemIndex == -1){                                         // test výběru modbus adresy
                 MessageBox(Handle,"Neplatná modbus adresa!","indikátor",MB_ICONINFORMATION); // při nezadaní modbus adresy výpis chyby
        }
        else{                                                                   // modbus adresa je zadaná
                TXpos = TX_DATA;                                                // složení modbus zprávy pro odeslání
                *TXpos++ = modbus_adresa;        	                        // 1. byte modbus adresa
                *TXpos++ = Button_Events;                                       // 2. byte zápis stavu tlačítek
                *TXpos++ = 0x01;                                                // 3. byte počet bytů stavu tlačítek
                *TXpos++ = 0x80;                                                // 4. byte stav tlačítka
                CRC = CRC16(TX_DATA,TXpos-TX_DATA);                             // výpočet CRC
                *TXpos++ = (CRC>>8);                                            // 5. byte CRC(horní byte z int)
                *TXpos++ = CRC;                                                 // 6. byte CRC(spodní byte z int)

                for(i=0;i<TXpos-TX_DATA;i++){		                        // cyklus zaslání bytů
                        Serial->WriteByte(TX_DATA[i]);                          // zaslání na port
                }

                for(i=0;i<6;i++){                                               // cyklus čtení bytů z portu
                        Serial->ReadByte(&RX_DATA[i]);                          // zápis do pole přijatých bytů
                        RXpos++;			                        // inkrementace pozice v poli přijatých bytů
                }

                if(RX_DATA[0]!=modbus_adresa){                                  // test prvního přijatého bytu
                        MessageBox(Handle,"Slave zařízení neodpovídá!","indikátor",MB_ICONINFORMATION); // jestliže se nerovná zadané modbus adrese výpis chyby
                }
                else{                                                           // první přijtý byte je adresa slave
                        if(RX_DATA[1]==0xE6)RXpos = 5;                          // test druhého přijtého bytu jetliže obsahuje chybovou funkci je počet přijatých bytu 5
                        CRC = (RX_DATA[RXpos-1] << 8 | RX_DATA[RXpos-2]);       // čtení CRC z přijaté zprávy a převod dvou bytu na jeden int
                        if (CRC == (CRC16(RX_DATA,RXpos-2))){                   // výpočet a porovnání CRC
                                if((RX_DATA[1]==0xE6)&&(RX_DATA[2]==0x01))MessageBox(Handle,"Kód chyby 0x01 - Neplatný kód funkce!","Chybová funkce funkce 0xE6",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                if((RX_DATA[1]==0xE6)&&(RX_DATA[2]==0x02))MessageBox(Handle,"Kód chyby 0x02 - Počet bytů mimo rozsah!","Chybová funkce funkce 0xE6",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                if((RX_DATA[1]==0xE6)&&(RX_DATA[2]==0x03))MessageBox(Handle,"Kód chyby 0x03 - Chybný počet přijatých bytů v slave stanici!","Chybová funkce funkce 0xE6",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                        }
                        else{                                                   // přijaté CRC a vypočtené se nerovná
                                MessageBox(Handle,"Chyba kontrolního součtu CRC!","indikátor",MB_ICONINFORMATION); // výpis chyby
                        }
                }
                Label76->Caption = TX_DATA[0];                                  // výpis 1. vyslaného bytu
                Label77->Caption = TX_DATA[1];                                  // výpis 2. vyslaného bytu
                Label78->Caption = TX_DATA[2];                                  // výpis 3. vyslaného bytu
                Label79->Caption = TX_DATA[3];                                  // výpis 4. vyslaného bytu
                Label80->Caption = TX_DATA[4];                                  // výpis 5. vyslaného bytu
                Label81->Caption = TX_DATA[5];                                  // výpis 6. vyslaného bytu
                Label82->Caption = TX_DATA[6];                                  // výpis 7. vyslaného bytu
                Label83->Caption = TX_DATA[7];                                  // výpis 8. vyslaného bytu
                Label84->Caption = TX_DATA[8];                                  // výpis 9. vyslaného bytu
                Label85->Caption = TX_DATA[9];                                  // výpis 10. vyslaného bytu
                Label86->Caption = TX_DATA[10];                                 // výpis 11. vyslaného bytu

                Label65->Caption = RX_DATA[0];                                  // výpis 1. přijatého bytu
                Label66->Caption = RX_DATA[1];                                  // výpis 2. přijatého bytu
                Label67->Caption = RX_DATA[2];                                  // výpis 3. přijatého bytu
                Label68->Caption = RX_DATA[3];                                  // výpis 4. přijatého bytu
                Label69->Caption = RX_DATA[4];                                  // výpis 5. přijatého bytu
                Label70->Caption = RX_DATA[5];                                  // výpis 6. přijatého bytu
                Label71->Caption = RX_DATA[6];                                  // výpis 7. přijatého bytu
                Label72->Caption = RX_DATA[7];                                  // výpis 8. přijatého bytu
                Label73->Caption = RX_DATA[8];                                  // výpis 9. přijatého bytu
                Label74->Caption = RX_DATA[9];                                  // výpis 10. přijatého bytu
                Label75->Caption = RX_DATA[10];                                 // výpis 11. přijatého bytu

                for(i=0;i<6;i++){                                               // cyklus vynulování vysílacího a přijímacího pole
                        RX_DATA[i]=0;                                           // vynulování přijímacího pole
                        TX_DATA[i]=0;                                           // vynulování vysílacího pole
                }
        }
}
/*---------------------------funkce tlačítka SETTING---------------------------*/
void __fastcall TMainForm::Button5Click(TObject *Sender)
{
 int i;                                                                         // pomocná promenná pro cyklus for
 int CRC;                                                                       // pomocná proměnná pro kontrolní součet
 int RXpos = 0;                                                                 // pomocná proměnná pro pozici v přijímacím poli
 char *TXpos;                                                                   // ukazatel na char
        if(ComboBox1->ItemIndex == -1){                                         // test výběru modbus adresy
                 MessageBox(Handle,"Neplatná modbus adresa!","indikátor",MB_ICONINFORMATION); // při nezadaní modbus adresy výpis chyby
        }
        else{                                                                   // modbus adresa je zadaná
                TXpos = TX_DATA;                                                // složení modbus zprávy pro odeslání
                *TXpos++ = modbus_adresa;        	                        // 1. byte modbus adresa
                *TXpos++ = Button_Events;                                       // 2. byte zápis stavu tlačítek
                *TXpos++ = 0x01;                                                // 3. byte počet bytů stavu tlačítek
                *TXpos++ = 0xA0;                                                // 4. byte stav tlačítka
                CRC = CRC16(TX_DATA,TXpos-TX_DATA);                             // výpočet CRC
                *TXpos++ = (CRC>>8);                                            // 5. byte CRC(horní byte z int)
                *TXpos++ = CRC;                                                 // 6. byte CRC(spodní byte z int)

                for(i=0;i<TXpos-TX_DATA;i++){		                        // cyklus zaslání bytů
                        Serial->WriteByte(TX_DATA[i]);                          // zaslání na port
                }

                for(i=0;i<6;i++){                                               // cyklus čtení bytů z portu
                        Serial->ReadByte(&RX_DATA[i]);                          // zápis do pole přijatých bytů
                        RXpos++;			                        // inkrementace pozice v poli přijatých bytů
                }

                if(RX_DATA[0]!=modbus_adresa){                                  // test prvního přijatého bytu
                        MessageBox(Handle,"Slave zařízení neodpovídá!","indikátor",MB_ICONINFORMATION); // jestliže se nerovná zadané modbus adrese výpis chyby
                }
                else{                                                           // první přijtý byte je adresa slave
                        if(RX_DATA[1]==0xE6)RXpos = 5;                          // test druhého přijtého bytu jetliže obsahuje chybovou funkci je počet přijatých bytu 5
                        CRC = (RX_DATA[RXpos-1] << 8 | RX_DATA[RXpos-2]);       // čtení CRC z přijaté zprávy a převod dvou bytu na jeden int
                        if (CRC == (CRC16(RX_DATA,RXpos-2))){                   // výpočet a porovnání CRC
                                if((RX_DATA[1]==0xE6)&&(RX_DATA[2]==0x01))MessageBox(Handle,"Kód chyby 0x01 - Neplatný kód funkce!","Chybová funkce funkce 0xE6",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                if((RX_DATA[1]==0xE6)&&(RX_DATA[2]==0x02))MessageBox(Handle,"Kód chyby 0x02 - Počet bytů mimo rozsah!","Chybová funkce funkce 0xE6",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                if((RX_DATA[1]==0xE6)&&(RX_DATA[2]==0x03))MessageBox(Handle,"Kód chyby 0x03 - Chybný počet přijatých bytů v slave stanici!","Chybová funkce funkce 0xE6",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                        }
                        else{                                                   // přijaté CRC a vypočtené se nerovná
                                MessageBox(Handle,"Chyba kontrolního součtu CRC!","indikátor",MB_ICONINFORMATION); // výpis chyby
                        }
                }
                Label76->Caption = TX_DATA[0];                                  // výpis 1. vyslaného bytu
                Label77->Caption = TX_DATA[1];                                  // výpis 2. vyslaného bytu
                Label78->Caption = TX_DATA[2];                                  // výpis 3. vyslaného bytu
                Label79->Caption = TX_DATA[3];                                  // výpis 4. vyslaného bytu
                Label80->Caption = TX_DATA[4];                                  // výpis 5. vyslaného bytu
                Label81->Caption = TX_DATA[5];                                  // výpis 6. vyslaného bytu
                Label82->Caption = TX_DATA[6];                                  // výpis 7. vyslaného bytu
                Label83->Caption = TX_DATA[7];                                  // výpis 8. vyslaného bytu
                Label84->Caption = TX_DATA[8];                                  // výpis 9. vyslaného bytu
                Label85->Caption = TX_DATA[9];                                  // výpis 10. vyslaného bytu
                Label86->Caption = TX_DATA[10];                                 // výpis 11. vyslaného bytu

                Label65->Caption = RX_DATA[0];                                  // výpis 1. přijatého bytu
                Label66->Caption = RX_DATA[1];                                  // výpis 2. přijatého bytu
                Label67->Caption = RX_DATA[2];                                  // výpis 3. přijatého bytu
                Label68->Caption = RX_DATA[3];                                  // výpis 4. přijatého bytu
                Label69->Caption = RX_DATA[4];                                  // výpis 5. přijatého bytu
                Label70->Caption = RX_DATA[5];                                  // výpis 6. přijatého bytu
                Label71->Caption = RX_DATA[6];                                  // výpis 7. přijatého bytu
                Label72->Caption = RX_DATA[7];                                  // výpis 8. přijatého bytu
                Label73->Caption = RX_DATA[8];                                  // výpis 9. přijatého bytu
                Label74->Caption = RX_DATA[9];                                  // výpis 10. přijatého bytu
                Label75->Caption = RX_DATA[10];                                 // výpis 11. přijatého bytu

                for(i=0;i<6;i++){                                               // cyklus vynulování vysílacího a přijímacího pole
                        RX_DATA[i]=0;                                           // vynulování přijímacího pole
                        TX_DATA[i]=0;                                           // vynulování vysílacího pole
                }
        }
}
/*------------------------------funkce tlačítka UP-----------------------------*/
void __fastcall TMainForm::Button6Click(TObject *Sender)
{
 int i;                                                                         // pomocná promenná pro cyklus for
 int CRC;                                                                       // pomocná proměnná pro kontrolní součet
 int RXpos = 0;                                                                 // pomocná proměnná pro pozici v přijímacím poli
 char *TXpos;                                                                   // ukazatel na char
        if(ComboBox1->ItemIndex == -1){                                         // test výběru modbus adresy
                 MessageBox(Handle,"Neplatná modbus adresa!","indikátor",MB_ICONINFORMATION); // při nezadaní modbus adresy výpis chyby
        }
        else{                                                                   // modbus adresa je zadaná
                TXpos = TX_DATA;                                                // složení modbus zprávy pro odeslání
                *TXpos++ = modbus_adresa;        	                        // 1. byte modbus adresa
                *TXpos++ = Button_Events;                                       // 2. byte zápis stavu tlačítek
                *TXpos++ = 0x01;                                                // 3. byte počet bytů stavu tlačítek
                *TXpos++ = 0xC0;                                                // 4. byte stav tlačítka
                CRC = CRC16(TX_DATA,TXpos-TX_DATA);                             // výpočet CRC
                *TXpos++ = (CRC>>8);                                            // 5. byte CRC(horní byte z int)
                *TXpos++ = CRC;                                                 // 6. byte CRC(spodní byte z int)

                for(i=0;i<TXpos-TX_DATA;i++){		                        // cyklus zaslání bytů
                        Serial->WriteByte(TX_DATA[i]);                          // zaslání na port
                }

                for(i=0;i<6;i++){                                               // cyklus čtení bytů z portu
                        Serial->ReadByte(&RX_DATA[i]);                          // zápis do pole přijatých bytů
                        RXpos++;			                        // inkrementace pozice v poli přijatých bytů
                }

                if(RX_DATA[0]!=modbus_adresa){                                  // test prvního přijatého bytu
                        MessageBox(Handle,"Slave zařízení neodpovídá!","indikátor",MB_ICONINFORMATION); // jestliže se nerovná zadané modbus adrese výpis chyby
                }
                else{                                                           // první přijtý byte je adresa slave
                        if(RX_DATA[1]==0xE6)RXpos = 5;                          // test druhého přijtého bytu jetliže obsahuje chybovou funkci je počet přijatých bytu 5
                        CRC = (RX_DATA[RXpos-1] << 8 | RX_DATA[RXpos-2]);       // čtení CRC z přijaté zprávy a převod dvou bytu na jeden int
                        if (CRC == (CRC16(RX_DATA,RXpos-2))){                   // výpočet a porovnání CRC
                                if((RX_DATA[1]==0xE6)&&(RX_DATA[2]==0x01))MessageBox(Handle,"Kód chyby 0x01 - Neplatný kód funkce!","Chybová funkce funkce 0xE6",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                if((RX_DATA[1]==0xE6)&&(RX_DATA[2]==0x02))MessageBox(Handle,"Kód chyby 0x02 - Počet bytů mimo rozsah!","Chybová funkce funkce 0xE6",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                if((RX_DATA[1]==0xE6)&&(RX_DATA[2]==0x03))MessageBox(Handle,"Kód chyby 0x03 - Chybný počet přijatých bytů v slave stanici!","Chybová funkce funkce 0xE6",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                        }
                        else{                                                   // přijaté CRC a vypočtené se nerovná
                                MessageBox(Handle,"Chyba kontrolního součtu CRC!","indikátor",MB_ICONINFORMATION); // výpis chyby
                        }
                }
                Label76->Caption = TX_DATA[0];                                  // výpis 1. vyslaného bytu
                Label77->Caption = TX_DATA[1];                                  // výpis 2. vyslaného bytu
                Label78->Caption = TX_DATA[2];                                  // výpis 3. vyslaného bytu
                Label79->Caption = TX_DATA[3];                                  // výpis 4. vyslaného bytu
                Label80->Caption = TX_DATA[4];                                  // výpis 5. vyslaného bytu
                Label81->Caption = TX_DATA[5];                                  // výpis 6. vyslaného bytu
                Label82->Caption = TX_DATA[6];                                  // výpis 7. vyslaného bytu
                Label83->Caption = TX_DATA[7];                                  // výpis 8. vyslaného bytu
                Label84->Caption = TX_DATA[8];                                  // výpis 9. vyslaného bytu
                Label85->Caption = TX_DATA[9];                                  // výpis 10. vyslaného bytu
                Label86->Caption = TX_DATA[10];                                 // výpis 11. vyslaného bytu

                Label65->Caption = RX_DATA[0];                                  // výpis 1. přijatého bytu
                Label66->Caption = RX_DATA[1];                                  // výpis 2. přijatého bytu
                Label67->Caption = RX_DATA[2];                                  // výpis 3. přijatého bytu
                Label68->Caption = RX_DATA[3];                                  // výpis 4. přijatého bytu
                Label69->Caption = RX_DATA[4];                                  // výpis 5. přijatého bytu
                Label70->Caption = RX_DATA[5];                                  // výpis 6. přijatého bytu
                Label71->Caption = RX_DATA[6];                                  // výpis 7. přijatého bytu
                Label72->Caption = RX_DATA[7];                                  // výpis 8. přijatého bytu
                Label73->Caption = RX_DATA[8];                                  // výpis 9. přijatého bytu
                Label74->Caption = RX_DATA[9];                                  // výpis 10. přijatého bytu
                Label75->Caption = RX_DATA[10];                                 // výpis 11. přijatého bytu

                for(i=0;i<6;i++){                                               // cyklus vynulování vysílacího a přijímacího pole
                        RX_DATA[i]=0;                                           // vynulování přijímacího pole
                        TX_DATA[i]=0;                                           // vynulování vysílacího pole
                }
        }
}
/*-----------------------funkce tlačítka Načti dig. vstupy---------------------*/
void __fastcall TMainForm::Button7Click(TObject *Sender)
{
 int i;                                                                         // pomocná promenná pro cyklus for
 int CRC;                                                                       // pomocná proměnná pro kontrolní součet
 int RXpos = 0;                                                                 // pomocná proměnná pro pozici v přijímacím poli
 char *TXpos;                                                                   // ukazatel na char
        CheckBox8->Checked = false;                                             // odznačení políčka CheckBox8
        CheckBox7->Checked = false;                                             // odznačení políčka CheckBox7
        CheckBox6->Checked = false;                                             // odznačení políčka CheckBox6
        CheckBox5->Checked = false;                                             // odznačení políčka CheckBox5
        CheckBox4->Checked = false;                                             // odznačení políčka CheckBox4
        CheckBox3->Checked = false;                                             // odznačení políčka CheckBox3
        CheckBox2->Checked = false;                                             // odznačení políčka CheckBox2
        CheckBox1->Checked = false;                                             // odznačení políčka CheckBox1

        if(ComboBox1->ItemIndex == -1){                                         // test výběru modbus adresy
                 MessageBox(Handle,"Neplatná modbus adresa!","indikátor",MB_ICONINFORMATION); // při nezadaní modbus adresy výpis chyby
        }
        else{                                                                   // modbus adresa je zadaná
                TXpos = TX_DATA;                                                // složení modbus zprávy pro odeslání
                *TXpos++ = modbus_adresa;                                       // 1. byte modbus adresa
                *TXpos++ = Read_Discrete_Inputs;                                // 2. byte čtení diskrétních vstupů
                *TXpos++ = 0x00;                                                // 3. byte počáteční adresa 2 byty(horní byte)
                *TXpos++ = 0xB0;                                                // 4. byte počáteční adresa 2 byty(spodní byte adresa portu P0)
                *TXpos++ = 0x00;                                                // 5. byte počet vstupů 2 byty(horní)
                *TXpos++ = 0x08;                                                // 6. byte počet vstupů 2 byty(spodní byte 8 vstupů)
                CRC = CRC16(TX_DATA,TXpos-TX_DATA);                             // výpočet CRC
                *TXpos++ = (CRC>>8);                                            // 7. byte CRC(horní byte z int)
                *TXpos++ = CRC;                                                 // 8. byte CRC(spodní byte z int)

                for(i=0;i<TXpos-TX_DATA;i++){		                        // cyklus zaslání bytů
                        Serial->WriteByte(TX_DATA[i]);                          // zaslání na port
                }

                for(i=0;i<6;i++){                                               // cyklus čtení bytů z portu
                        Serial->ReadByte(&RX_DATA[i]);                          // zápis do pole přijatých bytů
                        RXpos++;			                        // inkrementace pozice v poli přijatých bytů
                }

                if(RX_DATA[0]!=modbus_adresa){                                  // test prvního přijatého bytu
                        MessageBox(Handle,"Slave zařízení neodpovídá!","indikátor",MB_ICONINFORMATION); // jestliže se nerovná zadané modbus adrese výpis chyby
                }
                else{                                                           // první přijtý byte je adresa slave
                        if(RX_DATA[1]==0x82)RXpos = 5;                          // test druhého přijtého bytu jetliže obsahuje chybovou funkci je počet přijatých bytu 5
                        CRC = (RX_DATA[RXpos-1] << 8 | RX_DATA[RXpos-2]);       // čtení CRC z přijaté zprávy a převod dvou bytu na jeden int
                        if (CRC == (CRC16(RX_DATA,RXpos-2))){                   // výpočet a porovnání CRC
                                if((RX_DATA[1]==0x82)&&(RX_DATA[2]==0x01))MessageBox(Handle,"Kód chyby 0x01 - Neplatný kód funkce!","Chybová funkce funkce 0x82",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                else if((RX_DATA[1]==0x82)&&(RX_DATA[2]==0x02))MessageBox(Handle,"Kód chyby 0x02 - Počet vstupů mimo rozsah!","Chybová funkce funkce 0x82",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                else if((RX_DATA[1]==0x82)&&(RX_DATA[2]==0x03))MessageBox(Handle,"Kód chyby 0x03 - Počátečni adresa vstupů mimo rozsah!","Chybová funkce funkce 0x82",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                else{                                           // druhý přijatý byte neobsahuje kód chyby
                                        CheckBox8->Checked = RX_DATA[3]&0x80;   // podle 4. přijátého bytu označení políčka CheckBox8
                                        CheckBox7->Checked = RX_DATA[3]&0x40;   // podle 4. přijátého bytu označení políčka CheckBox7
                                        CheckBox6->Checked = RX_DATA[3]&0x20;   // podle 4. přijátého bytu označení políčka CheckBox6
                                        CheckBox5->Checked = RX_DATA[3]&0x10;   // podle 4. přijátého bytu označení políčka CheckBox5
                                        CheckBox4->Checked = RX_DATA[3]&0x08;   // podle 4. přijátého bytu označení políčka CheckBox4
                                        CheckBox3->Checked = RX_DATA[3]&0x04;   // podle 4. přijátého bytu označení políčka CheckBox3
                                        CheckBox2->Checked = RX_DATA[3]&0x02;   // podle 4. přijátého bytu označení políčka CheckBox2
                                        CheckBox1->Checked = RX_DATA[3]&0x01;   // podle 4. přijátého bytu označení políčka CheckBox1
                                }
                        }
                        else{                                                   // přijaté CRC a vypočtené se nerovná
                                MessageBox(Handle,"Chyba kontrolního součtu CRC!","indikátor",MB_ICONINFORMATION); // výpis chyby                       // výpis chyby
                        }
                }
                Label76->Caption = TX_DATA[0];                                  // výpis 1. vyslaného bytu
                Label77->Caption = TX_DATA[1];                                  // výpis 2. vyslaného bytu
                Label78->Caption = TX_DATA[2];                                  // výpis 3. vyslaného bytu
                Label79->Caption = TX_DATA[3];                                  // výpis 4. vyslaného bytu
                Label80->Caption = TX_DATA[4];                                  // výpis 5. vyslaného bytu
                Label81->Caption = TX_DATA[5];                                  // výpis 6. vyslaného bytu
                Label82->Caption = TX_DATA[6];                                  // výpis 7. vyslaného bytu
                Label83->Caption = TX_DATA[7];                                  // výpis 8. vyslaného bytu
                Label84->Caption = TX_DATA[8];                                  // výpis 9. vyslaného bytu
                Label85->Caption = TX_DATA[9];                                  // výpis 10. vyslaného bytu
                Label86->Caption = TX_DATA[10];                                 // výpis 11. vyslaného bytu

                Label65->Caption = RX_DATA[0];                                  // výpis 1. přijatého bytu
                Label66->Caption = RX_DATA[1];                                  // výpis 2. přijatého bytu
                Label67->Caption = RX_DATA[2];                                  // výpis 3. přijatého bytu
                Label68->Caption = RX_DATA[3];                                  // výpis 4. přijatého bytu
                Label69->Caption = RX_DATA[4];                                  // výpis 5. přijatého bytu
                Label70->Caption = RX_DATA[5];                                  // výpis 6. přijatého bytu
                Label71->Caption = RX_DATA[6];                                  // výpis 7. přijatého bytu
                Label72->Caption = RX_DATA[7];                                  // výpis 8. přijatého bytu
                Label73->Caption = RX_DATA[8];                                  // výpis 9. přijatého bytu
                Label74->Caption = RX_DATA[9];                                  // výpis 10. přijatého bytu
                Label75->Caption = RX_DATA[10];                                 // výpis 11. přijatého bytu

                for(i=0;i<7;i++){                                               // cyklus vynulování vysílacího a přijímacího pole
                        RX_DATA[i]=0;                                           // vynulování přijímacího pole
                        TX_DATA[i]=0;                                           // vynulování vysílacího pole
                }
        }
}
/*----------------------funkce tlačítka Načti dig. výstupy---------------------*/
void __fastcall TMainForm::Button8Click(TObject *Sender)
{
 int i;                                                                         // pomocná promenná pro cyklus for
 int CRC;                                                                       // pomocná proměnná pro kontrolní součet
 int RXpos = 0;                                                                 // pomocná proměnná pro pozici v přijímacím poli
 char *TXpos;                                                                   // ukazatel na char
        CheckBox16->Checked = false;                                            // odznačení políčka CheckBox16
        CheckBox15->Checked = false;                                            // odznačení políčka CheckBox15
        CheckBox14->Checked = false;                                            // odznačení políčka CheckBox14
        CheckBox13->Checked = false;                                            // odznačení políčka CheckBox13
        CheckBox12->Checked = false;                                            // odznačení políčka CheckBox12
        CheckBox11->Checked = false;                                            // odznačení políčka CheckBox11
        CheckBox10->Checked = false;                                            // odznačení políčka CheckBox10
        CheckBox9->Checked = false;                                             // odznačení políčka CheckBox9

        if(ComboBox1->ItemIndex == -1){                                         // test výběru modbus adresy
                 MessageBox(Handle,"Neplatná modbus adresa!","indikátor",MB_ICONINFORMATION); // při nezadaní modbus adresy výpis chyby
        }
        else{                                                                   // modbus adresa je zadaná
                TXpos = TX_DATA;                                                // složení modbus zprávy pro odeslání
                *TXpos++ = modbus_adresa;                                       // 1. byte modbus adresa
                *TXpos++ = Read_Coils;                                          // 2. byte čtení stavu cívek
                *TXpos++ = 0x00;                                                // 3. byte počáteční adresa 2 byty(horní byte)
                *TXpos++ = 0xA0;                                                // 4. byte počáteční adresa 2 byty(spodní byte adresa portu P2)
                *TXpos++ = 0x00;                                                // 5. byte počet výstupů 2 byty(horní)
                *TXpos++ = 0x08;                                                // 6. byte počet výstupů 2 byty(spodní byte 8 vstupů)
                CRC = CRC16(TX_DATA,TXpos-TX_DATA);                             // výpočet CRC
                *TXpos++ = (CRC>>8);                                            // 7. byte CRC(horní byte z int)
                *TXpos++ = CRC;                                                 // 8. byte CRC(spodní byte z int)

                for(i=0;i<TXpos-TX_DATA;i++){		                        // cyklus zaslání bytů
                        Serial->WriteByte(TX_DATA[i]);                          // zaslání na port
                }

                for(i=0;i<6;i++){                                               // cyklus čtení bytů z portu
                        Serial->ReadByte(&RX_DATA[i]);                          // zápis do pole přijatých bytů
                        RXpos++;			                        // inkrementace pozice v poli přijatých bytů
                }

                if(RX_DATA[0]!=modbus_adresa){                                  // test prvního přijatého bytu
                        MessageBox(Handle,"Slave zařízení neodpovídá!","indikátor",MB_ICONINFORMATION); // jestliže se nerovná zadané modbus adrese výpis chyby
                }
                else{                                                           // první přijtý byte je adresa slave
                        if(RX_DATA[1]==0x81)RXpos = 5;                          // test druhého přijtého bytu jetliže obsahuje chybovou funkci je počet přijatých bytu 5
                        CRC = (RX_DATA[RXpos-1] << 8 | RX_DATA[RXpos-2]);       // čtení CRC z přijaté zprávy a převod dvou bytu na jeden int
                        if (CRC == (CRC16(RX_DATA,RXpos-2))){                   // výpočet a porovnání CRC
                                if((RX_DATA[1]==0x81)&&(RX_DATA[2]==0x01))MessageBox(Handle,"Kód chyby 0x01 - Neplatný kód funkce!","Chybová funkce funkce 0x81",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                else if((RX_DATA[1]==0x81)&&(RX_DATA[2]==0x02))MessageBox(Handle,"Kód chyby 0x02 - Počet výstupů mimo rozsah!","Chybová funkce funkce 0x81",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                else if((RX_DATA[1]==0x81)&&(RX_DATA[2]==0x03))MessageBox(Handle,"Kód chyby 0x03 - Pocatecni adresa výstupů mimo rozsah!","Chybová funkce funkce 0x81",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                else{                                           // druhý přijatý byte neobsahuje kód chyby
                                        CheckBox16->Checked = RX_DATA[3]&0x80;  // podle 4. přijátého bytu označení políčka CheckBox16
                                        CheckBox15->Checked = RX_DATA[3]&0x40;  // podle 4. přijátého bytu označení políčka CheckBox15
                                        CheckBox14->Checked = RX_DATA[3]&0x20;  // podle 4. přijátého bytu označení políčka CheckBox14
                                        CheckBox13->Checked = RX_DATA[3]&0x10;  // podle 4. přijátého bytu označení políčka CheckBox13
                                        CheckBox12->Checked = RX_DATA[3]&0x08;  // podle 4. přijátého bytu označení políčka CheckBox12
                                        CheckBox11->Checked = RX_DATA[3]&0x04;  // podle 4. přijátého bytu označení políčka CheckBox11
                                        CheckBox10->Checked = RX_DATA[3]&0x02;  // podle 4. přijátého bytu označení políčka CheckBox10
                                        CheckBox9->Checked = RX_DATA[3]&0x01;   // podle 4. přijátého bytu označení políčka CheckBox9
                                }
                        }
                        else{                                                   // přijaté CRC a vypočtené se nerovná
                                MessageBox(Handle,"Chyba kontrolního součtu CRC!","indikátor",MB_ICONINFORMATION); // výpis chyby
                        }
                }
                Label76->Caption = TX_DATA[0];                                  // výpis 1. vyslaného bytu
                Label77->Caption = TX_DATA[1];                                  // výpis 2. vyslaného bytu
                Label78->Caption = TX_DATA[2];                                  // výpis 3. vyslaného bytu
                Label79->Caption = TX_DATA[3];                                  // výpis 4. vyslaného bytu
                Label80->Caption = TX_DATA[4];                                  // výpis 5. vyslaného bytu
                Label81->Caption = TX_DATA[5];                                  // výpis 6. vyslaného bytu
                Label82->Caption = TX_DATA[6];                                  // výpis 7. vyslaného bytu
                Label83->Caption = TX_DATA[7];                                  // výpis 8. vyslaného bytu
                Label84->Caption = TX_DATA[8];                                  // výpis 9. vyslaného bytu
                Label85->Caption = TX_DATA[9];                                  // výpis 10. vyslaného bytu
                Label86->Caption = TX_DATA[10];                                 // výpis 11. vyslaného bytu

                Label65->Caption = RX_DATA[0];                                  // výpis 1. přijatého bytu
                Label66->Caption = RX_DATA[1];                                  // výpis 2. přijatého bytu
                Label67->Caption = RX_DATA[2];                                  // výpis 3. přijatého bytu
                Label68->Caption = RX_DATA[3];                                  // výpis 4. přijatého bytu
                Label69->Caption = RX_DATA[4];                                  // výpis 5. přijatého bytu
                Label70->Caption = RX_DATA[5];                                  // výpis 6. přijatého bytu
                Label71->Caption = RX_DATA[6];                                  // výpis 7. přijatého bytu
                Label72->Caption = RX_DATA[7];                                  // výpis 8. přijatého bytu
                Label73->Caption = RX_DATA[8];                                  // výpis 9. přijatého bytu
                Label74->Caption = RX_DATA[9];                                  // výpis 10. přijatého bytu
                Label75->Caption = RX_DATA[10];                                 // výpis 11. přijatého bytu

                for(i=0;i<7;i++){                                               // cyklus vynulování vysílacího a přijímacího pole
                        RX_DATA[i]=0;                                           // vynulování přijímacího pole
                        TX_DATA[i]=0;                                           // vynulování vysílacího pole
                }
        }
}
/*----------------------funkce tlačítka Zapiš dig. výstupy---------------------*/
void __fastcall TMainForm::Button9Click(TObject *Sender)
{
 int i;                                                                         // pomocná promenná pro cyklus for
 int CRC;                                                                       // pomocná proměnná pro kontrolní součet
 int RXpos = 0;                                                                 // pomocná proměnná pro pozici v přijímacím poli
 char *TXpos;                                                                   // ukazatel na char

        if(ComboBox1->ItemIndex == -1){                                         // test výběru modbus adresy
                 MessageBox(Handle,"Neplatná modbus adresa!","indikátor",MB_ICONINFORMATION); // při nezadaní modbus adresy výpis chyby
        }
        else{                                                                   // modbus adresa je zadaná
                TXpos = TX_DATA;                                                // složení modbus zprávy pro odeslání
                *TXpos++ = modbus_adresa;                                       // 1. byte modbus adresa
                *TXpos++ = Write_Multiple_Coils;                                // 2. byte zápis více cívek
                *TXpos++ = 0x00;                                                // 3. byte počáteční adresa 2 byty(horní byte)
                *TXpos++ = 0xA0;                                                // 4. byte počáteční adresa 2 byty(spodní byte adresa portu P2)
                *TXpos++ = 0x00;                                                // 5. byte počet výstupů 2 byty(horní)
                *TXpos++ = 0x08;                                                // 6. byte počet výstupů 2 byty(spodní byte 8 vstupů)
                *TXpos++ = 0x01;                                                // 7. byte počet bytů
                *TXpos++ = 128*CheckBox16->Checked+                             // 8. byte složen z CheckBox9 - CheckBox16 podle jednotlivých stavů
                                64*CheckBox15->Checked+
                                32*CheckBox14->Checked+
                                16*CheckBox13->Checked+
                                8*CheckBox12->Checked+
                                4*CheckBox11->Checked+
                                2*CheckBox10->Checked+
                                1*CheckBox9->Checked;

                CRC = CRC16(TX_DATA,TXpos-TX_DATA);                             // výpočet CRC
                *TXpos++ = (CRC>>8);                                            // 9. byte CRC(horní byte z int)
                *TXpos++ = CRC;                                                 // 10. byte CRC(spodní byte z int)

                for(i=0;i<TXpos-TX_DATA;i++){		                        // cyklus zaslání bytů
                        Serial->WriteByte(TX_DATA[i]);                          // zaslání na port
                }

                for(i=0;i<8;i++){                                               // cyklus čtení bytů z portu
                        Serial->ReadByte(&RX_DATA[i]);                          // zápis do pole přijatých bytů
                        RXpos++;			                        // inkrementace pozice v poli přijatých bytů
                }

                if(RX_DATA[0]!=modbus_adresa){                                  // test prvního přijatého bytu
                        MessageBox(Handle,"Slave zařízení neodpovídá!","indikátor",MB_ICONINFORMATION); // jestliže se nerovná zadané modbus adrese výpis chyby
                }
                else{                                                           // první přijtý byte je adresa slave
                        if(RX_DATA[1] == 0x8F)RXpos = 5;                        // test druhého přijtého bytu jetliže obsahuje chybovou funkci je počet přijatých bytu 5
                        CRC = (RX_DATA[RXpos-1] << 8 | RX_DATA[RXpos-2]);       // čtení CRC z přijaté zprávy a převod dvou bytu na jeden int
                        if (CRC == (CRC16(RX_DATA,RXpos-2))){                   // výpočet a porovnání CRC
                                if((RX_DATA[1] == 0x8F)&&(RX_DATA[2]==0x01))MessageBox(Handle,"Kód chyby 0x01 - Neplatný kód funkce!","Chybová funkce funkce 0x8F",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                if((RX_DATA[1] == 0x8F)&&(RX_DATA[2]==0x02))MessageBox(Handle,"Kód chyby 0x02 - Počet výstupů mimo rozsah!","Chybová funkce funkce 0x8F",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                if((RX_DATA[1] == 0x8F)&&(RX_DATA[2]==0x03))MessageBox(Handle,"Kód chyby 0x03 - Počátečni adresa výstupů mimo rozsah!","Chybová funkce funkce 0x8F",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                        }
                        else{                                                   // přijaté CRC a vypočtené se nerovná
                                MessageBox(Handle,"Chyba kontrolního součtu CRC!","indikátor",MB_ICONINFORMATION); // výpis chyby
                        }
                }
                Label76->Caption = TX_DATA[0];                                  // výpis 1. vyslaného bytu
                Label77->Caption = TX_DATA[1];                                  // výpis 2. vyslaného bytu
                Label78->Caption = TX_DATA[2];                                  // výpis 3. vyslaného bytu
                Label79->Caption = TX_DATA[3];                                  // výpis 4. vyslaného bytu
                Label80->Caption = TX_DATA[4];                                  // výpis 5. vyslaného bytu
                Label81->Caption = TX_DATA[5];                                  // výpis 6. vyslaného bytu
                Label82->Caption = TX_DATA[6];                                  // výpis 7. vyslaného bytu
                Label83->Caption = TX_DATA[7];                                  // výpis 8. vyslaného bytu
                Label84->Caption = TX_DATA[8];                                  // výpis 9. vyslaného bytu
                Label85->Caption = TX_DATA[9];                                  // výpis 10. vyslaného bytu
                Label86->Caption = TX_DATA[10];                                 // výpis 11. vyslaného bytu

                Label65->Caption = RX_DATA[0];                                  // výpis 1. přijatého bytu
                Label66->Caption = RX_DATA[1];                                  // výpis 2. přijatého bytu
                Label67->Caption = RX_DATA[2];                                  // výpis 3. přijatého bytu
                Label68->Caption = RX_DATA[3];                                  // výpis 4. přijatého bytu
                Label69->Caption = RX_DATA[4];                                  // výpis 5. přijatého bytu
                Label70->Caption = RX_DATA[5];                                  // výpis 6. přijatého bytu
                Label71->Caption = RX_DATA[6];                                  // výpis 7. přijatého bytu
                Label72->Caption = RX_DATA[7];                                  // výpis 8. přijatého bytu
                Label73->Caption = RX_DATA[8];                                  // výpis 9. přijatého bytu
                Label74->Caption = RX_DATA[9];                                  // výpis 10. přijatého bytu
                Label75->Caption = RX_DATA[10];                                 // výpis 11. přijatého bytu

                for(i=0;i<9;i++){                                               // cyklus vynulování vysílacího a přijímacího pole
                        RX_DATA[i]=0;                                           // vynulování přijímacího pole
                        TX_DATA[i]=0;                                           // vynulování vysílacího pole
                }
        }
}

/*------------------------funkce Nastavení D/A převodníku----------------------*/
void __fastcall TMainForm::ScrollBar1Change(TObject *Sender)
{
        if(ComboBox1->ItemIndex == -1){                                         // test výběru modbus adresy
                 MessageBox(Handle,"Neplatná modbus adresa!","indikátor",MB_ICONINFORMATION); // při nezadaní modbus adresy výpis chyby
        }
        else{                                                                   // modbus adresa je zadaná
                MainForm->Timer1->Enabled = false;                              // zakázání časovače 1
                Label15->Caption = FormatFloat("00.00",10*(ScrollBar1->Position)/4095.0)+" V";  // převod pozice v ScrollBar na float hodnotu(0-10V) a výpis float hodnoty
                Label16->Caption = ScrollBar1->Position;                        // výpis int hodnoty (0-4095)
                DA1_value1 = (ScrollBar1->Position>>8)&0x0F;                    // horní byte nastavené hodnoty
                DA1_value2 = (ScrollBar1->Position)&0x00FF;                     // spodní byte nastavené hodnoty

                Label43->Caption = FormatFloat("00.00",10*(ScrollBar2->Position)/4095.0)+" V";  // převod pozice v ScrollBar na float hodnotu(0-10V) a výpis float hodnoty
                Label44->Caption = ScrollBar2->Position;                        // výpis int hodnoty (0-4095)
                DA2_value1 = (ScrollBar2->Position>>8)&0x0F;                    // horní byte nastavené hodnoty
                DA2_value2 = (ScrollBar2->Position)&0x00FF;                     // spodní byte nastavené hodnoty
                MainForm->Timer1->Enabled = true;                               // povolení časovače 1
        }
}
/*-----------------------funkce časovače pro D/A převodník---------------------*/
void __fastcall TMainForm::Timer1Timer(TObject *Sender)
{
 int i;                                                                         // pomocná promenná pro cyklus for
 int CRC;                                                                       // pomocná proměnná pro kontrolní součet
 int RXpos = 0;                                                                 // pomocná proměnná pro pozici v přijímacím poli
 char *TXpos;                                                                   // ukazatel na char

        if(ComboBox1->ItemIndex == -1){                                         // test výběru modbus adresy
                 MessageBox(Handle,"Neplatná modbus adresa!","indikátor",MB_ICONINFORMATION); // při nezadaní modbus adresy výpis chyby
        }
        else{                                                                   // modbus adresa je zadaná
                TXpos = TX_DATA;                                                // složení modbus zprávy pro odeslání
                *TXpos++ = modbus_adresa;                                       // 1. byte modbus adresa
                *TXpos++ = Write_DA;                                            // 2. byte žápis stavu D/A převodníků
                *TXpos++ = 0x04;                                                // 3. byte počet bytů
                *TXpos++ = DA1_value1;                                          // 4. byte horní byte hodnoty pro D/A převodník 1. kanál
                *TXpos++ = DA1_value2;                                          // 5. byte spodní byte hodnoty pro D/A převodník 1. kanál
                *TXpos++ = DA2_value1;                                          // 6. byte horní byte hodnoty pro D/A převodník 2. kanál
                *TXpos++ = DA2_value2;                                          // 7. byte spodní byte hodnoty pro D/A převodník 2. kanál
                CRC = CRC16(TX_DATA,TXpos-TX_DATA);                             // výpočet CRC
                *TXpos++ = (CRC>>8);                                            // 8. byte CRC(horní byte z int)
                *TXpos++ = CRC;                                                 // 9. byte CRC(spodní byte z int)

                for(i=0;i<TXpos-TX_DATA;i++){		                        // cyklus zaslání bytů
                        Serial->WriteByte(TX_DATA[i]);                          // zaslání na port
                }

                for(i=0;i<9;i++){                                               // cyklus čtení bytů z portu
                        Serial->ReadByte(&RX_DATA[i]);                          // zápis do pole přijatých bytů
                        RXpos++;			                        // inkrementace pozice v poli přijatých bytů
                }

                if(RX_DATA[0]!=modbus_adresa){                                  // test prvního přijatého bytu
                        MessageBox(Handle,"Slave zařízení neodpovídá!","indikátor",MB_ICONINFORMATION); // jestliže se nerovná zadané modbus adrese výpis chyby
                }
                else{                                                           // první přijtý byte je adresa slave
                        if(RX_DATA[1]==0xE9)RXpos = 5;                          // test druhého přijtého bytu jetliže obsahuje chybovou funkci je počet přijatých bytu 5
                        CRC = (RX_DATA[RXpos-1] << 8 | RX_DATA[RXpos-2]);       // čtení CRC z přijaté zprávy a převod dvou bytu na jeden int
                        if (CRC == (CRC16(RX_DATA,RXpos-2))){                   // výpočet a porovnání CRC
                                if((RX_DATA[1]==0xE9)&&(RX_DATA[2]==0x01))MessageBox(Handle,"Kód chyby 0x01 - Neplatný kód funkce!","Chybová funkce funkce 0xE9",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                if((RX_DATA[1]==0xE9)&&(RX_DATA[2]==0x02))MessageBox(Handle,"Kód chyby 0x02 - Počet vstupů mimo rozsah!","Chybová funkce funkce 0xE9",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                if((RX_DATA[1]==0xE9)&&(RX_DATA[2]==0x03))MessageBox(Handle,"Kód chyby 0x03 - Počátečni adresa vstupů mimo rozsah!","Chybová funkce funkce 0xE9",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                    }
                        else{                                                   // přijaté CRC a vypočtené se nerovná
                                MessageBox(Handle,"Chyba kontrolního součtu CRC!","indikátor",MB_ICONINFORMATION); // výpis chyby
                        }
                }
                Label76->Caption = TX_DATA[0];                                  // výpis 1. vyslaného bytu
                Label77->Caption = TX_DATA[1];                                  // výpis 2. vyslaného bytu
                Label78->Caption = TX_DATA[2];                                  // výpis 3. vyslaného bytu
                Label79->Caption = TX_DATA[3];                                  // výpis 4. vyslaného bytu
                Label80->Caption = TX_DATA[4];                                  // výpis 5. vyslaného bytu
                Label81->Caption = TX_DATA[5];                                  // výpis 6. vyslaného bytu
                Label82->Caption = TX_DATA[6];                                  // výpis 7. vyslaného bytu
                Label83->Caption = TX_DATA[7];                                  // výpis 8. vyslaného bytu
                Label84->Caption = TX_DATA[8];                                  // výpis 9. vyslaného bytu
                Label85->Caption = TX_DATA[9];                                  // výpis 10. vyslaného bytu
                Label86->Caption = TX_DATA[10];                                 // výpis 11. vyslaného bytu

                Label65->Caption = RX_DATA[0];                                  // výpis 1. přijatého bytu
                Label66->Caption = RX_DATA[1];                                  // výpis 2. přijatého bytu
                Label67->Caption = RX_DATA[2];                                  // výpis 3. přijatého bytu
                Label68->Caption = RX_DATA[3];                                  // výpis 4. přijatého bytu
                Label69->Caption = RX_DATA[4];                                  // výpis 5. přijatého bytu
                Label70->Caption = RX_DATA[5];                                  // výpis 6. přijatého bytu
                Label71->Caption = RX_DATA[6];                                  // výpis 7. přijatého bytu
                Label72->Caption = RX_DATA[7];                                  // výpis 8. přijatého bytu
                Label73->Caption = RX_DATA[8];                                  // výpis 9. přijatého bytu
                Label74->Caption = RX_DATA[9];                                  // výpis 10. přijatého bytu
                Label75->Caption = RX_DATA[10];                                 // výpis 11. přijatého bytu

                for(i=0;i<10;i++){                                              // cyklus vynulování vysílacího a přijímacího pole
                        RX_DATA[i]=0;                                           // vynulování přijímacího pole
                        TX_DATA[i]=0;                                           // vynulování vysílacího pole
                }
                MainForm->Timer1->Enabled = false;                              // zakázání časovače 1
        }
}
/*-------------------------funkce tlačítka Cyklické čtení----------------------*/
void __fastcall TMainForm::Button12Click(TObject *Sender)
{
 int i;                                                                         // pomocná promenná pro cyklus for
 int CRC;                                                                       // pomocná proměnná pro kontrolní součet
 int RXpos = 0;                                                                 // pomocná proměnná pro kontrolní součet
 char *TXpos;                                                                   // ukazatel na char
        if(Button12->Caption=="Cyklické čtení"){                                // test tlačítka cyklického čtení
                Button12->Caption = "Stop čtení";                               // při zapnutí cyklického čtení titulek tlačítka Stop čtení
                Button1->Hide();                                                // schování tlačítka BACK
                Button2->Hide();                                                // schování tlačítka MENU
                Button3->Hide();                                                // schování tlačítka SELECT
                Button4->Hide();                                                // schování tlačítka DOWN
                Button5->Hide();                                                // schování tlačítka SETTING
                Button6->Hide();                                                // schování tlačítka UP
                Button7->Hide();                                                // schování tlačítka Načti dig. vstupy
                Button8->Hide();                                                // schování tlačítka Načti dig. výstupy
                Button9->Hide();                                                // schování tlačítka Zapiš dig. výstupy
                Button10->Hide();                                               // schování tlačítka Načti analog. vstupy
                ScrollBar1->Hide();                                             // schování SrcollBar D/A 1. kanál
                ScrollBar2->Hide();                                             // schování SrcollBar D/A 2. kanál
                Panel7->Hide();                                                 // schování Panelu diagnostiky
                Timer2->Enabled = true;                                         // povolení časovače 2
        }
        else{                                                                   // není zapnuté cyklické čtení
                Button12->Caption = "Cyklické čtení";                           // titulek tlačítka Cyklické čtení
                Button1->Show();                                                // zobrazení tlačítka BACK
                Button2->Show();                                                // zobrazení tlačítka MENU
                Button3->Show();                                                // zobrazení tlačítka SELECT
                Button4->Show();                                                // zobrazení tlačítka DOWN
                Button5->Show();                                                // zobrazení tlačítka SETTING
                Button6->Show();                                                // zobrazení tlačítka UP
                Button7->Show();                                                // zobrazení tlačítka Načti dig. vstupy
                Button8->Show();                                                // zobrazení tlačítka Načti dig. výstupy
                Button9->Show();                                                // zobrazení tlačítka Zapiš dig. výstupy
                Button10->Show();                                               // zobrazení tlačítka Načti analog. vstupy
                ScrollBar1->Show();                                             // zobrazení SrcollBar D/A 1. kanál
                ScrollBar2->Show();                                             // zobrazení SrcollBar D/A 2. kanál
                Panel7->Show();                                                 // zobrazení Panelu diagnostiky
                Timer2->Enabled = false;                                        // zakázání časovače 2

                TXpos = TX_DATA;                                                // složení modbus zprávy pro odeslání
                *TXpos++ = modbus_adresa;                                       // 1. byte modbus adresa
                *TXpos++ = Cyclic_Read;                                         // 2. byte cyklické čtení
                *TXpos++ = 0x06;                                                // 3. byte počet bytů
                *TXpos++ = 0x00;                                                // 4. byte stop cyklické čtení
                CRC = CRC16(TX_DATA,TXpos-TX_DATA);                             // výpočet CRC
                *TXpos++ = (CRC>>8);                                            // 5. byte CRC(horní byte z int)
                *TXpos++ = CRC;                                                 // 6. byte CRC(spodní byte z int)

                for(i=0;i<TXpos-TX_DATA;i++){		                        // cyklus zaslání bytů
                        Serial->WriteByte(TX_DATA[i]);                          // zaslání na port
                }

                for(i=0;i<11;i++){                                               // cyklus čtení bytů z portu
                        Serial->ReadByte(&RX_DATA[i]);                          // zápis do pole přijatých bytů
                        RXpos++;			                        // inkrementace pozice v poli přijatých bytů
                }

                               if(RX_DATA[0]!=modbus_adresa){                                  // test prvního přijatého bytu
                        Timer2->Enabled = false;                                // zakázání časovače 2
                        Label48->Caption = "00.00";                             // vynulování výpisu analogové float hodnoty A/D 1. kanál
                        Label51->Caption = "00.00";                             // vynulování výpisu analogové float hodnoty A/D 2. kanál
                        Label88->Caption = "0";                                 // vynulování výpisu analogové hodnoty A/D 1. kanál
                        Label89->Caption = "0";                                 // vynulování výpisu analogové hodnoty A/D 2. kanál
                        MessageBox(Handle,"Slave zařízení neodpovídá!","indikátor",MB_ICONINFORMATION); // jestliže se nerovná zadané modbus adrese výpis chyby
                        Button12->Caption = "Cyklické čtení";                   // titulek tlačítka Cyklické čtení
                        Button1->Show();                                        // zobrazení tlačítka BACK
                        Button2->Show();                                        // zobrazení tlačítka MENU
                        Button3->Show();                                        // zobrazení tlačítka SELECT
                        Button4->Show();                                        // zobrazení tlačítka DOWN
                        Button5->Show();                                        // zobrazení tlačítka SETTING
                        Button6->Show();                                        // zobrazení tlačítka UP
                        Button7->Show();                                        // zobrazení tlačítka Načti dig. vstupy
                        Button8->Show();                                        // zobrazení tlačítka Načti dig. výstupy
                        Button9->Show();                                        // zobrazení tlačítka Zapiš dig. výstupy
                        Button10->Show();                                       // zobrazení tlačítka Načti analog. vstupy
                        ScrollBar1->Show();                                     // zobrazení SrcollBar D/A 1. kanál
                        ScrollBar2->Show();                                     // zobrazení SrcollBar D/A 2. kanál
                        Panel7->Show();                                         // zobrazení Panelu diagnostiky
                }
                else{                                                           // první přijtý byte je adresa slave
                        if(RX_DATA[1]==0xE7)RXpos = 5;                          // test druhého přijtého bytu jetliže obsahuje chybovou funkci je počet přijatých bytu 5
                        CRC = (RX_DATA[RXpos-1] << 8 | RX_DATA[RXpos-2]);       // čtení CRC z přijaté zprávy a převod dvou bytu na jeden int
                        if (CRC == (CRC16(RX_DATA,RXpos-2))){                   // výpočet a porovnání CRC
                                if((RX_DATA[1]==0xE7)&&(RX_DATA[2]==0x01)){     // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                        Timer2->Enabled = false;                // zakázání časovače 2
                                        Label48->Caption = "00.00";             // vynulování výpisu analogové float hodnoty A/D 1. kanál
                                        Label51->Caption = "00.00";             // vynulování výpisu analogové float hodnoty A/D 2. kanál
                                        Label88->Caption = "0";                 // vynulování výpisu analogové hodnoty A/D 1. kanál
                                        Label89->Caption = "0";                 // vynulování výpisu analogové hodnoty A/D 2. kanál
                                        MessageBox(Handle,"Kód chyby 0x01 - Neplatný kód funkce!","Chybová funkce funkce 0xE7",MB_ICONINFORMATION);     // výpis chyby
                                        Button12->Caption = "Cyklické čtení";   // titulek tlačítka Cyklické čtení
                                        Button1->Show();                        // zobrazení tlačítka BACK
                                        Button2->Show();                        // zobrazení tlačítka MENU
                                        Button3->Show();                        // zobrazení tlačítka SELECT
                                        Button4->Show();                        // zobrazení tlačítka DOWN
                                        Button5->Show();                        // zobrazení tlačítka SETTING
                                        Button6->Show();                        // zobrazení tlačítka UP
                                        Button7->Show();                        // zobrazení tlačítka Načti dig. vstupy
                                        Button8->Show();                        // zobrazení tlačítka Načti dig. výstupy
                                        Button9->Show();                        // zobrazení tlačítka Zapiš dig. výstupy
                                        Button10->Show();                       // zobrazení tlačítka Načti analog. vstupy
                                        ScrollBar1->Show();                     // zobrazení SrcollBar D/A 1. kanál
                                        ScrollBar2->Show();                     // zobrazení SrcollBar D/A 2. kanál
                                        Panel7->Show();                         // zobrazení Panelu diagnostiky
                                  }
                                  else if((RX_DATA[1]==0xE7)&&(RX_DATA[2]==0x02)){ // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                        Timer2->Enabled = false;                // zakázání časovače 2
                                        Label48->Caption = "00.00";             // vynulování výpisu analogové float hodnoty A/D 1. kanál
                                        Label51->Caption = "00.00";             // vynulování výpisu analogové float hodnoty A/D 2. kanál
                                        Label88->Caption = "0";                 // vynulování výpisu analogové hodnoty A/D 1. kanál
                                        Label89->Caption = "0";                 // vynulování výpisu analogové hodnoty A/D 2. kanál
                                        MessageBox(Handle,"Kód chyby 0x02 - Počet bytů mimo rozsah!","Chybová funkce funkce 0xE7",MB_ICONINFORMATION); // výpis chyby
                                        Button12->Caption = "Cyklické čtení";   // titulek tlačítka Cyklické čtení
                                        Button1->Show();                        // zobrazení tlačítka BACK
                                        Button2->Show();                        // zobrazení tlačítka MENU
                                        Button3->Show();                        // zobrazení tlačítka SELECT
                                        Button4->Show();                        // zobrazení tlačítka DOWN
                                        Button5->Show();                        // zobrazení tlačítka SETTING
                                        Button6->Show();                        // zobrazení tlačítka UP
                                        Button7->Show();                        // zobrazení tlačítka Načti dig. vstupy
                                        Button8->Show();                        // zobrazení tlačítka Načti dig. výstupy
                                        Button9->Show();                        // zobrazení tlačítka Zapiš dig. výstupy
                                        Button10->Show();                       // zobrazení tlačítka Načti analog. vstupy
                                        ScrollBar1->Show();                     // zobrazení SrcollBar D/A 1. kanál
                                        ScrollBar2->Show();                     // zobrazení SrcollBar D/A 2. kanál
                                        Panel7->Show();                         // zobrazení Panelu diagnostiky
                                  }
                                  else if((RX_DATA[1]==0xE7)&&(RX_DATA[2]==0x03)){ // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                        Timer2->Enabled = false;                // zakázání časovače 2
                                        Label48->Caption = "00.00";             // vynulování výpisu analogové float hodnoty A/D 1. kanál
                                        Label51->Caption = "00.00";             // vynulování výpisu analogové float hodnoty A/D 2. kanál
                                        Label88->Caption = "0";                 // vynulování výpisu analogové hodnoty A/D 1. kanál
                                        Label89->Caption = "0";                 // vynulování výpisu analogové hodnoty A/D 2. kanál
                                        MessageBox(Handle,"Kód chyby 0x03 - Chybný počet přijatých bytů v slave stanici!","Chybová funkce funkce 0xE7",MB_ICONINFORMATION); // výpis chyby
                                        Button12->Caption = "Cyklické čtení";   // titulek tlačítka Cyklické čtení
                                        Button1->Show();                        // zobrazení tlačítka BACK
                                        Button2->Show();                        // zobrazení tlačítka MENU
                                        Button3->Show();                        // zobrazení tlačítka SELECT
                                        Button4->Show();                        // zobrazení tlačítka DOWN
                                        Button5->Show();                        // zobrazení tlačítka SETTING
                                        Button6->Show();                        // zobrazení tlačítka UP
                                        Button7->Show();                        // zobrazení tlačítka Načti dig. vstupy
                                        Button8->Show();                        // zobrazení tlačítka Načti dig. výstupy
                                        Button9->Show();                        // zobrazení tlačítka Zapiš dig. výstupy
                                        Button10->Show();                       // zobrazení tlačítka Načti analog. vstupy
                                        ScrollBar1->Show();                     // zobrazení SrcollBar D/A 1. kanál
                                        ScrollBar2->Show();                     // zobrazení SrcollBar D/A 2. kanál
                                        Panel7->Show();                         // zobrazení Panelu diagnostiky
                                  }
                                  else{                                         // druhý přijatý byte neobsahuje kód chyby
                                        CheckBox8->Checked = RX_DATA[3]&0x80;   // podle 4. přijátého bytu označení políčka CheckBox8
                                        CheckBox7->Checked = RX_DATA[3]&0x40;   // podle 4. přijátého bytu označení políčka CheckBox7
                                        CheckBox6->Checked = RX_DATA[3]&0x20;   // podle 4. přijátého bytu označení políčka CheckBox6
                                        CheckBox5->Checked = RX_DATA[3]&0x10;   // podle 4. přijátého bytu označení políčka CheckBox5
                                        CheckBox4->Checked = RX_DATA[3]&0x08;   // podle 4. přijátého bytu označení políčka CheckBox4
                                        CheckBox3->Checked = RX_DATA[3]&0x04;   // podle 4. přijátého bytu označení políčka CheckBox3
                                        CheckBox2->Checked = RX_DATA[3]&0x02;   // podle 4. přijátého bytu označení políčka CheckBox2
                                        CheckBox1->Checked = RX_DATA[3]&0x01;   // podle 4. přijátého bytu označení políčka CheckBox1

                                        CheckBox16->Checked = RX_DATA[4]&0x80;  // podle 5. přijátého bytu označení políčka CheckBox16
                                        CheckBox15->Checked = RX_DATA[4]&0x40;  // podle 5. přijátého bytu označení políčka CheckBox15
                                        CheckBox14->Checked = RX_DATA[4]&0x20;  // podle 5. přijátého bytu označení políčka CheckBox14
                                        CheckBox13->Checked = RX_DATA[4]&0x10;  // podle 5. přijátého bytu označení políčka CheckBox13
                                        CheckBox12->Checked = RX_DATA[4]&0x08;  // podle 5. přijátého bytu označení políčka CheckBox12
                                        CheckBox11->Checked = RX_DATA[4]&0x04;  // podle 5. přijátého bytu označení políčka CheckBox11
                                        CheckBox10->Checked = RX_DATA[4]&0x02;  // podle 5. přijátého bytu označení políčka CheckBox10
                                        CheckBox9->Checked = RX_DATA[4]&0x01;   // podle 5. přijátého bytu označení políčka CheckBox9

                                        Label48->Caption =  FormatFloat("00.00",10*((RX_DATA[5]<<8)|RX_DATA[6])/4095.0)+" V"; // převod 6. a 7. bytu na int poté na float hodnotu(0-10V) a výpis float hodnoty
                                        Label51->Caption =  FormatFloat("00.00",10*((RX_DATA[7]<<8)|RX_DATA[8])/4095.0)+" V"; // převod 8. a 9. bytu na int poté na float hodnotu(0-10V) a výpis float hodnoty
                                        Label88->Caption = ((RX_DATA[5]<<8)|RX_DATA[6]);        // převod 6. a 7. bytu na int(0-4095) a výpis int hodnoty
                                        Label89->Caption = ((RX_DATA[7]<<8)|RX_DATA[8]);        // převod 8. a 9. bytu na int(0-4095) a výpis int hodnoty
                                  }
                        }
                        else{                                                   // přijaté CRC a vypočtené se nerovná
                                Timer2->Enabled = false;                        // zakázání časovače 2
                                Label48->Caption = "00.00";                     // vynulování výpisu analogové float hodnoty A/D 1. kanál
                                Label51->Caption = "00.00";                     // vynulování výpisu analogové float hodnoty A/D 2. kanál
                                Label88->Caption = "0";                         // vynulování výpisu analogové hodnoty A/D 1. kanál
                                Label89->Caption = "0";                         // vynulování výpisu analogové hodnoty A/D 2. kanál
                                MessageBox(Handle,"Chyba kontrolního součtu CRC!","indikátor",MB_ICONINFORMATION); // výpis chyby
                                Button12->Caption = "Cyklické čtení";           // titulek tlačítka Cyklické čtení
                                Button1->Show();                                // zobrazení tlačítka BACK
                                Button2->Show();                                // zobrazení tlačítka MENU
                                Button3->Show();                                // zobrazení tlačítka SELECT
                                Button4->Show();                                // zobrazení tlačítka DOWN
                                Button5->Show();                                // zobrazení tlačítka SETTING
                                Button6->Show();                                // zobrazení tlačítka UP
                                Button7->Show();                                // zobrazení tlačítka Načti dig. vstupy
                                Button8->Show();                                // zobrazení tlačítka Načti dig. výstupy
                                Button9->Show();                                // zobrazení tlačítka Zapiš dig. výstupy
                                Button10->Show();                               // zobrazení tlačítka Načti analog. vstupy
                                ScrollBar1->Show();                             // zobrazení SrcollBar D/A 1. kanál
                                ScrollBar2->Show();                             // zobrazení SrcollBar D/A 2. kanál
                                Panel7->Show();                                 // zobrazení Panelu diagnostiky
                        }
                }
                Label76->Caption = TX_DATA[0];                                  // výpis 1. vyslaného bytu
                Label77->Caption = TX_DATA[1];                                  // výpis 2. vyslaného bytu
                Label78->Caption = TX_DATA[2];                                  // výpis 3. vyslaného bytu
                Label79->Caption = TX_DATA[3];                                  // výpis 4. vyslaného bytu
                Label80->Caption = TX_DATA[4];                                  // výpis 5. vyslaného bytu
                Label81->Caption = TX_DATA[5];                                  // výpis 6. vyslaného bytu
                Label82->Caption = TX_DATA[6];                                  // výpis 7. vyslaného bytu
                Label83->Caption = TX_DATA[7];                                  // výpis 8. vyslaného bytu
                Label84->Caption = TX_DATA[8];                                  // výpis 9. vyslaného bytu
                Label85->Caption = TX_DATA[9];                                  // výpis 10. vyslaného bytu
                Label86->Caption = TX_DATA[10];                                 // výpis 11. vyslaného bytu

                Label65->Caption = RX_DATA[0];                                  // výpis 1. přijatého bytu
                Label66->Caption = RX_DATA[1];                                  // výpis 2. přijatého bytu
                Label67->Caption = RX_DATA[2];                                  // výpis 3. přijatého bytu
                Label68->Caption = RX_DATA[3];                                  // výpis 4. přijatého bytu
                Label69->Caption = RX_DATA[4];                                  // výpis 5. přijatého bytu
                Label70->Caption = RX_DATA[5];                                  // výpis 6. přijatého bytu
                Label71->Caption = RX_DATA[6];                                  // výpis 7. přijatého bytu
                Label72->Caption = RX_DATA[7];                                  // výpis 8. přijatého bytu
                Label73->Caption = RX_DATA[8];                                  // výpis 9. přijatého bytu
                Label74->Caption = RX_DATA[9];                                  // výpis 10. přijatého bytu
                Label75->Caption = RX_DATA[10];                                 // výpis 11. přijatého bytu

                for(i=0;i<12;i++){                                              // cyklus vynulování vysílacího a přijímacího pole
                        RX_DATA[i]=0;                                           // vynulování přijímacího pole
                        TX_DATA[i]=0;                                           // vynulování vysílacího pole
                }
        }

}
/*----------------------funkce časovače pro cyklické čtení---------------------*/
void __fastcall TMainForm::Timer2Timer(TObject *Sender)
{
 int i;                                                                         // pomocná promenná pro cyklus for
 int CRC;                                                                       // pomocná proměnná pro kontrolní součet
 int RXpos = 0;                                                                 // pomocná proměnná pro pozici v přijímacím poli
 char *TXpos;                                                                   // ukazatel na char
        if(ComboBox1->ItemIndex == -1){                                         // test výběru modbus adresy
                Timer2->Enabled = false;                                        // zakázání časovače 2
                MessageBox(Handle,"Neplatná modbus adresa!","indikátor",MB_ICONINFORMATION); // při nezadaní modbus adresy výpis chyby
                Button12->Caption = "Cyklické čtení";                           // titulek tlačítka Cyklické čtení
                Button1->Show();                                                // zobrazení tlačítka BACK
                Button2->Show();                                                // zobrazení tlačítka MENU
                Button3->Show();                                                // zobrazení tlačítka SELECT
                Button4->Show();                                                // zobrazení tlačítka DOWN
                Button5->Show();                                                // zobrazení tlačítka SETTING
                Button6->Show();                                                // zobrazení tlačítka UP
                Button7->Show();                                                // zobrazení tlačítka Načti dig. vstupy
                Button8->Show();                                                // zobrazení tlačítka Načti dig. výstupy
                Button9->Show();                                                // zobrazení tlačítka Zapiš dig. výstupy
                Button10->Show();                                               // zobrazení tlačítka Načti analog. vstupy
                ScrollBar1->Show();                                             // zobrazení SrcollBar D/A 1. kanál
                ScrollBar2->Show();                                             // zobrazení SrcollBar D/A 2. kanál
                Panel7->Show();                                                 // zobrazení Panelu diagnostiky
        }
        else{
                TXpos = TX_DATA;                                                // složení modbus zprávy pro odeslání
                *TXpos++ = modbus_adresa;                                       // 1. byte modbus adresa
                *TXpos++ = Cyclic_Read;                                         // 2. byte cyklické čtení
                *TXpos++ = 0x06;                                                // 3. byte počet bytů
                *TXpos++ = 0x01;                                                // 4. byte start cyklické čtení
                CRC = CRC16(TX_DATA,TXpos-TX_DATA);                             // výpočet CRC
                *TXpos++ = (CRC>>8);                                            // 5. byte CRC(horní byte z int)
                *TXpos++ = CRC;                                                 // 6. byte CRC(spodní byte z int)

                for(i=0;i<TXpos-TX_DATA;i++){		                        // cyklus zaslání bytů
                        Serial->WriteByte(TX_DATA[i]);                          // zaslání na port
                }

                for(i=0;i<11;i++){                                               // cyklus čtení bytů z portu
                        Serial->ReadByte(&RX_DATA[i]);                          // zápis do pole přijatých bytů
                        RXpos++;			                        // inkrementace pozice v poli přijatých bytů
                }

                if(RX_DATA[0]!=modbus_adresa){                                  // test prvního přijatého bytu
                        Timer2->Enabled = false;                                // zakázání časovače 2
                        Label48->Caption = "00.00";                             // vynulování výpisu analogové float hodnoty A/D 1. kanál
                        Label51->Caption = "00.00";                             // vynulování výpisu analogové float hodnoty A/D 2. kanál
                        Label88->Caption = "0";                                 // vynulování výpisu analogové hodnoty A/D 1. kanál
                        Label89->Caption = "0";                                 // vynulování výpisu analogové hodnoty A/D 2. kanál
                        MessageBox(Handle,"Slave zařízení neodpovídá!","indikátor",MB_ICONINFORMATION); // jestliže se nerovná zadané modbus adrese výpis chyby
                        Button12->Caption = "Cyklické čtení";                   // titulek tlačítka Cyklické čtení
                        Button1->Show();                                        // zobrazení tlačítka BACK
                        Button2->Show();                                        // zobrazení tlačítka MENU
                        Button3->Show();                                        // zobrazení tlačítka SELECT
                        Button4->Show();                                        // zobrazení tlačítka DOWN
                        Button5->Show();                                        // zobrazení tlačítka SETTING
                        Button6->Show();                                        // zobrazení tlačítka UP
                        Button7->Show();                                        // zobrazení tlačítka Načti dig. vstupy
                        Button8->Show();                                        // zobrazení tlačítka Načti dig. výstupy
                        Button9->Show();                                        // zobrazení tlačítka Zapiš dig. výstupy
                        Button10->Show();                                       // zobrazení tlačítka Načti analog. vstupy
                        ScrollBar1->Show();                                     // zobrazení SrcollBar D/A 1. kanál
                        ScrollBar2->Show();                                     // zobrazení SrcollBar D/A 2. kanál
                        Panel7->Show();                                         // zobrazení Panelu diagnostiky
                }
                else{                                                           // první přijtý byte je adresa slave
                        if(RX_DATA[1]==0xE7)RXpos = 5;                          // test druhého přijtého bytu jetliže obsahuje chybovou funkci je počet přijatých bytu 5
                        CRC = (RX_DATA[RXpos-1] << 8 | RX_DATA[RXpos-2]);       // čtení CRC z přijaté zprávy a převod dvou bytu na jeden int
                        if (CRC == (CRC16(RX_DATA,RXpos-2))){                   // výpočet a porovnání CRC
                                if((RX_DATA[1]==0xE7)&&(RX_DATA[2]==0x01)){     // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                        Timer2->Enabled = false;                // zakázání časovače 2
                                        Label48->Caption = "00.00";             // vynulování výpisu analogové float hodnoty A/D 1. kanál
                                        Label51->Caption = "00.00";             // vynulování výpisu analogové float hodnoty A/D 2. kanál
                                        Label88->Caption = "0";                 // vynulování výpisu analogové hodnoty A/D 1. kanál
                                        Label89->Caption = "0";                 // vynulování výpisu analogové hodnoty A/D 2. kanál
                                        MessageBox(Handle,"Kód chyby 0x01 - Neplatný kód funkce!","Chybová funkce funkce 0xE7",MB_ICONINFORMATION); //výpis chyby
                                        Button12->Caption = "Cyklické čtení";   // titulek tlačítka Cyklické čtení
                                        Button1->Show();                        // zobrazení tlačítka BACK
                                        Button2->Show();                        // zobrazení tlačítka MENU
                                        Button3->Show();                        // zobrazení tlačítka SELECT
                                        Button4->Show();                        // zobrazení tlačítka DOWN
                                        Button5->Show();                        // zobrazení tlačítka SETTING
                                        Button6->Show();                        // zobrazení tlačítka UP
                                        Button7->Show();                        // zobrazení tlačítka Načti dig. vstupy
                                        Button8->Show();                        // zobrazení tlačítka Načti dig. výstupy
                                        Button9->Show();                        // zobrazení tlačítka Zapiš dig. výstupy
                                        Button10->Show();                       // zobrazení tlačítka Načti analog. vstupy
                                        ScrollBar1->Show();                     // zobrazení SrcollBar D/A 1. kanál
                                        ScrollBar2->Show();                     // zobrazení SrcollBar D/A 2. kanál
                                        Panel7->Show();                         // zobrazení Panelu diagnostiky
                                  }
                                  else if((RX_DATA[1]==0xE7)&&(RX_DATA[2]==0x02)){ // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                        Timer2->Enabled = false;                // zakázání časovače 2
                                        Label48->Caption = "00.00";             // vynulování výpisu analogové float hodnoty A/D 1. kanál
                                        Label51->Caption = "00.00";             // vynulování výpisu analogové float hodnoty A/D 2. kanál
                                        Label88->Caption = "0";                 // vynulování výpisu analogové hodnoty A/D 1. kanál
                                        Label89->Caption = "0";                 // vynulování výpisu analogové hodnoty A/D 2. kanál
                                        MessageBox(Handle,"Kód chyby 0x02 - Počet bytů mimo rozsah!","Chybová funkce funkce 0xE7",MB_ICONINFORMATION); // výpis chyby
                                        Button12->Caption = "Cyklické čtení";   // titulek tlačítka Cyklické čtení
                                        Button1->Show();                        // zobrazení tlačítka BACK
                                        Button2->Show();                        // zobrazení tlačítka MENU
                                        Button3->Show();                        // zobrazení tlačítka SELECT
                                        Button4->Show();                        // zobrazení tlačítka DOWN
                                        Button5->Show();                        // zobrazení tlačítka SETTING
                                        Button6->Show();                        // zobrazení tlačítka UP
                                        Button7->Show();                        // zobrazení tlačítka Načti dig. vstupy
                                        Button8->Show();                        // zobrazení tlačítka Načti dig. výstupy
                                        Button9->Show();                        // zobrazení tlačítka Zapiš dig. výstupy
                                        Button10->Show();                       // zobrazení tlačítka Načti analog. vstupy
                                        ScrollBar1->Show();                     // zobrazení SrcollBar D/A 1. kanál
                                        ScrollBar2->Show();                     // zobrazení SrcollBar D/A 2. kanál
                                        Panel7->Show();                         // zobrazení Panelu diagnostiky
                                  }
                                  else if((RX_DATA[1]==0xE7)&&(RX_DATA[2]==0x03)){ // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                        Timer2->Enabled = false;                // zakázání časovače 2
                                        Label48->Caption = "00.00";             // vynulování výpisu analogové float hodnoty A/D 1. kanál
                                        Label51->Caption = "00.00";             // vynulování výpisu analogové float hodnoty A/D 2. kanál
                                        Label88->Caption = "0";                 // vynulování výpisu analogové hodnoty A/D 1. kanál
                                        Label89->Caption = "0";                 // vynulování výpisu analogové hodnoty A/D 2. kanál
                                        MessageBox(Handle,"Kód chyby 0x03 - Chybný počet přijatých bytů v slave stanici!","Chybová funkce funkce 0xE7",MB_ICONINFORMATION); // výpis chyby
                                        Button12->Caption = "Cyklické čtení";   // titulek tlačítka Cyklické čtení
                                        Button1->Show();                        // zobrazení tlačítka BACK
                                        Button2->Show();                        // zobrazení tlačítka MENU
                                        Button3->Show();                        // zobrazení tlačítka SELECT
                                        Button4->Show();                        // zobrazení tlačítka DOWN
                                        Button5->Show();                        // zobrazení tlačítka SETTING
                                        Button6->Show();                        // zobrazení tlačítka UP
                                        Button7->Show();                        // zobrazení tlačítka Načti dig. vstupy
                                        Button8->Show();                        // zobrazení tlačítka Načti dig. výstupy
                                        Button9->Show();                        // zobrazení tlačítka Zapiš dig. výstupy
                                        Button10->Show();                       // zobrazení tlačítka Načti analog. vstupy
                                        ScrollBar1->Show();                     // zobrazení SrcollBar D/A 1. kanál
                                        ScrollBar2->Show();                     // zobrazení SrcollBar D/A 2. kanál
                                        Panel7->Show();                         // zobrazení Panelu diagnostiky
                                  }
                                  else{                                         // druhý přijatý byte neobsahuje kód chyby
                                        CheckBox8->Checked = RX_DATA[3]&0x80;   // podle 4. přijátého bytu označení políčka CheckBox8
                                        CheckBox7->Checked = RX_DATA[3]&0x40;   // podle 4. přijátého bytu označení políčka CheckBox7
                                        CheckBox6->Checked = RX_DATA[3]&0x20;   // podle 4. přijátého bytu označení políčka CheckBox6
                                        CheckBox5->Checked = RX_DATA[3]&0x10;   // podle 4. přijátého bytu označení políčka CheckBox5
                                        CheckBox4->Checked = RX_DATA[3]&0x08;   // podle 4. přijátého bytu označení políčka CheckBox4
                                        CheckBox3->Checked = RX_DATA[3]&0x04;   // podle 4. přijátého bytu označení políčka CheckBox3
                                        CheckBox2->Checked = RX_DATA[3]&0x02;   // podle 4. přijátého bytu označení políčka CheckBox2
                                        CheckBox1->Checked = RX_DATA[3]&0x01;   // podle 4. přijátého bytu označení políčka CheckBox1

                                        CheckBox16->Checked = RX_DATA[4]&0x80;  // podle 5. přijátého bytu označení políčka CheckBox16
                                        CheckBox15->Checked = RX_DATA[4]&0x40;  // podle 5. přijátého bytu označení políčka CheckBox15
                                        CheckBox14->Checked = RX_DATA[4]&0x20;  // podle 5. přijátého bytu označení políčka CheckBox14
                                        CheckBox13->Checked = RX_DATA[4]&0x10;  // podle 5. přijátého bytu označení políčka CheckBox13
                                        CheckBox12->Checked = RX_DATA[4]&0x08;  // podle 5. přijátého bytu označení políčka CheckBox12
                                        CheckBox11->Checked = RX_DATA[4]&0x04;  // podle 5. přijátého bytu označení políčka CheckBox11
                                        CheckBox10->Checked = RX_DATA[4]&0x02;  // podle 5. přijátého bytu označení políčka CheckBox10
                                        CheckBox9->Checked = RX_DATA[4]&0x01;   // podle 5. přijátého bytu označení políčka CheckBox9

                                        Label48->Caption =  FormatFloat("00.00",10*((RX_DATA[5]<<8)|RX_DATA[6])/4095.0)+" V"; // převod 6. a 7. bytu na int poté na float hodnotu(0-10V) a výpis float hodnoty
                                        Label51->Caption =  FormatFloat("00.00",10*((RX_DATA[7]<<8)|RX_DATA[8])/4095.0)+" V"; // převod 8. a 9. bytu na int poté na float hodnotu(0-10V) a výpis float hodnoty
                                        Label88->Caption = ((RX_DATA[5]<<8)|RX_DATA[6]);        // převod 6. a 7. bytu na int(0-4095) a výpis int hodnoty
                                        Label89->Caption = ((RX_DATA[7]<<8)|RX_DATA[8]);        // převod 8. a 9. bytu na int(0-4095) a výpis int hodnoty
                                  }
                        }
                        else{                                                   // přijaté CRC a vypočtené se nerovná
                                Timer2->Enabled = false;                        // zakázání časovače 2
                                Label48->Caption = "00.00";                     // vynulování výpisu analogové float hodnoty A/D 1. kanál
                                Label51->Caption = "00.00";                     // vynulování výpisu analogové float hodnoty A/D 2. kanál
                                Label88->Caption = "0";                         // vynulování výpisu analogové hodnoty A/D 1. kanál
                                Label89->Caption = "0";                         // vynulování výpisu analogové hodnoty A/D 2. kanál
                                MessageBox(Handle,"Chyba kontrolního součtu CRC!","indikátor",MB_ICONINFORMATION); // výpis chyby
                                Button12->Caption = "Cyklické čtení";           // titulek tlačítka Cyklické čtení
                                Button1->Show();                                // zobrazení tlačítka BACK
                                Button2->Show();                                // zobrazení tlačítka MENU
                                Button3->Show();                                // zobrazení tlačítka SELECT
                                Button4->Show();                                // zobrazení tlačítka DOWN
                                Button5->Show();                                // zobrazení tlačítka SETTING
                                Button6->Show();                                // zobrazení tlačítka UP
                                Button7->Show();                                // zobrazení tlačítka Načti dig. vstupy
                                Button8->Show();                                // zobrazení tlačítka Načti dig. výstupy
                                Button9->Show();                                // zobrazení tlačítka Zapiš dig. výstupy
                                Button10->Show();                               // zobrazení tlačítka Načti analog. vstupy
                                ScrollBar1->Show();                             // zobrazení SrcollBar D/A 1. kanál
                                ScrollBar2->Show();                             // zobrazení SrcollBar D/A 2. kanál
                                Panel7->Show();                                 // zobrazení Panelu diagnostiky
                        }
                }
                Label76->Caption = TX_DATA[0];                                  // výpis 1. vyslaného bytu
                Label77->Caption = TX_DATA[1];                                  // výpis 2. vyslaného bytu
                Label78->Caption = TX_DATA[2];                                  // výpis 3. vyslaného bytu
                Label79->Caption = TX_DATA[3];                                  // výpis 4. vyslaného bytu
                Label80->Caption = TX_DATA[4];                                  // výpis 5. vyslaného bytu
                Label81->Caption = TX_DATA[5];                                  // výpis 6. vyslaného bytu
                Label82->Caption = TX_DATA[6];                                  // výpis 7. vyslaného bytu
                Label83->Caption = TX_DATA[7];                                  // výpis 8. vyslaného bytu
                Label84->Caption = TX_DATA[8];                                  // výpis 9. vyslaného bytu
                Label85->Caption = TX_DATA[9];                                  // výpis 10. vyslaného bytu
                Label86->Caption = TX_DATA[10];                                 // výpis 11. vyslaného bytu

                Label65->Caption = RX_DATA[0];                                  // výpis 1. přijatého bytu
                Label66->Caption = RX_DATA[1];                                  // výpis 2. přijatého bytu
                Label67->Caption = RX_DATA[2];                                  // výpis 3. přijatého bytu
                Label68->Caption = RX_DATA[3];                                  // výpis 4. přijatého bytu
                Label69->Caption = RX_DATA[4];                                  // výpis 5. přijatého bytu
                Label70->Caption = RX_DATA[5];                                  // výpis 6. přijatého bytu
                Label71->Caption = RX_DATA[6];                                  // výpis 7. přijatého bytu
                Label72->Caption = RX_DATA[7];                                  // výpis 8. přijatého bytu
                Label73->Caption = RX_DATA[8];                                  // výpis 9. přijatého bytu
                Label74->Caption = RX_DATA[9];                                  // výpis 10. přijatého bytu
                Label75->Caption = RX_DATA[10];                                 // výpis 11. přijatého bytu

                for(i=0;i<12;i++){                                              // cyklus vynulování vysílacího a přijímacího pole
                        RX_DATA[i]=0;                                           // vynulování přijímacího pole
                        TX_DATA[i]=0;                                           // vynulování vysílacího pole
                }
        }
}
/*-------------------------funkce pro výběr modbus adresy----------------------*/
void __fastcall TMainForm::ComboBox1Change(TObject *Sender)
{
        modbus_adresa = ComboBox1->ItemIndex;                                   // zobrazení modbus adres
}
/*---------------------funkce tlačítka Načti analog. vstupy--------------------*/
void __fastcall TMainForm::Button10Click(TObject *Sender)
{
 int i;                                                                         // pomocná promenná pro cyklus for
 int CRC;                                                                       // pomocná proměnná pro kontrolní součet
 int RXpos = 0;                                                                 // pomocná proměnná pro pozici v přijímacím poli
 char *TXpos;                                                                   // ukazatel na char

        if(ComboBox1->ItemIndex == -1){                                         // test výběru modbus adresy
                 MessageBox(Handle,"Neplatná modbus adresa!","indikátor",MB_ICONINFORMATION); // při nezadaní modbus adresy výpis chyby
        }
        else{                                                                   // modbus adresa je zadaná
                TXpos = TX_DATA;                                                // složení modbus zprávy pro odeslání
                *TXpos++ = modbus_adresa;                                       // 1. byte modbus adresa
                *TXpos++ = Read_AD;                                             // 2. byte čtení A/D převodníku
                *TXpos++ = 0x04;                                                // 3. byte počet bytů
                CRC = CRC16(TX_DATA,TXpos-TX_DATA);                             // výpočet CRC
                *TXpos++ = (CRC>>8);                                            // 4. byte CRC(horní byte z int)
                *TXpos++ = CRC;                                                 // 5. byte CRC(spodní byte z int)

                for(i=0;i<TXpos-TX_DATA;i++){		                        // cyklus zaslání bytů
                        Serial->WriteByte(TX_DATA[i]);                          // zaslání na port
                }

                for(i=0;i<9;i++){                                               // cyklus čtení bytů z portu
                        Serial->ReadByte(&RX_DATA[i]);                          // zápis do pole přijatých bytů
                        RXpos++;			                        // inkrementace pozice v poli přijatých bytů
                }

                if(RX_DATA[0]!=modbus_adresa){                                  // test prvního přijatého bytu
                        MessageBox(Handle,"Slave zařízení neodpovídá!","indikátor",MB_ICONINFORMATION); // jestliže se nerovná zadané modbus adrese výpis chyby
                }
                else{                                                           // první přijtý byte je adresa slave
                        if(RX_DATA[1]==0xE8)RXpos = 5;                          // test druhého přijtého bytu jetliže obsahuje chybovou funkci je počet přijatých bytu 5
                        CRC = (RX_DATA[RXpos-1] << 8 | RX_DATA[RXpos-2]);       // čtení CRC z přijaté zprávy a převod dvou bytu na jeden int
                        if (CRC == (CRC16(RX_DATA,RXpos-2))){                   // výpočet a porovnání CRC
                                if((RX_DATA[1]==0xE8)&&(RX_DATA[2]==0x01))MessageBox(Handle,"Kód chyby 0x01 - Neplatný kód funkce!","Chybová funkce funkce 0xE8",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                else if((RX_DATA[1]==0xE8)&&(RX_DATA[2]==0x02))MessageBox(Handle,"Kód chyby 0x02 - Počet vstupů mimo rozsah!","Chybová funkce funkce 0xE8",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                else if((RX_DATA[1]==0xE8)&&(RX_DATA[2]==0x03))MessageBox(Handle,"Kód chyby 0x03 - Počátečni adresa vstupů mimo rozsah!","Chybová funkce funkce 0xE8",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                else{                                           // druhý přijatý byte neobsahuje kód chyby
                                        Label48->Caption =  FormatFloat("00.00",10*((RX_DATA[3]<<8)|RX_DATA[4])/4095.0)+" V"; // převod 4. a 5. bytu na int poté na float hodnotu(0-10V) a výpis float hodnoty
                                        Label51->Caption =  FormatFloat("00.00",10*((RX_DATA[5]<<8)|RX_DATA[6])/4095.0)+" V"; // převod 6. a 7. bytu na int poté na float hodnotu(0-10V) a výpis float hodnoty
                                        Label88->Caption = ((RX_DATA[3]<<8)|RX_DATA[4]);        // převod 4. a 5. bytu na int(0-4095) a výpis int hodnoty
                                        Label89->Caption = ((RX_DATA[5]<<8)|RX_DATA[6]);        // převod 6. a 7. bytu na int(0-4095) a výpis int hodnoty
                                }
                        }
                        else{                                                   // přijaté CRC a vypočtené se nerovná
                                MessageBox(Handle,"Chyba kontrolního součtu CRC!","indikátor",MB_ICONINFORMATION); // výpis chyby
                        }
                }

                Label76->Caption = TX_DATA[0];                                  // výpis 1. vyslaného bytu
                Label77->Caption = TX_DATA[1];                                  // výpis 2. vyslaného bytu
                Label78->Caption = TX_DATA[2];                                  // výpis 3. vyslaného bytu
                Label79->Caption = TX_DATA[3];                                  // výpis 4. vyslaného bytu
                Label80->Caption = TX_DATA[4];                                  // výpis 5. vyslaného bytu
                Label81->Caption = TX_DATA[5];                                  // výpis 6. vyslaného bytu
                Label82->Caption = TX_DATA[6];                                  // výpis 7. vyslaného bytu
                Label83->Caption = TX_DATA[7];                                  // výpis 8. vyslaného bytu
                Label84->Caption = TX_DATA[8];                                  // výpis 9. vyslaného bytu
                Label85->Caption = TX_DATA[9];                                  // výpis 10. vyslaného bytu
                Label86->Caption = TX_DATA[10];                                 // výpis 11. vyslaného bytu

                Label65->Caption = RX_DATA[0];                                  // výpis 1. přijatého bytu
                Label66->Caption = RX_DATA[1];                                  // výpis 2. přijatého bytu
                Label67->Caption = RX_DATA[2];                                  // výpis 3. přijatého bytu
                Label68->Caption = RX_DATA[3];                                  // výpis 4. přijatého bytu
                Label69->Caption = RX_DATA[4];                                  // výpis 5. přijatého bytu
                Label70->Caption = RX_DATA[5];                                  // výpis 6. přijatého bytu
                Label71->Caption = RX_DATA[6];                                  // výpis 7. přijatého bytu
                Label72->Caption = RX_DATA[7];                                  // výpis 8. přijatého bytu
                Label73->Caption = RX_DATA[8];                                  // výpis 9. přijatého bytu
                Label74->Caption = RX_DATA[9];                                  // výpis 10. přijatého bytu
                Label75->Caption = RX_DATA[10];                                 // výpis 11. přijatého bytu

                for(i=0;i<10;i++){                                              // cyklus vynulování vysílacího a přijímacího pole
                        RX_DATA[i]=0;                                           // vynulování přijímacího pole
                        TX_DATA[i]=0;                                           // vynulování vysílacího pole
                }
        }
}
/*-----------------------------funkce tlačítka Konec---------------------------*/
void __fastcall TMainForm::Konec1Click(TObject *Sender)
{
        Close();        
}
/*------------------funkce tlačítka Čítač komunikačních událostí---------------*/
void __fastcall TMainForm::Button13Click(TObject *Sender)
{
 int i;                                                                         // pomocná promenná pro cyklus for
 int CRC;                                                                       // pomocná proměnná pro kontrolní součet
 int RXpos = 0;                                                                 // pomocná proměnná pro pozici v přijímacím poli
 char *TXpos;                                                                   // ukazatel na char

        if(ComboBox1->ItemIndex == -1){                                         // test výběru modbus adresy
                 MessageBox(Handle,"Neplatná modbus adresa!","indikátor",MB_ICONINFORMATION); // při nezadaní modbus adresy výpis chyby
        }
        else{                                                                   // modbus adresa je zadaná
                TXpos = TX_DATA;                                                // složení modbus zprávy pro odeslání
                *TXpos++ = modbus_adresa;                                       // 1. byte modbus adresa
                *TXpos++ = Get_Comm_Event_Counter;                              // 2. byte čtení stavu čítače komunikačních událostí
                CRC = CRC16(TX_DATA,TXpos-TX_DATA);                             // výpočet CRC
                *TXpos++ = (CRC>>8);                                            // 3. byte CRC(horní byte z int)
                *TXpos++ = CRC;                                                 // 4. byte CRC(spodní byte z int)

                for(i=0;i<TXpos-TX_DATA;i++){		                        // cyklus zaslání bytů
                        Serial->WriteByte(TX_DATA[i]);                          // zaslání na port
                }

                for(i=0;i<8;i++){                                               // cyklus čtení bytů z portu
                        Serial->ReadByte(&RX_DATA[i]);                          // zápis do pole přijatých bytů
                        RXpos++;			                        // inkrementace pozice v poli přijatých bytů
                }

                if(RX_DATA[0]!=modbus_adresa){                                  // test prvního přijatého bytu
                        MessageBox(Handle,"Slave zařízení neodpovídá!","indikátor",MB_ICONINFORMATION); // jestliže se nerovná zadané modbus adrese výpis chyby
                }
                else{                                                           // první přijtý byte je adresa slave
                        if(RX_DATA[1]==0x8B)RXpos = 5;                          // test druhého přijtého bytu jetliže obsahuje chybovou funkci je počet přijatých bytu 5
                        CRC = (RX_DATA[RXpos-1] << 8 | RX_DATA[RXpos-2]);       // čtení CRC z přijaté zprávy a převod dvou bytu na jeden int
                        if (CRC == (CRC16(RX_DATA,RXpos-2))){                   // výpočet a porovnání CRC
                                if((RX_DATA[1]==0x8B)&&(RX_DATA[2]==0x01))MessageBox(Handle,"Kód chyby 0x01 - Neplatný kód funkce!","Chybová funkce funkce 0x8B",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                else if((RX_DATA[1]==0x8B)&&(RX_DATA[2]==0x03))MessageBox(Handle,"Kód chyby 0x03 - Chybný počet přijatých bytů v slave stanici!","Chybová funkce funkce 0x8B",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                else{                                           // druhý přijatý byte neobsahuje kód chyby
                                        Label90->Caption = ((RX_DATA[4]<<8)|(RX_DATA[5])); // převod dvou bytů na int a následný výpis čítače komunukačních událostí
                                }
                        }
                        else{                                                   // přijaté CRC a vypočtené se nerovná
                                MessageBox(Handle,"Chyba kontrolního součtu CRC!","indikátor",MB_ICONINFORMATION); // výpis chyby
                        }
                }
                Label76->Caption = TX_DATA[0];                                  // výpis 1. vyslaného bytu
                Label77->Caption = TX_DATA[1];                                  // výpis 2. vyslaného bytu
                Label78->Caption = TX_DATA[2];                                  // výpis 3. vyslaného bytu
                Label79->Caption = TX_DATA[3];                                  // výpis 4. vyslaného bytu
                Label80->Caption = TX_DATA[4];                                  // výpis 5. vyslaného bytu
                Label81->Caption = TX_DATA[5];                                  // výpis 6. vyslaného bytu
                Label82->Caption = TX_DATA[6];                                  // výpis 7. vyslaného bytu
                Label83->Caption = TX_DATA[7];                                  // výpis 8. vyslaného bytu
                Label84->Caption = TX_DATA[8];                                  // výpis 9. vyslaného bytu
                Label85->Caption = TX_DATA[9];                                  // výpis 10. vyslaného bytu
                Label86->Caption = TX_DATA[10];                                 // výpis 11. vyslaného bytu

                Label65->Caption = RX_DATA[0];                                  // výpis 1. přijatého bytu
                Label66->Caption = RX_DATA[1];                                  // výpis 2. přijatého bytu
                Label67->Caption = RX_DATA[2];                                  // výpis 3. přijatého bytu
                Label68->Caption = RX_DATA[3];                                  // výpis 4. přijatého bytu
                Label69->Caption = RX_DATA[4];                                  // výpis 5. přijatého bytu
                Label70->Caption = RX_DATA[5];                                  // výpis 6. přijatého bytu
                Label71->Caption = RX_DATA[6];                                  // výpis 7. přijatého bytu
                Label72->Caption = RX_DATA[7];                                  // výpis 8. přijatého bytu
                Label73->Caption = RX_DATA[8];                                  // výpis 9. přijatého bytu
                Label74->Caption = RX_DATA[9];                                  // výpis 10. přijatého bytu
                Label75->Caption = RX_DATA[10];                                 // výpis 11. přijatého bytu

                for(i=0;i<10;i++){                                              // cyklus vynulování vysílacího a přijímacího pole
                        RX_DATA[i]=0;                                           // vynulování přijímacího pole
                        TX_DATA[i]=0;                                           // vynulování vysílacího pole
                }
        }
}
/*------------------------------funkce tlačítka CPT1---------------------------*/
void __fastcall TMainForm::Button14Click(TObject *Sender)
{
 int i;                                                                         // pomocná promenná pro cyklus for
 int CRC;                                                                       // pomocná proměnná pro kontrolní součet
 int RXpos = 0;                                                                 // pomocná proměnná pro pozici v přijímacím poli
 char *TXpos;                                                                   // ukazatel na char

        if(ComboBox1->ItemIndex == -1){                                         // test výběru modbus adresy
                 MessageBox(Handle,"Neplatná modbus adresa!","indikátor",MB_ICONINFORMATION); // při nezadaní modbus adresy výpis chyby
        }
        else{                                                                   // modbus adresa je zadaná
                TXpos = TX_DATA;                                                // složení modbus zprávy pro odeslání
                *TXpos++ = modbus_adresa;                                       // 1. byte modbus adresa
                *TXpos++ = Diagnostics;                                         // 2. byte diagnostika
                *TXpos++ = 0x00;                                                // 3. byte horní byte kódu podfunkce diagnostiky
                *TXpos++ = Return_Bus_Message_Count;                            // 4. byte spodní byte kódu podfunkce diagnostiky
                CRC = CRC16(TX_DATA,TXpos-TX_DATA);                             // výpočet CRC
                *TXpos++ = (CRC>>8);                                            // 5. byte CRC(horní byte z int)
                *TXpos++ = CRC;                                                 // 6. byte CRC(spodní byte z int)

                for(i=0;i<TXpos-TX_DATA;i++){		                        // cyklus zaslání bytů
                        Serial->WriteByte(TX_DATA[i]);                          // zaslání na port
                }

                for(i=0;i<8;i++){                                               // cyklus čtení bytů z portu
                        Serial->ReadByte(&RX_DATA[i]);                          // zápis do pole přijatých bytů
                        RXpos++;			                        // inkrementace pozice v poli přijatých bytů
                }

                if(RX_DATA[0]!=modbus_adresa){                                  // test prvního přijatého bytu
                        MessageBox(Handle,"Slave zařízení neodpovídá!","indikátor",MB_ICONINFORMATION); // jestliže se nerovná zadané modbus adrese výpis chyby
                }
                else{                                                           // první přijtý byte je adresa slave
                        if(RX_DATA[1]==0x88)RXpos = 5;                          // test druhého přijtého bytu jetliže obsahuje chybovou funkci je počet přijatých bytu 5
                        CRC = (RX_DATA[RXpos-1] << 8 | RX_DATA[RXpos-2]);       // čtení CRC z přijaté zprávy a převod dvou bytu na jeden int
                        if (CRC == (CRC16(RX_DATA,RXpos-2))){                   // výpočet a porovnání CRC
                                if((RX_DATA[1]==0x88)&&(RX_DATA[2]==0x01))MessageBox(Handle,"Kód chyby 0x01 - Neplatný kód funkce!","Chybová funkce funkce 0x88",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                else if((RX_DATA[1]==0x88)&&(RX_DATA[2]==0x03))MessageBox(Handle,"Kód chyby 0x03 - Chybný počet přijatých bytů v slave stanici!","Chybová funkce funkce 0x88",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                else{                                           // druhý přijatý byte neobsahuje kód chyby
                                        Label91->Caption = ((RX_DATA[4]<<8)|(RX_DATA[5])); // převod dvou bytů na int a následný výpis čítače
                                }
                        }
                        else{                                                   // přijaté CRC a vypočtené se nerovná
                                MessageBox(Handle,"Chyba kontrolního součtu CRC!","indikátor",MB_ICONINFORMATION); // výpis chyby
                        }
                }
                Label76->Caption = TX_DATA[0];                                  // výpis 1. vyslaného bytu
                Label77->Caption = TX_DATA[1];                                  // výpis 2. vyslaného bytu
                Label78->Caption = TX_DATA[2];                                  // výpis 3. vyslaného bytu
                Label79->Caption = TX_DATA[3];                                  // výpis 4. vyslaného bytu
                Label80->Caption = TX_DATA[4];                                  // výpis 5. vyslaného bytu
                Label81->Caption = TX_DATA[5];                                  // výpis 6. vyslaného bytu
                Label82->Caption = TX_DATA[6];                                  // výpis 7. vyslaného bytu
                Label83->Caption = TX_DATA[7];                                  // výpis 8. vyslaného bytu
                Label84->Caption = TX_DATA[8];                                  // výpis 9. vyslaného bytu
                Label85->Caption = TX_DATA[9];                                  // výpis 10. vyslaného bytu
                Label86->Caption = TX_DATA[10];                                 // výpis 11. vyslaného bytu

                Label65->Caption = RX_DATA[0];                                  // výpis 1. přijatého bytu
                Label66->Caption = RX_DATA[1];                                  // výpis 2. přijatého bytu
                Label67->Caption = RX_DATA[2];                                  // výpis 3. přijatého bytu
                Label68->Caption = RX_DATA[3];                                  // výpis 4. přijatého bytu
                Label69->Caption = RX_DATA[4];                                  // výpis 5. přijatého bytu
                Label70->Caption = RX_DATA[5];                                  // výpis 6. přijatého bytu
                Label71->Caption = RX_DATA[6];                                  // výpis 7. přijatého bytu
                Label72->Caption = RX_DATA[7];                                  // výpis 8. přijatého bytu
                Label73->Caption = RX_DATA[8];                                  // výpis 9. přijatého bytu
                Label74->Caption = RX_DATA[9];                                  // výpis 10. přijatého bytu
                Label75->Caption = RX_DATA[10];                                 // výpis 11. přijatého bytu

                for(i=0;i<10;i++){                                               // cyklus vynulování vysílacího a přijímacího pole
                        RX_DATA[i]=0;                                           // vynulování přijímacího pole
                        TX_DATA[i]=0;                                           // vynulování vysílacího pole
                }
        }
}
/*-------------------------funkce tlačítka Vynuluj čítače----------------------*/
void __fastcall TMainForm::Button11Click(TObject *Sender)
{
 int i;                                                                         // pomocná promenná pro cyklus for
 int CRC;                                                                       // pomocná proměnná pro kontrolní součet
 int RXpos = 0;                                                                 // pomocná proměnná pro pozici v přijímacím poli
 char *TXpos;                                                                   // ukazatel na char

        if(ComboBox1->ItemIndex == -1){                                         // test výběru modbus adresy
                 MessageBox(Handle,"Neplatná modbus adresa!","indikátor",MB_ICONINFORMATION); // při nezadaní modbus adresy výpis chyby
        }
        else{                                                                   // modbus adresa je zadaná
                TXpos = TX_DATA;                                                // složení modbus zprávy pro odeslání
                *TXpos++ = modbus_adresa;                                       // 1. byte modbus adresa
                *TXpos++ = Diagnostics;                                         // 2. byte diagnostika
                *TXpos++ = 0x00;                                                // 3. byte horní byte kódu podfunkce diagnostiky
                *TXpos++ = Clear_Counters;                                      // 4. byte spodní byte kódu podfunkce diagnostiky
                CRC = CRC16(TX_DATA,TXpos-TX_DATA);                             // výpočet CRC
                *TXpos++ = (CRC>>8);                                            // 5. byte CRC(horní byte z int)
                *TXpos++ = CRC;                                                 // 6. byte CRC(spodní byte z int)

                for(i=0;i<TXpos-TX_DATA;i++){		                        // cyklus zaslání bytů
                        Serial->WriteByte(TX_DATA[i]);                          // zaslání na port
                }

                for(i=0;i<6;i++){                                               // cyklus čtení bytů z portu
                        Serial->ReadByte(&RX_DATA[i]);                          // zápis do pole přijatých bytů
                        RXpos++;			                        // inkrementace pozice v poli přijatých bytů
                }

                if(RX_DATA[0]!=modbus_adresa){                                  // test prvního přijatého bytu
                        MessageBox(Handle,"Slave zařízení neodpovídá!","indikátor",MB_ICONINFORMATION); // jestliže se nerovná zadané modbus adrese výpis chyby
                }
                else{                                                           // první přijtý byte je adresa slave
                        CRC = (RX_DATA[RXpos-1] << 8 | RX_DATA[RXpos-2]);       // čtení CRC z přijaté zprávy a převod dvou bytu na jeden int
                        if (CRC == (CRC16(RX_DATA,RXpos-2))){                   // výpočet a porovnání CRC
                                if((RX_DATA[1]==0x88)&&(RX_DATA[2]==0x01))MessageBox(Handle,"Kód chyby 0x01 - Neplatný kód funkce!","Chybová funkce funkce 0x88",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                if((RX_DATA[1]==0x88)&&(RX_DATA[2]==0x03))MessageBox(Handle,"Kód chyby 0x03 - Chybný počet přijatých bytů v slave stanici!","Chybová funkce funkce 0x88",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                        }
                        else{                                                   // přijaté CRC a vypočtené se nerovná
                                MessageBox(Handle,"Chyba kontrolního součtu CRC!","indikátor",MB_ICONINFORMATION); // výpis chyby
                        }
                }
                Label76->Caption = TX_DATA[0];                                  // výpis 1. vyslaného bytu
                Label77->Caption = TX_DATA[1];                                  // výpis 2. vyslaného bytu
                Label78->Caption = TX_DATA[2];                                  // výpis 3. vyslaného bytu
                Label79->Caption = TX_DATA[3];                                  // výpis 4. vyslaného bytu
                Label80->Caption = TX_DATA[4];                                  // výpis 5. vyslaného bytu
                Label81->Caption = TX_DATA[5];                                  // výpis 6. vyslaného bytu
                Label82->Caption = TX_DATA[6];                                  // výpis 7. vyslaného bytu
                Label83->Caption = TX_DATA[7];                                  // výpis 8. vyslaného bytu
                Label84->Caption = TX_DATA[8];                                  // výpis 9. vyslaného bytu
                Label85->Caption = TX_DATA[9];                                  // výpis 10. vyslaného bytu
                Label86->Caption = TX_DATA[10];                                 // výpis 11. vyslaného bytu

                Label65->Caption = RX_DATA[0];                                  // výpis 1. přijatého bytu
                Label66->Caption = RX_DATA[1];                                  // výpis 2. přijatého bytu
                Label67->Caption = RX_DATA[2];                                  // výpis 3. přijatého bytu
                Label68->Caption = RX_DATA[3];                                  // výpis 4. přijatého bytu
                Label69->Caption = RX_DATA[4];                                  // výpis 5. přijatého bytu
                Label70->Caption = RX_DATA[5];                                  // výpis 6. přijatého bytu
                Label71->Caption = RX_DATA[6];                                  // výpis 7. přijatého bytu
                Label72->Caption = RX_DATA[7];                                  // výpis 8. přijatého bytu
                Label73->Caption = RX_DATA[8];                                  // výpis 9. přijatého bytu
                Label74->Caption = RX_DATA[9];                                  // výpis 10. přijatého bytu
                Label75->Caption = RX_DATA[10];                                 // výpis 11. přijatého bytu

                for(i=0;i<6;i++){                                               // cyklus vynulování vysílacího a přijímacího pole
                        RX_DATA[i]=0;                                           // vynulování přijímacího pole
                        TX_DATA[i]=0;                                           // vynulování vysílacího pole
                }
        }
}
/*------------------------------funkce tlačítka CPT2---------------------------*/
void __fastcall TMainForm::Button15Click(TObject *Sender)
{
 int i;                                                                         // pomocná promenná pro cyklus for
 int CRC;                                                                       // pomocná proměnná pro kontrolní součet
 int RXpos = 0;                                                                 // pomocná proměnná pro pozici v přijímacím poli
 char *TXpos;                                                                   // ukazatel na char

        if(ComboBox1->ItemIndex == -1){                                         // test výběru modbus adresy
                 MessageBox(Handle,"Neplatná modbus adresa!","indikátor",MB_ICONINFORMATION); // při nezadaní modbus adresy výpis chyby
        }
        else{                                                                   // modbus adresa je zadaná
                TXpos = TX_DATA;                                                // složení modbus zprávy pro odeslání
                *TXpos++ = modbus_adresa;                                       // 1. byte modbus adresa
                *TXpos++ = Diagnostics;                                         // 2. byte diagnostika
                *TXpos++ = 0x00;                                                // 3. byte horní byte kódu podfunkce diagnostiky
                *TXpos++ = Return_Bus_Communication_Error_Count;                // 4. byte spodní byte kódu podfunkce diagnostiky
                CRC = CRC16(TX_DATA,TXpos-TX_DATA);                             // výpočet CRC
                *TXpos++ = (CRC>>8);                                            // 5. byte CRC(horní byte z int)
                *TXpos++ = CRC;                                                 // 6. byte CRC(spodní byte z int)

                for(i=0;i<TXpos-TX_DATA;i++){		                        // cyklus zaslání bytů
                        Serial->WriteByte(TX_DATA[i]);                          // zaslání na port
                }

                for(i=0;i<8;i++){                                               // cyklus čtení bytů z portu
                        Serial->ReadByte(&RX_DATA[i]);                          // zápis do pole přijatých bytů
                        RXpos++;			                        // inkrementace pozice v poli přijatých bytů
                }

                if(RX_DATA[0]!=modbus_adresa){                                  // test prvního přijatého bytu
                        MessageBox(Handle,"Slave zařízení neodpovídá!","indikátor",MB_ICONINFORMATION); // jestliže se nerovná zadané modbus adrese výpis chyby
                }
                else{                                                           // první přijtý byte je adresa slave
                        if(RX_DATA[1]==0x88)RXpos = 5;                          // test druhého přijtého bytu jetliže obsahuje chybovou funkci je počet přijatých bytu 5
                        CRC = (RX_DATA[RXpos-1] << 8 | RX_DATA[RXpos-2]);       // čtení CRC z přijaté zprávy a převod dvou bytu na jeden int
                        if (CRC == (CRC16(RX_DATA,RXpos-2))){                   // výpočet a porovnání CRC
                                if((RX_DATA[1]==0x88)&&(RX_DATA[2]==0x01))MessageBox(Handle,"Kód chyby 0x01 - Neplatný kód funkce!","Chybová funkce funkce 0x88",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                else if((RX_DATA[1]==0x88)&&(RX_DATA[2]==0x03))MessageBox(Handle,"Kód chyby 0x03 - Chybný počet přijatých bytů v slave stanici!","Chybová funkce funkce 0x88",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                else{                                           // druhý přijatý byte neobsahuje kód chyby
                                        Label92->Caption = ((RX_DATA[4]<<8)|(RX_DATA[5])); // převod dvou bytů na int a následný výpis čítače
                                }
                        }
                        else{                                                   // přijaté CRC a vypočtené se nerovná
                                MessageBox(Handle,"Chyba kontrolního součtu CRC!","indikátor",MB_ICONINFORMATION); // výpis chyby
                        }
                }
                Label76->Caption = TX_DATA[0];                                  // výpis 1. vyslaného bytu
                Label77->Caption = TX_DATA[1];                                  // výpis 2. vyslaného bytu
                Label78->Caption = TX_DATA[2];                                  // výpis 3. vyslaného bytu
                Label79->Caption = TX_DATA[3];                                  // výpis 4. vyslaného bytu
                Label80->Caption = TX_DATA[4];                                  // výpis 5. vyslaného bytu
                Label81->Caption = TX_DATA[5];                                  // výpis 6. vyslaného bytu
                Label82->Caption = TX_DATA[6];                                  // výpis 7. vyslaného bytu
                Label83->Caption = TX_DATA[7];                                  // výpis 8. vyslaného bytu
                Label84->Caption = TX_DATA[8];                                  // výpis 9. vyslaného bytu
                Label85->Caption = TX_DATA[9];                                  // výpis 10. vyslaného bytu
                Label86->Caption = TX_DATA[10];                                 // výpis 11. vyslaného bytu

                Label65->Caption = RX_DATA[0];                                  // výpis 1. přijatého bytu
                Label66->Caption = RX_DATA[1];                                  // výpis 2. přijatého bytu
                Label67->Caption = RX_DATA[2];                                  // výpis 3. přijatého bytu
                Label68->Caption = RX_DATA[3];                                  // výpis 4. přijatého bytu
                Label69->Caption = RX_DATA[4];                                  // výpis 5. přijatého bytu
                Label70->Caption = RX_DATA[5];                                  // výpis 6. přijatého bytu
                Label71->Caption = RX_DATA[6];                                  // výpis 7. přijatého bytu
                Label72->Caption = RX_DATA[7];                                  // výpis 8. přijatého bytu
                Label73->Caption = RX_DATA[8];                                  // výpis 9. přijatého bytu
                Label74->Caption = RX_DATA[9];                                  // výpis 10. přijatého bytu
                Label75->Caption = RX_DATA[10];                                 // výpis 11. přijatého bytu

                for(i=0;i<8;i++){                                               // cyklus vynulování vysílacího a přijímacího pole
                        RX_DATA[i]=0;                                           // vynulování přijímacího pole
                        TX_DATA[i]=0;                                           // vynulování vysílacího pole
                }
        }
}
/*------------------------------funkce tlačítka CPT3---------------------------*/
void __fastcall TMainForm::Button16Click(TObject *Sender)
{
 int i;                                                                         // pomocná promenná pro cyklus for
 int CRC;                                                                       // pomocná proměnná pro kontrolní součet
 int RXpos = 0;                                                                 // pomocná proměnná pro pozici v přijímacím poli
 char *TXpos;                                                                   // ukazatel na char

        if(ComboBox1->ItemIndex == -1){                                         // test výběru modbus adresy
                 MessageBox(Handle,"Neplatná modbus adresa!","indikátor",MB_ICONINFORMATION); // při nezadaní modbus adresy výpis chyby
        }
        else{                                                                   // modbus adresa je zadaná
                TXpos = TX_DATA;                                                // složení modbus zprávy pro odeslání
                *TXpos++ = modbus_adresa;                                       // 1. byte modbus adresa
                *TXpos++ = Diagnostics;                                         // 2. byte diagnostika
                *TXpos++ = 0x00;                                                // 3. byte horní byte kódu podfunkce diagnostiky
                *TXpos++ = Return_Bus_Exception_Error_Count;                    // 4. byte spodní byte kódu podfunkce diagnostiky
                CRC = CRC16(TX_DATA,TXpos-TX_DATA);                             // výpočet CRC
                *TXpos++ = (CRC>>8);                                            // 5. byte CRC(horní byte z int)
                *TXpos++ = CRC;                                                 // 6. byte CRC(spodní byte z int)

                for(i=0;i<TXpos-TX_DATA;i++){		                        // cyklus zaslání bytů
                        Serial->WriteByte(TX_DATA[i]);                          // zaslání na port
                }

                for(i=0;i<8;i++){                                               // cyklus čtení bytů z portu
                        Serial->ReadByte(&RX_DATA[i]);                          // zápis do pole přijatých bytů
                        RXpos++;			                        // inkrementace pozice v poli přijatých bytů
                }

                if(RX_DATA[0]!=modbus_adresa){                                  // test prvního přijatého bytu
                        MessageBox(Handle,"Slave zařízení neodpovídá!","indikátor",MB_ICONINFORMATION); // jestliže se nerovná zadané modbus adrese výpis chyby
                }
                else{                                                           // první přijtý byte je adresa slave
                        if(RX_DATA[1]==0x88)RXpos = 5;                          // test druhého přijtého bytu jetliže obsahuje chybovou funkci je počet přijatých bytu 5
                        CRC = (RX_DATA[RXpos-1] << 8 | RX_DATA[RXpos-2]);       // čtení CRC z přijaté zprávy a převod dvou bytu na jeden int
                        if (CRC == (CRC16(RX_DATA,RXpos-2))){                   // výpočet a porovnání CRC
                                if((RX_DATA[1]==0x88)&&(RX_DATA[2]==0x01))MessageBox(Handle,"Kód chyby 0x01 - Neplatný kód funkce!","Chybová funkce funkce 0x88",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                else if((RX_DATA[1]==0x88)&&(RX_DATA[2]==0x03))MessageBox(Handle,"Kód chyby 0x03 - Chybný počet přijatých bytů v slave stanici!","Chybová funkce funkce 0x88",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                else{                                           // druhý přijatý byte neobsahuje kód chyby
                                        Label93->Caption = ((RX_DATA[4]<<8)|(RX_DATA[5])); // převod dvou bytů na int a následný výpis čítače
                                }
                        }
                        else{                                                   // přijaté CRC a vypočtené se nerovná
                                MessageBox(Handle,"Chyba kontrolního součtu CRC!","indikátor",MB_ICONINFORMATION); // výpis chyby
                        }
                }
                Label76->Caption = TX_DATA[0];                                  // výpis 1. vyslaného bytu
                Label77->Caption = TX_DATA[1];                                  // výpis 2. vyslaného bytu
                Label78->Caption = TX_DATA[2];                                  // výpis 3. vyslaného bytu
                Label79->Caption = TX_DATA[3];                                  // výpis 4. vyslaného bytu
                Label80->Caption = TX_DATA[4];                                  // výpis 5. vyslaného bytu
                Label81->Caption = TX_DATA[5];                                  // výpis 6. vyslaného bytu
                Label82->Caption = TX_DATA[6];                                  // výpis 7. vyslaného bytu
                Label83->Caption = TX_DATA[7];                                  // výpis 8. vyslaného bytu
                Label84->Caption = TX_DATA[8];                                  // výpis 9. vyslaného bytu
                Label85->Caption = TX_DATA[9];                                  // výpis 10. vyslaného bytu
                Label86->Caption = TX_DATA[10];                                 // výpis 11. vyslaného bytu

                Label65->Caption = RX_DATA[0];                                  // výpis 1. přijatého bytu
                Label66->Caption = RX_DATA[1];                                  // výpis 2. přijatého bytu
                Label67->Caption = RX_DATA[2];                                  // výpis 3. přijatého bytu
                Label68->Caption = RX_DATA[3];                                  // výpis 4. přijatého bytu
                Label69->Caption = RX_DATA[4];                                  // výpis 5. přijatého bytu
                Label70->Caption = RX_DATA[5];                                  // výpis 6. přijatého bytu
                Label71->Caption = RX_DATA[6];                                  // výpis 7. přijatého bytu
                Label72->Caption = RX_DATA[7];                                  // výpis 8. přijatého bytu
                Label73->Caption = RX_DATA[8];                                  // výpis 9. přijatého bytu
                Label74->Caption = RX_DATA[9];                                  // výpis 10. přijatého bytu
                Label75->Caption = RX_DATA[10];                                 // výpis 11. přijatého bytu

                for(i=0;i<8;i++){                                               // cyklus vynulování vysílacího a přijímacího pole
                        RX_DATA[i]=0;                                           // vynulování přijímacího pole
                        TX_DATA[i]=0;                                           // vynulování vysílacího pole
                }
        }
}
/*------------------------------funkce tlačítka CPT4---------------------------*/
void __fastcall TMainForm::Button17Click(TObject *Sender)
{
 int i;                                                                         // pomocná promenná pro cyklus for
 int CRC;                                                                       // pomocná proměnná pro kontrolní součet
 int RXpos = 0;                                                                 // pomocná proměnná pro pozici v přijímacím poli
 char *TXpos;                                                                   // ukazatel na char

        if(ComboBox1->ItemIndex == -1){                                         // test výběru modbus adresy
                 MessageBox(Handle,"Neplatná modbus adresa!","indikátor",MB_ICONINFORMATION); // při nezadaní modbus adresy výpis chyby
        }
        else{                                                                   // modbus adresa je zadaná
                TXpos = TX_DATA;                                                // složení modbus zprávy pro odeslání
                *TXpos++ = modbus_adresa;                                       // 1. byte modbus adresa
                *TXpos++ = Diagnostics;                                         // 2. byte diagnostika
                *TXpos++ = 0x00;                                                // 3. byte horní byte kódu podfunkce diagnostiky
                *TXpos++ = Return_Slave_Message_Count;                          // 4. byte spodní byte kódu podfunkce diagnostiky
                CRC = CRC16(TX_DATA,TXpos-TX_DATA);                             // výpočet CRC
                *TXpos++ = (CRC>>8);                                            // 5. byte CRC(horní byte z int)
                *TXpos++ = CRC;                                                 // 6. byte CRC(spodní byte z int)

                for(i=0;i<TXpos-TX_DATA;i++){		                        // cyklus zaslání bytů
                        Serial->WriteByte(TX_DATA[i]);                          // zaslání na port
                }

                for(i=0;i<8;i++){                                               // cyklus čtení bytů z portu
                        Serial->ReadByte(&RX_DATA[i]);                          // zápis do pole přijatých bytů
                        RXpos++;			                        // inkrementace pozice v poli přijatých bytů
                }

                if(RX_DATA[0]!=modbus_adresa){                                  // test prvního přijatého bytu
                        MessageBox(Handle,"Slave zařízení neodpovídá!","indikátor",MB_ICONINFORMATION); // jestliže se nerovná zadané modbus adrese výpis chyby
                }
                else{                                                           // první přijtý byte je adresa slave
                        if(RX_DATA[1]==0x88)RXpos = 5;                          // test druhého přijtého bytu jetliže obsahuje chybovou funkci je počet přijatých bytu 5
                        CRC = (RX_DATA[RXpos-1] << 8 | RX_DATA[RXpos-2]);       // čtení CRC z přijaté zprávy a převod dvou bytu na jeden int
                        if (CRC == (CRC16(RX_DATA,RXpos-2))){                   // výpočet a porovnání CRC
                                if((RX_DATA[1]==0x88)&&(RX_DATA[2]==0x01))MessageBox(Handle,"Kód chyby 0x01 - Neplatný kód funkce!","Chybová funkce funkce 0x88",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                else if((RX_DATA[1]==0x88)&&(RX_DATA[2]==0x03))MessageBox(Handle,"Kód chyby 0x03 - Chybný počet přijatých bytů v slave stanici!","Chybová funkce funkce 0x88",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                else{                                           // druhý přijatý byte neobsahuje kód chyby
                                        Label94->Caption = ((RX_DATA[4]<<8)|(RX_DATA[5])); // převod dvou bytů na int a následný výpis čítače
                                }
                        }
                        else{                                                   // přijaté CRC a vypočtené se nerovná
                                MessageBox(Handle,"Chyba kontrolního součtu CRC!","indikátor",MB_ICONINFORMATION); // výpis chyby
                        }
                }
                Label76->Caption = TX_DATA[0];                                  // výpis 1. vyslaného bytu
                Label77->Caption = TX_DATA[1];                                  // výpis 2. vyslaného bytu
                Label78->Caption = TX_DATA[2];                                  // výpis 3. vyslaného bytu
                Label79->Caption = TX_DATA[3];                                  // výpis 4. vyslaného bytu
                Label80->Caption = TX_DATA[4];                                  // výpis 5. vyslaného bytu
                Label81->Caption = TX_DATA[5];                                  // výpis 6. vyslaného bytu
                Label82->Caption = TX_DATA[6];                                  // výpis 7. vyslaného bytu
                Label83->Caption = TX_DATA[7];                                  // výpis 8. vyslaného bytu
                Label84->Caption = TX_DATA[8];                                  // výpis 9. vyslaného bytu
                Label85->Caption = TX_DATA[9];                                  // výpis 10. vyslaného bytu
                Label86->Caption = TX_DATA[10];                                 // výpis 11. vyslaného bytu

                Label65->Caption = RX_DATA[0];                                  // výpis 1. přijatého bytu
                Label66->Caption = RX_DATA[1];                                  // výpis 2. přijatého bytu
                Label67->Caption = RX_DATA[2];                                  // výpis 3. přijatého bytu
                Label68->Caption = RX_DATA[3];                                  // výpis 4. přijatého bytu
                Label69->Caption = RX_DATA[4];                                  // výpis 5. přijatého bytu
                Label70->Caption = RX_DATA[5];                                  // výpis 6. přijatého bytu
                Label71->Caption = RX_DATA[6];                                  // výpis 7. přijatého bytu
                Label72->Caption = RX_DATA[7];                                  // výpis 8. přijatého bytu
                Label73->Caption = RX_DATA[8];                                  // výpis 9. přijatého bytu
                Label74->Caption = RX_DATA[9];                                  // výpis 10. přijatého bytu
                Label75->Caption = RX_DATA[10];                                 // výpis 11. přijatého bytu

                for(i=0;i<8;i++){                                               // cyklus vynulování vysílacího a přijímacího pole
                        RX_DATA[i]=0;                                           // vynulování přijímacího pole
                        TX_DATA[i]=0;                                           // vynulování vysílacího pole
                }
        }
}
/*------------------------------funkce tlačítka CPT5---------------------------*/
void __fastcall TMainForm::Button18Click(TObject *Sender)
{
 int i;                                                                         // pomocná promenná pro cyklus for
 int CRC;                                                                       // pomocná proměnná pro kontrolní součet
 int RXpos = 0;                                                                 // pomocná proměnná pro pozici v přijímacím poli
 char *TXpos;                                                                   // ukazatel na char

        if(ComboBox1->ItemIndex == -1){                                         // test výběru modbus adresy
                 MessageBox(Handle,"Neplatná modbus adresa!","indikátor",MB_ICONINFORMATION); // při nezadaní modbus adresy výpis chyby
        }
        else{                                                                   // modbus adresa je zadaná
                TXpos = TX_DATA;                                                // složení modbus zprávy pro odeslání
                *TXpos++ = modbus_adresa;                                       // 1. byte modbus adresa
                *TXpos++ = Diagnostics;                                         // 2. byte diagnostika
                *TXpos++ = 0x00;                                                // 3. byte horní byte kódu podfunkce diagnostiky
                *TXpos++ = Return_Slave_No_Response_Count;                      // 4. byte spodní byte kódu podfunkce diagnostiky
                CRC = CRC16(TX_DATA,TXpos-TX_DATA);                             // výpočet CRC
                *TXpos++ = (CRC>>8);                                            // 5. byte CRC(horní byte z int)
                *TXpos++ = CRC;                                                 // 6. byte CRC(spodní byte z int)

                for(i=0;i<TXpos-TX_DATA;i++){		                        // cyklus zaslání bytů
                        Serial->WriteByte(TX_DATA[i]);                          // zaslání na port
                }

                for(i=0;i<8;i++){                                               // cyklus čtení bytů z portu
                        Serial->ReadByte(&RX_DATA[i]);                          // zápis do pole přijatých bytů
                        RXpos++;			                        // inkrementace pozice v poli přijatých bytů
                }

                if(RX_DATA[0]!=modbus_adresa){                                  // test prvního přijatého bytu
                        MessageBox(Handle,"Slave zařízení neodpovídá!","indikátor",MB_ICONINFORMATION); // jestliže se nerovná zadané modbus adrese výpis chyby
                }
                else{                                                           // první přijtý byte je adresa slave
                        if(RX_DATA[1]==0x88)RXpos = 5;                          // test druhého přijtého bytu jetliže obsahuje chybovou funkci je počet přijatých bytu 5
                        CRC = (RX_DATA[RXpos-1] << 8 | RX_DATA[RXpos-2]);       // čtení CRC z přijaté zprávy a převod dvou bytu na jeden int
                        if (CRC == (CRC16(RX_DATA,RXpos-2))){                   // výpočet a porovnání CRC
                                if((RX_DATA[1]==0x88)&&(RX_DATA[2]==0x01))MessageBox(Handle,"Kód chyby 0x01 - Neplatný kód funkce!","Chybová funkce funkce 0x88",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                else if((RX_DATA[1]==0x88)&&(RX_DATA[2]==0x03))MessageBox(Handle,"Kód chyby 0x03 - Chybný počet přijatých bytů v slave stanici!","Chybová funkce funkce 0x88",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                else{                                           // druhý přijatý byte neobsahuje kód chyby
                                        Label95->Caption = ((RX_DATA[4]<<8)|(RX_DATA[5])); // převod dvou bytů na int a následný výpis čítače
                                }
                        }
                        else{                                                   // přijaté CRC a vypočtené se nerovná
                                MessageBox(Handle,"Chyba kontrolního součtu CRC!","indikátor",MB_ICONINFORMATION); // výpis chyby
                        }
                }
                Label76->Caption = TX_DATA[0];                                  // výpis 1. vyslaného bytu
                Label77->Caption = TX_DATA[1];                                  // výpis 2. vyslaného bytu
                Label78->Caption = TX_DATA[2];                                  // výpis 3. vyslaného bytu
                Label79->Caption = TX_DATA[3];                                  // výpis 4. vyslaného bytu
                Label80->Caption = TX_DATA[4];                                  // výpis 5. vyslaného bytu
                Label81->Caption = TX_DATA[5];                                  // výpis 6. vyslaného bytu
                Label82->Caption = TX_DATA[6];                                  // výpis 7. vyslaného bytu
                Label83->Caption = TX_DATA[7];                                  // výpis 8. vyslaného bytu
                Label84->Caption = TX_DATA[8];                                  // výpis 9. vyslaného bytu
                Label85->Caption = TX_DATA[9];                                  // výpis 10. vyslaného bytu
                Label86->Caption = TX_DATA[10];                                 // výpis 11. vyslaného bytu

                Label65->Caption = RX_DATA[0];                                  // výpis 1. přijatého bytu
                Label66->Caption = RX_DATA[1];                                  // výpis 2. přijatého bytu
                Label67->Caption = RX_DATA[2];                                  // výpis 3. přijatého bytu
                Label68->Caption = RX_DATA[3];                                  // výpis 4. přijatého bytu
                Label69->Caption = RX_DATA[4];                                  // výpis 5. přijatého bytu
                Label70->Caption = RX_DATA[5];                                  // výpis 6. přijatého bytu
                Label71->Caption = RX_DATA[6];                                  // výpis 7. přijatého bytu
                Label72->Caption = RX_DATA[7];                                  // výpis 8. přijatého bytu
                Label73->Caption = RX_DATA[8];                                  // výpis 9. přijatého bytu
                Label74->Caption = RX_DATA[9];                                  // výpis 10. přijatého bytu
                Label75->Caption = RX_DATA[10];                                 // výpis 11. přijatého bytu

                for(i=0;i<8;i++){                                               // cyklus vynulování vysílacího a přijímacího pole
                        RX_DATA[i]=0;                                           // vynulování přijímacího pole
                        TX_DATA[i]=0;                                           // vynulování vysílacího pole
                }
        }
}
/*------------------------------funkce tlačítka CPT8---------------------------*/
void __fastcall TMainForm::Button19Click(TObject *Sender)
{
 int i;                                                                         // pomocná promenná pro cyklus for
 int CRC;                                                                       // pomocná proměnná pro kontrolní součet
 int RXpos = 0;                                                                 // pomocná proměnná pro pozici v přijímacím poli
 char *TXpos;                                                                   // ukazatel na char

        if(ComboBox1->ItemIndex == -1){                                         // test výběru modbus adresy
                 MessageBox(Handle,"Neplatná modbus adresa!","indikátor",MB_ICONINFORMATION); // při nezadaní modbus adresy výpis chyby
        }
        else{                                                                   // modbus adresa je zadaná
                TXpos = TX_DATA;                                                // složení modbus zprávy pro odeslání
                *TXpos++ = modbus_adresa;                                       // 1. byte modbus adresa
                *TXpos++ = Diagnostics;                                         // 2. byte diagnostika
                *TXpos++ = 0x00;                                                // 3. byte horní byte kódu podfunkce diagnostiky
                *TXpos++ = Return_Bus_Character_Overrun_Count;                  // 4. byte spodní byte kódu podfunkce diagnostiky
                CRC = CRC16(TX_DATA,TXpos-TX_DATA);                             // výpočet CRC
                *TXpos++ = (CRC>>8);                                            // 5. byte CRC(horní byte z int)
                *TXpos++ = CRC;                                                 // 6. byte CRC(spodní byte z int)

                for(i=0;i<TXpos-TX_DATA;i++){		                        // cyklus zaslání bytů
                        Serial->WriteByte(TX_DATA[i]);                          // zaslání na port
                }

                for(i=0;i<8;i++){                                               // cyklus čtení bytů z portu
                        Serial->ReadByte(&RX_DATA[i]);                          // zápis do pole přijatých bytů
                        RXpos++;			                        // inkrementace pozice v poli přijatých bytů
                }

                if(RX_DATA[0]!=modbus_adresa){                                  // test prvního přijatého bytu
                        MessageBox(Handle,"Slave zařízení neodpovídá!","indikátor",MB_ICONINFORMATION); // jestliže se nerovná zadané modbus adrese výpis chyby
                }
                else{                                                           // první přijtý byte je adresa slave
                        if(RX_DATA[1]==0x88)RXpos = 5;                          // test druhého přijtého bytu jetliže obsahuje chybovou funkci je počet přijatých bytu 5
                        CRC = (RX_DATA[RXpos-1] << 8 | RX_DATA[RXpos-2]);       // čtení CRC z přijaté zprávy a převod dvou bytu na jeden int
                        if (CRC == (CRC16(RX_DATA,RXpos-2))){                   // výpočet a porovnání CRC
                                if((RX_DATA[1]==0x88)&&(RX_DATA[2]==0x01))MessageBox(Handle,"Kód chyby 0x01 - Neplatný kód funkce!","Chybová funkce funkce 0x88",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                else if((RX_DATA[1]==0x88)&&(RX_DATA[2]==0x03))MessageBox(Handle,"Kód chyby 0x03 - Chybný počet přijatých bytů v slave stanici!","Chybová funkce funkce 0x88",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                else{                                           // druhý přijatý byte neobsahuje kód chyby
                                        Label96->Caption = ((RX_DATA[4]<<8)|(RX_DATA[5])); // převod dvou bytů na int a následný výpis čítače
                                }
                        }
                        else{                                                   // přijaté CRC a vypočtené se nerovná
                                MessageBox(Handle,"Chyba kontrolního součtu CRC!","indikátor",MB_ICONINFORMATION); // výpis chyby
                        }
                }
                Label76->Caption = TX_DATA[0];                                  // výpis 1. vyslaného bytu
                Label77->Caption = TX_DATA[1];                                  // výpis 2. vyslaného bytu
                Label78->Caption = TX_DATA[2];                                  // výpis 3. vyslaného bytu
                Label79->Caption = TX_DATA[3];                                  // výpis 4. vyslaného bytu
                Label80->Caption = TX_DATA[4];                                  // výpis 5. vyslaného bytu
                Label81->Caption = TX_DATA[5];                                  // výpis 6. vyslaného bytu
                Label82->Caption = TX_DATA[6];                                  // výpis 7. vyslaného bytu
                Label83->Caption = TX_DATA[7];                                  // výpis 8. vyslaného bytu
                Label84->Caption = TX_DATA[8];                                  // výpis 9. vyslaného bytu
                Label85->Caption = TX_DATA[9];                                  // výpis 10. vyslaného bytu
                Label86->Caption = TX_DATA[10];                                 // výpis 11. vyslaného bytu

                Label65->Caption = RX_DATA[0];                                  // výpis 1. přijatého bytu
                Label66->Caption = RX_DATA[1];                                  // výpis 2. přijatého bytu
                Label67->Caption = RX_DATA[2];                                  // výpis 3. přijatého bytu
                Label68->Caption = RX_DATA[3];                                  // výpis 4. přijatého bytu
                Label69->Caption = RX_DATA[4];                                  // výpis 5. přijatého bytu
                Label70->Caption = RX_DATA[5];                                  // výpis 6. přijatého bytu
                Label71->Caption = RX_DATA[6];                                  // výpis 7. přijatého bytu
                Label72->Caption = RX_DATA[7];                                  // výpis 8. přijatého bytu
                Label73->Caption = RX_DATA[8];                                  // výpis 9. přijatého bytu
                Label74->Caption = RX_DATA[9];                                  // výpis 10. přijatého bytu
                Label75->Caption = RX_DATA[10];                                 // výpis 11. přijatého bytu

                for(i=0;i<8;i++){                                               // cyklus vynulování vysílacího a přijímacího pole
                        RX_DATA[i]=0;                                           // vynulování přijímacího pole
                        TX_DATA[i]=0;                                           // vynulování vysílacího pole
                }
        }
}
/*---------------------funkce tlačítka Identifikace zařízení-------------------*/
void __fastcall TMainForm::Button20Click(TObject *Sender)
{
 int i;                                                                         // pomocná promenná pro cyklus for
 int CRC;                                                                       // pomocná proměnná pro kontrolní součet
 int RXpos = 0;                                                                 // pomocná proměnná pro pozici v přijímacím poli
 char *TXpos;                                                                   // ukazatel na char
 char znak[1];                                                                  // pole pro jeden znak
 char Vyrobce[10];                                                              // pole znaků pro výrobce
 char Kod[30];                                                                  // pole znaků pro kód
 char Verze[5];                                                                 // pole znaků pro verzi
        for(i=0;i<10;i++){                                                      // cyklus vynulování pole
                Vyrobce[i] = 0;                                                 // vynulování pole výrobce
        }
        for(i=0;i<30;i++){                                                      // cyklus vynulování pole
                Kod[i] = 0;                                                     // vynulování pole kód
        }
        for(i=0;i<4;i++){                                                       // cyklus vynulování pole
                Verze[i] = 0;                                                   // vynulování pole verze
        }

        if(ComboBox1->ItemIndex == -1){                                         // test výběru modbus adresy
                 MessageBox(Handle,"Neplatná modbus adresa!","indikátor",MB_ICONINFORMATION); // při nezadaní modbus adresy výpis chyby
        }
        else{                                                                   // modbus adresa je zadaná
                TXpos = TX_DATA;                                                // složení modbus zprávy pro odeslání
                *TXpos++ = modbus_adresa;                                       // 1. byte modbus adresa
                *TXpos++ = Read_Device_Identification;                          // 2. čtení identifikace zařízení
                *TXpos++ = MEI;                                                 // 3. byte MEI
                *TXpos++ = 0x00;                                                // 4. byte ID kód
                *TXpos++ = 0x01;                                                // 5. byte Objekt ID
                CRC = CRC16(TX_DATA,TXpos-TX_DATA);                             // výpočet CRC
                *TXpos++ = (CRC>>8);                                            // 6. byte CRC(horní byte z int)
                *TXpos++ = CRC;                                                 // 7. byte CRC(spodní byte z int)

                for(i=0;i<TXpos-TX_DATA;i++){		                        // cyklus zaslání bytů
                        Serial->WriteByte(TX_DATA[i]);                          // zaslání na port
                }

                for(i=0;i<56;i++){                                              // cyklus čtení bytů z portu
                        Serial->ReadByte(&RX_DATA[i]);                          // zápis do pole přijatých bytů
                        RXpos++;			                        // inkrementace pozice v poli přijatých bytů
                }

                if(RX_DATA[0]!=modbus_adresa){                                  // test prvního přijatého bytu
                        MessageBox(Handle,"Slave zařízení neodpovídá!","indikátor",MB_ICONINFORMATION); // jestliže se nerovná zadané modbus adrese výpis chyby
                }
                else{                                                           // první přijtý byte je adresa slave
                        if(RX_DATA[1]==0xAB)RXpos = 5;                          // test druhého přijtého bytu jetliže obsahuje chybovou funkci je počet přijatých bytu 5
                        CRC = (RX_DATA[RXpos-1] << 8 | RX_DATA[RXpos-2]);       // čtení CRC z přijaté zprávy a převod dvou bytu na jeden int
                        if (CRC == (CRC16(RX_DATA,RXpos-2))){                   // výpočet a porovnání CRC
                                if((RX_DATA[1]==0xAB)&&(RX_DATA[2]==0x01))MessageBox(Handle,"Kód chyby 0x01 - Neplatný kód funkce!","Chybová funkce funkce 0xAB",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                else if((RX_DATA[1]==0xAB)&&(RX_DATA[2]==0x03))MessageBox(Handle,"Kód chyby 0x03 - Chybný počet přijatých bytů v slave stanici!","Chybová funkce funkce 0xAB",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                else{                                           // druhý přijatý byte neobsahuje kód chyby
                                        for(i=10;i<10+RX_DATA[9];i++){          // cyklus čtení identifikace výrobce
                                                sprintf(znak,"%c",RX_DATA[i]);  // převod přijatého bytu na znak
                                                strcat(Vyrobce,znak);           // spojení znaků
                                        }
                                        for(i=20;i<20+RX_DATA[19];i++){         // cyklus čtení identifikace kódu
                                                sprintf(znak,"%c",RX_DATA[i]);  // převod přijatého bytu na znak
                                                strcat(Kod,znak);               // spojení znaků
                                        }
                                        for(i=50;i<50+RX_DATA[49];i++){         // cyklus čtení identifikace verze
                                                sprintf(znak,"%c",RX_DATA[i]);  // převod přijatého bytu na znak
                                                strcat(Verze,znak);             // spojení znaků
                                        }
                                       Label97->Caption = Vyrobce;              // výpis Výrobce
                                       Label98->Caption = Kod;                  // výpis kódu
                                       Label99->Caption = Verze;                // výpis verze
                                }
                        }
                        else{                                                   // přijaté CRC a vypočtené se nerovná
                                MessageBox(Handle,"Chyba kontrolního součtu CRC!","indikátor",MB_ICONINFORMATION); // výpis chyby
                        }
                }
                Label76->Caption = TX_DATA[0];                                  // výpis 1. vyslaného bytu
                Label77->Caption = TX_DATA[1];                                  // výpis 2. vyslaného bytu
                Label78->Caption = TX_DATA[2];                                  // výpis 3. vyslaného bytu
                Label79->Caption = TX_DATA[3];                                  // výpis 4. vyslaného bytu
                Label80->Caption = TX_DATA[4];                                  // výpis 5. vyslaného bytu
                Label81->Caption = TX_DATA[5];                                  // výpis 6. vyslaného bytu
                Label82->Caption = TX_DATA[6];                                  // výpis 7. vyslaného bytu
                Label83->Caption = TX_DATA[7];                                  // výpis 8. vyslaného bytu
                Label84->Caption = TX_DATA[8];                                  // výpis 9. vyslaného bytu
                Label85->Caption = TX_DATA[9];                                  // výpis 10. vyslaného bytu
                Label86->Caption = TX_DATA[10];                                 // výpis 11. vyslaného bytu

                Label65->Caption = RX_DATA[0];                                  // výpis 1. přijatého bytu
                Label66->Caption = RX_DATA[1];                                  // výpis 2. přijatého bytu
                Label67->Caption = RX_DATA[2];                                  // výpis 3. přijatého bytu
                Label68->Caption = RX_DATA[3];                                  // výpis 4. přijatého bytu
                Label69->Caption = RX_DATA[4];                                  // výpis 5. přijatého bytu
                Label70->Caption = RX_DATA[5];                                  // výpis 6. přijatého bytu
                Label71->Caption = RX_DATA[6];                                  // výpis 7. přijatého bytu
                Label72->Caption = RX_DATA[7];                                  // výpis 8. přijatého bytu
                Label73->Caption = RX_DATA[8];                                  // výpis 9. přijatého bytu
                Label74->Caption = RX_DATA[9];                                  // výpis 10. přijatého bytu
                Label75->Caption = RX_DATA[10];                                 // výpis 11. přijatého bytu

                for(i=0;i<56;i++){                                               // cyklus vynulování vysílacího a přijímacího pole
                        RX_DATA[i]=0;                                           // vynulování přijímacího pole
                        TX_DATA[i]=0;                                           // vynulování vysílacího pole
                }
        }
}
/*-----------------------------funkce tlačítka Reset---------------------------*/
void __fastcall TMainForm::Button21Click(TObject *Sender)
{
 int i;                                                                         // pomocná promenná pro cyklus for
 int CRC;                                                                       // pomocná proměnná pro kontrolní součet
 int RXpos = 0;                                                                 // pomocná proměnná pro pozici v přijímacím poli
 char *TXpos;                                                                   // ukazatel na char

        if(ComboBox1->ItemIndex == -1){                                         // test výběru modbus adresy
                 MessageBox(Handle,"Neplatná modbus adresa!","indikátor",MB_ICONINFORMATION); // při nezadaní modbus adresy výpis chyby
        }
        else{                                                                   // modbus adresa je zadaná
                TXpos = TX_DATA;                                                // složení modbus zprávy pro odeslání
                *TXpos++ = modbus_adresa;                                       // 1. byte modbus adresa
                *TXpos++ = Diagnostics;                                         // 2. byte diagnostika
                *TXpos++ = 0x00;                                                // 3. byte horní byte kódu podfunkce diagnostiky
                *TXpos++ = Restart_Communications_Option;                       // 4. byte spodní byte kódu podfunkce diagnostiky
                CRC = CRC16(TX_DATA,TXpos-TX_DATA);                             // výpočet CRC
                *TXpos++ = (CRC>>8);                                            // 5. byte CRC(horní byte z int)
                *TXpos++ = CRC;                                                 // 6. byte CRC(spodní byte z int)

                for(i=0;i<TXpos-TX_DATA;i++){		                        // cyklus zaslání bytů
                        Serial->WriteByte(TX_DATA[i]);                          // zaslání na port
                }

                for(i=0;i<6;i++){                                               // cyklus čtení bytů z portu
                        Serial->ReadByte(&RX_DATA[i]);                          // zápis do pole přijatých bytů
                        RXpos++;			                        // inkrementace pozice v poli přijatých bytů
                }

                if(RX_DATA[0]!=modbus_adresa){                                  // test prvního přijatého bytu
                        MessageBox(Handle,"Slave zařízení neodpovídá!","indikátor",MB_ICONINFORMATION); // jestliže se nerovná zadané modbus adrese výpis chyby
                }
                else{                                                           // první přijtý byte je adresa slave
                        if(RX_DATA[1]==0x88)RXpos = 5;                          // test druhého přijtého bytu jetliže obsahuje chybovou funkci je počet přijatých bytu 5
                        CRC = (RX_DATA[RXpos-1] << 8 | RX_DATA[RXpos-2]);       // čtení CRC z přijaté zprávy a převod dvou bytu na jeden int
                        if (CRC == (CRC16(RX_DATA,RXpos-2))){                   // výpočet a porovnání CRC
                                if((RX_DATA[1]==0x88)&&(RX_DATA[2]==0x01))MessageBox(Handle,"Kód chyby 0x01 - Neplatný kód funkce!","Chybová funkce funkce 0x88",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                                if((RX_DATA[1]==0x88)&&(RX_DATA[2]==0x03))MessageBox(Handle,"Kód chyby 0x03 - Chybný počet přijatých bytů v slave stanici!","Chybová funkce funkce 0x88",MB_ICONINFORMATION); // při shodě CRC výběr podle kódu chyby následný výpis chyby
                        }
                        else{                                                   // přijaté CRC a vypočtené se nerovná
                                MessageBox(Handle,"Chyba kontrolního součtu CRC!","indikátor",MB_ICONINFORMATION); // výpis chyby
                        }
                }
                Label76->Caption = TX_DATA[0];                                  // výpis 1. vyslaného bytu
                Label77->Caption = TX_DATA[1];                                  // výpis 2. vyslaného bytu
                Label78->Caption = TX_DATA[2];                                  // výpis 3. vyslaného bytu
                Label79->Caption = TX_DATA[3];                                  // výpis 4. vyslaného bytu
                Label80->Caption = TX_DATA[4];                                  // výpis 5. vyslaného bytu
                Label81->Caption = TX_DATA[5];                                  // výpis 6. vyslaného bytu
                Label82->Caption = TX_DATA[6];                                  // výpis 7. vyslaného bytu
                Label83->Caption = TX_DATA[7];                                  // výpis 8. vyslaného bytu
                Label84->Caption = TX_DATA[8];                                  // výpis 9. vyslaného bytu
                Label85->Caption = TX_DATA[9];                                  // výpis 10. vyslaného bytu
                Label86->Caption = TX_DATA[10];                                 // výpis 11. vyslaného bytu

                Label65->Caption = RX_DATA[0];                                  // výpis 1. přijatého bytu
                Label66->Caption = RX_DATA[1];                                  // výpis 2. přijatého bytu
                Label67->Caption = RX_DATA[2];                                  // výpis 3. přijatého bytu
                Label68->Caption = RX_DATA[3];                                  // výpis 4. přijatého bytu
                Label69->Caption = RX_DATA[4];                                  // výpis 5. přijatého bytu
                Label70->Caption = RX_DATA[5];                                  // výpis 6. přijatého bytu
                Label71->Caption = RX_DATA[6];                                  // výpis 7. přijatého bytu
                Label72->Caption = RX_DATA[7];                                  // výpis 8. přijatého bytu
                Label73->Caption = RX_DATA[8];                                  // výpis 9. přijatého bytu
                Label74->Caption = RX_DATA[9];                                  // výpis 10. přijatého bytu
                Label75->Caption = RX_DATA[10];                                 // výpis 11. přijatého bytu

                for(i=0;i<6;i++){                                               // cyklus vynulování vysílacího a přijímacího pole
                        RX_DATA[i]=0;                                           // vynulování přijímacího pole
                        TX_DATA[i]=0;                                           // vynulování vysílacího pole
                }
        }
}
//---------------------------------------------------------------------------



