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
Diff: main.cpp
- 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(); } }