توفر إضافة بروتوكول 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".
للعملاء:

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

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