ScadaPy: ajouter le protocole IEC 60870-5-104

L'ajout du protocole iec-104 à la scadapy offre des opportunités supplémentaires pour étendre le système, à la fois dans la domotique et pour une utilisation locale dans les petites entreprises.

Ce protocole est assez difficile à apprendre, mais pour le moment sur Internet, vous pouvez trouver suffisamment de documentation pour vous familiariser.

Qu'est-ce qui nous donne l'utilisation de ce protocole?

Un facteur important est que le protocole est asynchrone, contrairement au Modbus, et les données ne sont transmises qu'en cas de changement de l'état actuel de la variable, ce qui réduit à son tour la charge sur les canaux de communication. Il est également possible d'obtenir l'horodatage de l'état de la variable sur l'objet; sur modbus, des registres séparés sont utilisés pour cela.

Les détails peuvent être lus ici .

Pour le moment, nous n'avons pas pu trouver une bibliothèque appropriée pour le développement écrite en Python, nous avons donc utilisé une bibliothèque prête à l'emploi en C à partir de ce site .

Puis compilé deux utilitaires iec104client et iec104server.

Client


Lors de l'utilisation du client IEC 60870-5-104, l'utilitaire iec104client établit une connexion avec l'esclave, après quoi les données sont reçues de l'objet, et initialement la commande (20) est formée - l'enquête générale (interrogée par interrogation de la station) et le traitement des données reçues, et il existe ensuite une technique sporadique pour modifier la valeur des variables.

En cas de perte de communication avec le périphérique, l'utilitaire iec104client tentera d'effectuer lui-même une récupération de communication. Lors de la reprise d'une session de communication, l'équipe d'enquête de groupe (20) est envoyée en premier, puis en réception sporadique.

ASDU pris en charge:

Valeurs discrètes:

  • <36> M_SP_TB_1 - informations singleton avec horodatage CP56Time2a
  • <1> M_SP_NA_1 - informations singleton
Valeurs analogiques:
  • <13> M_ME_NC - valeur mesurée, format court à virgule flottante sans horodatage.
  • <36> M_ME_TF_1 - valeur mesurée, format court à virgule flottante avec horodatage CP56Time2a.
  • <11> M_ME_NB_1 - valeur mesurée, valeur mise à l'échelle

Il n'est pas difficile de comprendre le texte source, une attention particulière doit être portée à la fonction

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

Tout le traitement des données reçues y a lieu.

Tu peux juste partir

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

puis suivez les données qui ont été acceptées.

image

Le schéma ci-dessus montre le principe du programme.

Après avoir reçu la valeur d'état d'un signal discret ou analogique, le paquet json udp est transmis au serveur de surveillance ou à un autre serveur fourni (nous utilisons le serveur Web json).

Le format du package n'a pas changé: {"nom": "myvar", "data": [220.001]}

Actuellement, l'horodatage n'est pas transmis dans le paquet en raison du manque de besoin, mais je pense toujours qu'il devra être ajouté.

Le fichier de configuration des paramètres iec104client ressemble à ceci:

Fichier de configuration client
[
{ "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" --
}
}
]


Un petit exemple de fichier de configuration pour recevoir des valeurs d'un serveur de bas niveau, interrogeant RPA Sirius 3-LV-03 via Modbus RTU. Dans ce cas, nous ne sommes intéressés que par les courants et les tensions, et le reste des informations entre dans le système SCADA de SDTU.

Sous-station 110 kV
[
{ "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"
}
}

]


Serveur


Lors de l'utilisation du serveur CEI 60870-5-104, l'utilitaire iec104server agit comme un serveur udp, maintient la communication avec le client et, lorsque l'état de la variable change, transfère les données vers le canal de communication.

Le fichier de configuration des paramètres iec104server ressemble à ceci:

Configuration du serveur
[
{ "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"
}
}
]


image

Compilation


Windows:

Pour construire les utilitaires, le package msys2-i686-20180531 a été utilisé.

Vous devez installer ce package, par exemple, sur le lecteur C:, vous obtenez quelque chose comme C: \ msys32. Nous allons dans ce répertoire et exécutons le fichier msys2_shell.cmd.

Une fenêtre de console apparaîtra dans laquelle vous pouvez maintenant entrer des commandes linux.

Vous devez installer les bibliothèques nécessaires à la compilation:

 pacman –S make pacman –S gcc 

Vous devez maintenant télécharger la source pour la compilation.

Nous allons ici, téléchargeons l'archive, copions le dossier lib60870-C dans c: \ msys32.

Dans la fenêtre de la console msys, nous compilons la bibliothèque lib60870:

 cd /lib60870-C make clean make 

image

Maintenant

 cd scadapy104 

Nous commençons l'assemblage du serveur:

 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 

image

Nous commençons l'assemblage client:

 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 

image

Dans le dossier C:\msys32\lib60870-C\scadapy104\bin aura deux fichiers iec104client.exe et iec104server.exe.

Pour exécuter ces fichiers, sur Windows 7.8, des fichiers DLL étaient nécessaires
Sur d'autres versions de Windows n'a pas vérifié.

Maintenant, si vous exécutez l'un de ces utilitaires, une invite d'aide apparaît.

Linux:

Vous devez installer le gcc et créer des packages si vous n'êtes pas installé (en utilisant Ubuntu):
$ sudo apt install build-essentiel
Ensuite, tout est compilé de manière similaire.

Les fichiers de configuration peuvent être créés et testés dans «ScadaPy creator».

Pour le client:

image

Pour le serveur:

image

Toutes les bibliothèques et projets sont ici.

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


All Articles