#python #modbus #pymodbus
#python #modbus #pymodbus
Вопрос:
Я использую pymodbus для попытки доступа к данным на солнечном контроллере Morningstar. Здесь у меня есть документация по MODBUS для контроллера, и в ней указано, где находятся значения в реестре. Я действительно ищу только несколько значений в регистрах хранения чтения (0x03) для первых 15-ти адресов. В настоящее время я использую следующий код для доступа к данным, которые считывают мне данные, но это совершенно бессмысленные числа. Если у кого-нибудь есть какие-либо советы, я был бы очень признателен.
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
client = ModbusClient(method = 'rtu', port = 'COM1', baudrate = 9600)
client.connect()
result = client.read_input_registers(0x003,6,unit=1)
solarVoltage = float(result.registers[0] )
chargingCurrent = float(result.registers[1] )
batteryVoltage = float(result.registers[2] )
batteryTemperature = float(result.registers[3] )
# Do something with the data
print(solarVoltage)
print(chargingCurrent)
print(batteryVoltage)
print(batteryTemperature)
client.close()
Редактировать: это результирующие данные, которые я получаю от чтения всех 6 регистров.
[0, 17058, 18943, 17662, 18634, 18938, 26098, 8374, 42046, 32768]
Редактировать 2: я пытаюсь прочитать логический адрес от 5 до 30. Итак, я понимаю, что вы имеете в виду, получая логический адрес 49, но даже изменяя регистр чтения на 0x0004
все еще считывается 17056
. Я не уверен, что это проблема float16
или неправильное чтение адреса.
Комментарии:
1.
result.registers[0]
вероятно, возвращает значение регистра, как указывает int16 или подобное unit=1 , и, следовательно, значение неверно и продолжает оставаться неверным после приведения к float . Я впервые вижу редкий тип float16, я всегда думал, что число с плавающей запятой не менее 32 бит2. Пожалуйста, приведите мне пример тарабарского номера для данного адреса.
3. Это результирующие данные, которые я получаю от чтения всех 6 регистров.
[0, 17058, 18943, 17662, 18634, 18938, 26098, 8374, 42046, 32768]
так, например, 17058 для напряжения батареи4. Интересно, есть ли способ распаковать
float16
в Python. Но, очевидно, метод OPfloat()
не может этого сделать.5. Судя по руководству по эксплуатации, похоже, что вы обращаетесь к логическому адресу 49 и далее — это ваше намерение? Первое, что я хочу проверить, это действительно ли вы читаете то, что, как вам кажется, вы читаете.