Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@0:09f6f55b32fa, 2021-04-02 (annotated)
- Committer:
- mohamedwajdi
- Date:
- Fri Apr 02 10:15:16 2021 +0000
- Revision:
- 0:09f6f55b32fa
TP3 RBT 2GII Ex1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mohamedwajdi | 0:09f6f55b32fa | 1 | #include "mbed.h" |
mohamedwajdi | 0:09f6f55b32fa | 2 | #include "mb.h" |
mohamedwajdi | 0:09f6f55b32fa | 3 | |
mohamedwajdi | 0:09f6f55b32fa | 4 | #define BITS_OUT_START 0x1001 //Bits de sorties (fonctions 1 et 5) |
mohamedwajdi | 0:09f6f55b32fa | 5 | #define BITS_OUT_NBITS 16 |
mohamedwajdi | 0:09f6f55b32fa | 6 | #define BITS_OUT_BYTES BITS_OUT_NBITS/8 //16/8 = 2 octets |
mohamedwajdi | 0:09f6f55b32fa | 7 | |
mohamedwajdi | 0:09f6f55b32fa | 8 | #define BITS_IN_START 0x2001 //Bits d'entées (fonction 2) |
mohamedwajdi | 0:09f6f55b32fa | 9 | #define BITS_IN_NBITS 16 |
mohamedwajdi | 0:09f6f55b32fa | 10 | #define BITS_IN_BYTES BITS_IN_NBITS/8 //16/8 = 2 octets |
mohamedwajdi | 0:09f6f55b32fa | 11 | |
mohamedwajdi | 0:09f6f55b32fa | 12 | #define REG_OUT_START 0x3001 //Registres de sorties (fonctions 3 et 6) |
mohamedwajdi | 0:09f6f55b32fa | 13 | #define REG_OUT_NREGS 4 |
mohamedwajdi | 0:09f6f55b32fa | 14 | |
mohamedwajdi | 0:09f6f55b32fa | 15 | #define REG_IN_START 0x4001 //Registres d'entées (fonction 4) |
mohamedwajdi | 0:09f6f55b32fa | 16 | #define REG_IN_NREGS 4 |
mohamedwajdi | 0:09f6f55b32fa | 17 | |
mohamedwajdi | 0:09f6f55b32fa | 18 | #define SLAVE_ID 0x07 |
mohamedwajdi | 0:09f6f55b32fa | 19 | |
mohamedwajdi | 0:09f6f55b32fa | 20 | static USHORT BitsOutStart = BITS_OUT_START; // (fonctions 1 et 5) |
mohamedwajdi | 0:09f6f55b32fa | 21 | static UCHAR BitsOut[BITS_OUT_BYTES] = {0xA5,0x5A}; |
mohamedwajdi | 0:09f6f55b32fa | 22 | static USHORT BitsInStart = BITS_IN_START; // (fonction 2) |
mohamedwajdi | 0:09f6f55b32fa | 23 | static UCHAR BitsIn[BITS_IN_BYTES] = {0x3C,0xC3}; |
mohamedwajdi | 0:09f6f55b32fa | 24 | static USHORT RegOutStart = REG_OUT_START; // (fonctions 3 et 6) |
mohamedwajdi | 0:09f6f55b32fa | 25 | static USHORT RegOut[REG_OUT_NREGS] = {0x0123,0x4567,0x89AB,0xCDEF}; |
mohamedwajdi | 0:09f6f55b32fa | 26 | static USHORT RegInStart = REG_IN_START; // (fonction 4) |
mohamedwajdi | 0:09f6f55b32fa | 27 | static USHORT RegIn[REG_IN_NREGS] = {0x1122,0x3344,0x5566,0x7788}; |
mohamedwajdi | 0:09f6f55b32fa | 28 | |
mohamedwajdi | 0:09f6f55b32fa | 29 | int main() { |
mohamedwajdi | 0:09f6f55b32fa | 30 | eMBInit( MB_RTU, SLAVE_ID, 0, 9600, MB_PAR_NONE ); |
mohamedwajdi | 0:09f6f55b32fa | 31 | eMBEnable(); |
mohamedwajdi | 0:09f6f55b32fa | 32 | |
mohamedwajdi | 0:09f6f55b32fa | 33 | while(1) { |
mohamedwajdi | 0:09f6f55b32fa | 34 | eMBPoll(); |
mohamedwajdi | 0:09f6f55b32fa | 35 | } |
mohamedwajdi | 0:09f6f55b32fa | 36 | } |
mohamedwajdi | 0:09f6f55b32fa | 37 | |
mohamedwajdi | 0:09f6f55b32fa | 38 | |
mohamedwajdi | 0:09f6f55b32fa | 39 | |
mohamedwajdi | 0:09f6f55b32fa | 40 | |
mohamedwajdi | 0:09f6f55b32fa | 41 | |
mohamedwajdi | 0:09f6f55b32fa | 42 | |
mohamedwajdi | 0:09f6f55b32fa | 43 | |
mohamedwajdi | 0:09f6f55b32fa | 44 | |
mohamedwajdi | 0:09f6f55b32fa | 45 | |
mohamedwajdi | 0:09f6f55b32fa | 46 | |
mohamedwajdi | 0:09f6f55b32fa | 47 | |
mohamedwajdi | 0:09f6f55b32fa | 48 | |
mohamedwajdi | 0:09f6f55b32fa | 49 | |
mohamedwajdi | 0:09f6f55b32fa | 50 | |
mohamedwajdi | 0:09f6f55b32fa | 51 | |
mohamedwajdi | 0:09f6f55b32fa | 52 | |
mohamedwajdi | 0:09f6f55b32fa | 53 | |
mohamedwajdi | 0:09f6f55b32fa | 54 | |
mohamedwajdi | 0:09f6f55b32fa | 55 | |
mohamedwajdi | 0:09f6f55b32fa | 56 | |
mohamedwajdi | 0:09f6f55b32fa | 57 | |
mohamedwajdi | 0:09f6f55b32fa | 58 | |
mohamedwajdi | 0:09f6f55b32fa | 59 | |
mohamedwajdi | 0:09f6f55b32fa | 60 | |
mohamedwajdi | 0:09f6f55b32fa | 61 | |
mohamedwajdi | 0:09f6f55b32fa | 62 | |
mohamedwajdi | 0:09f6f55b32fa | 63 | |
mohamedwajdi | 0:09f6f55b32fa | 64 | |
mohamedwajdi | 0:09f6f55b32fa | 65 | |
mohamedwajdi | 0:09f6f55b32fa | 66 | |
mohamedwajdi | 0:09f6f55b32fa | 67 | |
mohamedwajdi | 0:09f6f55b32fa | 68 | |
mohamedwajdi | 0:09f6f55b32fa | 69 | |
mohamedwajdi | 0:09f6f55b32fa | 70 | |
mohamedwajdi | 0:09f6f55b32fa | 71 | // Procedure résevée pour les bits de sorties (Foction 1 et 5) |
mohamedwajdi | 0:09f6f55b32fa | 72 | // pucRegBuffer => coils buffer usAddress => coils address |
mohamedwajdi | 0:09f6f55b32fa | 73 | // usNCoils => coils number eMode => read or write |
mohamedwajdi | 0:09f6f55b32fa | 74 | eMBErrorCode |
mohamedwajdi | 0:09f6f55b32fa | 75 | eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode ) |
mohamedwajdi | 0:09f6f55b32fa | 76 | { |
mohamedwajdi | 0:09f6f55b32fa | 77 | eMBErrorCode eStatus = MB_ENOERR; |
mohamedwajdi | 0:09f6f55b32fa | 78 | int iIntRegIndex; |
mohamedwajdi | 0:09f6f55b32fa | 79 | int iIntBufNum; |
mohamedwajdi | 0:09f6f55b32fa | 80 | int iIntBitNum; |
mohamedwajdi | 0:09f6f55b32fa | 81 | int iExtRegIndex=0; |
mohamedwajdi | 0:09f6f55b32fa | 82 | int iExtBufNum; |
mohamedwajdi | 0:09f6f55b32fa | 83 | int iExtBitNum; |
mohamedwajdi | 0:09f6f55b32fa | 84 | UCHAR ucTemp; |
mohamedwajdi | 0:09f6f55b32fa | 85 | if( ( usAddress >= BITS_OUT_START ) |
mohamedwajdi | 0:09f6f55b32fa | 86 | && ( usAddress + usNCoils <= BITS_OUT_START + BITS_OUT_NBITS ) ) |
mohamedwajdi | 0:09f6f55b32fa | 87 | { |
mohamedwajdi | 0:09f6f55b32fa | 88 | iIntRegIndex = ( int )( usAddress - BitsOutStart ); |
mohamedwajdi | 0:09f6f55b32fa | 89 | |
mohamedwajdi | 0:09f6f55b32fa | 90 | while( usNCoils > 0 ) |
mohamedwajdi | 0:09f6f55b32fa | 91 | { |
mohamedwajdi | 0:09f6f55b32fa | 92 | iIntBufNum=iIntRegIndex/8; |
mohamedwajdi | 0:09f6f55b32fa | 93 | iIntBitNum=iIntRegIndex%8; |
mohamedwajdi | 0:09f6f55b32fa | 94 | iExtBufNum=iExtRegIndex/8; |
mohamedwajdi | 0:09f6f55b32fa | 95 | iExtBitNum=iExtRegIndex%8; |
mohamedwajdi | 0:09f6f55b32fa | 96 | |
mohamedwajdi | 0:09f6f55b32fa | 97 | switch ( eMode ) |
mohamedwajdi | 0:09f6f55b32fa | 98 | { |
mohamedwajdi | 0:09f6f55b32fa | 99 | case MB_REG_READ: |
mohamedwajdi | 0:09f6f55b32fa | 100 | // Read coils |
mohamedwajdi | 0:09f6f55b32fa | 101 | if(iExtBitNum==0){ |
mohamedwajdi | 0:09f6f55b32fa | 102 | pucRegBuffer[iExtBufNum]=0; |
mohamedwajdi | 0:09f6f55b32fa | 103 | } |
mohamedwajdi | 0:09f6f55b32fa | 104 | ucTemp=(BitsOut[iIntBufNum]>>iIntBitNum) & 1; |
mohamedwajdi | 0:09f6f55b32fa | 105 | pucRegBuffer[iExtBufNum]|=ucTemp<<iExtBitNum; |
mohamedwajdi | 0:09f6f55b32fa | 106 | break; |
mohamedwajdi | 0:09f6f55b32fa | 107 | |
mohamedwajdi | 0:09f6f55b32fa | 108 | case MB_REG_WRITE: |
mohamedwajdi | 0:09f6f55b32fa | 109 | // Write coils |
mohamedwajdi | 0:09f6f55b32fa | 110 | ucTemp=BitsOut[iIntBufNum]&(~(1<<iIntBitNum)); |
mohamedwajdi | 0:09f6f55b32fa | 111 | ucTemp|=((pucRegBuffer[iExtBufNum]>>iExtBitNum) & 1)<<iIntBitNum; |
mohamedwajdi | 0:09f6f55b32fa | 112 | BitsOut[iIntBufNum]=ucTemp; |
mohamedwajdi | 0:09f6f55b32fa | 113 | break; |
mohamedwajdi | 0:09f6f55b32fa | 114 | } |
mohamedwajdi | 0:09f6f55b32fa | 115 | iIntRegIndex++; |
mohamedwajdi | 0:09f6f55b32fa | 116 | iExtRegIndex++; |
mohamedwajdi | 0:09f6f55b32fa | 117 | usNCoils--; |
mohamedwajdi | 0:09f6f55b32fa | 118 | |
mohamedwajdi | 0:09f6f55b32fa | 119 | } |
mohamedwajdi | 0:09f6f55b32fa | 120 | } |
mohamedwajdi | 0:09f6f55b32fa | 121 | else |
mohamedwajdi | 0:09f6f55b32fa | 122 | { |
mohamedwajdi | 0:09f6f55b32fa | 123 | eStatus = MB_ENOREG; |
mohamedwajdi | 0:09f6f55b32fa | 124 | } |
mohamedwajdi | 0:09f6f55b32fa | 125 | return eStatus; |
mohamedwajdi | 0:09f6f55b32fa | 126 | } |
mohamedwajdi | 0:09f6f55b32fa | 127 | |
mohamedwajdi | 0:09f6f55b32fa | 128 | // Procedure résevée pour les bits d'entrées (Foction 2) |
mohamedwajdi | 0:09f6f55b32fa | 129 | // pucRegBuffer => discrete buffer usAddress => discrete address |
mohamedwajdi | 0:09f6f55b32fa | 130 | // usNDiscrete => discrete number |
mohamedwajdi | 0:09f6f55b32fa | 131 | eMBErrorCode |
mohamedwajdi | 0:09f6f55b32fa | 132 | eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete ) |
mohamedwajdi | 0:09f6f55b32fa | 133 | { |
mohamedwajdi | 0:09f6f55b32fa | 134 | eMBErrorCode eStatus = MB_ENOERR; |
mohamedwajdi | 0:09f6f55b32fa | 135 | int iIntRegIndex; |
mohamedwajdi | 0:09f6f55b32fa | 136 | int iIntBufNum; |
mohamedwajdi | 0:09f6f55b32fa | 137 | int iIntBitNum; |
mohamedwajdi | 0:09f6f55b32fa | 138 | int iExtRegIndex=0; |
mohamedwajdi | 0:09f6f55b32fa | 139 | int iExtBufNum; |
mohamedwajdi | 0:09f6f55b32fa | 140 | int iExtBitNum; |
mohamedwajdi | 0:09f6f55b32fa | 141 | UCHAR ucTemp; |
mohamedwajdi | 0:09f6f55b32fa | 142 | if( ( usAddress >= BITS_IN_START ) |
mohamedwajdi | 0:09f6f55b32fa | 143 | && ( usAddress + usNDiscrete <= BITS_IN_START + BITS_IN_NBITS ) ) |
mohamedwajdi | 0:09f6f55b32fa | 144 | { |
mohamedwajdi | 0:09f6f55b32fa | 145 | iIntRegIndex = ( int )( usAddress - BitsInStart ); |
mohamedwajdi | 0:09f6f55b32fa | 146 | |
mohamedwajdi | 0:09f6f55b32fa | 147 | while( usNDiscrete > 0 ) |
mohamedwajdi | 0:09f6f55b32fa | 148 | { |
mohamedwajdi | 0:09f6f55b32fa | 149 | iIntBufNum=iIntRegIndex/8; |
mohamedwajdi | 0:09f6f55b32fa | 150 | iIntBitNum=iIntRegIndex%8; |
mohamedwajdi | 0:09f6f55b32fa | 151 | iExtBufNum=iExtRegIndex/8; |
mohamedwajdi | 0:09f6f55b32fa | 152 | iExtBitNum=iExtRegIndex%8; |
mohamedwajdi | 0:09f6f55b32fa | 153 | |
mohamedwajdi | 0:09f6f55b32fa | 154 | // Read discrete inputs |
mohamedwajdi | 0:09f6f55b32fa | 155 | if(iExtBitNum==0){ |
mohamedwajdi | 0:09f6f55b32fa | 156 | pucRegBuffer[iExtBufNum]=0; |
mohamedwajdi | 0:09f6f55b32fa | 157 | } |
mohamedwajdi | 0:09f6f55b32fa | 158 | ucTemp=(BitsIn[iIntBufNum]>>iIntBitNum) & 1; |
mohamedwajdi | 0:09f6f55b32fa | 159 | pucRegBuffer[iExtBufNum]|=ucTemp<<iExtBitNum; |
mohamedwajdi | 0:09f6f55b32fa | 160 | |
mohamedwajdi | 0:09f6f55b32fa | 161 | iIntRegIndex++; |
mohamedwajdi | 0:09f6f55b32fa | 162 | iExtRegIndex++; |
mohamedwajdi | 0:09f6f55b32fa | 163 | usNDiscrete--; |
mohamedwajdi | 0:09f6f55b32fa | 164 | } |
mohamedwajdi | 0:09f6f55b32fa | 165 | } |
mohamedwajdi | 0:09f6f55b32fa | 166 | else |
mohamedwajdi | 0:09f6f55b32fa | 167 | { |
mohamedwajdi | 0:09f6f55b32fa | 168 | eStatus = MB_ENOREG; |
mohamedwajdi | 0:09f6f55b32fa | 169 | } |
mohamedwajdi | 0:09f6f55b32fa | 170 | return eStatus; |
mohamedwajdi | 0:09f6f55b32fa | 171 | } |
mohamedwajdi | 0:09f6f55b32fa | 172 | |
mohamedwajdi | 0:09f6f55b32fa | 173 | // Procedure résevée pour les registres de sorties (Foction 3 et 6) |
mohamedwajdi | 0:09f6f55b32fa | 174 | // pucRegBuffer => holding register buffer usAddress holding => register address |
mohamedwajdi | 0:09f6f55b32fa | 175 | // usNRegs holding register number eMode => read or write |
mohamedwajdi | 0:09f6f55b32fa | 176 | eMBErrorCode |
mohamedwajdi | 0:09f6f55b32fa | 177 | eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode ) |
mohamedwajdi | 0:09f6f55b32fa | 178 | { |
mohamedwajdi | 0:09f6f55b32fa | 179 | eMBErrorCode eStatus = MB_ENOERR; |
mohamedwajdi | 0:09f6f55b32fa | 180 | int iRegIndex; |
mohamedwajdi | 0:09f6f55b32fa | 181 | |
mohamedwajdi | 0:09f6f55b32fa | 182 | if( ( usAddress >= REG_OUT_START ) && |
mohamedwajdi | 0:09f6f55b32fa | 183 | ( usAddress + usNRegs <= REG_OUT_START + REG_OUT_NREGS ) ) |
mohamedwajdi | 0:09f6f55b32fa | 184 | { |
mohamedwajdi | 0:09f6f55b32fa | 185 | iRegIndex = ( int )( usAddress - RegOutStart ); |
mohamedwajdi | 0:09f6f55b32fa | 186 | switch ( eMode ) |
mohamedwajdi | 0:09f6f55b32fa | 187 | { |
mohamedwajdi | 0:09f6f55b32fa | 188 | //*** Pass current register values to the protocol stack. *** |
mohamedwajdi | 0:09f6f55b32fa | 189 | case MB_REG_READ: |
mohamedwajdi | 0:09f6f55b32fa | 190 | while( usNRegs > 0 ) |
mohamedwajdi | 0:09f6f55b32fa | 191 | { |
mohamedwajdi | 0:09f6f55b32fa | 192 | *pucRegBuffer++ = ( UCHAR ) ( RegOut[iRegIndex] >> 8 ); |
mohamedwajdi | 0:09f6f55b32fa | 193 | *pucRegBuffer++ = ( UCHAR ) ( RegOut[iRegIndex] & 0xFF ); |
mohamedwajdi | 0:09f6f55b32fa | 194 | iRegIndex++; |
mohamedwajdi | 0:09f6f55b32fa | 195 | usNRegs--; |
mohamedwajdi | 0:09f6f55b32fa | 196 | } |
mohamedwajdi | 0:09f6f55b32fa | 197 | break; |
mohamedwajdi | 0:09f6f55b32fa | 198 | |
mohamedwajdi | 0:09f6f55b32fa | 199 | //***Update current register values with new values from the protocol stack.*** |
mohamedwajdi | 0:09f6f55b32fa | 200 | case MB_REG_WRITE: |
mohamedwajdi | 0:09f6f55b32fa | 201 | while( usNRegs > 0 ) |
mohamedwajdi | 0:09f6f55b32fa | 202 | { |
mohamedwajdi | 0:09f6f55b32fa | 203 | RegOut[iRegIndex] = *pucRegBuffer++ << 8; |
mohamedwajdi | 0:09f6f55b32fa | 204 | RegOut[iRegIndex] |= *pucRegBuffer++; |
mohamedwajdi | 0:09f6f55b32fa | 205 | iRegIndex++; |
mohamedwajdi | 0:09f6f55b32fa | 206 | usNRegs--; |
mohamedwajdi | 0:09f6f55b32fa | 207 | } |
mohamedwajdi | 0:09f6f55b32fa | 208 | } |
mohamedwajdi | 0:09f6f55b32fa | 209 | } |
mohamedwajdi | 0:09f6f55b32fa | 210 | else |
mohamedwajdi | 0:09f6f55b32fa | 211 | { |
mohamedwajdi | 0:09f6f55b32fa | 212 | eStatus = MB_ENOREG; |
mohamedwajdi | 0:09f6f55b32fa | 213 | } |
mohamedwajdi | 0:09f6f55b32fa | 214 | return eStatus; |
mohamedwajdi | 0:09f6f55b32fa | 215 | } |
mohamedwajdi | 0:09f6f55b32fa | 216 | // Procedure résevée pour les registres de sorties (Foction 4) |
mohamedwajdi | 0:09f6f55b32fa | 217 | // pucRegBuffer => input register buffer usAddress => input register address |
mohamedwajdi | 0:09f6f55b32fa | 218 | // usNRegs input register number |
mohamedwajdi | 0:09f6f55b32fa | 219 | eMBErrorCode |
mohamedwajdi | 0:09f6f55b32fa | 220 | eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs ) |
mohamedwajdi | 0:09f6f55b32fa | 221 | { |
mohamedwajdi | 0:09f6f55b32fa | 222 | eMBErrorCode eStatus = MB_ENOERR; |
mohamedwajdi | 0:09f6f55b32fa | 223 | int iRegIndex; |
mohamedwajdi | 0:09f6f55b32fa | 224 | |
mohamedwajdi | 0:09f6f55b32fa | 225 | if( ( usAddress >= REG_IN_START ) |
mohamedwajdi | 0:09f6f55b32fa | 226 | && ( usAddress + usNRegs <= REG_IN_START + REG_IN_NREGS ) ) |
mohamedwajdi | 0:09f6f55b32fa | 227 | { |
mohamedwajdi | 0:09f6f55b32fa | 228 | iRegIndex = ( int )( usAddress - RegInStart ); |
mohamedwajdi | 0:09f6f55b32fa | 229 | while( usNRegs > 0 ) |
mohamedwajdi | 0:09f6f55b32fa | 230 | { |
mohamedwajdi | 0:09f6f55b32fa | 231 | *pucRegBuffer++ = ( unsigned char )( RegIn[iRegIndex] >> 8 ); |
mohamedwajdi | 0:09f6f55b32fa | 232 | *pucRegBuffer++ = ( unsigned char )( RegIn[iRegIndex] & 0xFF ); |
mohamedwajdi | 0:09f6f55b32fa | 233 | iRegIndex++; |
mohamedwajdi | 0:09f6f55b32fa | 234 | usNRegs--; |
mohamedwajdi | 0:09f6f55b32fa | 235 | } |
mohamedwajdi | 0:09f6f55b32fa | 236 | } |
mohamedwajdi | 0:09f6f55b32fa | 237 | else |
mohamedwajdi | 0:09f6f55b32fa | 238 | { |
mohamedwajdi | 0:09f6f55b32fa | 239 | eStatus = MB_ENOREG; |
mohamedwajdi | 0:09f6f55b32fa | 240 | } |
mohamedwajdi | 0:09f6f55b32fa | 241 | return eStatus; |
mohamedwajdi | 0:09f6f55b32fa | 242 | } |