Software modbus, display, knoppen, bewegingssensor en mbed OS

Dependents:   testSoftware8_alles_display

Committer:
mikevd1
Date:
Tue Sep 11 09:34:54 2018 +0000
Revision:
2:ca3d2395b6d3
Parent:
1:92f9d6cec962
Child:
3:4fff62544119
Working with modbus master

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mikevd1 0:d603d31b42dc 1 #include "mbed.h"
mikevd1 0:d603d31b42dc 2 #include "setup.h"
mikevd1 2:ca3d2395b6d3 3 #include "ssd1306.h"
mikevd1 2:ca3d2395b6d3 4 #include "FlashIAP.h"
mikevd1 0:d603d31b42dc 5
mikevd1 2:ca3d2395b6d3 6 // slaveID
mikevd1 0:d603d31b42dc 7 unsigned int slaveID = 0x07;
mikevd1 2:ca3d2395b6d3 8 // ondersteundende functie codes
mikevd1 2:ca3d2395b6d3 9
mikevd1 0:d603d31b42dc 10 unsigned int functionID0x03 = 0x03;
mikevd1 0:d603d31b42dc 11 unsigned int functionID0x05 = 0x05;
mikevd1 0:d603d31b42dc 12 unsigned int functionID0x02 = 0x02;
mikevd1 0:d603d31b42dc 13
mikevd1 2:ca3d2395b6d3 14 //?
mikevd1 2:ca3d2395b6d3 15 int TimerEnd = 0 ;
mikevd1 0:d603d31b42dc 16 char TxEnablePin = PA_8;
mikevd1 0:d603d31b42dc 17
mikevd1 2:ca3d2395b6d3 18 //UART to RS485 bus line & enable of RS485
mikevd1 2:ca3d2395b6d3 19 Serial bus(PA_9,PA_10); //rx , tx
mikevd1 0:d603d31b42dc 20 DigitalOut activateSN65(PA_8);
mikevd1 0:d603d31b42dc 21
mikevd1 2:ca3d2395b6d3 22 // Timer max message time
mikevd1 2:ca3d2395b6d3 23 Timer maxMessageTime ;
mikevd1 0:d603d31b42dc 24
mikevd1 2:ca3d2395b6d3 25 //?
mikevd1 0:d603d31b42dc 26 unsigned int T1;
mikevd1 0:d603d31b42dc 27 unsigned int T1_5; // inter character time out
mikevd1 0:d603d31b42dc 28 unsigned int T3_5; // frame delay
mikevd1 0:d603d31b42dc 29 unsigned static int buffer = 0;
mikevd1 2:ca3d2395b6d3 30
mikevd1 0:d603d31b42dc 31 unsigned int dataReceived[10] ;
mikevd1 0:d603d31b42dc 32 unsigned int dataSend[10] ;
mikevd1 2:ca3d2395b6d3 33 unsigned int count = 0, count1 = 0, count2 = 0 ;
mikevd1 0:d603d31b42dc 34
mikevd1 0:d603d31b42dc 35 void modbus_configure(long baud, int _slaveID )
mikevd1 0:d603d31b42dc 36 {
mikevd1 0:d603d31b42dc 37 slaveID = _slaveID;
mikevd1 2:ca3d2395b6d3 38
mikevd1 0:d603d31b42dc 39 if (baud == 1000000 ){
mikevd1 0:d603d31b42dc 40 T1_5 = 1;
mikevd1 0:d603d31b42dc 41 T3_5 = 10;
mikevd1 0:d603d31b42dc 42 }
mikevd1 0:d603d31b42dc 43 else if (baud >= 115200 ){
mikevd1 0:d603d31b42dc 44 T1_5 = 75;
mikevd1 0:d603d31b42dc 45 T3_5 = 175;
mikevd1 0:d603d31b42dc 46 }
mikevd1 0:d603d31b42dc 47 else if (baud > 19200){
mikevd1 0:d603d31b42dc 48 T1_5 = 750;
mikevd1 0:d603d31b42dc 49 T3_5 = 1750;
mikevd1 0:d603d31b42dc 50 }
mikevd1 0:d603d31b42dc 51 else {
mikevd1 0:d603d31b42dc 52 T1_5 = 15000000/baud; // 1T * 1.5 = T1.5
mikevd1 0:d603d31b42dc 53 T3_5 = 35000000/baud; // 1T * 3.5 = T3.5
mikevd1 0:d603d31b42dc 54 }
mikevd1 0:d603d31b42dc 55 T1 = 10000000/baud;
mikevd1 2:ca3d2395b6d3 56 // maxMessageTime.reset();
mikevd1 0:d603d31b42dc 57 }
mikevd1 0:d603d31b42dc 58
mikevd1 2:ca3d2395b6d3 59
mikevd1 2:ca3d2395b6d3 60
mikevd1 2:ca3d2395b6d3 61
mikevd1 2:ca3d2395b6d3 62 int modbus_read(dataModbus *allData)
mikevd1 0:d603d31b42dc 63 {
mikevd1 2:ca3d2395b6d3 64 activateSN65 = 0 ;
mikevd1 2:ca3d2395b6d3 65 static unsigned int maxSizeBuffer = 0 ;
mikevd1 2:ca3d2395b6d3 66 if(bus.readable())
mikevd1 2:ca3d2395b6d3 67 {
mikevd1 2:ca3d2395b6d3 68 // if( maxMessageTime.read_ms() > (int)180 )
mikevd1 2:ca3d2395b6d3 69 // {
mikevd1 2:ca3d2395b6d3 70 // buffer = 0 ;
mikevd1 2:ca3d2395b6d3 71 // maxMessageTime.reset();
mikevd1 2:ca3d2395b6d3 72 // }
mikevd1 2:ca3d2395b6d3 73 int data = bus.getc();
mikevd1 2:ca3d2395b6d3 74 if ( data == slaveID && buffer == 0 )
mikevd1 2:ca3d2395b6d3 75 {
mikevd1 2:ca3d2395b6d3 76 // maxMessageTime.start();
mikevd1 2:ca3d2395b6d3 77 dataReceived[buffer++] = slaveID ; // slaveID checks out proceed to checking function ID
mikevd1 2:ca3d2395b6d3 78 }
mikevd1 2:ca3d2395b6d3 79 else if ( buffer == 1 )
mikevd1 2:ca3d2395b6d3 80 {
mikevd1 2:ca3d2395b6d3 81 dataReceived[buffer++] = data ; // functie code
mikevd1 2:ca3d2395b6d3 82 maxSizeBuffer = functionCodeCheckMaxData(data) ;
mikevd1 2:ca3d2395b6d3 83 }
mikevd1 2:ca3d2395b6d3 84 else if ( ( buffer >= 2 ) && ( buffer < maxSizeBuffer ) )
mikevd1 2:ca3d2395b6d3 85 {
mikevd1 2:ca3d2395b6d3 86 dataReceived[buffer++] = data ; // data
mikevd1 2:ca3d2395b6d3 87 }
mikevd1 2:ca3d2395b6d3 88 else if ( buffer == maxSizeBuffer || buffer == maxSizeBuffer + 1 )
mikevd1 2:ca3d2395b6d3 89 {
mikevd1 2:ca3d2395b6d3 90 if (buffer == maxSizeBuffer )
mikevd1 0:d603d31b42dc 91 {
mikevd1 2:ca3d2395b6d3 92 dataReceived[buffer++] = data ;
mikevd1 0:d603d31b42dc 93 }
mikevd1 0:d603d31b42dc 94 else
mikevd1 0:d603d31b42dc 95 {
mikevd1 2:ca3d2395b6d3 96 dataReceived[buffer++] = data ;
mikevd1 2:ca3d2395b6d3 97 //buffer++;
mikevd1 2:ca3d2395b6d3 98 CRCChecking();
mikevd1 2:ca3d2395b6d3 99 }
mikevd1 0:d603d31b42dc 100 }
mikevd1 2:ca3d2395b6d3 101 else
mikevd1 0:d603d31b42dc 102 {
mikevd1 2:ca3d2395b6d3 103 buffer = 0 ;
mikevd1 2:ca3d2395b6d3 104 // maxMessageTime.stop();
mikevd1 2:ca3d2395b6d3 105 // maxMessageTime.reset();
mikevd1 2:ca3d2395b6d3 106 }
mikevd1 2:ca3d2395b6d3 107 }
mikevd1 2:ca3d2395b6d3 108 if ( buffer == maxSizeBuffer + 3 )
mikevd1 2:ca3d2395b6d3 109 {
mikevd1 2:ca3d2395b6d3 110 // maxMessageTime.stop();
mikevd1 2:ca3d2395b6d3 111 // maxMessageTime.reset();
mikevd1 2:ca3d2395b6d3 112 return modbus_sendData(allData);
mikevd1 2:ca3d2395b6d3 113 }
mikevd1 0:d603d31b42dc 114
mikevd1 0:d603d31b42dc 115 return 0 ;
mikevd1 0:d603d31b42dc 116 }
mikevd1 0:d603d31b42dc 117
mikevd1 2:ca3d2395b6d3 118 int modbus_sendData(dataModbus *allData)
mikevd1 0:d603d31b42dc 119 {
mikevd1 2:ca3d2395b6d3 120 int i = 0 ;
mikevd1 1:92f9d6cec962 121 int maxData = 0 ;
mikevd1 2:ca3d2395b6d3 122 static int temperatuur = 0, beweging = 0 ; //allData->temperatuur ; //0 ; //\, count1 = 0, count2 = 0 ;
mikevd1 2:ca3d2395b6d3 123 temperatuur = allData->temperatuur ;
mikevd1 2:ca3d2395b6d3 124 beweging = allData->beweging ;
mikevd1 1:92f9d6cec962 125 dataSend[maxData++] = slaveID ;
mikevd1 1:92f9d6cec962 126 dataSend[maxData++] = dataReceived[1];
mikevd1 2:ca3d2395b6d3 127 if ( dataReceived[1] == 0x02 )
mikevd1 2:ca3d2395b6d3 128 {
mikevd1 2:ca3d2395b6d3 129 dataSend[maxData++] = 0x01 ; // byte count
mikevd1 2:ca3d2395b6d3 130 dataSend[maxData++] = 0x01 ;
mikevd1 2:ca3d2395b6d3 131 }
mikevd1 2:ca3d2395b6d3 132 else if (dataReceived[1] == 0x04 )
mikevd1 2:ca3d2395b6d3 133 {
mikevd1 2:ca3d2395b6d3 134 if ( dataReceived[3] == 0 )
mikevd1 2:ca3d2395b6d3 135 {
mikevd1 2:ca3d2395b6d3 136 dataSend[maxData++] = 0x02 ; // byte count
mikevd1 2:ca3d2395b6d3 137 dataSend[maxData++] = 0x00 ;
mikevd1 2:ca3d2395b6d3 138 dataSend[maxData++] = temperatuur ;
mikevd1 2:ca3d2395b6d3 139 }
mikevd1 2:ca3d2395b6d3 140 else
mikevd1 2:ca3d2395b6d3 141 {
mikevd1 2:ca3d2395b6d3 142 dataSend[maxData++] = 0x02 ; // byte count
mikevd1 2:ca3d2395b6d3 143 dataSend[maxData++] = 0x00 ;
mikevd1 2:ca3d2395b6d3 144 dataSend[maxData++] = beweging ;
mikevd1 2:ca3d2395b6d3 145 }
mikevd1 2:ca3d2395b6d3 146 }
mikevd1 2:ca3d2395b6d3 147 else if ( dataReceived[1] == 0x06 )
mikevd1 0:d603d31b42dc 148 {
mikevd1 2:ca3d2395b6d3 149 dataSend[maxData++] = dataReceived[2] ; //echo
mikevd1 2:ca3d2395b6d3 150 dataSend[maxData++] = dataReceived[3] ;
mikevd1 2:ca3d2395b6d3 151 dataSend[maxData++] = dataReceived[4] ;
mikevd1 2:ca3d2395b6d3 152 dataSend[maxData++] = dataReceived[5] ;
mikevd1 2:ca3d2395b6d3 153 if ( dataReceived[3] == 0x01 )
mikevd1 2:ca3d2395b6d3 154 {
mikevd1 2:ca3d2395b6d3 155 count2 = dataReceived[5] ;
mikevd1 2:ca3d2395b6d3 156 if ( count2 == 1 )
mikevd1 2:ca3d2395b6d3 157 {
mikevd1 2:ca3d2395b6d3 158 allData->RelaisK1 = 1 ;
mikevd1 2:ca3d2395b6d3 159 }
mikevd1 2:ca3d2395b6d3 160 else
mikevd1 2:ca3d2395b6d3 161 {
mikevd1 2:ca3d2395b6d3 162 allData->RelaisK1 = 0 ;
mikevd1 2:ca3d2395b6d3 163 }
mikevd1 2:ca3d2395b6d3 164 }
mikevd1 2:ca3d2395b6d3 165 else
mikevd1 2:ca3d2395b6d3 166 {
mikevd1 2:ca3d2395b6d3 167 count1 = dataReceived[5] ;
mikevd1 2:ca3d2395b6d3 168 if ( count1 == 1 )
mikevd1 2:ca3d2395b6d3 169 {
mikevd1 2:ca3d2395b6d3 170 allData->RelaisK2 = 1 ;
mikevd1 2:ca3d2395b6d3 171 }
mikevd1 2:ca3d2395b6d3 172 else
mikevd1 2:ca3d2395b6d3 173 {
mikevd1 2:ca3d2395b6d3 174 allData->RelaisK2 = 0 ;
mikevd1 2:ca3d2395b6d3 175 }
mikevd1 2:ca3d2395b6d3 176 }
mikevd1 2:ca3d2395b6d3 177 temperatuur = allData->temperatuur ; //count2 * count1 ;
mikevd1 2:ca3d2395b6d3 178 beweging = allData->beweging ;
mikevd1 2:ca3d2395b6d3 179 }
mikevd1 1:92f9d6cec962 180 else
mikevd1 2:ca3d2395b6d3 181 {
mikevd1 2:ca3d2395b6d3 182 return 0 ;
mikevd1 1:92f9d6cec962 183 }
mikevd1 1:92f9d6cec962 184 uint16_t temp = calculate_crc16_Modbus(dataSend, maxData ) ;
mikevd1 1:92f9d6cec962 185 dataSend[maxData++] = (uint8_t)temp ;
mikevd1 1:92f9d6cec962 186 dataSend[maxData++] = ((uint16_t)temp>>8);
mikevd1 0:d603d31b42dc 187 activateSN65 = 1 ;
mikevd1 0:d603d31b42dc 188 wait_ms(3);
mikevd1 1:92f9d6cec962 189 for(i = 0 ; i < maxData ; i++ )
mikevd1 0:d603d31b42dc 190 {
mikevd1 0:d603d31b42dc 191 bus.putc(dataSend[i]);
mikevd1 0:d603d31b42dc 192 wait_us(750);
mikevd1 0:d603d31b42dc 193 }
mikevd1 2:ca3d2395b6d3 194
mikevd1 0:d603d31b42dc 195 buffer = 0 ;
mikevd1 0:d603d31b42dc 196 wait_ms(2) ;
mikevd1 0:d603d31b42dc 197 activateSN65 = 0 ;
mikevd1 0:d603d31b42dc 198
mikevd1 2:ca3d2395b6d3 199 if ( allData->RelaisK1 == 1 && allData->RelaisK2 == 1 )
mikevd1 2:ca3d2395b6d3 200 {
mikevd1 2:ca3d2395b6d3 201 return 1 ;
mikevd1 2:ca3d2395b6d3 202 }
mikevd1 2:ca3d2395b6d3 203 else if ( allData->RelaisK1 == 0 && allData->RelaisK2 == 1 )
mikevd1 2:ca3d2395b6d3 204 {
mikevd1 2:ca3d2395b6d3 205 return 2 ;
mikevd1 2:ca3d2395b6d3 206 }
mikevd1 2:ca3d2395b6d3 207 else if ( allData->RelaisK1 == 1 && allData->RelaisK2 == 0 )
mikevd1 2:ca3d2395b6d3 208 {
mikevd1 2:ca3d2395b6d3 209 return 3 ;
mikevd1 2:ca3d2395b6d3 210 }
mikevd1 2:ca3d2395b6d3 211 else if ( allData->RelaisK1 == 0 && allData->RelaisK2 == 0 )
mikevd1 2:ca3d2395b6d3 212 {
mikevd1 2:ca3d2395b6d3 213 return 4 ;
mikevd1 2:ca3d2395b6d3 214 }
mikevd1 2:ca3d2395b6d3 215 else
mikevd1 2:ca3d2395b6d3 216 {
mikevd1 2:ca3d2395b6d3 217 return 0 ;
mikevd1 2:ca3d2395b6d3 218 }
mikevd1 2:ca3d2395b6d3 219
mikevd1 0:d603d31b42dc 220 }
mikevd1 0:d603d31b42dc 221
mikevd1 0:d603d31b42dc 222 uint16_t update_crc16_reflected(const uint16_t *table, uint16_t crc, unsigned int c )
mikevd1 0:d603d31b42dc 223 {
mikevd1 0:d603d31b42dc 224 long short_c;
mikevd1 0:d603d31b42dc 225
mikevd1 0:d603d31b42dc 226 short_c = 0x00ff & (long) c;
mikevd1 0:d603d31b42dc 227
mikevd1 0:d603d31b42dc 228 /* Reflected form */
mikevd1 0:d603d31b42dc 229 return (crc >> 8) ^ table[(crc ^ short_c) & 0xff];
mikevd1 0:d603d31b42dc 230 }
mikevd1 0:d603d31b42dc 231
mikevd1 0:d603d31b42dc 232
mikevd1 0:d603d31b42dc 233 uint16_t update_crc16_A001( long crc, unsigned int c )
mikevd1 0:d603d31b42dc 234 {
mikevd1 0:d603d31b42dc 235 return update_crc16_reflected(crc_tab_8005_reflected,crc,c);
mikevd1 0:d603d31b42dc 236 }
mikevd1 0:d603d31b42dc 237
mikevd1 0:d603d31b42dc 238
mikevd1 0:d603d31b42dc 239 long calculate_crc16_Modbus(unsigned int *p, unsigned int length)
mikevd1 0:d603d31b42dc 240 {
mikevd1 0:d603d31b42dc 241 long crc;
mikevd1 0:d603d31b42dc 242 unsigned int i;
mikevd1 0:d603d31b42dc 243
mikevd1 0:d603d31b42dc 244 crc = 0xFFFF;
mikevd1 0:d603d31b42dc 245
mikevd1 0:d603d31b42dc 246 for (i=0; i < length; i++)
mikevd1 0:d603d31b42dc 247 {
mikevd1 0:d603d31b42dc 248 crc = update_crc16_A001(crc,*p++);
mikevd1 0:d603d31b42dc 249 }
mikevd1 0:d603d31b42dc 250 return crc;
mikevd1 0:d603d31b42dc 251 }
mikevd1 0:d603d31b42dc 252
mikevd1 2:ca3d2395b6d3 253 int functionCodeCheckMaxData(int functionCode)
mikevd1 2:ca3d2395b6d3 254 {
mikevd1 2:ca3d2395b6d3 255 // exclude function code in byte count
mikevd1 2:ca3d2395b6d3 256 switch (functionCode)
mikevd1 2:ca3d2395b6d3 257 {
mikevd1 2:ca3d2395b6d3 258 // function code 0x01
mikevd1 2:ca3d2395b6d3 259 case 0x02 :
mikevd1 2:ca3d2395b6d3 260 return 0x04 + 2 ;
mikevd1 2:ca3d2395b6d3 261 //break ;
mikevd1 2:ca3d2395b6d3 262 case 0x04 :
mikevd1 2:ca3d2395b6d3 263 return 0x04 + 2 ;
mikevd1 2:ca3d2395b6d3 264 //break ;
mikevd1 2:ca3d2395b6d3 265 case 0x06 :
mikevd1 2:ca3d2395b6d3 266 return 0x04 + 2 ;
mikevd1 2:ca3d2395b6d3 267 default :
mikevd1 2:ca3d2395b6d3 268 buffer = 0 ;
mikevd1 2:ca3d2395b6d3 269 return 0 ;
mikevd1 2:ca3d2395b6d3 270 }
mikevd1 2:ca3d2395b6d3 271 }
mikevd1 2:ca3d2395b6d3 272 void CRCChecking(void)
mikevd1 2:ca3d2395b6d3 273 {
mikevd1 2:ca3d2395b6d3 274 unsigned long crc = ((dataReceived[buffer - 1] << 8) | dataReceived[buffer - 2]); // combine the crc Low & High bytes
mikevd1 2:ca3d2395b6d3 275 if ( calculate_crc16_Modbus(dataReceived, buffer - 2 ) == crc )
mikevd1 2:ca3d2395b6d3 276 {
mikevd1 2:ca3d2395b6d3 277 buffer++ ;
mikevd1 2:ca3d2395b6d3 278 }
mikevd1 2:ca3d2395b6d3 279 else
mikevd1 2:ca3d2395b6d3 280 {
mikevd1 2:ca3d2395b6d3 281 buffer = 0 ;
mikevd1 2:ca3d2395b6d3 282 }
mikevd1 2:ca3d2395b6d3 283 }