IEC-60870
IEC 60870-5-104 是一种远动协议,用于监控和控制电力系统中地理上分散的过程设备——变电站、RTU 及类似设备。它运行于 TCP/IP 之上,通常使用众所周知的端口 2404。
该协议是推送驱动的:一旦会话建立,被控站(RTU)就会主动发送其持有的信息对象的非请求应用服务数据单元(ASDU)。客户端无需主动读取或写入——它只负责订阅并接收被控站上报的数据。
支持的操作
| 名称 | 值 | 描述 |
|---|---|---|
subscribe | Go 和 Java。唯一支持的操作。订阅的标签地址用于选择将哪个(些)被控站的哪些信息对象投递给该订阅;由被控站自身决定发送什么以及何时发送。 |
| 读取、写入和浏览均未实现,对其中任何一项的请求都会被拒绝。 |
|---|
连接串
IEC 60870-5-104 的连接串格式如下:
iec-60870-5-104:tcp://{ip-address}:{port}?{options}唯一支持的传输协议为 tcp,默认端口为 2404:
iec-60870-5-104:tcp://192.168.178.101:2404连接字符串选项
名称
类型
默认值
是否必需
说明
名称
IEC 60870-5-104
代码
iec-60870-5-104
Maven 依赖
<dependency>
<groupId>org.apache.plc4x</groupId>
<artifactId>plc4j-driver-iec-60870</artifactId>
<version>1.0.0</version>
</dependency>默认传输
tcp
支持的传输协议
tcp
配置选项:
request-timeout-ms
INT
4000
最大等待时间(毫秒),用于在连接建立期间等待测试帧和启动数据传输握手的回复。
传输配置选项:
tcp
tcp.connect-timeout-ms
整型(INT)
5000
连接超时时间(以毫秒为单位)。
tcp.read-timeout-ms
INT
0
Socket 读取超时时间(毫秒)。0 表示不超时。
tcp.write-timeout-ms
INT
0
Socket 写入超时时间(毫秒)。0 表示不超时。
tcp.no-delay
BOOLEAN
true
启用 TCP_NODELAY(禁用 Nagle 算法)。
tcp.keep-alive
BOOLEAN
false
启用 SO_KEEPALIVE。
tcp.send-buffer-size
INT
81920
发送缓冲区大小(字节)。0 表示使用系统默认值。
tcp.receive-buffer-size
INT
81920
以字节为单位的接收缓冲区大小。0 表示使用系统默认值。
tcp.local-address
STRING
要绑定的本地地址(可选)。如果未设置,则使用默认值。
tcp.local-port
INT
0
用于绑定的本地端口(可选)。0 表示使用临时端口。
标签地址
地址在 Go 和 Java 中均已实现。该协议是推送驱动的,因此标签仅用于订阅。关于各实现分别支持哪些功能,请参阅协议支持矩阵。
通用格式
标签地址命名某个站点中的一个信息对象,其书写格式为 <asdu>/<ioa>:
<asdu>是 2 字节的 ASDU 公共地址(即站点地址)。可以写作一个十进制数0..65535,也可以按字节逐个书写为<low>/<high>,每个0..255。<ioa>是 3 字节的 信息对象地址。可以写作一个十进制数0..16777215,也可以按字节逐个书写为<low>.<middle>.<high>,每个0..255。
按字节书写的形式采用最低有效字节在前的顺序,即字节在线路上出现的顺序。因此,作为 ASDU 地址的 1/2 表示的是 1 + 2 * 256 = 513,而不是 258。
这与形状相同但顺序相反的 KNX 驱动 a/b/c 地址正好颠倒——后者是最高有效部分(主组)在前。以 KNX 的方式解读 IEC-60870 地址会静默地成为另一个站点的合法地址,因此在移植地址或在两个驱动之间复制示例时,请务必仔细核对顺序。
* 可以代替任何数字,使该位置成为通配符,从而让一次订阅可以覆盖整个站点、整个字节范围,或连接上报的所有内容。
地址前后的空白会被裁剪,也允许使用前导零,但位数不能超过该分量的最大位数(字节为 3 位,完整 ASDU 地址为 5 位,完整信息对象地址为 8 位)。因此 007/002.03.004 是允许的,而 000007/2 则不允许。地址内部的空白不被接受。
每个到达的信息对象都会与每个订阅的地址进行匹配,只有被其覆盖的订阅才会收到该对象——站点本身上报它所拥有的全部数据,过滤工作在驱动中完成。
格式错误或超出范围的地址会在构建请求时被拒绝,并抛出 PlcInvalidTagException。
该驱动的早期版本完全忽略地址:接受任意字符串,且每个订阅都会收到每个到达的 ASDU,过滤交给消费方完成。因此现有代码需要复查其地址——特别是单独的 * 已不再是一个地址,“全部”地址是 */*——同时消费方侧的过滤现在可以移除了。
数据类型
标签地址不携带类型信息:信息对象的数据类型由送达它的 ASDU 的类型标识决定,而这只能在运行时获知,并非来自地址本身。
两个驱动都会将信息对象的质量描述符作为随附元数据附加在送达的值上,而不是将其悄然并入值中:invalid、notTopical、substituted、blocked,以及在 ASDU 携带时的 overflow。因此,站点标记为无效、被闭锁、被替换或非当前的读数,其呈现外观与正常读数并不相同——在信任某个值之前请先检查这些元数据。
示例
| 地址 | 含义 |
|---|---|
1/2 | ASDU 1,信息对象 2 |
65535/16777215 | 两个字段所能承载的最宽地址 |
1/2/3 | ASDU 513(低字节 1,高字节 2),信息对象 3 |
1/2.3.4 | ASDU 1,信息对象 262914(低字节 2,中字节 3,高字节 4) |
1/2/3.4.5 | ASDU 513,信息对象 328707 |
*/* | 每个站点的每个信息对象 |
1/* | ASDU 1 的每个信息对象 |
*/3.4.5 | 每个站点的信息对象 328707 |
1/2/3.*.5 | 低字节与高字节固定,中字节通配 |
表 1. 示例
评论
登录后参与评论
KnowForge