コード例 #1
0
ファイル: modbus.py プロジェクト: alttch/eva3
def read_f32(port, reg, count=1, **kwargs):
    """
    Read IEEE 754 f32 values

    Warning:
        return values are numpy.float32 numbers and should be converted to a
        standard Python type (string or float) before serializing with standard
        methods

    Returns:
        list of f32
    """
    reg_type, addr = _parse_reg(reg)
    if reg_type == 'i':
        result = port.read_input_registers(addr, count=count * 2, **kwargs)
    elif reg_type == 'h':
        result = port.read_holding_registers(addr, count=count * 2, **kwargs)
    else:
        raise ValueError(f'Method not supported for register type {reg_type}')
    if result.isError():
        raise RuntimeError('Modbus I/O error')
    else:
        data = []
        for i in range(0, len(result.registers), 2):
            data.append(
                np.array([
                    x for x in
                    result.registers[i].to_bytes(2, byteorder='little') +
                    result.registers[i+1].to_bytes(2, byteorder='little')
                ],
                         dtype=np.uint8).view(dtype=np.float32)[0])
        return data
コード例 #2
0
ファイル: modbus.py プロジェクト: alttch/eva3
def write_u16(port, reg, values, **kwargs):
    """
    Write boolean values
    """
    reg_type, addr = _parse_reg(reg)
    if not isinstance(values, list) and not isinstance(values, tuple):
        values = [values]
    if reg_type == 'h':
        result = port.write_registers(addr, values, **kwargs)
    else:
        raise ValueError(f'Method not supported for register type {reg_type}')
    if result.isError():
        raise RuntimeError('Modbus I/O error')
    else:
        return True
コード例 #3
0
ファイル: modbus.py プロジェクト: alttch/eva3
def read_bool(port, reg, count=1, **kwargs):
    """
    Read boolean values

    Returns:
        list of booleans
    """
    reg_type, addr = _parse_reg(reg)
    if reg_type == 'c':
        result = port.read_coils(addr, count=count, **kwargs)
    elif reg_type == 'd':
        result = port.read_discrete_inputs(addr, count=count, **kwargs)
    else:
        raise ValueError(f'Method not supported for register type {reg_type}')
    if result.isError():
        raise RuntimeError('Modbus I/O error')
    else:
        return result.bits[:count]
コード例 #4
0
ファイル: modbus.py プロジェクト: alttch/eva3
def read_i16(port, reg, count=1, **kwargs):
    """
    Read i16 values

    Returns:
        list of i16
    """
    reg_type, addr = _parse_reg(reg)
    if reg_type == 'i':
        result = port.read_input_registers(addr, count=count, **kwargs)
    elif reg_type == 'h':
        result = port.read_holding_registers(addr, count=count, **kwargs)
    else:
        raise ValueError(f'Method not supported for register type {reg_type}')
    if result.isError():
        raise RuntimeError('Modbus I/O error')
    else:
        return [x if x < 32768 else x - 65536 for x in result.registers]
コード例 #5
0
ファイル: modbus.py プロジェクト: alttch/eva3
def write_u32(port, reg, values, **kwargs):
    """
    Write u32 values
    """
    reg_type, addr = _parse_reg(reg)
    if not isinstance(values, list) and not isinstance(values, tuple):
        values = [values]
    data = []
    for v in values:
        data.append(v >> 16)
        data.append(v & 0xffff)
    if reg_type == 'h':
        result = port.write_registers(addr, data, **kwargs)
    else:
        raise ValueError(f'Method not supported for register type {reg_type}')
    if result.isError():
        raise RuntimeError('Modbus I/O error')
    else:
        return True
コード例 #6
0
ファイル: modbus.py プロジェクト: alttch/eva3
def write_bool(port, reg, values, **kwargs):
    """
    Write boolean values

    Args:
        values: a single boolean, list of boolean, list of strings or list of
                integers
    """
    reg_type, addr = _parse_reg(reg)
    if not isinstance(values, list) and not isinstance(values, tuple):
        values = [values]
    values = [val_to_boolean(x) for x in values]
    if reg_type == 'c':
        result = port.write_coils(addr, values, **kwargs)
    else:
        raise ValueError(f'Method not supported for register type {reg_type}')
    if result.isError():
        raise RuntimeError('Modbus I/O error')
    else:
        return True
コード例 #7
0
ファイル: modbus.py プロジェクト: alttch/eva3
def write_f32(port, reg, values, **kwargs):
    """
    Write f32 values
    """
    reg_type, addr = _parse_reg(reg)
    if not isinstance(values, list) and not isinstance(values, tuple):
        values = [values]
    data = []
    for v in values:
        x = np.array([v], dtype=np.float32).tobytes()
        data.append(int.from_bytes(x[:2], byteorder='little'))
        data.append(int.from_bytes(x[2:], byteorder='little'))
    if reg_type == 'h':
        result = port.write_registers(addr, data, **kwargs)
    else:
        raise ValueError(f'Method not supported for register type {reg_type}')
    if result.isError():
        raise RuntimeError('Modbus I/O error')
    else:
        return True
コード例 #8
0
ファイル: modbus.py プロジェクト: alttch/eva3
def read_u32(port, reg, count=1, **kwargs):
    """
    Read u32 values

    Returns:
        list of u32
    """
    reg_type, addr = _parse_reg(reg)
    if reg_type == 'i':
        result = port.read_input_registers(addr, count=count * 2, **kwargs)
    elif reg_type == 'h':
        result = port.read_holding_registers(addr, count=count * 2, **kwargs)
    else:
        raise ValueError(f'Method not supported for register type {reg_type}')
    if result.isError():
        raise RuntimeError('Modbus I/O error')
    else:
        data = []
        for i in range(0, len(result.registers), 2):
            data.append((result.registers[i] << 16) + result.registers[i + 1])
        return data
コード例 #9
0
ファイル: modbus.py プロジェクト: alttch/eva3
def write_i64(port, reg, values, **kwargs):
    """
    Write i64 values
    """
    reg_type, addr = _parse_reg(reg)
    if not isinstance(values, list) and not isinstance(values, tuple):
        values = [values]
    values = [x if x >= 0 else 18446744073709551616 + x for x in values]
    data = []
    for v in values:
        data.append(v >> 48)
        data.append(v >> 32 & 0xffff)
        data.append(v >> 16 & 0xffff)
        data.append(v & 0xffff)
    if reg_type == 'h':
        result = port.write_registers(addr, data, **kwargs)
    else:
        raise ValueError(f'Method not supported for register type {reg_type}')
    if result.isError():
        raise RuntimeError('Modbus I/O error')
    else:
        return True
コード例 #10
0
ファイル: modbus.py プロジェクト: alttch/eva3
def read_i64(port, reg, count=1, **kwargs):
    """
    Read i64 values

    Returns:
        list of i64
    """
    reg_type, addr = _parse_reg(reg)
    if reg_type == 'i':
        result = port.read_input_registers(addr, count=count * 4, **kwargs)
    elif reg_type == 'h':
        result = port.read_holding_registers(addr, count=count * 4, **kwargs)
    else:
        raise ValueError(f'Method not supported for register type {reg_type}')
    if result.isError():
        raise RuntimeError('Modbus I/O error')
    else:
        data = []
        for i in range(0, len(result.registers), 4):
            x = ((result.registers[i] << 48) + (result.registers[i + 1] << 32) +
                 (result.registers[i + 2] << 16) + result.registers[i + 3])
            data.append(x if x < 9223372036854775808 else x -
                        18446744073709551616)
        return data