Das Hinzufügen des iec-104-Protokolls zur Scadapy bietet zusätzliche Möglichkeiten zur Erweiterung des Systems, sowohl in der Hausautomation als auch für den lokalen Einsatz in kleinen Unternehmen.
Dieses Protokoll ist ziemlich schwer zu erlernen, aber im Moment finden Sie im Internet genügend Dokumentation, um sich vertraut zu machen.
Was gibt uns die Verwendung dieses Protokolls?
Ein wichtiger Faktor ist, dass das Protokoll im Gegensatz zum Modbus asynchron ist und Daten nur übertragen werden, wenn der aktuelle Status der Variablen geändert wird, was wiederum die Belastung der Kommunikationskanäle verringert. Es ist auch möglich, den Zeitstempel des Zustands der Variablen auf dem Objekt abzurufen, auf dem Modbus werden hierfür separate Register verwendet.
Details können hier gelesen
werden .
Im Moment konnten wir keine geeignete Bibliothek für die in Python geschriebene Entwicklung finden, daher haben wir
von dieser Site aus eine vorgefertigte Bibliothek in C verwendet.
Dann kompilierte zwei Dienstprogramme iec104client und iec104server.
Kunde
Bei Verwendung des IEC 60870-5-104-Clients stellt das Dienstprogramm iec104client die Kommunikation mit dem Slave her, wonach die Daten vom Objekt empfangen werden, und zunächst wird der Befehl (20) gebildet - die allgemeine Vermessung (durch Stationsabfrage abgefragt) und die Verarbeitung der empfangenen Daten und Dann gibt es eine sporadische Technik zum Ändern des Werts von Variablen.
Bei einem Kommunikationsverlust mit dem Gerät versucht das Dienstprogramm iec104client, selbst eine Kommunikationswiederherstellung durchzuführen. Bei Wiederaufnahme einer Kommunikationssitzung wird zuerst das Gruppenumfrageteam (20) gesendet und dann sporadisch empfangen.
Unterstützte ASDUs:Diskrete Werte:- <36> M_SP_TB_1 - Singleton-Informationen mit einem Zeitstempel CP56Time2a
- <1> M_SP_NA_1 - Singleton-Informationen
Analoge Werte:- <13> M_ME_NC - Messwert, kurzes Gleitkommaformat ohne Zeitstempel.
- <36> M_ME_TF_1 - Messwert, kurzes Gleitkommaformat mit Zeitstempel CP56Time2a.
- <11> M_ME_NB_1 - Messwert, skalierter Wert
Es ist nicht schwer, den Quelltext zu verstehen. Besonderes Augenmerk sollte auf die Funktion gelegt werden
static bool asduReceivedHandler (void* parameter, int address, CS101_ASDU asdu).
Die gesamte Verarbeitung der empfangenen Daten erfolgt darin.
Du kannst einfach gehen
printf("REC type: %s(%i) elements: %i\n", TypeID_toString(CS101_ASDU_getTypeID(asdu)), CS101_ASDU_getTypeID(asdu), CS101_ASDU_getNumberOfElements(asdu));
und verfolgen Sie dann, welche Daten akzeptiert wurden.

Das obige Diagramm zeigt das Prinzip des Programms.
Nach dem Empfang des Statuswerts eines diskreten oder analogen Signals wird das json udp-Paket an den Überwachungsserver oder einen anderen bereitgestellten Server übertragen (wir verwenden den json-Webserver).
Das Paketformat hat sich nicht geändert: {"Name": "Myvar", "Daten": [220.001]}
Derzeit wird der Zeitstempel aufgrund mangelnder Notwendigkeit nicht im Paket übertragen, aber ich denke immer noch, dass er hinzugefügt werden muss.
Die Konfigurationsdatei für den Parameter iec104client sieht folgendermaßen aus:
Client-Konfigurationsdatei[
{ "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" --
}
}
]
Ein kleines Beispiel für eine Konfigurationsdatei zum Empfangen von Werten von einem Server auf niedriger Ebene, die RPA Sirius 3-LV-03 über Modbus RTU abfragt. In diesem Fall interessieren uns nur Ströme und Spannungen, und der Rest der Informationen gelangt in das SCADA-System von SDTU.
110 kV Umspannwerk[
{ "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"
}
}
]
Server
Bei Verwendung des Servers IEC 60870-5-104 fungiert das Dienstprogramm iec104server als udp-Server, verwaltet die Kommunikation mit dem Client und überträgt Daten an den Kommunikationskanal, wenn sich der Status der Variablen ändert.
Die Konfigurationsdatei für den Parameter iec104server sieht folgendermaßen aus:
Server-Setup[
{ "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"
}
}
]

Zusammenstellung
Windows:Zum Erstellen der Dienstprogramme wurde das Paket
msys2-i686-20180531 verwendet.
Sie müssen dieses Paket installieren, z. B. auf dem Laufwerk C: erhalten Sie so etwas wie C: \ msys32. Wir gehen in dieses Verzeichnis und führen die Datei msys2_shell.cmd aus.
Es erscheint ein Konsolenfenster, in dem Sie jetzt Linux-Befehle eingeben können.
Sie müssen die für die Kompilierung erforderlichen Bibliotheken installieren:
pacman –S make pacman –S gcc
Jetzt müssen Sie die Quelle zum Kompilieren herunterladen.
Wir gehen
hierher, laden das Archiv herunter und kopieren den Ordner lib60870-C nach c: \ msys32.
Im msys-Konsolenfenster kompilieren wir die lib60870-Bibliothek:
cd /lib60870-C make clean make

Jetzt tu es
cd scadapy104
Wir beginnen mit der Montage des Servers:
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

Wir starten die Kundenmontage:
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

Im Ordner
C:\msys32\lib60870-C\scadapy104\bin
sich zwei Dateien, iec104client.exe und iec104server.exe.
Um diese Dateien auszuführen, wurden unter Windows 7.8 DLL-
Dateien benötigt
Bei anderen Windows-Versionen nicht überprüft.
Wenn Sie eines dieser Dienstprogramme ausführen, wird eine Hilfeaufforderung angezeigt.
Linux:Sie müssen die gcc installieren und Pakete erstellen, wenn Sie nicht installiert sind (mit Ubuntu):
$ sudo apt install build-essential
Dann wird alles auf ähnliche Weise kompiliert.
Konfigurationsdateien können in „ScadaPy Creator“ erstellt und getestet werden.
Für den Kunden:

Für Server:

Alle Bibliotheken und Projekte sind
hier.