Skip to content

sergeisin/GooseScript

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

75 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

GooseScript

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° для ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ GOOSE сообщСний Π² соотвСтствии со стандартом IEC61850-8-1.

НазначСниС

  • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ IED ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΡ‘ΠΌΠ΅ Goose-сообщСний с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ
  • ΠŸΡ€ΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ping-Pong тСстирования ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Goose

ВозмоТности

  • Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ скрипта Π½Π° языкС C#
  • Доступ ΠΊ Π»ΡŽΠ±Ρ‹ΠΌ полям Goose-сообщСния
  • Π’Ρ‹Π±ΠΎΡ€ Ρ‚ΠΈΠΏΠ° ΠΈ структуры Π΄Π°Π½Π½Ρ‹Ρ… для ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ
  • Π ΡƒΡ‡Π½ΠΎΠΉ ΠΈΠ»ΠΈ автоматичСский Ρ€Π΅ΠΆΠΈΠΌ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ
  • Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ cid-Ρ„Π°ΠΉΠ»Π° для подписки Π½Π° ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌΡ‹ΠΉ Goose

ВрСбования

Note

Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ Npcap Ρ‚Π°ΠΊΠΆΠ΅ устанавливаСтся ΠΏΡ€ΠΈ установкС послСднСй вСрсии Wireshark.

Как ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ

  • ΠΠ°Π±Ρ€Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° языкС C#, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ классы для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Goose
  • ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Run Script ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ скомпилирован ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½
  • Π’ случаС возникновСния ошибки Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ сообщСниС
  • Для досрочного Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ выполнСния скрипта Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ Stop

Note

Π—Π° основу скрипта ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², ΠΏΠΎΠΏΡ€Π°Π²ΠΈΠ² Π΅Π³ΠΎ ΠΏΠΎΠ΄ свои Π·Π°Π΄Π°Ρ‡ΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

Код ΠΈΠ· любого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ скриптов ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹

Для конфигурирования ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² 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

Π’ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° Π΄Π°Π½Π½Ρ‹Ρ… 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 сСкунд
}

ИзмСнСниС значСния stVal

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ свойства 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 ΠΈ sqNum

ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… счётчик 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

ΠŸΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ Π½Π° ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌΡ‹ΠΉ 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 ΠΈ Π½Π΅ ΠΏΠΎΠ΄Π»Π΅ΠΆΠΈΡ‚ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Goose

ΠŸΠΎΠ»Π½Ρ‹ΠΉ списко ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² 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

Автор