ScadaPy: إضافة بروتوكول IEC 60870-5-104

توفر إضافة بروتوكول iec-104 إلى Scadapy فرصًا إضافية لتوسيع النظام ، سواء في أتمتة المنزل والاستخدام المحلي في المؤسسات الصغيرة.

من الصعب جدًا تعلم هذا البروتوكول ، ولكن في الوقت الحالي على الإنترنت يمكنك العثور على وثائق كافية للتعرف على نفسك.

ما يعطينا استخدام هذا البروتوكول؟

عامل مهم هو أن البروتوكول غير متزامن ، على عكس modbus ، ويتم نقل البيانات فقط في حالة تغيير الحالة الحالية للمتغير ، مما يقلل بدوره من الحمل على قنوات الاتصال. من الممكن أيضًا الحصول على الطابع الزمني لحالة المتغير على الكائن ؛ في modbus ، يتم استخدام سجلات منفصلة لهذا الغرض.

يمكن قراءة التفاصيل هنا .

في الوقت الحالي ، لم نتمكن من العثور على مكتبة مناسبة للتطوير مكتوبة في Python ، لذلك استخدمنا مكتبة جاهزة في C من هذا الموقع .

ثم جمعت اثنين من المرافق الخدمية iec104client و iec104server.

الزبون


عند استخدام عميل IEC 60870-5-104 ، تقوم الأداة المساعدة iec104client بإنشاء اتصال مع التابع ، وبعد ذلك يتم تلقي البيانات من الكائن ، وفي البداية يتم تشكيل الأمر (20) - المسح العام (يتم استجوابه عن طريق استجواب المحطة) ومعالجة البيانات المستلمة ، و ثم هناك تقنية متفرقة لتغيير قيمة المتغيرات.

في حالة فقدان الاتصال بالجهاز ، ستحاول الأداة المساعدة iec104client إجراء استرداد الاتصالات من تلقاء نفسها. عند استئناف جلسة الاتصال ، يتم إرسال فريق المسح الجماعي (20) أولاً ، ثم استقبال متقطع.

ASDUs المدعومة:

القيم المنفصلة:

  • <36> M_SP_TB_1 - معلومات فردية بطابع زمني CP56Time2a
  • <1> M_SP_NA_1 - معلومات أحادية
القيم التناظرية:
  • <13> M_ME_NC - القيمة المقاسة ، تنسيق فاصلة عائمة قصيرة بدون طابع زمني.
  • <36> M_ME_TF_1 - القيمة المقاسة ، تنسيق الفاصلة العائمة القصيرة مع الطابع الزمني CP56Time2a.
  • <11> M_ME_NB_1 - القيمة المقاسة ، القيمة المقاسة

ليس من الصعب فهم النص المصدر ، يجب إيلاء اهتمام خاص للوظيفة

static bool asduReceivedHandler (void* parameter, int address, CS101_ASDU asdu). 

كل معالجة البيانات المستلمة تحدث فيه.

يمكنك المغادرة فقط

  printf("REC type: %s(%i) elements: %i\n", TypeID_toString(CS101_ASDU_getTypeID(asdu)), CS101_ASDU_getTypeID(asdu), CS101_ASDU_getNumberOfElements(asdu)); 

ثم تتبع البيانات التي تم قبولها.

الصورة

يوضح الرسم البياني أعلاه مبدأ البرنامج.

بعد استلام قيمة الحالة لإشارة منفصلة أو تناظرية ، يتم نقل حزمة json udp إلى خادم المراقبة أو خادم آخر مقدم (نستخدم خادم الويب json).

لم يتغير تنسيق الحزمة: {"name": "myvar"، "data": [220.001]}

في الوقت الحالي ، لا يتم إرسال الطابع الزمني في الحزمة بسبب نقص الحاجة ، ولكن ما زلت أعتقد أنه سيلزم إضافته.

يبدو ملف تكوين المعلمات iec104client كما يلي:

ملف تكوين العميل
[
{ "Client":
{ "UdpPort" :"64000", -- UDP
"UdpIp" :"127.0.0.1", -- IP UDP
"Iec104Port":"2404", -- 104 ( )
"Iec104Ip" :"192.168.0.105", -- IP 104
"Debug" :"1", -- (1 3)
"TimeSync" :"1" -- (1 0)
}
}
,
{ "MeasureValue": --
{
"VarName" : "WaterTemp", --
"IecAddress": "8001", --
"Alias" : " ", --
"VarType" : "int32" --
//int – int 2
//int32 – 4 ( float)
//float –
//
}
}
,
{ "SinglePoint": --
{
"VarName" : "EngineOnOff", --
"IecAddress": "4001", --
"Alias" : " ", --
"VarType" : "bool" --
}
}
]


مثال صغير لملف التكوين لاستقبال القيم من خادم منخفض المستوى ، استجواب RPA Sirius 3-LV-03 عبر Modbus RTU. في هذه الحالة ، نحن مهتمون فقط بالتيارات والفولتية ، وبقية المعلومات تدخل نظام SCADA من SDTU.

محطة فرعية جهد 110 ك.ف.
[
{ "Client":
{ "UdpPort" :"64000",
"UdpIp" :"0.0.0.0",
"Iec104Port":"2404",
"Iec104Ip" :"...",
"Debug" :"1",
"TimeSync" :"0"
}
}
,
{ "SinglePoint":
{
"VarName" : "alarm",
"IecAddress": "681",
"Alias" : "alarm",
"VarType" : "bool"
}
}
,
{ "MeasureValue":
{
"VarName" : "Ia",
"IecAddress": "372",
"Alias" : "-- Ia --",
"VarType" : "float"
}
}
,
{ "MeasureValue":
{
"VarName" : "Ib",
"IecAddress": "373",
"Alias" : "-- Ib --",
"VarType" : "float"
}
}
,
{ "MeasureValue":
{
"VarName" : "Ic",
"IecAddress": "374",
"Alias" : "-- Ic --",
"VarType" : "float"
}
}

,
{ "MeasureValue":
{
"VarName" : "Uab",
"IecAddress": "369",
"Alias" : "-- Uab --",
"VarType" : "float"
}
}

,
{ "MeasureValue":
{
"VarName" : "Ubc",
"IecAddress": "370",
"Alias" : "-- Ubc --",
"VarType" : "float"
}
}
,
{ "MeasureValue":
{
"VarName" : "Uca",
"IecAddress": "371",
"Alias" : "-- Uca --",
"VarType" : "float"
}
}

]


الخادم


عند استخدام خادم IEC 60870-5-104 ، تعمل الأداة المساعدة iec104server كخادم UDP ، وتحافظ على الاتصال مع العميل ، وعندما تتغير حالة المتغير ، تنقل البيانات إلى قناة الاتصال.

يبدو ملف تكوين المعلمات iec104server كما يلي:

إعداد الخادم
[
{ "Server":
{ "UdpPort" :"64002",
"UdpIp" :"127.0.0.1",
"Iec104Port":"2404",
"Iec104Ip" :"192.168.0.103",
"Debug" :"1"
}
}
,
{ "MeasureValue":
{
"VarName" : "WaterTemp",
"IecAddress" : "8001",
"OffSet" : "0", -- (0– ) [100,200,300,400]
"ByteCount" : "2", -- (1,2)
"ByteSequence": "12",-- (1,12,21)
"Koef" : "1", --
"VarType" : "int" –
}
}
,
{ "SinglePoint":
{
"VarName" : "EngineOnOff",
"IecAddress" : "4001",
"OffSet" : "0",
"ByteCount" : "1", --
"ByteSequence": "1", --
"VarType" : "bool"
}
}
]


الصورة

تجميع


نظام التشغيل Windows:

لبناء المرافق ، تم استخدام حزمة msys2-i686-20180531 .

تحتاج إلى تثبيت هذه الحزمة ، على سبيل المثال ، على محرك الأقراص C: تحصل على شيء مثل C: \ msys32. نذهب إلى هذا الدليل وتشغيل ملف msys2_shell.cmd.

ستظهر نافذة وحدة تحكم حيث يمكنك الآن إدخال أوامر لينكس.

يجب عليك تثبيت المكتبات اللازمة للترجمة:

 pacman –S make pacman –S gcc 

الآن تحتاج إلى تنزيل مصدر الترجمة.

نذهب هنا ، قم بتنزيل الأرشيف ، انسخ المجلد lib60870-C إلى c: \ msys32.

في نافذة وحدة التحكم msys ، نقوم بتجميع مكتبة lib60870:

 cd /lib60870-C make clean make 

الصورة

افعل الآن

 cd scadapy104 

نبدأ تجميع الخادم:

 gcc -g -g -o ./bin/iec104server.exe iec104server.c ./parson/parson.c -I../src/inc/api -I../src/hal/inc -I../src/tls -I./parson ../build/lib60870.a –lpthread 

الصورة

نبدأ تجميع العميل:

 gcc -g -g -o ./bin/iec104client.exe iec104client.c ./parson/parson.c -I../src/inc/api -I../src/hal/inc -I../src/tls -I./parson ../build/lib60870.a -lpthread 

الصورة

في المجلد C:\msys32\lib60870-C\scadapy104\bin سيكون C:\msys32\lib60870-C\scadapy104\bin ملفان iec104client.exe و iec104server.exe.

لتشغيل هذه الملفات ، كانت هناك حاجة إلى ملفات dll بنظام التشغيل Windows 7.8
على إصدارات أخرى من ويندوز لم تحقق.

الآن ، إذا قمت بتشغيل أي من هذه الأدوات المساعدة ، فستظهر مطالبة تعليمات.

لينكس:

يجب تثبيت gcc وإنشاء الحزم إذا لم تكن مثبتًا (باستخدام Ubuntu):
$ sudo apt install build-basic
ثم يتم تجميع كل شيء بطريقة مماثلة.

يمكن إنشاء ملفات التكوين واختبارها في "ScadaPy creator".

للعملاء:

الصورة

بالنسبة للخادم:

الصورة

جميع المكتبات والمشاريع هنا.

Source: https://habr.com/ru/post/ar418167/


All Articles