#include "sys.h"
#include "uart_5.h"
#include "modbus.h"
//#include "timer.h"
// #define	GET_VP(invar)           (u8*)&invar         // возвращает указатель на переменную

#define DEF_ADDR_VP_VAR1 0x5000 // адрес VP переменной в пространстве  RAM DGUS

xdata u32 num; // беззнаковая переменная 4 байта, для VP переменной Unsigned Long Int
/*
У переменной num начальное значение не равно 0. 
Для переменной в области хранения xdata нельзя напрямую присвоить начальное значение
    Например как это хотелось бы сделать: xdata u32 num = 0; этот способ определения переменных проблематичен
    
Это вызвано внутренними особенностями чипа T5L, потому что 32-килобайтная оперативная память, расширенная внутри чипа T5L, 
    должна быть нормально доступна после инициализации системы sys_init(). 
    
Если вы хотите присвоить начальные значения при определении переменных, 
    то можете использовать ключевые слова data или idata, например: idata u32 num = 0;
Подробнее про xdata, idata и др типы https://www.keil.com/support/man/docs/c51/c51_le_memtypes.htm
    
    static idata u32 num = 0;
*/
//управление RELE
sbit PIO4 = P1^1; //РЕЛЕ #2 LOW (IO1)
sbit PIO6 = P1^2; //РЕЛЕ #4 Hi (IO2)
sbit PIO5 = P1^3; //РЕЛЕ #1 VALVE (IO3) NO+NC
sbit PIO7 = P1^4; //РЕЛЕ #3 Midle (IO4)
//кнопка включения питания
sbit KEY1 = P2^2; //BTN (IO10)

u8 cnt; //счетчик состояний РЕЛЕ
u8 res; //результат чтения по модбасу
u8 pop; //колличество попыток запроса по модбасу
u8 code test[]="uart send..."; //строка для теста RS232
u8 DI[10]; //результат чтения дискретных входов
u16 HLREG[2]; //данные о температуре из контроллера
float VT1;

void io_init()
{
	PORTDRV = 0x01;//Возбуждающий ток равен 8mA
	P1MDOUT |= 0x1E;//конфигурируем все реле на выход
	P2MDOUT &= 0x04;//кнопу на вход
}

void main(void)
{ 
	u8 key1_sta;  //память для кнопки 

	sys_init(); // инициализация основных регистров
	io_init(); // инициализация портов для управления РЕЛЕ 1-4
	
	ModbusRTUTimeout = 7;	//инициализация ситемных переменных
//		T0_Init();		
//		T1_Init();	
 // T2_Init();	
//    WDT_ON();       //
//    UART2_Init();			
//    UART3_Init();				
  UART5_Init();				
	//	UART5_SendStr(test,sizeof(test));	
	//sys_read_vp(DEF_ADDR_VP_VAR1, num, 2);
	num=700;
	PIO4=0;
	PIO6=0;
	PIO5=0;
	PIO7=0;
	cnt=0;
	key1_sta = KEY1;
	
	while(1)
	{ 
		
		//читаем входы на Sat и включаем реле на DWIN
		//они начинются с
		/*res=ModbusReadDiscreteInputs(48,0x100,10,&DI);
		if (res == MDBS_OK) {
			if (DI[0] & 0x01) PIO4 = 1; else PIO4 = 0; //битик 0 в байте DI[0]
			if (DI[0] & 0x02) PIO5 = 1; else PIO5 = 0; //битик 0 в байте DI[0]
			if (DI[0] & 0x40) PIO6 = 1; else PIO6 = 0; //битик 0 в байте DI[0]
			if (DI[0] & 0x80) PIO7 = 1; else PIO7 = 0; //битик 0 в байте DI[0]
		}
		else num=res; //если не удалось процчитать пишем код ошибки	
		8)
		sys_delay_ms(10); // немного ждем и даем зледующтй запрос
		*/
		//Читаем температуру из SaturnPLC с адресом 48 записанную во float формате
		pop=0;
		
	ZMDBS:	sys_delay_ms(100);
	res=ModbusReadHoldingRegisters (16,0x10,2,HLREG); //темература T1
    if (res == MDBS_OK) {
			VT1=ModbusGetFloatDCBA(&HLREG);
		}	
		else 
		{
			pop++;
			if (pop<5) goto ZMDBS;
			VT1=0; //если не удалось процчитать пишем код ошибки	
		}
		
		sys_write_vp(DEF_ADDR_VP_VAR1, GET_VP(VT1), 2); // записать в адрес(VP RAM) 0x5000, из адреса DI[0], 2 слова/word(4 байта)

			//отслеживаем изменение состояния кнопки	
	/*	if(key1_sta!=KEY1)
		{
			key1_sta = KEY1;
			sys_write_vp(0x1000,(u8*)&key1_sta,1);
			PIO7= !PIO7;
		}	
	*/	
		sys_delay_ms(800); // задержка 0.8 секунда		
	}
}











