Перейти к основному содержимому

RI_SDK_sensor_VoltageSensor_ReadRegBytes

Информация

RI_SDK - библиотека Robo Intellect Software Development Kit
sensor - название группы устройств датчиков
VoltageSensor - название устройства датчика тока, напряжения и мощности
ReadRegBytes - название метода чтения массива байт по указанному регистру

Сигнатура функции:

RI_SDK_sensor_VoltageSensor_ReadRegBytes(descriptor, reg, buf, len, readBytesLen, errorText):errorCode

Описание метода

Чтение массива байтов из регистра.

Читает len байт по регистру reg у датчика тока, напряжения и мощности с дескриптором descriptor. Записывает прочитанные байты в буфер buf.

Параметры и возвращаемые значения

ПараметрТип для Shared objectТип для Golang gRPCОписание
descriptorint (тип C)int64Дескриптор компонента, в котором будет производиться чтение
reguint8_t (тип C)uint8Регистр, по которому будет производиться чтение
buf*long long unsigned[len] (тип C)[]byteУказатель на массив байт для чтения
lenint (тип C)int64Длина массива buf
readBytesLen*int (тип C)int64Указатель на количество прочитанных байтов
errorTextchar[1000] (тип C)stringТекст ошибки (передается как параметр, если происходит ошибка метод записывает в этот параметр текст ошибки)
errorCodeint (тип C)int64Код ошибки

Схема регистров датчика тока, напряжения и мощности ina219

Адрес регистраНазвание регистраНазначение регистраТип
0x00ConfigurationСброс всех регистров, настройка диапазона измерений, усиления PGA, разрешения АЦП и фильтрации.Чтение/Запись
0x01Shunt voltageХранит измеренное значение напряжения на шунтирующем резисторе 0,1 Ом.Чтение
0x02Bus voltageХранит измеренное значение напряжения шины.Чтение
0x03PowerХранит измеренное значение мощности.Чтение
0x04CurrentСодержит значение силы тока, протекающего через шунтирующий резистор.Чтение
0x05CalibrationКалибровочный регистр. Задаёт диапазон измерений и позволяет осуществлять калибровку системы.Чтение/Запись

Примеры

Пример №1 - Чтение массива байт buf на датчике тока на 0 регистре

В данном примере осуществляется чтение массива байт buf на датчике тока на 0 регистре. Выводиться значение прочитанных байтов.


# Чтение массива байт buf длиной 2 на датчике тока на 0 регистре
lenBuf = 2
b = c_ulonglong()
errCode = lib.RI_SDK_sensor_VoltageSensor_ReadRegBytes(voltageSensor, 0x00, b, lenBuf, readBytesLen, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)
# Конвертируем полученное значение c_ulonglong в массив байт
buf = b.value.to_bytes(readBytesLen.value, "little")
print("read bytes: ", buf)

Полный текст примера


from ctypes.util import find_library
import platform
import sys
from ctypes import *

# Подключаем внешнюю библиотеку для работы с SDK
platform = platform.system()
if platform == "Windows":
libName = "librisdk.dll"
if platform == "Linux":
libName = "librisdk.so"

pathLib = find_library(libName)
lib = cdll.LoadLibrary(pathLib)


# Указываем типы аргументов для функций библиотеки RI_SDK
lib.RI_SDK_InitSDK.argtypes = [c_int, c_char_p]
lib.RI_SDK_CreateModelComponent.argtypes = [c_char_p, c_char_p, c_char_p, POINTER(c_int), c_char_p]
lib.RI_SDK_LinkVoltageSensorToController.argtypes = [c_int, c_int, c_uint8, c_char_p]
lib.RI_SDK_DestroySDK.argtypes = [c_bool, c_char_p]
lib.RI_SDK_sensor_VoltageSensor_ReadRegBytes.argtypes = [c_int, c_uint8, POINTER(c_ulonglong), c_int, POINTER(c_int), c_char_p]

def main():
errTextC = create_string_buffer(1000) # Текст ошибки. C type: char*
i2c = c_int()
voltageSensor = c_int()
readBytesLen = c_int()

# Инициализация библиотеки RI SDK с уровнем логирования 3
errCode = lib.RI_SDK_InitSDK(3, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

# Создание компонента i2c адаптера модели ch341
errCode = lib.RI_SDK_CreateModelComponent("connector".encode(), "i2c_adapter".encode(), "ch341".encode(), i2c, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

print("i2c: ", i2c.value)

# Создание компонента датчика тока, напряжения и мощности модели ina219
errCode = lib.RI_SDK_CreateModelComponent("sensor".encode(), "voltage_sensor".encode(), "ina219".encode(), voltageSensor, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

print("voltage_sensor: ", voltageSensor.value)

# Связывание i2c с датчиком тока, напряжения и мощности
errCode = lib.RI_SDK_LinkVoltageSensorToController(voltageSensor, i2c, 0x41, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

# Чтение массива байт buf длиной 2 на датчике тока на 0 регистре
lenBuf = 2
b = c_ulonglong()
errCode = lib.RI_SDK_sensor_VoltageSensor_ReadRegBytes(voltageSensor, 0x00, b, lenBuf, readBytesLen, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)
# Конвертируем полученное значение c_ulonglong в массив байт
buf = b.value.to_bytes(readBytesLen.value, "little")
print("read bytes: ", buf)

# Удаление библиотеки со всеми компонентами
errCode = lib.RI_SDK_DestroySDK(True, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

print("Success")

main()