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

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?

UserRevisionLine numberNew 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 }