Добавление протокола iec-104 в scadapy, предоставляет дополнительные возможности для расширения системы, как в домашней автоматизации, так и для локального применения на малых предприятиях.
Данный протокол довольно сложный в освоении, но в настоящий момент в интернете можно найти достаточно документации для ознакомления.
Что дает нам использование этого протокола?
Существенный фактор – это то, что протокол является асинхронным, в отличие от modbus, и данные передаются только в случае изменения текущего состояния переменной, что в свою очередь снижает нагрузку на каналы связи. Также имеется возможность получать метку времени изменения состояния переменной на объекте, на modbus для этого используются отдельные регистры.
Подробно прочитать можно здесь.
В настоящий момент нам не удалось найти подходящую библиотеку для освоения, написанную на Python, поэтому применили уже готовую библиотеку на С с этого сайта.
Затем скомпилировали две утилиты iec104client и iec104server.
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));
[
{ "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" -- тип переменной
}
}
]
[
{ "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":
{ "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"
}
}
]
pacman –S make
pacman –S gcc
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
будут находиться два файла iec104client.exe и iec104server.exe. К сожалению, не доступен сервер mySQL