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 Sep 23 12:29:52 2019 +0000
Parent:
6:9f97716eae76
Child:
8:fa2a2c3a16ce
Commit message:
Defines for operation in header, basic functionality complete

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
netdevices.cpp Show diff for this revision Revisions of this file
netdevices.h Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Thu Sep 19 18:14:31 2019 +0000
+++ b/main.cpp	Mon Sep 23 12:29:52 2019 +0000
@@ -9,21 +9,20 @@
 #include "BufferedSerial.h"
 #include "nettime.h"
 #include "netdevices.h"
+#include "mydevices.h"
 #include "platform/CircularBuffer.h"
 
-static const char*          mbedIp       = "10.150.1.242";  //IP
-static const char*          mbedMask     = "255.255.255.0";  // Mask
-static const char*          mbedGateway  = "10.150.1.245";    //Gateway
-
-Ticker nettimer[2];
+Ticker nettimer;
 
 struct netsys net1;
 
 bool polltick;
 
-BufferedSerial sport0(PD_5, PD_6, 256, 4);    // UART2
+BufferedSerial sport0(sport0tx, sport0rx, sport0buff, sport0mult);    // UART2
 
-CircularBuffer<char, 256> cmdbuf;
+CircularBuffer<char, 1024> receiveBuffer;
+CircularBuffer<char, 64> sendLength;
+CircularBuffer<char, 1024> sendBuffer;
 
 Thread conchkthread[2];
 Thread rxtxdatathread[5];
@@ -41,16 +40,20 @@
 
 void confignetdevices(EthernetInterface *eth)
 {   
-    net1.cltPort=23;
-    net1.srv_addr="10.150.1.241";
+    net1.cltPort=setclientport;
+    net1.srv_addr=setclientaddress;
     net1.cltIsActive=false;
     net1.cltCloseConnection=false;
-    net1.pollTimeout=200;
+    net1.pollTimeout=setpolltimeout;
     net1.pollTime=0;
-    net1.pollInterval=200;
+    net1.pollInterval=setpollinterval;
+    net1.pollRequestSent=false;
+    net1.pollResponseReceived=false;
     net1.srv_sock.set_blocking(false);
-    net1.aliveTimeout=50;
+    net1.aliveTimeout=setservertimeout;
     net1.srv.set_blocking(false);
+    net1.pollEnabled=setpollenabled;
+    net1.pollTimeoutCount=0;
     
     /* Open the server on ethernet stack */
     net1.srv.open(eth);
@@ -58,17 +61,19 @@
     net1.srvCloseConnection=false;
     
     /* Bind port 23 to the server */
-    net1.srvPort=23;
+    net1.srvPort=setserverport;
     net1.srv.bind(net1.srvPort);
     
     /* Can handle 5 simultaneous connections */
     net1.srv.listen(5);
-    sport0.baud(9600);
+    sport0.baud(sport0baud);
 }
 
-//Ethernet to Ethernet Send Command
-void datapolltx(netsys *net2)
+void dataprocess(netsys *net2)
 {
+    char* tstcmd = "Tock\r\n";
+    char tstlen;
+    int txc;
     char cchar;
     char cbuf[256];
     unsigned int clen=0;
@@ -82,35 +87,62 @@
     
     while(1)
     {
-        while (!cmdbuf.empty())
+        while (!receiveBuffer.empty())
         {
-            cmdbuf.pop(cchar);
+            receiveBuffer.pop(cchar);
             clen++;
             cbuf[clen]=cchar;
         }
+        if (net2->pollRequestSent)
+        {
+            if (clen>0)
+            {
+                net2->pollResponseReceived=true;
+            }
+        }
         if (clen>3)
         {
-            printf("%d\r\n",clen);
-            //clen=0;
-            for (cbc=0;cbc<clen-5;cbc++)
+            for (cbc=0;cbc<clen-3;cbc++)
             {
+                printf("Length: %d\r\n",clen);
+                printf("%c%c%c%c\r\n",cbuf[cbc],cbuf[cbc+1],cbuf[cbc+2],cbuf[cbc+3]);
                 cmdpack.bytes[3]=cbuf[cbc];
                 cmdpack.bytes[2]=cbuf[cbc+1];
                 cmdpack.bytes[1]=cbuf[cbc+2];
                 cmdpack.bytes[0]=cbuf[cbc+3];
                 if (cmdpack.cmdint==0x5469636b)
                 {
-                    printf("Tock");
-                    net2->pollTime=net2->pollInterval;
-                    net2->pollState=1;
+                    tstlen=strlen(tstcmd);
+                    sendLength.push(tstlen);
+                    for (txc=0;txc<6;txc++)
+                    {
+                        sendBuffer.push(tstcmd[txc]);
+                    }
+                    if (net2->sendState==0)
+                    {
+                        net2->sendState=1;
+                    }
                     clen=0;
                     break;
                 }
             }
-        }    
+            if (clen>0)
+            {
+                printf("Command not Received\r\n");
+                clen=0;
+            }
+        }
+    }
+}
+
+//Ethernet to Ethernet Send Data
+void datantx(netsys *net2)
+{
+    while(1)
+    {
         if (net2->cltIsActive)
         {
-            while (net2->pollState==3)
+            while (net2->sendState==3)
             {
                 if (net2->connectRetry == true)
                 {
@@ -122,52 +154,55 @@
                     net2->connectRetry = false;
                     printf("Connected %d\r\n",ret);
                     net2->cltCloseConnection=true;
-                    net2->pollState=4;
+                    net2->sendState=4;
                 }
                 else
                 {
                     net2->connectRetry = true;
-                    net2->pollRetryCount++;
+                    net2->sendRetryCount++;
                     printf("Connect Attempt Failed, Code: %d\r\n",ret);
-                    if (net2->pollRetryCount>3)
+                    if (net2->sendRetryCount>3)
                     {
                         printf("Communication Failed, Closing\r\n");
                         net2->connectRetry = false;
-                        net2->pollRetryCount = 0;
+                        net2->sendRetryCount = 0;
                         net2->messageFailCount++;
                         net2->cltCloseConnection=true;
-                        net2->pollState=0;
+                        net2->sendState=0;
+                        net2->sendTime=0;
                     }
                 }
             }
-            while (net2->pollState==4)
+            while (net2->sendState==4)
             {
                 if (net2->sendRetry == true)
                 {
                     wait_ms(100);
                 }
-                ret = net2->srv_sock.send("Tock\r\n",strlen("Tock\r\n"));
+                ret = net2->srv_sock.send(net2->sendString,net2->sendLen);
                 if (ret>=0)
                 {
                     printf("Send Result %d\r\n",ret);
                     net2->sendRetry = false;
                     net2->txMessageCount++;
                     net2->cltCloseConnection=true;
-                    net2->pollState=0;
+                    net2->sendState=0;
+                    net2->sendTime=0;
                 }
                 else
                 {
                     net2->sendRetry = true;
-                    net2->pollRetryCount++;
+                    net2->sendRetryCount++;
                     printf("Send Attempt Failed, Code: %d\r\n",ret);
-                    if (net2->pollRetryCount>3)
+                    if (net2->sendRetryCount>3)
                     {
                         printf("Communication Failed, Closing\r\n");
                         net2->sendRetry = false;
-                        net2->pollRetryCount = 0;
+                        net2->sendRetryCount = 0;
                         net2->messageFailCount++;
                         net2->cltCloseConnection=true;
-                        net2->pollState=0;
+                        net2->sendState=0;
+                        net2->sendTime=0;
                     }
                 }
             }
@@ -180,7 +215,7 @@
     }
 }
 
-//Ethernet to Serial transmit data
+//Ethernet receive data and send to aux devices (serial, etc...)
 void datanrx(netsys *net2)
 {
     char rxbuf[256];
@@ -197,7 +232,7 @@
                 sport0.write(rxbuf,rxlen);
                 for (rxc = 0;rxc<rxlen;rxc++)
                 {
-                    cmdbuf.push(rxbuf[rxc]);
+                    receiveBuffer.push(rxbuf[rxc]);
                 }
                 net2->rxMessageCount++;
             }
@@ -205,7 +240,7 @@
     }
 }
 
-//Ethernet to Serial receive data
+//Serial device to server connected client
 void datasrx(netsys *net2)
 {
     char rxbuf[256];
@@ -253,7 +288,7 @@
 int main()
 {
     EthernetInterface eth;
-    eth.set_network(mbedIp,mbedMask,mbedGateway); //Use  these parameters for static IP
+    eth.set_network(setseveraddress,setsevermask,setsevergateway); //Use  these parameters for static IP
     eth.connect();
     
     printf("The target IP address is '%s'\r\n", eth.get_ip_address());
@@ -261,12 +296,18 @@
     /* Setup Ethernet to Serial Connection Thread */
     conchkthread[0].start(callback(conchk,&net1));
     /* Setup polltick Ticker */
-    nettimer[1].attach_us(heartbeat,10000);
+    nettimer.attach_us(heartbeat,10000);
     /* Setup Ethernet to Serial transmit data Thread */
     rxtxdatathread[0].start(callback(datanrx,&net1));
     /* Setup Ethernet to Serial receive data Thread */
     rxtxdatathread[1].start(callback(datasrx,&net1));
-    rxtxdatathread[2].start(callback(datapolltx,&net1));
+    rxtxdatathread[2].start(callback(datantx,&net1));
+    rxtxdatathread[3].start(callback(dataprocess,&net1));
+    
+    char* tstcmd = "Tick\r\n";
+    char tstlen;
+    unsigned int txc;
+    unsigned int sxc;
     
     while (true) {
         
@@ -278,6 +319,7 @@
             incTime();
             currenttime=getTime();
             net1.pollTime++;
+            net1.sendTime++;
             if (net1.srvIsActive)
             {
                 net1.aliveTime++;
@@ -290,24 +332,64 @@
                 }
                 
             }
-            if (net1.pollTime >= net1.pollInterval)
+            if (net1.pollEnabled)
             {
-                switch (net1.pollState)
+                if (net1.pollTime >= net1.pollInterval)
+                {
+                    tstlen=strlen(tstcmd);
+                    sendLength.push(tstlen);
+                    for (txc=0;txc<tstlen;txc++)
+                    {
+                        sendBuffer.push(tstcmd[txc]);
+                    }
+                    if (net1.sendState==0)
+                    {
+                        net1.sendState=1;
+                        net1.pollRequestSent=true;
+                    }
+                    net1.pollTime=0;
+                }
+                if (net1.pollTime >= net1.pollTimeout)
+                {
+                    if (net1.pollRequestSent)
+                    {
+                        if (net1.pollResponseReceived==false)
+                        {
+                            net1.pollTimeoutCount++;
+                            net1.pollRequestSent=false;
+                        }
+                    }
+                }
+            }
+            if (net1.sendTime == 10)
+            {
+                switch (net1.sendState)
                 {
                     case 1:
-                        
+                        if (!sendLength.empty())
+                        {
+                            sendLength.pop(net1.sendLen);
+                            for (sxc=0;sxc<net1.sendLen;sxc++)
+                            {
+                                sendBuffer.pop(net1.sendString[sxc]);
+                            }
+                        }
+                        else
+                        {
+                            net1.sendState=0;
+                        }
                         ret=net1.srv_sock.open(&eth);
                         printf("Socket%d\r\n",ret);
                         if (ret < 0)
                         {
-                            net1.pollRetry = true;
-                            net1.pollRetryCount=0;
-                            net1.pollState=2;
-                            net1.pollTime=net1.pollInterval-10;
+                            net1.attachRetry = true;
+                            net1.sendRetryCount=0;
+                            net1.sendState=2;
+                            net1.sendTime=0;
                             break;
                         }
-                        net1.pollState=3;
-                        net1.pollTime=0;
+                        net1.sendState=3;
+                        net1.sendTime=11;
                         net1.cltIsActive=true;
                         break;
                     case 2:
@@ -315,27 +397,32 @@
                         printf("Socket%d\r\n",ret);
                         if (ret < 0)
                         {
-                            net1.pollRetry = true;
-                            net1.pollRetryCount++;
-                            net1.pollTime=net1.pollInterval-10;
+                            net1.attachRetry = true;
+                            net1.sendRetryCount++;
+                            net1.sendTime=0;
                             printf("Attach Attempt Failed, Code: %d\r\n",ret);
-                            if (net1.pollRetryCount>3)
+                            if (net1.sendRetryCount>3)
                             {
                                 printf("Communication Failed, Closing\r\n");
-                                net1.pollRetry = false;
-                                net1.pollRetryCount = 0;
+                                net1.attachRetry = false;
+                                net1.sendRetryCount = 0;
                                 net1.messageFailCount++;
-                                net1.pollState=0;
-                                net1.pollTime=0;
+                                net1.sendState=0;
+                                net1.sendTime=0;
                             }
                             break;
                         }
-                        net1.pollState=0;
-                        net1.pollRetry = false;
-                        net1.pollTime=0;
+                        net1.sendState=0;
+                        net1.attachRetry = false;
+                        net1.sendTime=11;
                         net1.cltIsActive=true;
                         break;
                     default:
+                        net1.sendTime=0;
+                        if (!sendLength.empty())
+                        {
+                            net1.sendState=1;
+                        }
                         break;
                 }
             }
--- a/mydevices.h	Thu Sep 19 18:14:31 2019 +0000
+++ b/mydevices.h	Mon Sep 23 12:29:52 2019 +0000
@@ -1,68 +1,19 @@
-#define numservers 1
-#define numclients 1
-#define numserial 1
-
-/*Comment out to disable http*/
-#define httpserver
-
-/*Server 1 Information*/
-#define s1tcpport 23
-#define s1timeout 30
-#define s1sport true
-
-/*Server 2 Information*/
-#define s2tcpport 0
-#define s2timeout 0
-#define s2sport false
-
-/*Server 3 Information*/
-#define s3tcpport 0
-#define s3timeout 0
-#define s3sport false
+/*Client Information*/
+#define setclientport 23
+#define setclientaddress "10.150.1.242"
+#define setpolltimeout 200
+#define setpollinterval 500
+#define setpollenabled true
 
-/*Server 4 Information*/
-#define s4tcpport 0
-#define s4timeout 0
-#define s4sport false
-
-/*Client 1 Information*/
-#define c1tcpport 23000
-#define claddress "10.150.1.245"
-#define c1polltimeout 200
-#define c1pollinterval 500
-
-/*Client 2 Information*/
-#define c2tcpport 0
-#define c2address "0.0.0.0"
-#define c2polltimeout 0
-#define c2pollinterval 0
-
-/*Client 3 Information*/
-#define c3tcpport 0
-#define c3address "0.0.0.0"
-#define c3polltimeout 0
-#define c3pollinterval 0
-
-/*Client 4 Information*/
-#define c4tcpport 0
-#define c4address "0.0.0.0"
-#define c4polltimeout 0
-#define c4pollinterval 0
+#define setserverport 23
+#define setseveraddress  "10.150.1.241"
+#define setsevermask  "255.255.255.0"
+#define setsevergateway  "10.150.1.245"
+#define setservertimeout 50
 
 /*Serial Port Information*/
 #define sport0rx PD_6
 #define sport0tx PD_5
 #define sport0buff 256
-#define sport0baud 9600
-#define sport1rx
-#define sport1tx
-#define sport0buff 256
-#define sport0baud 9600
-#define sport2rx
-#define sport2tx
-#define sport0buff 256
-#define sport0baud 9600
-#define sport3rx
-#define sport3tx
-#define sport0buff 256
+#define sport0mult 4
 #define sport0baud 9600
\ No newline at end of file
--- a/netdevices.cpp	Thu Sep 19 18:14:31 2019 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-/*void confignetdevices(void)
-{    
-    nets.netType=1;
-    nets.tcpport=23000;
-    nets.isactive=false;
-    nets.closeconnection=false;
-    nets.sockalivetime=0;
-    nets.deviceState=0;
-    nets.pollTimeout=2000;
-    nets.pollTime=0;
-}*/
\ No newline at end of file
--- a/netdevices.h	Thu Sep 19 18:14:31 2019 +0000
+++ b/netdevices.h	Mon Sep 23 12:29:52 2019 +0000
@@ -22,20 +22,31 @@
     char* srv_addr;
     bool cltIsActive;
     bool cltCloseConnection;
+    bool pollEnabled;
+    bool pollRequestSent;
+    bool pollResponseReceived;
     unsigned int pollTimeout;
     unsigned int pollTime;
     unsigned int pollInterval;
-    unsigned int pollState;
+    unsigned int pollTimeoutCount;
+    unsigned int sendTimeout;
+    unsigned int sendTime;
+    unsigned int sendInterval;
+    unsigned int sendState;
     
-    bool pollRetry;
+    unsigned int deivceType;
+    
+    bool attachRetry;
     bool sendRetry;
     bool connectRetry;
-    unsigned int pollRetryCount;
-    unsigned int attachFailCount;
     unsigned int sendRetryCount;
     unsigned int messageFailCount;
     unsigned int txMessageCount;
     unsigned int rxMessageCount;
+    unsigned int deviceConfig;
+    
+    char sendString[256];
+    char sendLen;
 };
 
 #endif
\ No newline at end of file