modbus modul erweitert, pCharger erweitert

This commit is contained in:
Philipp Rauch 2014-02-05 18:53:35 +01:00
parent 9a95c211eb
commit cee95b4b63
6 changed files with 76 additions and 42 deletions

View file

@ -25,7 +25,7 @@ def setup(conf):
def loop(db, item):
'''
sql_values = 'SELECT * FROM %s ORDER BY %s DESC LIMIT 0, 1'
'''
path = item.split('/')
if path[0] == '':

View file

@ -18,10 +18,8 @@ def setup(conf):
### INITIALIZE ###
PACS.append(messages)
PACS.append(ModbusTcpClient('10.2.6.5'))
PACS.append(ModbusTcpClient('10.2.6.6'))
PACS.append(ModbusTcpClient('10.2.6.7'))
PACS.append(ModbusTcpClient('10.2.6.8'))
for ip in conf['pac_ip']:
PACS.append(ModbusTcpClient(ip))
### CONNECT ###
for PAC in PACS[1::]:
@ -50,18 +48,17 @@ def loop(PACS, item):
if func is None:
raise NotImplementedError
res = PACS[2].read_holding_registers(item,reg,unit=2)
res = PACS[2].read_holding_registers(item,reg,unit=1)
return { row.get('Value name')[inx] : func(res.registers) }
def _to_float_time(reg):
res = []
res.append(_to_float(reg[0:2]))
res.append(_to_time_abs(reg[2:6]))
res = { 'value' : _to_float(reg[0:2]) }
res.update({ 'time' : _to_time_abs(reg[2:6]) })
return res
def _to_long(reg):
tmp = int(reg[0]) << 16 | int(reg[1])
tmp = _to_ulong(reg)
s = struct.pack('=i', tmp)
return struct.unpack('=l', s)[0]
@ -76,13 +73,13 @@ def _to_time_abs(reg):
return str(date)
def _to_ulong(reg):
return (reg[0]*(int(0xFFFF)+1) + reg[1])
return int(reg[0]) << 16 | int(reg[1])
def _to_ushort(reg):
return reg[0]
def _to_float(reg):
tmp = int(reg[0]) << 16 | int(reg[1])
tmp = _to_ulong(reg)
s = struct.pack('=i', tmp)
return struct.unpack('=f', s)[0]

View file

@ -72,7 +72,7 @@ class Switch(Thread):
elif self.source == MODBUS:
result = modbus.loop(self.cursor, item)
print 'PUT:\t%s' % result
#print 'PUT:\t%s' % result
self.queue.put(result)
self.query.task_done()

View file

@ -20,4 +20,6 @@ can_baudrate = 250k # default 500k
can_symfile = ems-test.sym
#### PAC ####
pac_csvfile = pacs.csv
pac_ip = 10.2.6.5, 10.2.6.6, 10.2.6.7, 10.2.6.8
pac_csvfile = pacs.csv # only one file allowed
pac_messages = 1, 801, 3001, 50235, 797, 213

View file

@ -5,7 +5,11 @@ Created on 16.01.2014
'''
import csv
from datetime import datetime
from pandas import DataFrame
from profile.database import Database
from Config.parser import config
import os
import numpy
number = 1
@ -13,17 +17,17 @@ sqlerr = "INSERT INTO %s (DateTime,Type,error) VALUES (\'%s\',%s,%s);"
sqlnor = "INSERT INTO %s (DateTime,Type,cardnumber,customernumber,plug,meterreading) VALUES (\'%s\',%s,%s,%s,%s,%s);"
folder = 'I:\Rauch\pCharger0%s'
def clean(list):
def clean(li):
'''
Cleans every strings in a list with the strip() Method
@param list: all elements musst strings
@return list: a list with clean strings
@param li: all elements musst strings
@return li: a list with clean strings
'''
for i in range(0, len(list)):
list[i] = list[i].strip()
#list[i] = list[i].strip('\xef\xbb\xbf')
return list
for i in range(0, len(li)):
li[i] = li[i].strip()
#li[i] = li[i].strip('\xef\xbb\xbf')
return li
def makeDatetime(time):
'''
@ -32,42 +36,77 @@ def makeDatetime(time):
@param: time: string with timeformat(dd.mm.yyy HH:MM:SS)
@return: datetime object
'''
tmp = []
time = time.split(' ')
time[0] = time[0].split('.')
time[1] = time[1].split(':')
tmp.append(int(time[0][2]))
tmp.append(int(time[0][1]))
tmp.append(int(time[0][0]))
tmp.append(int(time[1][0]))
tmp.append(int(time[1][1]))
tmp.append(int(time[1][2]))
res = datetime(int(time[0][2]),
int(time[0][1]),
int(time[0][0]),
int(time[1][0]),
int(time[1][1]),
int(time[1][2]))
return datetime(tmp[0], tmp[1], tmp[2], tmp[3], tmp[4], tmp[5]).__str__()
return res
def generateSQL(folder):
def genData(folder):
'''
generate SQL commands of all pCarger csv documents in a folder
@param folder: path to the folder containing pCarger csv files
'''
ordner = os.listdir(folder)
columns = ('DateTime', 'Type','cardnumber', 'customernumber', 'plug', 'meterreading', 'error')
res_data = DataFrame(columns = ['DateTime', 'Type', 'cardnumber', 'customernumber', 'plug', 'meterreading', 'error'])
for datei in ordner:
path = "%s/%s" % (folder, datei)
csv_data = csv.reader(file(path), delimiter=';')
try:
for row in csv_data:
res = {}
row = clean(row)
row[0] = "P-Charger_0%s" % number #row[0]
row[1] = makeDatetime(row[1])
row[3] = int(row[3], 16).__str__()
row[3] = numpy.int(row[3], 16)
if row[2] not in 'SE':
row[6] = int(row[6], 16).__str__()
print sqlnor % tuple(row)
row[4] = numpy.nan if row[4] is '' else numpy.int(row[4], 16)
row[5] = numpy.int(row[5], 16)
row[6] = numpy.int(row[6], 16)
for i in range(len(row)-1):
res.update({ columns[i] : row[i+1] })
else:
print sqlerr % tuple(row)
for i in range(len(row)-1):
if i is 2:
res.update({ columns[6] : row[i+1] })
else:
res.update({ columns[i] : row[i+1] })
pass
res_data = res_data.append(res, ignore_index = True)
except:
continue
#print res_data
#res_data = res_data.set_index('DateTime', verify_integrity = True)
res_data = res_data.replace('', numpy.nan)
res_data = res_data.where(DataFrame.notnull(res_data), 0)
res_data[['cardnumber', 'customernumber', 'plug', 'meterreading', 'error']] = res_data[['cardnumber', 'customernumber', 'plug', 'meterreading', 'error']].astype(numpy.int64)
return res_data
c = config()
conf = c.readConf()
db = Database()
db.loadDatabase(strHost = conf['mySQL_server'],
intPort = int(conf['mySQL_port']),
strUser = conf['mySQL_user'],
strPasswd = conf['mySQL_pass'],
strDatabase = 'ems_testdb', #conf['mySQL_database'],
strTable = None)
for i in range(1,8):
number = i
generateSQL('I:\Rauch\pCharger%s' % '0{0}'.format(number))
#print genData('I:\Rauch\pCharger%s' % '0{0}'.format(number))
if i == 5:
continue
db.writeDatabase('pCharger%s' % '0{0}'.format(number), genData('I:\Rauch\pCharger%s' % '0{0}'.format(number)), bClear = False)
print 'wrote pCharger%s' % '0{0}'.format(number)

View file

@ -20,13 +20,9 @@ print '\tTEST-QUERY:\t', query
print '\tTEST-QUEUE:\t', queue
sw.start()
while True:
query.put(1)
query.put(801)
query.put(3001)
query.put(50235)
query.put(797)
query.put(203)
sleep(0.5)
for mes in conf['pac_messages']:
query.put(int(mes))
sleep(1)
### Sym2Lib test ###
# sym = "%s/%s" % (conf["config_dictionary"], conf["symfile"])