Skip to content

Commit 8d3e784

Browse files
committed
add byte order to data types _BE _LE
1 parent 9c2aa14 commit 8d3e784

File tree

3 files changed

+43
-15
lines changed

3 files changed

+43
-15
lines changed

classes/protocol_settings.py

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ class registry_map_entry:
188188
register_bit : int
189189
register_byte : int
190190
''' byte offset for canbus ect... '''
191+
191192
variable_name : str
192193
documented_name : str
193194
unit : str
@@ -208,6 +209,9 @@ class registry_map_entry:
208209
data_type_size : int = -1
209210
''' for non-fixed size types like ASCII'''
210211

212+
data_byteorder : str = ''
213+
''' entry specific byte order little | big | '' '''
214+
211215
read_command : bytes = None
212216
''' for transports/protocols that require sending a command ontop of "register" '''
213217

@@ -512,16 +516,30 @@ def process_row(row):
512516

513517
#region data type
514518
data_type = Data_Type.USHORT
515-
516519
data_type_len : int = -1
520+
data_byteorder : str = ''
517521
#optional row, only needed for non-default data types
518522
if "data type" in row and row["data type"]:
523+
data_type_str : str = ''
524+
519525
matches = data_type_regex.search(row["data type"])
520526
if matches:
521527
data_type_len = int(matches.group("length"))
522-
data_type = Data_Type.fromString(matches.group("datatype"))
528+
data_type_str = matches.group("datatype")
523529
else:
524-
data_type = Data_Type.fromString(row["data type"])
530+
data_type_str = row["data type"]
531+
532+
#check if datatype specifies byteorder
533+
if data_type_str.upper().endswith("_LE"):
534+
data_byteorder = "little"
535+
data_type_str = data_type_str[:-3]
536+
elif data_type_str.upper().endswith("_BE"):
537+
data_byteorder = "big"
538+
data_type_str = data_type_str[:-3]
539+
540+
541+
data_type = Data_Type.fromString(data_type_str)
542+
525543

526544

527545
if "values" not in row:
@@ -658,6 +676,7 @@ def process_row(row):
658676
unit_mod= unit_multiplier,
659677
data_type= data_type,
660678
data_type_size = data_type_len,
679+
data_byteorder = data_byteorder,
661680
concatenate = concatenate,
662681
concatenate_registers = concatenate_registers,
663682
values=values,
@@ -857,6 +876,10 @@ def load_registry_map(self, registry_type : Registry_Type, file : str = "", sett
857876
def process_register_bytes(self, registry : dict[int,bytes], entry : registry_map_entry):
858877
''' process bytes into data'''
859878

879+
byte_order : str = self.byteorder
880+
if entry.data_byteorder: #allow map entry to override byteorder
881+
byte_order = entry.data_byteorder
882+
860883
if isinstance(registry[entry.register], tuple):
861884
register = registry[entry.register][0] #can bus uses tuple for timestamp
862885
else:
@@ -869,15 +892,15 @@ def process_register_bytes(self, registry : dict[int,bytes], entry : registry_ma
869892
register = register[:entry.data_type_size]
870893

871894
if entry.data_type == Data_Type.UINT:
872-
value = int.from_bytes(register[:4], byteorder=self.byteorder, signed=False)
895+
value = int.from_bytes(register[:4], byteorder=byte_order, signed=False)
873896
elif entry.data_type == Data_Type.INT:
874-
value = int.from_bytes(register[:4], byteorder=self.byteorder, signed=True)
897+
value = int.from_bytes(register[:4], byteorder=byte_order, signed=True)
875898
elif entry.data_type == Data_Type.USHORT:
876-
value = int.from_bytes(register[:2], byteorder=self.byteorder, signed=False)
899+
value = int.from_bytes(register[:2], byteorder=byte_order, signed=False)
877900
elif entry.data_type == Data_Type.SHORT:
878-
value = int.from_bytes(register[:2], byteorder=self.byteorder, signed=True)
901+
value = int.from_bytes(register[:2], byteorder=byte_order, signed=True)
879902
elif entry.data_type == Data_Type._16BIT_FLAGS or entry.data_type == Data_Type._8BIT_FLAGS or entry.data_type == Data_Type._32BIT_FLAGS:
880-
val = int.from_bytes(register, byteorder=self.byteorder, signed=False)
903+
val = int.from_bytes(register, byteorder=byte_order, signed=False)
881904
#16 bit flags
882905
start_bit : int = 0
883906
end_bit : int = 16 #default 16 bit
@@ -954,15 +977,15 @@ def process_register_bytes(self, registry : dict[int,bytes], entry : registry_ma
954977
value = (register >> bit_index) & bit_mask
955978

956979
elif entry.data_type == Data_Type.BYTE: #bit types
957-
value = int.from_bytes(register[:1], byteorder=self.byteorder, signed=False)
980+
value = int.from_bytes(register[:1], byteorder=byte_order, signed=False)
958981
elif entry.data_type.value > 200: #bit types
959982
bit_size = Data_Type.getSize(entry.data_type)
960983
bit_mask = (1 << bit_size) - 1 # Create a mask for extracting X bits
961984
bit_index = entry.register_bit
962985

963986

964987
if isinstance(register, bytes):
965-
register = int.from_bytes(register, byteorder=self.byteorder)
988+
register = int.from_bytes(register, byteorder=byte_order)
966989

967990
value = (register >> bit_index) & bit_mask
968991

@@ -996,6 +1019,11 @@ def process_register_bytes(self, registry : dict[int,bytes], entry : registry_ma
9961019

9971020
def process_register_ushort(self, registry : dict[int, int], entry : registry_map_entry ):
9981021
''' process ushort type registry into data'''
1022+
1023+
byte_order : str = self.byteorder
1024+
if entry.data_byteorder:
1025+
byte_order = entry.data_byteorder
1026+
9991027
if entry.data_type == Data_Type.UINT: #read uint
10001028
if entry.register + 1 not in registry:
10011029
return
@@ -1084,10 +1112,10 @@ def process_register_ushort(self, registry : dict[int, int], entry : registry_ma
10841112
bit_index = entry.register_bit
10851113
value = (registry[entry.register] >> bit_index) & bit_mask
10861114
elif entry.data_type == Data_Type.HEX:
1087-
value = registry[entry.register].to_bytes((16 + 7) // 8, byteorder=self.byteorder) #convert to ushort to bytes
1115+
value = registry[entry.register].to_bytes((16 + 7) // 8, byteorder=byte_order) #convert to ushort to bytes
10881116
value = value.hex() #convert bytes to hex
10891117
elif entry.data_type == Data_Type.ASCII:
1090-
value = registry[entry.register].to_bytes((16 + 7) // 8, byteorder=self.byteorder) #convert to ushort to bytes
1118+
value = registry[entry.register].to_bytes((16 + 7) // 8, byteorder=byte_order) #convert to ushort to bytes
10911119
try:
10921120
value = value.decode("utf-8") #convert bytes to ascii
10931121
except UnicodeDecodeError as e:

protocols/eg4/eg4_v58.input_registry_map.csv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ Grid Hz,,15,Fac,0.01Hz,0-65535,Utility grid frequency,,,,,,,,,,,,
129129
,8bit,118.b8,SN_7__serial number,,[0-9a-zA-Z],,,,,,,,,,,,,
130130
,8bit,119,SN_8__serial number,,[0-9a-zA-Z],,,,,,,,,,,,,
131131
,8bit,119.b8,SN_9__serial number,,[0-9a-zA-Z],,,,,,,,,,,,,
132-
,ASCII,115~119,Serial Number,,,Serial Number as one string instead of split,,,,,,,,,,,,
132+
,ASCII_LE,115~119,Serial Number,,,Serial Number as one string instead of split,,,,,,,,,,,,
133133
,,120,VBusP,0.1V,,,Half BUS voltage,Half BUS voltage,Half BUS voltage,Half BUS voltage,Half BUS voltage,Half BUS voltage,Half BUS voltage,Half BUS voltage,Half BUS voltage,Half BUS voltage,Half BUS voltage,Half BUS voltage
134134
,,121,GenVolt,0.1V,,Generator voltage Voltage of generator for three phase: R phase,,,,,,,,,,,,
135135
,,122,GenFreq,0.01Hz,,Generator frequency,,,,,,,,,,,,

tools/modbus_server_sim.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ def on_write_request(request):
2828
input_registry = {int(key): value for key, value in input_registry.items()}
2929
holding_registry = {int(key): value for key, value in holding_registry.items()}
3030

31-
slave.add_block('INPUT', READ_INPUT_REGISTERS, min(input_registry.keys()), max(input_registry.keys())) # 100 registers
32-
slave.add_block('HOLDING', HOLDING_REGISTERS, min(holding_registry.keys()), max(holding_registry.keys())) # 100 registers
31+
slave.add_block('INPUT', READ_INPUT_REGISTERS, 0, max(input_registry.keys()) +1 ) # 100 registers
32+
slave.add_block('HOLDING', HOLDING_REGISTERS, 0, max(holding_registry.keys()) +1) # 100 registers
3333

3434
for address, value in input_registry.items():
3535
slave.set_values('INPUT', address, [value])

0 commit comments

Comments
 (0)