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

Revision:
16:018bed9abe89
Parent:
15:9ad261a27883
Child:
17:a69f6e51b3cb
--- a/main.cpp	Fri Oct 11 16:32:45 2019 +0000
+++ b/main.cpp	Mon Oct 14 13:36:11 2019 +0000
@@ -27,17 +27,7 @@
 struct netsys net1;
 netDevStatus netStat(0,0,0,0,0,setConsFailCount);
 
-struct vRegData vReg1;
-
-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 myDevice;
 
 bool polltick;
 bool sendtick;
@@ -126,7 +116,7 @@
         }
     }
     //Fast Message Timeout
-    if ((netStat.bit_isset(fmPollInProg)) || (netStat.bit_isset(fmdPollInProg)))
+    if ((netStat.bit_isset(fmCfgInProg)) || (netStat.bit_isset(fmPollInProg)) || (netStat.bit_isset(fmdPollInProg)))
     {
         if (netDevTimers[4].read_ms()>=2000)
         {
@@ -207,13 +197,10 @@
 
 void dataprocess(netsys *net2)
 {
-    int txc;
     char cchar;
     char cbuf[256];
     unsigned int clen=0;
     unsigned int cbc;
-    float4byte valpack;
-    short2byte timepack;
     
     while(1)
     {
@@ -250,10 +237,13 @@
                 if ((cbuf[cbc]==0xA5) && (cbuf[cbc+1]==0xC0))
                 {
                     sport0.write(cbuf,clen);
-                    netStat.bit_toclear(fmCfgInProg);
-                    netStat.bit_toset(devOnline);
-                    clen=0;
-                    netStat.iedOnline(true);
+                    if (myDevice.chkCfgMsg(cbuf,clen))
+                    {
+                        //netStat.bit_toclear(fmCfgInProg);
+                        netStat.bit_toset(devOnline);
+                        clen=0;
+                        netStat.iedOnline(true);
+                    }
                     break;
                 }
                 //Check to see if serial commands are currently being received
@@ -333,86 +323,20 @@
                     if ((cbuf[cbc]==0xA5) && (cbuf[cbc+1]==0xC1))
                     {
                         sport0.write(cbuf,clen);
-                        //Ensure Analog channl count is correct
-                        if (vReg1.numAnalog!=cbuf[6])
+                        if (myDevice.chkMeterMsg(cbuf,clen))
                         {
-                            #ifdef netmsgdebug
-                            printf("\r\nFast Meter Analog Channel Count Off\r\n");
-                            #endif
+                            netStat.bit_toset(fmEnabled);
                             clen=0;
-                            break;
-                        }
-                        //Ensure Digital register count is correct
-                        if (vReg1.numDigital!=cbuf[8])
-                        {
-                            #ifdef netmsgdebug
-                            printf("\r\nFast Meter Digital Channel Count Off\r\n");
-                            #endif
-                            clen=0;
+                            netStat.iedOnline(true);
                             break;
                         }
-                        char anum=16;
-                        char nxc;
-                        //Verify Analog names are correct
-                        for (txc=0;txc<vReg1.numAnalog;txc++)
-                        {
-                            for (nxc=0;nxc<6;nxc++)
-                            {
-                                if(vReg1.analogs[txc].analogName[nxc]!=cbuf[anum+nxc])
-                                {
-                                    #ifdef netmsgdebug
-                                    printf("\r\nPoint %d Failed\r\n",txc);
-                                    #endif
-                                    break;
-                                }
-                            }
-                            anum = anum + 11;
-                        }
-                        //bit_toset(net2->statusReg,fmEnabled);
-                        netStat.bit_toset(fmEnabled);
-                        clen=0;
-                        netStat.iedOnline(true);
                         break;
                     }
                     //Receive data
                     if ((cbuf[cbc]==0xA5) && (cbuf[cbc+1]==0xD1))
                     {
-                        char anum=cbc+4;
-                        for (txc=0;txc<vReg1.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];
-                            vReg1.analogs[txc].analog1Value = valpack.cmdflt;
-                            anum = anum + 4;
-                            printf("%.2f\r\n",vReg1.analogs[txc].analog1Value);
-                        }
-                        vReg1.timeStamp.month=cbuf[anum];
-                        vReg1.timeStamp.day=cbuf[anum+1];
-                        vReg1.timeStamp.year=cbuf[anum+2];
-                        vReg1.timeStamp.hour=cbuf[anum+3];
-                        vReg1.timeStamp.min=cbuf[anum+4];
-                        vReg1.timeStamp.sec=cbuf[anum+5];
-                        timepack.bytes[1]=cbuf[anum+6];
-                        timepack.bytes[0]=cbuf[anum+7];
-                        vReg1.timeStamp.msec=timepack.cmdshort;
-                        printf("%d/%d/%d %d:%d:%d.%d\r\n",vReg1.timeStamp.month,vReg1.timeStamp.day,vReg1.timeStamp.year,vReg1.timeStamp.hour,vReg1.timeStamp.min,vReg1.timeStamp.sec,vReg1.timeStamp.msec);
-                        anum=anum+8;
-                        for (txc=0;txc<vReg1.numDigital;txc++)
-                        {
-                            vReg1.digitalTargets[txc]=cbuf[anum+txc];
-                        }
+                        myDevice.setMeterData(cbuf, cbc,clen);
                         clen=0;
-                        tapMinMax.putVal(vReg1.analogs[7].analog1Value);
-                        voltageMinMax.putVal(vReg1.analogs[9].analog1Value);
-                        voltageAvg.putVal(vReg1.analogs[9].analog1Value);
-                        currentMinMax.putVal(vReg1.analogs[0].analog1Value);
-                        currentAvg.putVal(vReg1.analogs[0].analog1Value);
-                        powerMinMax.putVal(vReg1.analogs[11].analog1Value);
-                        powerAvg.putVal(vReg1.analogs[11].analog1Value);
-                        reactiveMinMax.putVal(vReg1.analogs[12].analog1Value);
-                        reactiveAvg.putVal(vReg1.analogs[12].analog1Value);
                         netStat.iedOnline(true);
                         break;
                     }
@@ -423,61 +347,19 @@
                     if ((cbuf[cbc]==0xA5) && (cbuf[cbc+1]==0xC2))
                     {
                         sport0.write(cbuf,clen);
-                        //Ensure Analog channl count is correct
-                        if (vReg1.numDemAnalog!=cbuf[6])
+                        if (myDevice.chkMeterMsg(cbuf,clen))
                         {
-                            #ifdef netmsgdebug
-                            printf("\r\nDemand Analog Channel Count Off\r\n");
-                            #endif
+                            netStat.bit_toset(fmdEnabled);
                             clen=0;
+                            netStat.iedOnline(true);
                             break;
                         }
-                        char anum=18;
-                        char nxc;
-                        //Verify Analog names are correct
-                        for (txc=0;txc<vReg1.numDemAnalog;txc++)
-                        {
-                            for (nxc=0;nxc<6;nxc++)
-                            {
-                                if(vReg1.analogs[txc+vReg1.numAnalog].analogName[nxc]!=cbuf[anum+nxc])
-                                {
-                                    #ifdef netmsgdebug
-                                    printf("\r\nPoint %d Failed\r\n",txc);
-                                    #endif
-                                    break;
-                                }
-                            }
-                            anum = anum + 11;
-                        }
-                        netStat.bit_toset(fmdEnabled);
-                        clen=0;
-                        netStat.iedOnline(true);
                         break;
                     }
                     //Receive demand data
                     if ((cbuf[cbc]==0xA5) && (cbuf[cbc+1]==0xD2))
                     {
-                        char anum=cbc+4;
-                        for (txc=0;txc<vReg1.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];
-                            vReg1.analogs[txc].analog1Value = valpack.cmdflt;
-                            anum = anum + 4;
-                            //printf("%.2f\r\n",vReg1.analogs[txc].analog1Value);
-                        }
-                        vReg1.demTimeStamp.month=cbuf[anum];
-                        vReg1.demTimeStamp.day=cbuf[anum+1];
-                        vReg1.demTimeStamp.year=cbuf[anum+2];
-                        vReg1.demTimeStamp.hour=cbuf[anum+3];
-                        vReg1.demTimeStamp.min=cbuf[anum+4];
-                        vReg1.demTimeStamp.sec=cbuf[anum+5];
-                        timepack.bytes[1]=cbuf[anum+6];
-                        timepack.bytes[0]=cbuf[anum+7];
-                        vReg1.demTimeStamp.msec=timepack.cmdshort;
-                        sport0.printf("%d/%d/%d %d:%d:%d.%d\r\n",vReg1.demTimeStamp.month,vReg1.demTimeStamp.day,vReg1.demTimeStamp.year,vReg1.demTimeStamp.hour,vReg1.demTimeStamp.min,vReg1.demTimeStamp.sec,vReg1.demTimeStamp.msec);
+                        myDevice.setDemMeterData(cbuf, cbc,clen);
                         netStat.iedOnline(true);
                         break;
                     }
@@ -536,36 +418,34 @@
             //Attempt to send data
             while (net2->sendState==4)
             {
-                //Attempt to send data
-                ret = net2->srv_sock.send(net2->sendString,net2->sendLen);
-                //If data send successful proceed to wait for response
-                if (ret>=0)
+                if (net2->sendLen>0)
                 {
-                    #ifdef netmsgdebug
-                    printf("Send Result %d\r\n",ret);
-                    #endif
-                    netStat.incCount(1);
-                    net2->sendState=5;
-                    /*if ((netStat.bit_isset(fmPollReq)) || (netStat.bit_isset(fmdPollReq)))
+                    //Attempt to send data
+                    ret = net2->srv_sock.send(net2->sendString,net2->sendLen);
+                    //If data send successful proceed to wait for response
+                    if (ret>=0)
                     {
-                        netDevTimers[4].reset();
-                        netDevTimers[4].start();
+                        net2->sendLen=0;
+                        #ifdef netmsgdebug
+                        printf("Send Result %d\r\n",ret);
+                        #endif
+                        netStat.incCount(1);
+                        net2->sendState=5;
                     }
-                    if (netStat.bit_isset(serPollReq))
+                    else
                     {
-                        netDevTimers[5].reset();
-                        netDevTimers[5].start();
-                    }*/
+                        #ifdef netmsgdebug
+                        printf("Communication Failed, Closing\r\n");
+                        #endif
+                        net2->sendRetryCount = 0;
+                        netStat.iedOnline(false);
+                        netStat.bit_toset(cltCloseConnection);
+                        net2->sendState=0;
+                    }
                 }
                 else
                 {
-                    #ifdef netmsgdebug
-                    printf("Communication Failed, Closing\r\n");
-                    #endif
-                    net2->sendRetryCount = 0;
-                    netStat.iedOnline(false);
-                    netStat.bit_toset(cltCloseConnection);
-                    net2->sendState=0;
+                    net2->sendState=5;
                 }
             }
         }
@@ -753,7 +633,7 @@
     eth.set_network(setseveraddress,setsevermask,setsevergateway); //Use  these parameters for static IP
     eth.connect();
     
-    initVoltageRegulator(&vReg1);
+    //initVoltageRegulator(&vReg1);
     
     #ifdef netmsgdebug
     printf("The target IP address is '%s'\r\n", eth.get_ip_address());
@@ -843,38 +723,10 @@
             {
                 if (netStat.bit_isset(recDataFile))
                 {
-                    vReg1.calculated[0].analog1Value=voltageMinMax.getMin();
-                    vReg1.calculated[1].analog1Value=voltageAvg.getAvg();
-                    vReg1.calculated[2].analog1Value=voltageMinMax.getMax();
-                    vReg1.calculated[3].analog1Value=currentMinMax.getMin();
-                    vReg1.calculated[4].analog1Value=currentAvg.getAvg();
-                    vReg1.calculated[5].analog1Value=currentMinMax.getMax();
-                    vReg1.calculated[6].analog1Value=powerMinMax.getMin();
-                    vReg1.calculated[7].analog1Value=powerAvg.getAvg();
-                    vReg1.calculated[8].analog1Value=powerMinMax.getMax();
-                    vReg1.calculated[9].analog1Value=reactiveMinMax.getMin();
-                    vReg1.calculated[10].analog1Value=reactiveAvg.getAvg();
-                    vReg1.calculated[11].analog1Value=reactiveMinMax.getMax();
-                    vReg1.calculated[12].analog1Value=tapMinMax.getMin();
-                    vReg1.calculated[13].analog1Value=tapMinMax.getMax();
-                    sport0.printf(
-                    "%2d:%2d  ,%7.2f,%7.2f,%7.2f,%7.2f,%7.2f,%7.2f,%7d,%7d,%7d,%7d,%7d,%7d,%7d,%7d\r\n",
-                    vReg1.timeStamp.hour,vReg1.timeStamp.min,
-                    vReg1.calculated[0].analog1Value,vReg1.calculated[1].analog1Value,vReg1.calculated[2].analog1Value,
-                    vReg1.calculated[3].analog1Value,vReg1.calculated[4].analog1Value,vReg1.calculated[5].analog1Value,
-                    vReg1.calculated[6].analog1Value,vReg1.calculated[7].analog1Value,vReg1.calculated[8].analog1Value,
-                    vReg1.calculated[9].analog1Value,vReg1.calculated[10].analog1Value,vReg1.calculated[11].analog1Value,
-                    vReg1.calculated[12].analog1Value,vReg1.calculated[13].analog1Value);
-                    
-                    voltageAvg.resetNum();
-                    voltageMinMax.resetNum();
-                    currentAvg.resetNum();
-                    currentMinMax.resetNum();
-                    powerAvg.resetNum();
-                    powerMinMax.resetNum();
-                    reactiveAvg.resetNum();
-                    reactiveMinMax.resetNum();
-                    tapMinMax.resetNum();
+                    char dataStrLen=120;
+                    char dataStr[121];
+                    myDevice.getMeterReport(&dataStr[0]);
+                    sport0.write(dataStr,dataStrLen);
                     
                     netStat.bit_toclear(recDataFile);
                     netDevTimers[6].reset();
@@ -943,6 +795,8 @@
                 netStat.bit_toclear(fmCfgReq);
                 netStat.bit_toset(fmCfgInProg);
                 net1.sendState=1;
+                netDevTimers[4].reset();
+                netDevTimers[4].start();
             }
         }