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.
Diff: main.cpp
- Revision:
- 0:ecb5de3a3147
- Child:
- 1:fcdfb51a34c8
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Fri Apr 02 10:38:15 2021 +0000
@@ -0,0 +1,279 @@
+#include "mbed.h"
+#include "mb.h"
+
+#define BITS_OUT_START 0x1001 //Bits de sorties (fonctions 1 et 5)
+#define BITS_OUT_NBITS 16
+#define BITS_OUT_BYTES BITS_OUT_NBITS/8 //16/8 = 2 octets
+
+#define BITS_IN_START 0x2001 //Bits d'entées (fonction 2)
+#define BITS_IN_NBITS 16
+#define BITS_IN_BYTES BITS_IN_NBITS/8 //16/8 = 2 octets
+
+#define REG_OUT_START 0x3001 //Registres de sorties (fonctions 3 et 6)
+#define REG_OUT_NREGS 4
+
+#define REG_IN_START 0x4001 //Registres d'entées (fonction 4)
+#define REG_IN_NREGS 4
+
+#define SLAVE_ID 0x07
+
+static USHORT BitsOutStart = BITS_OUT_START; // (fonctions 1 et 5)
+static UCHAR BitsOut[BITS_OUT_BYTES] = {0xA5,0x5A};
+static USHORT BitsInStart = BITS_IN_START; // (fonction 2)
+static UCHAR BitsIn[BITS_IN_BYTES] = {0x3C,0xC3};
+static USHORT RegOutStart = REG_OUT_START; // (fonctions 3 et 6)
+static USHORT RegOut[REG_OUT_NREGS] = {0x0123,0x4567,0x89AB,0xCDEF};
+static USHORT RegInStart = REG_IN_START; // (fonction 4)
+static USHORT RegIn[REG_IN_NREGS] = {0x1122,0x3344,0x5566,0x7788};
+
+int main() {
+ eMBInit( MB_RTU, SLAVE_ID, 0, 9600, MB_PAR_NONE );
+ eMBEnable();
+
+ PwmOut moteur(PB_11);
+ PwmOut Led1(PB_10);
+ AnalogIn Pot(PA_0);
+ DigitalIn BP1(PA_8,PullUp);
+ DigitalIn BP2(PB_12,PullUp);
+ DigitalOut Led2(PB_8);
+ float Rap_Cyc=0;
+
+ moteur.period_ms(.....);
+ Rap_Cyc=0;
+ RegOut[0]=0;
+ while(1) {
+ //**** 1 ****//
+ eMBPoll();
+ //**** 2 ****//
+ if(BitsOut[0] & 0x01) Led2=......;
+ else Led2=.......;
+ Rap_Cyc = ................/100.0;
+ //**** 3 ****//
+ if(!BP1 && Rap_Cyc <......) {
+ Rap_Cyc = Rap_Cyc + .........;
+ moteur = Rap_Cyc;
+ wait(0.5);
+ }
+ if(!BP1 && Rap_Cyc > ........){
+ Rap_Cyc = Rap_Cyc - ........;
+ moteur = Rap_Cyc;
+ wait(0.5);
+ }
+ Led1 = ..................;
+ //**** 4 ****//
+ RegOut[0] = Rap_Cyc * ........;
+ RegOut[1] = Pot.read() * .......;
+ //**** 5 ****//
+ if(!BP1) BitsIn[0] &=......;
+ else BitsIn[0] |=......;
+ if(!BP2) BitsIn[0] &=......;
+ else BitsIn[0] |=......;
+ RegIn[0] = ....................;
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+// Procedure résevée pour les bits de sorties (Foction 1 et 5)
+// pucRegBuffer => coils buffer usAddress => coils address
+// usNCoils => coils number eMode => read or write
+eMBErrorCode
+eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode )
+{
+ eMBErrorCode eStatus = MB_ENOERR;
+ int iIntRegIndex;
+ int iIntBufNum;
+ int iIntBitNum;
+ int iExtRegIndex=0;
+ int iExtBufNum;
+ int iExtBitNum;
+ UCHAR ucTemp;
+ if( ( usAddress >= BITS_OUT_START )
+ && ( usAddress + usNCoils <= BITS_OUT_START + BITS_OUT_NBITS ) )
+ {
+ iIntRegIndex = ( int )( usAddress - BitsOutStart );
+
+ while( usNCoils > 0 )
+ {
+ iIntBufNum=iIntRegIndex/8;
+ iIntBitNum=iIntRegIndex%8;
+ iExtBufNum=iExtRegIndex/8;
+ iExtBitNum=iExtRegIndex%8;
+
+ switch ( eMode )
+ {
+ case MB_REG_READ:
+ // Read coils
+ if(iExtBitNum==0){
+ pucRegBuffer[iExtBufNum]=0;
+ }
+ ucTemp=(BitsOut[iIntBufNum]>>iIntBitNum) & 1;
+ pucRegBuffer[iExtBufNum]|=ucTemp<<iExtBitNum;
+ break;
+
+ case MB_REG_WRITE:
+ // Write coils
+ ucTemp=BitsOut[iIntBufNum]&(~(1<<iIntBitNum));
+ ucTemp|=((pucRegBuffer[iExtBufNum]>>iExtBitNum) & 1)<<iIntBitNum;
+ BitsOut[iIntBufNum]=ucTemp;
+ break;
+ }
+ iIntRegIndex++;
+ iExtRegIndex++;
+ usNCoils--;
+
+ }
+ }
+ else
+ {
+ eStatus = MB_ENOREG;
+ }
+ return eStatus;
+}
+
+// Procedure résevée pour les bits d'entrées (Foction 2)
+// pucRegBuffer => discrete buffer usAddress => discrete address
+// usNDiscrete => discrete number
+eMBErrorCode
+eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete )
+{
+ eMBErrorCode eStatus = MB_ENOERR;
+ int iIntRegIndex;
+ int iIntBufNum;
+ int iIntBitNum;
+ int iExtRegIndex=0;
+ int iExtBufNum;
+ int iExtBitNum;
+ UCHAR ucTemp;
+ if( ( usAddress >= BITS_IN_START )
+ && ( usAddress + usNDiscrete <= BITS_IN_START + BITS_IN_NBITS ) )
+ {
+ iIntRegIndex = ( int )( usAddress - BitsInStart );
+
+ while( usNDiscrete > 0 )
+ {
+ iIntBufNum=iIntRegIndex/8;
+ iIntBitNum=iIntRegIndex%8;
+ iExtBufNum=iExtRegIndex/8;
+ iExtBitNum=iExtRegIndex%8;
+
+ // Read discrete inputs
+ if(iExtBitNum==0){
+ pucRegBuffer[iExtBufNum]=0;
+ }
+ ucTemp=(BitsIn[iIntBufNum]>>iIntBitNum) & 1;
+ pucRegBuffer[iExtBufNum]|=ucTemp<<iExtBitNum;
+
+ iIntRegIndex++;
+ iExtRegIndex++;
+ usNDiscrete--;
+ }
+ }
+ else
+ {
+ eStatus = MB_ENOREG;
+ }
+ return eStatus;
+}
+
+// Procedure résevée pour les registres de sorties (Foction 3 et 6)
+// pucRegBuffer => holding register buffer usAddress holding => register address
+// usNRegs holding register number eMode => read or write
+eMBErrorCode
+eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode )
+{
+ eMBErrorCode eStatus = MB_ENOERR;
+ int iRegIndex;
+
+ if( ( usAddress >= REG_OUT_START ) &&
+ ( usAddress + usNRegs <= REG_OUT_START + REG_OUT_NREGS ) )
+ {
+ iRegIndex = ( int )( usAddress - RegOutStart );
+ switch ( eMode )
+ {
+ //*** Pass current register values to the protocol stack. ***
+ case MB_REG_READ:
+ while( usNRegs > 0 )
+ {
+ *pucRegBuffer++ = ( UCHAR ) ( RegOut[iRegIndex] >> 8 );
+ *pucRegBuffer++ = ( UCHAR ) ( RegOut[iRegIndex] & 0xFF );
+ iRegIndex++;
+ usNRegs--;
+ }
+ break;
+
+ //***Update current register values with new values from the protocol stack.***
+ case MB_REG_WRITE:
+ while( usNRegs > 0 )
+ {
+ RegOut[iRegIndex] = *pucRegBuffer++ << 8;
+ RegOut[iRegIndex] |= *pucRegBuffer++;
+ iRegIndex++;
+ usNRegs--;
+ }
+ }
+ }
+ else
+ {
+ eStatus = MB_ENOREG;
+ }
+ return eStatus;
+}
+// Procedure résevée pour les registres de sorties (Foction 4)
+// pucRegBuffer => input register buffer usAddress => input register address
+// usNRegs input register number
+eMBErrorCode
+eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )
+{
+ eMBErrorCode eStatus = MB_ENOERR;
+ int iRegIndex;
+
+ if( ( usAddress >= REG_IN_START )
+ && ( usAddress + usNRegs <= REG_IN_START + REG_IN_NREGS ) )
+ {
+ iRegIndex = ( int )( usAddress - RegInStart );
+ while( usNRegs > 0 )
+ {
+ *pucRegBuffer++ = ( unsigned char )( RegIn[iRegIndex] >> 8 );
+ *pucRegBuffer++ = ( unsigned char )( RegIn[iRegIndex] & 0xFF );
+ iRegIndex++;
+ usNRegs--;
+ }
+ }
+ else
+ {
+ eStatus = MB_ENOREG;
+ }
+ return eStatus;
+}