Software modbus, display, knoppen, bewegingssensor en mbed OS

Dependents:   testSoftware8_alles_display

Committer:
mikevd1
Date:
Fri Sep 14 13:58:59 2018 +0000
Revision:
3:4fff62544119
Parent:
2:ca3d2395b6d3
Child:
4:80135cfbaeb7
Toevoeging modbus adress kan veranderd worden en modbus kan uitgeschakeld worden;

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