将iec-104协议添加到scadapy中,为家庭自动化和小型企业本地使用的系统扩展提供了更多机会。
该协议很难学习,但是目前在Internet上您可以找到足够的文档来熟悉自己。
是什么让我们使用了此协议?
一个重要因素是,该协议与modbus不同,该协议是异步的,并且仅在更改变量的当前状态的情况下才传输数据,从而减少了通信通道上的负载。 也可以获取对象上变量状态的时间戳;在modbus上,为此使用了单独的寄存器。
详细信息可以在
这里阅读。
目前,我们找不到适合用Python编写的开发库,因此我们
从该站点使用了现成的C语言库。
然后编译了两个实用程序iec104client和iec104server。
顾客
当使用IEC 60870-5-104客户端时,iec104client实用程序与从站建立连接,此后从对象接收数据,并首先形成命令(20)-常规调查(通过站查询来查询)和处理接收到的数据,以及然后有一种零星的技术来更改变量的值。
如果与设备的通信中断,iec104client实用程序将尝试自行执行通信恢复。 当恢复通信会话时,首先发送组调查团队(20),然后进行零星接收。
支持的ASDU:离散值:- <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 Web服务器)。
软件包格式未更改:{“名称”:“ myvar”,“数据”:[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" --
}
}
]
一个用于从低级服务器接收值的配置文件的小示例,该文件通过Modbus RTU询问RPA Sirius 3-LV-03。 在这种情况下,我们只对电流和电压感兴趣,其余信息进入SDTU的SCADA系统。
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"
}
}
]
伺服器
使用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文件。
将出现一个控制台窗口,您现在可以在其中输入linux命令。
您必须安装必要的库才能进行编译:
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
将有两个文件iec104client.exe和iec104server.exe。
要运行这些文件,在Windows 7.8
上需要dll
文件在其他版本的Windows上没有检查。
现在,如果您运行这些实用程序中的任何一个,将出现一个帮助提示。
Linux:如果未安装(使用Ubuntu),则必须安装gcc并制作软件包:
$ sudo apt install build-essential
然后,所有内容都以类似的方式进行编译。
可以在“ ScadaPy creator”中创建和测试配置文件。
对于客户:

对于服务器:

所有库和项目都
在这里。