# ABB COMLI

COMLI 是 ABB 公司的一种专有通信协议，主要用于 ABB 的 PLC 和其他设备之间的数据交换。COMLI 协议支持点对点和多点通信，可以通过串行线路（例如 RS-232 或 RS-485）或以太网进行通信。

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

EMQX Neuron ABB COMLI 驱动用于通过串口网络访问 ABB 的 COMLI 协议兼容控制系统。

## 添加驱动

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

## 连接参数

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

| 参数                 | 说明                                                    |
| -------------------- | ------------------------------------------------------- |
| **接收超时时间** | 等待设备返回指令响应的时间。  |
| **指令发送间隔** | 发送每条读写指令之间的等待时间。某些串口设备在较短时间内接收到连续指令时，可能会丢弃某些指令。 |
| **发送重试次数** | 从机无响应指令返回时, 主机请求指令的重传次数。 |
| **串口设备** | 使用串口连接时，串口设备的路径，如 Linux 系统中 /dev/ttyS0。|
| **停止位** | 串口连接参数。 |
| **校验位** | 串口连接参数。 |
| **波特率** | 串口连接参数。 |
| **数据位** | 串口连接参数。 |

## 点位配置

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

### 数据类型

* INT16
* UINT16
* INT32
* UINT32
* INT64
* UINT64
* FLOAT
* DOUBLE
* BIT
* STRING

### 地址格式

> SLAVE!AREA.ADDRESS\[.BIT][#ENDIAN]\[.LEN\[H]\[L]\[D]\[E]]

#### **SLAVE**

必填，指从机地址或者是站点号。

#### AREA ADDRESS

| 区域 |数据类型 |寄存器大小| 属性  | 范围| 区域说明|备注                           |
| ---- | --------- | ---- | ---------- | ---- | ---- | -------------------------------- |
| 0    | bit       |1bit| 读/写 | 0 ~ 16384 | I/O-bits             ||
| 1   | 所有类型    |  16bit, 2byte | 读/写| 0 ~ 3071 | Register                         |bit 类型只读|

#### **.BIT**

选填，寄存器中的特定 bit，例如：
| 地址         | 数据类型 | 说明                                                |
| ----------- | ------- | --------------------------------------------------- |
| 1!1.100.0  | bit     | 指站号为1，Register 区域，地址为 100，第 0 位。    |
| 1!1.100.4  | bit     | 指站号为1，Register 区域，地址为 100，第 4 位。    |
| 2!1.200.15 | bit     | 指站号为2，Register 区域，地址为 200，第 15 位。   |

#### **#ENDIAN**

选填，字节顺序，适用于 int16/uint16/int32/uint32/float/int64/uint64/double 数据类型，详细说明见下表。
| 符号 | 字节顺序 | 支持的数据类型        | 备注 |
| --- | ------- | ------------------ | ----- |
| #B  | 2,1 or 8,7,6,5,4,3,2,1     | int16/uint16/int64/uint64/double       |       |
| #L  | 1,2 or 1,2,3,4,5,6,7,8    | int16/uint16/int64/uint64/double       | 不填，默认字节顺序 |
| #LL | 1,2,3,4 | int32/uint32/float | 不填，默认字节顺序 |
| #LB | 2,1,4,3 | int32/uint32/float | |
| #BB | 3,4,1,2 | int32/uint32/float | |
| #BL | 4,3,2,1 | int32/uint32/float | |

#### .LEN\[H]\[L]\[D]\[E]

当数据类型为 STRING 类型时，**.LEN** 是必填项，表示字符串需要占用的字节长度，每个寄存器中包含 **H**，**L**，**D** 和 **E** 四种存储方式，如下列表格所示。
| 符号 | 说明                                  |
| --- | ------------------------------------- |
| H   | 一个寄存器存储两个字节，高字节在前低字节在后。 |
| L   | 一个寄存器存储两个字节，低字节在前高字节在后。 |
| D   | 一个寄存器存储一个字节，且存储在低字节。      |
| E   | 一个寄存器存储一个字节，且存储在高字节。      |

### 地址示例

| 地址         | 数据类型 | 说明 |
| ----------- | ------- | --------- |
| 1!0.10      | bit      | 指站号为 1，I/O-bits 区域，地址为 10 |
| 1!0.1000      | bit      | 指站号为 1，I/O-bits 区域，地址为 1000 |
| 1!0.1100      | bit      | 指站号为 1，I/O-bits 区域，地址为 1100 |
| 1!1.10.12   | bit      | 指站号为 1，Register 区域，地址为 10，第12位 |
| 1!1.10      | int16    | 指站号为 1，Register 区域，地址为 10，字节顺序为 #L |
| 1!1.10#L    | int16    | 指站号为 1，Register 区域，地址为 10，字节顺序为 #L |
| 1!1.10#B    | int16    | 指站号为 1，Register 区域，地址为 10，字节顺序为 #B |
| 1!1.10      | uint16    | 指站号为 1，Register 区域，地址为 10，字节顺序为 #L |
| 1!1.10#L    | uint16    | 指站号为 1，Register 区域，地址为 10，字节顺序为 #L |
| 1!1.10#B    | uint16    | 指站号为 1，Register 区域，地址为 10，字节顺序为 #B |
| 1!1.10    | int32    | 指站号为 1，Register 区域，地址为 10，字节顺序为 #LL |
| 1!1.10#BB | int32   | 指站号为 1，Register 区域，地址为 10，字节顺序为 #BB |
| 1!1.10#LB | int32   | 指站号为 1，Register 区域，地址为 10，字节顺序为 #LB |
| 1!1.10#BL | int32   | 指站号为 1，Register 区域，地址为 10，字节顺序为 #BL |
| 1!1.10    | uint32    | 指站号为 1，Register 区域，地址为 10，字节顺序为 #LL |
| 1!1.10#BB | uint32   | 指站号为 1，Register 区域，地址为 10，字节顺序为 #BB |
| 1!1.10#LB | uint32   | 指站号为 1，Register 区域，地址为 10，字节顺序为 #LB |
| 1!1.10#BL | uint32   | 指站号为 1，Register 区域，地址为 10，字节顺序为 #BL |
| 1!1.10 | float    | 指站号为 1，Register 区域，地址为 10，字节顺序为 #LL |
| 1!1.10#BB | float    | 指站号为 1，Register 区域，地址为 10，字节顺序为 #BB |
| 1!1.10#LB | float    | 指站号为 1，Register 区域，地址为 10，字节顺序为 #LB |
| 1!1.10#BL | float    | 指站号为 1，Register 区域，地址为 10，字节顺序为 #BL |
| 1!1.10    | uint64    | 指站号为 1，Register 区域，地址为 10，字节顺序为 #L |
| 1!1.10#B | uint64   | 指站号为 1，Register 区域，地址为 10，字节顺序为 #B |
| 1!1.10#L | uint64   | 指站号为 1，Register 区域，地址为 10，字节顺序为 #L |
| 1!1.10 | int64    | 指站号为 1，Register 区域，地址为 10，字节顺序为 #L |
| 1!1.10#B    | int64    | 指站号为 1，Register 区域，地址为 10，字节顺序为 #B |
| 1!1.10#L | int64   | 指站号为 1，Register 区域，地址为 10，字节顺序为 #L |
| 1!1.10 | double    | 指站号为 1，Register 区域，地址为 10，字节顺序为 #L |
| 1!1.10#B    | double    | 指站号为 1，Register 区域，地址为 10，字节顺序为 #B |
| 1!1.10#L | double   | 指站号为 1，Register 区域，地址为 10，字节顺序为 #L |
| 1!1.10.10  | String  | 指站号为1，Register 区域，地址为 10，字符长度为 10，字节顺序为 L，即占用的地址为 10 ～ 15 |
| 1!1.10.10H | String  | 指站号为1，Register 区域，地址为 10，字符长度为 10，字节顺序为 H，即占用的地址为 10 ～ 15 |
| 1!1.10.10L | String  | 指站号为1，Register 区域，地址为 10，字符长度为 10，字节顺序为 L，即占用的地址为 10 ～ 15 |
| 1!1.10.10D | String  | 指站号为1，Register 区域，地址为 10，字符长度为 10，字节顺序为 D，即占用的地址为 10 ～ 20 |
| 1!1.10.10E | String  | 指站号为1，Register 区域，地址为 10，字符长度为 10，字节顺序为 E，即占用的地址为 10 ～ 20 |
