A modified Arduino library to let mbed boards to behave as modbus slave. See readme. Tested on Nucleo F401RE.
Dependencies: mbed mbed-rtos ModbusSlave232 MODSERIAL max6675 millis
main.cpp@5:cc12e1f4daf1, 2021-09-02 (annotated)
- Committer:
- ascheeren
- Date:
- Thu Sep 02 14:46:39 2021 +0000
- Revision:
- 5:cc12e1f4daf1
- Parent:
- 4:80f3ac4b1c8b
panela modbus
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AfdhalAtiffTan | 4:80f3ac4b1c8b | 1 | #include "mbed.h" |
AfdhalAtiffTan | 4:80f3ac4b1c8b | 2 | #include "rtos.h" |
AfdhalAtiffTan | 4:80f3ac4b1c8b | 3 | #include "ModbusSlave232.h" //see readme |
AfdhalAtiffTan | 4:80f3ac4b1c8b | 4 | #include "millis.h" //see readme |
ascheeren | 5:cc12e1f4daf1 | 5 | #include "ios.h" |
ascheeren | 5:cc12e1f4daf1 | 6 | #include "max6675.h" |
AfdhalAtiffTan | 4:80f3ac4b1c8b | 7 | ModbusSlave232 mbs; // Create new mbs instance |
AfdhalAtiffTan | 0:74eb078d4846 | 8 | |
ascheeren | 5:cc12e1f4daf1 | 9 | SPI spi(PB_5, PB_4, PB_3); // MOSI, MISO, SCLK |
ascheeren | 5:cc12e1f4daf1 | 10 | max6675 max(spi,PB_10); |
ascheeren | 5:cc12e1f4daf1 | 11 | |
ascheeren | 5:cc12e1f4daf1 | 12 | |
ascheeren | 5:cc12e1f4daf1 | 13 | |
ascheeren | 5:cc12e1f4daf1 | 14 | Ticker seg,media ; |
AfdhalAtiffTan | 0:74eb078d4846 | 15 | |
ascheeren | 5:cc12e1f4daf1 | 16 | // Slave registersr |
ascheeren | 5:cc12e1f4daf1 | 17 | enum { |
ascheeren | 5:cc12e1f4daf1 | 18 | MB_0, // temperatura |
ascheeren | 5:cc12e1f4daf1 | 19 | MB_1, // tempo restante |
ascheeren | 5:cc12e1f4daf1 | 20 | MB_2, // setpoin temperatura |
ascheeren | 5:cc12e1f4daf1 | 21 | MB_3, // aquecimento bit5 manual/auto bit 4 liga/deli(manual) bit0estado |
ascheeren | 5:cc12e1f4daf1 | 22 | MB_4, // set temp1 |
ascheeren | 5:cc12e1f4daf1 | 23 | MB_5, // set temp2 |
ascheeren | 5:cc12e1f4daf1 | 24 | MB_6, // set temp3 |
ascheeren | 5:cc12e1f4daf1 | 25 | MB_7, // set temp4 |
ascheeren | 5:cc12e1f4daf1 | 26 | MB_8, // set temp5 fervura |
ascheeren | 5:cc12e1f4daf1 | 27 | MB_9, // set tempo 1 |
ascheeren | 5:cc12e1f4daf1 | 28 | MB_10, // set tempo 2 |
ascheeren | 5:cc12e1f4daf1 | 29 | MB_11, // set tempo 3 |
ascheeren | 5:cc12e1f4daf1 | 30 | MB_12, // set tempo 4 |
ascheeren | 5:cc12e1f4daf1 | 31 | MB_13, // set tempo 5 fervura |
ascheeren | 5:cc12e1f4daf1 | 32 | MB_14, //pwm |
ascheeren | 5:cc12e1f4daf1 | 33 | MB_15, // |
ascheeren | 5:cc12e1f4daf1 | 34 | MB_16, // bomba |
ascheeren | 5:cc12e1f4daf1 | 35 | MB_17, // |
ascheeren | 5:cc12e1f4daf1 | 36 | MB_18, //adiantar |
ascheeren | 5:cc12e1f4daf1 | 37 | MB_19, //ok |
ascheeren | 5:cc12e1f4daf1 | 38 | MB_20, |
ascheeren | 5:cc12e1f4daf1 | 39 | MB_21, |
ascheeren | 5:cc12e1f4daf1 | 40 | MB_REGS // Dummy register. using 0 offset to keep size of array |
ascheeren | 5:cc12e1f4daf1 | 41 | }; |
ascheeren | 5:cc12e1f4daf1 | 42 | //Prototipos |
ascheeren | 5:cc12e1f4daf1 | 43 | void cozimento(void); |
ascheeren | 5:cc12e1f4daf1 | 44 | void PID(); |
ascheeren | 5:cc12e1f4daf1 | 45 | void segs(); |
ascheeren | 5:cc12e1f4daf1 | 46 | void passagem_zero(); |
ascheeren | 5:cc12e1f4daf1 | 47 | void atualiza(void); |
ascheeren | 5:cc12e1f4daf1 | 48 | void leitura(void); |
ascheeren | 5:cc12e1f4daf1 | 49 | void media_temp(); |
ascheeren | 5:cc12e1f4daf1 | 50 | // variaveis Globais |
AfdhalAtiffTan | 4:80f3ac4b1c8b | 51 | |
ascheeren | 5:cc12e1f4daf1 | 52 | |
ascheeren | 5:cc12e1f4daf1 | 53 | float Kp=5.5, Ki=0.5, Kd=0.1, propo, integ, deriv,medida, setpoint[6], valor_medido, erro, erro_ant, pwm,temperatura, setpointAtual, periodo; |
ascheeren | 5:cc12e1f4daf1 | 54 | int regs[MB_REGS], etapa, minetapa[6], bomba, tempoEtapa, cont1, cont2, cont3, aquecimento; |
ascheeren | 5:cc12e1f4daf1 | 55 | |
ascheeren | 5:cc12e1f4daf1 | 56 | |
AfdhalAtiffTan | 0:74eb078d4846 | 57 | |
AfdhalAtiffTan | 0:74eb078d4846 | 58 | int main() |
AfdhalAtiffTan | 0:74eb078d4846 | 59 | { |
AfdhalAtiffTan | 4:80f3ac4b1c8b | 60 | const unsigned char SLAVE = 1; |
ascheeren | 5:cc12e1f4daf1 | 61 | const long BAUD = 9600; |
AfdhalAtiffTan | 4:80f3ac4b1c8b | 62 | const unsigned PARITY = 'n'; |
ascheeren | 5:cc12e1f4daf1 | 63 | seg.attach(&segs, 1.0); |
ascheeren | 5:cc12e1f4daf1 | 64 | media.attach(&media_temp, 0.05); |
ascheeren | 5:cc12e1f4daf1 | 65 | etapa=0;; |
ascheeren | 5:cc12e1f4daf1 | 66 | res.period(5.f); |
ascheeren | 5:cc12e1f4daf1 | 67 | |
AfdhalAtiffTan | 0:74eb078d4846 | 68 | startMillis(); // milliseconds (arduino like) |
AfdhalAtiffTan | 0:74eb078d4846 | 69 | |
AfdhalAtiffTan | 4:80f3ac4b1c8b | 70 | mbs.configure(SLAVE, BAUD, PARITY); |
AfdhalAtiffTan | 0:74eb078d4846 | 71 | |
ascheeren | 5:cc12e1f4daf1 | 72 | |
ascheeren | 5:cc12e1f4daf1 | 73 | |
ascheeren | 5:cc12e1f4daf1 | 74 | //test values (updatable) |
ascheeren | 5:cc12e1f4daf1 | 75 | |
ascheeren | 5:cc12e1f4daf1 | 76 | |
ascheeren | 5:cc12e1f4daf1 | 77 | while (true) { //main thread |
ascheeren | 5:cc12e1f4daf1 | 78 | if(aquecimento){ //se aquecimento estiver ligado periodo do duty cycle sera 1 div pwm |
ascheeren | 5:cc12e1f4daf1 | 79 | periodo=1.0f/pwm; |
ascheeren | 5:cc12e1f4daf1 | 80 | res.write(periodo); |
ascheeren | 5:cc12e1f4daf1 | 81 | } |
ascheeren | 5:cc12e1f4daf1 | 82 | |
ascheeren | 5:cc12e1f4daf1 | 83 | if(!aquecimento)res.write(0.0f); // se aquecimento estiver deligado duty sera 0 |
ascheeren | 5:cc12e1f4daf1 | 84 | |
ascheeren | 5:cc12e1f4daf1 | 85 | |
ascheeren | 5:cc12e1f4daf1 | 86 | |
ascheeren | 5:cc12e1f4daf1 | 87 | atualiza(); // atualiza holdregistres |
ascheeren | 5:cc12e1f4daf1 | 88 | |
ascheeren | 5:cc12e1f4daf1 | 89 | bombaOUT=bomba; |
ascheeren | 5:cc12e1f4daf1 | 90 | |
ascheeren | 5:cc12e1f4daf1 | 91 | |
ascheeren | 5:cc12e1f4daf1 | 92 | |
ascheeren | 5:cc12e1f4daf1 | 93 | |
ascheeren | 5:cc12e1f4daf1 | 94 | |
ascheeren | 5:cc12e1f4daf1 | 95 | switch(etapa){ |
ascheeren | 5:cc12e1f4daf1 | 96 | case 1: |
ascheeren | 5:cc12e1f4daf1 | 97 | {tempoEtapa=minetapa[0]; |
ascheeren | 5:cc12e1f4daf1 | 98 | setpointAtual=setpoint[0]; |
ascheeren | 5:cc12e1f4daf1 | 99 | } break; |
ascheeren | 5:cc12e1f4daf1 | 100 | |
ascheeren | 5:cc12e1f4daf1 | 101 | case 2: |
ascheeren | 5:cc12e1f4daf1 | 102 | {tempoEtapa=minetapa[1]; |
ascheeren | 5:cc12e1f4daf1 | 103 | setpointAtual=setpoint[1]; |
ascheeren | 5:cc12e1f4daf1 | 104 | } break; |
ascheeren | 5:cc12e1f4daf1 | 105 | |
ascheeren | 5:cc12e1f4daf1 | 106 | |
ascheeren | 5:cc12e1f4daf1 | 107 | case 3: |
ascheeren | 5:cc12e1f4daf1 | 108 | {tempoEtapa=minetapa[2]; |
ascheeren | 5:cc12e1f4daf1 | 109 | setpointAtual=setpoint[2]; |
ascheeren | 5:cc12e1f4daf1 | 110 | } break; |
ascheeren | 5:cc12e1f4daf1 | 111 | |
ascheeren | 5:cc12e1f4daf1 | 112 | |
ascheeren | 5:cc12e1f4daf1 | 113 | |
ascheeren | 5:cc12e1f4daf1 | 114 | |
ascheeren | 5:cc12e1f4daf1 | 115 | } |
ascheeren | 5:cc12e1f4daf1 | 116 | |
ascheeren | 5:cc12e1f4daf1 | 117 | |
AfdhalAtiffTan | 4:80f3ac4b1c8b | 118 | mbs.update(regs, MB_REGS); // Pass current register values to mbs |
ascheeren | 5:cc12e1f4daf1 | 119 | |
ascheeren | 5:cc12e1f4daf1 | 120 | |
ascheeren | 5:cc12e1f4daf1 | 121 | |
ascheeren | 5:cc12e1f4daf1 | 122 | |
ascheeren | 5:cc12e1f4daf1 | 123 | |
ascheeren | 5:cc12e1f4daf1 | 124 | |
AfdhalAtiffTan | 0:74eb078d4846 | 125 | } |
ascheeren | 5:cc12e1f4daf1 | 126 | |
ascheeren | 5:cc12e1f4daf1 | 127 | } |
ascheeren | 5:cc12e1f4daf1 | 128 | void atualiza() |
ascheeren | 5:cc12e1f4daf1 | 129 | { |
ascheeren | 5:cc12e1f4daf1 | 130 | |
ascheeren | 5:cc12e1f4daf1 | 131 | |
ascheeren | 5:cc12e1f4daf1 | 132 | } |
ascheeren | 5:cc12e1f4daf1 | 133 | void leitura() |
ascheeren | 5:cc12e1f4daf1 | 134 | { |
ascheeren | 5:cc12e1f4daf1 | 135 | int conta; |
ascheeren | 5:cc12e1f4daf1 | 136 | float cache; |
ascheeren | 5:cc12e1f4daf1 | 137 | cache+=max.read_temp(); |
ascheeren | 5:cc12e1f4daf1 | 138 | conta++; |
ascheeren | 5:cc12e1f4daf1 | 139 | if(conta>19){ |
ascheeren | 5:cc12e1f4daf1 | 140 | valor_medido=cache/conta; |
ascheeren | 5:cc12e1f4daf1 | 141 | cache=0; |
ascheeren | 5:cc12e1f4daf1 | 142 | conta=0;} |
ascheeren | 5:cc12e1f4daf1 | 143 | |
ascheeren | 5:cc12e1f4daf1 | 144 | |
ascheeren | 5:cc12e1f4daf1 | 145 | |
ascheeren | 5:cc12e1f4daf1 | 146 | } |
ascheeren | 5:cc12e1f4daf1 | 147 | void PID() |
ascheeren | 5:cc12e1f4daf1 | 148 | { |
ascheeren | 5:cc12e1f4daf1 | 149 | erro= setpointAtual - valor_medido; |
ascheeren | 5:cc12e1f4daf1 | 150 | propo=erro*Kp; |
ascheeren | 5:cc12e1f4daf1 | 151 | integ+=(erro*Ki); |
ascheeren | 5:cc12e1f4daf1 | 152 | deriv=(erro-erro_ant)*Kd; |
ascheeren | 5:cc12e1f4daf1 | 153 | erro_ant=erro; |
ascheeren | 5:cc12e1f4daf1 | 154 | pwm=propo+integ+deriv; |
ascheeren | 5:cc12e1f4daf1 | 155 | if(pwm>=100)pwm=100; |
ascheeren | 5:cc12e1f4daf1 | 156 | else if(pwm<=0)pwm=0; |
ascheeren | 5:cc12e1f4daf1 | 157 | |
ascheeren | 5:cc12e1f4daf1 | 158 | } |
ascheeren | 5:cc12e1f4daf1 | 159 | |
ascheeren | 5:cc12e1f4daf1 | 160 | |
ascheeren | 5:cc12e1f4daf1 | 161 | |
ascheeren | 5:cc12e1f4daf1 | 162 | |
ascheeren | 5:cc12e1f4daf1 | 163 | |
ascheeren | 5:cc12e1f4daf1 | 164 | |
ascheeren | 5:cc12e1f4daf1 | 165 | |
ascheeren | 5:cc12e1f4daf1 | 166 | |
ascheeren | 5:cc12e1f4daf1 | 167 | |
ascheeren | 5:cc12e1f4daf1 | 168 | |
ascheeren | 5:cc12e1f4daf1 | 169 | void segs (void) |
ascheeren | 5:cc12e1f4daf1 | 170 | { |
ascheeren | 5:cc12e1f4daf1 | 171 | |
ascheeren | 5:cc12e1f4daf1 | 172 | cont1++; |
ascheeren | 5:cc12e1f4daf1 | 173 | cont2++; |
ascheeren | 5:cc12e1f4daf1 | 174 | cont3++; |
ascheeren | 5:cc12e1f4daf1 | 175 | |
ascheeren | 5:cc12e1f4daf1 | 176 | } |
ascheeren | 5:cc12e1f4daf1 | 177 | |
ascheeren | 5:cc12e1f4daf1 | 178 | |
ascheeren | 5:cc12e1f4daf1 | 179 | |
ascheeren | 5:cc12e1f4daf1 | 180 | |
ascheeren | 5:cc12e1f4daf1 | 181 | |
ascheeren | 5:cc12e1f4daf1 | 182 | void media_temp(void) |
ascheeren | 5:cc12e1f4daf1 | 183 | { |
ascheeren | 5:cc12e1f4daf1 | 184 | int contador; |
ascheeren | 5:cc12e1f4daf1 | 185 | float cache; |
ascheeren | 5:cc12e1f4daf1 | 186 | |
ascheeren | 5:cc12e1f4daf1 | 187 | cache+=max.read_temp(); |
ascheeren | 5:cc12e1f4daf1 | 188 | contador++; |
ascheeren | 5:cc12e1f4daf1 | 189 | if(contador>=20) { |
ascheeren | 5:cc12e1f4daf1 | 190 | temperatura =cache/contador; |
ascheeren | 5:cc12e1f4daf1 | 191 | contador=0; |
ascheeren | 5:cc12e1f4daf1 | 192 | cache=0; |
ascheeren | 5:cc12e1f4daf1 | 193 | } |
ascheeren | 5:cc12e1f4daf1 | 194 | } |