Fixes a tag name, adds the ability to store all current values for testing
This commit is contained in:
BIN
Modbus Map.xlsx
BIN
Modbus Map.xlsx
Binary file not shown.
@@ -114,7 +114,7 @@
|
||||
{"tag_name": "GAUGEOFF_Polished_Rod_HP", "register_type": "ir", "register_number": 211},
|
||||
{"tag_name": "GAUGEOFF_Pump_Intake_Pressure", "register_type": "ir", "register_number": 213},
|
||||
{"tag_name": "GAUGEOFF_Surface_StrokeLength", "register_type": "ir", "register_number": 215},
|
||||
{"tag_name": "GAUGOFF_Production_Calculated", "register_type": "ir", "register_number": 217},
|
||||
{"tag_name": "GAUGEOFF_Production_Calculated", "register_type": "ir", "register_number": 217},
|
||||
{"tag_name": "GAUGEOFF_Tubing_Movement", "register_type": "ir", "register_number": 219},
|
||||
{"tag_name": "Gearbox_Loading", "register_type": "ir", "register_number": 221},
|
||||
{"tag_name": "Gearbox_Torque", "register_type": "ir", "register_number": 223},
|
||||
|
||||
22932
currentValues.csv
Normal file
22932
currentValues.csv
Normal file
File diff suppressed because it is too large
Load Diff
240
getAllValues.py
Normal file
240
getAllValues.py
Normal file
@@ -0,0 +1,240 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
# ---------------------------------------------------------------------------#
|
||||
# import the various server implementations
|
||||
# ---------------------------------------------------------------------------#
|
||||
from pymodbus.client.sync import ModbusTcpClient as ModbusClient
|
||||
|
||||
# ---------------------------------------------------------------------------#
|
||||
# import python packages
|
||||
# ---------------------------------------------------------------------------#
|
||||
from pymongo import MongoClient
|
||||
import pytest
|
||||
import struct
|
||||
|
||||
# ---------------------------------------------------------------------------#
|
||||
# configure the client logging
|
||||
# ---------------------------------------------------------------------------#
|
||||
import logging
|
||||
logging.basicConfig()
|
||||
log = logging.getLogger()
|
||||
log.setLevel(logging.INFO)
|
||||
|
||||
# ---------------------------------------------------------------------------#
|
||||
# Modbus Client Setup
|
||||
# ---------------------------------------------------------------------------#
|
||||
modbus_client = ModbusClient('localhost', port=502)
|
||||
|
||||
# ---------------------------------------------------------------------------#
|
||||
# Mongo DB Setup
|
||||
# ---------------------------------------------------------------------------#
|
||||
mongo_client = MongoClient()
|
||||
mongo_db = mongo_client.tag_data
|
||||
mongo_tags = mongo_db.tag_vals
|
||||
|
||||
|
||||
def close_enough(a, b):
|
||||
return abs(a - b) < 0.001
|
||||
|
||||
|
||||
def float_to_bytes(float_val):
|
||||
'''
|
||||
Converts a float to little-endian bytes
|
||||
'''
|
||||
packed_string = struct.pack('f', float_val)
|
||||
unpacked_list = list(struct.unpack('HH', packed_string))
|
||||
return unpacked_list
|
||||
|
||||
|
||||
def integer_to_byte(integer_val):
|
||||
'''
|
||||
Converts an integer to its byte
|
||||
'''
|
||||
packed_string = struct.pack('h', integer_val)
|
||||
unpacked = list(struct.unpack('H', packed_string))
|
||||
return unpacked
|
||||
|
||||
|
||||
def lebyte_to_float(word_list):
|
||||
'''
|
||||
Converts list of little-endian bytes to float
|
||||
'''
|
||||
packed_string = struct.pack("HH", *word_list)
|
||||
unpacked_float = struct.unpack("f", packed_string)[0]
|
||||
return unpacked_float
|
||||
|
||||
|
||||
def lebyte_to_integer(word_list):
|
||||
'''
|
||||
Converts list(size = 1) of little-endian bytes to Integer
|
||||
'''
|
||||
try:
|
||||
packed_string = struct.pack("H", *word_list)
|
||||
unpacked_int = struct.unpack("h", packed_string)[0]
|
||||
except Exception as e:
|
||||
print("Unable to convert {} to integer".format(word_list))
|
||||
return False
|
||||
return unpacked_int
|
||||
|
||||
|
||||
def read_holding_registers(num_registers):
|
||||
with open('holding_registers.csv', 'wb') as csvfile:
|
||||
modbus_client.connect()
|
||||
for i in range(0, num_registers - 1):
|
||||
reg = modbus_client.read_holding_registers(i, 1).registers
|
||||
csvfile.write("{},{}\n".format(i + 1, reg[0]))
|
||||
print("{},{}".format(i + 1, reg[0]))
|
||||
|
||||
|
||||
def read_input_registers(num_registers):
|
||||
with open('input_registers.csv', 'wb') as csvfile:
|
||||
modbus_client.connect()
|
||||
for i in range(0, num_registers - 1):
|
||||
reg = modbus_client.read_input_registers(i, 1).registers
|
||||
csvfile.write("{},{}\n".format(i + 1, reg[0]))
|
||||
print("{},{}".format(i + 1, reg[0]))
|
||||
|
||||
|
||||
def read_coils(num_registers):
|
||||
with open('coils.csv', 'wb') as csvfile:
|
||||
modbus_client.connect()
|
||||
for i in range(0, num_registers - 1):
|
||||
reg = modbus_client.read_coils(i, 1).bits
|
||||
csvfile.write("{},{}\n".format(i + 1, reg[0]))
|
||||
print("{},{}".format(i + 1, reg[0]))
|
||||
|
||||
|
||||
def read_discrete_inputs(num_registers):
|
||||
with open('discrete_inputs.csv', 'wb') as csvfile:
|
||||
modbus_client.connect()
|
||||
for i in range(0, num_registers - 1):
|
||||
reg = modbus_client.read_discrete_inputs(i, 1).bits
|
||||
csvfile.write("{},{}\n".format(i + 1, reg[0]))
|
||||
print("{},{}".format(i + 1, reg[0]))
|
||||
|
||||
|
||||
def db_read_holding_registers():
|
||||
tag_in_db = mongo_tags.find({"register_type": 'hr'})
|
||||
with open('db_holding_registers.csv', 'wb') as csvfile:
|
||||
for db_tag in tag_in_db:
|
||||
try:
|
||||
database_value = db_tag['val']
|
||||
except KeyError:
|
||||
print("No value in DB for {}".format(db_tag['tag_name']))
|
||||
reg = []
|
||||
reg_string = ""
|
||||
try:
|
||||
if db_tag['tag_type'][-3:] == 'INT':
|
||||
reg = modbus_client.read_holding_registers(db_tag['register_number'] - 1, 1).registers
|
||||
|
||||
elif db_tag['tag_type'] == 'REAL':
|
||||
reg = modbus_client.read_holding_registers(db_tag['register_number'] - 1, 2).registers
|
||||
# print(reg)
|
||||
except AttributeError:
|
||||
print("Could not get register {} for {}".format(db_tag['register_number'], db_tag['tag_name']))
|
||||
continue
|
||||
if reg:
|
||||
if len(reg) == 2:
|
||||
# r = reg.reverse()
|
||||
modbus_value = lebyte_to_float(reg)
|
||||
reg_string = "{},{}".format(reg[0], reg[1])
|
||||
else:
|
||||
modbus_value = lebyte_to_integer(reg)
|
||||
reg_string = "{}".format(reg[0])
|
||||
print("{},{},{},{},{}".format(db_tag['register_number'], db_tag['tag_name'], database_value, modbus_value, reg_string))
|
||||
csvfile.write("{},{},{},{},{}\n".format(db_tag['register_number'], db_tag['tag_name'], database_value, modbus_value, reg_string))
|
||||
modbus_client.close()
|
||||
|
||||
|
||||
def db_read_input_registers():
|
||||
tag_in_db = mongo_tags.find({"register_type": 'ir'})
|
||||
with open('db_input_registers.csv', 'wb') as csvfile:
|
||||
for db_tag in tag_in_db:
|
||||
try:
|
||||
database_value = db_tag['val']
|
||||
except KeyError:
|
||||
print("No value in DB for {}".format(db_tag['tag_name']))
|
||||
continue
|
||||
reg = []
|
||||
try:
|
||||
if db_tag['tag_type'][-3:] == 'INT':
|
||||
reg = modbus_client.read_input_registers(db_tag['register_number'] - 1, 1).registers
|
||||
|
||||
elif db_tag['tag_type'] == 'REAL':
|
||||
reg = modbus_client.read_input_registers(db_tag['register_number'] - 1, 2).registers
|
||||
# print(reg)
|
||||
except AttributeError:
|
||||
print("Could not get register {} for {}".format(db_tag['register_number'], db_tag['tag_name']))
|
||||
continue
|
||||
if reg:
|
||||
if len(reg) == 2:
|
||||
# r = reg.reverse()
|
||||
modbus_value = lebyte_to_float(reg)
|
||||
reg_string = "{},{}".format(reg[0], reg[1])
|
||||
else:
|
||||
modbus_value = lebyte_to_integer(reg)
|
||||
reg_string = "{}".format(reg[0])
|
||||
|
||||
print("{},{},{},{},{}".format(db_tag['register_number'], db_tag['tag_name'], database_value, modbus_value, reg_string))
|
||||
csvfile.write("{},{},{},{},{}\n".format(db_tag['register_number'], db_tag['tag_name'], database_value, modbus_value, reg_string))
|
||||
modbus_client.close()
|
||||
|
||||
|
||||
def db_read_coils():
|
||||
modbus_client.connect()
|
||||
tag_in_db = mongo_tags.find({"register_type": 'co'})
|
||||
with open('db_coils.csv', 'wb') as csvfile:
|
||||
for db_tag in tag_in_db:
|
||||
try:
|
||||
database_value = db_tag['val']
|
||||
except KeyError:
|
||||
print("No value in DB for {}".format(db_tag['tag_name']))
|
||||
continue
|
||||
|
||||
try:
|
||||
reg = modbus_client.read_coils(db_tag['register_number'] - 1, 1).bits
|
||||
print("{},{},{},{}".format(db_tag['register_number'], db_tag['tag_name'], database_value, reg[0]))
|
||||
csvfile.write("{},{},{},{}\n".format(db_tag['register_number'], db_tag['tag_name'], database_value, reg[0]))
|
||||
|
||||
except AttributeError:
|
||||
print("Could not get register {} for {}".format(db_tag['register_number'], db_tag['tag_name']))
|
||||
continue
|
||||
|
||||
|
||||
def db_read_discrete_inputs():
|
||||
modbus_client.connect()
|
||||
tag_in_db = mongo_tags.find({"register_type": 'di'})
|
||||
with open('db_discrete_inputs.csv', 'wb') as csvfile:
|
||||
for db_tag in tag_in_db:
|
||||
try:
|
||||
database_value = db_tag['val']
|
||||
except KeyError:
|
||||
print("No value in DB for {}".format(db_tag['tag_name']))
|
||||
continue
|
||||
|
||||
try:
|
||||
reg = modbus_client.read_discrete_inputs(db_tag['register_number'] - 1, 1).bits
|
||||
print("{},{},{},{}".format(db_tag['register_number'], db_tag['tag_name'], database_value, reg[0]))
|
||||
csvfile.write("{},{},{},{}\n".format(db_tag['register_number'], db_tag['tag_name'], database_value, reg[0]))
|
||||
|
||||
except AttributeError:
|
||||
print("Could not get register {} for {}".format(db_tag['register_number'], db_tag['tag_name']))
|
||||
continue
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("Holding Registers")
|
||||
# read_holding_registers(158)
|
||||
db_read_holding_registers()
|
||||
|
||||
print("Input Registers")
|
||||
# read_input_registers(22753)
|
||||
db_read_input_registers()
|
||||
|
||||
print("Coils")
|
||||
# read_coils(19)
|
||||
db_read_coils()
|
||||
|
||||
print("Discrete Inputs")
|
||||
# read_discrete_inputs(2)
|
||||
db_read_discrete_inputs()
|
||||
Reference in New Issue
Block a user