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

Committer:
masterkookus
Date:
Thu Sep 19 16:48:15 2019 +0000
Revision:
5:c656fd08007b
Parent:
4:98cdccfb17d6
Child:
6:9f97716eae76
Basic Functionality and error checking;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
masterkookus 0:03ab7f7596e2 1 #if !FEATURE_LWIP
masterkookus 0:03ab7f7596e2 2 #error [NOT_SUPPORTED] LWIP not supported for this target
masterkookus 0:03ab7f7596e2 3 #endif
masterkookus 0:03ab7f7596e2 4
masterkookus 0:03ab7f7596e2 5 #include "mbed.h"
masterkookus 0:03ab7f7596e2 6 #include "EthernetInterface.h"
masterkookus 0:03ab7f7596e2 7 #include "TCPServer.h"
masterkookus 0:03ab7f7596e2 8 #include "TCPSocket.h"
masterkookus 0:03ab7f7596e2 9 #include "BufferedSerial.h"
masterkookus 3:ac1f2af8bd0f 10 #include "nettime.h"
masterkookus 3:ac1f2af8bd0f 11 #include "netdevices.h"
masterkookus 5:c656fd08007b 12 #include "platform/CircularBuffer.h"
masterkookus 0:03ab7f7596e2 13
masterkookus 5:c656fd08007b 14 static const char* mbedIp = "10.150.1.242"; //IP
masterkookus 0:03ab7f7596e2 15 static const char* mbedMask = "255.255.255.0"; // Mask
masterkookus 0:03ab7f7596e2 16 static const char* mbedGateway = "10.150.1.245"; //Gateway
masterkookus 0:03ab7f7596e2 17
masterkookus 0:03ab7f7596e2 18 Ticker nettimer[2];
masterkookus 0:03ab7f7596e2 19
masterkookus 5:c656fd08007b 20 struct netsys net1,nets;
masterkookus 1:a57cbebba3fd 21
masterkookus 1:a57cbebba3fd 22 bool polltick;
masterkookus 0:03ab7f7596e2 23
masterkookus 0:03ab7f7596e2 24 BufferedSerial sport0(PD_5, PD_6, 256, 4); // UART2
masterkookus 0:03ab7f7596e2 25
masterkookus 5:c656fd08007b 26 CircularBuffer<char, 256> cmdbuf;
masterkookus 5:c656fd08007b 27
masterkookus 0:03ab7f7596e2 28 Thread conchkthread[2];
masterkookus 4:98cdccfb17d6 29 Thread rxtxdatathread[5];
masterkookus 4:98cdccfb17d6 30
masterkookus 4:98cdccfb17d6 31 unsigned int currenttime=0;
masterkookus 0:03ab7f7596e2 32
masterkookus 5:c656fd08007b 33 nsapi_error_t ret;
masterkookus 5:c656fd08007b 34
masterkookus 2:ec972966689e 35 //Provides the deivce poll timing
masterkookus 1:a57cbebba3fd 36 void heartbeat()
masterkookus 1:a57cbebba3fd 37 {
masterkookus 3:ac1f2af8bd0f 38 //polltick=true;
masterkookus 3:ac1f2af8bd0f 39 setTick(true);
masterkookus 1:a57cbebba3fd 40 }
masterkookus 1:a57cbebba3fd 41
masterkookus 4:98cdccfb17d6 42 void confignetdevices(EthernetInterface *eth)
masterkookus 4:98cdccfb17d6 43 {
masterkookus 4:98cdccfb17d6 44 nets.tcpport=23;
masterkookus 4:98cdccfb17d6 45 nets.eth=eth;
masterkookus 4:98cdccfb17d6 46 nets.isactive=false;
masterkookus 4:98cdccfb17d6 47 nets.closeconnection=false;
masterkookus 4:98cdccfb17d6 48 nets.pollTimeout=200;
masterkookus 4:98cdccfb17d6 49 nets.pollTime=0;
masterkookus 4:98cdccfb17d6 50 nets.pollInterval=200;
masterkookus 5:c656fd08007b 51 nets.clt_sock.set_blocking(false);
masterkookus 4:98cdccfb17d6 52 net1.pollTimeout=50;
masterkookus 5:c656fd08007b 53 net1.srv.set_blocking(false);
masterkookus 4:98cdccfb17d6 54
masterkookus 4:98cdccfb17d6 55 /* Open the server on ethernet stack */
masterkookus 4:98cdccfb17d6 56 net1.srv.open(eth);
masterkookus 4:98cdccfb17d6 57 net1.isactive=false;
masterkookus 4:98cdccfb17d6 58 net1.closeconnection=false;
masterkookus 4:98cdccfb17d6 59
masterkookus 4:98cdccfb17d6 60 /* Bind port 23 to the server */
masterkookus 4:98cdccfb17d6 61 net1.tcpport=23;
masterkookus 4:98cdccfb17d6 62 net1.srv.bind(net1.tcpport);
masterkookus 4:98cdccfb17d6 63
masterkookus 4:98cdccfb17d6 64 /* Can handle 5 simultaneous connections */
masterkookus 4:98cdccfb17d6 65 net1.srv.listen(5);
masterkookus 4:98cdccfb17d6 66 sport0.baud(9600);
masterkookus 4:98cdccfb17d6 67 }
masterkookus 4:98cdccfb17d6 68
masterkookus 4:98cdccfb17d6 69 //Ethernet to Ethernet Send Command
masterkookus 4:98cdccfb17d6 70 void datapolltx(netsys *net2)
masterkookus 0:03ab7f7596e2 71 {
masterkookus 5:c656fd08007b 72 char cchar;
masterkookus 5:c656fd08007b 73 char cbuf[256];
masterkookus 5:c656fd08007b 74 unsigned int clen=0;
masterkookus 5:c656fd08007b 75 unsigned int cbc;
masterkookus 5:c656fd08007b 76 union packer4byte
masterkookus 5:c656fd08007b 77 {
masterkookus 5:c656fd08007b 78 unsigned int cmdint;
masterkookus 5:c656fd08007b 79 char bytes[4];
masterkookus 5:c656fd08007b 80 };
masterkookus 5:c656fd08007b 81 packer4byte cmdpack;
masterkookus 5:c656fd08007b 82
masterkookus 4:98cdccfb17d6 83 while(1)
masterkookus 0:03ab7f7596e2 84 {
masterkookus 5:c656fd08007b 85 while (!cmdbuf.empty())
masterkookus 5:c656fd08007b 86 {
masterkookus 5:c656fd08007b 87 cmdbuf.pop(cchar);
masterkookus 5:c656fd08007b 88 clen++;
masterkookus 5:c656fd08007b 89 cbuf[clen]=cchar;
masterkookus 5:c656fd08007b 90 }
masterkookus 5:c656fd08007b 91 if (clen>3)
masterkookus 5:c656fd08007b 92 {
masterkookus 5:c656fd08007b 93 printf("%d\r\n",clen);
masterkookus 5:c656fd08007b 94 //clen=0;
masterkookus 5:c656fd08007b 95 for (cbc=0;cbc<clen-5;cbc++)
masterkookus 5:c656fd08007b 96 {
masterkookus 5:c656fd08007b 97 cmdpack.bytes[3]=cbuf[cbc];
masterkookus 5:c656fd08007b 98 cmdpack.bytes[2]=cbuf[cbc+1];
masterkookus 5:c656fd08007b 99 cmdpack.bytes[1]=cbuf[cbc+2];
masterkookus 5:c656fd08007b 100 cmdpack.bytes[0]=cbuf[cbc+3];
masterkookus 5:c656fd08007b 101 if (cmdpack.cmdint==0x5469636b)
masterkookus 5:c656fd08007b 102 {
masterkookus 5:c656fd08007b 103 //printf("Tock");
masterkookus 5:c656fd08007b 104 net2->pollTime=net2->pollInterval;
masterkookus 5:c656fd08007b 105 net2->pollState=1;
masterkookus 5:c656fd08007b 106 clen=0;
masterkookus 5:c656fd08007b 107 break;
masterkookus 5:c656fd08007b 108 }
masterkookus 5:c656fd08007b 109 }
masterkookus 5:c656fd08007b 110 }
masterkookus 4:98cdccfb17d6 111 if (net2->isactive)
masterkookus 0:03ab7f7596e2 112 {
masterkookus 5:c656fd08007b 113 while (net2->pollState==3)
masterkookus 5:c656fd08007b 114 {
masterkookus 5:c656fd08007b 115 if (net2->connectRetry == true)
masterkookus 5:c656fd08007b 116 {
masterkookus 5:c656fd08007b 117 wait_ms(100);
masterkookus 5:c656fd08007b 118 }
masterkookus 5:c656fd08007b 119 ret = net2->clt_sock.connect("10.150.1.241",nets.tcpport);
masterkookus 5:c656fd08007b 120 if (ret==0)
masterkookus 5:c656fd08007b 121 {
masterkookus 5:c656fd08007b 122 net2->connectRetry = false;
masterkookus 5:c656fd08007b 123 printf("Connected %d\r\n",ret);
masterkookus 5:c656fd08007b 124 net2->closeconnection=true;
masterkookus 5:c656fd08007b 125 net2->pollState=4;
masterkookus 5:c656fd08007b 126 }
masterkookus 5:c656fd08007b 127 else
masterkookus 5:c656fd08007b 128 {
masterkookus 5:c656fd08007b 129 net2->connectRetry = true;
masterkookus 5:c656fd08007b 130 net2->pollRetryCount++;
masterkookus 5:c656fd08007b 131 printf("Connect Attempt Failed, Code: %d\r\n",ret);
masterkookus 5:c656fd08007b 132 if (net2->pollRetryCount>3)
masterkookus 5:c656fd08007b 133 {
masterkookus 5:c656fd08007b 134 printf("Communication Failed, Closing\r\n");
masterkookus 5:c656fd08007b 135 net2->connectRetry = false;
masterkookus 5:c656fd08007b 136 net2->pollRetryCount = 0;
masterkookus 5:c656fd08007b 137 net2->messageFailCount++;
masterkookus 5:c656fd08007b 138 net2->closeconnection=true;
masterkookus 5:c656fd08007b 139 net2->pollState=0;
masterkookus 5:c656fd08007b 140 }
masterkookus 5:c656fd08007b 141 }
masterkookus 5:c656fd08007b 142 }
masterkookus 5:c656fd08007b 143 while (net2->pollState==4)
masterkookus 5:c656fd08007b 144 {
masterkookus 5:c656fd08007b 145 if (net2->sendRetry == true)
masterkookus 5:c656fd08007b 146 {
masterkookus 5:c656fd08007b 147 wait_ms(100);
masterkookus 5:c656fd08007b 148 }
masterkookus 5:c656fd08007b 149 ret = net2->clt_sock.send("Tock\r\n",strlen("Tock\r\n"));
masterkookus 5:c656fd08007b 150 if (ret>=0)
masterkookus 5:c656fd08007b 151 {
masterkookus 5:c656fd08007b 152 printf("Send Result %d\r\n",ret);
masterkookus 5:c656fd08007b 153 net2->sendRetry = false;
masterkookus 5:c656fd08007b 154 net2->txMessageCount++;
masterkookus 5:c656fd08007b 155 net2->closeconnection=true;
masterkookus 5:c656fd08007b 156 net2->pollState=0;
masterkookus 5:c656fd08007b 157 }
masterkookus 5:c656fd08007b 158 else
masterkookus 5:c656fd08007b 159 {
masterkookus 5:c656fd08007b 160 net2->sendRetry = true;
masterkookus 5:c656fd08007b 161 net2->pollRetryCount++;
masterkookus 5:c656fd08007b 162 printf("Send Attempt Failed, Code: %d\r\n",ret);
masterkookus 5:c656fd08007b 163 if (net2->pollRetryCount>3)
masterkookus 5:c656fd08007b 164 {
masterkookus 5:c656fd08007b 165 printf("Communication Failed, Closing\r\n");
masterkookus 5:c656fd08007b 166 net2->sendRetry = false;
masterkookus 5:c656fd08007b 167 net2->pollRetryCount = 0;
masterkookus 5:c656fd08007b 168 net2->messageFailCount++;
masterkookus 5:c656fd08007b 169 net2->closeconnection=true;
masterkookus 5:c656fd08007b 170 net2->pollState=0;
masterkookus 5:c656fd08007b 171 }
masterkookus 5:c656fd08007b 172 }
masterkookus 5:c656fd08007b 173 }
masterkookus 5:c656fd08007b 174 if (net2->closeconnection==true)
masterkookus 5:c656fd08007b 175 {
masterkookus 5:c656fd08007b 176 net2->clt_sock.close();
masterkookus 5:c656fd08007b 177 net2->isactive=false;
masterkookus 5:c656fd08007b 178 }
masterkookus 0:03ab7f7596e2 179 }
masterkookus 0:03ab7f7596e2 180 }
masterkookus 0:03ab7f7596e2 181 }
masterkookus 0:03ab7f7596e2 182
masterkookus 2:ec972966689e 183 //Ethernet to Serial transmit data
masterkookus 0:03ab7f7596e2 184 void datanrx(netsys *net2)
masterkookus 0:03ab7f7596e2 185 {
masterkookus 0:03ab7f7596e2 186 char rxbuf[256];
masterkookus 0:03ab7f7596e2 187 int rxlen=0;
masterkookus 5:c656fd08007b 188 int rxc;
masterkookus 0:03ab7f7596e2 189 while (1)
masterkookus 0:03ab7f7596e2 190 {
masterkookus 0:03ab7f7596e2 191 while (net2->isactive)
masterkookus 0:03ab7f7596e2 192 {
masterkookus 0:03ab7f7596e2 193 rxlen=net2->clt_sock.recv(rxbuf, sizeof(rxbuf));
masterkookus 4:98cdccfb17d6 194 if (rxlen>0)
masterkookus 4:98cdccfb17d6 195 {
masterkookus 4:98cdccfb17d6 196 net2->aliveTime=0;
masterkookus 4:98cdccfb17d6 197 sport0.write(rxbuf,rxlen);
masterkookus 5:c656fd08007b 198 for (rxc = 0;rxc<rxlen;rxc++)
masterkookus 5:c656fd08007b 199 {
masterkookus 5:c656fd08007b 200 cmdbuf.push(rxbuf[rxc]);
masterkookus 5:c656fd08007b 201 }
masterkookus 5:c656fd08007b 202 net2->rxMessageCount++;
masterkookus 4:98cdccfb17d6 203 }
masterkookus 0:03ab7f7596e2 204 }
masterkookus 0:03ab7f7596e2 205 }
masterkookus 0:03ab7f7596e2 206 }
masterkookus 0:03ab7f7596e2 207
masterkookus 2:ec972966689e 208 //Ethernet to Serial receive data
masterkookus 0:03ab7f7596e2 209 void datasrx(netsys *net2)
masterkookus 0:03ab7f7596e2 210 {
masterkookus 0:03ab7f7596e2 211 char rxbuf[256];
masterkookus 0:03ab7f7596e2 212 int rxlen=0;
masterkookus 0:03ab7f7596e2 213 int rxc;
masterkookus 0:03ab7f7596e2 214 while (1)
masterkookus 0:03ab7f7596e2 215 {
masterkookus 0:03ab7f7596e2 216 while (net2->isactive)
masterkookus 0:03ab7f7596e2 217 {
masterkookus 0:03ab7f7596e2 218 rxlen=sport0.readable();
masterkookus 0:03ab7f7596e2 219 if (rxlen>0)
masterkookus 0:03ab7f7596e2 220 {
masterkookus 0:03ab7f7596e2 221 for (rxc = 0;rxc<rxlen;rxc++)
masterkookus 0:03ab7f7596e2 222 {
masterkookus 0:03ab7f7596e2 223 rxbuf[rxc] = sport0.getc();
masterkookus 0:03ab7f7596e2 224 }
masterkookus 4:98cdccfb17d6 225 net2->aliveTime=0;
masterkookus 0:03ab7f7596e2 226 net2->clt_sock.send(rxbuf, rxlen);
masterkookus 0:03ab7f7596e2 227 }
masterkookus 0:03ab7f7596e2 228 }
masterkookus 0:03ab7f7596e2 229 }
masterkookus 0:03ab7f7596e2 230 }
masterkookus 0:03ab7f7596e2 231
masterkookus 2:ec972966689e 232 //Checks for a Ethernet to Serial connection
masterkookus 0:03ab7f7596e2 233 void conchk(netsys *net2)
masterkookus 0:03ab7f7596e2 234 {
masterkookus 0:03ab7f7596e2 235 TCPServer *server=&(net2->srv);
masterkookus 0:03ab7f7596e2 236 TCPSocket *client_socket=&(net2->clt_sock);
masterkookus 0:03ab7f7596e2 237 SocketAddress *client_address=&(net2->clt_addr);
masterkookus 0:03ab7f7596e2 238
masterkookus 0:03ab7f7596e2 239 while(1)
masterkookus 0:03ab7f7596e2 240 {
masterkookus 5:c656fd08007b 241 while (server->accept(client_socket, client_address) < 0)
masterkookus 0:03ab7f7596e2 242 {
masterkookus 5:c656fd08007b 243 //printf("Connection Failed.\r\n");
masterkookus 0:03ab7f7596e2 244 }
masterkookus 5:c656fd08007b 245 printf("Server Port %d\r\n", net2->tcpport);
masterkookus 5:c656fd08007b 246 printf("accept %s:%d\r\n", client_address->get_ip_address(), client_address->get_port());
masterkookus 5:c656fd08007b 247 net2->aliveTime=0;
masterkookus 5:c656fd08007b 248 net2->isactive=true;
masterkookus 0:03ab7f7596e2 249 }
masterkookus 0:03ab7f7596e2 250 }
masterkookus 0:03ab7f7596e2 251
masterkookus 0:03ab7f7596e2 252 int main()
masterkookus 0:03ab7f7596e2 253 {
masterkookus 0:03ab7f7596e2 254 EthernetInterface eth;
masterkookus 0:03ab7f7596e2 255 eth.set_network(mbedIp,mbedMask,mbedGateway); //Use these parameters for static IP
masterkookus 0:03ab7f7596e2 256 eth.connect();
masterkookus 0:03ab7f7596e2 257
masterkookus 0:03ab7f7596e2 258 printf("The target IP address is '%s'\r\n", eth.get_ip_address());
masterkookus 4:98cdccfb17d6 259 confignetdevices(&eth);
masterkookus 2:ec972966689e 260 /* Setup Ethernet to Serial Connection Thread */
masterkookus 0:03ab7f7596e2 261 conchkthread[0].start(callback(conchk,&net1));
masterkookus 2:ec972966689e 262 /* Setup polltick Ticker */
masterkookus 3:ac1f2af8bd0f 263 nettimer[1].attach_us(heartbeat,10000);
masterkookus 2:ec972966689e 264 /* Setup Ethernet to Serial transmit data Thread */
masterkookus 0:03ab7f7596e2 265 rxtxdatathread[0].start(callback(datanrx,&net1));
masterkookus 2:ec972966689e 266 /* Setup Ethernet to Serial receive data Thread */
masterkookus 0:03ab7f7596e2 267 rxtxdatathread[1].start(callback(datasrx,&net1));
masterkookus 4:98cdccfb17d6 268 rxtxdatathread[2].start(callback(datapolltx,&nets));
masterkookus 3:ac1f2af8bd0f 269
masterkookus 0:03ab7f7596e2 270 while (true) {
masterkookus 3:ac1f2af8bd0f 271
masterkookus 3:ac1f2af8bd0f 272 polltick=getTick();
masterkookus 3:ac1f2af8bd0f 273
masterkookus 3:ac1f2af8bd0f 274 if (polltick)
masterkookus 3:ac1f2af8bd0f 275 {
masterkookus 3:ac1f2af8bd0f 276 setTick(false);
masterkookus 3:ac1f2af8bd0f 277 incTime();
masterkookus 3:ac1f2af8bd0f 278 currenttime=getTime();
masterkookus 4:98cdccfb17d6 279 nets.pollTime++;
masterkookus 4:98cdccfb17d6 280 if (net1.isactive)
masterkookus 0:03ab7f7596e2 281 {
masterkookus 4:98cdccfb17d6 282 net1.aliveTime++;
masterkookus 4:98cdccfb17d6 283 if (net1.aliveTime>net1.pollTimeout)
masterkookus 4:98cdccfb17d6 284 {
masterkookus 4:98cdccfb17d6 285 printf("Closed\r\n");
masterkookus 4:98cdccfb17d6 286 net1.clt_sock.close();
masterkookus 4:98cdccfb17d6 287 net1.isactive=false;
masterkookus 4:98cdccfb17d6 288 net1.closeconnection=false;
masterkookus 4:98cdccfb17d6 289 }
masterkookus 4:98cdccfb17d6 290
masterkookus 0:03ab7f7596e2 291 }
masterkookus 4:98cdccfb17d6 292 if (nets.pollTime >= nets.pollInterval)
masterkookus 4:98cdccfb17d6 293 {
masterkookus 5:c656fd08007b 294 switch (nets.pollState)
masterkookus 5:c656fd08007b 295 {
masterkookus 5:c656fd08007b 296 case 1:
masterkookus 5:c656fd08007b 297
masterkookus 5:c656fd08007b 298 ret=nets.clt_sock.open(&eth);
masterkookus 5:c656fd08007b 299 printf("Socket%d\r\n",ret);
masterkookus 5:c656fd08007b 300 if (ret < 0)
masterkookus 5:c656fd08007b 301 {
masterkookus 5:c656fd08007b 302 nets.pollRetry = true;
masterkookus 5:c656fd08007b 303 nets.pollRetryCount=0;
masterkookus 5:c656fd08007b 304 nets.pollState=2;
masterkookus 5:c656fd08007b 305 nets.pollTime=nets.pollInterval-10;
masterkookus 5:c656fd08007b 306 break;
masterkookus 5:c656fd08007b 307 }
masterkookus 5:c656fd08007b 308 nets.pollState=3;
masterkookus 5:c656fd08007b 309 nets.pollTime=0;
masterkookus 5:c656fd08007b 310 nets.isactive=true;
masterkookus 5:c656fd08007b 311 break;
masterkookus 5:c656fd08007b 312 case 2:
masterkookus 5:c656fd08007b 313 ret=nets.clt_sock.open(&eth);
masterkookus 5:c656fd08007b 314 printf("Socket%d\r\n",ret);
masterkookus 5:c656fd08007b 315 if (ret < 0)
masterkookus 5:c656fd08007b 316 {
masterkookus 5:c656fd08007b 317 nets.pollRetry = true;
masterkookus 5:c656fd08007b 318 nets.pollRetryCount++;
masterkookus 5:c656fd08007b 319 nets.pollTime=nets.pollInterval-10;
masterkookus 5:c656fd08007b 320 printf("Attach Attempt Failed, Code: %d\r\n",ret);
masterkookus 5:c656fd08007b 321 if (nets.pollRetryCount>3)
masterkookus 5:c656fd08007b 322 {
masterkookus 5:c656fd08007b 323 printf("Communication Failed, Closing\r\n");
masterkookus 5:c656fd08007b 324 nets.pollRetry = false;
masterkookus 5:c656fd08007b 325 nets.pollRetryCount = 0;
masterkookus 5:c656fd08007b 326 nets.messageFailCount++;
masterkookus 5:c656fd08007b 327 nets.pollState=0;
masterkookus 5:c656fd08007b 328 nets.pollTime=0;
masterkookus 5:c656fd08007b 329 }
masterkookus 5:c656fd08007b 330 break;
masterkookus 5:c656fd08007b 331 }
masterkookus 5:c656fd08007b 332 nets.pollState=0;
masterkookus 5:c656fd08007b 333 nets.pollRetry = false;
masterkookus 5:c656fd08007b 334 nets.pollTime=0;
masterkookus 5:c656fd08007b 335 nets.isactive=true;
masterkookus 5:c656fd08007b 336 break;
masterkookus 5:c656fd08007b 337 default:
masterkookus 5:c656fd08007b 338 break;
masterkookus 5:c656fd08007b 339 }
masterkookus 4:98cdccfb17d6 340 }
masterkookus 1:a57cbebba3fd 341 }
masterkookus 0:03ab7f7596e2 342 }
masterkookus 0:03ab7f7596e2 343 }