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 1:9399d44c2b1a 21 #include "gsePacketData.h"
sblair 1:9399d44c2b1a 22 #include "gseDecode.h"
sblair 0:230c10b228ea 23 #include "gseEncode.h"
sblair 0:230c10b228ea 24
sblair 1:9399d44c2b1a 25 struct gseData ItlPositions_Itl;
sblair 1:9399d44c2b1a 26 struct gseData SyckResult_SynChk;
sblair 1:9399d44c2b1a 27 struct gseData MMXUResult_MMXUResult;
sblair 1:9399d44c2b1a 28
sblair 0:230c10b228ea 29
sblair 0:230c10b228ea 30
sblair 0:230c10b228ea 31
sblair 1:9399d44c2b1a 32 // returns 1 if buf contains valid packet data
sblair 1:9399d44c2b1a 33 int gse_send_ItlPositions_Itl(unsigned char *buf, CTYPE_BOOLEAN statusChange, CTYPE_INT32U timeAllowedToLive) {
sblair 1:9399d44c2b1a 34 ItlPositions_Itl.timeAllowedToLive = timeAllowedToLive;
sblair 1:9399d44c2b1a 35
sblair 1:9399d44c2b1a 36 if (statusChange) {
sblair 1:9399d44c2b1a 37 ItlPositions_Itl.stNum++;
sblair 1:9399d44c2b1a 38 if (ItlPositions_Itl.stNum == 0) {
sblair 1:9399d44c2b1a 39 ItlPositions_Itl.stNum = 1;
sblair 1:9399d44c2b1a 40 }
sblair 1:9399d44c2b1a 41 ItlPositions_Itl.sqNum = 0;
sblair 1:9399d44c2b1a 42 }
sblair 1:9399d44c2b1a 43 else {
sblair 1:9399d44c2b1a 44 ItlPositions_Itl.sqNum++;
sblair 1:9399d44c2b1a 45 if (ItlPositions_Itl.sqNum == 0) {
sblair 1:9399d44c2b1a 46 ItlPositions_Itl.sqNum = 1;
sblair 1:9399d44c2b1a 47 }
sblair 1:9399d44c2b1a 48 }
sblair 1:9399d44c2b1a 49
sblair 1:9399d44c2b1a 50 return gseEncodePacket(&ItlPositions_Itl, buf);
sblair 1:9399d44c2b1a 51 }
sblair 1:9399d44c2b1a 52
sblair 1:9399d44c2b1a 53 // returns 1 if buf contains valid packet data
sblair 1:9399d44c2b1a 54 int gse_send_SyckResult_SynChk(unsigned char *buf, CTYPE_BOOLEAN statusChange, CTYPE_INT32U timeAllowedToLive) {
sblair 1:9399d44c2b1a 55 SyckResult_SynChk.timeAllowedToLive = timeAllowedToLive;
sblair 1:9399d44c2b1a 56
sblair 1:9399d44c2b1a 57 if (statusChange) {
sblair 1:9399d44c2b1a 58 SyckResult_SynChk.stNum++;
sblair 1:9399d44c2b1a 59 if (SyckResult_SynChk.stNum == 0) {
sblair 1:9399d44c2b1a 60 SyckResult_SynChk.stNum = 1;
sblair 1:9399d44c2b1a 61 }
sblair 1:9399d44c2b1a 62 SyckResult_SynChk.sqNum = 0;
sblair 1:9399d44c2b1a 63 }
sblair 1:9399d44c2b1a 64 else {
sblair 1:9399d44c2b1a 65 SyckResult_SynChk.sqNum++;
sblair 1:9399d44c2b1a 66 if (SyckResult_SynChk.sqNum == 0) {
sblair 1:9399d44c2b1a 67 SyckResult_SynChk.sqNum = 1;
sblair 1:9399d44c2b1a 68 }
sblair 1:9399d44c2b1a 69 }
sblair 1:9399d44c2b1a 70
sblair 1:9399d44c2b1a 71 return gseEncodePacket(&SyckResult_SynChk, buf);
sblair 1:9399d44c2b1a 72 }
sblair 1:9399d44c2b1a 73
sblair 1:9399d44c2b1a 74 // returns 1 if buf contains valid packet data
sblair 1:9399d44c2b1a 75 int gse_send_MMXUResult_MMXUResult(unsigned char *buf, CTYPE_BOOLEAN statusChange, CTYPE_INT32U timeAllowedToLive) {
sblair 1:9399d44c2b1a 76 MMXUResult_MMXUResult.timeAllowedToLive = timeAllowedToLive;
sblair 1:9399d44c2b1a 77
sblair 1:9399d44c2b1a 78 if (statusChange) {
sblair 1:9399d44c2b1a 79 MMXUResult_MMXUResult.stNum++;
sblair 1:9399d44c2b1a 80 if (MMXUResult_MMXUResult.stNum == 0) {
sblair 1:9399d44c2b1a 81 MMXUResult_MMXUResult.stNum = 1;
sblair 1:9399d44c2b1a 82 }
sblair 1:9399d44c2b1a 83 MMXUResult_MMXUResult.sqNum = 0;
sblair 1:9399d44c2b1a 84 }
sblair 1:9399d44c2b1a 85 else {
sblair 1:9399d44c2b1a 86 MMXUResult_MMXUResult.sqNum++;
sblair 1:9399d44c2b1a 87 if (MMXUResult_MMXUResult.sqNum == 0) {
sblair 1:9399d44c2b1a 88 MMXUResult_MMXUResult.sqNum = 1;
sblair 1:9399d44c2b1a 89 }
sblair 1:9399d44c2b1a 90 }
sblair 1:9399d44c2b1a 91
sblair 1:9399d44c2b1a 92 return gseEncodePacket(&MMXUResult_MMXUResult, buf);
sblair 1:9399d44c2b1a 93 }
sblair 0:230c10b228ea 94
sblair 1:9399d44c2b1a 95 void init_gse() {
sblair 1:9399d44c2b1a 96 ItlPositions_Itl.ethHeaderData.destMACAddress[0] = 0x01;
sblair 1:9399d44c2b1a 97 ItlPositions_Itl.ethHeaderData.destMACAddress[1] = 0x0C;
sblair 1:9399d44c2b1a 98 ItlPositions_Itl.ethHeaderData.destMACAddress[2] = 0xCD;
sblair 1:9399d44c2b1a 99 ItlPositions_Itl.ethHeaderData.destMACAddress[3] = 0x01;
sblair 1:9399d44c2b1a 100 ItlPositions_Itl.ethHeaderData.destMACAddress[4] = 0x00;
sblair 1:9399d44c2b1a 101 ItlPositions_Itl.ethHeaderData.destMACAddress[5] = 0x04;
sblair 1:9399d44c2b1a 102 ItlPositions_Itl.ethHeaderData.APPID = 0x3000;
sblair 1:9399d44c2b1a 103 ItlPositions_Itl.ethHeaderData.VLAN_PRIORITY = 0x4;
sblair 1:9399d44c2b1a 104 ItlPositions_Itl.ethHeaderData.VLAN_ID = 4;
sblair 1:9399d44c2b1a 105 ItlPositions_Itl.goID = (unsigned char *) malloc(4);
sblair 1:9399d44c2b1a 106 strncpy((char *) ItlPositions_Itl.goID, "Itl\0", 4);
sblair 1:9399d44c2b1a 107 ItlPositions_Itl.t = 0;
sblair 1:9399d44c2b1a 108 ItlPositions_Itl.gocbRef = (unsigned char *) malloc(28);
sblair 1:9399d44c2b1a 109 strncpy((char *) ItlPositions_Itl.gocbRef, "E1Q1SB1C1/LLN0$ItlPositions\0", 28);
sblair 1:9399d44c2b1a 110 ItlPositions_Itl.datSet = (unsigned char *) malloc(25);
sblair 1:9399d44c2b1a 111 strncpy((char *) ItlPositions_Itl.datSet, "E1Q1SB1C1/LLN0$Positions\0", 25);
sblair 1:9399d44c2b1a 112 ItlPositions_Itl.timeAllowedToLive = 0;
sblair 1:9399d44c2b1a 113 ItlPositions_Itl.stNum = 0;
sblair 1:9399d44c2b1a 114 ItlPositions_Itl.sqNum = 0;
sblair 1:9399d44c2b1a 115 ItlPositions_Itl.test = 0;
sblair 1:9399d44c2b1a 116 ItlPositions_Itl.confRev = 1;
sblair 1:9399d44c2b1a 117 ItlPositions_Itl.ndsCom = 0;
sblair 1:9399d44c2b1a 118 ItlPositions_Itl.numDatSetEntries = 6;
sblair 1:9399d44c2b1a 119 ItlPositions_Itl.encodeDataset = &ber_encode_Itl;
sblair 1:9399d44c2b1a 120 ItlPositions_Itl.getDatasetLength = &ber_get_length_Itl;
sblair 1:9399d44c2b1a 121
sblair 1:9399d44c2b1a 122 SyckResult_SynChk.ethHeaderData.destMACAddress[0] = 0x01;
sblair 1:9399d44c2b1a 123 SyckResult_SynChk.ethHeaderData.destMACAddress[1] = 0x0C;
sblair 1:9399d44c2b1a 124 SyckResult_SynChk.ethHeaderData.destMACAddress[2] = 0xCD;
sblair 1:9399d44c2b1a 125 SyckResult_SynChk.ethHeaderData.destMACAddress[3] = 0x01;
sblair 1:9399d44c2b1a 126 SyckResult_SynChk.ethHeaderData.destMACAddress[4] = 0x00;
sblair 1:9399d44c2b1a 127 SyckResult_SynChk.ethHeaderData.destMACAddress[5] = 0x02;
sblair 1:9399d44c2b1a 128 SyckResult_SynChk.ethHeaderData.APPID = 0x3001;
sblair 1:9399d44c2b1a 129 SyckResult_SynChk.ethHeaderData.VLAN_PRIORITY = 0x4;
sblair 1:9399d44c2b1a 130 SyckResult_SynChk.ethHeaderData.VLAN_ID = 4;
sblair 1:9399d44c2b1a 131 SyckResult_SynChk.goID = (unsigned char *) malloc(7);
sblair 1:9399d44c2b1a 132 strncpy((char *) SyckResult_SynChk.goID, "SynChk\0", 7);
sblair 1:9399d44c2b1a 133 SyckResult_SynChk.t = 0;
sblair 1:9399d44c2b1a 134 SyckResult_SynChk.gocbRef = (unsigned char *) malloc(26);
sblair 1:9399d44c2b1a 135 strncpy((char *) SyckResult_SynChk.gocbRef, "D1Q1SB4C1/LLN0$SyckResult\0", 26);
sblair 1:9399d44c2b1a 136 SyckResult_SynChk.datSet = (unsigned char *) malloc(26);
sblair 1:9399d44c2b1a 137 strncpy((char *) SyckResult_SynChk.datSet, "D1Q1SB4C1/LLN0$SyckResult\0", 26);
sblair 1:9399d44c2b1a 138 SyckResult_SynChk.timeAllowedToLive = 0;
sblair 1:9399d44c2b1a 139 SyckResult_SynChk.stNum = 0;
sblair 1:9399d44c2b1a 140 SyckResult_SynChk.sqNum = 0;
sblair 1:9399d44c2b1a 141 SyckResult_SynChk.test = 0;
sblair 1:9399d44c2b1a 142 SyckResult_SynChk.confRev = 0;
sblair 1:9399d44c2b1a 143 SyckResult_SynChk.ndsCom = 0;
sblair 1:9399d44c2b1a 144 SyckResult_SynChk.numDatSetEntries = 1;
sblair 1:9399d44c2b1a 145 SyckResult_SynChk.encodeDataset = &ber_encode_SynChk;
sblair 1:9399d44c2b1a 146 SyckResult_SynChk.getDatasetLength = &ber_get_length_SynChk;
sblair 1:9399d44c2b1a 147
sblair 1:9399d44c2b1a 148 MMXUResult_MMXUResult.ethHeaderData.destMACAddress[0] = 0x01;
sblair 1:9399d44c2b1a 149 MMXUResult_MMXUResult.ethHeaderData.destMACAddress[1] = 0x0C;
sblair 1:9399d44c2b1a 150 MMXUResult_MMXUResult.ethHeaderData.destMACAddress[2] = 0xCD;
sblair 1:9399d44c2b1a 151 MMXUResult_MMXUResult.ethHeaderData.destMACAddress[3] = 0x01;
sblair 1:9399d44c2b1a 152 MMXUResult_MMXUResult.ethHeaderData.destMACAddress[4] = 0x00;
sblair 1:9399d44c2b1a 153 MMXUResult_MMXUResult.ethHeaderData.destMACAddress[5] = 0x02;
sblair 1:9399d44c2b1a 154 MMXUResult_MMXUResult.ethHeaderData.APPID = 0x3001;
sblair 1:9399d44c2b1a 155 MMXUResult_MMXUResult.ethHeaderData.VLAN_PRIORITY = 0x4;
sblair 1:9399d44c2b1a 156 MMXUResult_MMXUResult.ethHeaderData.VLAN_ID = 4;
sblair 1:9399d44c2b1a 157 MMXUResult_MMXUResult.goID = (unsigned char *) malloc(11);
sblair 1:9399d44c2b1a 158 strncpy((char *) MMXUResult_MMXUResult.goID, "MMXUResult\0", 11);
sblair 1:9399d44c2b1a 159 MMXUResult_MMXUResult.t = 0;
sblair 1:9399d44c2b1a 160 MMXUResult_MMXUResult.gocbRef = (unsigned char *) malloc(26);
sblair 1:9399d44c2b1a 161 strncpy((char *) MMXUResult_MMXUResult.gocbRef, "D1Q1SB4C1/LLN0$MMXUResult\0", 26);
sblair 1:9399d44c2b1a 162 MMXUResult_MMXUResult.datSet = (unsigned char *) malloc(26);
sblair 1:9399d44c2b1a 163 strncpy((char *) MMXUResult_MMXUResult.datSet, "D1Q1SB4C1/LLN0$MMXUResult\0", 26);
sblair 1:9399d44c2b1a 164 MMXUResult_MMXUResult.timeAllowedToLive = 0;
sblair 1:9399d44c2b1a 165 MMXUResult_MMXUResult.stNum = 0;
sblair 1:9399d44c2b1a 166 MMXUResult_MMXUResult.sqNum = 0;
sblair 1:9399d44c2b1a 167 MMXUResult_MMXUResult.test = 0;
sblair 1:9399d44c2b1a 168 MMXUResult_MMXUResult.confRev = 0;
sblair 1:9399d44c2b1a 169 MMXUResult_MMXUResult.ndsCom = 0;
sblair 1:9399d44c2b1a 170 MMXUResult_MMXUResult.numDatSetEntries = 1;
sblair 1:9399d44c2b1a 171 MMXUResult_MMXUResult.encodeDataset = &ber_encode_MMXUResult;
sblair 1:9399d44c2b1a 172 MMXUResult_MMXUResult.getDatasetLength = &ber_get_length_MMXUResult;
sblair 1:9399d44c2b1a 173
sblair 1:9399d44c2b1a 174 }
sblair 1:9399d44c2b1a 175