Получение целочисленного значения от ведомого устройства Modbus RTU с использованием кода Python - PullRequest
0 голосов
/ 16 января 2020

Я читаю значения в регистрах ведомого устройства Modbus. Но значения, хранящиеся в регистрах, являются комбинацией двух регистров. То есть, если регистр 3 имеет 72, а регистр 4 имеет 489. Фактическое значение - 72489. Я смог это сделать.

Но проблема возникает, когда значение во втором регистре начинается с 0. Это регистр 2 имеет 72, а регистр 4 имеет 012. Фактическое значение должно быть 72012, но я получаю 7212. Есть ли способ предотвратить это.

Часть кода, которая делает это,

`rr = client.read_holding_registers(2, 22, unit=1)
 unconcatenateSensorConsumptionValues = rr.registers
 sensorsConsumptionValues = []
 for i in range(0, 10, 2):
    ftemp = ""+str(unconcatenateSensorConsumptionValues[i])
    stemp = ""+str(unconcatenateSensorConsumptionValues[i+1])
    fin = ftemp+stemp
    sensorsConsumptionValues.append(int(fin))`

Ответы [ 2 ]

0 голосов
/ 20 января 2020

Я не знаю, является ли это лучшим способом сделать это или нет, у меня есть два решения:

Первое решение: заполнить один регистр до 65535 и добавить оставшийся в другой регистр. Таким образом, фактическим значением будет добавление первого и второго регистра. Но здесь мы можем иметь максимальное значение 131070 (65535 + 65535).

Второе решение: преобразовать значение в шестнадцатеричное число, а затем разделить два октета и преобразовать в десятичное число. Теперь сохраните эти десятичные числа в регистрах Modbus. Чтобы получить первоначальное значение. Прочитайте два регистра Modbus, преобразуйте их в шестнадцатеричные, преобразовайте оба шестнадцатеричных значения в десятичное значение. Это десятичное значение является фактическим значением. Таким образом, максимальное значение может быть сохранено с двумя регистрами: 4294967295.

Чтобы понять, я прикрепил изображение (я создал с помощью MS Paint, но есть ли простой способ)

Это может использоваться для регистров с множеством и может использоваться для больших чисел.

. enter image description here

0 голосов
/ 16 января 2020

Численно обрабатывать регистры не как строки.

fin = int(unconcatenateSensorConsumptionValues[i]) * 1000 + int(unconcatenateSensorConsumptionValues[i+1]) * 1

Первый регистр - 1000, второй регистр - 1.

...