# -*- coding: UTF-8 -*-
"""
ModBus工业协议标准接口
======================================
| 
"""
[文档]def PARITY():
    """
    奇偶校验枚举值
        * PARITY_NONE = 0
        * PARITY_ODD = 1
        * PARITY_EVEN = 2
    """
    pass 
[文档]def STATUS():
    """
    读写操作状态码枚举值
        * MB_SUCCESS = 0
        * MB_MUTEX_ERROR = 1
        * MB_INVALID_SLAVE_ADDR = 2
        * MB_INVALID_PARAM = 3
        * MB_RESPOND_EXCEPTION = 4
        * MB_RESPOND_LENGTH_ERR = 5
        * MB_RESPOND_FRAME_ERR = 6
        * MB_RESPOND_TIMEOUT = 7
        * MB_CANNOT_GET_HANDLER = 8
        * MB_SLAVE_NO_RESPOND = 9
        * MB_FRAME_SEND_ERR = 10
        * MB_SERIAL_INIT_FAILED = 11
        * MB_SERIAL_UNINIT_FAILED = 12
        * MB_FUNCTION_CODE_NOT_SUPPORT = 13
    """
    pass 
[文档]def init(port, baud_rate, parity, timeout):
    """
    初始化modbus协议
    :param port(int): 必选参数,RS485串口端口号
    :param baud_rate(int): 可选参数,波特率,默认值为9600
    :param parity(int): 可选参数,奇偶校验信息,默认值为0。可选值参考奇偶校验信息(PARITY)
    :param timeout(int): 可选参数,相应等待超时,单位是毫秒(ms),-1表示永久等待。默认值为200
    :returns: 0: 成功,其他: 失败,返回结果具体含义参考 STATUS 信息
    :raises OSError: EBUSY 或 EINVAL
    """
    pass 
[文档]def deinit():
    """
    释放modbus协议
    :returns:  0: 成功,其他: 失败,返回结果具体含义参考 STATUS 信息
    :raises OSError: EBADF
    """
    pass 
[文档]def writeHoldingRegister(slave_addr, register_addr, register_value, timeout):
    """
    向从机写单个保持寄存器 
    :param slave_addr(int): 请求的从机地址,0代表广播
    :param register_addr(int): 写寄存器的地址
    :param register_value(int): 写寄存器的数据
    :param timeout(int): 请求超时时间,单位是毫秒(ms),-1表示永久等待。
    :returns: tuple,4元组中的条目格式为:
      * status: 请求状态,0表示成功,其他表示失败
      * resp_addr: 响应地址
      * resp_value: 响应数据
      * exception_code: 响应异常代码
    :raises RuntimeError: EINVAL
    """
    pass 
[文档]def writeMultipleHoldingRegisters(slave_addr, start_addr, reg_quantity, data, timeout):
    """
    向从机多个保持寄存器中写入数据。
    :param slave_addr(int): 请求的从机地址,0代表广播。
    :param start_addr(int): 待写寄存器的起始地址
    :param reg_quantity(int): 待写寄存器的数量,表示操作多少个寄存器
    :param data(bytearray): 写寄存器的数据,注意每个寄存器包含高低两个字节
    :param timeout(int): 请求超时时间,单位是毫秒(ms),-1表示永久等待。
    :returns: tuple,4元组中的条目格式为:
      * status: 请求状态,0表示成功,其他表示失败。具体数值参考 STATUS
      * resp_addr: 响应地址
      * resp_quantity: 真实完成寄存器操作的数量
      * exception_code: 异常代码
    :raises ValueError: EINVAL
    """
    pass 
[文档]def writeCoil(slave_addr, coil_addr, coil_value, timeout):
    """
    向从机某个线圈中写入数据
    :param slave_addr(int): 请求的从机地址,0代表广播。
    :param coil_addr(int): 写线圈的地址
    :param coil_value(int): 写线圈的数据
    :param timeout(int): 请求超时时间,单位是毫秒(ms)。-1表示永久等待。
    :returns: tuple,4元组中的条目格式为:
      * status: 请求状态,0表示成功,其他表示失败
      * resp_addr: 响应地址
      * resp_value: 响应数据
      * exception_code: 异常代码
    :raises OSError: EINVAL
    """
    pass 
[文档]def writeMultipleCoils(slave_addr, start_addr, reg_quantity, data, timeout):
    """
    向从机多个线圈中写入数据。
    :param slave_addr(int): 请求的从机地址,0代表广播。
    :param start_addr(int): 待写寄存器的起始地址
    :param reg_quantity(int): 待写寄存器的数量,表示操作多少个寄存器
    :param data(bytearray): 写寄存器的数据,注意每个寄存器包含高低两个字节
    :param timeout(int): 请求超时时间,单位是毫秒(ms),-1表示永久等待。
    :returns: tuple,4元组中的条目格式为:
      * status: 请求状态,0表示成功,其他表示失败。具体数值参考 STATUS
      * resp_addr: 响应地址
      * resp_quantity: 真实完成寄存器操作的数量
      * exception_code: 异常代码
    :raises ValueError: EINVAL
    """
    pass 
[文档]def readHoldingRegisters(slave_addr, start_addr, reg_quantity, data, timeout):
    """
    读取多个保持寄存器中的数据
    :param slave_addr(int): 请求的从机地址,0代表广播。
    :param start_addr(int): 待读寄存器的起始地址
    :param reg_quantity(int): 待读寄存器的数量,表示操作多少个寄存器
    :param data(bytearray): 读寄存器的数据,注意每个寄存器包含高低两个字节
    :param timeout(int): 请求超时时间,单位是毫秒(ms),-1表示永久等待。
    :returns: tuple,2元组中的条目格式为:
      * status: 请求状态,0表示成功,其他表示失败
      * respond_count: 读取到数据的字节数,该数值不大于data的长度
    :raises OSError: EINVAL
    """
    pass 
[文档]def readCoils(slave_addr, start_addr, reg_quantity, data, timeout):
    """
    读取多个线圈中的数据
    :param slave_addr(int): 请求的从机地址,0代表广播。
    :param start_addr(int): 待读寄存器的起始地址
    :param reg_quantity(int): 待读寄存器的数量,表示操作多少个寄存器
    :param data(bytearray): 读寄存器的数据,注意每个寄存器包含高低两个字节
    :param timeout(int): 请求超时时间,单位是毫秒(ms),-1表示永久等待。
    
    :returns: tuple,2元组中的条目格式为:
      * status: 请求状态,0表示成功,其他表示失败
      * respond_count: 读取到数据的字节数,该数值不大于data的长度
    :raises OSError: EINVAL
    """
    pass 
[文档]def recv():
    """
    接收主机发送的请求命令,轮训间隔由 init 函数的 timeout参数决定
    :param 空:
    
    :returns: tuple,2元组中的条目格式为:
      * status: 请求状态,0表示成功,其他表示失败
      * bytes: 接收到的数据,包含CRC校验数据
    :raises OSError: EINVAL
    """
    pass 
[文档]def send(slave_addr, data, timeout):
    """
    发送响应数据给主机
    :param slave_addr(int): 响应请求的从机地址
    :param data(bytearray): 响应数据,格式为: fucntion + resp data
    :param timeout(int): 发送超时时间,单位是毫秒(ms),-1表示永久等待。
    
    :returns: tuple,2元组中的条目格式为:
      * status: 请求状态,0表示成功,其他表示失败
      * length: 发送的响应帧的长度,包含CRC校验长度
    :raises OSError: EINVAL
    """
    pass