MODBUS gros problème
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

MODBUS gros problème



  1. #1
    invitecd05b4fb

    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 à 09h42.

  2. #2
    Jack
    Modérateur

    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. #3
    invitecd05b4fb

    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. #4
    Jack
    Modérateur

    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. A voir en vidéo sur Futura
  6. #5
    invitecd05b4fb

    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.

  7. #6
    Jack
    Modérateur

    Re : MODBUS gros problème

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

    A+

  8. #7
    invitecd05b4fb

    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!

  9. #8
    Jack
    Modérateur

    Re : MODBUS gros problème

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

    A+

Discussions similaires

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