Skip to content

Commit

Permalink
Fixed negative value parsing for unit_register object
Browse files Browse the repository at this point in the history
  • Loading branch information
martytriska committed Mar 29, 2023
1 parent 841b01d commit a1ed397
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 34 deletions.
1 change: 1 addition & 0 deletions etc/hw_definitions/xG18.yaml
Expand Up @@ -24,6 +24,7 @@ modbus_features:
valid_mask_reg : 9
offset : 0
factor : 0.01
datatype : signed16
unit : "°C"
- type : EXT_CONFIG
post_write_coils :
Expand Down
40 changes: 6 additions & 34 deletions evok/neuron.py
Expand Up @@ -1644,21 +1644,23 @@ def __init__(self, circuit, arm, reg, reg_type="input", dev_id=0, major_group=0,
else:
self.valid_mask = None

if self.datatype is None:
if self.datatype is None or self.datatype == "unsigned16":
if factor == 1 and offset == 0: # Reading RAW value - save some CPU time
self.regvalue = lambda: self.arm.neuron.modbus_cache_map.get_register(1, self.valreg, unit=self.arm.modbus_address, is_input=_is_iput)[0]
else:
self.regvalue = lambda: (self.arm.neuron.modbus_cache_map.get_register(1, self.valreg, unit=self.arm.modbus_address, is_input=_is_iput)[0] * self.factor) + self.offset

elif datatype == "float32":
elif self.datatype == "signed16":
self.regvalue = lambda: (self.__parse_signed(self.arm.neuron.modbus_cache_map.get_register(1, self.valreg, unit=self.arm.modbus_address, is_input=_is_iput)[0]) * self.factor) + self.offset

elif self.datatype == "float32":
# TODO - add factor and offset version
self.regvalue = lambda: self.__parse_float32(self.arm.neuron.modbus_cache_map.get_register(2, self.valreg, unit=self.arm.modbus_address, is_input=_is_iput))

def __parse_signed(self, raw_value):
return (raw_value - 65536 if raw_value > 32767 else raw_value)

def __parse_float32(self, raw_regs):


datal = bytearray(4)
datal[1] = raw_regs[0] & 0xFF
datal[0] = (raw_regs[0] >> 8) & 0xFF
Expand All @@ -1676,35 +1678,6 @@ def set(self, value=None, alias=None, **kwargs):

raise Exception("Unit_register object is read-only")


# nastavit to nepujde

if value is not None:

self.arm.neuron.client.write_register(self.valreg, int(value), unit=self.arm.modbus_address)

if isinstance(self.post_write, list):
for coil in self.post_write:
self.arm.neuron.client.write_coil(coil, 1, unit=self.arm.modbus_address)

"""
self.arm.neuron.client.write_register(self.valreg, 1 if value else 0, unit=self.arm.modbus_address)
if not (timeout is None):
timeout = int(timeout)
if timeout > 65535:
timeout = 65535
self.arm.neuron.client.write_register(self.toreg, timeout, unit=self.arm.modbus_address)
if self.reset_coil >= 0 and reset is not None:
if reset != 0:
self.nvsavvalue = 0
self.arm.neuron.client.write_coil(self.reset_coil, 1, unit=self.arm.modbus_address)
logger.info("Performed reset of board %s" % self.circuit)
"""



def full(self):

ret = {'dev': 'unit_register',
Expand Down Expand Up @@ -1734,7 +1707,6 @@ def simple(self):
def value(self):
try:
if self.regvalue():
print("CTU " + str(self.circuit))
return self.regvalue()
except:
pass
Expand Down

0 comments on commit a1ed397

Please sign in to comment.