MODBUS для правильной ссылки на Python

#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. Но, очевидно, метод OP float() не может этого сделать.

5. Судя по руководству по эксплуатации, похоже, что вы обращаетесь к логическому адресу 49 и далее — это ваше намерение? Первое, что я хочу проверить, это действительно ли вы читаете то, что, как вам кажется, вы читаете.