/* * ModbusApp.cpp * * Created on: 01.05.2015 * Author: wn */ #include "SimpleModbusMaster.h" // #include "Mudbus.h" #include "ModbusApp.h" enum { VOLTAGE, FREQUENCY, CURRENT, POWER, ENERGY, TOTAL_NO_OF_PACKETS }; Packet packets[TOTAL_NO_OF_PACKETS]; // Mudbus *modbusSlave; 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; } // void modbusAppBegin(Mudbus *mb) { void modbusAppBegin() { pinMode(ZEROING_PIN, INPUT_PULLUP); // modbusSlave = mb; 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; } // 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]; }