|
9 | 9 | decoder_func = { |
10 | 10 | 'int16': lambda d: d.decode_16bit_int(), |
11 | 11 | 'uint16': lambda d: d.decode_16bit_uint(), |
| 12 | + 'int32': lambda d: d.decode_32bit_int(), |
| 13 | + 'uint32': lambda d: d.decode_32bit_uint(), |
| 14 | + 'int64': lambda d: d.decode_64bit_int(), |
| 15 | + 'uint64': lambda d: d.decode_64bit_uint(), |
12 | 16 | 'float32': lambda d: d.decode_32bit_float(), |
13 | 17 | 'float64': lambda d: d.decode_64bit_float() |
14 | 18 | } |
@@ -46,9 +50,9 @@ def mapregister(self, registerresponse: ReadRegistersResponseBase, registerdef): |
46 | 50 | is_litte_word_endian = self.device.get('littlewordendian') or False |
47 | 51 | readregister = registerresponse.registers |
48 | 52 | registertype = 'ir' if (registerdef.get('input') or False) else 'hr' |
49 | | - registerkey = f'${registerdef["number"]}:${registerdef["startbit"]}' |
| 53 | + registerkey = f'{registerdef["number"]}:{registerdef["startbit"]}' |
50 | 54 | if fieldlength > 16 and startbit > 0: |
51 | | - raise Exception('float values must align to the zero bit of the start register') |
| 55 | + raise Exception('values spanning registers must align to the zero bit of the start register') |
52 | 56 | if fieldlength > 16: |
53 | 57 | value = self.parse_register_value(readregister, self.gettargettype(registerdef), |
54 | 58 | little_endian=is_little_endian, word_endian=is_litte_word_endian) |
@@ -98,7 +102,7 @@ def checkalarm(self, value, alarmmapping, registertype, registerkey): |
98 | 102 | messages = [] |
99 | 103 | old_data = self.data.get(registertype).get(registerkey) |
100 | 104 | # raise alarm if bit is 1 |
101 | | - if old_data is not None and old_data == 0 and value > 0: |
| 105 | + if (old_data is None or old_data == 0) and value > 0: |
102 | 106 | severity = alarmmapping['severity'].lower() |
103 | 107 | alarmtype = alarmmapping['type'] |
104 | 108 | text = alarmmapping['text'] |
@@ -126,13 +130,14 @@ def checkevent(self, value, eventmapping, registertype, registerkey): |
126 | 130 |
|
127 | 131 | @staticmethod |
128 | 132 | def gettargettype(registerdef): |
| 133 | + dtype = 'int' if registerdef.get('datatype') == 'int' else 'float' |
| 134 | + signed = 'u' if dtype == 'int' and registerdef.get('signed') == False else '' |
| 135 | + length = 16 |
129 | 136 | if registerdef['nobits'] > 32: |
130 | | - return 'float64' |
| 137 | + length = 64 |
131 | 138 | elif registerdef['nobits'] > 16: |
132 | | - return 'float32' |
133 | | - elif registerdef.get('signed') == False: |
134 | | - return 'uint16' |
135 | | - return 'int16' |
| 139 | + length = 32 |
| 140 | + return f'{signed}{dtype}{length}' |
136 | 141 |
|
137 | 142 | @staticmethod |
138 | 143 | def parse_register_value(read_registers, target_type, little_endian, word_endian): |
|
0 commit comments