ScadaPy:添加IEC 60870-5-104协议

将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”中创建和测试配置文件。

对于客户:

图片

对于服务器:

图片

所有库和项目都在这里。

Source: https://habr.com/ru/post/zh-CN418167/


All Articles