teste de publish
Dependencies: DS1820 HighSpeedAnalogIn devices mbed
modbusMaster1.cpp
00001 #include "modbusMaster1.h" 00002 #define maxRetentativas 5 00003 #define maxDelayEntreTentativas 100 00004 //RAD 00005 enum { 00006 READ_COIL_STATUS = 1, 00007 READ_INPUT_STATUS, 00008 READ_HOLDING_REGISTERS, 00009 READ_INPUT_REGISTERS, 00010 WRITE_SINGLE_COIL, 00011 WRITE_SINGLE_REGISTER, 00012 WRITE_MULTIPLE_COILS, 00013 WRITE_MULTIPLE_REGISTERS 00014 }modBusFunctions; 00015 00016 uint16_t modBusMaster1::T3_5; 00017 uint16_t modBusMaster1::T1_5; 00018 bool modBusMaster1::pacoteEmEspera; 00019 bool modBusMaster1::pacoteEmEsperaValido; 00020 uint16_t modBusMaster1::MODBUS_TIMEOUT; 00021 bool modBusMaster1::startThreadModBusMaster; 00022 Serial *modBusMaster1::serModBus; 00023 DigitalOut *modBusMaster1::de; 00024 uint16_t modBusMaster1::MODBUS_SERIAL_BAUD; 00025 00026 uint8_t modBusMaster1::buffer[maxLenBufModBus]; //Buffer in e out; 00027 uint16_t modBusMaster1::index; 00028 00029 //Timer 00030 osTimerId modBusMaster1::timer_pacote; 00031 osTimerDef(timerProcessaPacoteModBusMaster1,modBusMaster1::processaPacote); 00032 //Timer 00033 00034 void modBusMaster1::processaPacote(void const *){ 00035 //Validando CRC 00036 uint16_t crc_calculado; 00037 uint16_t crc_lido; 00038 00039 if(debug){ 00040 //Lido resposta DEBUG 00041 pc.printf("Lido de resposta modbus <"); 00042 for(crc_lido = 0; crc_lido < modBusMaster1::index; crc_lido++){ 00043 pc.printf("%02X ",modBusMaster1::buffer[crc_lido]); 00044 } 00045 pc.printf(">.\n"); 00046 } 00047 if(modBusMaster1::index<3){ 00048 modBusMaster1::pacoteEmEspera=false; 00049 return; 00050 } 00051 00052 crc_calculado = modBusMaster1::CRC16(modBusMaster1::buffer,modBusMaster1::index-2); 00053 crc_lido = (modBusMaster1::buffer[modBusMaster1::index-2]<<8)+(modBusMaster1::buffer[modBusMaster1::index-1]); 00054 00055 modBusMaster1::pacoteEmEspera=true; 00056 if(crc_calculado == crc_lido){ 00057 modBusMaster1::pacoteEmEsperaValido=true; 00058 } 00059 //pc.printf("crc_calculado = 0x%02x, crc_lido = 0x%02x.\n",crc_calculado,crc_lido); 00060 } 00061 00062 uint16_t modBusMaster1::CRC16(uint8_t *buf,uint16_t len){ 00063 uint16_t crc = 0xFFFF; 00064 uint16_t pos; 00065 uint16_t i; 00066 for (pos = 0; pos < len; pos++) { 00067 crc ^= buf[pos]; // XOR byte into least sig. byte of crc 00068 00069 for (i = 8; i != 0; i--) { // Loop over each bit 00070 if ((crc & 0x0001) != 0) { // If the LSB is set 00071 crc >>= 1; // Shift right and XOR 0xA001 00072 crc ^= 0xA001; 00073 } 00074 else // Else LSB is not set 00075 crc >>= 1; // Just shift right 00076 } 00077 } 00078 // Note, this number has low and high bytes swapped, so use it accordingly (or swap bytes) 00079 return ((crc<<8)+(crc>>8)); 00080 } 00081 00082 void modBusMaster1::modBusMaster(Serial *serial,uint32_t baud,DigitalOut *pinDe){ 00083 modBusMaster1::serModBus = serial; 00084 modBusMaster1::de = pinDe; 00085 modBusMaster1::index = 0; 00086 *modBusMaster1::de = 0; 00087 modBusMaster1::serModBus->attach(&modBusMaster1::processaCaractere); 00088 modBusMaster1::serModBus->baud(baud); 00089 modBusMaster1::pacoteEmEspera = false; 00090 //Criando timer_pacote 00091 modBusMaster1::timer_pacote = osTimerCreate(osTimer(timerProcessaPacoteModBusMaster1),osTimerOnce,NULL); 00092 } 00093 00094 void modBusMaster1::setBaud(uint32_t baud){ 00095 modBusMaster1::serModBus->baud(baud); 00096 if (baud > 19200){ 00097 modBusMaster1::T1_5 = 750; 00098 modBusMaster1::T3_5 = 1750; 00099 }else { 00100 modBusMaster1::T1_5 = 15000000/baud; 00101 modBusMaster1::T3_5 = 35000000/baud; 00102 } 00103 } 00104 00105 00106 00107 void modBusMaster1::processaCaractere(){ 00108 uint32_t RBR = LPC_UART1->RBR; //Reset RBR interrupt flag e captura o caractere entrante 00109 modBusMaster1::buffer[modBusMaster1::index]=RBR; 00110 modBusMaster1::index++; 00111 if(modBusMaster1::index>=maxLenBufModBus){ 00112 modBusMaster1::index=modBusMaster1::index-1; 00113 } 00114 modBusMaster1::startThreadModBusMaster=true; 00115 osSignalSet(idThreadTimers, 0x1); //Envia sinal para a thread de manipulação dos timers para ativar os timers agendados 00116 //comLedIn=!comLedIn; 00117 //pc.printf("%c",RBR); 00118 } 00119 00120 uint16_t modBusMaster1::sendFrame(uint16_t tamBytes){ 00121 uint16_t timeout = modBusMaster1::MODBUS_TIMEOUT; 00122 timeout /=10; 00123 uint16_t i; 00124 00125 if(debug){ 00126 //DEBUG Mostrando o que é enviado via modbus 00127 pc.printf("Frame enviado (hexa) <"); 00128 for(i=0;i<tamBytes;i++){ 00129 pc.printf("%02x ",modBusMaster1::buffer[i]); 00130 } 00131 pc.printf(">.\n"); 00132 } 00133 00134 //osDelay(5); 00135 00136 modBusMaster1::pacoteEmEspera = false; 00137 modBusMaster1::index=0; 00138 *modBusMaster1::de=1; 00139 //wait_us(1750); 00140 osDelay(1); 00141 for(i=0;i<tamBytes;i++){ 00142 modBusMaster1::serModBus->putc(modBusMaster1::buffer[i]); 00143 //wait_us(750); 00144 while( 00145 ((LPC_UART1->LSR >> 6) &0x1) 00146 == 0 ); 00147 //wait_us(modBusMaster1::T1_5); 00148 } 00149 //wait_us(1750); 00150 //osDelay(1); 00151 *modBusMaster1::de=0; 00152 00153 while((timeout>0)&&(modBusMaster1::pacoteEmEspera!=true)){ 00154 osDelay(10); 00155 //wait_us(1000); 00156 timeout--; 00157 } 00158 wait_us(modBusMaster1::T3_5*2); 00159 return timeout; 00160 } 00161 00162 uint8_t modBusMaster1::readRegister16BIT(uint8_t enderecoSlave,uint8_t funcao,uint16_t registrador,uint16_t qtdRegistros,uint16_t *var){ 00163 union{ 00164 char c[2]; 00165 uint16_t v; 00166 }u; 00167 uint16_t crc; 00168 uint16_t qtd_dados_recebidos; 00169 uint16_t i; 00170 uint8_t result; 00171 00172 for(i=0;i<qtdRegistros;i++){ 00173 var[i]=NULL; 00174 } 00175 00176 //-----------------Bloco de tentativas--------------------- 00177 uint16_t retentativas = maxRetentativas+1; 00178 uint16_t delayEntreTentativas = maxDelayEntreTentativas; 00179 while(retentativas){ 00180 modBusMaster1::buffer[0]=enderecoSlave; 00181 modBusMaster1::buffer[1]=funcao; 00182 modBusMaster1::buffer[2]=registrador>>8; 00183 modBusMaster1::buffer[3]=(registrador & 0xFF); 00184 modBusMaster1::buffer[4]=qtdRegistros>>8; 00185 modBusMaster1::buffer[5]=(qtdRegistros & 0xFF); 00186 00187 crc=modBusMaster1::CRC16(modBusMaster1::buffer,6); 00188 00189 modBusMaster1::buffer[6]=crc>>8; 00190 modBusMaster1::buffer[7]=(crc & 0xFF); 00191 00192 if(!modBusMaster1::sendFrame(8)){ 00193 osDelay(delayEntreTentativas); 00194 retentativas--; 00195 if(debug){ 00196 //DEBUG Mostrando o que é enviado via modbus 00197 pc.printf("Retentativa de comando modbus.\r\n"); 00198 } 00199 if(retentativas==0){ 00200 //erro de timeout certamente 00201 pc.printf("Erro de timeout.\n"); 00202 modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote 00203 modBusMaster1::index = 0; 00204 return 254; 00205 } 00206 }else{ 00207 //Chegou pacote, vamos ver se é valido 00208 retentativas = 0; 00209 } 00210 } 00211 if(!modBusMaster1::pacoteEmEsperaValido){ 00212 pc.printf("Erro de CRC.\n"); 00213 modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote 00214 modBusMaster1::index = 0; 00215 return 255; 00216 } 00217 //-----------------Bloco de tentativas--------------------- 00218 00219 if(modBusMaster1::buffer[1]&(0x1<<7)){ 00220 result = modBusMaster1::buffer[2]; 00221 }else{ 00222 qtd_dados_recebidos = modBusMaster1::buffer[2]/2; 00223 for(i=0;i<qtd_dados_recebidos;i++){ 00224 u.c[1]=modBusMaster1::buffer[(i*2)+3]; 00225 u.c[0]=modBusMaster1::buffer[(i*2)+4]; 00226 var[i]=u.v; 00227 } 00228 result = 0; 00229 } 00230 00231 00232 00233 modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote 00234 modBusMaster1::index = 0; 00235 return result; 00236 } 00237 00238 uint8_t modBusMaster1::writeSingleCoil(uint8_t enderecoSlave,uint16_t registrador,bool var){ 00239 uint16_t crc; 00240 uint16_t estadoSetado; 00241 uint8_t result = 0; 00242 //-----------------Bloco de tentativas--------------------- 00243 uint16_t retentativas = maxRetentativas+1; 00244 uint16_t delayEntreTentativas = maxDelayEntreTentativas; 00245 while(retentativas){ 00246 //------------Bloco de construcao de frame request---------- 00247 modBusMaster1::buffer[0]=enderecoSlave; 00248 modBusMaster1::buffer[1]=5; 00249 modBusMaster1::buffer[2]=registrador>>8; 00250 modBusMaster1::buffer[3]=(registrador & 0xFF); 00251 00252 if(var){ 00253 modBusMaster1::buffer[4]=0xFF; 00254 modBusMaster1::buffer[5]=0x00; 00255 estadoSetado = 0xFF00; 00256 00257 }else{ 00258 modBusMaster1::buffer[4]=0x00; 00259 modBusMaster1::buffer[5]=0x00; 00260 estadoSetado = 0x0000; 00261 } 00262 00263 00264 crc=modBusMaster1::CRC16(modBusMaster1::buffer,6); 00265 00266 modBusMaster1::buffer[6]=crc>>8; 00267 modBusMaster1::buffer[7]=(crc & 0xFF); 00268 //------------Bloco de construcao de frame request---------- 00269 if(!modBusMaster1::sendFrame(8)){ 00270 osDelay(delayEntreTentativas); 00271 retentativas--; 00272 if(debug){ 00273 //DEBUG Mostrando o que é enviado via modbus 00274 pc.printf("Retentativa de comando modbus.\r\n"); 00275 } 00276 if(retentativas==0){ 00277 //erro de timeout certamente 00278 pc.printf("Erro de timeout.\n"); 00279 modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote 00280 modBusMaster1::index = 0; 00281 return 254; 00282 } 00283 }else{ 00284 //Chegou pacote, vamos ver se é valido 00285 retentativas = 0; 00286 } 00287 } 00288 if(!modBusMaster1::pacoteEmEsperaValido){ 00289 pc.printf("Erro de CRC.\n"); 00290 modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote 00291 modBusMaster1::index = 0; 00292 return 255; 00293 } 00294 //-----------------Bloco de tentativas--------------------- 00295 00296 00297 if(modBusMaster1::buffer[1]&(0x1<<7)){ 00298 result = modBusMaster1::buffer[2]; 00299 }else{ 00300 if( 00301 (((modBusMaster1::buffer[2]<<8)+(modBusMaster1::buffer[3]))==registrador) 00302 && 00303 (((modBusMaster1::buffer[4]<<8)+(modBusMaster1::buffer[5]))==estadoSetado) 00304 ){ 00305 result=0; 00306 }else{ 00307 result=253; 00308 } 00309 } 00310 modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote 00311 modBusMaster1::index = 0; 00312 return result; 00313 } 00314 00315 uint8_t modBusMaster1::readCoils(uint8_t enderecoSlave,uint16_t registrador,uint16_t qtdRegistros,bool *var){ 00316 uint16_t crc; 00317 uint8_t result; 00318 uint16_t i; 00319 //-----------------Bloco de tentativas--------------------- 00320 uint16_t retentativas = maxRetentativas+1; 00321 uint16_t delayEntreTentativas = maxDelayEntreTentativas; 00322 while(retentativas){ 00323 //------------Bloco de construcao de frame request---------- 00324 00325 modBusMaster1::buffer[0]=enderecoSlave; 00326 modBusMaster1::buffer[1]=1; 00327 modBusMaster1::buffer[2]=registrador>>8; 00328 modBusMaster1::buffer[3]=(registrador & 0xFF); 00329 modBusMaster1::buffer[4]=qtdRegistros>>8; 00330 modBusMaster1::buffer[5]=(qtdRegistros & 0xFF); 00331 00332 crc=modBusMaster1::CRC16(modBusMaster1::buffer,6); 00333 00334 modBusMaster1::buffer[6]=crc>>8; 00335 modBusMaster1::buffer[7]=(crc & 0xFF); 00336 00337 //------------Bloco de construcao de frame request---------- 00338 if(!modBusMaster1::sendFrame(8)){ 00339 osDelay(delayEntreTentativas); 00340 retentativas--; 00341 if(debug){ 00342 //DEBUG Mostrando o que é enviado via modbus 00343 pc.printf("Retentativa de comando modbus.\r\n"); 00344 } 00345 if(retentativas==0){ 00346 //erro de timeout certamente 00347 pc.printf("Erro de timeout.\n"); 00348 modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote 00349 modBusMaster1::index = 0; 00350 return 254; 00351 } 00352 }else{ 00353 //Chegou pacote, vamos ver se é valido 00354 retentativas = 0; 00355 } 00356 } 00357 if(!modBusMaster1::pacoteEmEsperaValido){ 00358 pc.printf("Erro de CRC.\n"); 00359 modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote 00360 modBusMaster1::index = 0; 00361 return 255; 00362 } 00363 //-----------------Bloco de tentativas--------------------- 00364 00365 if(modBusMaster1::buffer[1]&(0x1<<7)){ 00366 result = modBusMaster1::buffer[2]; 00367 }else{ 00368 if( 00369 modBusMaster1::buffer[2] == (1+((uint16_t)(qtdRegistros/8))) 00370 ){ 00371 //Bloco de leitura das coils 00372 for(i=0;i<qtdRegistros;i++){ 00373 var[i] = ( 00374 (modBusMaster1::buffer[(i/8)+3] & ( 0x1 << (i%8) )) >0 00375 ); 00376 } 00377 result = 0; 00378 }else{ 00379 result = 253; 00380 } 00381 } 00382 00383 00384 modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote 00385 modBusMaster1::index = 0; 00386 return result; 00387 } 00388 uint8_t modBusMaster1::readRegister32BIT(uint8_t enderecoSlave,uint8_t funcao,uint16_t registrador,uint16_t qtdRegistros,uint32_t *var){ 00389 union{ 00390 char c[4]; 00391 uint32_t v; 00392 }u; 00393 uint16_t crc; 00394 uint16_t qtd_dados_recebidos; 00395 uint16_t i; 00396 uint8_t result; 00397 00398 for(i=0;i<qtdRegistros;i++){ 00399 var[i]=NULL; 00400 } 00401 00402 //-----------------Bloco de tentativas--------------------- 00403 uint16_t retentativas = maxRetentativas+1; 00404 uint16_t delayEntreTentativas = maxDelayEntreTentativas; 00405 while(retentativas){ 00406 //------------Bloco de construcao de frame request---------- 00407 00408 modBusMaster1::buffer[0]=enderecoSlave; 00409 modBusMaster1::buffer[1]=funcao; 00410 modBusMaster1::buffer[2]=registrador>>8; 00411 modBusMaster1::buffer[3]=(registrador & 0xFF); 00412 modBusMaster1::buffer[4]=qtdRegistros>>8; 00413 modBusMaster1::buffer[5]=(qtdRegistros & 0xFF); 00414 00415 crc=modBusMaster1::CRC16(modBusMaster1::buffer,6); 00416 00417 modBusMaster1::buffer[6]=crc>>8; 00418 modBusMaster1::buffer[7]=(crc & 0xFF); 00419 00420 //------------Bloco de construcao de frame request---------- 00421 if(!modBusMaster1::sendFrame(8)){ 00422 osDelay(delayEntreTentativas); 00423 retentativas--; 00424 if(debug){ 00425 //DEBUG Mostrando o que é enviado via modbus 00426 pc.printf("Retentativa de comando modbus.\r\n"); 00427 } 00428 if(retentativas==0){ 00429 //erro de timeout certamente 00430 pc.printf("Erro de timeout.\n"); 00431 modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote 00432 modBusMaster1::index = 0; 00433 return 254; 00434 } 00435 }else{ 00436 //Chegou pacote, vamos ver se é valido 00437 retentativas = 0; 00438 } 00439 } 00440 if(!modBusMaster1::pacoteEmEsperaValido){ 00441 pc.printf("Erro de CRC.\n"); 00442 modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote 00443 modBusMaster1::index = 0; 00444 return 255; 00445 } 00446 //-----------------Bloco de tentativas--------------------- 00447 00448 if(modBusMaster1::buffer[1]&(0x1<<7)){ 00449 result = modBusMaster1::buffer[2]; 00450 }else{ 00451 00452 qtd_dados_recebidos = modBusMaster1::buffer[2]/4; 00453 for(i=0;i<qtd_dados_recebidos;i++){ 00454 u.c[3]=modBusMaster1::buffer[(i*4)+3]; 00455 u.c[2]=modBusMaster1::buffer[(i*4)+4]; 00456 u.c[1]=modBusMaster1::buffer[(i*4)+5]; 00457 u.c[0]=modBusMaster1::buffer[(i*4)+6]; 00458 var[i]=u.v; 00459 } 00460 result =0; 00461 } 00462 00463 modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote 00464 modBusMaster1::index = 0; 00465 return result; 00466 } 00467 00468 uint8_t modBusMaster1::writeRegister16BIT(uint8_t enderecoSlave,uint16_t registrador,uint16_t qtdRegistros,uint16_t *var){ 00469 uint16_t i; 00470 uint16_t crc; 00471 uint8_t result; 00472 00473 //-----------------Bloco de tentativas--------------------- 00474 uint16_t retentativas = maxRetentativas+1; 00475 uint16_t delayEntreTentativas = maxDelayEntreTentativas; 00476 while(retentativas){ 00477 //------------Bloco de construcao de frame request---------- 00478 00479 modBusMaster1::buffer[0]=enderecoSlave; 00480 modBusMaster1::buffer[1]=16; 00481 modBusMaster1::buffer[2]=registrador>>8; 00482 modBusMaster1::buffer[3]=(registrador & 0xFF); 00483 modBusMaster1::buffer[4]=qtdRegistros>>8; 00484 modBusMaster1::buffer[5]=(qtdRegistros & 0xFF); 00485 modBusMaster1::buffer[6]=qtdRegistros*2; 00486 00487 for(i=0;i<qtdRegistros;i++){ 00488 modBusMaster1::buffer[(i*2)+7]=var[i]>>8; 00489 modBusMaster1::buffer[(i*2)+8]=var[i]&0xFF; 00490 } 00491 00492 crc=modBusMaster1::CRC16(modBusMaster1::buffer,((qtdRegistros)*2)+7); 00493 00494 modBusMaster1::buffer[(qtdRegistros*2)+7]=crc>>8;; 00495 modBusMaster1::buffer[(qtdRegistros*2)+8]=(crc & 0xFF); 00496 00497 //------------Bloco de construcao de frame request---------- 00498 if(!modBusMaster1::sendFrame((qtdRegistros*2)+9)){ 00499 osDelay(delayEntreTentativas); 00500 retentativas--; 00501 if(debug){ 00502 //DEBUG Mostrando o que é enviado via modbus 00503 pc.printf("Retentativa de comando modbus.\r\n"); 00504 } 00505 if(retentativas==0){ 00506 //erro de timeout certamente 00507 pc.printf("Erro de timeout.\n"); 00508 modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote 00509 modBusMaster1::index = 0; 00510 return 254; 00511 } 00512 }else{ 00513 //Chegou pacote, vamos ver se é valido 00514 retentativas = 0; 00515 } 00516 } 00517 if(!modBusMaster1::pacoteEmEsperaValido){ 00518 pc.printf("Erro de CRC.\n"); 00519 modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote 00520 modBusMaster1::index = 0; 00521 return 255; 00522 } 00523 //-----------------Bloco de tentativas--------------------- 00524 00525 modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote 00526 modBusMaster1::index = 0; 00527 00528 if(modBusMaster1::buffer[1]&(0x1<<7)){ 00529 result = modBusMaster1::buffer[2]; 00530 }else{ 00531 00532 //Interpratando resposta 00533 if(((modBusMaster1::buffer[4]<<8)+(modBusMaster1::buffer[5]))!=qtdRegistros){ 00534 return 253; 00535 }else{ 00536 result = 0; 00537 } 00538 } 00539 return result; 00540 } 00541 00542 uint8_t modBusMaster1::writeRegister32BIT(uint8_t enderecoSlave,uint16_t registrador,uint16_t qtdRegistros,uint32_t *var){ 00543 uint16_t i; 00544 uint16_t crc; 00545 uint8_t result; 00546 00547 //-----------------Bloco de tentativas--------------------- 00548 uint16_t retentativas = maxRetentativas+1; 00549 uint16_t delayEntreTentativas = maxDelayEntreTentativas; 00550 while(retentativas){ 00551 //------------Bloco de construcao de frame request---------- 00552 00553 modBusMaster1::buffer[0]=enderecoSlave; 00554 modBusMaster1::buffer[1]=16; 00555 modBusMaster1::buffer[2]=registrador>>8; 00556 modBusMaster1::buffer[3]=(registrador & 0xFF); 00557 modBusMaster1::buffer[4]=qtdRegistros>>8; 00558 modBusMaster1::buffer[5]=(qtdRegistros & 0xFF); 00559 modBusMaster1::buffer[6]=qtdRegistros*4; 00560 00561 for(i=0;i<qtdRegistros;i++){ 00562 modBusMaster1::buffer[(i*4)+7]=(var[i]>>24)&0xFF; 00563 modBusMaster1::buffer[(i*4)+8]=(var[i]>>16)&0xFF; 00564 modBusMaster1::buffer[(i*4)+9]=(var[i]>>8)&0xFF; 00565 modBusMaster1::buffer[(i*4)+10]=var[i]&0xFF; 00566 } 00567 00568 crc=modBusMaster1::CRC16(modBusMaster1::buffer,((qtdRegistros)*4)+7); 00569 00570 modBusMaster1::buffer[(qtdRegistros*4)+7]=crc>>8;; 00571 modBusMaster1::buffer[(qtdRegistros*4)+8]=(crc & 0xFF); 00572 00573 //------------Bloco de construcao de frame request---------- 00574 if(!modBusMaster1::sendFrame((qtdRegistros*4)+9)){ 00575 osDelay(delayEntreTentativas); 00576 retentativas--; 00577 if(debug){ 00578 //DEBUG Mostrando o que é enviado via modbus 00579 pc.printf("Retentativa de comando modbus.\r\n"); 00580 } 00581 if(retentativas==0){ 00582 //erro de timeout certamente 00583 pc.printf("Erro de timeout.\n"); 00584 modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote 00585 modBusMaster1::index = 0; 00586 return 254; 00587 } 00588 }else{ 00589 //Chegou pacote, vamos ver se é valido 00590 retentativas = 0; 00591 } 00592 } 00593 if(!modBusMaster1::pacoteEmEsperaValido){ 00594 pc.printf("Erro de CRC.\n"); 00595 modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote 00596 modBusMaster1::index = 0; 00597 return 255; 00598 } 00599 //-----------------Bloco de tentativas--------------------- 00600 00601 00602 modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote 00603 modBusMaster1::index = 0; 00604 00605 if(modBusMaster1::buffer[1]&(0x1<<7)){ 00606 result = modBusMaster1::buffer[2]; 00607 }else{ 00608 00609 //Interpratando resposta 00610 if(((modBusMaster1::buffer[4]<<8)+(modBusMaster1::buffer[5]))!=qtdRegistros){ 00611 return 253; 00612 }else{ 00613 result = 0; 00614 } 00615 } 00616 return result; 00617 } 00618 00619 uint8_t modBusMaster1::writeFloat(uint8_t enderecoSlave,uint16_t registrador,uint8_t qtdRegistros,float *var){ 00620 union{ 00621 char c[4]; 00622 float v; 00623 }u; 00624 uint16_t i; 00625 uint16_t crc; 00626 uint8_t result; 00627 //-----------------Bloco de tentativas--------------------- 00628 uint16_t retentativas = maxRetentativas+1; 00629 uint16_t delayEntreTentativas = maxDelayEntreTentativas; 00630 while(retentativas){ 00631 //------------Bloco de construcao de frame request---------- 00632 00633 modBusMaster1::buffer[0]=enderecoSlave; 00634 modBusMaster1::buffer[1]=16; 00635 modBusMaster1::buffer[2]=registrador>>8; 00636 modBusMaster1::buffer[3]=(registrador & 0xFF); 00637 modBusMaster1::buffer[4]=qtdRegistros>>8; 00638 modBusMaster1::buffer[5]=(qtdRegistros & 0xFF); 00639 modBusMaster1::buffer[6]=qtdRegistros*4; 00640 00641 for(i=0;i<qtdRegistros;i++){ 00642 u.v = var[i]; 00643 modBusMaster1::buffer[(i*4)+7]=u.c[3]; 00644 modBusMaster1::buffer[(i*4)+8]=u.c[2]; 00645 modBusMaster1::buffer[(i*4)+9]=u.c[1]; 00646 modBusMaster1::buffer[(i*4)+10]=u.c[0]; 00647 } 00648 00649 crc=modBusMaster1::CRC16(modBusMaster1::buffer,((qtdRegistros)*4)+7); 00650 00651 modBusMaster1::buffer[(qtdRegistros*4)+7]=crc>>8;; 00652 modBusMaster1::buffer[(qtdRegistros*4)+8]=(crc & 0xFF); 00653 00654 //------------Bloco de construcao de frame request---------- 00655 if(!modBusMaster1::sendFrame((qtdRegistros*4)+9)){ 00656 osDelay(delayEntreTentativas); 00657 retentativas--; 00658 if(debug){ 00659 //DEBUG Mostrando o que é enviado via modbus 00660 pc.printf("Retentativa de comando modbus.\r\n"); 00661 } 00662 if(retentativas==0){ 00663 //erro de timeout certamente 00664 pc.printf("Erro de timeout.\n"); 00665 modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote 00666 modBusMaster1::index = 0; 00667 return 254; 00668 } 00669 }else{ 00670 //Chegou pacote, vamos ver se é valido 00671 retentativas = 0; 00672 } 00673 } 00674 if(!modBusMaster1::pacoteEmEsperaValido){ 00675 pc.printf("Erro de CRC.\n"); 00676 modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote 00677 modBusMaster1::index = 0; 00678 return 255; 00679 } 00680 //-----------------Bloco de tentativas--------------------- 00681 00682 00683 modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote 00684 modBusMaster1::index = 0; 00685 00686 if(modBusMaster1::buffer[1]&(0x1<<7)){ 00687 result = modBusMaster1::buffer[2]; 00688 }else{ 00689 //Interpratando resposta 00690 if(((modBusMaster1::buffer[4]<<8)+(modBusMaster1::buffer[5]))!=qtdRegistros){ 00691 return 253; 00692 }else{ 00693 result = 0; 00694 } 00695 } 00696 return result; 00697 } 00698 00699 uint8_t modBusMaster1::readFloat(uint8_t enderecoSlave,uint8_t funcao,uint16_t registrador,uint16_t qtdRegistros,float *var){ 00700 union { 00701 char c[4]; 00702 float v; 00703 }u; 00704 uint16_t crc; 00705 uint16_t qtd_dados_recebidos; 00706 //void *p; 00707 uint16_t i; 00708 uint8_t result; 00709 00710 for(i=0;i<qtdRegistros;i++){ 00711 var[i]=0.0; 00712 } 00713 00714 //-----------------Bloco de tentativas--------------------- 00715 uint16_t retentativas = maxRetentativas+1; 00716 uint16_t delayEntreTentativas = maxDelayEntreTentativas; 00717 while(retentativas){ 00718 //------------Bloco de construcao de frame request---------- 00719 00720 modBusMaster1::buffer[0]=enderecoSlave; 00721 modBusMaster1::buffer[1]=funcao; 00722 modBusMaster1::buffer[2]=registrador>>8; 00723 modBusMaster1::buffer[3]=(registrador & 0xFF); 00724 modBusMaster1::buffer[4]=qtdRegistros>>8; 00725 modBusMaster1::buffer[5]=(qtdRegistros & 0xFF); 00726 00727 crc=modBusMaster1::CRC16(modBusMaster1::buffer,6); 00728 00729 modBusMaster1::buffer[6]=crc>>8; 00730 modBusMaster1::buffer[7]=(crc & 0xFF); 00731 00732 //------------Bloco de construcao de frame request---------- 00733 if(!modBusMaster1::sendFrame(8)){ 00734 osDelay(delayEntreTentativas); 00735 retentativas--; 00736 if(debug){ 00737 //DEBUG Mostrando o que é enviado via modbus 00738 pc.printf("Retentativa de comando modbus.\r\n"); 00739 } 00740 if(retentativas==0){ 00741 //erro de timeout certamente 00742 pc.printf("Erro de timeout.\n"); 00743 modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote 00744 modBusMaster1::index = 0; 00745 return 254; 00746 } 00747 }else{ 00748 //Chegou pacote, vamos ver se é valido 00749 retentativas = 0; 00750 } 00751 } 00752 if(!modBusMaster1::pacoteEmEsperaValido){ 00753 pc.printf("Erro de CRC.\n"); 00754 modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote 00755 modBusMaster1::index = 0; 00756 return 255; 00757 } 00758 //-----------------Bloco de tentativas--------------------- 00759 00760 if(modBusMaster1::buffer[1]&(0x1<<7)){ 00761 result = modBusMaster1::buffer[2]; 00762 }else{ 00763 qtd_dados_recebidos = modBusMaster1::buffer[2]/4; 00764 for(i=0;i<qtd_dados_recebidos;i++){ 00765 u.c[3]=modBusMaster1::buffer[(i*4)+3]; 00766 u.c[2]=modBusMaster1::buffer[(i*4)+4]; 00767 u.c[1]=modBusMaster1::buffer[(i*4)+5]; 00768 u.c[0]=modBusMaster1::buffer[(i*4)+6]; 00769 var[i]=u.v; 00770 } 00771 result = 0; 00772 } 00773 modBusMaster1::pacoteEmEspera = false; //Sinalizo que li o pacote 00774 modBusMaster1::index = 0; 00775 return result; 00776 }
Generated on Wed Jul 13 2022 12:46:24 by 1.7.2