Преобразование 2 16-разрядных беззнаковых регистров в 32-разрядное значение со знаком можно выполнить, как показано ниже. Это можно сделать одним утверждением, но я сделаю это поэтапно для ясности. Предполагая, что у вас есть верхнее и нижнее слова (16 бит) в верхнем 16 и нижнем 16 соответственно:
UInt32 uint32 = upper16;
uint32 <<= 16;
uint32 |= lower16;
Int32 sint32 = (Int32)uint32;
На основании этого утверждения в документации:
For all the formats the byte order (inside the single word) is MSB->LSB.
In INT32, UINT32 and UINT64 formats, the word order is LSW-> MSW."
Похоже,
lower16 = address 30053
upper16 = address 30054
Вы упомянули в комментарии, что он имеет шкалу 10. Обычно это делается для того, чтобы вы могли придать значению некоторую точность (значение с плавающей запятой). Так что вы, вероятно, сделали бы:
double value = sint32 / 10.0;
OR
double kW = sint32 / 10.0; // In your case