This demonstrates the process of communicating through ethernet to a SEL-2431 Voltage Regulator Control Panel using SEL Fast Message. Basic device commands and data cna be requested and displayed over a connected serial port. This is a basic version and full testing and documentation has yet to be completed.

Dependencies:   BufferedSerial analogAverager voltageRegulator netStatReg analogMinMax CounterMinMax

Files at this revision

API Documentation at this revision

Comitter:
masterkookus
Date:
Mon Nov 25 15:20:50 2019 +0000
Parent:
16:018bed9abe89
Child:
18:69846c990e04
Commit message:
Updates to allow control of enables outside of defines

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mydevices.h Show annotated file Show diff for this revision Revisions of this file
netStatReg.lib Show annotated file Show diff for this revision Revisions of this file
selMsg.cpp Show diff for this revision Revisions of this file
selMsg.h Show annotated file Show diff for this revision Revisions of this file
voltageRegulator.lib Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Mon Oct 14 13:36:11 2019 +0000
+++ b/main.cpp	Mon Nov 25 15:20:50 2019 +0000
@@ -2,7 +2,7 @@
     #error [NOT_SUPPORTED] LWIP not supported for this target
 #endif
 
-#define netmsgdebug
+//#define netmsgdebug
 
 #include "mbed.h"
 #include "EthernetInterface.h"
@@ -20,6 +20,7 @@
 #include "analogMinMax.h"
 #include "counterMinMax.h"
 #include "netStatusReg.h"
+#include "voltageRegulator.h"
 
 Ticker nettimer;
 Timer netDevTimers[7];
@@ -35,11 +36,11 @@
 BufferedSerial sport0(sport0tx, sport0rx, sport0buff, sport0mult);    // UART2
 
 CircularBuffer<char, 256> receiveBuffer;
+CircularBuffer<char, 256> unSolReceiveBuffer;
 CircularBuffer<char, 64> sendLength;
 CircularBuffer<char, 256> sendBuffer;
 
-Thread conchkthread[2];
-Thread rxtxdatathread[5];
+Thread rxtxdatathread[4];
 
 unsigned int currenttime=0;
 
@@ -56,45 +57,57 @@
         netDevTimers[0].reset();
         setSendTick(true);
     }
-    //Server Unsolicited Message Timeout
-    if (netStat.bit_isset(srvIsActive))
+    if (netStat.bit_isset(pollEnabled))
     {
-        if (netDevTimers[1].read_ms()>=setservertimeout)
+        if (netStat.bit_isset(devOnline))
         {
-            //netDevTimers[1].reset();
-            netDevTimers[1].stop();
-            netStat.bit_toset(srvCloseConnection);
-        }
-    }
-    if (netStat.bit_isset(devOnline))
-    {
-        #ifdef fastDemandEnabled
-        //Fast Demand Poll Tick
-        if (netStat.bit_isset(fmdEnabled))
-        {
-            if (netDevTimers[2].read_ms()>=setfmdemandpollinterval)
+            //Fast Demand Poll Tick
+            if (netStat.bit_isset(fmdEnabled))
             {
-                netDevTimers[2].reset();
-                netStat.bit_toset(fmdPollReq);
-            }
-        }
-        else
-        {
-            if (netDevTimers[2].read_ms()>=8000)
-            {
-                netDevTimers[2].reset();
-                netStat.bit_toset(fmdPollReq);
+                if (netStat.bit_isset(fmdOnline))
+                {
+                    if (netDevTimers[2].read_ms()>=setfmdemandpollinterval)
+                    {
+                        netDevTimers[2].reset();
+                        netStat.bit_toset(fmdPollReq);
+                    }
+                }
+                else
+                {
+                    if (netDevTimers[2].read_ms()>=8000)
+                    {
+                        netDevTimers[2].reset();
+                        netStat.bit_toset(fmdPollReq);
+                    }
+                }
             }
-        }
-        #endif
-        #ifdef fastMeterEnabled
-        //Fast Meter Poll Tick
-        if (netStat.bit_isset(fmEnabled))
-        {
-            if (netDevTimers[3].read_ms()>=setfmpollinterval)
+            //Fast Meter Poll Tick
+            if (netStat.bit_isset(fmEnabled))
             {
-                netDevTimers[3].reset();
-                netStat.bit_toset(fmPollReq);
+                if (netStat.bit_isset(fmOnline))
+                {
+                    if (netDevTimers[3].read_ms()>=setfmpollinterval)
+                    {
+                        netDevTimers[3].reset();
+                        netStat.bit_toset(fmPollReq);
+                    }
+                }
+                else
+                {
+                    if (netDevTimers[3].read_ms()>=8000)
+                    {
+                        netDevTimers[3].reset();
+                        netStat.bit_toset(fmPollReq);
+                    }
+                }
+            }
+            if (netStat.bit_isset(recEnabled))
+            {
+                if (netDevTimers[6].read_ms()>=setDataRecInterval)
+                {
+                    netStat.bit_toset(recDataFile);
+                    netDevTimers[6].stop();
+                }
             }
         }
         else
@@ -102,25 +115,15 @@
             if (netDevTimers[3].read_ms()>=8000)
             {
                 netDevTimers[3].reset();
-                netStat.bit_toset(fmPollReq);
+                netStat.bit_toset(fmCfgReq);
             }
         }
-        #endif
-    }
-    else
-    {
-        if (netDevTimers[3].read_ms()>=8000)
-        {
-            netDevTimers[3].reset();
-            netStat.bit_toset(fmCfgReq);
-        }
     }
     //Fast Message Timeout
     if ((netStat.bit_isset(fmCfgInProg)) || (netStat.bit_isset(fmPollInProg)) || (netStat.bit_isset(fmdPollInProg)))
     {
         if (netDevTimers[4].read_ms()>=2000)
         {
-            //netDevTimers[4].reset();
             netDevTimers[4].stop();
             netStat.bit_toset(fmCloseConnection);
             netStat.bit_toset(fmTimeout);
@@ -131,18 +134,12 @@
     {
         if (netDevTimers[5].read_ms()>=net1.serMsgTimeout)
         {
-            //netDevTimers[5].reset();
             netDevTimers[5].stop();
             netStat.bit_toset(serCloseConnection);
             netStat.bit_toset(serTimeout);
         }
     }
-    if (netDevTimers[6].read_ms()>=setDataRecInterval)
-    {
-        netStat.bit_toset(recDataFile);
-        //netDevTimers[6].reset();
-        netDevTimers[6].stop();
-    }
+    
 }
 
 void sendCmd(char cmdNum)
@@ -173,25 +170,28 @@
     netStat.bit_toset(pollEnabled);
     #endif
     
+    #ifdef fastMeterEnabled
+    netStat.bit_toset(fmEnabled);
+    #endif
+    
+    #ifdef fastDemandEnabled
+    netStat.bit_toset(fmdEnabled);
+    #endif
+    
+    #ifdef recordDataEnabled
+    netStat.bit_toset(recEnabled);
+    #endif
+    
     net1.cltPort=setclientport;
     net1.srv_addr=setclientaddress;
     net1.srv_sock.set_blocking(false);
     net1.srv_sock.set_timeout(100);
-    net1.srv.set_blocking(false);
-    net1.srv.set_timeout(100);
     net1.sendRetryCount=0;
     net1.messageFailCount=0;
     net1.serMsgTimeout=2000;
     
     /* Open the server on ethernet stack */
     net1.srv.open(eth);
-    
-    /* Bind port 23 to the server */
-    net1.srvPort=setserverport;
-    net1.srv.bind(net1.srvPort);
-    
-    /* Can handle 5 simultaneous connections */
-    net1.srv.listen(5);
     sport0.baud(sport0baud);
 }
 
@@ -325,7 +325,7 @@
                         sport0.write(cbuf,clen);
                         if (myDevice.chkMeterMsg(cbuf,clen))
                         {
-                            netStat.bit_toset(fmEnabled);
+                            netStat.bit_toset(fmOnline);
                             clen=0;
                             netStat.iedOnline(true);
                             break;
@@ -347,9 +347,9 @@
                     if ((cbuf[cbc]==0xA5) && (cbuf[cbc+1]==0xC2))
                     {
                         sport0.write(cbuf,clen);
-                        if (myDevice.chkMeterMsg(cbuf,clen))
+                        if (myDevice.chkDemMeterMsg(cbuf,clen))
                         {
-                            netStat.bit_toset(fmdEnabled);
+                            netStat.bit_toset(fmdOnline);
                             clen=0;
                             netStat.iedOnline(true);
                             break;
@@ -482,36 +482,6 @@
     }
 }
 
-//Ethernet receive data and send to aux devices (serial, etc...)
-void datansrx(netsys *net2)
-{
-    char rxbuf[256];
-    int rxlen=0;
-    int rxc;
-    while (1)
-    {
-        //If the server is active check to see if data has been received
-        while (netStat.bit_isset(srvIsActive))
-        {
-            //Store the length of the received data
-            rxlen=net2->clt_sock.recv(rxbuf, sizeof(rxbuf));
-            //if there is data then push data into received buffer
-            if (rxlen>0)
-            {
-                for (rxc = 0;rxc<rxlen;rxc++)
-                {
-                    receiveBuffer.push(rxbuf[rxc]);
-                }
-                #ifdef netmsgdebug
-                printf("Server Received Data\r\n");
-                #endif
-                //Increment received message counter
-                netStat.incCount(2);
-            }
-        }
-    }
-}
-
 //Serial device to server
 void datasrx(netsys *net2)
 {
@@ -575,7 +545,7 @@
                         netStat.bit_toset(serPollReq);
                         rxindex=0;
                     }
-                    //Search for the Tap Report Command
+                    //Search for the Status Command
                     if (cmdpack.cmdint==0x53544154)
                     {
                         #ifdef netmsgdebug
@@ -589,6 +559,25 @@
                         sport0.printf("Messages Failed: %d\r\n\r\n",netStat.getCount(5));
                         rxindex=0;
                     }
+                    //Search for the Target Command
+                    if (cmdpack.cmdint==0x54415247)
+                    {
+                        char *dTargets;
+                        #ifdef netmsgdebug
+                        printf("Targets\r\n");
+                        #endif
+                        sport0.printf("\r\nTarget 0 %08x\r\n",dTargets[0]);
+                        sport0.printf("\r\nTarget 1 %08x\r\n",dTargets[1]);
+                        sport0.printf("\r\nTarget 2 %08x\r\n",dTargets[2]);
+                        sport0.printf("\r\nTarget 3 %08x\r\n",dTargets[3]);
+                        sport0.printf("\r\nTarget 4 %08x\r\n",dTargets[4]);
+                        sport0.printf("\r\nTarget 5 %08x\r\n",dTargets[5]);
+                        sport0.printf("\r\nTarget 6 %08x\r\n",dTargets[6]);
+                        sport0.printf("\r\nTarget 7 %08x\r\n",dTargets[7]);
+                        sport0.printf("\r\nTarget 8 %08x\r\n",dTargets[8]);
+                        sport0.printf("\r\nTarget 9 %08x\r\n",dTargets[9]);
+                        rxindex=0;
+                    }
                 }
                 //If no command found set cursor location to zero
                 if (rxindex>0)
@@ -603,30 +592,6 @@
     }
 }
 
-//Checks for a Ethernet to Serial connection
-void conchk(netsys *net2)
-{
-    TCPServer *server=&(net2->srv);
-    TCPSocket *client_socket=&(net2->clt_sock);
-    SocketAddress *client_address=&(net2->clt_addr);
-    
-    while(1)
-    {
-        //Wait for someone to connect
-        while (server->accept(client_socket, client_address) < 0)
-        {
-            //printf("Connection Failed.\r\n");
-        }
-        #ifdef netmsgdebug
-        printf("Server Port %d\r\n", net2->srvPort);
-        printf("accept %s:%d\r\n", client_address->get_ip_address(), client_address->get_port());
-        #endif
-        netStat.bit_toset(srvIsActive);
-        netDevTimers[1].reset();
-        netDevTimers[1].start();
-    }
-}
-
 int main()
 {
     EthernetInterface eth;
@@ -639,17 +604,14 @@
     printf("The target IP address is '%s'\r\n", eth.get_ip_address());
     #endif
     confignetdevices(&eth);
-    /* Setup Ethernet to Serial Connection Thread */
-    conchkthread[0].start(callback(conchk,&net1));
     /* Setup polltick Ticker */
     nettimer.attach_us(heartbeat,10000);
     /* Setup Ethernet to Serial transmit data Thread */
-    rxtxdatathread[0].start(callback(datansrx,&net1));
-    rxtxdatathread[1].start(callback(datancrx,&net1));
+    rxtxdatathread[0].start(callback(datancrx,&net1));
     /* Setup Ethernet to Serial receive data Thread */
-    rxtxdatathread[2].start(callback(datasrx,&net1));
-    rxtxdatathread[3].start(callback(datantx,&net1));
-    rxtxdatathread[4].start(callback(dataprocess,&net1));
+    rxtxdatathread[1].start(callback(datasrx,&net1));
+    rxtxdatathread[2].start(callback(datantx,&net1));
+    rxtxdatathread[3].start(callback(dataprocess,&net1));
 
     unsigned int sxc;
     
@@ -665,17 +627,6 @@
         if (polltick)
         {
             setPollTick(false);
-            
-            if (netStat.bit_isset(srvCloseConnection))
-            {
-                #ifdef netmsgdebug
-                printf("Closed\r\n");
-                #endif
-                net1.clt_sock.close();
-                netStat.bit_toclear(srvIsActive);
-                netStat.bit_toclear(srvCloseConnection);
-                
-            }
             if (netStat.bit_isset(serCloseConnection))
             {
                 #ifdef netmsgdebug
@@ -723,9 +674,9 @@
             {
                 if (netStat.bit_isset(recDataFile))
                 {
-                    char dataStrLen=120;
-                    char dataStr[121];
-                    myDevice.getMeterReport(&dataStr[0]);
+                    char dataStrLen=0;
+                    char dataStr[256];
+                    dataStrLen=myDevice.getMeterReport(&dataStr[0]);
                     sport0.write(dataStr,dataStrLen);
                     
                     netStat.bit_toclear(recDataFile);
@@ -736,7 +687,7 @@
                 {
                     if (netStat.bit_isset(fmdPollReq))
                     {
-                        if (netStat.bit_isset(fmdEnabled))
+                        if (netStat.bit_isset(fmdOnline))
                         {
                             printf("Demand Reading\r\n");
                             sendCmd(4);
@@ -755,7 +706,7 @@
                     }
                     else if (netStat.bit_isset(fmPollReq))
                     {
-                        if (netStat.bit_isset(fmEnabled))
+                        if (netStat.bit_isset(fmOnline))
                         {
                             printf("Meter Reading\r\n");
                             sendCmd(2);
--- a/mydevices.h	Mon Oct 14 13:36:11 2019 +0000
+++ b/mydevices.h	Mon Nov 25 15:20:50 2019 +0000
@@ -2,7 +2,8 @@
 #define sportEnabled
 #define setPollEnabled
 #define fastMeterEnabled
-//#define fastDemandEnabled
+#define fastDemandEnabled
+#define recordDataEnabled
 #define setConsFailCount 3
 
 #define setDataRecInterval 90000
@@ -13,7 +14,7 @@
 #define setpolltimeout 200
 #define sertimeoutperiods 2
 #define setpollinterval 15 //In 10ms intervals
-#define setfmpollinterval 5000 
+#define setfmpollinterval 500 
 #define setfmdemandpollinterval 60000
 
 #define setserverport 23
--- a/netStatReg.lib	Mon Oct 14 13:36:11 2019 +0000
+++ b/netStatReg.lib	Mon Nov 25 15:20:50 2019 +0000
@@ -1,1 +1,1 @@
-netStatReg#7397d19f91aa
+netStatReg#3f8751bccba3
--- a/selMsg.cpp	Mon Oct 14 13:36:11 2019 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,324 +0,0 @@
-#include "selMsg.h"
-#include "string.h"
-#include "netDataTypes.h"
-#include "mbed.h"
-
-analogAverager voltageAvg(120,true,true,0.9,true,true,1.1);
-analogMinMax voltageMinMax(120,true,true,0.9,true,true,1.1);
-analogAverager currentAvg(50,true,false,-100,true,false,100);
-analogMinMax currentMinMax(50,true,false,-100,true,false,100);
-analogAverager powerAvg(360000,true,false,720000,true,false,720000);
-analogMinMax powerMinMax(360000,true,false,-720000,true,false,720000);
-analogAverager reactiveAvg(0,true,false,-360000,true,false,360000);
-analogMinMax reactiveMinMax(0,true,false,-360000,true,false,360000);
-counterMinMax tapMinMax(0,true,-16,true,16);
-
-voltageRegulator::voltageRegulator()
-{
-    vRegData.numAnalog=0x11;
-    vRegData.numDigital=0x34;
-    vRegData.numDemAnalog=0x0A;
-    vRegData.fmMsgLen[0]=22;//Minus Checksum
-    vRegData.fmMsgLen[1]=203;//Minus Checksum
-    vRegData.fmMsgLen[2]=132;//Minus Checksum
-    vRegData.fmMsgLen[3]=126;//Minus Checksum
-    vRegData.fmMsgLen[4]=52;//Minus Checksum
-    strcpy(vRegData.analogs[0].analogName,"IL\0\0\0\0");
-    strcpy(vRegData.analogs[1].analogName,"ILA\0\0\0");
-    strcpy(vRegData.analogs[2].analogName,"VS\0\0\0\0");
-    strcpy(vRegData.analogs[3].analogName,"VSA\0\0\0");
-    strcpy(vRegData.analogs[4].analogName,"VL\0\0\0\0");
-    strcpy(vRegData.analogs[5].analogName,"VLA\0\0\0");
-    strcpy(vRegData.analogs[6].analogName,"VCMP\0\0");
-    strcpy(vRegData.analogs[7].analogName,"TAPPOS");
-    strcpy(vRegData.analogs[8].analogName,"VSSEC\0");
-    strcpy(vRegData.analogs[9].analogName,"VLSEC\0");
-    strcpy(vRegData.analogs[10].analogName,"VCMPSC");
-    strcpy(vRegData.analogs[11].analogName,"PL\0\0\0\0");
-    strcpy(vRegData.analogs[12].analogName,"QL\0\0\0\0");
-    strcpy(vRegData.analogs[13].analogName,"SL\0\0\0\0");
-    strcpy(vRegData.analogs[14].analogName,"PF\0\0\0\0");
-    strcpy(vRegData.analogs[15].analogName,"PFLD\0\0");
-    strcpy(vRegData.analogs[16].analogName,"FREQ\0\0");
-    strcpy(vRegData.analogs[17].analogName,"ILFDEM");
-    strcpy(vRegData.analogs[18].analogName,"ILRDEM");
-    strcpy(vRegData.analogs[19].analogName,"PFDEM\0");
-    strcpy(vRegData.analogs[20].analogName,"PRDEM\0");
-    strcpy(vRegData.analogs[21].analogName,"QFODEM");
-    strcpy(vRegData.analogs[22].analogName,"QFIDEM");
-    strcpy(vRegData.analogs[23].analogName,"QRODEM");
-    strcpy(vRegData.analogs[24].analogName,"QRIDEM");
-    strcpy(vRegData.analogs[25].analogName,"SFDEM\0");
-    strcpy(vRegData.analogs[26].analogName,"SRDEM\0");
-    strcpy(vRegData.calculated[0].analogName,"VLSMIN");
-    strcpy(vRegData.calculated[1].analogName,"VLSAVG");
-    strcpy(vRegData.calculated[2].analogName,"VLSMAX");
-    strcpy(vRegData.calculated[3].analogName,"ILMIN\0");
-    strcpy(vRegData.calculated[4].analogName,"ILAVG\0");
-    strcpy(vRegData.calculated[5].analogName,"ILMA\0");
-    strcpy(vRegData.calculated[6].analogName,"PLMIN\0");
-    strcpy(vRegData.calculated[7].analogName,"PLAVG\0");
-    strcpy(vRegData.calculated[8].analogName,"PLMAX\0");
-    strcpy(vRegData.calculated[9].analogName,"QLMIN\0");
-    strcpy(vRegData.calculated[10].analogName,"QLAVG\0");
-    strcpy(vRegData.calculated[11].analogName,"QLMAX\0");
-    strcpy(vRegData.calculated[12].analogName,"TAPMIN");
-    strcpy(vRegData.calculated[13].analogName,"TAPMAX");
-    
-    /*analogAverager voltageAvg(120,true,true,0.9,true,true,1.1);
-    analogMinMax voltageMinMax(120,true,true,0.9,true,true,1.1);
-    analogAverager currentAvg(50,true,false,-100,true,false,100);
-    analogMinMax currentMinMax(50,true,false,-100,true,false,100);
-    analogAverager powerAvg(360000,true,false,720000,true,false,720000);
-    analogMinMax powerMinMax(360000,true,false,-720000,true,false,720000);
-    analogAverager reactiveAvg(0,true,false,-360000,true,false,360000);
-    analogMinMax reactiveMinMax(0,true,false,-360000,true,false,360000);
-    counterMinMax tapMinMax(0,true,-16,true,16);*/
-}
-
-bool voltageRegulator::chkCfgMsg(char *cbuf, char clen)
-{
-    char txc;
-    char chksum=0;
-    if (clen>vRegData.fmMsgLen[0])
-    {
-        for (txc=0;txc<vRegData.fmMsgLen[0];txc++)
-        {
-            chksum=chksum+cbuf[txc];
-        }
-        if (chksum==cbuf[vRegData.fmMsgLen[0]])
-        {
-            printf("Chksum: %02x\r\n",chksum);
-            return true;
-        }
-        printf("Chksum Error: %02x, Message: %02x\r\n",chksum,cbuf[vRegData.fmMsgLen[0]]);
-        return false;
-    }
-    printf("Message Length Wrong: %d Bytes\r\n",clen);
-    return false;
-}
-
-void voltageRegulator::setMeterData(char *cbuf, char pos, char clen)
-{
-    float4byte valpack;
-    short2byte timepack;
-    char txc;
-    char anum=pos+4;
-    
-    char chksum=0;
-    if (clen>vRegData.fmMsgLen[2])
-    {
-        for (txc=0;txc<vRegData.fmMsgLen[2];txc++)
-        {
-            chksum=chksum+cbuf[txc];
-        }
-        if (chksum==cbuf[vRegData.fmMsgLen[2]])
-        {
-            printf("Chksum: %02x\r\n",chksum);
-        }
-        else
-        {
-            printf("Chksum Error: %02x, Message: %02x\r\n",chksum,cbuf[vRegData.fmMsgLen[2]]);
-            return;
-        }
-    }
-    else
-    {
-        printf("Message Length Wrong: %d Bytes\r\n",clen);
-        return;
-    }
-    
-    for (txc=0;txc<vRegData.numAnalog;txc++)
-    {
-        valpack.bytes[3]=cbuf[anum];
-        valpack.bytes[2]=cbuf[anum+1];
-        valpack.bytes[1]=cbuf[anum+2];
-        valpack.bytes[0]=cbuf[anum+3];
-        vRegData.analogs[txc].analog1Value = valpack.cmdflt;
-        anum = anum + 4;
-        printf("%.2f\r\n",vRegData.analogs[txc].analog1Value);
-    }
-    vRegData.timeStamp.month=cbuf[anum];
-    vRegData.timeStamp.day=cbuf[anum+1];
-    vRegData.timeStamp.year=cbuf[anum+2];
-    vRegData.timeStamp.hour=cbuf[anum+3];
-    vRegData.timeStamp.min=cbuf[anum+4];
-    vRegData.timeStamp.sec=cbuf[anum+5];
-    timepack.bytes[1]=cbuf[anum+6];
-    timepack.bytes[0]=cbuf[anum+7];
-    vRegData.timeStamp.msec=timepack.cmdshort;
-    printf("%d/%d/%d %d:%d:%d.%d\r\n",vRegData.timeStamp.month,vRegData.timeStamp.day,vRegData.timeStamp.year,vRegData.timeStamp.hour,vRegData.timeStamp.min,vRegData.timeStamp.sec,vRegData.timeStamp.msec);
-    anum=anum+8;
-    for (txc=0;txc<vRegData.numDigital;txc++)
-    {
-        vRegData.digitalTargets[txc]=cbuf[anum+txc];
-    }
-    tapMinMax.putVal(vRegData.analogs[7].analog1Value);
-    voltageMinMax.putVal(vRegData.analogs[9].analog1Value);
-    voltageAvg.putVal(vRegData.analogs[9].analog1Value);
-    currentMinMax.putVal(vRegData.analogs[0].analog1Value);
-    currentAvg.putVal(vRegData.analogs[0].analog1Value);
-    powerMinMax.putVal(vRegData.analogs[11].analog1Value);
-    powerAvg.putVal(vRegData.analogs[11].analog1Value);
-    reactiveMinMax.putVal(vRegData.analogs[12].analog1Value);
-    reactiveAvg.putVal(vRegData.analogs[12].analog1Value);
-}
-
-bool voltageRegulator::chkMeterMsg(char *cbuf, char clen)
-{
-    char txc;
-    
-    //Ensure Analog channl count is correct
-    if (vRegData.numAnalog!=cbuf[6])
-    {
-        #ifdef netmsgdebug
-        printf("\r\nFast Meter Analog Channel Count Off\r\n");
-        #endif
-        return false;
-    }
-    //Ensure Digital register count is correct
-    if (vRegData.numDigital!=cbuf[8])
-    {
-        #ifdef netmsgdebug
-        printf("\r\nFast Meter Digital Channel Count Off\r\n");
-        #endif
-        return false;
-    }
-    char anum=16;
-    char nxc;
-    //Verify Analog names are correct
-    for (txc=0;txc<vRegData.numAnalog;txc++)
-    {
-        for (nxc=0;nxc<6;nxc++)
-        {
-            if(vRegData.analogs[txc].analogName[nxc]!=cbuf[anum+nxc])
-            {
-                #ifdef netmsgdebug
-                printf("\r\nPoint %d Failed\r\n",txc);
-                #endif
-                return false;
-            }
-        }
-        anum = anum + 11;
-    }
-    return true;
-}
-
-bool voltageRegulator::chkDemMeterMsg(char *cbuf, char clen)
-{
-    char txc;
-    
-    if (vRegData.numDemAnalog!=cbuf[6])
-    {
-        #ifdef netmsgdebug
-        printf("\r\nDemand Analog Channel Count Off\r\n");
-        #endif
-        return false;
-    }
-    char anum=18;
-    char nxc;
-    //Verify Analog names are correct
-    for (txc=0;txc<vRegData.numDemAnalog;txc++)
-    {
-        for (nxc=0;nxc<6;nxc++)
-        {
-            if(vRegData.analogs[txc+vRegData.numAnalog].analogName[nxc]!=cbuf[anum+nxc])
-            {
-                #ifdef netmsgdebug
-                printf("\r\nPoint %d Failed\r\n",txc);
-                #endif
-                return false;
-            }
-        }
-        anum = anum + 11;
-    }
-    return true;
-}
-
-void voltageRegulator::setDemMeterData(char *cbuf, char pos, char clen)
-{
-    float4byte valpack;
-    short2byte timepack;
-    char txc;
-    char anum=pos+4;
-    
-    char chksum=0;
-    if (clen>vRegData.fmMsgLen[4])
-    {
-        for (txc=0;txc<vRegData.fmMsgLen[4];txc++)
-        {
-            chksum=chksum+cbuf[txc];
-        }
-        if (chksum==cbuf[vRegData.fmMsgLen[4]])
-        {
-            printf("Chksum: %02x\r\n",chksum);
-        }
-        else
-        {
-            printf("Chksum Error: %02x, Message: %02x\r\n",chksum,cbuf[vRegData.fmMsgLen[4]]);
-            return;
-        }
-    }
-    else
-    {
-        printf("Message Length Wrong: %d Bytes\r\n",clen);
-        return;
-    }
-    
-    for (txc=0;txc<vRegData.numDemAnalog;txc++)
-    {
-        valpack.bytes[3]=cbuf[anum];
-        valpack.bytes[2]=cbuf[anum+1];
-        valpack.bytes[1]=cbuf[anum+2];
-        valpack.bytes[0]=cbuf[anum+3];
-        vRegData.analogs[txc].analog1Value = valpack.cmdflt;
-        anum = anum + 4;
-    }
-    vRegData.demTimeStamp.month=cbuf[anum];
-    vRegData.demTimeStamp.day=cbuf[anum+1];
-    vRegData.demTimeStamp.year=cbuf[anum+2];
-    vRegData.demTimeStamp.hour=cbuf[anum+3];
-    vRegData.demTimeStamp.min=cbuf[anum+4];
-    vRegData.demTimeStamp.sec=cbuf[anum+5];
-    timepack.bytes[1]=cbuf[anum+6];
-    timepack.bytes[0]=cbuf[anum+7];
-    vRegData.demTimeStamp.msec=timepack.cmdshort;
-}
-
-void voltageRegulator::getMeterReport(char *dataStr)
-{
-    //char dataStr[121];
-    char buflen;
-    vRegData.calculated[0].analog1Value=voltageMinMax.getMin();
-    vRegData.calculated[1].analog1Value=voltageAvg.getAvg();
-    vRegData.calculated[2].analog1Value=voltageMinMax.getMax();
-    vRegData.calculated[3].analog1Value=currentMinMax.getMin();
-    vRegData.calculated[4].analog1Value=currentAvg.getAvg();
-    vRegData.calculated[5].analog1Value=currentMinMax.getMax();
-    vRegData.calculated[6].analog1Value=powerMinMax.getMin();
-    vRegData.calculated[7].analog1Value=powerAvg.getAvg();
-    vRegData.calculated[8].analog1Value=powerMinMax.getMax();
-    vRegData.calculated[9].analog1Value=reactiveMinMax.getMin();
-    vRegData.calculated[10].analog1Value=reactiveAvg.getAvg();
-    vRegData.calculated[11].analog1Value=reactiveMinMax.getMax();
-    vRegData.calculated[12].analog1Value=tapMinMax.getMin();
-    vRegData.calculated[13].analog1Value=tapMinMax.getMax();
-    buflen = sprintf(dataStr,
-    "%2d:%2d ,%7.2f,%7.2f,%7.2f,%7.2f,%7.2f,%7.2f,%7d,%7d,%7d,%7d,%7d,%7d,%7d,%7d\r\n",
-    vRegData.timeStamp.hour,vRegData.timeStamp.min,
-    vRegData.calculated[0].analog1Value,vRegData.calculated[1].analog1Value,vRegData.calculated[2].analog1Value,
-    vRegData.calculated[3].analog1Value,vRegData.calculated[4].analog1Value,vRegData.calculated[5].analog1Value,
-    vRegData.calculated[6].analog1Value,vRegData.calculated[7].analog1Value,vRegData.calculated[8].analog1Value,
-    vRegData.calculated[9].analog1Value,vRegData.calculated[10].analog1Value,vRegData.calculated[11].analog1Value,
-    vRegData.calculated[12].analog1Value,vRegData.calculated[13].analog1Value);
-    
-    voltageAvg.resetNum();
-    voltageMinMax.resetNum();
-    currentAvg.resetNum();
-    currentMinMax.resetNum();
-    powerAvg.resetNum();
-    powerMinMax.resetNum();
-    reactiveAvg.resetNum();
-    reactiveMinMax.resetNum();
-    tapMinMax.resetNum();
-}
\ No newline at end of file
--- a/selMsg.h	Mon Oct 14 13:36:11 2019 +0000
+++ b/selMsg.h	Mon Nov 25 15:20:50 2019 +0000
@@ -1,10 +1,6 @@
 #ifndef SELMSG_H 
 #define SELMSG_H
 
-#include "analogAverager.h"
-#include "analogMinMax.h"
-#include "counterMinMax.h"
-
 const char fmCmd[5][2] = {
 {0xA5,0xC0},
 {0xA5,0xC1},
@@ -31,86 +27,4 @@
 {0x05,0x07,0x04,0x04,0x05}
 };
 
-const char vRegDevCfg[23] = {
-0xA5,0xC0,0x17,0x02,0x03,0x00,0xA5,0xC1,0xA5,0xD1,0xA5,0xC2,0xA5,0xD2,0xA5,0xC3,0xA5,0xD3,0x01,0x00,0x00,0x05,0x21
-};
-
-class voltageRegulator
-{  
-        struct analog1Sample {
-            char analogName[6];
-            float analog1Value;
-        };
-        struct analog2Sample {
-            char analogName[6];
-            float analog1Value;
-            float analog2Value;
-        };
-        struct analog3Sample {
-            char analogName[6];
-            float analog1Value;
-            float analog2Value;
-            float analog3Value;
-        };
-        struct analog4Sample {
-            char analogName[6];
-            float analog1Value;
-            float analog2Value;
-            float analog3Value;
-            float analog4Value;
-        };
-        
-        struct fmTimeStamp {
-            char month;
-            char day;
-            char year;
-            char hour;
-            char min;
-            char sec;
-            short msec;
-        };
-        
-        struct vRegDataStruct {
-            char numAnalog;
-            char numDigital;
-            char numDemAnalog;
-            char fmMsgLen[5];
-            struct analog1Sample analogs[27];
-            struct analog1Sample calculated[14];
-            struct fmTimeStamp timeStamp;
-            struct fmTimeStamp  demTimeStamp;
-            char digitalTargets[52];
-            char tapOff;
-            char noNeut;
-            char tapDiff;
-            char remCount;
-            char locCount;
-            char autoCount;
-            char manCount;
-            char vripCount;
-            char neutCount;
-            char maxCount;
-            char minCount;    
-        } vRegData;
-        
-    public:
-    
-        voltageRegulator(void);
-        
-        void setMeterData(char *cbuf, char pos, char clen);
-        
-        void setDemMeterData(char *cbuf, char pos, char clen);
-        
-        void incCount(void);
-        
-        char getCount(char);
-        
-        bool chkCfgMsg(char *cbuf, char clen);
-        
-        bool chkMeterMsg(char *cbuf, char clen);
-        
-        bool chkDemMeterMsg(char *cbuf, char clen);
-        
-        void getMeterReport(char *dataStr);
-};
 #endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/voltageRegulator.lib	Mon Nov 25 15:20:50 2019 +0000
@@ -0,0 +1,1 @@
+voltageRegulator#7be2db2605c6