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:
18:69846c990e04
Parent:
17:a69f6e51b3cb
--- a/main.cpp	Mon Nov 25 15:20:50 2019 +0000
+++ b/main.cpp	Thu Jan 23 12:38:12 2020 +0000
@@ -33,9 +33,9 @@
 bool polltick;
 bool sendtick;
 
-BufferedSerial sport0(sport0tx, sport0rx, sport0buff, sport0mult);    // UART2
+BufferedSerial sport0(sport0tx, sport0rx, rxtxbuffer, sport0mult);    // UART2
 
-CircularBuffer<char, 256> receiveBuffer;
+CircularBuffer<char, rxtxbuffer> receiveBuffer;
 CircularBuffer<char, 256> unSolReceiveBuffer;
 CircularBuffer<char, 64> sendLength;
 CircularBuffer<char, 256> sendBuffer;
@@ -198,19 +198,19 @@
 void dataprocess(netsys *net2)
 {
     char cchar;
-    char cbuf[256];
+    char cbuf[rxtxbuffer];
     unsigned int clen=0;
     unsigned int cbc;
     
     while(1)
     {
         //Check to see if the Receive Buffer has anything
-        while (!receiveBuffer.empty())
+        /*while (!receiveBuffer.empty())
         {
             receiveBuffer.pop(cchar);
             cbuf[clen]=cchar;
             clen++;
-        }
+        }*/
         //If a Poll Request has been made and data has been received set flag
         netStat.bit_sis(serPollInProg,serRespRx);
         netStat.bit_sis(fmPollInProg,fmRespRx);
@@ -219,16 +219,32 @@
         //Check to see if bulk data and reports being sent from device due to serial command
         if (netStat.bit_isset(serMsgRx))
         {
-            if (clen>0)
+            while (!receiveBuffer.empty())
+            {
+                receiveBuffer.pop(cchar);
+                sport0.putc(cchar);
+                //cbuf[clen]=cchar;
+                //clen++;
+            }
+            /*if (clen>0)
             {
                 sport0.write(cbuf,clen);
                 netDevTimers[5].reset();
                 clen=0;
                 netStat.iedOnline(true);
+            }*/
+        }
+        else
+        {
+            while (!receiveBuffer.empty())
+            {
+                receiveBuffer.pop(cchar);
+                cbuf[clen]=cchar;
+                clen++;
             }
         }
         //Check to see if at least 4 characters have been received
-        else if (clen>3)
+        if (clen>3)
         {
             //Cycle through received data to search for a command
             for (cbc=0;cbc<clen-3;cbc++)
@@ -501,6 +517,9 @@
         {
             for (rxc=0;rxc<rxlen;rxc++)
             {
+                #ifdef netmsgdebug
+                printf("Serial Data Received\r\n");
+                #endif
                 rxbuf[rxindex+rxc]=sport0.getc();
                 //Check to see if a carriage return has been detected
                 if (rxbuf[rxindex+rxc]=='\r')
@@ -670,7 +689,7 @@
                 netStat.bit_toclear(cltclose);
             }
             
-            if ((netStat.bit_isclear(serPollInProg)) && (netStat.bit_isclear(fmPollInProg)) && (netStat.bit_isclear(fmdPollInProg)) && (netStat.bit_isset(devOnline)))
+            if ((netStat.bit_isclear(serPollInProg)) && (netStat.bit_isclear(fmPollInProg)) && (netStat.bit_isclear(fmdPollInProg)))
             {
                 if (netStat.bit_isset(recDataFile))
                 {
@@ -685,7 +704,7 @@
                 }
                 if ((net1.sendState==0) || (net1.sendState==5))
                 {
-                    if (netStat.bit_isset(fmdPollReq))
+                    if ((netStat.bit_isset(fmdPollReq)) && (netStat.bit_isset(devOnline)))
                     {
                         if (netStat.bit_isset(fmdOnline))
                         {
@@ -704,7 +723,22 @@
                         netDevTimers[4].reset();
                         netDevTimers[4].start();
                     }
-                    else if (netStat.bit_isset(fmPollReq))
+                    else if (netStat.bit_isset(serPollReq))
+                    {
+                        if (netStat.bit_isset(serEnabled))
+                        {
+                            sendSerCmd(serCmdSeq[netStat.getDevMsgReq()][netStat.getDevMsgPos()],serCmdlen[netStat.getDevMsgReq()][netStat.getDevMsgPos()]);
+                            netStat.bit_toclear(serPollReq);
+                            netStat.bit_toset(serPollInProg);
+                            netDevTimers[5].reset();
+                            netDevTimers[5].start();
+                        }
+                        else
+                        {
+                            netStat.bit_toclear(serPollReq);
+                        }
+                    }
+                    else if ((netStat.bit_isset(fmPollReq)) && (netStat.bit_isset(devOnline)))
                     {
                         if (netStat.bit_isset(fmOnline))
                         {
@@ -723,21 +757,6 @@
                         netDevTimers[4].reset();
                         netDevTimers[4].start();
                     }
-                    else if (netStat.bit_isset(serPollReq))
-                    {
-                        if (netStat.bit_isset(serEnabled))
-                        {
-                            sendSerCmd(serCmdSeq[netStat.getDevMsgReq()][netStat.getDevMsgPos()],serCmdlen[netStat.getDevMsgReq()][netStat.getDevMsgPos()]);
-                            netStat.bit_toclear(serPollReq);
-                            netStat.bit_toset(serPollInProg);
-                            netDevTimers[5].reset();
-                            netDevTimers[5].start();
-                        }
-                        else
-                        {
-                            netStat.bit_toclear(serPollReq);
-                        }
-                    }
                 }
             }
             if ((netStat.bit_isclear(devOnline)) &&  (netStat.bit_isclear(fmCfgInProg)) && (netStat.bit_isset(fmCfgReq)))