teste de publish
Dependencies: DS1820 HighSpeedAnalogIn devices mbed
Diff: modbusMaster1.cpp
- Revision:
- 32:7cf1fb8a8bf3
- Parent:
- 26:c246eacf6815
- Child:
- 37:0e95c85f0160
--- a/modbusMaster1.cpp Sat May 26 13:00:00 2018 +0000 +++ b/modbusMaster1.cpp Sat May 26 14:17:55 2018 +0000 @@ -1,4 +1,6 @@ #include "modbusMaster1.h" +#define maxRetentativas 5 +#define maxDelayEntreTentativas 100 //RAD enum { READ_COIL_STATUS = 1, @@ -14,6 +16,7 @@ uint16_t modBusMaster1::T3_5; uint16_t modBusMaster1::T1_5; bool modBusMaster1::pacoteEmEspera; +bool modBusMaster1::pacoteEmEsperaValido; uint16_t modBusMaster1::MODBUS_TIMEOUT; bool modBusMaster1::startThreadModBusMaster; Serial *modBusMaster1::serModBus; @@ -49,9 +52,9 @@ crc_calculado = modBusMaster1::CRC16(modBusMaster1::buffer,modBusMaster1::index-2); crc_lido = (modBusMaster1::buffer[modBusMaster1::index-2]<<8)+(modBusMaster1::buffer[modBusMaster1::index-1]); - + modBusMaster1::pacoteEmEspera=true; if(crc_calculado == crc_lido){ - modBusMaster1::pacoteEmEspera=true; + modBusMaster1::pacoteEmEsperaValido=true; } //pc.printf("crc_calculado = 0x%02x, crc_lido = 0x%02x.\n",crc_calculado,crc_lido); } @@ -117,54 +120,41 @@ uint16_t modBusMaster1::sendFrame(uint16_t tamBytes){ uint16_t timeout = modBusMaster1::MODBUS_TIMEOUT; uint16_t i; - uint16_t retentativas = 5; - uint16_t delayEntreTentativas = 500; - while(retentativas){ - if(debug){ - //DEBUG Mostrando o que é enviado via modbus - pc.printf("Frame enviado (hexa) <"); - for(i=0;i<tamBytes;i++){ - pc.printf("%02x ",modBusMaster1::buffer[i]); - } - pc.printf(">.\n"); - } - osDelay(5); - - modBusMaster1::pacoteEmEspera = false; - modBusMaster1::index=0; - *modBusMaster1::de=1; - //wait_us(1750); - osDelay(2); + if(debug){ + //DEBUG Mostrando o que é enviado via modbus + pc.printf("Frame enviado (hexa) <"); for(i=0;i<tamBytes;i++){ - modBusMaster1::serModBus->putc(modBusMaster1::buffer[i]); - //wait_us(750); - while( - ((LPC_UART1->LSR >> 6) &0x1) - == 0 ); - //wait_us(modBusMaster1::T1_5); + pc.printf("%02x ",modBusMaster1::buffer[i]); } - //wait_us(1750); - //osDelay(1); - *modBusMaster1::de=0; - - while((timeout>0)&&(modBusMaster1::pacoteEmEspera!=true)){ - osDelay(1); - //wait_us(1000); - timeout--; - } - wait_us(modBusMaster1::T3_5*2); - if((!timeout) && (!modBusMaster1::pacoteEmEspera)){ - osDelay(delayEntreTentativas); - retentativas--; - if(debug){ - //DEBUG Mostrando o que é enviado via modbus - pc.printf("Retentativa de comando modbus.\r\n"); - } - }else{ - retentativas = 0; - } + pc.printf(">.\n"); } + + //osDelay(5); + + modBusMaster1::pacoteEmEspera = false; + modBusMaster1::index=0; + *modBusMaster1::de=1; + //wait_us(1750); + osDelay(1); + for(i=0;i<tamBytes;i++){ + modBusMaster1::serModBus->putc(modBusMaster1::buffer[i]); + //wait_us(750); + while( + ((LPC_UART1->LSR >> 6) &0x1) + == 0 ); + //wait_us(modBusMaster1::T1_5); + } + //wait_us(1750); + //osDelay(1); + *modBusMaster1::de=0; + + while((timeout>0)&&(modBusMaster1::pacoteEmEspera!=true)){ + osDelay(1); + //wait_us(1000); + timeout--; + } + wait_us(modBusMaster1::T3_5*2); return timeout; } @@ -181,30 +171,49 @@ for(i=0;i<qtdRegistros;i++){ var[i]=NULL; } - - modBusMaster1::buffer[0]=enderecoSlave; - modBusMaster1::buffer[1]=funcao; - modBusMaster1::buffer[2]=registrador>>8; - modBusMaster1::buffer[3]=(registrador & 0xFF); - modBusMaster1::buffer[4]=qtdRegistros>>8; - modBusMaster1::buffer[5]=(qtdRegistros & 0xFF); - - crc=modBusMaster1::CRC16(modBusMaster1::buffer,6); - - modBusMaster1::buffer[6]=crc>>8; - modBusMaster1::buffer[7]=(crc & 0xFF); - - - - if(!modBusMaster1::sendFrame(8)){ - pc.printf("Erro de timeout.\n"); - return 254; + +//-----------------Bloco de tentativas--------------------- + uint16_t retentativas = maxRetentativas+1; + uint16_t delayEntreTentativas = maxDelayEntreTentativas; + while(retentativas){ + modBusMaster1::buffer[0]=enderecoSlave; + modBusMaster1::buffer[1]=funcao; + modBusMaster1::buffer[2]=registrador>>8; + modBusMaster1::buffer[3]=(registrador & 0xFF); + modBusMaster1::buffer[4]=qtdRegistros>>8; + modBusMaster1::buffer[5]=(qtdRegistros & 0xFF); + + crc=modBusMaster1::CRC16(modBusMaster1::buffer,6); + + modBusMaster1::buffer[6]=crc>>8; + modBusMaster1::buffer[7]=(crc & 0xFF); + + if(!modBusMaster1::sendFrame(8)){ + osDelay(delayEntreTentativas); + retentativas--; + if(debug){ + //DEBUG Mostrando o que é enviado via modbus + pc.printf("Retentativa de comando modbus.\r\n"); + } + if(retentativas==0){ + //erro de timeout certamente + pc.printf("Erro de timeout.\n"); + modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote + modBusMaster1::index = 0; + return 254; + } + }else{ + //Chegou pacote, vamos ver se é valido + retentativas = 0; + } } - - if(!modBusMaster1::pacoteEmEspera){ + if(!modBusMaster1::pacoteEmEsperaValido){ pc.printf("Erro de CRC.\n"); + modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote + modBusMaster1::index = 0; return 255; } +//-----------------Bloco de tentativas--------------------- if(modBusMaster1::buffer[1]&(0x1<<7)){ result = modBusMaster1::buffer[2]; @@ -227,61 +236,76 @@ uint8_t modBusMaster1::writeSingleCoil(uint8_t enderecoSlave,uint16_t registrador,bool var){ uint16_t crc; - uint8_t result = 1; //Tudo ok ate que se prove o contrario. uint16_t estadoSetado; - - modBusMaster1::buffer[0]=enderecoSlave; - modBusMaster1::buffer[1]=5; - modBusMaster1::buffer[2]=registrador>>8; - modBusMaster1::buffer[3]=(registrador & 0xFF); - - if(var){ - modBusMaster1::buffer[4]=0xFF; - modBusMaster1::buffer[5]=0x00; - estadoSetado = 0xFF00; - - }else{ - modBusMaster1::buffer[4]=0x00; - modBusMaster1::buffer[5]=0x00; - estadoSetado = 0x0000; - } - - - crc=modBusMaster1::CRC16(modBusMaster1::buffer,6); - - modBusMaster1::buffer[6]=crc>>8; - modBusMaster1::buffer[7]=(crc & 0xFF); - + uint8_t result = 0; + //-----------------Bloco de tentativas--------------------- + uint16_t retentativas = maxRetentativas+1; + uint16_t delayEntreTentativas = maxDelayEntreTentativas; + while(retentativas){ +//------------Bloco de construcao de frame request---------- + modBusMaster1::buffer[0]=enderecoSlave; + modBusMaster1::buffer[1]=5; + modBusMaster1::buffer[2]=registrador>>8; + modBusMaster1::buffer[3]=(registrador & 0xFF); + + if(var){ + modBusMaster1::buffer[4]=0xFF; + modBusMaster1::buffer[5]=0x00; + estadoSetado = 0xFF00; + + }else{ + modBusMaster1::buffer[4]=0x00; + modBusMaster1::buffer[5]=0x00; + estadoSetado = 0x0000; + } + + + crc=modBusMaster1::CRC16(modBusMaster1::buffer,6); + + modBusMaster1::buffer[6]=crc>>8; + modBusMaster1::buffer[7]=(crc & 0xFF); +//------------Bloco de construcao de frame request---------- + if(!modBusMaster1::sendFrame(8)){ + osDelay(delayEntreTentativas); + retentativas--; + if(debug){ + //DEBUG Mostrando o que é enviado via modbus + pc.printf("Retentativa de comando modbus.\r\n"); + } + if(retentativas==0){ + //erro de timeout certamente + pc.printf("Erro de timeout.\n"); + modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote + modBusMaster1::index = 0; + return 254; + } + }else{ + //Chegou pacote, vamos ver se é valido + retentativas = 0; + } + } + if(!modBusMaster1::pacoteEmEsperaValido){ + pc.printf("Erro de CRC.\n"); + modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote + modBusMaster1::index = 0; + return 255; + } +//-----------------Bloco de tentativas--------------------- - - if(!modBusMaster1::sendFrame(8)){ - pc.printf("Erro de timeout.\n"); - result = 254; - return result; - } - - if(!modBusMaster1::pacoteEmEspera){ - pc.printf("Erro de CRC.\n"); - result = 255; - return result; - } - - if(result){ - if(modBusMaster1::buffer[1]&(0x1<<7)){ - result = modBusMaster1::buffer[2]; - }else{ - if( - (((modBusMaster1::buffer[2]<<8)+(modBusMaster1::buffer[3]))==registrador) - && - (((modBusMaster1::buffer[4]<<8)+(modBusMaster1::buffer[5]))==estadoSetado) - ){ - result=0; - }else{ - result=253; - } - } - } - + + if(modBusMaster1::buffer[1]&(0x1<<7)){ + result = modBusMaster1::buffer[2]; + }else{ + if( + (((modBusMaster1::buffer[2]<<8)+(modBusMaster1::buffer[3]))==registrador) + && + (((modBusMaster1::buffer[4]<<8)+(modBusMaster1::buffer[5]))==estadoSetado) + ){ + result=0; + }else{ + result=253; + } + } modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote modBusMaster1::index = 0; return result; @@ -291,31 +315,52 @@ uint16_t crc; uint8_t result; uint16_t i; - - modBusMaster1::buffer[0]=enderecoSlave; - modBusMaster1::buffer[1]=1; - modBusMaster1::buffer[2]=registrador>>8; - modBusMaster1::buffer[3]=(registrador & 0xFF); - modBusMaster1::buffer[4]=qtdRegistros>>8; - modBusMaster1::buffer[5]=(qtdRegistros & 0xFF); - - crc=modBusMaster1::CRC16(modBusMaster1::buffer,6); +//-----------------Bloco de tentativas--------------------- + uint16_t retentativas = maxRetentativas+1; + uint16_t delayEntreTentativas = maxDelayEntreTentativas; + while(retentativas){ +//------------Bloco de construcao de frame request---------- + + modBusMaster1::buffer[0]=enderecoSlave; + modBusMaster1::buffer[1]=1; + modBusMaster1::buffer[2]=registrador>>8; + modBusMaster1::buffer[3]=(registrador & 0xFF); + modBusMaster1::buffer[4]=qtdRegistros>>8; + modBusMaster1::buffer[5]=(qtdRegistros & 0xFF); + + crc=modBusMaster1::CRC16(modBusMaster1::buffer,6); + + modBusMaster1::buffer[6]=crc>>8; + modBusMaster1::buffer[7]=(crc & 0xFF); - modBusMaster1::buffer[6]=crc>>8; - modBusMaster1::buffer[7]=(crc & 0xFF); - - - - if(!modBusMaster1::sendFrame(8)){ - pc.printf("Erro de timeout.\n"); - return 254; +//------------Bloco de construcao de frame request---------- + if(!modBusMaster1::sendFrame(8)){ + osDelay(delayEntreTentativas); + retentativas--; + if(debug){ + //DEBUG Mostrando o que é enviado via modbus + pc.printf("Retentativa de comando modbus.\r\n"); + } + if(retentativas==0){ + //erro de timeout certamente + pc.printf("Erro de timeout.\n"); + modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote + modBusMaster1::index = 0; + return 254; + } + }else{ + //Chegou pacote, vamos ver se é valido + retentativas = 0; + } } - - if(!modBusMaster1::pacoteEmEspera){ + if(!modBusMaster1::pacoteEmEsperaValido){ pc.printf("Erro de CRC.\n"); + modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote + modBusMaster1::index = 0; return 255; } - +//-----------------Bloco de tentativas--------------------- + if(modBusMaster1::buffer[1]&(0x1<<7)){ result = modBusMaster1::buffer[2]; }else{ @@ -352,31 +397,53 @@ for(i=0;i<qtdRegistros;i++){ var[i]=NULL; } - - modBusMaster1::buffer[0]=enderecoSlave; - modBusMaster1::buffer[1]=funcao; - modBusMaster1::buffer[2]=registrador>>8; - modBusMaster1::buffer[3]=(registrador & 0xFF); - modBusMaster1::buffer[4]=qtdRegistros>>8; - modBusMaster1::buffer[5]=(qtdRegistros & 0xFF); - - crc=modBusMaster1::CRC16(modBusMaster1::buffer,6); + +//-----------------Bloco de tentativas--------------------- + uint16_t retentativas = maxRetentativas+1; + uint16_t delayEntreTentativas = maxDelayEntreTentativas; + while(retentativas){ +//------------Bloco de construcao de frame request---------- + + modBusMaster1::buffer[0]=enderecoSlave; + modBusMaster1::buffer[1]=funcao; + modBusMaster1::buffer[2]=registrador>>8; + modBusMaster1::buffer[3]=(registrador & 0xFF); + modBusMaster1::buffer[4]=qtdRegistros>>8; + modBusMaster1::buffer[5]=(qtdRegistros & 0xFF); + + crc=modBusMaster1::CRC16(modBusMaster1::buffer,6); + + modBusMaster1::buffer[6]=crc>>8; + modBusMaster1::buffer[7]=(crc & 0xFF); - modBusMaster1::buffer[6]=crc>>8; - modBusMaster1::buffer[7]=(crc & 0xFF); - - - - if(!modBusMaster1::sendFrame(8)){ - pc.printf("Erro de timeout.\n"); - return 254; +//------------Bloco de construcao de frame request---------- + if(!modBusMaster1::sendFrame(8)){ + osDelay(delayEntreTentativas); + retentativas--; + if(debug){ + //DEBUG Mostrando o que é enviado via modbus + pc.printf("Retentativa de comando modbus.\r\n"); + } + if(retentativas==0){ + //erro de timeout certamente + pc.printf("Erro de timeout.\n"); + modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote + modBusMaster1::index = 0; + return 254; + } + }else{ + //Chegou pacote, vamos ver se é valido + retentativas = 0; + } } - - if(!modBusMaster1::pacoteEmEspera){ + if(!modBusMaster1::pacoteEmEsperaValido){ pc.printf("Erro de CRC.\n"); + modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote + modBusMaster1::index = 0; return 255; } - +//-----------------Bloco de tentativas--------------------- + if(modBusMaster1::buffer[1]&(0x1<<7)){ result = modBusMaster1::buffer[2]; }else{ @@ -401,37 +468,58 @@ uint16_t i; uint16_t crc; uint8_t result; - - modBusMaster1::buffer[0]=enderecoSlave; - modBusMaster1::buffer[1]=16; - modBusMaster1::buffer[2]=registrador>>8; - modBusMaster1::buffer[3]=(registrador & 0xFF); - modBusMaster1::buffer[4]=qtdRegistros>>8; - modBusMaster1::buffer[5]=(qtdRegistros & 0xFF); - modBusMaster1::buffer[6]=qtdRegistros*2; - - for(i=0;i<qtdRegistros;i++){ - modBusMaster1::buffer[(i*2)+7]=var[i]>>8; - modBusMaster1::buffer[(i*2)+8]=var[i]&0xFF; - } + +//-----------------Bloco de tentativas--------------------- + uint16_t retentativas = maxRetentativas+1; + uint16_t delayEntreTentativas = maxDelayEntreTentativas; + while(retentativas){ +//------------Bloco de construcao de frame request---------- - crc=modBusMaster1::CRC16(modBusMaster1::buffer,((qtdRegistros)*2)+7); - - modBusMaster1::buffer[(qtdRegistros*2)+7]=crc>>8;; - modBusMaster1::buffer[(qtdRegistros*2)+8]=(crc & 0xFF); - - - - //Enviando frame - if(!modBusMaster1::sendFrame((qtdRegistros*2)+9)){ - pc.printf("Erro de timeout.\n"); - return 254; + modBusMaster1::buffer[0]=enderecoSlave; + modBusMaster1::buffer[1]=16; + modBusMaster1::buffer[2]=registrador>>8; + modBusMaster1::buffer[3]=(registrador & 0xFF); + modBusMaster1::buffer[4]=qtdRegistros>>8; + modBusMaster1::buffer[5]=(qtdRegistros & 0xFF); + modBusMaster1::buffer[6]=qtdRegistros*2; + + for(i=0;i<qtdRegistros;i++){ + modBusMaster1::buffer[(i*2)+7]=var[i]>>8; + modBusMaster1::buffer[(i*2)+8]=var[i]&0xFF; + } + + crc=modBusMaster1::CRC16(modBusMaster1::buffer,((qtdRegistros)*2)+7); + + modBusMaster1::buffer[(qtdRegistros*2)+7]=crc>>8;; + modBusMaster1::buffer[(qtdRegistros*2)+8]=(crc & 0xFF); + +//------------Bloco de construcao de frame request---------- + if(!modBusMaster1::sendFrame((qtdRegistros*2)+9)){ + osDelay(delayEntreTentativas); + retentativas--; + if(debug){ + //DEBUG Mostrando o que é enviado via modbus + pc.printf("Retentativa de comando modbus.\r\n"); + } + if(retentativas==0){ + //erro de timeout certamente + pc.printf("Erro de timeout.\n"); + modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote + modBusMaster1::index = 0; + return 254; + } + }else{ + //Chegou pacote, vamos ver se é valido + retentativas = 0; + } } - - if(!modBusMaster1::pacoteEmEspera){ + if(!modBusMaster1::pacoteEmEsperaValido){ pc.printf("Erro de CRC.\n"); + modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote + modBusMaster1::index = 0; return 255; } +//-----------------Bloco de tentativas--------------------- modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote modBusMaster1::index = 0; @@ -455,38 +543,60 @@ uint16_t crc; uint8_t result; - modBusMaster1::buffer[0]=enderecoSlave; - modBusMaster1::buffer[1]=16; - modBusMaster1::buffer[2]=registrador>>8; - modBusMaster1::buffer[3]=(registrador & 0xFF); - modBusMaster1::buffer[4]=qtdRegistros>>8; - modBusMaster1::buffer[5]=(qtdRegistros & 0xFF); - modBusMaster1::buffer[6]=qtdRegistros*4; - - for(i=0;i<qtdRegistros;i++){ - modBusMaster1::buffer[(i*4)+7]=(var[i]>>24)&0xFF; - modBusMaster1::buffer[(i*4)+8]=(var[i]>>16)&0xFF; - modBusMaster1::buffer[(i*4)+9]=(var[i]>>8)&0xFF; - modBusMaster1::buffer[(i*4)+10]=var[i]&0xFF; - } +//-----------------Bloco de tentativas--------------------- + uint16_t retentativas = maxRetentativas+1; + uint16_t delayEntreTentativas = maxDelayEntreTentativas; + while(retentativas){ +//------------Bloco de construcao de frame request---------- - crc=modBusMaster1::CRC16(modBusMaster1::buffer,((qtdRegistros)*4)+7); - - modBusMaster1::buffer[(qtdRegistros*4)+7]=crc>>8;; - modBusMaster1::buffer[(qtdRegistros*4)+8]=(crc & 0xFF); - - + modBusMaster1::buffer[0]=enderecoSlave; + modBusMaster1::buffer[1]=16; + modBusMaster1::buffer[2]=registrador>>8; + modBusMaster1::buffer[3]=(registrador & 0xFF); + modBusMaster1::buffer[4]=qtdRegistros>>8; + modBusMaster1::buffer[5]=(qtdRegistros & 0xFF); + modBusMaster1::buffer[6]=qtdRegistros*4; + + for(i=0;i<qtdRegistros;i++){ + modBusMaster1::buffer[(i*4)+7]=(var[i]>>24)&0xFF; + modBusMaster1::buffer[(i*4)+8]=(var[i]>>16)&0xFF; + modBusMaster1::buffer[(i*4)+9]=(var[i]>>8)&0xFF; + modBusMaster1::buffer[(i*4)+10]=var[i]&0xFF; + } + + crc=modBusMaster1::CRC16(modBusMaster1::buffer,((qtdRegistros)*4)+7); + + modBusMaster1::buffer[(qtdRegistros*4)+7]=crc>>8;; + modBusMaster1::buffer[(qtdRegistros*4)+8]=(crc & 0xFF); - //Enviando frame - if(!modBusMaster1::sendFrame((qtdRegistros*4)+9)){ - pc.printf("Erro de timeout.\n"); - return 254; +//------------Bloco de construcao de frame request---------- + if(!modBusMaster1::sendFrame((qtdRegistros*4)+9)){ + osDelay(delayEntreTentativas); + retentativas--; + if(debug){ + //DEBUG Mostrando o que é enviado via modbus + pc.printf("Retentativa de comando modbus.\r\n"); + } + if(retentativas==0){ + //erro de timeout certamente + pc.printf("Erro de timeout.\n"); + modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote + modBusMaster1::index = 0; + return 254; + } + }else{ + //Chegou pacote, vamos ver se é valido + retentativas = 0; + } } - - if(!modBusMaster1::pacoteEmEspera){ + if(!modBusMaster1::pacoteEmEsperaValido){ pc.printf("Erro de CRC.\n"); + modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote + modBusMaster1::index = 0; return 255; } +//-----------------Bloco de tentativas--------------------- + modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote modBusMaster1::index = 0; @@ -513,40 +623,61 @@ uint16_t i; uint16_t crc; uint8_t result; - - modBusMaster1::buffer[0]=enderecoSlave; - modBusMaster1::buffer[1]=16; - modBusMaster1::buffer[2]=registrador>>8; - modBusMaster1::buffer[3]=(registrador & 0xFF); - modBusMaster1::buffer[4]=qtdRegistros>>8; - modBusMaster1::buffer[5]=(qtdRegistros & 0xFF); - modBusMaster1::buffer[6]=qtdRegistros*4; - - for(i=0;i<qtdRegistros;i++){ - u.v = var[i]; - modBusMaster1::buffer[(i*4)+7]=u.c[3]; - modBusMaster1::buffer[(i*4)+8]=u.c[2]; - modBusMaster1::buffer[(i*4)+9]=u.c[1]; - modBusMaster1::buffer[(i*4)+10]=u.c[0]; - } - - crc=modBusMaster1::CRC16(modBusMaster1::buffer,((qtdRegistros)*4)+7); - - modBusMaster1::buffer[(qtdRegistros*4)+7]=crc>>8;; - modBusMaster1::buffer[(qtdRegistros*4)+8]=(crc & 0xFF); - - - - //Enviando frame - if(!modBusMaster1::sendFrame((qtdRegistros*4)+9)){ - pc.printf("Erro de timeout.\n"); - return 254; +//-----------------Bloco de tentativas--------------------- + uint16_t retentativas = maxRetentativas+1; + uint16_t delayEntreTentativas = maxDelayEntreTentativas; + while(retentativas){ +//------------Bloco de construcao de frame request---------- + + modBusMaster1::buffer[0]=enderecoSlave; + modBusMaster1::buffer[1]=16; + modBusMaster1::buffer[2]=registrador>>8; + modBusMaster1::buffer[3]=(registrador & 0xFF); + modBusMaster1::buffer[4]=qtdRegistros>>8; + modBusMaster1::buffer[5]=(qtdRegistros & 0xFF); + modBusMaster1::buffer[6]=qtdRegistros*4; + + for(i=0;i<qtdRegistros;i++){ + u.v = var[i]; + modBusMaster1::buffer[(i*4)+7]=u.c[3]; + modBusMaster1::buffer[(i*4)+8]=u.c[2]; + modBusMaster1::buffer[(i*4)+9]=u.c[1]; + modBusMaster1::buffer[(i*4)+10]=u.c[0]; + } + + crc=modBusMaster1::CRC16(modBusMaster1::buffer,((qtdRegistros)*4)+7); + + modBusMaster1::buffer[(qtdRegistros*4)+7]=crc>>8;; + modBusMaster1::buffer[(qtdRegistros*4)+8]=(crc & 0xFF); + +//------------Bloco de construcao de frame request---------- + if(!modBusMaster1::sendFrame((qtdRegistros*4)+9)){ + osDelay(delayEntreTentativas); + retentativas--; + if(debug){ + //DEBUG Mostrando o que é enviado via modbus + pc.printf("Retentativa de comando modbus.\r\n"); + } + if(retentativas==0){ + //erro de timeout certamente + pc.printf("Erro de timeout.\n"); + modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote + modBusMaster1::index = 0; + return 254; + } + }else{ + //Chegou pacote, vamos ver se é valido + retentativas = 0; + } } - - if(!modBusMaster1::pacoteEmEspera){ + if(!modBusMaster1::pacoteEmEsperaValido){ pc.printf("Erro de CRC.\n"); + modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote + modBusMaster1::index = 0; return 255; } +//-----------------Bloco de tentativas--------------------- + modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote modBusMaster1::index = 0; @@ -578,47 +709,52 @@ for(i=0;i<qtdRegistros;i++){ var[i]=0.0; } + +//-----------------Bloco de tentativas--------------------- + uint16_t retentativas = maxRetentativas+1; + uint16_t delayEntreTentativas = maxDelayEntreTentativas; + while(retentativas){ +//------------Bloco de construcao de frame request---------- - modBusMaster1::buffer[0]=enderecoSlave; - modBusMaster1::buffer[1]=funcao; - modBusMaster1::buffer[2]=registrador>>8; - modBusMaster1::buffer[3]=(registrador & 0xFF); - modBusMaster1::buffer[4]=qtdRegistros>>8; - modBusMaster1::buffer[5]=(qtdRegistros & 0xFF); - - crc=modBusMaster1::CRC16(modBusMaster1::buffer,6); + modBusMaster1::buffer[0]=enderecoSlave; + modBusMaster1::buffer[1]=funcao; + modBusMaster1::buffer[2]=registrador>>8; + modBusMaster1::buffer[3]=(registrador & 0xFF); + modBusMaster1::buffer[4]=qtdRegistros>>8; + modBusMaster1::buffer[5]=(qtdRegistros & 0xFF); + + crc=modBusMaster1::CRC16(modBusMaster1::buffer,6); + + modBusMaster1::buffer[6]=crc>>8; + modBusMaster1::buffer[7]=(crc & 0xFF); - modBusMaster1::buffer[6]=crc>>8; - modBusMaster1::buffer[7]=(crc & 0xFF); - - - - if(!modBusMaster1::sendFrame(8)){ - pc.printf("Erro de timeout.\n"); - return 254; +//------------Bloco de construcao de frame request---------- + if(!modBusMaster1::sendFrame(8)){ + osDelay(delayEntreTentativas); + retentativas--; + if(debug){ + //DEBUG Mostrando o que é enviado via modbus + pc.printf("Retentativa de comando modbus.\r\n"); + } + if(retentativas==0){ + //erro de timeout certamente + pc.printf("Erro de timeout.\n"); + modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote + modBusMaster1::index = 0; + return 254; + } + }else{ + //Chegou pacote, vamos ver se é valido + retentativas = 0; + } } - - if(!modBusMaster1::pacoteEmEspera){ + if(!modBusMaster1::pacoteEmEsperaValido){ pc.printf("Erro de CRC.\n"); + modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote + modBusMaster1::index = 0; return 255; } - - - /* - for(i=3;i<modBusMaster1::index-2;i++){ - u.c[3-(i-3)]= modBusMaster1::buffer[i]; - } - - *var = u.f; - */ - - - /*pc.printf("Lido pacote de modBus <0x"); - - for(i=0;i<modBusMaster1::index;i++){ - pc.printf("%02x ",modBusMaster1::buffer[i]); - } - pc.printf(">.\n");*/ +//-----------------Bloco de tentativas--------------------- if(modBusMaster1::buffer[1]&(0x1<<7)){ result = modBusMaster1::buffer[2];