3R / Mbed 2 deprecated Le_Pont_V10015

Dependencies:   mbed

Committer:
CS
Date:
Mon May 30 07:04:49 2016 +0000
Revision:
0:a53b6ec3fbb3
RAZ integrale de la synchronisation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
CS 0:a53b6ec3fbb3 1 /***********************************************************************************/
CS 0:a53b6ec3fbb3 2 //
CS 0:a53b6ec3fbb3 3 // Gestion du Modbus
CS 0:a53b6ec3fbb3 4 //
CS 0:a53b6ec3fbb3 5 //************************************************************************************/
CS 0:a53b6ec3fbb3 6
CS 0:a53b6ec3fbb3 7 #include <mbed.h>
CS 0:a53b6ec3fbb3 8 #include "Modbus.h"
CS 0:a53b6ec3fbb3 9 #include "Port_Serie.h"
CS 0:a53b6ec3fbb3 10
CS 0:a53b6ec3fbb3 11
CS 0:a53b6ec3fbb3 12 //volatile U8 Numero_Ordre_En_Cours_U8 ;
CS 0:a53b6ec3fbb3 13 volatile Ordre_Modbus_t Ordres[TAILLE_PILE_ORDRES] ;
CS 0:a53b6ec3fbb3 14
CS 0:a53b6ec3fbb3 15
CS 0:a53b6ec3fbb3 16 Serial PC7(USBTX, USBRX) ;
CS 0:a53b6ec3fbb3 17
CS 0:a53b6ec3fbb3 18 /************ Initialisation du Modbus ************************/
CS 0:a53b6ec3fbb3 19 void vModbus_Init(int Baudrate)
CS 0:a53b6ec3fbb3 20 {
CS 0:a53b6ec3fbb3 21 U8 Numero_Ordre_U8 ;
CS 0:a53b6ec3fbb3 22
CS 0:a53b6ec3fbb3 23 vPort_Serie_Init( Baudrate ) ;
CS 0:a53b6ec3fbb3 24
CS 0:a53b6ec3fbb3 25 for ( Numero_Ordre_U8 = 0 ; Numero_Ordre_U8 < TAILLE_PILE_ORDRES ; Numero_Ordre_U8++ )
CS 0:a53b6ec3fbb3 26 {
CS 0:a53b6ec3fbb3 27 // Effacement des ordres
CS 0:a53b6ec3fbb3 28 Ordres[Numero_Ordre_U8].Etat_U8 = ARRET ;
CS 0:a53b6ec3fbb3 29 Ordres[Numero_Ordre_U8].Nb_Caracteres_Recus_U8 = 0 ;
CS 0:a53b6ec3fbb3 30 Ordres[Numero_Ordre_U8].Nb_Caracteres_A_Emettre_U8 = 0 ;
CS 0:a53b6ec3fbb3 31 Ordres[Numero_Ordre_U8].Code_Erreur = 0 ;
CS 0:a53b6ec3fbb3 32 }
CS 0:a53b6ec3fbb3 33
CS 0:a53b6ec3fbb3 34
CS 0:a53b6ec3fbb3 35 PC7.printf("\r\n Modbus : Init ") ;
CS 0:a53b6ec3fbb3 36 }
CS 0:a53b6ec3fbb3 37
CS 0:a53b6ec3fbb3 38
CS 0:a53b6ec3fbb3 39 /************* Demarrage du Modbus ****************************/
CS 0:a53b6ec3fbb3 40 void vModbus_Start()
CS 0:a53b6ec3fbb3 41 {
CS 0:a53b6ec3fbb3 42 //Ordres[Numero_Ordre_En_Cours_U8].Etat_U8 = ATTENTE ;
CS 0:a53b6ec3fbb3 43 vPort_Serie_Ouvre() ;
CS 0:a53b6ec3fbb3 44 //vPort_Serie_Reception ( 0 ) ;
CS 0:a53b6ec3fbb3 45 PC7.printf("\r\n Modbus : Start ") ;
CS 0:a53b6ec3fbb3 46 }
CS 0:a53b6ec3fbb3 47
CS 0:a53b6ec3fbb3 48 static const U8 aucCRCHi[] = {
CS 0:a53b6ec3fbb3 49 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
CS 0:a53b6ec3fbb3 50 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
CS 0:a53b6ec3fbb3 51 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
CS 0:a53b6ec3fbb3 52 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
CS 0:a53b6ec3fbb3 53 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
CS 0:a53b6ec3fbb3 54 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
CS 0:a53b6ec3fbb3 55 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
CS 0:a53b6ec3fbb3 56 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
CS 0:a53b6ec3fbb3 57 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
CS 0:a53b6ec3fbb3 58 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
CS 0:a53b6ec3fbb3 59 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
CS 0:a53b6ec3fbb3 60 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
CS 0:a53b6ec3fbb3 61 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
CS 0:a53b6ec3fbb3 62 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
CS 0:a53b6ec3fbb3 63 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
CS 0:a53b6ec3fbb3 64 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
CS 0:a53b6ec3fbb3 65 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
CS 0:a53b6ec3fbb3 66 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
CS 0:a53b6ec3fbb3 67 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
CS 0:a53b6ec3fbb3 68 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
CS 0:a53b6ec3fbb3 69 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
CS 0:a53b6ec3fbb3 70 0x00, 0xC1, 0x81, 0x40
CS 0:a53b6ec3fbb3 71 };
CS 0:a53b6ec3fbb3 72
CS 0:a53b6ec3fbb3 73 static const U8 aucCRCLo[] = {
CS 0:a53b6ec3fbb3 74 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7,
CS 0:a53b6ec3fbb3 75 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E,
CS 0:a53b6ec3fbb3 76 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9,
CS 0:a53b6ec3fbb3 77 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC,
CS 0:a53b6ec3fbb3 78 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
CS 0:a53b6ec3fbb3 79 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32,
CS 0:a53b6ec3fbb3 80 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D,
CS 0:a53b6ec3fbb3 81 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38,
CS 0:a53b6ec3fbb3 82 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF,
CS 0:a53b6ec3fbb3 83 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
CS 0:a53b6ec3fbb3 84 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1,
CS 0:a53b6ec3fbb3 85 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4,
CS 0:a53b6ec3fbb3 86 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB,
CS 0:a53b6ec3fbb3 87 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA,
CS 0:a53b6ec3fbb3 88 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
CS 0:a53b6ec3fbb3 89 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0,
CS 0:a53b6ec3fbb3 90 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97,
CS 0:a53b6ec3fbb3 91 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E,
CS 0:a53b6ec3fbb3 92 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89,
CS 0:a53b6ec3fbb3 93 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
CS 0:a53b6ec3fbb3 94 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83,
CS 0:a53b6ec3fbb3 95 0x41, 0x81, 0x80, 0x40
CS 0:a53b6ec3fbb3 96 };
CS 0:a53b6ec3fbb3 97
CS 0:a53b6ec3fbb3 98
CS 0:a53b6ec3fbb3 99 U16 CRC16( U8 * pucFrame, U8 usLen )
CS 0:a53b6ec3fbb3 100 {
CS 0:a53b6ec3fbb3 101 U8 ucCRCHi = 0xFF;
CS 0:a53b6ec3fbb3 102 U8 ucCRCLo = 0xFF;
CS 0:a53b6ec3fbb3 103 int iIndex;
CS 0:a53b6ec3fbb3 104
CS 0:a53b6ec3fbb3 105 while( usLen-- )
CS 0:a53b6ec3fbb3 106 {
CS 0:a53b6ec3fbb3 107 //PC7.printf("/ %X /", *pucFrame) ;
CS 0:a53b6ec3fbb3 108 iIndex = ucCRCLo ^ *( pucFrame++ );
CS 0:a53b6ec3fbb3 109 ucCRCLo = ( U8 )( ucCRCHi ^ aucCRCHi[iIndex] );
CS 0:a53b6ec3fbb3 110 ucCRCHi = aucCRCLo[iIndex];
CS 0:a53b6ec3fbb3 111 }
CS 0:a53b6ec3fbb3 112 //PC7.printf("\n\r CRC: %X",(ucCRCHi << 8 | ucCRCLo)) ;
CS 0:a53b6ec3fbb3 113 return ( U16 )( ucCRCHi << 8 | ucCRCLo );
CS 0:a53b6ec3fbb3 114 }
CS 0:a53b6ec3fbb3 115
CS 0:a53b6ec3fbb3 116 /************* Traitement du Modbus ****************************/
CS 0:a53b6ec3fbb3 117 void vModbus()
CS 0:a53b6ec3fbb3 118 {
CS 0:a53b6ec3fbb3 119 U8 Numero_Ordre_U8 ;
CS 0:a53b6ec3fbb3 120 U16 Valeur_U16 ;
CS 0:a53b6ec3fbb3 121 U8 Ordres_Arretes_U8 = 0 ;
CS 0:a53b6ec3fbb3 122 U8 Index_CRC_U8 ;
CS 0:a53b6ec3fbb3 123 U8 Index_Caractere_U8 ;
CS 0:a53b6ec3fbb3 124 U16 Index_Memoire_U16 ;
CS 0:a53b6ec3fbb3 125
CS 0:a53b6ec3fbb3 126 for ( Numero_Ordre_U8 = 0 ; Numero_Ordre_U8 < TAILLE_PILE_ORDRES ; Numero_Ordre_U8++ )
CS 0:a53b6ec3fbb3 127 {
CS 0:a53b6ec3fbb3 128
CS 0:a53b6ec3fbb3 129 if ( Ordres[Numero_Ordre_U8].Etat_U8 == RECU )
CS 0:a53b6ec3fbb3 130 {// Puisque la trame est complete, on peut la traiter
CS 0:a53b6ec3fbb3 131 //PC7.printf("\n\rOrdre : %i recu",Numero_Ordre_U8) ;
CS 0:a53b6ec3fbb3 132 if ( Numero_Ordre_U8 < ( TAILLE_PILE_ORDRES - 1 ) )
CS 0:a53b6ec3fbb3 133 {// Enclenche l'ordre suivant
CS 0:a53b6ec3fbb3 134 vPort_Serie_Reception ( Numero_Ordre_U8 + 1 ) ;
CS 0:a53b6ec3fbb3 135 }
CS 0:a53b6ec3fbb3 136 else
CS 0:a53b6ec3fbb3 137 {// Enclenche l'ordre 0
CS 0:a53b6ec3fbb3 138 vPort_Serie_Reception ( 0 ) ;
CS 0:a53b6ec3fbb3 139 }
CS 0:a53b6ec3fbb3 140 // Adresse
CS 0:a53b6ec3fbb3 141 Ordres[Numero_Ordre_U8].Trame_Reponse_aU8[0] = SLAVE_ID ;
CS 0:a53b6ec3fbb3 142 // Fonction
CS 0:a53b6ec3fbb3 143 Ordres[Numero_Ordre_U8].Trame_Reponse_aU8[1] = Ordres[Numero_Ordre_U8].Trame_Recue_aU8[1] ;
CS 0:a53b6ec3fbb3 144
CS 0:a53b6ec3fbb3 145 if (( Ordres[Numero_Ordre_U8].Trame_Recue_aU8[1] == MB_FUNC_READ_HOLDING_REGISTER )
CS 0:a53b6ec3fbb3 146 || ( Ordres[Numero_Ordre_U8].Trame_Recue_aU8[1] == MB_FUNC_READ_INPUT_REGISTER ))
CS 0:a53b6ec3fbb3 147 {// Fonction 3 ou 4, Lecture de registres
CS 0:a53b6ec3fbb3 148 // Nombre d'octets
CS 0:a53b6ec3fbb3 149 //PC7.printf("\n\rOrdre Func: %i",Ordres[Numero_Ordre_U8].Trame_Recue_aU8[1]) ;
CS 0:a53b6ec3fbb3 150 Ordres[Numero_Ordre_U8].Trame_Reponse_aU8[2] = 2 * Ordres[Numero_Ordre_U8].Trame_Recue_aU8[5] ;
CS 0:a53b6ec3fbb3 151 // Registre de départ = Hi * 256 + Lo + Base
CS 0:a53b6ec3fbb3 152 Index_Memoire_U16 = REG_INPUT_START + (U16)(Ordres[Numero_Ordre_U8].Trame_Recue_aU8[2]) * 256
CS 0:a53b6ec3fbb3 153 + (U16)Ordres[Numero_Ordre_U8].Trame_Recue_aU8[3] ;
CS 0:a53b6ec3fbb3 154 //PC7.printf("\r\n %i :",Index_Memoire_U16) ;
CS 0:a53b6ec3fbb3 155 Index_Caractere_U8 = 0 ;
CS 0:a53b6ec3fbb3 156 while ( Index_Caractere_U8 < Ordres[Numero_Ordre_U8].Trame_Reponse_aU8[2] )
CS 0:a53b6ec3fbb3 157 {
CS 0:a53b6ec3fbb3 158 // Octet de poids fort du registre
CS 0:a53b6ec3fbb3 159 Ordres[Numero_Ordre_U8].Trame_Reponse_aU8[ Index_Caractere_U8 + 3] = (U8) (Memoire_S16 [ Index_Memoire_U16 ] >> 8 ) ;
CS 0:a53b6ec3fbb3 160 // Octet de poids faible
CS 0:a53b6ec3fbb3 161 Ordres[Numero_Ordre_U8].Trame_Reponse_aU8[ Index_Caractere_U8 + 4] = (U8) ( Memoire_S16 [ Index_Memoire_U16 ] & 0xFF ) ;
CS 0:a53b6ec3fbb3 162 //PC7.printf("/ %X / %X /",Ordres[Numero_Ordre_U8].Trame_Reponse_aU8[ Index_Caractere_U8 + 3],Ordres[Numero_Ordre_U8].Trame_Reponse_aU8[ Index_Caractere_U8 + 4]) ;
CS 0:a53b6ec3fbb3 163 Index_Caractere_U8 = Index_Caractere_U8 + 2 ;
CS 0:a53b6ec3fbb3 164 Index_Memoire_U16++ ;
CS 0:a53b6ec3fbb3 165 }
CS 0:a53b6ec3fbb3 166
CS 0:a53b6ec3fbb3 167 // Calcul de la position du CRC
CS 0:a53b6ec3fbb3 168 Index_CRC_U8 = 3 + Ordres[Numero_Ordre_U8].Trame_Reponse_aU8[2] ;
CS 0:a53b6ec3fbb3 169 // Calcul du CRC
CS 0:a53b6ec3fbb3 170 Valeur_U16 = CRC16 ( (U8 *) &(Ordres[Numero_Ordre_U8].Trame_Reponse_aU8[0]) , Index_CRC_U8 ) ;
CS 0:a53b6ec3fbb3 171
CS 0:a53b6ec3fbb3 172 // CRC Poids fort
CS 0:a53b6ec3fbb3 173 Ordres[Numero_Ordre_U8].Trame_Reponse_aU8[ Index_CRC_U8 ] = (U8) ( Valeur_U16 & 0xFF ) ;
CS 0:a53b6ec3fbb3 174 // CRC Poids faible
CS 0:a53b6ec3fbb3 175 Ordres[Numero_Ordre_U8].Trame_Reponse_aU8[ Index_CRC_U8 + 1 ] = (U8) ( Valeur_U16 >> 8 ) ;
CS 0:a53b6ec3fbb3 176 // Longueur de trame à emettre
CS 0:a53b6ec3fbb3 177 Ordres[Numero_Ordre_U8].Nb_Caracteres_A_Emettre_U8 = Index_CRC_U8 + 2 ;
CS 0:a53b6ec3fbb3 178 }
CS 0:a53b6ec3fbb3 179 else if ( Ordres[Numero_Ordre_U8].Trame_Recue_aU8[1] == MB_FUNC_WRITE_MULTIPLE_REGISTERS )
CS 0:a53b6ec3fbb3 180 {// Fonction 16 (0x10) écriture multiple
CS 0:a53b6ec3fbb3 181 //PC7.printf("\n\rOrdre Func: %i",Ordres[Numero_Ordre_U8].Trame_Recue_aU8[1]) ;
CS 0:a53b6ec3fbb3 182 // Registre de départ poids fort
CS 0:a53b6ec3fbb3 183 Ordres[Numero_Ordre_U8].Trame_Reponse_aU8[2] = Ordres[Numero_Ordre_U8].Trame_Recue_aU8[2] ;
CS 0:a53b6ec3fbb3 184 // Registre de départ poids faible
CS 0:a53b6ec3fbb3 185 Ordres[Numero_Ordre_U8].Trame_Reponse_aU8[3] = Ordres[Numero_Ordre_U8].Trame_Recue_aU8[3] ;
CS 0:a53b6ec3fbb3 186 // Nombre de registres poids fort
CS 0:a53b6ec3fbb3 187 Ordres[Numero_Ordre_U8].Trame_Reponse_aU8[4] = Ordres[Numero_Ordre_U8].Trame_Recue_aU8[4] ;
CS 0:a53b6ec3fbb3 188 // Nombre de registres poids faible
CS 0:a53b6ec3fbb3 189 Ordres[Numero_Ordre_U8].Trame_Reponse_aU8[5] = Ordres[Numero_Ordre_U8].Trame_Recue_aU8[5] ;
CS 0:a53b6ec3fbb3 190
CS 0:a53b6ec3fbb3 191 // Registre de départ = Hi * 256 + Lo + Base
CS 0:a53b6ec3fbb3 192 Index_Memoire_U16 = REG_INPUT_START + (U16)(Ordres[Numero_Ordre_U8].Trame_Recue_aU8[2]) * 256
CS 0:a53b6ec3fbb3 193 + (U16)Ordres[Numero_Ordre_U8].Trame_Recue_aU8[3] ;
CS 0:a53b6ec3fbb3 194 Index_Caractere_U8 = 0 ;
CS 0:a53b6ec3fbb3 195 while ( Index_Caractere_U8 < Ordres[Numero_Ordre_U8].Trame_Recue_aU8[6] )
CS 0:a53b6ec3fbb3 196 {
CS 0:a53b6ec3fbb3 197 // Ecriture des registres
CS 0:a53b6ec3fbb3 198 Memoire_S16 [ Index_Memoire_U16 ] = (S16) (Ordres[Numero_Ordre_U8].Trame_Recue_aU8[ 7 + Index_Caractere_U8 ]) * 256
CS 0:a53b6ec3fbb3 199 + (S16) Ordres[Numero_Ordre_U8].Trame_Recue_aU8[ 8 + Index_Caractere_U8 ];
CS 0:a53b6ec3fbb3 200 Index_Caractere_U8 = Index_Caractere_U8 + 2 ;
CS 0:a53b6ec3fbb3 201 Index_Memoire_U16++ ;
CS 0:a53b6ec3fbb3 202
CS 0:a53b6ec3fbb3 203 }
CS 0:a53b6ec3fbb3 204 // Calcul du CRC
CS 0:a53b6ec3fbb3 205 Valeur_U16 = CRC16 ( (U8 *) &(Ordres[Numero_Ordre_U8].Trame_Reponse_aU8[0]) , 6 ) ;
CS 0:a53b6ec3fbb3 206 // Calcul de la position du CRC
CS 0:a53b6ec3fbb3 207 Index_CRC_U8 = 6 ;
CS 0:a53b6ec3fbb3 208 Ordres[Numero_Ordre_U8].Trame_Reponse_aU8[ Index_CRC_U8] = (U8) ( Valeur_U16 & 0xFF ) ;
CS 0:a53b6ec3fbb3 209 Ordres[Numero_Ordre_U8].Trame_Reponse_aU8[ Index_CRC_U8 + 1 ] = (U8) ( Valeur_U16 >> 8 );
CS 0:a53b6ec3fbb3 210 // Longueur de trame à emettre
CS 0:a53b6ec3fbb3 211 Ordres[Numero_Ordre_U8].Nb_Caracteres_A_Emettre_U8 = 8 ;
CS 0:a53b6ec3fbb3 212 }
CS 0:a53b6ec3fbb3 213 // La trame de réponse est terminée
CS 0:a53b6ec3fbb3 214 Ordres[Numero_Ordre_U8].Etat_U8 = TRAITE ;
CS 0:a53b6ec3fbb3 215 //PC7.printf("\n\rOrdre %i Etat: %i",Numero_Ordre_U8,TRAITE) ;
CS 0:a53b6ec3fbb3 216 // Lancement de l'émission de la réponse
CS 0:a53b6ec3fbb3 217 vPort_Serie_Emission ( Numero_Ordre_U8 ) ;
CS 0:a53b6ec3fbb3 218 }
CS 0:a53b6ec3fbb3 219
CS 0:a53b6ec3fbb3 220 else if ( Ordres[Numero_Ordre_U8].Etat_U8 == FIN )
CS 0:a53b6ec3fbb3 221 {// La réponse est émise, cloture l'ordre
CS 0:a53b6ec3fbb3 222 Ordres[Numero_Ordre_U8].Etat_U8 = ARRET ;
CS 0:a53b6ec3fbb3 223 //PC7.printf("\n\rOrdre %i Etat: %i",Numero_Ordre_U8,FIN) ;
CS 0:a53b6ec3fbb3 224 }
CS 0:a53b6ec3fbb3 225 else if ( Ordres[Numero_Ordre_U8].Etat_U8 == EMISSION )
CS 0:a53b6ec3fbb3 226 {// L'emission de la réponse n'est pas terminée, re-essaie
CS 0:a53b6ec3fbb3 227 //PC7.printf("\n\rOrdre %i Etat: %i",Numero_Ordre_U8,EMISSION) ;
CS 0:a53b6ec3fbb3 228 vPort_Serie_Emission ( Numero_Ordre_U8 );
CS 0:a53b6ec3fbb3 229 }
CS 0:a53b6ec3fbb3 230 else if ( Ordres[Numero_Ordre_U8].Etat_U8 == ARRET )
CS 0:a53b6ec3fbb3 231 {// Compte les ordres arretés
CS 0:a53b6ec3fbb3 232 //PC7.printf("\n\rOrdre %i Etat: %i",Numero_Ordre_U8,ARRET) ;
CS 0:a53b6ec3fbb3 233 Ordres_Arretes_U8++ ;
CS 0:a53b6ec3fbb3 234 }
CS 0:a53b6ec3fbb3 235 else if ( Ordres[Numero_Ordre_U8].Etat_U8 == RECEPTION )
CS 0:a53b6ec3fbb3 236 {// Controle si les temps ne sont pas dépassés
CS 0:a53b6ec3fbb3 237 //PC7.printf("\n\rOrdre %i Etat: %i",Numero_Ordre_U8,RECEPTION) ;
CS 0:a53b6ec3fbb3 238 //Ordres[Numero_Ordre_U8].Etat_U8 = cControle_Reception( Numero_Ordre_U8 );
CS 0:a53b6ec3fbb3 239 }
CS 0:a53b6ec3fbb3 240 else if ( Ordres[Numero_Ordre_U8].Etat_U8 == ATTENTE )
CS 0:a53b6ec3fbb3 241 {// Controle si les temps ne sont pas dépassés
CS 0:a53b6ec3fbb3 242 //PC7.printf("\n\rOrdre %i Etat: %i",Numero_Ordre_U8,ATTENTE) ;
CS 0:a53b6ec3fbb3 243 }
CS 0:a53b6ec3fbb3 244 else if ( Ordres[Numero_Ordre_U8].Etat_U8 == TIMEOUT )
CS 0:a53b6ec3fbb3 245 {// Les temps sont dépassés
CS 0:a53b6ec3fbb3 246 Ordres[Numero_Ordre_U8].Etat_U8 = ARRET;
CS 0:a53b6ec3fbb3 247 }
CS 0:a53b6ec3fbb3 248 //PC7.printf("\r\n Modbus : %i \t %i \r\n",Numero_Ordre_U8,Ordres[Numero_Ordre_U8].Etat_U8 );
CS 0:a53b6ec3fbb3 249 }
CS 0:a53b6ec3fbb3 250 if (Ordres_Arretes_U8 >= TAILLE_PILE_ORDRES )
CS 0:a53b6ec3fbb3 251 {// Si tous les ordres sont arretés, le prochain aura l'index 0
CS 0:a53b6ec3fbb3 252 vPort_Serie_Reception ( 0 ) ;
CS 0:a53b6ec3fbb3 253 }
CS 0:a53b6ec3fbb3 254 }
CS 0:a53b6ec3fbb3 255
CS 0:a53b6ec3fbb3 256 extern void vModbus_Stop()
CS 0:a53b6ec3fbb3 257 {
CS 0:a53b6ec3fbb3 258 }
CS 0:a53b6ec3fbb3 259 extern void vModbus_Reset()
CS 0:a53b6ec3fbb3 260 {
CS 0:a53b6ec3fbb3 261 }
CS 0:a53b6ec3fbb3 262
CS 0:a53b6ec3fbb3 263