--- a/modbus/modbus.py Thu Aug 13 19:00:38 2020 +0100
+++ b/modbus/modbus.py Mon Dec 21 22:35:07 2020 +0000
@@ -132,13 +132,31 @@
# %QX1.2.3.n
entries = []
entries.append({
- "name": "Exec. request flag",
+ "name": "Execute request flag",
"type": LOCATION_VAR_MEMORY,
"size": 1, # BOOL flag
"IEC_type": "BOOL", # BOOL flag
"var_name": "var_name",
"location": "X" + ".".join([str(i) for i in current_location]) + ".0.0",
- "description": "MB request execution control flag",
+ "description": "Modbus request execution control flag",
+ "children": []})
+ entries.append({
+ "name": "Modbus Request Status flag",
+ "type": LOCATION_VAR_MEMORY,
+ "size": 8, # BYTE flag
+ "IEC_type": "BYTE", # BYTE flag
+ "var_name": "var_name",
+ "location": "B" + ".".join([str(i) for i in current_location]) + ".0.1",
+ "description": "Modbus request status flag",
+ "children": []})
+ entries.append({
+ "name": "Modbus Error Code",
+ "type": LOCATION_VAR_MEMORY,
+ "size": 8, # BYTE flag
+ "IEC_type": "BYTE", # BYTE flag
+ "var_name": "var_name",
+ "location": "B" + ".".join([str(i) for i in current_location]) + ".0.2",
+ "description": "Modbus Error Code received in Modbus error frame",
"children": []})
for offset in range(address, address + count):
entries.append({
@@ -887,15 +905,23 @@
if ( relative_addr in xrange(int(GetCTVal(subchild, 2))) # condition (a) explained above
and len(iecvar["LOC"]) < 5): # condition (b) explained above
if str(iecvar["NAME"]) not in loc_vars_list:
- loc_vars.append(
- "u16 *" + str(iecvar["NAME"]) + " = &client_requests[%d].plcv_buffer[%d];" % (client_requestid, relative_addr))
+ loc_vars.append("u16 *" + str(iecvar["NAME"]) + " = &client_requests[%d].plcv_buffer[%d];" % (client_requestid, relative_addr))
loc_vars_list.append(str(iecvar["NAME"]))
# Now add the located variable in case it is a flag (condition (b) above
if len(iecvar["LOC"]) >= 5: # condition (b) explained above
if str(iecvar["NAME"]) not in loc_vars_list:
- loc_vars.append(
- "u16 *" + str(iecvar["NAME"]) + " = &client_requests[%d].flag_exec_req;" % (client_requestid))
- loc_vars_list.append(str(iecvar["NAME"]))
+ # Add if it is a Execution Request Flag (mapped onto %QXa.b.c.0.0), so last number is a '0'
+ if iecvar["LOC"][4] == 0:
+ loc_vars.append("u8 *" + str(iecvar["NAME"]) + " = &client_requests[%d].flag_exec_req;" % (client_requestid))
+ loc_vars_list.append(str(iecvar["NAME"]))
+ # Add if it is a "Modbus Request Status flag" (mapped onto %QWa.b.c.0.1), so last number is a '1'
+ if iecvar["LOC"][4] == 1:
+ loc_vars.append("u8 *" + str(iecvar["NAME"]) + " = &client_requests[%d].flag_tn_error_code;" % (client_requestid))
+ loc_vars_list.append(str(iecvar["NAME"]))
+ # Add if it is a "Modbus Error code" (mapped onto %QWa.b.c.0.2), so last number is a '2'
+ if iecvar["LOC"][4] == 2:
+ loc_vars.append("u8 *" + str(iecvar["NAME"]) + " = &client_requests[%d].flag_mb_error_code;" % (client_requestid))
+ loc_vars_list.append(str(iecvar["NAME"]))
client_requestid += 1
tcpclient_node_count += 1
client_nodeid += 1
@@ -928,7 +954,7 @@
# onto a location with 4 numbers (e.g. %QX0.1.2.0.0), where the last
# two numbers are always '0.0', and the first two identify the request.
# In the following if, we check for this condition by checking
- # if their are at least 4 or more number in the location's address.
+ # if there are at least 4 or more number in the location's address.
if ( relative_addr in xrange(int(GetCTVal(subchild, 2))) # condition (a) explained above
and len(iecvar["LOC"]) < 5): # condition (b) explained above
if str(iecvar["NAME"]) not in loc_vars_list:
@@ -938,9 +964,18 @@
# Now add the located variable in case it is a flag (condition (b) above
if len(iecvar["LOC"]) >= 5: # condition (b) explained above
if str(iecvar["NAME"]) not in loc_vars_list:
- loc_vars.append(
- "u16 *" + str(iecvar["NAME"]) + " = &client_requests[%d].flag_exec_req;" % (client_requestid))
- loc_vars_list.append(str(iecvar["NAME"]))
+ # Add if it is a Execution Request Flag (mapped onto %QXa.b.c.0.0), so last number is a '0'
+ if iecvar["LOC"][4] == 0:
+ loc_vars.append("u8 *" + str(iecvar["NAME"]) + " = &client_requests[%d].flag_exec_req;" % (client_requestid))
+ loc_vars_list.append(str(iecvar["NAME"]))
+ # Add if it is a "Modbus Request Status flag" (mapped onto %QWa.b.c.0.1), so last number is a '1'
+ if iecvar["LOC"][4] == 1:
+ loc_vars.append("u8 *" + str(iecvar["NAME"]) + " = &client_requests[%d].flag_tn_error_code;" % (client_requestid))
+ loc_vars_list.append(str(iecvar["NAME"]))
+ # Add if it is a "Modbus Error code" (mapped onto %QWa.b.c.0.2), so last number is a '2'
+ if iecvar["LOC"][4] == 2:
+ loc_vars.append("u8 *" + str(iecvar["NAME"]) + " = &client_requests[%d].flag_mb_error_code;" % (client_requestid))
+ loc_vars_list.append(str(iecvar["NAME"]))
client_requestid += 1
rtuclient_node_count += 1
client_nodeid += 1