From f0d28b293a7f5345cb7417a79a9ada31a7a71d18 Mon Sep 17 00:00:00 2001 From: Zhang Huanjie Date: Wed, 13 Apr 2022 09:00:41 +0800 Subject: [PATCH] S16/U16/S32/U32 handle --- SunGather/sungather.py | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/SunGather/sungather.py b/SunGather/sungather.py index 08a1dfc..f5d2ec6 100644 --- a/SunGather/sungather.py +++ b/SunGather/sungather.py @@ -204,25 +204,33 @@ class SungrowInverter(): register_value = rr.registers[num] # Convert unsigned to signed - if register.get('datatype') == "S32": - u32_value = rr.registers[num+1] - if u32_value == 65535: # Flag to say value is negative for 32bit - register_value = (register_value - 65535) + # If xFF / xFFFF then change to 0, looks better when logging / graphing + if register.get('datatype') == "U16": + if register_value == 0xFFFF: + register_value = 0 elif register.get('datatype') == "S16": + if register_value == 0xFFFF or register_value == 0x7FFF: + register_value = 0 if register_value >= 32767: # Anything greater than 32767 is a negative for 16bit register_value = (register_value - 65535) + elif register.get('datatype') == "U32": + u32_value = rr.registers[num+1] + if register_value == 0xFFFF and u32_value == 0xFFFF: + register_value = 0 + else: + register_value = (register_value + u32_value * 0x10000) + elif register.get('datatype') == "S32": + u32_value = rr.registers[num+1] + if register_value == 0xFFFF and (u32_value == 0xFFFF or u32_value == 0x7FFF): + register_value = 0 + else: + register_value = (register_value + u32_value * 0x10000 - 0xffffffff) # We convert a system response to a human value if register.get('datarange'): for value in register.get('datarange'): if value['response'] == rr.registers[num]: register_value = value['value'] - if not register_value: - register_value = rr.registers[num] - - # If xFF / xFFFF then change to 0, looks better when logging / graphing - if register_value == 65535: - register_value = 0 if register.get('accuracy'): register_value = round(register_value * register.get('accuracy'),2)