Bonjour à tous,
Voilà j'ai un gros problème qui me bloque depuis quelques temps donc je vous en fait part en espérant obtenir des solutions.
J'ai un maitre et un esclave ( centrale de mesure) relié par RS485. Je veux lire les registres de l'esclave. Pour cela j'utilise le protocole modbus et les fonctions liées. Je programme sous Dynamic C. Lorsque j'exécute mon programme, le message Tx: 05 03 10 00 00 02 C1 4F s'affiche au lieu de mes valeurs.
Je sais que mon programme et long et je comprendrais que personne n'ai envi de m'aider mais j'essaye quand même car je ne comprends absolument pas pourquoi.
Merci !Code:#define Mesure #define MODBUS_DEBUG_PRINT 0 // define to 1 to print transactions #define CINBUFSIZE 15 #define COUTBUFSIZE 15 #define MODBUS_PORT C #define _RS485 485 #define SERIAL_PORT_MODE _RS485 #use modbus_master.lib void brdInit(); int MBM_Send_ADU ( char *Packet, int ByteCount ); int MBM_Rcv_Resp ( char * Packet ); void serInit ( void ); void ser485Tx( void ) ; void ser485Rx( void ); main () { int i; double RegsValue[50]; serInit(); i = MBM_ReadRegs (005, &RegsValue[0], 4096, 2 ); // read reg 0 if (i==0) printf("Connexion OK"); else printf("Connexion Non OK"); printf("%d, %d, \n", RegsValue[0], RegsValue[1]); while (1); } void serInit ( void ) { serCopen (9600 ); // open the serial port } void ser485Tx( void ) { #asm push ip ;save off IP state ipset 1 ;set interrupt priority to level 1 ld a,(PDDRShadow) ;get copy of shadow reg set 7,a ;set bit 7 ioi ld (PDDR),a ;set PD7 high ld (PDDRShadow),a ;update shadow reg pop ip ;restore IP to the previous state #endasm } void ser485Rx( void ) { #asm push ip ;save off IP state ipset 1 ;set interrupt priority to level 1 ld a,(PDDRShadow) ;get copy of shadow reg res 7,a ;clear bit 7 ioi ld (PDDR),a ;set PF5 low ld (PDDRShadow),a ;update shadow reg pop ip ;restore IP to the previous state #endasm } int MBM_Send_ADU ( char *Packet, int ByteCount ) { auto unsigned CRCvalue; auto unsigned long Endtime; int i; // insert CRC CRCvalue = MODBUS_CRC ( Packet, ByteCount ); Packet[ByteCount+1] = CRCvalue; // store low byte Packet[ByteCount] = CRCvalue>>8; // store high byte ByteCount+=2; // adjust for CRC #ifdef MODBUS_DEBUG_PRINT & 1 printf ( "Tx:" ); for ( i=0; i<ByteCount; i++ ) printf ( " %02X", Packet[i] ); printf ( "\n\r" ); #endif #if SERIAL_PORT_MODE == _RS485 ser485Tx(); // enable the RS485 transmitter serCrdFlush(); // clear the read FIFO serCwrite ( Packet, ByteCount ); // send the data while ( serCrdUsed() != ByteCount ); // wait for all bytes to be transmitted ser485Rx(); // disable the RS485 transmitter serCrdFlush(); // clear the read FIFO #else serCwrite ( Packet, ByteCount ); // send the data serCrdFlush(); // clear the read FIFO #endif // receive the response into the same buffer used for the transmit data Endtime = MS_TIMER+50; // allow up to 50msec for response to start while ( ( (long)(MS_TIMER - Endtime) < 0L ) && ( (ByteCount = MBM_Rcv_Resp(Packet)) == 0 ) ); return ByteCount; } int MBM_Rcv_Resp ( char * Packet ) { auto unsigned CalcCRC; auto int ByteCount; auto int i; ByteCount = serCread( Packet, 50, 50L ); if ( ByteCount ) { CalcCRC = MODBUS_CRC ( Packet, ByteCount ); if ( CalcCRC ) { ByteCount = MB_CRC_ERROR; } else ByteCount = MB_SUCCESS; // the calculated CRC which includes the received CRC should be 0 #if MODBUS_DEBUG_PRINT & 1 printf ( "Rx:" ); for ( i=0; i<ByteCount; i++ ) printf ( " %02X", Packet[i] ); printf ( "\n\r" ); #endif } return ByteCount; }
-----