ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π΄Π»Ρ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ GOOSE ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ ΡΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠΎΠΌ IEC61850-8-1.
- ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ°Π±ΠΎΡΡ IED ΠΏΡΠΈ ΠΏΡΠΈΡΠΌΠ΅ Goose-ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ
- ΠΡΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ping-Pong ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Goose
- Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΠΊΡΠΈΠΏΡΠ° Π½Π° ΡΠ·ΡΠΊΠ΅ C#
- ΠΠΎΡΡΡΠΏ ΠΊ Π»ΡΠ±ΡΠΌ ΠΏΠΎΠ»ΡΠΌ Goose-ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ
- ΠΡΠ±ΠΎΡ ΡΠΈΠΏΠ° ΠΈ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ Π΄Π»Ρ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ
- Π ΡΡΠ½ΠΎΠΉ ΠΈΠ»ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ΅ΠΆΠΈΠΌ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ
- Π‘ΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ cid-ΡΠ°ΠΉΠ»Π° Π΄Π»Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ Π½Π° ΠΏΡΠ±Π»ΠΈΠΊΡΠ΅ΠΌΡΠΉ Goose
- Windows 10 / 11
- Microsoft .NET Framework 4.8
- Π‘Π΅ΡΠ΅Π²ΠΎΠΉ Π΄ΡΠ°ΠΉΠ²Π΅Ρ Npcap
Note
ΠΡΠ°ΠΉΠ²Π΅Ρ Npcap ΡΠ°ΠΊΠΆΠ΅ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ Π²Π΅ΡΡΠΈΠΈ Wireshark.
- ΠΠ°Π±ΡΠ°ΡΡ ΠΊΠΎΠ΄ Π½Π° ΡΠ·ΡΠΊΠ΅ C#, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΏΡΠ΅Π΄ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠ΅ ΠΊΠ»Π°ΡΡΡ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Goose
- ΠΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡ
Run Script
ΠΊΠΎΠ΄ Π±ΡΠ΄Π΅Ρ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½ ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ - Π ΡΠ»ΡΡΠ°Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΊΠΈ Π±ΡΠ΄Π΅Ρ Π²ΡΠ²Π΅Π΄Π΅Π½ΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅
- ΠΠ»Ρ Π΄ΠΎΡΡΠΎΡΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠΊΡΠΈΠΏΡΠ° Π½Π°ΠΆΠ°ΡΡ ΠΊΠ½ΠΎΠΏΠΊΡ
Stop
Note
ΠΠ° ΠΎΡΠ½ΠΎΠ²Ρ ΡΠΊΡΠΈΠΏΡΠ° ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ², ΠΏΠΎΠΏΡΠ°Π²ΠΈΠ² Π΅Π³ΠΎ ΠΏΠΎΠ΄ ΡΠ²ΠΎΠΈ Π·Π°Π΄Π°ΡΠΈ.
ΠΠΎΠ΄ ΠΈΠ· Π»ΡΠ±ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ Π² ΡΠ΅Π΄Π°ΠΊΡΠΎΡ ΡΠΊΡΠΈΠΏΡΠΎΠ² ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ.
- ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π²ΡΠ΅Ρ ΠΏΠΎΠ΄Π΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ
- ΠΡΠΈΠΌΠ΅Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠΈΠΏΠΎΠΌ Boolean
- ΠΡΠΈΠΌΠ΅Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠΈΡΠ»Π΅Π½Π½ΡΠΌΠΈ ΡΠΈΠΏΠ°ΠΌΠΈ Int ΠΈ Float
- ΠΡΠΈΠΌΠ΅Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠΈΠΏΠΎΠΌ Dbpos (ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΡΠΊΠ»ΡΡΠ°ΡΠ΅Π»Ρ)
- ΠΡΠΈΠΌΠ΅Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠΈΠΏΠΎΠΌ Octet64
- ΠΡΠΈΠΌΠ΅Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠΈΠΏΠΎΠΌ Quality
- ΠΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Goose ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ
ΠΠ»Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² Goose-ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ»Π°ΡΡΠ° GooseSettings
.
ΠΠ°Π½Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π½Π°ΡΡΡΠΎΠ΅ΠΊ, Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ
ΡΠ²Π»ΡΡΡΡΡ ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΌΠΈ.
ΠΡΠ΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Ρ Π² ΠΊΠΎΠ΄Π΅ Π½ΠΈΠΆΠ΅.
var settings = new GooseSettings() // ΠΠ±ΡΠ΅ΠΊΡ Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ Π½Π°ΡΡΡΠΎΠ΅ΠΊ
{
interface = "Ethernet",
gocbRef = "IED1SYS/LLN0$GO$GSE1", // Π‘ΡΡΠ»ΠΊΠ° Π½Π° Π±Π»ΠΎΠΊ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Goose ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΎΡΠ°
datSet = "IED1SYS/LLN0$DataSet", // Π‘ΡΡΠ»ΠΊΠ° Π½Π° Π½Π°Π±ΠΎΡ Π΄Π°Π½Π½ΡΡ
ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΎΡΠ°
goID = "MyGooseID"
};
var publisher = new GoosePublisher(settings); // ΠΠ±ΡΠ΅ΠΊΡ Π΄Π»Ρ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ
ΠΠ»Ρ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ Goose-ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ»Π°ΡΡΠ° GoosePublisher
, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π·Π° ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ΅ΡΡΡ.
Π ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° GoosePublisher
ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΈΠΏΠ° GooseSettings
.
ΠΡΠ±Π»ΠΈΠΊΡΠ΅ΠΌΡΠΉ Π½Π°Π±ΠΎΡ Π΄Π°Π½Π½ΡΡ
ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΡΠΏΠΈΡΠΎΠΊ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² Π΄Π°Π½Π½ΡΡ
(DA) ΠΈΠ»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ Π΄Π°Π½Π½ΡΡ
(DO) ΡΠ΅Π»ΠΈΠΊΠΎΠΌ.
Π‘ΡΡΡΠΊΡΡΡΠ° Π½Π°Π±ΠΎΡΠ° Π΄Π°Π½Π½ΡΡ
Π·Π°Π΄Π°ΡΡΡΡ Π½Π° ΡΡΠ°ΠΏΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² isStruct
ΠΈ hasTimeStamp
.
Π‘ΡΡΡΠΊΡΡΡΠ° Π½Π°Π±ΠΎΡΠ° Π΄Π°Π½Π½ΡΡ
ΠΏΡΠΈ settings.isStruct = true
DataSet
{
DataObject DO ΡΠΈΠΏΠ° SPS / INS / DPS
{
DataAttribute - stVal DA ΡΠΈΠΏΠ° MMS_TYPE
DataAttribute - q DA ΡΠΈΠΏΠ° Quality
DataAttribute - t DA ΡΠΈΠΏΠ° Timestamp
}
}
Π‘ΡΡΡΠΊΡΡΡΠ° Π½Π°Π±ΠΎΡΠ° Π΄Π°Π½Π½ΡΡ
ΠΏΡΠΈ settings.isStruct = false
DataSet
{
DataAttribute - stVal DA ΡΠΈΠΏΠ° MMS_TYPE
DataAttribute - q DA ΡΠΈΠΏΠ° Quality
}
Π‘ΡΡΡΠΊΡΡΡΠ° Π½Π°Π±ΠΎΡΠ° Π΄Π°Π½Π½ΡΡ
ΠΏΡΠΈ settings.isStruct = false
ΠΈ settings.hasTimeStamp = true
DataSet
{
DataAttribute - stVal DA ΡΠΈΠΏΠ° MMS_TYPE
DataAttribute - q DA ΡΠΈΠΏΠ° Quality
DataAttribute - t DA ΡΠΈΠΏΠ° Timestamp
}
Π’ΠΈΠΏ Π΄Π°Π½Π½ΡΡ
ΠΈ Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π°ΡΡΠΈΠ±ΡΡΠ° Π΄Π°Π½Π½ΡΡ
stVal
Π·Π°Π΄Π°ΡΡΡΡ Π½Π° ΡΡΠ°ΠΏΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ
ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² mmsType
ΠΈ initVal
.
settings.mmsType = MMS_TYPE.INT32;
settings.initVal = 42;
ΠΡΠΈ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠΈ initVal
ΡΠΈΠΏ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°ΡΡ ΡΠΈΠΏΡ Π΄Π°Π½Π½ΡΡ
stVal
.
settings.mmsType = MMS_TYPE.INT32;
settings.initVal = false; // ΠΡΠΈΠ±ΠΊΠ° 'MMS type mismatch'
// ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ 'false' ΡΠΈΠΏΠ° bool Π½Π΅ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΡΠ΅ΡΡΡ Π² int
ΠΡΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠ΅ ΡΠΈΠΏΡ Π΄Π°Π½Π½ΡΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Ρ Π² ΡΠ°Π±Π»ΠΈΡΠ΅
MMS_TYPE | Π’ΠΈΠΏ C# | ΠΡΠΈΠΌΠ΅Ρ |
---|---|---|
BOOLEAN | bool | true |
INT32 | int, uint | -42 |
INT32U | int, uint | 404 |
FLOAT32 | float, double | 3.14 |
BIT_STRING | string (bin) | "011010" |
OCTET_STRING | string (hex) | "c0ffee" |
Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠ΅ΠΉ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° GoosePublisher
.
ΠΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½ΠΎ Π΄Π²Π° ΡΠ΅ΠΆΠΈΠΌΠ° ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ: ΡΡΡΠ½ΠΎΠΉ ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ.
Π ΡΡΡΠ½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ:
- Π’ΡΠ΅Π±ΡΠ΅ΡΡΡ Π²ΡΡΡΠ½ΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄
Send()
- Π’ΡΠ΅Π±ΡΠ΅ΡΡΡ Π²ΡΡΡΠ½ΡΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ Π²ΡΠ΅ΠΌΡ ΠΆΠΈΠ·Π½ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ
TAL
- Π’ΡΠ΅Π±ΡΠ΅ΡΡΡ Π²ΡΡΡΠ½ΡΡ Π·Π°Π΄Π°Π²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡΠΌΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ
- ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² Π½Π°Π±ΠΎΡΠ΅ Π΄Π°Π½Π½ΡΡ Π½Π΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΡΡ ΠΊ ΠΎΡΠΏΡΠ°Π²ΠΊΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ
publisher.TAL = 1500; // Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° TimeAllowedToLive - 1500 ΠΌΡ
...
publisher.Send(); // ΠΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ
...
Timer.Sleep(500); // ΠΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ 500 ΠΌΡ
...
publisher.SendFew(5, 200); // ΠΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ 5-ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Ρ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»ΠΎΠΌ 200 ΠΌΡ
ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ΅ΠΆΠΈΠΌ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ ΠΌΠ΅ΡΠΎΠ΄Π° Run(minTime, maxTime)
.
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Ρ ΡΠ΅ΡΡΠ°Π½ΡΠ»ΡΡΠΈΠΈ (ΠΌΡ).
Π Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ:
- ΠΡΠ΅ΠΌΡ ΠΆΠΈΠ·Π½ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, Π° ΡΠ°ΠΊΠΆΠ΅ Π²ΡΠ΅ΠΌΡ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ
- ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²
Value
ΠΈΠ»ΠΈQuality
ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎΠΉ ΠΎΡΠΏΡΠ°Π²ΠΊΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΈ ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΡ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π° ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ Π΄ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ.
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠ΅ΠΆΠΈΠΌΠ° ΡΠ΅ΡΡΠ°Π½ΡΠ»ΡΡΠΈΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡ ΠΊΠΎΡΠΏΠΎΡΠ°ΡΠΈΠ²Π½ΠΎΠΌΡ ΠΏΡΠΎΡΠΈΠ»Ρ Π€Π‘Π ΠΠΠ‘.
publisher.Run(10, 1000); // ΠΠ°ΠΏΡΡΠΊ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌΠ° ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ
while(true)
{
publisher.Value++; // Π£Π²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ stVal
Timer.Sleep(5000); // ΠΊΠ°ΠΆΠ΄ΡΠ΅ 5 ΡΠ΅ΠΊΡΠ½Π΄
}
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ²ΠΎΠΉΡΡΠ²Π° publisher.Value
ΠΌΠΎΠΆΠ½ΠΎ Π² Π»ΡΠ±ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ stVal
.
Π’ΠΈΠΏ Value
ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΈΡΡ
ΠΎΠ΄Ρ ΠΈΠ· Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° settings.mmsType
.
Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠΈΠΏΠ° Π΄Π°Π½Π½ΡΡ
Π΄Π»Ρ Value
Π΄ΠΎΠΏΡΡΡΠΈΠΌΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ.
Π’ΠΈΠΏ Π΄Π°Π½Π½ΡΡ
BOOLEAN
publisher.Value = true;
...
publisher.Value = false;
...
publisher.Value = !publisher.Value;
Π’ΠΈΠΏΡ Π΄Π°Π½Π½ΡΡ
INT32 | INT32U | FLOAT32
publisher.Value = 42;
...
publisher.Value++;
...
publisher.Value += 3.14;
Π’ΠΈΠΏ Π΄Π°Π½Π½ΡΡ
BIT_STRING
// Dbpos - ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ
Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΊΠΎΠΌΠΌΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ°
publisher.Value = Dbpos.Intermediate; // "00"
publisher.Value = Dbpos.Off // "01"
publisher.Value = Dbpos.On; // "10"
publisher.Value = Dbpos.BadState; // "11"
// ΠΠ±ΠΎΠ±ΡΠ΅Π½Π½ΡΠΉ ΡΠΈΠΏ bit-string
publisher.Value = "1_0101"; // bits: 5, padding: 3
publisher.Value = "01_0101"; // bits: 6, padding: 2
publisher.Value = "101_0101"; // bits: 7, padding: 1
publisher.Value = "0101_0101"; // bits: 8, padding: 0
publisher.Value = "1_0101_0101"; // bits: 9, padding: 7
publisher.Value = "01_0101_0101"; // bits: 10, padding: 6
Π’ΠΈΠΏ Π΄Π°Π½Π½ΡΡ
OCTET_STRING
publisher.Value = "DEAD_BEEF";
...
publisher.Value += "BAAD_FOOD";
ΠΠ»Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΊΠ°ΡΠ΅ΡΡΠ²Π° Π΄Π°Π½Π½ΡΡ
ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ²ΠΎΠΉΡΡΠ²Ρ publisher.Quality
ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° Quality
.
var q = new Quality()
{
Validity = Validity.Good, // Invalid | Reserved | Questionable
Overflow = true,
OutofRange = true,
BadReference = true,
Oscillatory = true,
Failure = true,
OldData = true,
Inconsistent = true,
Inaccurate = true,
Source = true,
Test = true,
OperatorBlocked = true
};
publisher.Quality = q; // Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΊΠ°ΡΠ΅ΡΡΠ²Π° Π΄Π°Π½Π½ΡΡ
...
publisher.Quality = new Quality() // Π‘ΠΏΠΎΡΠΎΠ± Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ
{
Validity = Validity.Questionable,
Failure = true,
Test = true
};
ΠΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π΄Π°Π½Π½ΡΡ
ΡΡΡΡΡΠΈΠΊ stNum
ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ Π½Π° 1, Π° ΡΡΡΡΡΠΈΠΊ sqNum
ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΡΡΡ Π² 0.
ΠΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΠ΅ΡΡΠ°Π½ΡΠ»ΡΡΠΈΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ
ΡΡΡΡΡΠΈΠΊ sqNum
ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ Π½Π° 1.
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½ΠΎ ΠΏΡΡΠΌΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΡΡΡΠΈΠΊΠ°ΠΌΠΈ. ΠΠΎΠ³ΠΈΠΊΠ° ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΡ ΡΡΡΡΡΠΈΠΊΠΎΠ² ΠΏΡΠΈ ΡΡΠΎΠΌ Π½Π΅ ΠΎΡΠΊΠ»ΡΡΠ°Π΅ΡΡΡ.
publisher.StNum = 42;
publisher.SqNum = 43;
Π€Π»Π°Π³ΠΈ ΡΠ΅ΠΆΠΈΠΌΠ° ΡΠΈΠΌΡΠ»ΡΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°ΡΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ Π½Π° ΡΡΠ°ΠΏΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
ΠΡΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΡΠ΅ΠΆΠΈΠΌ ΡΠΈΠΌΡΠ»ΡΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ²ΠΎΠΉΡΡΠ²Π° Simulation
.
settings.simulation_reserved = true; // ΠΠΈΡ ΡΠΈΠΌΡΠ»ΡΡΠΈΠΈ Π² ΠΏΠΎΠ»Π΅ Reserved 1
settings.simulation_goosePdu = true; // Π€Π»Π°Π³ ΡΠΈΠΌΡΠ»ΡΡΠΈΠΈ Π² goosePdu
...
publisher.Run(100, 1000);
...
publisher.Simulation = false; // ΠΠ±Π° ΡΠ»Π°Π³Π° Π²ΡΡΡΠ°Π²Π»ΡΡΡΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ
ΠΠΎΠ΄ΠΏΠΈΡΠ°ΡΡΡΡ Π½Π° ΠΏΡΠ±Π»ΠΈΠΊΡΠ΅ΠΌΡΠΉ Goose ΠΌΠΎΠΆΠ½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ cid-ΡΠ°ΠΉΠ»Π° ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΎΡΠ° ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΎΡΠ° ICT, ΠΏΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΌ IED.
ΠΠ»Ρ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΡ cid-ΡΠ°ΠΉΠ»Π° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π²ΡΠ·Π²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ SaveSCL(iedName)
publisher.SaveSCL("IED1"); // ΠΠΌΡ ΡΠ°ΠΉΠ»Π° GooseScript.cid
...
publisher.SaveSCL("IED1", "myFile.cid"); // ΠΠΌΡ ΡΠ°ΠΉΠ»Π° myFile.cid
Π‘ΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π° ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ gocbRef
ΠΈ datSet
Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½Ρ:
- Π‘ΡΡΠ»ΠΊΠΈ Π½Π°ΡΠΈΠ½Π°ΡΡΡΡ Ρ ΠΈΠΌΠ΅Π½ΠΈ IED, ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π²
SaveSCL(iedName)
ΠΏΠ΅ΡΠ²ΡΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ - Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ DO ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ LLN0
Note
Π€Π°ΠΉΠ» ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π»ΠΈΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ XSD ΡΡ Π΅ΠΌΠ΅ SCL ΠΈ Π½Π΅ ΠΏΠΎΠ΄Π»Π΅ΠΆΠΈΡ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ.
ΠΠΎΠ»Π½ΡΠΉ ΡΠΏΠΈΡΠΊΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² GooseSettings
ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½ Π² ΡΠ°Π±Π»ΠΈΡΠ΅.
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ | Π’ΠΈΠΏ | ΠΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ |
---|---|---|---|
interfaceName | string | ΠΠΌΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π΄Π»Ρ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ | |
dstMac | uint16 | 0 - 3FF | ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ Π΄Π²Π° Π±Π°ΠΉΡΠ° MAC-Π°Π΄ΡΠ΅ΡΠ° Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΡ |
hasVlan | bool | ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ VLAN ΡΡΠ³Π° ΠΊ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ | |
vlanID | uint16 | 0 - FFF | ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ VLAN |
appID | uint16 | 0 - FFFF | ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ |
simulation_reserved | bool | ΠΠΈΡ ΡΠΈΠΌΡΠ»ΡΡΠΈΠΈ Π² ΠΏΠΎΠ»Π΅ Reserved 1 | |
gocbRef | string | Π‘ΡΡΠ»ΠΊΠ° Π½Π° Π±Π»ΠΎΠΊ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΎΡΠ° | |
TAL | uint32 | ΠΡΠ΅ΠΌΡ ΠΆΠΈΠ·Π½ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π°Ρ | |
datSet | string | Π‘ΡΡΠ»ΠΊΠ° Π½Π° Π½Π°Π±ΠΎΡ Π΄Π°Π½Π½ΡΡ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΎΡΠ° | |
goID | string | ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Goose-ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ | |
simulation_goosePdu | bool | Π€Π»Π°Π³ ΡΠΈΠΌΡΠ»ΡΡΠΈΠΈ Π² goosePdu | |
confRev | uint32 | ΠΠΎΠΌΠ΅Ρ ΡΠ΅Π²ΠΈΠ·ΠΈΠΈ DataSet | |
ndsCom | bool | Π€Π»Π°Π³ Π½Π΅Π·Π°Π²Π΅ΡΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ | |
mmsType | MMS_TYPE | Π’ΠΈΠΏ Π΄Π°Π½Π½ΡΡ Π°ΡΡΠΈΠ±ΡΡΠ° stVal Π½Π°Π±ΠΎΡΠ° Π΄Π°Π½Π½ΡΡ | |
initVal | dynamic | ΠΠ°ΡΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ stVal | |
isStruct | bool | ΠΠ΅ΡΡ DO Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΡΡΡ Π² Π½Π°Π±ΠΎΡ Π΄Π°Π½Π½ΡΡ | |
hasTimeStamp | bool | ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ TimeStamp Π² Π½Π°Π±ΠΎΡ Π΄Π°Π½Π½ΡΡ |
Ctrl + X
- ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΡΡΠΎΠΊΠΈCtrl + MouseWheel
- ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠ°ΡΡΡΠ°Π±Π° ΡΠ΅ΠΊΡΡΠ°- ΠΡΠΈ Π·Π°ΠΊΡΡΡΠΈΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΠΊΡΠΈΠΏΡ ΡΠΎΡ
ΡΠ°Π½ΡΠ΅ΡΡΡ Π² ΡΠ°ΠΉΠ»
GooseScript.cs
- ΠΡΠΈ ΡΠ΄Π°Π»Π΅Π½Π½ΠΈ Π²ΡΠ΅Π³ΠΎ ΡΠ΅ΠΊΡΡΠ° ΠΈΠ· ΠΎΠΊΠ½Π° ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ° ΠΏΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠ° Π±ΡΠ΄Π΅Ρ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ ΡΠΊΡΠΈΠΏΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ
Π‘Π±ΠΎΡΠΊΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Microsoft VisualΒ Studio Community.
- ΠΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΠ΅ΠΊΡ
- Π‘ΠΊΠ°ΡΠ°ΡΡ ΠΏΠ°ΠΊΠ΅Ρ NuGet
SharpPcap
- Π‘ΠΎΠ±ΡΠ°ΡΡ Release
- ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΈΠ»ΠΈΡΡ
ilMerge
.\ILMerge /target:winexe /out:Out.exe ^
GooseScript.exe ^
PacketDotNet.dll ^
SharpPcap.dll ^
System.Buffers.dll ^
System.Memory.dll ^
System.Numerics.Vectors.dll ^
System.Runtime.CompilerServices.Unsafe.dll ^
System.Text.Encoding.CodePages.dll
del /q GooseScript.exe
del /q Out.pdb
ren Out.exe GooseScript.exe