The goal of this software is to automatically generate C/C++ code which reads and writes GOOSE and Sampled Value packets. Any valid IEC 61850 Substation Configuration Description (SCD) file, describing GOOSE and/or SV communications, can be used as the input. The output code is lightweight and platform-independent, so it can run on a variety of devices, including low-cost microcontrollers. It\'s ideal for rapid-prototyping new protection and control systems that require communications. This mbed project is a simple example of this functionality. Other code: https://github.com/stevenblair/rapid61850 Project homepage: http://personal.strath.ac.uk/steven.m.blair/

Committer:
sblair
Date:
Fri Oct 07 13:48:18 2011 +0000
Revision:
1:9399d44c2b1a
Parent:
0:230c10b228ea

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sblair 1:9399d44c2b1a 1 /**
sblair 1:9399d44c2b1a 2 * Rapid-prototyping protection schemes with IEC 61850
sblair 1:9399d44c2b1a 3 *
sblair 1:9399d44c2b1a 4 * Copyright (c) 2011 Steven Blair
sblair 1:9399d44c2b1a 5 *
sblair 1:9399d44c2b1a 6 * This program is free software; you can redistribute it and/or
sblair 1:9399d44c2b1a 7 * modify it under the terms of the GNU General Public License
sblair 1:9399d44c2b1a 8 * as published by the Free Software Foundation; either version 2
sblair 1:9399d44c2b1a 9 * of the License, or (at your option) any later version.
sblair 1:9399d44c2b1a 10
sblair 1:9399d44c2b1a 11 * This program is distributed in the hope that it will be useful,
sblair 1:9399d44c2b1a 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
sblair 1:9399d44c2b1a 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
sblair 1:9399d44c2b1a 14 * GNU General Public License for more details.
sblair 1:9399d44c2b1a 15
sblair 1:9399d44c2b1a 16 * You should have received a copy of the GNU General Public License
sblair 1:9399d44c2b1a 17 * along with this program; if not, write to the Free Software
sblair 1:9399d44c2b1a 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
sblair 1:9399d44c2b1a 19 */
sblair 1:9399d44c2b1a 20
sblair 0:230c10b228ea 21 #ifndef DATATYPES_H
sblair 0:230c10b228ea 22 #define DATATYPES_H
sblair 0:230c10b228ea 23
sblair 0:230c10b228ea 24 #ifdef __cplusplus /* If this is a C++ compiler, use C linkage */
sblair 0:230c10b228ea 25 extern "C" {
sblair 0:230c10b228ea 26 #endif
sblair 0:230c10b228ea 27
sblair 0:230c10b228ea 28 #include "ctypes.h"
sblair 0:230c10b228ea 29
sblair 1:9399d44c2b1a 30 // enums
sblair 1:9399d44c2b1a 31 enum ACDdir {
sblair 1:9399d44c2b1a 32 ACDDIR_UNKNOWN,
sblair 1:9399d44c2b1a 33 ACDDIR_FORWARD,
sblair 1:9399d44c2b1a 34 ACDDIR_BACKWARD,
sblair 1:9399d44c2b1a 35 ACDDIR_BOTH
sblair 1:9399d44c2b1a 36 };
sblair 1:9399d44c2b1a 37 enum seqT {
sblair 1:9399d44c2b1a 38 SEQT_POS_NEG_ZERO,
sblair 1:9399d44c2b1a 39 SEQT_DIR_QUAD_ZERO
sblair 1:9399d44c2b1a 40 };
sblair 1:9399d44c2b1a 41 enum Dbpos {
sblair 1:9399d44c2b1a 42 DBPOS_INTERMEDIATE,
sblair 1:9399d44c2b1a 43 DBPOS_OFF,
sblair 1:9399d44c2b1a 44 DBPOS_ON,
sblair 1:9399d44c2b1a 45 DBPOS_BAD
sblair 1:9399d44c2b1a 46 };
sblair 1:9399d44c2b1a 47 enum Tcmd {
sblair 1:9399d44c2b1a 48 TCMD_STOP,
sblair 1:9399d44c2b1a 49 TCMD_LOWER,
sblair 1:9399d44c2b1a 50 TCMD_HIGHER,
sblair 1:9399d44c2b1a 51 TCMD_RESERVED
sblair 1:9399d44c2b1a 52 };
sblair 1:9399d44c2b1a 53 enum Beh {
sblair 1:9399d44c2b1a 54 BEH_ON,
sblair 1:9399d44c2b1a 55 BEH_BLOCKED,
sblair 1:9399d44c2b1a 56 BEH_TEST,
sblair 1:9399d44c2b1a 57 BEH_TEST_BLOCKED,
sblair 1:9399d44c2b1a 58 BEH_OFF
sblair 1:9399d44c2b1a 59 };
sblair 1:9399d44c2b1a 60 enum Mod {
sblair 1:9399d44c2b1a 61 MOD_ON,
sblair 1:9399d44c2b1a 62 MOD_BLOCKED,
sblair 1:9399d44c2b1a 63 MOD_TEST,
sblair 1:9399d44c2b1a 64 MOD_TEST_BLOCKED,
sblair 1:9399d44c2b1a 65 MOD_OFF
sblair 1:9399d44c2b1a 66 };
sblair 1:9399d44c2b1a 67 enum Health {
sblair 1:9399d44c2b1a 68 HEALTH_OK,
sblair 1:9399d44c2b1a 69 HEALTH_WARNING,
sblair 1:9399d44c2b1a 70 HEALTH_ALARM
sblair 1:9399d44c2b1a 71 };
sblair 1:9399d44c2b1a 72
sblair 1:9399d44c2b1a 73 // data attributes
sblair 1:9399d44c2b1a 74 struct myAnalogValue {
sblair 1:9399d44c2b1a 75 CTYPE_FLOAT32 f;
sblair 1:9399d44c2b1a 76 };
sblair 1:9399d44c2b1a 77 struct ScaledValueConfig {
sblair 1:9399d44c2b1a 78 CTYPE_FLOAT32 scaleFactor;
sblair 1:9399d44c2b1a 79 CTYPE_FLOAT32 offset;
sblair 1:9399d44c2b1a 80 };
sblair 1:9399d44c2b1a 81 struct myVector {
sblair 1:9399d44c2b1a 82 struct myAnalogValue mag;
sblair 1:9399d44c2b1a 83 struct myAnalogValue ang;
sblair 1:9399d44c2b1a 84 };
sblair 1:9399d44c2b1a 85 struct simpleVector {
sblair 1:9399d44c2b1a 86 struct myAnalogValue mag;
sblair 1:9399d44c2b1a 87 struct myAnalogValue ang;
sblair 0:230c10b228ea 88 };
sblair 0:230c10b228ea 89
sblair 1:9399d44c2b1a 90 // data objects
sblair 1:9399d44c2b1a 91 struct myMod {
sblair 1:9399d44c2b1a 92 enum Mod ctlVal;
sblair 1:9399d44c2b1a 93 enum Mod stVal;
sblair 1:9399d44c2b1a 94 CTYPE_QUALITY q;
sblair 1:9399d44c2b1a 95 CTYPE_TIMESTAMP t;
sblair 1:9399d44c2b1a 96 };
sblair 1:9399d44c2b1a 97 struct myHealth {
sblair 1:9399d44c2b1a 98 enum Health stVal;
sblair 1:9399d44c2b1a 99 };
sblair 1:9399d44c2b1a 100 struct myBeh {
sblair 1:9399d44c2b1a 101 enum Beh stVal;
sblair 1:9399d44c2b1a 102 };
sblair 1:9399d44c2b1a 103 struct myINS {
sblair 1:9399d44c2b1a 104 CTYPE_INT32 stVal;
sblair 1:9399d44c2b1a 105 };
sblair 1:9399d44c2b1a 106 struct myLPL {
sblair 1:9399d44c2b1a 107 CTYPE_VISSTRING255 ldNs;
sblair 1:9399d44c2b1a 108 CTYPE_VISSTRING255 configRev;
sblair 1:9399d44c2b1a 109 };
sblair 1:9399d44c2b1a 110 struct myDPL {
sblair 1:9399d44c2b1a 111 CTYPE_VISSTRING255 vendor;
sblair 1:9399d44c2b1a 112 CTYPE_VISSTRING255 hwRev;
sblair 1:9399d44c2b1a 113 };
sblair 1:9399d44c2b1a 114 struct myPos {
sblair 1:9399d44c2b1a 115 CTYPE_DBPOS stVal;
sblair 1:9399d44c2b1a 116 CTYPE_QUALITY q;
sblair 1:9399d44c2b1a 117 CTYPE_TIMESTAMP t;
sblair 1:9399d44c2b1a 118 CTYPE_BOOLEAN ctlVal;
sblair 1:9399d44c2b1a 119 };
sblair 1:9399d44c2b1a 120 struct mySPS {
sblair 1:9399d44c2b1a 121 CTYPE_INT32 stVal;
sblair 1:9399d44c2b1a 122 CTYPE_QUALITY q;
sblair 1:9399d44c2b1a 123 CTYPE_TIMESTAMP t;
sblair 1:9399d44c2b1a 124 };
sblair 1:9399d44c2b1a 125 struct myMV {
sblair 1:9399d44c2b1a 126 struct myAnalogValue mag;
sblair 1:9399d44c2b1a 127 CTYPE_QUALITY q;
sblair 1:9399d44c2b1a 128 CTYPE_TIMESTAMP t;
sblair 1:9399d44c2b1a 129 struct ScaledValueConfig sVC;
sblair 1:9399d44c2b1a 130 };
sblair 1:9399d44c2b1a 131 struct simpleMV {
sblair 1:9399d44c2b1a 132 CTYPE_FLOAT32 mag;
sblair 1:9399d44c2b1a 133 CTYPE_QUALITY q;
sblair 1:9399d44c2b1a 134 CTYPE_TIMESTAMP t;
sblair 1:9399d44c2b1a 135 struct ScaledValueConfig sVC;
sblair 1:9399d44c2b1a 136 };
sblair 1:9399d44c2b1a 137 struct simpleCMV {
sblair 1:9399d44c2b1a 138 struct simpleVector cVal;
sblair 1:9399d44c2b1a 139 CTYPE_QUALITY q;
sblair 1:9399d44c2b1a 140 CTYPE_TIMESTAMP t;
sblair 1:9399d44c2b1a 141 };
sblair 1:9399d44c2b1a 142 struct simpleWYE {
sblair 1:9399d44c2b1a 143 struct simpleCMV phsA;
sblair 1:9399d44c2b1a 144 struct simpleCMV phsB;
sblair 1:9399d44c2b1a 145 struct simpleCMV phsC;
sblair 1:9399d44c2b1a 146 };
sblair 1:9399d44c2b1a 147 struct myCMV {
sblair 1:9399d44c2b1a 148 struct myVector cVal;
sblair 1:9399d44c2b1a 149 CTYPE_QUALITY q;
sblair 1:9399d44c2b1a 150 CTYPE_TIMESTAMP t;
sblair 1:9399d44c2b1a 151 };
sblair 1:9399d44c2b1a 152 struct mySEQ {
sblair 1:9399d44c2b1a 153 struct myCMV c1;
sblair 1:9399d44c2b1a 154 struct myCMV c2;
sblair 1:9399d44c2b1a 155 struct myCMV c3;
sblair 1:9399d44c2b1a 156 enum seqT seqT;
sblair 1:9399d44c2b1a 157 };
sblair 1:9399d44c2b1a 158 struct mySAV {
sblair 1:9399d44c2b1a 159 struct myAnalogValue instMag;
sblair 1:9399d44c2b1a 160 CTYPE_QUALITY q;
sblair 1:9399d44c2b1a 161 };
sblair 1:9399d44c2b1a 162 struct simpleSAV {
sblair 1:9399d44c2b1a 163 struct myAnalogValue instMag;
sblair 1:9399d44c2b1a 164 CTYPE_QUALITY q;
sblair 1:9399d44c2b1a 165 };
sblair 1:9399d44c2b1a 166
sblair 1:9399d44c2b1a 167 // logical nodes
sblair 1:9399d44c2b1a 168 struct LN0 {
sblair 1:9399d44c2b1a 169 struct myMod Mod;
sblair 1:9399d44c2b1a 170 struct myHealth Health;
sblair 1:9399d44c2b1a 171 struct myBeh Beh;
sblair 1:9399d44c2b1a 172 struct myLPL NamPlt;
sblair 1:9399d44c2b1a 173 };
sblair 1:9399d44c2b1a 174 struct LPHDa {
sblair 1:9399d44c2b1a 175 struct myMod Mod;
sblair 1:9399d44c2b1a 176 struct myHealth Health;
sblair 1:9399d44c2b1a 177 struct myBeh Beh;
sblair 1:9399d44c2b1a 178 struct myLPL NamPlt;
sblair 1:9399d44c2b1a 179 struct myDPL PhyNam;
sblair 1:9399d44c2b1a 180 struct myINS PhyHealth;
sblair 1:9399d44c2b1a 181 struct mySPS Proxy;
sblair 1:9399d44c2b1a 182 struct {
sblair 1:9399d44c2b1a 183 struct myAnalogValue instMag_1[2];
sblair 1:9399d44c2b1a 184 struct myMod Mod_1[2];
sblair 1:9399d44c2b1a 185 enum Mod stVal_1[2];
sblair 1:9399d44c2b1a 186 CTYPE_QUALITY q_1[2];
sblair 1:9399d44c2b1a 187 struct myMV Amps_1[2];
sblair 1:9399d44c2b1a 188 struct myPos Pos_2[2];
sblair 1:9399d44c2b1a 189 } sv_inputs;
sblair 1:9399d44c2b1a 190 };
sblair 1:9399d44c2b1a 191 struct CSWIa {
sblair 1:9399d44c2b1a 192 struct myMod Mod;
sblair 1:9399d44c2b1a 193 struct myHealth Health;
sblair 1:9399d44c2b1a 194 struct myBeh Beh;
sblair 1:9399d44c2b1a 195 struct myPos Pos;
sblair 1:9399d44c2b1a 196 struct mySPS GrpAl;
sblair 1:9399d44c2b1a 197 };
sblair 1:9399d44c2b1a 198 struct MMXUa {
sblair 1:9399d44c2b1a 199 struct myMod Mod;
sblair 1:9399d44c2b1a 200 struct myHealth Beh;
sblair 1:9399d44c2b1a 201 struct myBeh Health;
sblair 1:9399d44c2b1a 202 struct myMV Amps;
sblair 1:9399d44c2b1a 203 struct myMV Volts;
sblair 1:9399d44c2b1a 204 };
sblair 1:9399d44c2b1a 205 struct exampleMMXU {
sblair 1:9399d44c2b1a 206 struct myMod Mod;
sblair 1:9399d44c2b1a 207 struct myHealth Beh;
sblair 1:9399d44c2b1a 208 struct myBeh Health;
sblair 1:9399d44c2b1a 209 struct simpleWYE A;
sblair 1:9399d44c2b1a 210 struct {
sblair 1:9399d44c2b1a 211 struct simpleSAV AmpLocPhsA_1[16];
sblair 1:9399d44c2b1a 212 struct simpleSAV AmpLocPhsB_1[16];
sblair 1:9399d44c2b1a 213 struct simpleSAV AmpLocPhsC_1[16];
sblair 1:9399d44c2b1a 214 } sv_inputs;
sblair 1:9399d44c2b1a 215 };
sblair 1:9399d44c2b1a 216 struct exampleRMXU {
sblair 1:9399d44c2b1a 217 struct myMod Mod;
sblair 1:9399d44c2b1a 218 struct myHealth Beh;
sblair 1:9399d44c2b1a 219 struct myBeh Health;
sblair 1:9399d44c2b1a 220 struct simpleSAV AmpLocPhsA;
sblair 1:9399d44c2b1a 221 struct simpleSAV AmpLocPhsB;
sblair 1:9399d44c2b1a 222 struct simpleSAV AmpLocPhsC;
sblair 1:9399d44c2b1a 223 };
sblair 1:9399d44c2b1a 224 struct CILOa {
sblair 1:9399d44c2b1a 225 struct myHealth Mod;
sblair 1:9399d44c2b1a 226 struct myBeh Beh;
sblair 1:9399d44c2b1a 227 struct myINS Health;
sblair 1:9399d44c2b1a 228 struct mySPS EnaOpen;
sblair 1:9399d44c2b1a 229 struct mySPS EnaClose;
sblair 1:9399d44c2b1a 230 };
sblair 1:9399d44c2b1a 231 struct TVTRa {
sblair 1:9399d44c2b1a 232 struct myMod Mod;
sblair 1:9399d44c2b1a 233 struct myHealth Health;
sblair 1:9399d44c2b1a 234 struct myBeh Beh;
sblair 1:9399d44c2b1a 235 struct mySAV Vol;
sblair 1:9399d44c2b1a 236 };
sblair 1:9399d44c2b1a 237 struct RSYNa {
sblair 1:9399d44c2b1a 238 struct myMod Mod;
sblair 1:9399d44c2b1a 239 struct myHealth Health;
sblair 1:9399d44c2b1a 240 struct myBeh Beh;
sblair 1:9399d44c2b1a 241 struct myLPL NamPlt;
sblair 1:9399d44c2b1a 242 struct mySPS Rel;
sblair 1:9399d44c2b1a 243 struct {
sblair 1:9399d44c2b1a 244 struct myAnalogValue instMag_1[2];
sblair 1:9399d44c2b1a 245 struct myMod Mod_1[2];
sblair 1:9399d44c2b1a 246 enum Mod stVal_1[2];
sblair 1:9399d44c2b1a 247 CTYPE_QUALITY q_1[2];
sblair 1:9399d44c2b1a 248 struct myMV Amps_1[2];
sblair 1:9399d44c2b1a 249 struct myPos Pos_2[2];
sblair 1:9399d44c2b1a 250 } sv_inputs;
sblair 1:9399d44c2b1a 251 struct {
sblair 1:9399d44c2b1a 252 struct myAnalogValue instMag_1;
sblair 1:9399d44c2b1a 253 struct myPos Pos_1;
sblair 1:9399d44c2b1a 254 struct myPos Pos_2;
sblair 1:9399d44c2b1a 255 enum Mod stVal_1;
sblair 1:9399d44c2b1a 256 struct myMV Amps_1;
sblair 1:9399d44c2b1a 257 struct myMV Volts_1;
sblair 1:9399d44c2b1a 258 } gse_inputs;
sblair 1:9399d44c2b1a 259 };
sblair 1:9399d44c2b1a 260
sblair 1:9399d44c2b1a 261 void init_datatypes();
sblair 0:230c10b228ea 262
sblair 0:230c10b228ea 263
sblair 0:230c10b228ea 264
sblair 0:230c10b228ea 265
sblair 0:230c10b228ea 266 #ifdef __cplusplus /* If this is a C++ compiler, end C linkage */
sblair 0:230c10b228ea 267 }
sblair 0:230c10b228ea 268 #endif
sblair 0:230c10b228ea 269
sblair 0:230c10b228ea 270 #endif