Bonjour, cliquez-ici pour vous inscrire et participer au forum.
  • Login:



+ Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

MODBUS gros problème

  1. Terminatr0r

    Date d'inscription
    mars 2011
    Messages
    22

    MODBUS gros problème

    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.

    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;
    }
    Merci !


    Dernière modification par Jack ; 29/04/2011 à 10h42.
     


    • Publicité



  2. Jack

    Date d'inscription
    avril 2003
    Localisation
    Metz
    Messages
    13 505

    Re : MODBUS gros problème

    Je sais que mon programme et long et je comprendrais que personne n'ai envi de m'aider
    Il faudrait commencer par mettre les balises code, ce que je viens de faire. Reconnais que c'est plus lisible.

    le message Tx: 05 03 10 00 00 02 C1 4F s'affiche au lieu de mes valeurs
    heuuuu !!! Quelles valeurs? De plus tu ne dis pas quelle est l'adresse de l'esclave, l'adresse des registres, le nombre de registres lus, etc.

    A+
     

  3. Terminatr0r

    Date d'inscription
    mars 2011
    Messages
    22

    Re : MODBUS gros problème

    Oui merci, c'est plus lisible.

    L'adresse de l'esclave est 5 et le registre que je lis est à l'adresse 1000 en hexa (4096). Peu importe le nombre de registre que je lis, mais pour commencer, je n'en lis que 2.
    Sur la fenêtre 'stdio' le message de ma trame (Tx: 05 03 10 00 00 02 C1 4F) s'affiche au lieu des valeurs contenues dans les registres.
     

  4. Jack

    Date d'inscription
    avril 2003
    Localisation
    Metz
    Messages
    13 505

    Re : MODBUS gros problème

    Sur la fenêtre 'stdio' le message de ma trame (Tx: 05 03 10 00 00 02 C1 4F) s'affiche au lieu des valeurs contenues dans les registres.
    Pourquoi au lieu? C'est pourtant toi qui demande l'affichage de cette trame:
    Code:
    #ifdef MODBUS_DEBUG_PRINT & 1     printf ( "Tx:" );     for ( i=0; i<ByteCount; i++ ) printf ( " %02X", Packet[i] );     printf ( "\n\r" ); #endif
    Quoique tu as du modifier ton code car la ligne
    Code:
    #define MODBUS_DEBUG_PRINT 0    // define to 1 to print transactions
    ne devrait pas permettre l'affichage puisque la constante est à 0

    Enfin bon, on dirait que l'esclave ne répond pas. Comme je ne peux pas savoir comment marche la fonction
    serCread(), je ne peux pas t'aider.

    Tu devrais essayer avec un simulateur de modbus maitre déjà pour voir si l'esclave répond comme il faut. Si c'est le cas, c'est que c'est ton programme qui est en cause et pas le matériel.

    A+
     

  5. Terminatr0r

    Date d'inscription
    mars 2011
    Messages
    22

    Re : MODBUS gros problème

    Merci pour ces réponses!

    Le matériel fonctionne correctement, je l'ai déjà utilisé il y a peu de temps.

    Le problème vient du programme, je vais essayer de trouver les erreurs.
     


    • Publicité



  6. Jack

    Date d'inscription
    avril 2003
    Localisation
    Metz
    Messages
    13 505

    Re : MODBUS gros problème

    tu as un debugger interactif sur ton outil de développement?

    A+
     

  7. Terminatr0r

    Date d'inscription
    mars 2011
    Messages
    22

    Re : MODBUS gros problème

    Oui et lorsque je lance le programme pas à pas, il reste à l'instruction suivante:

    while ( serCrdUsed() != ByteCount );...

    Je ne comprends plus rien du tout!
     

  8. Jack

    Date d'inscription
    avril 2003
    Localisation
    Metz
    Messages
    13 505

    Re : MODBUS gros problème

    et avec un pas à pas approfondi, de manière à descendre dans les fonctions, il bloque où?

    A+
     


    • Publicité




Poursuivez votre recherche :




Sur le même thème :




 

Discussions similaires

  1. Modbus en Matlab
    Par ouarnadir dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 07/04/2010, 01h12
  2. Gros gros problème avec Admission post bac
    Par cerise9 dans le forum Orientation avant le BAC
    Réponses: 5
    Dernier message: 15/03/2009, 14h30
  3. gros gros problème : comment mettre son site sur internet ?
    Par clanki55 dans le forum Internet - Réseau - Sécurité générale
    Réponses: 21
    Dernier message: 01/06/2008, 21h56
  4. gros gros probleme d'avenir
    Par Mercenayre dans le forum Orientation avant le BAC
    Réponses: 3
    Dernier message: 05/01/2008, 22h10
  5. gros gros problème Emule
    Par bambam dans le forum Internet - Réseau - Sécurité générale
    Réponses: 20
    Dernier message: 11/11/2007, 22h19