2015-05-02 00:14:40 +02:00
|
|
|
/*
|
|
|
|
* ModbusApp.cpp
|
|
|
|
*
|
|
|
|
* Created on: 01.05.2015
|
|
|
|
* Author: wn
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "SimpleModbusMaster.h"
|
2015-05-03 20:53:49 +02:00
|
|
|
// #include "Mudbus.h"
|
2015-05-02 00:14:40 +02:00
|
|
|
|
|
|
|
#include "ModbusApp.h"
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
VOLTAGE,
|
|
|
|
FREQUENCY,
|
|
|
|
CURRENT,
|
|
|
|
POWER,
|
|
|
|
ENERGY,
|
|
|
|
TOTAL_NO_OF_PACKETS
|
|
|
|
};
|
|
|
|
|
|
|
|
Packet packets[TOTAL_NO_OF_PACKETS];
|
|
|
|
|
2015-05-03 20:53:49 +02:00
|
|
|
|
|
|
|
// Mudbus *modbusSlave;
|
2015-05-02 00:14:40 +02:00
|
|
|
|
|
|
|
uint16_t voltage[2];
|
|
|
|
uint16_t frequency[2];
|
|
|
|
uint16_t current[2];
|
|
|
|
uint16_t power[2];
|
|
|
|
uint16_t energy[2];
|
|
|
|
|
|
|
|
float startEnergy = 0;
|
|
|
|
|
|
|
|
float convF(uint16_t in[2]) {
|
|
|
|
union {
|
|
|
|
struct {
|
|
|
|
uint16_t a;
|
|
|
|
uint16_t b;
|
|
|
|
} s;
|
|
|
|
float f;
|
|
|
|
} U;
|
|
|
|
U.s.a = in[1];
|
|
|
|
U.s.b = in[0];
|
|
|
|
return U.f;
|
|
|
|
}
|
|
|
|
|
|
|
|
float getVoltage() { return convF(voltage); }
|
|
|
|
float getCurrent() { return convF(current); }
|
|
|
|
float getFrequency() { return convF(frequency); }
|
|
|
|
float getPower() { return convF(power); }
|
|
|
|
float getEnergy() { return convF(energy); }
|
|
|
|
float getNewEnergy() { return convF(energy) - startEnergy; }
|
|
|
|
|
|
|
|
|
2015-05-03 20:53:49 +02:00
|
|
|
// void modbusAppBegin(Mudbus *mb) {
|
|
|
|
void modbusAppBegin() {
|
2015-05-02 00:14:40 +02:00
|
|
|
pinMode(ZEROING_PIN, INPUT_PULLUP);
|
2015-05-03 20:53:49 +02:00
|
|
|
// modbusSlave = mb;
|
2015-05-02 00:14:40 +02:00
|
|
|
|
|
|
|
|
|
|
|
modbus_construct(&packets[VOLTAGE], 1, READ_HOLDING_REGISTERS, 0x2000, 2, voltage);
|
|
|
|
modbus_construct(&packets[FREQUENCY], 1, READ_HOLDING_REGISTERS, 0x2020, 2, frequency);
|
|
|
|
modbus_construct(&packets[CURRENT], 1, READ_HOLDING_REGISTERS, 0x2060, 2, current);
|
|
|
|
modbus_construct(&packets[POWER], 1, READ_HOLDING_REGISTERS, 0x2080, 2, power);
|
|
|
|
modbus_construct(&packets[ENERGY], 1, READ_HOLDING_REGISTERS, 0x3000, 2, energy);
|
|
|
|
|
|
|
|
|
|
|
|
modbus_configure(&Serial2, MODBUS_BAUD, SERIAL_8N2, MODBUS_TIMEOUT,
|
|
|
|
MODBUS_SCANRATE, MODBUS_RETRY_COUNT, MODBUS_TX_ENABLE_PIN, packets, TOTAL_NO_OF_PACKETS);
|
|
|
|
}
|
|
|
|
|
|
|
|
void modbusAppExec() {
|
|
|
|
modbus_update();
|
|
|
|
|
|
|
|
float nEnergy = getEnergy();
|
|
|
|
if (((0 == startEnergy) && (0 != nEnergy)) || (digitalRead(ZEROING_PIN) == 0)) {
|
|
|
|
startEnergy = nEnergy;
|
|
|
|
}
|
|
|
|
|
2015-05-03 20:53:49 +02:00
|
|
|
|
|
|
|
// modbusSlave->R[0] = voltage[0];
|
|
|
|
// modbusSlave->R[1] = voltage[1];
|
|
|
|
// modbusSlave->R[2] = current[0];
|
|
|
|
// modbusSlave->R[3] = current[1];
|
|
|
|
// modbusSlave->R[4] = frequency[0];
|
|
|
|
// modbusSlave->R[5] = frequency[1];
|
|
|
|
// modbusSlave->R[6] = power[0];
|
|
|
|
// modbusSlave->R[7] = power[1];
|
|
|
|
// modbusSlave->R[8] = energy[0];
|
|
|
|
// modbusSlave->R[9] = energy[1];
|
2015-05-02 00:14:40 +02:00
|
|
|
}
|
|
|
|
|