ScadaPy: tambahkan protokol IEC 60870-5-104

Menambahkan protokol iec-104 ke scadapy memberikan peluang tambahan untuk memperluas sistem, baik dalam otomatisasi rumah dan untuk penggunaan lokal di perusahaan kecil.

Protokol ini cukup sulit dipelajari, tetapi saat ini di Internet Anda dapat menemukan dokumentasi yang cukup untuk membiasakan diri.

Apa yang memberi kami penggunaan protokol ini?

Faktor penting adalah protokolnya tidak sinkron, tidak seperti modbus, dan data ditransmisikan hanya jika mengubah keadaan variabel saat ini, yang pada gilirannya mengurangi beban pada saluran komunikasi. Dimungkinkan juga untuk mendapatkan cap waktu dari keadaan variabel pada objek, pada modbus, register terpisah digunakan untuk ini.

Detailnya bisa dibaca di sini .

Saat ini, kami tidak dapat menemukan perpustakaan yang sesuai untuk pengembangan yang ditulis dengan Python, jadi kami menggunakan perpustakaan yang sudah jadi di C dari situs ini .

Kemudian dikompilasi dua utilitas iec104client dan iec104server.

Pelanggan


Saat menggunakan klien IEC 60870-5-104, utilitas iec104client membuat koneksi dengan slave, setelah itu data diterima dari objek, dan awalnya perintah (20) dibentuk - survei umum (diinterogasi oleh interogasi stasiun) dan pemrosesan data yang diterima, dan lalu ada teknik sporadis untuk mengubah nilai variabel.

Jika terjadi kehilangan komunikasi dengan perangkat, utilitas iec104client akan berupaya melakukan pemulihan komunikasi sendiri. Ketika melanjutkan kembali sesi komunikasi, tim survei kelompok (20) dikirim terlebih dahulu, dan kemudian penerimaan sporadis.

ASDU yang didukung:

Nilai Diskrit:

  • <36> M_SP_TB_1 - informasi tunggal dengan cap waktu CP56Time2a
  • <1> M_SP_NA_1 - informasi tunggal
Nilai analog:
  • <13> M_ME_NC - nilai yang diukur, format titik-mengambang pendek tanpa cap waktu.
  • <36> M_ME_TF_1 - nilai yang diukur, format titik-mengambang pendek dengan cap waktu CP56Time2a.
  • <11> M_ME_NB_1 - nilai yang diukur, nilai yang diskalakan

Tidak sulit untuk memahami teks sumber, perhatian khusus harus diberikan pada fungsinya

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

Semua pemrosesan data yang diterima terjadi di dalamnya.

Anda bisa pergi begitu saja

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

dan kemudian melacak data apa yang telah diterima.

gambar

Diagram di atas menunjukkan prinsip program.

Setelah menerima nilai status dari sinyal diskrit atau analog, paket json udp ditransmisikan ke server pemantauan atau server lain yang disediakan (kami menggunakan server web json).

Format paket tidak berubah: {"name": "myvar", "data": [220.001]}

Saat ini, cap waktu tidak ditransmisikan dalam paket karena kurangnya kebutuhan, tetapi saya masih berpikir bahwa itu perlu ditambahkan.

File konfigurasi parameter iec104client terlihat seperti ini:

File konfigurasi klien
[
{ "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" --
}
}
]


Contoh kecil file konfigurasi untuk menerima nilai dari server tingkat rendah, menginterogasi RPA Sirius 3-LV-03 melalui Modbus RTU. Dalam hal ini, kami hanya tertarik pada arus dan tegangan, dan informasi lainnya memasuki sistem SCADA SDTU.

Gardu 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"
}
}

]


Server


Saat menggunakan server IEC 60870-5-104, utilitas iec104server bertindak sebagai server udp, memelihara komunikasi dengan klien dan, ketika keadaan variabel berubah, mentransfer data ke saluran komunikasi.

File konfigurasi parameter iec104server terlihat seperti ini:

Pengaturan server
[
{ "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"
}
}
]


gambar

Kompilasi


Windows:

Untuk membangun utilitas, paket msys2-i686-20180531 digunakan.

Anda perlu menginstal paket ini, misalnya, pada drive C:, Anda mendapatkan sesuatu seperti C: \ msys32. Kami masuk ke direktori ini dan menjalankan file msys2_shell.cmd.

Sebuah jendela konsol akan muncul di mana Anda sekarang dapat memasukkan perintah linux.

Anda harus menginstal perpustakaan yang diperlukan untuk kompilasi:

 pacman –S make pacman –S gcc 

Sekarang Anda perlu mengunduh sumber untuk kompilasi.

Kita buka di sini, unduh arsipnya, salin folder lib60870-C ke c: \ msys32.

Di jendela konsol msys, kami mengkompilasi pustaka lib60870:

 cd /lib60870-C make clean make 

gambar

Sekarang lakukan

 cd scadapy104 

Kami memulai perakitan server:

 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 

gambar

Kami memulai perakitan klien:

 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 

gambar

Dalam folder C:\msys32\lib60870-C\scadapy104\bin akan ada dua file iec104client.exe dan iec104server.exe.

Untuk menjalankan file-file ini, pada Windows 7,8 dll file diperlukan
Pada versi lain windows tidak memeriksa.

Sekarang, jika Anda menjalankan utilitas ini, prompt bantuan akan muncul.

Linux:

Anda harus menginstal gcc dan membuat paket jika Anda tidak menginstal (menggunakan Ubuntu):
$ sudo untuk menginstal build-essential
Kemudian semuanya dikompilasi dengan cara yang sama.

File konfigurasi dapat dibuat dan diuji dalam "pencipta ScadaPy".

Untuk pelanggan:

gambar

Untuk server:

gambar

Semua perpustakaan dan proyek ada di sini.

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


All Articles