# IEC60870-5-104

IEC60870-5-104 是一种电力自动化系统中常用的通信协议，使用 TCP/IP 协议作为底层通信协议，用于监视和控制电力系统中的各种设备，如变电站、发电机、开关等。

通用配置步骤见[添加南向驱动](../south-devices.md)与[组与点位](../../groups-tags/groups-tags.md)。

EMQX Neuron 支持以总召唤以及设备主动上报数据的方式采集遥信、遥测和遥脉（电度召唤）数据，以及支持通过遥控遥调对设备进行控制。

## 添加驱动

在 **数据采集 → 南向设备** 页点击 **添加设备**，驱动类型选择 **IEC60870-5-104**。

## 连接参数

点击驱动卡片进入**设备配置**页填写：

| 参数          | 说明                  |
| ------------ | --------------------- |
| **设备 IP 地址** | 设备的 IPv4 地址                |
| **设备端口**     | 设备端口号，默认为 2404  |
| **公共地址**       |  公共地址，唯一标识数据对象               |
| **总召唤间隔** | 发送总招唤指令的间隔         |
| **时钟同步间隔** | 是否开启时钟同步，定期向设备发送时钟同步请求|
| **遥脉间隔** | 是否开启遥脉，定时召唤总电度信息|
| **T0** | T0 超时时间，建立 TCP 连接的超时时间，单位：秒 |
| **T1** | T1 超时时间，等待接收方响应请求的超时时间，单位：秒 |
| **T2** | 如果 T2 时间内未接收到新的 I 帧报文，则发送 S 帧报文，单位：秒 |
| **T3** | 如果 T3 时间内未接收到任何报文，则发送测试报文，单位：秒 |
| **W** | 如果接收到 W 个 I 帧，必定发送 S 帧 |

## 点位配置

以下为本驱动支持的数据类型与地址格式。

点位属性配置为`Read`，则代表该点位不仅会根据配置的`总召唤间隔`，定期上报104 Server发出的数据点的值，同时还会根据组的`采集间隔`，定期上报数据。

点位属性配置为`Subscribe`，则代表该点位不仅会根据配置的`总召唤间隔`，定期上报104 Server发出的数据点的值，同时当数据点位变化后，EMQX Neuron 也会收到变化的数据点，并通过北向应用配置将数据点北向上报。

::: tip 提示
由于104协议的实时性要求，配置为`Subscribe`的点位，EMQX Neuron 会在收到数据点位变化后，立即将变化的数据点位上报到北向应用，并且不受采集组的`采集间隔`限制。
::: 

::: tip 提示
当采集组的数据点位都配置为`Subscribe`类型，即使数据点位没有任何变化，总召唤上报仍会触发。
::: 

点位属性配置为`Write`，则代表该点位支持EMQX Neuron 主动写入数据到104 Server，注意，104协议的读地址与写地址是分离的，一个点位地址位要么是读点位要么是写点位，不存在同时可读可写的点位，具体信息可查阅104协议相关文档。

点位属性`Subscribe`、`Read`、`Write`只可单独配置。

::: tip 提示
建议在同一个采集组中，只配置一种点位属性，例如，一个采集组中，只配置`Subscribe`属性的点位，或者只配置`Read`属性的点位，或者只配置`Write`属性的点位。
::: 

### 地址格式

> IOA

#### IOA
在 IEC60870-5-104 协议中，IOA (Information Object Address) 指的是信息对象地址，是用于唯一标识一个数据对象的地址，用于指定一个信息对象（遥信、遥测、遥控等）的地址。

::: tip
IEC60870-5-104 协议中，一个 IOA 标识的地址只属于一种类型，且能读的点位如遥测等与控制点位如遥控等的 IOA 并不相同，例如，遥测点位 IOA 为 100，这个点位对应的遥控点位 IOA 并不是 100，而是映射到其他的 IOA。
::: 

### 实现规范

#### 设备通讯流程

* 支持数据防止数据丢失与重复，引用 IEC60870-5-104 中 5.1
* 支持测试链路功能，引用 IEC60870-5-104 中 5.2
* 支持启动停止链路功能，引用 IEC60870-5-104 中 5.3
* 支持链路初始化功能，引用 IEC60870-5-104 中 7.1
* 支持设备主动上送数据，引用 IEC60870-5-104 中 7.3, 7.4
* 支持总召唤设备所有数据功能，引用 IEC60870-5-104 中 7.5
* 支持时钟同步功能，引用 IEC60870-5-104 中 7.6
* 支持指令遥控功能，引用 IEC60870-5-104 中 7.7
* 支持召唤累积量功能，引用 IEC60870-5-104 中 7.8

#### 支持的 TypeIDs

##### 监控方向

* M_SP_NA_1: 单点信息 (BIT、 BOOL)
* M_SP_TB_1: 带时标的单点信息 (BIT、 BOOL)
* M_DP_NA_1: 双点信息 (UINT8)
* M_DP_TB_1: 带时标的双点信息 (UINT8)
* M_ST_NA_1: 步位置信息 (INT8)
* M_ST_TB_1: 带时标的步位置信息 (INT8)
* M_BO_NA_1: 32比特串 (UINT32、 INT32)
* M_BO_TB_1: 带时标的32比特串 (UINT32、 INT32)
* M_ME_NA_1: 测量值，归一化值 (FLOAT)
* M_ME_TD_1: 带时标的测量值，归一化值 (FLOAT)
* M_ME_NB_1: 测量值，标度化值 (UINT16、 INT16)
* M_ME_TE_1: 带时标的测量值，标度化值 (UINT16、 INT16)
* M_ME_NC_1: 测量值，短浮点数 (FLOAT)
* M_ME_TF_1: 带时标的测量值，短浮点数 (FLOAT)
* M_IT_NA_1: 累计量 (UINT32、 INT32)
* M_ME_ND_1: 测量值，归一化值，不带品质描述词 (FLOAT)

##### 控制方向

* C_SC_NA_1: 单点遥控 (BIT、 BOOL)
* C_DC_NA_1: 双点遥控 (UINT8)
* C_RC_NA_1: 步调节命令 (INT8)
* C_SE_NA_1: 设置归一化值 (FLOAT, -1.0 ~ 1.0)
* C_SE_NB_1: 设置标度化值 (UINT16、 INT16)
* C_SE_NC_1: 设置短浮点数 (FLOAT)
* C_BO_NA_1: 设置32比特串 (UINT32、 INT32)

::: tip
不支持 带时标的控制信息对象，如 C_SC_TA_1、C_DC_TA_1、C_RC_TA_1、C_SE_TA_1、C_SE_TB_1、C_SE_TC_1 等。
::: 

### 数据订阅
IEC60870-5-104 在协议层面支持点位发生改变时，设备主动上报点位值。在 EMQX Neuron 侧需要给点位配置 Subscribe 属性，当设备向 EMQX Neuron 发送变化数据时，EMQX Neuron 才会及时把此变化消息发送到对应的北向应用中。

### 地址示例

| IOA         | 类型  | 说明 |
| :-------- | :------------ | :---- |
| 100 | M_SP_NA_1 | 读取 IOA 为 100 的一位开关量（单点信息） |
| 1000| C_SC_NA_1 | 单点遥控，对 IOA 为 1000 的信息对象进行一位开关量进行控制写入 |
| 400 | M_ME_NA_1 | 读取 IOA 为 400 的测量值 |
| 4000|C_SE_NA_1 | 单点控制，对 IOA 为 4000 的信息对象进行控制写入 |
如上表中 100 与 1000 存在映射关系，则对 1000 进行控制写入后，能从 100 中读到写入的值；或是 400 与 4000 存在映射关系，则对 4000 进行控制写入后，能从 400 中读到写入的值。

::: tip
支持点位时间以及点位质量的数据点，在北向发送数据时，将会可选的增加对应点位的质量以及时间。
::: 

## 应用场景

您可通过[IEC 60870-5-104 Server Simulator](https://www.freyrscada.com/iec-60870-5-104-Client-Simulator.php) 模拟 IEC60870-5-104 设备测试到 EMQX Neuron 的连接，具体步骤，见[IEC 60870-5-104 Server 模拟器连接示例](./example/server-simulator/simulator.md)。
