ich arbeite zuzeit an der Kommunikation zwischen einen Schauber von Atlas Copco und Python. Die Aufgabe ist die Daten der Schraubvorgänge mittels Open Protocol in eine CSV zu exportieren.
Nun die Kommunikation steht soweit aber ich habe immer wieder das Problem dass sich die Nachrichten die ich mit recv() empfange, verschieben und es kann sein dass wenn ich das Programm neu starte noch alte Nachrichten ankommen.. (Auf den Bildern ist es sehr gut zu sehen)
So sollte es aussehen:
Hier nach dem zweiten mal ausführen:
Und hier nach dem dritten mal:
Nun der code.
main.py
Code: Alles auswählen
import OpenProtocol, dataExport, networking
op = OpenProtocol.opCon()
export = dataExport.dataExport()
sock = networking.opProtocol()
sock.IP = "192.168.1.136"
sock.PORT = 4545
sock.BUFFER = 1024
sock.connect(sock.IP,sock.PORT)
#a = sock.sendMID(op.message('Enable_tool'))
#print(a)
#b = sock.sendMID(op.message('Last_tightening_result_data_subscribe'))
#print(b)
#c = sock.recvData()
#print(c)
sock.close()
pass
Code: Alles auswählen
class opCon:
MID = {'Communication_start': '0001',
'Communication_start_acknowledge': '0002',
'Communication_stop': '0003',
'Command_error': '0004',
'Command_accepted': '0005',
'Generic_subscription': '0008',
'Generic_unsubscribe': '0009',
'Pset_ID_upload_request': '0010',
'Pset_ID_upload_reply': '0011',
'Pset_data_upload_request': '0012',
'Pset_data_upload_reply': '0013',
'Pset_selected_subscribe': '0014',
'Pset_selected': '0015',
'Pset_selected_acknowledge': '0016',
'Pset_selected_unsubscribe': '0017',
'Select_Parameter_set': '0018',
'Set_Pset_batch_size': '0019',
'Reset_Pset_batch_counter': '0020',
'Job_ID_upload_request': '0030',
'Job_ID_upload_reply': '0031',
'Tool_data_upload_request': '0040',
'Tool_data_upload_reply': '0041',
'Disable_tool': '0042',
'Enable_tool': '0043',
'Vehicle_ID_Nr_download_request': '0050',
'VIN_subscribe': '0051',
'VIN': '0052',
'VIN_acknowledge': '0053',
'VIN_unsubscribe': '0054',
'Last_tightening_result_data_subscribe': '0060',
'Last_tightening_result_data': '0061',
'Last_tightening_result_data_acknowledge': '0062',
'Last_tightening_result_data_unsubscribe': "0063",
'Old_tightening_result_upload_request': '0064',
'Old_tightening_result_upload_reply': '0065',
'Read_time_upload_request': '0080',
'Read_time_upload_reply': '0081',
'Set_time': '0082',
'Result_traces_curve': '0900',
'Result_traces_curve_plot_data': '0901',
'Keep_Alive': '9999'}
def message(self,mid, rev=" ", Nof=" ", stID=" ", spID=" ", seqNr=" ", msgPrt=" ", msgNr=" ", data="", NULL="\x00"):
x = self.MID[mid]
lng = str(len("0000" + x + rev + Nof + stID + spID + seqNr + msgPrt + msgNr + data))
sd = lng.zfill(4) + x + rev + Nof + stID + spID + seqNr + msgPrt + msgNr + data + NULL
return sd.encode() # lng.zfill(4)+x+rev+Nof+stID+spID+seqNr+msgNr+data+NULL
def decode(self,msg):
decoded = msg#.decode()
mid = decoded[4:8]
if mid == self.MID['Last_tightening_result_data']:
'''Decode MID 0061 REV 001'''
torque_controller_name = "Torque Controller Name: "+decoded[32:57]
job_id = "Job ID: "+decoded[86:88]
parameter_set_id = "PSet ID: "+decoded[90:93]
if decoded[107:108] == "1":
tightening_status = "Tightening Status: "+"OK"
elif decoded[107:108] == "0":
tightening_status = "Tightening Status: "+"NOK"
if decoded[110:111] == "0":
torque_status = "Torque Status: LOW"
elif decoded[110:111] == "1":
torque_status = "Torque Status: OK"
elif decoded[110:111] == "2":
torque_status = "Torque Status: HIGH"
if decoded[113:114] == "0":
angle_status = "Angle Status: LOW"
elif decoded[113:114] == "1":
angle_status = "Angle Status: OK"
elif decoded[113:114] == "2":
angle_status = "Angle Status: HIGH"
torque = "Torque: "+str(int(decoded[140:146])/100)+" Nm"
angle = "Angle: "+decoded[169:174]+" deg"
time_stamp = "Time Stamp: "+decoded[176:195]
tightening_id = "Tightening ID: "+decoded[221:231]
data = (torque_controller_name,job_id,parameter_set_id,tightening_status,torque_status,angle_status,torque,angle,time_stamp,tightening_id)
'''
0 Torque Controller Name
1 Job ID
2 Pset ID
3 Tightening Status
4 Torque Status
5 Angle Status
6 Torque
7 Angle
....
'''
return data
Code: Alles auswählen
import socket, OpenProtocol, time, threading
op = OpenProtocol.opCon()
class opProtocol:
IP = None
PORT = None
BUFFER = None
def connect(self, IP, PORT):
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
self.s.connect((IP,PORT))
self.s.send(op.message('Communication_start'))
except:
print("Something's wrong with %s:%s." % (IP,PORT))
print("Socket Connected")
try:
response = self.s.recv(1024)
print("Communication Start: %s" % (response))
x = str(response[4:8])
if x == op.MID['Communication_start_acknowledge']:
print("dsdwqe")
#if response[4:8] == op.MID['Communication_start_acknowledge']:
#print("Connected to %s:%s" % (IP,PORT))
except:
print("Recieve Error %s:%s." % (IP, PORT))
def sendMID(self,msg):
try:
self.s.send(msg)
except:
pass
o = self.s.recv(1024)
return o
def recvData(self):
try:
recieve = self.s.recv(1024)
except:
print("Error Recieve %s" % (recieve))
return recieve
def keepAlive(self,INTERVAL=8):
while True:
try:
self.s.send(op.message('Keep_Alive'))
response_keepalive = self.s.recv(self.BUFFER)
if response_keepalive == op.message('Keep_Alive'):
break
else:
print("Keep Alive Error: %s" % (response_keepalive))
except:
print("Keep Alive Except Error: %s" % (response_keepalive))
time.sleep(INTERVAL)
def close(self):
try:
self.s.send(op.message('Communication_stop'))
communication_stop = self.s.recv(1024)
print("Communication Stop: %s" % (communication_stop))
#if communication_stop[4:8] == op.MID['Command_accepted']:
#print("Connection Stopped")
self.s.close()
#print(communication_stop[4:8],op.MID['Command_accepted'])
except:
print("Error closing Socket: %s" % (communication_stop))
t = threading.Thread(target=keepAlive)
Code: Alles auswählen
import csv
class dataExport:
file = 'export.csv'
def writeData(self,data):
fileObj = open(self.file,'a')
csvWriter = csv.writer(fileObj)
for row in [data]:
csvWriter.writerow(row)
fileObj.close()
'''
data = "test"
data1 = "dest"
with open("./export/export.csv", "a", newline='') as exportFile:
exportFileWriter = csv.writer(exportFile)
exportFileWriter.writerow([data, data1])
exportFile.close()
'''