Schön, dass es jetzt auch mit Python möglich CoDeSys-Projekte zu manipulieren.
Für unseren Systemtest, bei dem eine CoDeSys-Steuerung über EtherCAT mit den Feldgeräten kommuniziert
müssen wir verschiedene Geräteszenarien durchspielen, bei denen nur die Reihenfolge der Geräte unter dem EtherCAT-Master verändert wird.
Nachdem ich mir das Ergebnis vom print() angeschaut habe, viel mir jedoch auf, das die Objekte nicht in der Reihenfolge gelistet werden, wie sie unter dem EtherCAT_Master angeordnet waren, sondern in der zeitlichen Reihenfolge des Einfügens also mit aufsteigender Object-ID . (Wenn man die Gerätereihenfolge mit der Maus verändert, ändert dies z.B. nichts an der Ausgabe-Reihenfolge des prints)
Meine Frage lautet daher: Ist es möglich auch an die Position der Slaves unter dem Master heranzukommen, da dies bei EtherCat auch einen physikalischen Bezug hat.
-> EtherCAT-NodeID = Position+1000
PS: Anbei auch das weitere Vorgehen um Projektvarianten zu erzeugen bei denen alle Geräte unterhalb des Master_Knotens von Projekt zu Projekt ringförmig geshiftet werden -> Script im Anhang
Wenn die Geräte bekannt sind kann man mit Hilfe der XmlExport- und XmlImportfunktion das Projekt so manipulieren, dass die Geräte in anderer Reihenfolge unter dem Master angeordnet werden.
Die referenzierte Variablen vom I/O Abbild bleiben dabei erhalten, so das sich nur die Reihenfolge, nicht aber die Funktion der Geräte ändert.
Hinweis, die im Skript implementierten Reportklassen müssen sein, damit die Import und Exportmethoden genutzt werden können.
\# coding=utf-8from__future__importprint_functionimportsysimportos
\# name of project must be name of script
\# result are written in <pathscript=os.path.splitext(__file__)[0]# unser scriptpathproject=pathscriptpathresult=pathscript
\# objectname in project of ethercat master must be "EtherCAT_Master"ecatmaster_name="EtherCAT_Master"
\# redirect prints sys.stdout=open(pathresult+".txt","w")classexrep(ExportReporter):deferror(self):print("error")defnonexportable(self):print("nonexportable")defwarning(self):print("warning")defget_aborting(self):returnFalseclassimrep(ImportReporter):defadded():print("added")deferror(self):print("error")defreplaced():print("replaced")defresolve_conflict(self):print("resolve_conflict")defskipped(self):print("skipped")defwarning(self):print("warning")defget_aborting(self):returnFalsetry:proj=projects.open(pathproject+'.project')print(pathscript)ecatmaster=proj.find(ecatmaster_name,True)[0]devs=ecatmaster.get_children()fordevindevs:print(dev.get_name())# export devicesexreporter=exrep();devxml=[];fordevindevs:devxml.append(pathproject+"_%s.xml"%dev.get_name())proj.export_xml(exreporter,[dev],devxml[-1],recursive=True)# define all variants of project by rotation of deviceschain=range(1,len(devs)+1)per=[]forninchain:per.append(chain)chain=chain[1:]+chain[:1]# create project variantsimreporter=imrep();forchaininper:# first clear devicesfordevinecatmaster.get_children():dev.remove()# import devices in order of chainforninchain:ecatmaster.import_xml(imreporter,devxml[n-1])proj.save_as(pathproject+"_var%02u.project"%chain[0])print("saved variant: %s"%chain)exceptException,e:print(e)sys.stdout.close()proj.close()
\#system.exit()
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Anonymous
-
2011-05-09
Originally created by: M.Schaber
Hallo, Tino,
tinogoetz hat geschrieben:
-> Die bei python so wichtigen Einrückungen gehen in diesem Forum leider verloren
Anfangsleerzeichen werden gelöscht, Mehrfachleerzeichen durch einzelne ersetzt, Dateinahänge mit .py oder .txt wurden nicht akzeptiert.
tinogoetz hat geschrieben:
Nachdem ich mir das Ergebnis vom print() angeschaut habe, viel mir jedoch auf, das die Objekte nicht in der Reihenfolge gelistet werden, wie sie unter dem EtherCAT_Master angeordnet waren, sondern in der zeitlichen Reihenfolge des Einfügens also mit aufsteigender Object-ID . (Wenn man die Gerätereihenfolge mit der Maus verändert, ändert dies z.B. nichts an der Ausgabe-Reihenfolge des prints)
Meine Frage lautet daher: Ist es möglich auch an die Position der Slaves unter dem Master heranzukommen, da dies bei EtherCat auch einen physikalischen Bezug hat.
-> EtherCAT-NodeID = Position+1000
Die Gerätereihenfolge kannst Du vielleicht rauskriegen, in dem Du nach dem index-Property sortierst. Das müsste in diesen Fällen die Reihenfolge angeben.
tinogoetz hat geschrieben:
PS: Anbei auch das weitere Vorgehen um Projektvarianten zu erzeugen bei denen alle Geräte unterhalb des Master_Knotens von Projekt zu Projekt ringförmig geshiftet werden -> Script im Anhang
Wenn die Geräte bekannt sind kann man mit Hilfe der XmlExport- und XmlImportfunktion das Projekt so manipulieren, dass die Geräte in anderer Reihenfolge unter dem Master angeordnet werden.
Die referenzierte Variablen vom I/O Abbild bleiben dabei erhalten, so das sich nur die Reihenfolge, nicht aber die Funktion der Geräte ändert.
Wunderbar, danke für das Beispielskript. Vielleicht würde in diesem Falle auch die move()-Methode weiterhelfen, der kannst Du auch einen Index angeben.
tinogoetz hat geschrieben:
Hinweis, die im Skript implementierten Reportklassen müssen sein, damit die Import und Exportmethoden genutzt werden können.
Dafür haben wir schon eine Verbesserung in der Schublade, allerdings gibt es noch kein geplantes Release-Datum.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Der Hinweis mit der move-Methode führte jedoch nicht zum Ziel.
Ich bekam die Fehlermeldung, dass man dort nicht hinschieben könne.
weder mit:
devs[0].move(ecatmaster, len(devs)) # verdrängung des letzten devices?
noch mit:
devs[0].move(ecatmaster, len(devs)+1)
deshalb funktioniert mein Skript weiter über xml-export und xml-import
\# coding=utf-8from__future__importprint_functionimportsysimportos
\# names of script, project and logfile may be differentpathscript=os.path.splitext(__file__)[0]# unser scriptpathproject=pathscriptpathlog=pathscript
\# objectname in project of ethercat masterecatmaster_name="EtherCAT_Master"
\# redirect prints sys.stdout=open(pathlog+".txt","w")classexrep(ExportReporter):deferror(self):print("error")defnonexportable(self):print("nonexportable")defwarning(self):print("warning")defget_aborting(self):returnFalseclassimrep(ImportReporter):defadded():print("added")deferror(self):print("error")defreplaced():print("replaced")defresolve_conflict(self):print("resolve_conflict")defskipped(self):print("skipped")defwarning(self):print("warning")defget_aborting(self):returnFalsetry:proj=projects.open(pathproject+'.project')ecatmaster=proj.find(ecatmaster_name,True)[0]devs=sorted(ecatmaster.get_children(),key=lambdadev:dev.index)# log configurationprint("source project: %s.project"%pathproject)print("export from %s"%ecatmaster_name)fordevindevs:print(" %02u%s"%(dev.index,dev.get_name()))# export devicesexreporter=exrep()devxml=[];fordevindevs:devxml.append(pathscript+dev.get_name()+".xml")proj.export_xml(exreporter,[dev],devxml[-1],recursive=True)# define all variants of project by rotation of deviceschain=range(1,len(devs)+1)per=[]forninchain:per.append(chain)chain=chain[1:]+chain[:1]# create project variantsimreporter=imrep()forchaininper:# first clear devices fordevindevs:dev.remove()# import devices in order of chainforninchain:ecatmaster.import_xml(imreporter,devxml[n-1])# save variantdest_fullname=pathproject+"_var%02u.project"%chain[0]proj.save_as(dest_fullname)# log configuration print("import to %s"%ecatmaster_name)devs=sorted(ecatmaster.get_children(),key=lambdadev:dev.index)fordevindevs:print(" %02u%s"%(dev.index,dev.get_name()))print("saved variant: %s"%chain)print("destination project: %s"%dest_fullname)exceptException,e:print(e)sys.stdout.close()proj.close()
\#system.exit()
Schön, dass es jetzt auch mit Python möglich CoDeSys-Projekte zu manipulieren.
Für unseren Systemtest, bei dem eine CoDeSys-Steuerung über EtherCAT mit den Feldgeräten kommuniziert
müssen wir verschiedene Geräteszenarien durchspielen, bei denen nur die Reihenfolge der Geräte unter dem EtherCAT-Master verändert wird.
Über
bekommt man alle Feldgeräte gelistet.
Nachdem ich mir das Ergebnis vom print() angeschaut habe, viel mir jedoch auf, das die Objekte nicht in der Reihenfolge gelistet werden, wie sie unter dem EtherCAT_Master angeordnet waren, sondern in der zeitlichen Reihenfolge des Einfügens also mit aufsteigender Object-ID . (Wenn man die Gerätereihenfolge mit der Maus verändert, ändert dies z.B. nichts an der Ausgabe-Reihenfolge des prints)
Meine Frage lautet daher: Ist es möglich auch an die Position der Slaves unter dem Master heranzukommen, da dies bei EtherCat auch einen physikalischen Bezug hat.
-> EtherCAT-NodeID = Position+1000
PS: Anbei auch das weitere Vorgehen um Projektvarianten zu erzeugen bei denen alle Geräte unterhalb des Master_Knotens von Projekt zu Projekt ringförmig geshiftet werden -> Script im Anhang
Wenn die Geräte bekannt sind kann man mit Hilfe der XmlExport- und XmlImportfunktion das Projekt so manipulieren, dass die Geräte in anderer Reihenfolge unter dem Master angeordnet werden.
Die referenzierte Variablen vom I/O Abbild bleiben dabei erhalten, so das sich nur die Reihenfolge, nicht aber die Funktion der Geräte ändert.
Hinweis, die im Skript implementierten Reportklassen müssen sein, damit die Import und Exportmethoden genutzt werden können.
Related
Talk.ru: 1
Originally created by: M.Schaber
Hallo, Tino,
http://forum.3s-software.com/viewtopic.php?p=11487#p11487.
Die Gerätereihenfolge kannst Du vielleicht rauskriegen, in dem Du nach dem index-Property sortierst. Das müsste in diesen Fällen die Reihenfolge angeben.
Wunderbar, danke für das Beispielskript. Vielleicht würde in diesem Falle auch die move()-Methode weiterhelfen, der kannst Du auch einen Index angeben.
Dafür haben wir schon eine Verbesserung in der Schublade, allerdings gibt es noch kein geplantes Release-Datum.
Der Hinweis mit dem property index hat prima geklappt.
ebenso der mit dem code-Format (Anfängerfehler)
Anbei die Ergänzung für die Sortierung und deren Ausgabe
Der Hinweis mit der move-Methode führte jedoch nicht zum Ziel.
Ich bekam die Fehlermeldung, dass man dort nicht hinschieben könne.
weder mit:
deshalb funktioniert mein Skript weiter über xml-export und xml-import
Related
Talk.ru: 1