/*--------------------------------------------*/
/*----------------header files----------------*/
/*--------------------------------------------*/
#include <REG51xD2.H>
#include "modbus.h"	
#include "SPI.h"
#include "LCD.h"
#include "CRC16.h"
#include "screen_button.h"
																													 
/*---------------------------------------globalni promenne--------------------------------------*/
 char modbus_button;					// promenná pro hodnotu tlacítek z modbus
 long XTALL;							// frekvence krystalového oscilátoru
 long BAUD_RATE;						// prenosová rychlost
 int MODBUS_ADDRES;		  				// modbus adresa modulu
 char PARITA;							// parita
 unsigned char RX_DATA[256];			// pole prijatých znaku		  
 unsigned char TX_DATA[256];			// pole odesílanych znaku
 unsigned char RXpos,TXpos;				// pozice v poli prijatých a odeslaných znaku 
 unsigned char TX_DATA_Len;				// pocet odesilanych znaku
 char timeout;			     			// citac pro preroceni casu 1.5 a 3.5 char
 char time_t15;							// indikace prekrocení casu 1,5char
 unsigned int CPT1;						// modbus CPT1 - pocet zprav 
 unsigned int CPT2;						// modbus CPT2 - pocet komunikacních chyb
 unsigned int CPT3;						// modbus CPT3 - pocet negativních odpovedí
 unsigned int CPT4;						// modbus CPT4 - pocet zpracovaných zpráv
 unsigned int CPT5;						// modbus CPT5 - pocet nezodpovezených zpráv
 unsigned int CPT8;						// modbus CPT8 - pocet ztracených zpráv(znaku)
 unsigned int count;	 				// citac poctu prijatych znaku
 unsigned int ModbusEvent;				// citac poctu komunikacnich udalosti
 unsigned int prepocet_timer2;			// pomocna promenna pro prepocet hodnot casovace2
 unsigned int prepocet_timer0;			// pomocna promenna pro prepocet hodnot casovace0
 bit restart;							// restart komunikace
 bit error_frame; 						// chyba zprávy
 bit cyclic_read;						// signalizace cyklického ctení

/*-------------------preruseni od casovace 0 (vyuziva 1. banku registru)------------------------*/
void timer0 (void) interrupt 1 using 1		
{
	timeout++;							   	// pri preteceni casovace0 se navysi timeout o 1
	ET0=0;								    // zakázání preruseni od casovace 0
	TL0 = (prepocet_timer0)&0xFF;		    // napleni TL0 predvolbou
	TH0 = (prepocet_timer0>>8)&0xFF;		// naplneni TH0 predvolbou
	TF0=0;									// vynulovaní príznaku pretecení
	ET0=1;		 						    // povolení prerušení od casovace 0
}
/*-------------------preruseni od seriove linky (vyuziva 3. banku registru)---------------------*/
void serial_line (void) interrupt 4 using 3
{
	timeout = 0;								// vynulovaní cítace pro prerocení casu 1.5 a 3.5 char
	if (RI)	 									// pokud jde o prerusení od prijatých dat
	{	
		if(RXpos<=255){							// test prekrocení poctu prijatých znaku
			if(time_t15 == 1)					// test prekrocení casu 1,5char mezi znaky 
				error_frame = 1;				// indikace chyby ve zpráve

				RX_DATA[RXpos++] = SBUF;		// zápis SBUF do konkretního místa pole prijatých znaku
				switch(PARITA){					// test parity
					case 0:						// pokud není nastavená zádná parita - nic se nevykonává
						break;
					case 1:	    				// pokud je nastavená lichá parita
						ACC = RX_DATA[RXpos-1];	// do akumulátoru se nacte práve prijatý znak
						if (RB8 == P){			// pokud se rovna priznak liché parity ACC s paritou prijatou, je to chyba parity
							error_frame = 1;    // indikace chyby ve zpráve
							CPT2++;				// navýseni cítace
						}
						break; 
					case 2:						// pokud je nastavená sudá parita
						ACC = RX_DATA[RXpos-1];	// do akumulátoru se nacte práve prijatý znak
						if (RB8 != P){			// pokud se nerovná príznak liché parity ACC s paritou prijatou, je to chyba parity
					    	error_frame = 1;	// indikace chyby ve zprave
							CPT2++;				// navýseni cítace
						}
						break;
				}
				TL0 = (prepocet_timer0)&0xFF;	  // naplení TL0 predvolbou
				TH0 = (prepocet_timer0>>8)&0xFF;  // naplení TH0 predvolbou
				TF0 = 0;						  // vynulovaní príznaku pretecení
				TR0 = 1;						  // spustení casovace 0
				count++;	  					  // inkrementace cítace prijatých bytu
		}
		else{		   							// prekrocení poctu prijatych znaku 
			CPT8++;								// navysení cítace 
			error_frame = 1;   					// indikace chyby ve zprave
		}
	}
	RI = 0;										// vynulovaní príznaku prerusení od prijatých dat sériove linky		
	  
	if (TI){					   				// pokud jde o preruseni od odeslanych dat
		if(TXpos<TX_DATA_Len){				    // odesílání dat 
			RS485 = 1;							// nastavení na vysílání
			SBUF=TX_DATA[TXpos++];				// do SBUF se nacte znak podle konkretní pozice TXpos
		}
		else{			 						// data odeslány 
			RS485 = 0;							// nastavení zpet na príjem
			TXpos=0;							// vynulování pozice TXpos
		}
		TI = 0;					   				// vynulování príznaku prerusení od odeslaných dat sériové linky
		TF0 = 0;								// vynulování príznaku pretecení casovace 0 
		TR0 = 1;								// spustení casovace 0
	}
}
/*------------------------------inicializace promenných pro Modbus------------------------------*/
void init_prom_modbus(){	   		// inicializace promenných pro Modbus
int i;								// pomocná promenna pro cyklus for

	modbus_button = 0;				// vynulování promenné pro stisk tlacítek pres Modbus
	XTALL = 0;					    // vynulování hodnoty krystalového rezonátoru
 	BAUD_RATE = 0;					// vynulování rychlosti
 	MODBUS_ADDRES = 0;		  		// vynulování Modbus adresy
 	PARITA = 0;	  					// vynulování parity
 	RXpos = 0;						// vynulování pozice v príjmovém bufferu
 	TXpos = 0;	   					// vynulování pozice ve vysílacím bufferu
 	TX_DATA_Len = 0;				// vynulování poctu odesílaných bytu
 	timeout = 0;				    // vynulování citace pro preroceni casu 1,5 a 3,5 char
 	time_t15 = 0;	 				// vynulování promenne pro signalizaci prekrocení casu 1,5charu
 	error_frame = 0;  				// vynulování poctu chyb 
	restart = 0;					// vynulování indikace restartu komunikace
	CPT1 = 0;					    // vynulování CPT1 - pocet zprav 
	CPT2 = 0;					    // vynulování CPT2 - pocet komunikacních chyb
	CPT3 = 0;					    // vynulování CPT3 - pocet negativních odpovedí
	CPT4 = 0;						// vynulování CPT4 - pocet zpracovaných zpráv
	CPT5 = 0;					    // vynulování CPT5 - pocet nezodpovezených zpráv
	CPT8 = 0;					    // vynulování CPT8 - pocet ztracených zpráv(znaku)
	count = 0;						// vynulování cítace  prijatých bytu
	ModbusEvent = 0;				// vynulování cítace komunikacnich událostí
 	prepocet_timer2 = 0;   			// vynulování promenné pro výpocet konstant pro casovac 2
	prepocet_timer0 = 0;		    // vynulování promenné pro výpocet konstant pro casovac 0
	cyclic_read = 0;			    // vynulování promenne pro signalizaci cyklického ctení
	for(i=0;i<255;i++){		  		// cyklus nulování príjmového a vysílacího bufferu
		RX_DATA[i] = 0;			    // nulování príjmového bufferu								
		TX_DATA[i] = 0;				// nulování vysílacího bufferu
	}
	XTALL = 30000000;				// hodnota krystalového rezonátoru 30MHz
	BAUD_RATE = 115200;				// defaultní nastavení rychlosti na 115200b/s
	MODBUS_ADDRES = 2;				// defaultní nastavení adresy na 2
	PARITA = 2;						// defaultní nastavemní parity na sudou (2=sudá,1=lichá,0=žádná)
}
/*-------------------------------------inicializace Modbus--------------------------------------*/
void init_modbus (void) 											
{
 		TMOD = 0x11;		// nastavení casovace 0 a casovace 1 do modu 1(16-bitový)
// 		TMOD = 0x12;        // nastaveni casovace 1 do modu 1(16-bitový) a casovace 0 do modu 2(8-bitovy, samoplnici)
		SCON = 0xC0;		// seriova linka - mod 3 (9-bitovy)
		T2CON = 0x30;		// nastavení casovece 2 - povoleni hodin prijiímace/vysílace  
 		prepocet_timer2 = (65536-(XTALL/(16*BAUD_RATE)));	// vypocet predvolby pro casovac 2 	
		TL2=RCAP2L=(prepocet_timer2)&0xFF;					// naplnení TL2 predvolbou 
		TH2=RCAP2H=(prepocet_timer2>>8)&0xFF;				// naplnení TH2 predvolbou
		TR2=1;

		if(BAUD_RATE >= 57600){	 							 // test podle rychlosti se vypocítá predvolba pro casovac 0
	    	prepocet_timer0 = (65356-(XTALL/(4*BAUD_RATE))); // výpocet predvolby pro casovac 0
		}
		else if(BAUD_RATE < 57600 && BAUD_RATE >= 19200){	 // test podle rychlosti se vypocítá predvolba pro casovac 0 											
	    	prepocet_timer0 = (65355-(XTALL/(4*BAUD_RATE))); // výpocet predvolby pro casovac 0
		}
		else prepocet_timer0 = (65352-(XTALL/(4*BAUD_RATE))); // výpocet predvolby pro casovac 0 

		TL0 = (prepocet_timer0)&0xFF;		// naplnení TL0 predvolbou
		TH0 = (prepocet_timer0>>8)&0xFF;	// naplnení TH0 predvolbou
//		TH0 = 256-(XTALL/(4*BAUD_RATE));				//režim RELOAD
//		TL0 = TH0;						   
		RS485 = 0;	// nastavení na príjem
		REN = 1;	// povoleni prijmu 
		ET0 = 1;	// povolení prerusení od casovace 0
		ES = 1;		// povolení prerusení od sériové linky
		EA = 1;	    // povolení vsech prerusení
}
/*--------------------------------------------modbus--------------------------------------------*/	   	
void modbus(){
 int i;					// pomocná promenná pro cyklus for 
 int CRC;				// pomocná promenná pro výpocet CRC
 unsigned char *pTXpos;	// ukazatel na char 

	if(restart == 1){		// test je-li restart komunikace
		init_prom_modbus();	// inicializace promenných modbusu 
		init_modbus();		// inicializace komunikace
	}
	else{	   				
		if(timeout >= 11)time_t15 = 1;	// test prekrocení casu 1,5char (nastavení signalizace prekrocení casu)
				if(timeout >= 26){		// test prekrocení casu 3,5char
					REN = 0;  			// zakázání príjmu sériového kanálu
					TR0 = 0;			// zastavení casovace 0
					TF0=0;				// vynulování príznaku pretecení casovace 0
					timeout = 0;		// vynulování cítace pretecení casovace 0
					time_t15 = 0;	  	// vynulování signalizace uplynutí casu 1,5char
					cyclic_read = 0;	// vynulování signalizace cyklického ctení
					if(error_frame == 1){	// test je-li v rámci chyba
						CPT2++;				// navýsení CPT2
					}
					else{				    // není-li chyba 
						if(RXpos < 3){		// test poctu prijatých znaku je-li mensí jak 3
							CPT2++;			// není-li vetsí navýsení CPT2
						}
						else{				// pocet prijatých znaku je vetsí jak 3
							CRC = (RX_DATA[RXpos-1] << 8 | RX_DATA[RXpos-2]);	// nactení prijatého CRC
							if (CRC != (CRC16(RX_DATA,RXpos-2))){	   			// výpocet CRC a následné porovnání
								CPT2++;										    // není-li shoda CRC navýsení CPT2
							}
							else{											    // vypoctené CRC je shodné s prijatým
								CPT1++;										    // navýsení cítace CPT1
								if((RX_DATA[0]==MODBUS_ADDRES)||(RX_DATA[0]==0)){	// test zda-li je prijatá modbus adresa shodná s nastavenou nebo zda-li se jedná o brodcast
									CPT4++;										    // navýsení cítace CPT4
									if(RX_DATA[0]!=0){								// test zda-li se jedná o brodcast adresu
											switch(RX_DATA[1]){	 					// podle prijaté funkce její následné vykonání

												/*--------------------------ctení stavu cívek---------------------------*/
												case 0x01: 	if(count != 8){						 		// test zda-li pocet prijatých bytu není roven 8
																pTXpos = TX_DATA;						// sestavení zprávy k odeslání  			 
																*pTXpos++ = RX_DATA[0];					// modbus adresa
														   		*pTXpos++ = RX_DATA[1]+0x80;			// kód funkce s chybovým kódem
																*pTXpos++ = 0x03;						// kód chyby
																CRC = CRC16(TX_DATA,pTXpos-TX_DATA);	// výpocet CRC
																*pTXpos++ = CRC >> 8;		  			// úprava CRC z int na char
																*pTXpos++ = CRC; 			   			// úprava CRC z int na char
																TX_DATA_Len = pTXpos-TX_DATA;			// pocet odesílaných znaku
																CPT3++;	   								// navýsení CPT3
																TI = 1;									// nastavení príznaku prerusení od odeslaných dat sériové linky
																while(timeout < 26);	  				// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																TR0 = 0;							    // zastavení casovace 0
															    TF0 = 0;								// vynulování príznaku pretecení od casovace 0
																break;
															}
															if((RX_DATA[2]!=0x00)||(RX_DATA[3]!=0xA0)){ // test pocatecni adresa mimo rozsah
																pTXpos = TX_DATA;						// sestavení zprávy k odeslání 
																*pTXpos++ = RX_DATA[0];					// modbus adresa
														   		*pTXpos++ = RX_DATA[1]+0x80;			// kód funkce s chybovým kódem
																*pTXpos++ = 0x02;						// kód chyby
																CRC = CRC16(TX_DATA,pTXpos-TX_DATA);	// výpocet CRC
																*pTXpos++ = CRC >> 8;					// úprava CRC z int na char
																*pTXpos++ = CRC; 						// úprava CRC z int na char
																TX_DATA_Len = pTXpos-TX_DATA;			// pocet odesílaných znaku
																CPT3++;									// navýsení CPT3
																TI = 1;									// nastavení príznaku prerusení od odeslaných dat sériové linky
																while(timeout < 26);					// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																TR0 = 0;							    // zastavení casovace 0
															    TF0 = 0;								// vynulování príznaku pretecení od casovace 0
																break; 
															}
															if((RX_DATA[4]!=0x00)||(RX_DATA[5]!=0x08)){ // test pocet výstupu mimo rozsah
																pTXpos = TX_DATA;						// sestavení zprávy k odeslání
																*pTXpos++ = RX_DATA[0];					// modbus adresa
														   		*pTXpos++ = RX_DATA[1]+0x80;			// kód funkce s chybovým kódem
																*pTXpos++ = 0x03;					    // kód chyby
																CRC = CRC16(TX_DATA,pTXpos-TX_DATA);	// výpocet CRC
																*pTXpos++ = CRC >> 8;					// úprava CRC z int na char
																*pTXpos++ = CRC; 						// úprava CRC z int na char
																TX_DATA_Len = pTXpos-TX_DATA;			// pocet odesílaných znaku
																CPT3++;									// navýsení CPT3
																TI = 1;								    // nastavení príznaku prerusení od odeslaných dat sériové linky
																while(timeout < 26);				    // cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																TR0 = 0;								// zastavení casovace 0
															    TF0 = 0;								// vynulování príznaku pretecení od casovace 0
																break; 
															}
															/*--odpoved--*/
															pTXpos = TX_DATA;					// sestavení zprávy k odeslání
															*pTXpos++ = RX_DATA[0];				// modbus adresa
															*pTXpos++ = RX_DATA[1];				// kód funkce
															*pTXpos++ = 1;						// pocet bytu 1
															*pTXpos++ = modbus_output_read;			// stavy jednotlivých digitálních výstupu
															CRC = CRC16(TX_DATA,pTXpos-TX_DATA);	// výpocet CRC
															*pTXpos++ = CRC >> 8; 					// úprava CRC z int na char
															*pTXpos++ = CRC; 						// úprava CRC z int na char
															TX_DATA_Len = pTXpos-TX_DATA;			// pocet odesílaných znaku
															TI = 1;									// nastavení príznaku prerusení od odeslaných dat sériové linky
															while(timeout < 26);				    // cekání na uplynutí casu 3,5char od posledního odeslaného znaku
															TR0 = 0;								// zastavení casovace 0
															TF0 = 0;								// vynulování príznaku pretecení od casovace 0
															ModbusEvent++;						    // navýsení cítace komunikacních událostí
															break;
												/*--------------------ctení stavu diskrétních vstupu--------------------*/				  	
												case 0x02: 	if(count != 8){						 	// test zda-li pocet prijatých bytu není roven 8
														   		pTXpos = TX_DATA;	  				// sestavení zprávy k odeslání	
																*pTXpos++ = RX_DATA[0];				// modbus adresa
														   		*pTXpos++ = RX_DATA[1]+0x80;		// kód funkce s chybovým kódem
																*pTXpos++ = 0x03;					// kód chyby
																CRC = CRC16(TX_DATA,pTXpos-TX_DATA);	// výpocet CRC	
																*pTXpos++ = CRC >> 8;					// úprava CRC z int na char
																*pTXpos++ = CRC; 					    // úprava CRC z int na char
																TX_DATA_Len = pTXpos-TX_DATA; 		    // pocet odesílaných znaku
																CPT3++;								    // navýsení CPT3
																TI = 1;									// nastavení príznaku prerusení od odeslaných dat sériové linky
																while(timeout < 26);					// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																TR0 = 0;								// zastavení casovace 0
															    TF0 = 0;								// vynulování príznaku pretecení od casovace 0
																break;
															}
															if((RX_DATA[2]!=0x00)||(RX_DATA[3]!=0xB0)){		// test pocatecni adresa mimo rozsah
																pTXpos = TX_DATA;						   	// sestavení zprávy k odeslání
																*pTXpos++ = RX_DATA[0];						// modbus adresa
														   		*pTXpos++ = RX_DATA[1]+0x80;				// kód funkce s chybovým kódem
																*pTXpos++ = 0x02;							// kód chyby
																CRC = CRC16(TX_DATA,pTXpos-TX_DATA);	    // výpocet CRC
																*pTXpos++ = CRC >> 8;						// úprava CRC z int na char
																*pTXpos++ = CRC; 							// úprava CRC z int na char
																TX_DATA_Len = pTXpos-TX_DATA;				// pocet odesílaných znaku
																CPT3++;										// navýsení CPT3
																TI = 1;										// nastavení príznaku prerusení od odeslaných dat sériové linky
																while(timeout < 26);						// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																TR0 = 0;									// zastavení casovace 0
															    TF0 = 0;								    // vynulování príznaku pretecení od casovace 0
																break; 
															}
															if((RX_DATA[4]!=0x00)||(RX_DATA[5]!=0x08)){ 	// test pocet vstupu mimo rozsah
																pTXpos = TX_DATA;							// sestavení zprávy k odeslání
																*pTXpos++ = RX_DATA[0];					    // modbus adresa
														   		*pTXpos++ = RX_DATA[1]+0x80;				// kód funkce s chybovým kódem
																*pTXpos++ = 0x03;							// kód chyby
																CRC = CRC16(TX_DATA,pTXpos-TX_DATA);		// výpocet CRC
																*pTXpos++ = CRC >> 8;						// úprava CRC z int na char
																*pTXpos++ = CRC; 							// úprava CRC z int na char
																TX_DATA_Len = pTXpos-TX_DATA;				// pocet odesílaných znaku
																CPT3++;										// navýsení CPT3
																TI = 1;										// nastavení príznaku prerusení od odeslaných dat sériové linky
																while(timeout < 26);						// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																TR0 = 0;									// zastavení casovace 0
															    TF0 = 0;									// vynulování príznaku pretecení od casovace 0
																break; 
															}
															/*--odpoved--*/
															pTXpos = TX_DATA; 					// sestavení zprávy k odeslání
															*pTXpos++ = RX_DATA[0];				// modbus adresa
															*pTXpos++ = RX_DATA[1];				// kód funkce 
															*pTXpos++ = 1;					    // pocet bytu 1
															*pTXpos++ = modbus_input;			// stavy jednotlivých digitálních vstupů
															CRC = CRC16(TX_DATA,pTXpos-TX_DATA);// výpocet CRC
															*pTXpos++ = CRC >> 8; 			    // úprava CRC z int na char
															*pTXpos++ = CRC;					// úprava CRC z int na char
															TX_DATA_Len = pTXpos-TX_DATA; 		// pocet odesílaných znaku
															TI = 1;								// nastavení príznaku prerusení od odeslaných dat sériové linky
															while(timeout < 26);				// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
															TR0 = 0;							// zastavení casovace 0
															TF0 = 0;							// vynulování príznaku pretecení od casovace 0
															ModbusEvent++;						// navýsení cítace komunikacních událostí
															break;
												/*-----------------------------Diagnostika------------------------------*/
												case 0x08: 	if(count != 6){						 	// test zda-li pocet prijatých bytu není roven 6
														   		pTXpos = TX_DATA;				 	// sestavení zprávy k odeslání
																*pTXpos++ = RX_DATA[0];			 	// modbus adresa
														   		*pTXpos++ = RX_DATA[1]+0x80;		// kód funkce s chybovým kódem
																*pTXpos++ = 0x03;					// kód chyby
																CRC = CRC16(TX_DATA,pTXpos-TX_DATA);// výpocet CRC
																*pTXpos++ = CRC >> 8;				// úprava CRC z int na char
																*pTXpos++ = CRC; 					// úprava CRC z int na char
																TX_DATA_Len = pTXpos-TX_DATA; 		// pocet odesílaných znaku
																CPT3++;								// navýsení CPT3
																TI = 1;							    // nastavení príznaku prerusení od odeslaných dat sériové linky
																while(timeout < 26);				// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																TR0 = 0;							// zastavení casovace 0
															    TF0 = 0;							// vynulování príznaku pretecení od casovace 0
																break;
															}
															switch(RX_DATA[3]){					    // podle prijaté podfunkce diagnostiky její následné vykonání
																/*restart komunikace*/
																case 0x01: 	restart = 1;	   		// restart komunikace
																			pTXpos = TX_DATA;					// sestavení zprávy k odeslání
																			*pTXpos++ = RX_DATA[0];				// modbus adresa
																			*pTXpos++ = RX_DATA[1];				// kód funkce
																		    *pTXpos++ = RX_DATA[2];				// kód podfunkce
																			*pTXpos++ = RX_DATA[3];				// kód podfunkce
																			CRC = CRC16(TX_DATA,pTXpos-TX_DATA);// výpocet CRC
																			*pTXpos++ = CRC >> 8; 				// úprava CRC z int na char
																			*pTXpos++ = CRC;				    // úprava CRC z int na char
																			TX_DATA_Len = pTXpos-TX_DATA; 		// pocet odesílaných znaku
																			TI = 1;							    // nastavení príznaku prerusení od odeslaných dat sériové linky
																			while(timeout < 26);				// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																			TR0 = 0;							// zastavení casovace 0
																			TF0 = 0;							// vynulování príznaku pretecení od casovace 0
																			ModbusEvent++;						// navýsení cítace komunikacních událostí
																			break;
																/*vynulování cítacu*/
																case 0x0A: 	CPT1 = 0;		// vynulovaní CPT1
																			CPT2 = 0;		// vynulovaní CPT2
																			CPT3 = 0;		// vynulovaní CPT3
																			CPT4 = 0;		// vynulovaní CPT4
																			CPT5 = 0;		// vynulovaní CPT5
																			CPT8 = 0;		// vynulovaní CPT8
																			ModbusEvent = 0;// vynulovaní cítace komunikacních událostí
																			pTXpos = TX_DATA;		 			// sestavení zprávy k odeslání
																			*pTXpos++ = RX_DATA[0];				// modbus adresa
																			*pTXpos++ = RX_DATA[1];				// kód funkce
																			*pTXpos++ = RX_DATA[2];				// kód podfunkce
																			*pTXpos++ = RX_DATA[3];				// kód podfunkce
																			CRC = CRC16(TX_DATA,pTXpos-TX_DATA);// výpocet CRC
																			*pTXpos++ = CRC >> 8; 				// úprava CRC z int na char
																			*pTXpos++ = CRC;				    // úprava CRC z int na char
																			TX_DATA_Len = pTXpos-TX_DATA; 		// pocet odesílaných znaku
																			TI = 1;								// nastavení príznaku prerusení od odeslaných dat sériové linky
																			while(timeout < 26);				// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																			TR0 = 0;							// zastavení casovace 0
																			TF0 = 0;							// vynulování príznaku pretecení od casovace 0
																			ModbusEvent++;						// navýsení cítace komunikacních událostí
																			break;
																/*vrat pocet zprav*/
																case 0x0B: 	pTXpos = TX_DATA;					// sestavení zprávy k odeslání
																			*pTXpos++ = RX_DATA[0];			    // modbus adresa
																			*pTXpos++ = RX_DATA[1];				// kód funkce
																			*pTXpos++ = RX_DATA[2];				// kód podfunkce
																			*pTXpos++ = RX_DATA[3];				// kód podfunkce
																			*pTXpos++ = CPT1 >> 8;				// úprava CPT1 z int na char
																			*pTXpos++ = CPT1;					// úprava CPT1 z int na char
																			CRC = CRC16(TX_DATA,pTXpos-TX_DATA);// výpocet CRC
																			*pTXpos++ = CRC >> 8; 				// úprava CRC z int na char
																			*pTXpos++ = CRC;					// úprava CRC z int na char
																			TX_DATA_Len = pTXpos-TX_DATA; 		// pocet odesílaných znaku
																			TI = 1;								// nastavení príznaku prerusení od odeslaných dat sériové linky
																			while(timeout < 26);				// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																			TR0 = 0;							// zastavení casovace 0
																			TF0 = 0;							// vynulování príznaku pretecení od casovace 0
																			ModbusEvent++;						// navýsení cítace komunikacních událostí
																			break;
																/*vrat pocet komunikacních chyb*/
																case 0x0C:	pTXpos = TX_DATA;					// sestavení zprávy k odeslání
																			*pTXpos++ = RX_DATA[0];				// modbus adresa
																			*pTXpos++ = RX_DATA[1];				// kód funkce
																			*pTXpos++ = RX_DATA[2];				// kód podfunkce
																			*pTXpos++ = RX_DATA[3];				// kód podfunkce
																			*pTXpos++ = CPT2 >> 8;			    // úprava CPT2 z int na char
																			*pTXpos++ = CPT2;					// úprava CPT2 z int na char
																			CRC = CRC16(TX_DATA,pTXpos-TX_DATA);// výpocet CRC
																			*pTXpos++ = CRC >> 8; 				// úprava CRC z int na char
																			*pTXpos++ = CRC;				    // úprava CRC z int na char
																			TX_DATA_Len = pTXpos-TX_DATA; 		// pocet odesílaných znaku
																			TI = 1;								// nastavení príznaku prerusení od odeslaných dat sériové linky
																			while(timeout < 26);				// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																			TR0 = 0;							// zastavení casovace 0
																			TF0 = 0;							// vynulování príznaku pretecení od casovace 0
																			ModbusEvent++;						// navýsení cítace komunikacních událostí
																			break;
																/*vrat pocet negativních odpovedí*/
																case 0x0D:	pTXpos = TX_DATA;					// sestavení zprávy k odeslání
																			*pTXpos++ = RX_DATA[0];				// modbus adresa
																			*pTXpos++ = RX_DATA[1];				// kód funkce
																			*pTXpos++ = RX_DATA[2];				// kód podfunkce
																			*pTXpos++ = RX_DATA[3];				// kód podfunkce
																			*pTXpos++ = CPT3 >> 8;			    // úprava CPT3 z int na char
																			*pTXpos++ = CPT3;					// úprava CPT3 z int na char
																			CRC = CRC16(TX_DATA,pTXpos-TX_DATA);// výpocet CRC
																			*pTXpos++ = CRC >> 8; 				// úprava CRC z int na char
																			*pTXpos++ = CRC;					// úprava CRC z int na char
																			TX_DATA_Len = pTXpos-TX_DATA; 	    // pocet odesílaných znaku
																			TI = 1;								// nastavení príznaku prerusení od odeslaných dat sériové linky
																			while(timeout < 26);				// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																			TR0 = 0;							// zastavení casovace 0
																			TF0 = 0;							// vynulování príznaku pretecení od casovace 0
																			ModbusEvent++;						// navýsení cítace komunikacních událostí
																			break;
																/*Vrat pocet zpracovaných zpráv*/
																case 0x0E:	pTXpos = TX_DATA;					// sestavení zprávy k odeslání
																			*pTXpos++ = RX_DATA[0];				// modbus adresa
																			*pTXpos++ = RX_DATA[1];				// kód funkce
																			*pTXpos++ = RX_DATA[2];				// kód podfunkce
																			*pTXpos++ = RX_DATA[3];				// kód podfunkce
																			*pTXpos++ = CPT4 >> 8;				// úprava CPT4 z int na char
																			*pTXpos++ = CPT4;					// úprava CPT4 z int na char
																			CRC = CRC16(TX_DATA,pTXpos-TX_DATA);// výpocet CRC
																			*pTXpos++ = CRC >> 8; 				// úprava CRC z int na char
																			*pTXpos++ = CRC;					// úprava CRC z int na char
																			TX_DATA_Len = pTXpos-TX_DATA; 		// pocet odesílaných znaku
																			TI = 1;								// nastavení príznaku prerusení od odeslaných dat sériové linky
																			while(timeout < 26);				// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																			TR0 = 0;							// zastavení casovace 0
																			TF0 = 0;							// vynulování príznaku pretecení od casovace 0
																			ModbusEvent++;						// navýsení cítace komunikacních událostí
																			break;
																/*vrat pocet nezodpovezených zpráv*/
																case 0x0F:	pTXpos = TX_DATA;					// sestavení zprávy k odeslání
																			*pTXpos++ = RX_DATA[0];				// modbus adresa
																			*pTXpos++ = RX_DATA[1];				// kód funkce
																			*pTXpos++ = RX_DATA[2];				// kód podfunkce
																			*pTXpos++ = RX_DATA[3];				// kód podfunkce
																			*pTXpos++ = CPT5 >> 8;				// úprava CPT5 z int na char
																			*pTXpos++ = CPT5;					// úprava CPT5 z int na char
																			CRC = CRC16(TX_DATA,pTXpos-TX_DATA);// výpocet CRC
																			*pTXpos++ = CRC >> 8; 				// úprava CRC z int na char
																			*pTXpos++ = CRC;					// úprava CRC z int na char
																			TX_DATA_Len = pTXpos-TX_DATA; 	    // pocet odesílaných znaku
																			TI = 1;								// nastavení príznaku prerusení od odeslaných dat sériové linky
																			while(timeout < 26);				// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																			TR0 = 0;							// zastavení casovace 0
																			TF0 = 0;							// vynulování príznaku pretecení od casovace 0
																			ModbusEvent++;						// navýsení cítace komunikacních událostí
																			break;
																/*vrat pocet ztracených zpráv(znaku)*/
																case 0x12:	pTXpos = TX_DATA;					// sestavení zprávy k odeslání
																			*pTXpos++ = RX_DATA[0];				// modbus adresa
																			*pTXpos++ = RX_DATA[1];				// kód funkce
																			*pTXpos++ = RX_DATA[2];				// kód podfunkce
																			*pTXpos++ = RX_DATA[3];				// kód podfunkce
																			*pTXpos++ = CPT8 >> 8;				// úprava CPT8 z int na char
																			*pTXpos++ = CPT8;				    // úprava CPT8 z int na char
																			CRC = CRC16(TX_DATA,pTXpos-TX_DATA);// výpocet CRC
																			*pTXpos++ = CRC >> 8; 				// úprava CRC z int na char
																			*pTXpos++ = CRC;					// úprava CRC z int na char
																			TX_DATA_Len = pTXpos-TX_DATA; 		// pocet odesílaných znaku
																			TI = 1;								// nastavení príznaku prerusení od odeslaných dat sériové linky
																			while(timeout < 26);				// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																			TR0 = 0;							// zastavení casovace 0
																			TF0 = 0;							// vynulování príznaku pretecení od casovace 0
																			ModbusEvent++;						// navýsení cítace komunikacních událostí
																			break;
																/*neznámá funkce*/
																default:	pTXpos = TX_DATA;					// sestavení zprávy k odeslání
																			*pTXpos++ = RX_DATA[0];				// modbus adresa
														   					*pTXpos++ = RX_DATA[1]+0x80;	    // kód funkce s chybovým kódem
																			*pTXpos++ = 0x01;					// kód chyby
																			CRC = CRC16(TX_DATA,pTXpos-TX_DATA);// výpocet CRC
																			*pTXpos++ = CRC >> 8;				// úprava CRC z int na char
																			*pTXpos++ = CRC; 					// úprava CRC z int na char
																			TX_DATA_Len = pTXpos-TX_DATA; 		// pocet odesílaných znaku
																			CPT3++;								// navýsení CPT3
																			TI = 1;								// nastavení príznaku prerusení od odeslaných dat sériové linky
																			while(timeout < 26);				// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																			TR0 = 0;							// zastavení casovace 0
															    			TF0 = 0;							// vynulování príznaku pretecení od casovace 0
																			break;
															}
															break;
												/*---------------------Cítac komunikacnich udalosti---------------------*/				  	
												case 0x0B: 	if(count != 4){						 	// test zda-li pocet prijatých bytu není roven 4
														   		pTXpos = TX_DATA;					// sestavení zprávy k odeslání
																*pTXpos++ = RX_DATA[0];				// modbus adresa
														   		*pTXpos++ = RX_DATA[1]+0x80;		// kód funkce s chybovým kódem
																*pTXpos++ = 0x03;					// kód chyby
																CRC = CRC16(TX_DATA,pTXpos-TX_DATA);// výpocet CRC
																*pTXpos++ = CRC >> 8;				// úprava CRC z int na char
																*pTXpos++ = CRC; 					// úprava CRC z int na char
																TX_DATA_Len = pTXpos-TX_DATA; 	    // pocet odesílaných znaku
																CPT3++;								// navýsení CPT3
																TI = 1;								// nastavení príznaku prerusení od odeslaných dat sériové linky
																while(timeout < 26);				// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																TR0 = 0;							// zastavení casovace 0
															    TF0 = 0;							// vynulování príznaku pretecení od casovace 0
																break;
															}
															/*--odpoved--*/
															pTXpos = TX_DATA;  					// sestavení zprávy k odeslání
															*pTXpos++ = RX_DATA[0];				// modbus adresa
															*pTXpos++ = RX_DATA[1];				// kód funkce
															*pTXpos++ = 0x00;					// status horní byte 
															*pTXpos++ = 0x00;					// status spodní byte
															*pTXpos++ = ModbusEvent >> 8;	    // úprava ModbusEvent z int na char
															*pTXpos++ = ModbusEvent;			// úprava ModbusEvent z int na char
															CRC = CRC16(TX_DATA,pTXpos-TX_DATA);// výpocet CRC
															*pTXpos++ = CRC >> 8; 				// úprava CRC z int na char
															*pTXpos++ = CRC;					// úprava CRC z int na char
															TX_DATA_Len = pTXpos-TX_DATA; 		// pocet odesílaných znaku
															TI = 1;								// nastavení príznaku prerusení od odeslaných dat sériové linky
															while(timeout < 26);				// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
															TR0 = 0;							// zastavení casovace 0
															TF0 = 0;							// vynulování príznaku pretecení od casovace 0
															ModbusEvent++;						// navýsení cítace komunikacních událostí
															break;
												/*---------------------------zápis více cívek---------------------------*/
												case 0x0F: 	if(count != 0x0A){						 // test zda-li pocet prijatých bytu není roven 10
														   		pTXpos = TX_DATA;					 // sestavení zprávy k odeslání
																*pTXpos++ = RX_DATA[0];				 // modbus adresa
														   		*pTXpos++ = RX_DATA[1]+0x80;		 // kód funkce s chybovým kódem
																*pTXpos++ = 0x03;					 // kód chyby
																CRC = CRC16(TX_DATA,pTXpos-TX_DATA); // výpocet CRC
																*pTXpos++ = CRC >> 8;				 // úprava CRC z int na char
																*pTXpos++ = CRC; 					 // úprava CRC z int na char
																TX_DATA_Len = pTXpos-TX_DATA; 		 // pocet odesílaných znaku
																CPT3++;								 // navýsení CPT3
																TI = 1;								 // nastavení príznaku prerusení od odeslaných dat sériové linky
																while(timeout < 26);				 // cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																TR0 = 0;							 // zastavení casovace 0
															    TF0 = 0;							 // vynulování príznaku pretecení od casovace 0
																break;
															 }
															if((RX_DATA[2]!=0x00)||(RX_DATA[3]!=0xA0)){ // test pocatecni adresa mimo rozsah
																pTXpos = TX_DATA;						// sestavení zprávy k odeslání
																*pTXpos++ = RX_DATA[0];					// modbus adresa
														   		*pTXpos++ = RX_DATA[1]+0x80;			// kód funkce s chybovým kódem
																*pTXpos++ = 0x02;						// kód chyby
																CRC = CRC16(TX_DATA,pTXpos-TX_DATA);    // výpocet CRC
																*pTXpos++ = CRC >> 8;					// úprava CRC z int na char
																*pTXpos++ = CRC; 						// úprava CRC z int na char
																TX_DATA_Len = pTXpos-TX_DATA;			// pocet odesílaných znaku
																CPT3++; 								// navýsení CPT3
																TI = 1;									// nastavení príznaku prerusení od odeslaných dat sériové linky
																while(timeout < 26);					// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																TR0 = 0;								// zastavení casovace 0
															    TF0 = 0;								// vynulování príznaku pretecení od casovace 0
																break; 
															}
															if((RX_DATA[4]!=0x00)||(RX_DATA[5]!=0x08)){ // test pocet vystupu mimo rozsah
																pTXpos = TX_DATA;						// sestavení zprávy k odeslání
																*pTXpos++ = RX_DATA[0];					// modbus adresa
														   		*pTXpos++ = RX_DATA[1]+0x80;			// kód funkce s chybovým kódem
																*pTXpos++ = 0x03;						// kód chyby
																CRC = CRC16(TX_DATA,pTXpos-TX_DATA);	// výpocet CRC
																*pTXpos++ = CRC >> 8;					// úprava CRC z int na char
																*pTXpos++ = CRC; 						// úprava CRC z int na char
																TX_DATA_Len = pTXpos-TX_DATA; 		    // pocet odesílaných znaku
																CPT3++;								    // navýsení CPT3
																TI = 1;									// nastavení príznaku prerusení od odeslaných dat sériové linky
																while(timeout < 26);					// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																TR0 = 0;								// zastavení casovace 0
															    TF0 = 0;								// vynulování príznaku pretecení od casovace 0
																break; 
															} 
															/*--odpoved--*/
															modbus_output = RX_DATA[7];			// zápis na jednotlivé digitální výstupy
															pTXpos = TX_DATA;					// sestavení zprávy k odeslání
															*pTXpos++ = RX_DATA[0];				// modbus adresa
															*pTXpos++ = RX_DATA[1];				// kód funkce
															*pTXpos++ = 0x00;					// pocátecní adresa
															*pTXpos++ = 0xB0;					// pocátecní adresa
															*pTXpos++ = 0x00;					// pocet digitálních výstupu
															*pTXpos++ = 0x08;					// pocet digitálních výstupu
															CRC = CRC16(TX_DATA,pTXpos-TX_DATA);// výpocet CRC
															*pTXpos++ = CRC >> 8; 				// úprava CRC z int na char
															*pTXpos++ = CRC; 					// úprava CRC z int na char
															TX_DATA_Len = pTXpos-TX_DATA;		// pocet odesílaných znaku
															TI = 1;								// nastavení príznaku prerusení od odeslaných dat sériové linky
															while(timeout < 26);			    // cekání na uplynutí casu 3,5char od posledního odeslaného znaku
															TR0 = 0;							// zastavení casovace 0
															TF0 = 0;							// vynulování príznaku pretecení od casovace 0
															ModbusEvent++;						// navýsení cítace komunikacních událostí
															break;
												/*------------------------Identifikace zarizeni-------------------------*/				  	
												case 0x2B: 	if(count != 7){						 	// test zda-li pocet prijatých bytu není roven 7
														   		pTXpos = TX_DATA;				 	// sestavení zprávy k odeslání
																*pTXpos++ = RX_DATA[0];			 	// modbus adresa
														   		*pTXpos++ = RX_DATA[1]+0x80;	 	// kód funkce s chybovým kódem
																*pTXpos++ = 0x03;					// kód chyby
																CRC = CRC16(TX_DATA,pTXpos-TX_DATA);// výpocet CRC
																*pTXpos++ = CRC >> 8;				// úprava CRC z int na char
																*pTXpos++ = CRC; 					// úprava CRC z int na char
																TX_DATA_Len = pTXpos-TX_DATA; 		// pocet odesílaných znaku
																CPT3++;								// navýsení CPT3
																TI = 1;								// nastavení príznaku prerusení od odeslaných dat sériové linky
																while(timeout < 26);				// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																TR0 = 0;							// zastavení casovace 0
															    TF0 = 0;							// vynulování príznaku pretecení od casovace 0
																break;
															}
	
															if(RX_DATA[2] != 0x0E){					// test zda-li se jedná o MEI
														   		pTXpos = TX_DATA;					// sestavení zprávy k odeslání
																*pTXpos++ = RX_DATA[0];				// modbus adresa
														   		*pTXpos++ = RX_DATA[1]+0x80;		// kód funkce s chybovým kódem
																*pTXpos++ = 0x01;					// kód chyby
																CRC = CRC16(TX_DATA,pTXpos-TX_DATA);// výpocet CRC
																*pTXpos++ = CRC >> 8;				// úprava CRC z int na char
																*pTXpos++ = CRC; 				    // úprava CRC z int na char
																TX_DATA_Len = pTXpos-TX_DATA; 	    // pocet odesílaných znaku
																CPT3++;							    // navýsení CPT3
																TI = 1;								// nastavení príznaku prerusení od odeslaných dat sériové linky
																while(timeout < 26);				// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																TR0 = 0;							// zastavení casovace 0
															    TF0 = 0;							// vynulování príznaku pretecení od casovace 0
																break;
															}
	
															if(RX_DATA[4] != 0x01){					// test (Device ID) zda-li se jedná o základní kategorii
														   		pTXpos = TX_DATA;					// sestavení zprávy k odeslání
																*pTXpos++ = RX_DATA[0];				// modbus adresa
														   		*pTXpos++ = RX_DATA[1]+0x80;		// kód funkce s chybovým kódem
																*pTXpos++ = 0x02;					// kód chyby
																CRC = CRC16(TX_DATA,pTXpos-TX_DATA);// výpocet CRC
																*pTXpos++ = CRC >> 8;				// úprava CRC z int na char
																*pTXpos++ = CRC; 					// úprava CRC z int na char
																TX_DATA_Len = pTXpos-TX_DATA; 		// pocet odesílaných znaku
																CPT3++;							    // navýsení CPT3
																TI = 1;								// nastavení príznaku prerusení od odeslaných dat sériové linky
																while(timeout < 26);				// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																TR0 = 0;							// zastavení casovace 0
															    TF0 = 0;							// vynulování príznaku pretecení od casovace 0
																break;
															}
															/*--podle ID objektu--*/
															if(RX_DATA[3] == 0x00){			// základní identifikace
																pTXpos = TX_DATA;			// sestavení zprávy k odeslání
																*pTXpos++ = RX_DATA[0];		// modbus adresa
																*pTXpos++ = RX_DATA[1];		// kód funkce
																*pTXpos++ = RX_DATA[2];		// typ MEI
																*pTXpos++ = 0x01;			// ID kód
																*pTXpos++ = 0x01;			// úroven shody(1-základní identifikace)
																*pTXpos++ = 0x00;			// pokracování 0 - žádné není
																*pTXpos++ = 0x00;			// ID dalšího objektu 0
																*pTXpos++ = 0x03;			// pocet objektu 3
																*pTXpos++ = 0x00;			// Objekt ID 0x00-Název výrobce
																*pTXpos++ = 0x08;			// délka objektu
																*pTXpos++ = 'V';			// V
																*pTXpos++ = 'U';			// U
																*pTXpos++ = 'T';			// T
																*pTXpos++ = ' ';			// 
																*pTXpos++ = 'B';			// B
																*pTXpos++ = 'R';			// R
																*pTXpos++ = 'N';			// N
																*pTXpos++ = 'O';			// 0
																*pTXpos++ = 0x01;			// Objekt ID 0x01-Kód produktu
																*pTXpos++ = 0x1C;			// délka objektu
																*pTXpos++ = 'P';			// P
																*pTXpos++ = 'R';			// R
																*pTXpos++ = 'U';			// U
																*pTXpos++ = 'M';			// M
																*pTXpos++ = 'Y';			// Y
																*pTXpos++ = 'S';			// S
																*pTXpos++ = 'L';			// L
																*pTXpos++ = 'O';			// O
																*pTXpos++ = 'V';			// V
																*pTXpos++ = 'Y';			// Y
																*pTXpos++ = ' ';			//
																*pTXpos++ = 'S';			// S
																*pTXpos++ = 'T';			// T
																*pTXpos++ = 'A';			// A
																*pTXpos++ = 'V';			// V
																*pTXpos++ = 'O';			// O
																*pTXpos++ = 'V';			// V
																*pTXpos++ = 'Y';			// Y
																*pTXpos++ = ' ';			//
																*pTXpos++ = 'I';			// I
																*pTXpos++ = 'N';			// N
																*pTXpos++ = 'D';			// D
																*pTXpos++ = 'I';			// I
																*pTXpos++ = 'K';			// K
																*pTXpos++ = 'A';			// A
																*pTXpos++ = 'T';			// T
																*pTXpos++ = 'O';			// O
																*pTXpos++ = 'R';			// R
																*pTXpos++ = 0x02;			// Objekt ID 0x02-Verze produktu
																*pTXpos++ = 0x04;			// Délka objektu
															    *pTXpos++ = 'V';			// V
																*pTXpos++ = '1';			// 1
																*pTXpos++ = '.';			// .
																*pTXpos++ = '0';			// 0
																CRC = CRC16(TX_DATA,pTXpos-TX_DATA);// výpocet CRC
																*pTXpos++ = CRC >> 8; 				// úprava CRC z int na char
																*pTXpos++ = CRC;					// úprava CRC z int na char
																TX_DATA_Len = pTXpos-TX_DATA; 		// pocet odesílaných znaku
																TI = 1;								// nastavení príznaku prerusení od odeslaných dat sériové linky
																while(timeout < 26);				// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																TR0 = 0;							// zastavení casovace 0
																TF0 = 0;							// vynulování príznaku pretecení od casovace 0
																ModbusEvent++;						// navýsení cítace komunikacních událostí
																break;
															}
															else{									// jiná identifikace
																pTXpos = TX_DATA;					// sestavení zprávy k odeslání
																*pTXpos++ = RX_DATA[0];				// modbus adresa
														   		*pTXpos++ = RX_DATA[1]+0x80;		// kód funkce s chybovým kódem
																*pTXpos++ = 0x01;					// kód chyby
																CRC = CRC16(TX_DATA,pTXpos-TX_DATA);// výpocet CRC
																*pTXpos++ = CRC >> 8;				// úprava CRC z int na char
																*pTXpos++ = CRC; 					// úprava CRC z int na char
																TX_DATA_Len = pTXpos-TX_DATA; 	    // pocet odesílaných znaku
																CPT3++;								// navýsení CPT3
																TI = 1;								// nastavení príznaku prerusení od odeslaných dat sériové linky
																while(timeout < 26);				// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																TR0 = 0;							// zastavení casovace 0
															    TF0 = 0;							// vynulování príznaku pretecení od casovace 0
																break;
															}
													/*-------------------------zápis stavu tlacitek-------------------------*/
												case 0x66: 	if(count != 0x06){						 // test zda-li pocet prijatých bytu není roven 6
														   		pTXpos = TX_DATA;					 // sestavení zprávy k odeslání
																*pTXpos++ = RX_DATA[0];				 // modbus adresa
														   		*pTXpos++ = RX_DATA[1]+0x80;		 // kód funkce s chybovým kódem
																*pTXpos++ = 0x03;					 // kód chyby
																CRC = CRC16(TX_DATA,pTXpos-TX_DATA); // výpocet CRC
																*pTXpos++ = CRC >> 8;				 // úprava CRC z int na char
																*pTXpos++ = CRC; 					 // úprava CRC z int na char
																TX_DATA_Len = pTXpos-TX_DATA; 		 // pocet odesílaných znaku
																CPT3++;								 // navýsení CPT3
																TI = 1;								 // nastavení príznaku prerusení od odeslaných dat sériové linky
																while(timeout < 26);				 // cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																TR0 = 0;							 // zastavení casovace 0
															    TF0 = 0;							 // vynulování príznaku pretecení od casovace 0
																break;
															 }
															if(RX_DATA[2]!=0x01){ 					 // test poctu bytu
																pTXpos = TX_DATA;					 // sestavení zprávy k odeslání
																*pTXpos++ = RX_DATA[0];				 // modbus adresa
														   		*pTXpos++ = RX_DATA[1]+0x80;		 // kód funkce s chybovým kódem
																*pTXpos++ = 0x02;					 // kód chyby
																CRC = CRC16(TX_DATA,pTXpos-TX_DATA); // výpocet CRC
																*pTXpos++ = CRC >> 8;				 // úprava CRC z int na char
																*pTXpos++ = CRC; 					 // úprava CRC z int na char
																TX_DATA_Len = pTXpos-TX_DATA; 		 // pocet odesílaných znaku
																CPT3++;								 // navýsení CPT3
																TI = 1;								 // nastavení príznaku prerusení od odeslaných dat sériové linky
																while(timeout < 26);				 // cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																TR0 = 0;							 // zastavení casovace 0
															    TF0 = 0;							 // vynulování príznaku pretecení od casovace 0
																break; 
															}
															/*--odpoved--*/
															modbus_button = RX_DATA[3];			// nactení stavů tlacítek
															pTXpos = TX_DATA;					// sestavení zprávy k odeslání
															*pTXpos++ = RX_DATA[0];				// modbus adresa
															*pTXpos++ = RX_DATA[1];				// kód funkce
															*pTXpos++ = 0x01;				    // pocet bytu
															*pTXpos++ = RX_DATA[3];				// stavy tlacítek
															CRC = CRC16(TX_DATA,pTXpos-TX_DATA);// výpocet CRC
															*pTXpos++ = CRC >> 8; 				// úprava CRC z int na char
															*pTXpos++ = CRC; 					// úprava CRC z int na char
															TX_DATA_Len = pTXpos-TX_DATA;		// pocet odesílaných znaku
															TI = 1;								// nastavení príznaku prerusení od odeslaných dat sériové linky
															while(timeout < 26);				// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
															TR0 = 0;							// zastavení casovace 0
															TF0 = 0;							// vynulování príznaku pretecení od casovace 0
															ModbusEvent++;						// navýsení cítace komunikacních událostí
															break;
												/*-----------------------cyklické ctení I/O,AD,DA-----------------------*/
												case 0x67: 	if(count != 0x06){						 // test zda-li pocet prijatých bytu není roven 6
														   		pTXpos = TX_DATA;					 // sestavení zprávy k odeslání
																*pTXpos++ = RX_DATA[0];				 // modbus adresa
														   		*pTXpos++ = RX_DATA[1]+0x80;		 // kód funkce s chybovým kódem
																*pTXpos++ = 0x03;					 // kód chyby
																CRC = CRC16(TX_DATA,pTXpos-TX_DATA); // výpocet CRC
																*pTXpos++ = CRC >> 8;				 // úprava CRC z int na char
																*pTXpos++ = CRC; 					 // úprava CRC z int na char
																TX_DATA_Len = pTXpos-TX_DATA; 		 // pocet odesílaných znaku
																CPT3++;								 // navýsení CPT3
																TI = 1;								 // nastavení príznaku prerusení od odeslaných dat sériové linky
																while(timeout < 26);				 // cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																TR0 = 0;							 // zastavení casovace 0
															    TF0 = 0;							 // vynulování príznaku pretecení od casovace 0
																break;
															 }
															if(RX_DATA[2]!=0x06){ 					 // test pocet bytů
																pTXpos = TX_DATA;					 // sestavení zprávy k odeslání
																*pTXpos++ = RX_DATA[0];				 // modbus adresa
														   		*pTXpos++ = RX_DATA[1]+0x80;		 // kód funkce s chybovým kódem
																*pTXpos++ = 0x02;					 // kód chyby
																CRC = CRC16(TX_DATA,pTXpos-TX_DATA); // výpocet CRC
																*pTXpos++ = CRC >> 8;				 // úprava CRC z int na char
																*pTXpos++ = CRC; 					 // úprava CRC z int na char
																TX_DATA_Len = pTXpos-TX_DATA; 		 // pocet odesílaných znaku
																CPT3++;								 // navýsení CPT3
																TI = 1;								 // nastavení príznaku prerusení od odeslaných dat sériové linky
																while(timeout < 26);				 // cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																TR0 = 0;							 // zastavení casovace 0
															    TF0 = 0;							 // vynulování príznaku pretecení od casovace 0
																break; 
															}
															if(RX_DATA[3]==0x00)cyclic_read = 0;	 // test zda-li je zastavené cyklického ctení
															else cyclic_read = 1;					 // není zastavené cyklické ctení nastavení signalizace 
														
															/*--odpoved--*/
															pTXpos = TX_DATA;					// sestavení zprávy k odeslání
															*pTXpos++ = RX_DATA[0];				// modbus adresa
															*pTXpos++ = RX_DATA[1];				// kód funkce
															*pTXpos++ = 0x06;					// pocet bytu
															*pTXpos++ = modbus_input;			// stavy digitálních vstupů
															*pTXpos++ = modbus_output_read;		// stavy digitálních výstupu
															*pTXpos++ = (ADC(AD_CHANNEL1)>>8);	// hodnota A/D prevodníku kanál 1 prevod z int na char
															*pTXpos++ = (ADC(AD_CHANNEL1));		// hodnota A/D prevodníku kanál 1 prevod z int na char
															*pTXpos++ = (ADC(AD_CHANNEL2)>>8);	// hodnota A/D prevodníku kanál 2 prevod z int na char
															*pTXpos++ = (ADC(AD_CHANNEL2));		// hodnota A/D prevodníku kanál 2 prevod z int na char
															CRC = CRC16(TX_DATA,pTXpos-TX_DATA);// výpocet CRC
															*pTXpos++ = CRC >> 8; 				// úprava CRC z int na char
															*pTXpos++ = CRC; 					// úprava CRC z int na char
															TX_DATA_Len = pTXpos-TX_DATA;		// pocet odesílaných znaku
															TI = 1;								// nastavení príznaku prerusení od odeslaných dat sériové linky
															while(timeout < 26);				// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
															TR0 = 0;							// zastavení casovace 0
															TF0 = 0;							// vynulování príznaku pretecení od casovace 0
															ModbusEvent++;						// navýsení cítace komunikacních událostí
															break;
												/*---------------------------ctení AD prevodníku------------------------*/
												case 0x68: 	if(count != 0x05){						 // test zda-li pocet prijatých bytu není roven 5
														   		pTXpos = TX_DATA;					 // sestavení zprávy k odeslání
																*pTXpos++ = RX_DATA[0];				 // modbus adresa
														   		*pTXpos++ = RX_DATA[1]+0x80;		 // kód funkce s chybovým kódem
																*pTXpos++ = 0x03;					 // kód chyby
																CRC = CRC16(TX_DATA,pTXpos-TX_DATA); // výpocet CRC
																*pTXpos++ = CRC >> 8;				 // úprava CRC z int na char
																*pTXpos++ = CRC; 					 // úprava CRC z int na char
																TX_DATA_Len = pTXpos-TX_DATA; 		 // pocet odesílaných znaku
																CPT3++;								 // navýsení CPT3
																TI = 1;								 // nastavení príznaku prerusení od odeslaných dat sériové linky
																while(timeout < 26);				 // cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																TR0 = 0;							 // zastavení casovace 0
															    TF0 = 0;							 // vynulování príznaku pretecení od casovace 0
																break;
															 }
															if(RX_DATA[2]!=0x04){ 					 // test pocet bytů
																pTXpos = TX_DATA;					 // sestavení zprávy k odeslání
																*pTXpos++ = RX_DATA[0];				 // modbus adresa
														   		*pTXpos++ = RX_DATA[1]+0x80;		 // kód funkce s chybovým kódem
																*pTXpos++ = 0x02;					 // kód chyby
																CRC = CRC16(TX_DATA,pTXpos-TX_DATA); // výpocet CRC
																*pTXpos++ = CRC >> 8;				 // úprava CRC z int na char
																*pTXpos++ = CRC; 					 // úprava CRC z int na char
																TX_DATA_Len = pTXpos-TX_DATA; 		 // pocet odesílaných znaku
																CPT3++;								 // navýsení CPT3
																TI = 1;								 // nastavení príznaku prerusení od odeslaných dat sériové linky
																while(timeout < 26);				 // cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																TR0 = 0;							 // zastavení casovace 0
															    TF0 = 0;							 // vynulování príznaku pretecení od casovace 0
																break; 
															}
															/*--odpoved--*/														
															pTXpos = TX_DATA;					// sestavení zprávy k odeslání
															*pTXpos++ = RX_DATA[0];				// modbus adresa
															*pTXpos++ = RX_DATA[1];				// kód funkce
															*pTXpos++ = 0x04;					// pocet bytu
															*pTXpos++ = (ADC(AD_CHANNEL1)>>8);	// hodnota z A/D prevodníku kanál 1 prevod z int na char 
															*pTXpos++ = (ADC(AD_CHANNEL1));		// hodnota z A/D prevodníku kanál 1 prevod z int na char
															*pTXpos++ = (ADC(AD_CHANNEL2)>>8);	// hodnota z A/D prevodníku kanál 2 prevod z int na char
															*pTXpos++ = (ADC(AD_CHANNEL2));		// hodnota z A/D prevodníku kanál 2 prevod z int na char
															CRC = CRC16(TX_DATA,pTXpos-TX_DATA);// výpocet CRC
															*pTXpos++ = CRC >> 8; 				// úprava CRC z int na char
															*pTXpos++ = CRC; 					// úprava CRC z int na char
															TX_DATA_Len = pTXpos-TX_DATA;		// pocet odesílaných znaku
															TI = 1;								// nastavení príznaku prerusení od odeslaných dat sériové linky
															while(timeout < 26);				// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
															TR0 = 0;							// zastavení casovace 0
															TF0 = 0;							// vynulování príznaku pretecení od casovace 0
															ModbusEvent++;						// navýsení cítace komunikacních událostí
															break;
												/*---------------------------zápis DA prevodníku------------------------*/
												case 0x69: 	if(count != 0x09){						 // test zda-li pocet prijatých bytu není roven 9
														   		pTXpos = TX_DATA;					 // sestavení zprávy k odeslání
																*pTXpos++ = RX_DATA[0];				 // modbus adresa
														   		*pTXpos++ = RX_DATA[1]+0x80;		 // kód funkce s chybovým kódem
																*pTXpos++ = 0x03;					 // kód chyby
																CRC = CRC16(TX_DATA,pTXpos-TX_DATA); // výpocet CRC
																*pTXpos++ = CRC >> 8;				 // úprava CRC z int na char
																*pTXpos++ = CRC; 					 // úprava CRC z int na char
																TX_DATA_Len = pTXpos-TX_DATA; 		 // pocet odesílaných znaku
																CPT3++;								 // navýsení CPT3
																TI = 1;								 // nastavení príznaku prerusení od odeslaných dat sériové linky
																while(timeout < 26);				 // cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																TR0 = 0;							 // zastavení casovace 0
															    TF0 = 0;							 // vynulování príznaku pretecení od casovace 0
																break;
															 }
															if(RX_DATA[2]!=0x04){ 					 // test pocet bytů
																pTXpos = TX_DATA;					 // sestavení zprávy k odeslání
																*pTXpos++ = RX_DATA[0];				 // modbus adresa
														   		*pTXpos++ = RX_DATA[1]+0x80;		 // kód funkce s chybovým kódem
																*pTXpos++ = 0x02;					 // kód chyby
																CRC = CRC16(TX_DATA,pTXpos-TX_DATA); // výpocet CRC
																*pTXpos++ = CRC >> 8;				 // úprava CRC z int na char
																*pTXpos++ = CRC; 					 // úprava CRC z int na char
																TX_DATA_Len = pTXpos-TX_DATA; 		 // pocet odesílaných znaku
																CPT3++;								 // navýsení CPT3
																TI = 1;								 // nastavení príznaku prerusení od odeslaných dat sériové linky
																while(timeout < 26);				 // cekání na uplynutí casu 3,5char od posledního odeslaného znaku
																TR0 = 0;							 // zastavení casovace 0
															    TF0 = 0;							 // vynulování príznaku pretecení od casovace 0
																break; 
															}
															/*--odpoved--*/	
															DAC_value_channel1 = (RX_DATA[3]<<8|RX_DATA[4]);	// zápis do promenné pro D/A prevodník kanál 1 + uprava z 2bytu char na int
															DAC(DA_CHANNEL1,DAC_value_channel1);				// zápis prímo do D/A prevodníku kanál 1
															DAC_value_channel2 = (RX_DATA[5]<<8|RX_DATA[6]);	// zápis do promenné pro D/A prevodník kanál 2 + uprava z 2bytu char na int
															DAC(DA_CHANNEL2,DAC_value_channel2);			    // zápis do D/A prevodníku kanál 2
															pTXpos = TX_DATA;	 				// sestavení zprávy k odeslání
															*pTXpos++ = RX_DATA[0];				// modbus adresa
															*pTXpos++ = RX_DATA[1];				// kód funkce
															*pTXpos++ = 0x04;				    // pocet bytu
															*pTXpos++ = RX_DATA[3];				// zapsaná hodnota zpet
															*pTXpos++ = RX_DATA[4];				// zapsaná hodnota zpet
															*pTXpos++ = RX_DATA[5];				// zapsaná hodnota zpet
															*pTXpos++ = RX_DATA[6];				// zapsaná hodnota zpet
															CRC = CRC16(TX_DATA,pTXpos-TX_DATA);// výpocet CRC
															*pTXpos++ = CRC >> 8; 				// úprava CRC z int na char
															*pTXpos++ = CRC; 					// úprava CRC z int na char
															TX_DATA_Len = pTXpos-TX_DATA;		// pocet odesílaných znaku
															TI = 1;								// nastavení príznaku prerusení od odeslaných dat sériové linky
															while(timeout < 26);				// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
															TR0 = 0;							// zastavení casovace 0
															TF0 = 0;							// vynulování príznaku pretecení od casovace 0
															ModbusEvent++;						// navýsení cítace komunikacních událostí
															break;
												/*--------------------------neznámý kód funkce--------------------------*/
												default: 	pTXpos = TX_DATA;					// sestavení zprávy k odeslání
															*pTXpos++ = RX_DATA[0];				// modbus adresa
															*pTXpos++ = RX_DATA[1]+0x80;		// kód funkce s chybovým kódem
													 		*pTXpos++ = 0x01;					// kód chyby
													 		CRC = CRC16(TX_DATA,pTXpos-TX_DATA);// výpocet CRC
															*pTXpos++ = CRC >> 8; 				// úprava CRC z int na char
															*pTXpos++ = CRC; 					// úprava CRC z int na char
															TX_DATA_Len = pTXpos-TX_DATA;		// pocet odesílaných znaku
													 		CPT3++;								// navýsení CPT3
													 		TI = 1;								// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
													 		while(timeout < 26);				// cekání na uplynutí casu 3,5char od posledního odeslaného znaku
															TR0 = 0;							// zastavení casovace 0
															TF0 = 0;							// vynulování príznaku pretecení od casovace 0
															ModbusEvent++;						// navýsení cítace komunikacních událostí
													 		break; 
											}//switch(RX_DATA[1])
									}//if(RX_DATA[0]!=0)
									else{
										CPT5++;	//broadcast
									}	
								}//if((RX_DATA[0]==MODBUS_ADDRES)||(RX_DATA[0]==0))
							}//else(CRC)
						}//else(RXpos)
						for(i=0;i<RXpos;i++){		  	// cyklus nulování príjmového bufferu
							RX_DATA[i] = 0;			    // vynulování príjmového bufferu
						}
						for(i=0;i<TX_DATA_Len;i++){		// cyklus nulování príjmového bufferu
							TX_DATA[i] = 0;				// vynulování vysílacího bufferu
						}
						timeout = 0;		// vynulování cítace pretecení casovace 0
						time_t15 = 0;	  	// vynulování signalizace uplynutí casu 1,5char
						count = 0; 			// vynulování cítace  prijatých bytu
						RXpos = 0;			// vynulování pozice v príjmovém bufferu
						TXpos = 0;			// vynulování pozice ve vysílacím bufferu
						TX_DATA_Len = 0;	// vynulování poctu odesílaných bytu
						REN = 1;			// povolení príjmu sériového kanálu
					}//else(error_frame)
				}//if(timeout >= 26) 
	}		
}//void	 
