# Modbus Tcp 模块文档 (Python 版本)

## Modbus Tcp

#### Func01 读取线圈量

* 方法说明

  Modbus 读取线圈量，功能码 01。

```python
def read_coil_status(ip: str, port: int, slave_id: int, offset: int) -> Optional[bool]:
```

* 输入参数
* `ip`，str 类型，从机 IP。
* `port`，int 类型，从机端口。
* `slave_id`，int 类型，从机 slave ID。
* `offset`，int 类型，Modbus 地址。
* 输出参数
* `None`，读取失败。
* `bool`，读取成功的返回值。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### Func02 读取离散输入

* 方法说明

  Modbus 读取离散输入，功能码 02。

```python
def read_input_status(ip: str, port: int, slave_id: int, offset: int) -> Optional[bool]:
```

* 输入参数
* `ip`，str 类型，从机 IP。
* `port`，int 类型，从机端口。
* `slave_id`，int 类型，从机 slave ID。
* `offset`，int 类型，Modbus 地址。
* 输出参数
* `None`，读取失败。
* `bool`，读取成功的返回值。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### Func03 读取保持寄存器

* 方法说明

  Modbus 读取保持寄存器，功能码 03。

```python
def read_holding_register(ip: str, port: int, slave_id: int, offset: int, data_type: int) -> Optional[int]:
```

* 输入参数
* `ip`，str 类型，从机 IP。
* `port`，int 类型，从机端口。
* `slave_id`，int 类型，从机 slave ID。
* `offset`，int 类型，Modbus 地址。
* `data_type`，int 类型，2：无符号整型，3：有符号整型。
* 输出参数
* `None`，读取失败。
* `int`，读取成功的返回值。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### Func04 读取输入寄存器

* 方法说明

  Modbus 读取只读输入寄存器，功能码 04。

```python
def read_input_register(ip: str, port: int, slave_id: int, offset: int, data_type: int) -> Optional[int]:
```

* 输入参数
* `ip`，str 类型，从机 IP。
* `port`，int 类型，从机端口。
* `slave_id`，int 类型，从机 slave ID。
* `offset`，int 类型，Modbus 地址。
* `data_type`，int 类型，2：无符号整型，3：有符号整型。
* 输出参数
* `None`，读取失败。
* `int`，读取成功的返回值。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### Func01 批量读取线圈量

* 方法说明

  Modbus 读取线圈量多个连续地址值，并以列表的形式返回其中的值，功能码 01。

```python
def batch_read_coil_status(ip: str, port: int, slave_id: int, offset: int, length: int) -> Optional[List[bool]]:
```

* 输入参数
* `ip`，str 类型，从机 IP。
* `port`，int 类型，从机端口。
* `slave_id`，int 类型，从机 slave ID。
* `offset`，int 类型，Modbus 首地址。
* `length`，int 类型，Modbus 地址数量。
* 输出参数
* `None`，读取失败。
* `List[bool]`，读取成功后，返回结果列表。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### Func02 批量读取离散输入

* 方法说明

  Modbus 读取离散输入多个连续地址值，并以列表的形式返回其中的值，功能码 02。

```python
def batch_read_input_status(ip: str, port: int, slave_id: int, offset: int, length: int) -> Optional[List[bool]]:
```

* 输入参数
* `ip`，str 类型，从机 IP。
* `port`，int 类型，从机端口。
* `slave_id`，int 类型，从机 slave ID。
* `offset`，int 类型，Modbus 首地址。
* `length`，int 类型，Modbus 地址数量。
* 输出参数
* `None`，读取失败。
* `List[bool]`，读取成功后，返回结果列表。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### Func03 批量读取保持寄存器

* 方法说明

  Modbus 读取保持寄存器多个连续地址值，并以列表的形式返回其中的值，功能码 03。

```python
def batch_read_holding_registers(ip: str, port: int, slave_id: int, offset: int, length: int) -> Optional[List[int]]:
```

* 输入参数
* `ip`，str 类型，从机 IP。
* `port`，int 类型，从机端口。
* `slave_id`，int 类型，从机 slave ID。
* `offset`，int 类型，Modbus 首地址。
* `length`，int 类型，Modbus 地址数量。
* 输出参数
* `None`，读取失败。
* `List[int]`，读取成功后，返回结果列表。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### Func04 批量读取输入寄存器

* 方法说明

  Modbus 读取输入寄存器多个连续地址值，并以列表的形式返回其中的值，功能码 04。

```python
def batch_read_input_registers(ip: str, port: int, slave_id: int, offset: int, length: int) -> Optional[List[int]]:
```

* 输入参数
* `ip`，str 类型，从机 IP。
* `port`，int 类型，从机端口。
* `slave_id`，int 类型，从机 slave ID。
* `offset`，int 类型，Modbus 首地址。
* `length`，int 类型，Modbus 地址数量。
* 输出参数
* `None`，读取失败。
* `List[int]`，读取成功后，返回结果列表。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### Func05 写入线圈量

* 方法说明

  Modbus 写入线圈量，功能码 05。

```python
def write_coil_status(ip: str, port: int, slave_id: int, offset: int, value: bool) -> bool:
```

* 输入参数
* `ip`，str 类型，从机 IP。
* `port`，int 类型，从机端口。
* `slave_id`，int 类型，从机 slave ID。
* `offset`，int 类型，Modbus 地址。
* `value`，bool 类型，写入的值。
* 输出参数
* `True`，写入成功。
* `False`，写入失败。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### Func06 写入保持寄存器

* 方法说明

  Modbus 写入保持寄存器，功能码 06。

```python
def write_holding_register(ip: str, port: int, slave_id: int, offset: int, data_type: int, value: int) -> bool:
```

* 输入参数
* `ip`，str 类型，从机 IP。
* `port`，int 类型，从机端口。
* `slave_id`，int 类型，从机 slave ID。
* `offset`，int 类型，Modbus 地址。
* `data_type`，int 类型，2：无符号整型，3：有符号整型。
* `value`，int 类型，写入的值。
* 输出参数
* `True`，写入成功。
* `False`，写入失败。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### Func0f 批量写入线圈量

* 方法说明

  Modbus 写入线圈量多个连续地址，功能码 0f。

```python
def batch_write_coil_status(ip: str, port: int, slave_id: int, offset: int, values: List[bool]) -> bool:
```

* 输入参数
* `ip`，str 类型，从机 IP。
* `port`，int 类型，从机端口。
* `slave_id`，int 类型，从机 slave ID。
* `offset`，int 类型，Modbus 地址。
* `values`，bool 列表类型，多个需写入的值。
* 输出参数
* `True`，写入成功。
* `False`，写入失败。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### Func10 批量写入保持寄存器

* 方法说明

  Modbus 写入保持寄存器多个连续地址，功能码 10。

```python
def batch_write_holding_register(ip: str, port: int, slave_id: int, offset: int, values: List[int]) -> bool:
```

* 输入参数
* `ip`，str 类型，从机 IP。
* `port`，int 类型，从机端口。
* `slave_id`，int 类型，从机 slave ID。
* `offset`，int 类型，Modbus 地址。
* `values`，int 列表类型，多个需写入的值。
* 输出参数
* `True`，写入成功。
* `False`，写入失败。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### 通用写入单个地址

* 方法说明

  Modbus 写入单个地址，通过参数 address_type 指定写入的地址类型。

```python
def write_single_modbus_value(ip: str, port: int, slave_id: int, address_type: str, offset: int, value: int) -> bool:
```

* 输入参数
* `ip`，str 类型，从机 IP。
* `port`，int 类型，从机端口。
* `slave_id`，int 类型，从机 slave ID。
* `address_type`，str类型，表示地址类型，可选择 '0x', '1x', '3x', '4x'，和功能码的对应关系如下：

  * 0x：对应功能码 0x01，表示线圈
  * 1x：对应功能码 0x02，表示离散输入
  * 3x：对应功能码 0x04，表示输入寄存器
  * 4x：对应功能码 0x03，表示保持寄存器
* `offset`，int 类型，表示 Modbus 地址。
* `value`，int 类型，表示写入的值。
* 输出参数
* `True`，写入成功。
* `False`，写入失败。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### 通用写入多个地址

* 方法说明

  Modbus 写入多个地址，通过参数 address_type 指定写入的地址类型。

```python
def write_batch_modbus_value(ip: str, port: int, slave_id: int, address_type: str, offset: int, values: List[int]) -> bool:
```

* 输入参数
* `ip`，str 类型，从机 IP。
* `port`，int 类型，从机端口。
* `slave_id`，int 类型，从机 slave ID。
* `address_type`，str类型，表示地址类型，可选择 '0x', '1x', '3x', '4x'，和功能码的对应关系如下：

  * 0x：对应功能码 0x01，表示线圈
  * 1x：对应功能码 0x02，表示离散输入
  * 3x：对应功能码 0x04，表示输入寄存器
  * 4x：对应功能码 0x03，表示保持寄存器
* `offset`，int 类型，表示 Modbus 地址。
* `values`，int 列表类型，表示写入的值。
* 输出参数
* `True`，写入成功。
* `False`，写入失败。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### 通过实例名称写入单个地址

* 方法说明

  Modbus 写入单个地址，通过参数 name 指定已经配置的实例名称。

```python
def write_single_modbus_value_by_instance_name(name: str, offset: int, value: int) -> bool:
```

* 输入参数
* `name`，str 类型，已经配置的实例名称。
* `offset`，int 类型，表示 Modbus 地址。
* `value`，int 类型，表示写入的值。
* 输出参数
* `True`，写入成功。
* `False`，写入失败。
* 异常
  如果没有配置 modbus 实例，则会抛出初始化异常。

#### 通过实例名称写入多个地址

* 方法说明

  Modbus 写入多个地址，通过参数 name 指定已经配置的实例名称。

```python
def write_batch_modbus_value_by_instance_name(name: str, offset: int, values: List[int]) -> bool:
```

* 输入参数
* `name`，str 类型，已经配置的实例名称。
* `offset`，int 类型，表示 Modbus 地址。
* `values`，int 列表类型，表示写入的值。
* 输出参数
* `True`，写入成功。
* `False`，写入失败。
* 异常
  如果没有配置 modbus 实例，则会抛出初始化异常。

#### 通用读取单个地址

* 方法说明

  Modbus 读取单个地址，通过参数 address_type 指定读取的地址类型。

```python
def read_single_modbus_value(ip: str, port: int, slave_id: int, address_type: str, offset: int) -> Optional[int]:
```

* 输入参数
* `ip`，str 类型，从机 IP。
* `port`，int 类型，从机端口。
* `slave_id`，int 类型，从机 slave ID。
* `address_type`，str类型，表示地址类型，可选择 '0x', '1x', '3x', '4x'，和功能码的对应关系如下：

  * 0x：对应功能码 0x01，表示线圈
  * 1x：对应功能码 0x02，表示离散输入
  * 3x：对应功能码 0x04，表示输入寄存器
  * 4x：对应功能码 0x03，表示保持寄存器
* `offset`，int 类型，Modbus 地址。
* 输出参数
* `None`，读取失败。
* `int`，读取成功的返回值。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### 通用读取多个地址

* 方法说明

  Modbus 读取多个地址，通过参数 address_type 指定读取的地址类型。

```python
def read_batch_modbus_value(ip: str, port: int, slave_id: int, address_type: str, offset: int, length: int) -> Optional[List[int]]:
```

* 输入参数
* `ip`: str 类型，从机 IP。
* `port`: int 类型，从机端口。
* `slave_id`: int 类型，从机 slave ID。
* `address_type`: str类型，表示地址类型，可选择 '0x', '1x', '3x', '4x'，和功能码的对应关系如下：

  * 0x：对应功能码 0x01，表示线圈
  * 1x：对应功能码 0x02，表示离散输入
  * 3x：对应功能码 0x04，表示输入寄存器
  * 4x：对应功能码 0x03，表示保持寄存器
* `offset`: int 类型，Modbus 地址。
* `length`: int 类型，读取的数据长度。
* 输出参数
* `None`: 读取失败。
* `List[int]`: 读取成功的返回值列表。
* 异常
  本方法不抛出异常，异常捕获后只作日志记录。

#### 通过实例名称读取单个地址

* 方法说明

  Modbus 读取单个地址，通过参数 name 指定已经配置的实例名称。

```python
def read_single_modbus_value_by_instance_name(name: str, offset: int) -> Optional[int]:
```

* 输入参数
* `name`: str 类型，配置的唯一实例名称。
* `offset`: int 类型，Modbus 地址。
* 输出参数
* `None`: 读取失败。
* `int`: 读取成功的返回值。
* 异常
  如果没有配置 modbus 实例，则会抛出初始化异常。

#### 通过实例名称读取多个地址

* 方法说明

  Modbus 读取多个地址，通过参数 name 指定已经配置的实例名称。

```python
def read_batch_modbus_value_by_instance_name(name: str, offset: int, length: int) -> Optional[List[int]]:
```

* 输入参数
* `name`: str 类型，配置的唯一实例名称。
* `offset`: int 类型，Modbus 地址。
* `length`: int 类型，读取的数据长度。
* 输出参数
* `None`: 读取失败。
* `List[int]`: 读取成功的返回值列表。
* 异常
  如果没有配置 modbus 实例，则会抛出初始化异常。
