DreherTankController/src/common.h

159 lines
5.2 KiB
C++

#ifndef _MY_STUFF_H_INCLUDED
#define _MY_STUFF_H_INCLUDED
#include "./DallasTemperature/DallasTemperature.h"
#define _VERSION_MAJOR 0
#define _VERSION_MINOR 0
#define _VERSION_MICRO 1
#define _VERSION_NUMBER _VERSION_MICRO | (_VERSION_MINOR << 6) | (_VERSION_MAJOR << 12)
#define _VERSION_STRING "v0.0.1"
#define _DEBUG 1
#define _DEBUG_SENSORS 0
#define _DEBUG_DISPLAY 0
#define _MODBUS 1
// Das Ermitteln einer Durchschnittstemperatur braucht (zu) viel RAM und ist wahrscheinlich unnötig
#define _MODBUS_AVERAGE_TEMPERATURES 0
#if _DEBUG == 1
#define _print(x) Serial.print(x)
#define _println(x) Serial.println(x)
#if _DEBUG_DISPLAY == 1
struct __printTimeStruct {
__printTimeStruct(const char *text) : _text(text) {
_t0 = millis();
};
~__printTimeStruct() {
_print("Vergangene Millisekunden ["); _print(_text);
_print("]: "); _println(millis() - _t0);
};
private:
u32 _t0;
const char *_text;
};
#define _printtime(text) __printTimeStruct __printt(text)
#else
#define _printtime(text)
#endif // _DEBUG_DISPLAY
#if _DEBUG_SENSORS == 1
#define _prints(x) Serial.print(x)
#define _printsln(x) Serial.println(x)
#else
#define _prints(x)
#define _printsln(x)
#endif
#else
#define _print(x)
#define _println(x)
#define _prints(x)
#define _printsln(x)
#define _printtime()
#endif
#define _REGS_INFRONTOF_EVENTS 6
#define _MODBUS_MAX_EVENTS 234 // Ergibt sich aus 0xF0 - 0x06
#if _MODBUS == 1
#include "modbus/ModbusRTUSlave.h"
extern bool timeStampOverflow;
extern unsigned long timeStamp;
extern u8 &valves;
extern u16 &eventCounter;
extern u16 modbusData[];
#define _setModbusValve(index, val)\
if (bitRead(valves, index) != val) {\
bitWrite(valves, index, val);\
bitWrite(modbusData[1], index+8, val);\
if (eventCounter < _MODBUS_MAX_EVENTS) {\
/* Die ersten 12 Bits beinhalten den relativen Zeitstempel in Zehntelsekunden */\
/* Dieser Stempel ist immer 0xFFF, falls schon zuviel Zeit seit der letzten Referenzierung vergangen ist */\
u16 result = (timeStampOverflow) ? 0xFFF : ((millis() - timeStamp) / 100) & 0xFFF;\
/* Die Bits 12...14 beinhalten die Nr des geschalteten Ausgangs */\
result |= index << 12;\
/* Das MSB gibt an, ob der Ausgang ein- oder ausgeschaltet wurde */\
result |= val << 15;\
modbusData[_REGS_INFRONTOF_EVENTS + eventCounter] = result;\
eventCounter++;\
}\
}
//#define _setModbusValue(index, val) modbusData[index] = val
#else
#define _setModbusValve(index, val)
//#define _setModbusValue(index, val)
#endif // _MODBUS ==
#define _MODBUS_ADDR_MIN 1
#define _MODBUS_ADDR_MAX 247 // Laut QModMaster letzte Adresse
#define _MODBUS_DELAY_MIN 0 // 1/10 Millisekunden
#define _MODBUS_DELAY_MAX 250 // 1/10 Millisekunden
#define _MODBUS_INVALID_BAUDRATE 4294967295
#define _MODBUS_VALVE_T1_INDEX 0
#define _MODBUS_VALVE_T2_INDEX 1
#define _MODBUS_VALVE_PR_INDEX 2
#define _MODBUS_VALVE_PF_INDEX 3
#define _MODBUS_T1_INDEX 2
#define _MODBUS_T2_INDEX 3
#define _MODBUS_P_INDEX 4
#define _SENSOR_FAULT 0xFFFF
#define _STD_TEMP_SETPOINT 400 // Hundertstel
#define _STD_TEMP_HYSTERESIS 10 // Hundertstel
#define _STD_P_SETPOINT 100 // Hundertstel
#define _STD_P_HYSTERESIS 5 // Hundertstel
#define _STD_P_EN_INC 1
#define _STD_P_EN_DEC 1
#define _STD_T_EN 1
#define _STD_C_EN 0
#define _MIN_TEMP_SETPOINT 10 // Hundertstel
#define _MAX_TEMP_SETPOINT 3000 // Hundertstel
#define _MIN_TEMP_HYSTERESIS 1 // Hundertstel
#define _MAX_TEMP_HYSTERESIS 100 // Hundertstel
#define _MIN_P_SETPOINT 0 // Hundertstel
#define _MAX_P_SETPOINT 300 // Hundertstel
#define _MIN_P_HYSTERESIS 1 // Hundertstel
#define _MAX_P_HYSTERESIS 50 // Hundertstel
#define _P_SENSOR_1_5V_0_5BAR 1
#define _P_SENSOR_0_5V_0_6BAR 2
enum PSensor : uint8_t {
SMC_1_5V_0_5BAR=1, // Sensor mit Kabel
GEMS_0_5V_0_6BAR // Sensor mit Würfelstecker
};
struct parameters { // Prozesswerte
int16_t ts1 = _SENSOR_FAULT; // Soll-Temperatur 1 in 1/100 °C
int16_t th1 = _SENSOR_FAULT; // Hysterese für Temperatur 1 (1/100)
int16_t ts2 = _SENSOR_FAULT; // Soll-Temperatur 2 in 1/100 °C
int16_t th2 = _SENSOR_FAULT; // Hysterese für Temperatur 2 (1/100)
int16_t ps = _SENSOR_FAULT; // Druck in bar
int16_t ph = _SENSOR_FAULT; // Hysterese für Druck
uint8_t tEn = 255; // Kühlung (de)aktiviert
uint8_t pInc = 255; // Drucksteigerung (de)aktiviert
uint8_t pDec = 255; // Druckabfall (de)aktiviert
uint8_t cEn = 255; // Controller (de)aktiviert
};
struct values { // aktuelle Messwerte
int16_t t1 = _SENSOR_FAULT; // Temperatur in 1/100 °C
int16_t p = _SENSOR_FAULT; // Druck in 1/100 bar
};
struct modbusParameters { // Parameter für Modbus
uint32_t baudrate = _MODBUS_INVALID_BAUDRATE; // Modbus-Baudrate
uint8_t address = 255; // Modbus-Adresse
uint8_t delay = 255; // delay in 1/10 ms vor der Antwort
};
struct valveStates {
bool t1;
bool t2;
bool pInc;
bool pDec;
};
#endif // _MY_STUFF_H_INCLUDED