Autor
|
Thema: Bauteil nach X-Wert suchen (1128 mal gelesen)
|
Daudi2010 Mitglied
Beiträge: 52 Registriert: 16.05.2014 E3.Series 2014
|
erstellt am: 11. Nov. 2014 11:45 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich habe ein Bauteil, von dem ich die Position habe. Nun ist dies nicht direkt an den Pin angeschlossen und so kann ich den PIn nicht über getconnectedPinId finden. Da ich aber den X-wert habe und der Pin auch den gleichen X-wert hat würde ich gerne den Pin so suchen. Ist dies möglich und wenn ja kann mir jemand erklären wie man da am besten vorgeht? Vielen Dank
David Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
K0NFUZIUS Moderator
Beiträge: 258 Registriert: 06.02.2006
|
erstellt am: 11. Nov. 2014 13:27 <-- editieren / zitieren --> Unities abgeben: Nur für Daudi2010
Hallo David, ich bin jetzt nicht sicher ob ich Dich richtig verstanden habe. meine Idee wäre:
Code:
symcnt = sht.GetSymbolIds(symids) For i = 1 to symcnt sym.Setid symids(i) pinCnt = sym.GetPinIds( pinIds ) For j = 1 to pinCnt pin.SetNodeId pinIds (j) pin.GetSchemaLocation x,y,grid ' jetzt hast Du von allen Anschlusspunkten x,y und musst eine Zuordnung finden Next Next
[Diese Nachricht wurde von K0NFUZIUS am 11. Nov. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Daudi2010 Mitglied
Beiträge: 52 Registriert: 16.05.2014 E3.Series 2014
|
erstellt am: 11. Nov. 2014 13:47 <-- editieren / zitieren --> Unities abgeben:
Also ich versuche es nochmal zu erklären: Mit: Sym.GetSchemaLocation strSymX, strSymY, strSymGrid hab ich nun von einem Symbol die Position. Das Symbol hängt zwar an einem Pin aber das nicht elektrisch. Also das heißt die Verbindung ist nicht wirklich da. Nun würde ich aber trotzdem gerne auf den Pin kommen und dieser hat ja den gleichen X-Wert aber einen anderen Y-Wert. Ich wollte den Pin nun mit Hilfe des X-Wertes von dem Symbol suchen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
K0NFUZIUS Moderator
Beiträge: 258 Registriert: 06.02.2006
|
erstellt am: 11. Nov. 2014 14:20 <-- editieren / zitieren --> Unities abgeben: Nur für Daudi2010
Da die SchemaLocation des Symbols nicht gleich der SchemaLocation der Anschlusspunkte entsprechen muss würde ich es wie von mir vorgeschlagen machen. Wenn der Symbolursprung (sym.SchemaLocation) = pin.SchemaLocation ist dann kannst Du es doch so machen wie ich es gesagt habe. Du holst Dir von Deinem Symbol x,y Dann suchst Du mit meinem Code auf dem Blatt das Symbol welches den gleichen x Wert hat. BTW. Du sagst der Pin ist nicht elektrisch... Du versuchst aber nicht Wasser oder Öl mit Strom zu verbinden Gruß Jörg [Diese Nachricht wurde von K0NFUZIUS am 11. Nov. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Daudi2010 Mitglied
Beiträge: 52 Registriert: 16.05.2014 E3.Series 2014
|
erstellt am: 11. Nov. 2014 15:23 <-- editieren / zitieren --> Unities abgeben:
Ein Versuch wäre es vielleicht wert Leider kann ich kein Bild hochladen ich will den Namen vom Bauteil -I3 mit den X- und Y-Werten in einem Array speichern. Nun muss ich den dazugehörigen Eingang finden hier ED-Flex3. Da -I3 nicht mit Pin 20 verbunden ist kann ich ja nicht über connection gehen. Aber die X-Werte sind ja gleich. Wenn man mein Skript startet öffnet sich ein Tree auf dem kann man den Eingnag auswählen und dann den richtigen Schalter und die dazugehörigen Funktionen. Von dem tree bekomme ich ja dann den ausgwählten Eingang zurück, den muss ich nun mit dem richtigen BAuteil verbinden um dort ein neues Bauteil einsetzen zu können. Meine Idee war nun das über den X-Wert zu machen. Meine neue Idee war nun. 2 Arrays. Eines hat den Namen des Bauteils plus den X- und Y-Wert Zweite hat den Namen des Eingangs plus den X-Wert und Y-Wert des Eingangs. Nun würde ich die Arrays vergleichen und über den X-Wert schauen welches BAuteil zu welchem Eingang gehört und dann den Namen vom Bauteil und Eingang plus den X-wert und Y-Wert vom Bauteil in einem Array speichern so, dass ich später das Bauteil ersetzen kann. Ist dies denn so zu realisieren? Ich hoffe ich habe es verständlich erklärt! Mein Problem ist glaub ich denke manchmal zu kompliziert !
[Diese Nachricht wurde von Daudi2010 am 11. Nov. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
K0NFUZIUS Moderator
Beiträge: 258 Registriert: 06.02.2006
|
erstellt am: 11. Nov. 2014 16:09 <-- editieren / zitieren --> Unities abgeben: Nur für Daudi2010
|
Daudi2010 Mitglied
Beiträge: 52 Registriert: 16.05.2014 E3.Series 2014
|
erstellt am: 11. Nov. 2014 17:14 <-- editieren / zitieren --> Unities abgeben:
|
K0NFUZIUS Moderator
Beiträge: 258 Registriert: 06.02.2006
|
erstellt am: 12. Nov. 2014 12:48 <-- editieren / zitieren --> Unities abgeben: Nur für Daudi2010
Zu Vorschlag 2 Du könntest Dir eine Klasse erzeugen in der Du Dir die Informationen hältst und die in eine Liste packen. Ist halt in vbscript immer ein umständlich :-( hab ich auch noch nie gemacht ... ich hab's mal versucht .. hoffe Du verstehst was ich mit dem Beispiel sagen will. Code:
class Position public m_name public m_x public m_y Public Default Function Init( x, y, name ) m_x = x m_y = y m_name = name Set Init = Me End Function public function GetX() GetX = m_x end function public function GetName() GetName = m_name end function end class dim myList Set myList = CreateObject("System.Collections.ArrayList") Set pos = New Position.init( 1,1, "Blubb") myList.Add pos msgbox myList(0).GetName()
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Daudi2010 Mitglied
Beiträge: 52 Registriert: 16.05.2014 E3.Series 2014
|
erstellt am: 12. Nov. 2014 13:59 <-- editieren / zitieren --> Unities abgeben:
Also so ganz versteh ich das jetzt glaub nicht. Kannst du eventuell bitte in kurzen Sätzen neben die Zeilen schreiben was du genau machst? Ich müsste ja quasi mit einer Funktion die Werte von den Bauteilen holen dann mit der anderen Funktion die Werte von den Eingängen und in einer weiteren Funktion die vergleichen und im array speichern?
Vielen Dank
[Diese Nachricht wurde von Daudi2010 am 12. Nov. 2014 editiert.] [Diese Nachricht wurde von Daudi2010 am 12. Nov. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
K0NFUZIUS Moderator
Beiträge: 258 Registriert: 06.02.2006
|
erstellt am: 12. Nov. 2014 14:47 <-- editieren / zitieren --> Unities abgeben: Nur für Daudi2010
Jetzt weis ich nicht wie weit ich beim Stichwort "class" ausholen muss Ich versuch mal einen Mittelweg: Alles was zw.
Code: class Position
und Code: end class
steht. Ist eine Definition für Objekte. Abstraktes Beispiel: Du möchtest eine Box fertigen in der Du ein bisschen x ein bisschen y und einen Namen rein packen kannst. Zusätzlich soll Dir die Box alle Werte zurück geben können. Wie die Box aussieht und was sie tut definierst Du mit der Klasse (class) Jetzt gehst Du über alle Deine Bauteile ( die in E³ Betriebsmittel heißen ;-) ) und zu jedem Betriebsmittel weist Du ja den Name und eben x,y über die SchemaLocation. Jetzt sagst Du Deiner Maschine die Deine Boxen baut: "Mach mir mal eine Box und stopf gleich für x z.B. 100.2 mm für y 120.7mm und den Namen "MeinBMK" rein. Das macht:
Code: Set pos = New Position.init( 100.2, 120.7, "MeinBMK")
Das Objekt steckst Du in eine Liste:
Code: myList.Add pos
Das machst Du jetzt mit allen Deinen Betriebsmitteln. Sprich Deine Maschine produziert nun pro Eintrag eine Box... Jetzt hast Du eine Liste mit alle Objekten über die Du mit For Each drüber gehen kannst. Jedes Objekt kannst Du dann z.b. nach dem X Wert oder dem Namen fragen:
Code: myList(0).GetName()
Das Ganze machst Du jetzt mit Deinen Eingängen in eine zweite Liste Danach gehst Du über beide Liste und sucht Die jeweils den gleichen X Wert. !Das ist nicht die performanteste Lösung ... aber in vbscript fehlt mir die Erfahrung wie man das besser machen könnte! Gruß Jörg
[Diese Nachricht wurde von K0NFUZIUS am 12. Nov. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Daudi2010 Mitglied
Beiträge: 52 Registriert: 16.05.2014 E3.Series 2014
|
erstellt am: 12. Nov. 2014 16:04 <-- editieren / zitieren --> Unities abgeben:
Habe ich das richtig verstanden dass du mit der Public Default Function Init(x,y,name) über alle Bauteile gehst? was hat das Set Init = Me zu bedeuten? Also mein Code sieht so aus, ich verstehe nun jetzt aber nicht ganz genau was in die Klasse gehört und was nicht: et E3Dev = E3Prj.CreateDeviceObject Set E3att = E3Prj.CreateAttributeObject Set pin = E3prj.CreatePinObject Set blkpin = E3prj.CreatePinObject
Set dicSymbols = CreateObject("Scripting.Dictionary") Set liSymbols = CreateObject("System.Collections.ArrayList") Class Bauteile
Public Bauteil_Name Public Bauteil_X Public Bauteil_Y Public Default Function Init(name,x,y) Bauteil_Name = name Bauteil_X = x Bauteil_Y = y
Set Init = Me
End Function End Class Dim intSymIds()
E3Sht.SetId(E3Prj.GetActiveSheetId) E3Sht.GetSymbolIds(intSymIds) For each intSymId in intSymIds E3Dev.SetId intSymId strDevName = E3Dev.getname If instr(strDevName,"-I") = 1 Then E3Sym.SetID intSymId E3Sym.GetSchemaLocation strSymX, strSymY,""
ArrI = Array(strDevName,strSymX,strSymY) For Each element In ArrI MsgBox element Next End If Next xmldevnam = "-X2" E3dev.Search xmldevnam, "=6029_039_412", "+0200"
pincnt = E3dev.GetPinIds( pinids )
For p = 1 To pincnt
pin.SetId pinids( p ) blkpin.setid pin.getconnectedPinid att = blkpin.GetAttributeValue ("PinFunktion") If InStr (att, "ED") =1 Then pin.GetSchemaLocation strSymX, "","" ArrED = Array(att,strSymX)
For Each element In ArrEd MsgBox element Next End If Next Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
K0NFUZIUS Moderator
Beiträge: 258 Registriert: 06.02.2006
|
erstellt am: 12. Nov. 2014 16:38 <-- editieren / zitieren --> Unities abgeben: Nur für Daudi2010
Code:
For each intSymId in intSymIds E3Dev.SetId intSymId strDevName = E3Dev.getname If instr(strDevName,"-I") = 1 Then E3Sym.SetID intSymId E3Sym.GetSchemaLocation strSymX, strSymY,"" ArrI = Array(strDevName,strSymX,strSymY) For Each element In ArrI MsgBox element Next
Ersetzt Du durch:
Code:
Set ArrI = CreateObject("System.Collections.ArrayList") For each intSymId in intSymIds E3Dev.SetId intSymId strDevName = E3Dev.getname If instr(strDevName,"-I") = 1 Then E3Sym.SetID intSymId E3Sym.GetSchemaLocation strSymX, strSymY,"" Set element = New Position.init( strSymX, strSymY, strDevName) ArrI.Add element ... Next
Jetzt Kannst Du über alle Elemente im Array drüber:
Code:
For Each element in ArrI Msgbox element.GetName() Next
----------------------------------------------------- Das gleiche machst Du mit dem unteren Teil Deiner Funktion und speicherst die Objekte in ein anderes Array.. z.B. Set ArrI2 = CreateObject("System.Collections.ArrayList") -----------------------------------------------------
Zitat: Habe ich das richtig verstanden dass du mit der Public Default Function Init(x,y,name) über alle Bauteile gehst?
Nein Init ist der Konstruktor und hilft dir beim neu erzeugen eines Objektes dies gleich zu initialisieren. Zitat: was hat das Set Init = Me zu bedeuten?
Hab ich kopiert weil ich zum ersten mal eine Klasse in vb Script gemacht hab :-D Zitat: Also mein Code sieht so aus, ich verstehe nun jetzt aber nicht ganz genau was in die Klasse gehört und was nicht:
Die Klasse ist wie gesagt nur die Beschreibung was Du wie speicherst (der Bauplan für Dein Objekt) Anderes abstraktes Beispiel: Die Klasse entspricht dem Bauplan für ein Haus. Mit dem Bauplan kannst Du beliebig viele Häuser bauen ( das sind die Objekte ) Die Variabeln in deinem Bauplan (hier m_x,m_x,m_name) sind "variabel". Sprich Du weisst z.B. nicht welche Hausnummer der Handwerker später anbringen muss. Du erzeugst also ein Objekt Haus mit der "Variablen Hausnummer" mit dem "Wert 5" nach dem Bauplan. Dann erzeugst Du ein Objekt Haus mit der "Variablen Hausnummer" mit dem "Wert 10" nach dem gleichen Bauplan. Puhh jetzt habe ich aber weit ausgeholt
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Daudi2010 Mitglied
Beiträge: 52 Registriert: 16.05.2014 E3.Series 2014
|
erstellt am: 13. Nov. 2014 10:22 <-- editieren / zitieren --> Unities abgeben:
Wow ok vielen Dank ich werde das heute mal probieren. Ich hatte bisher leider noch nicht wirklich was mit Klassen und Funktionen zu tun. Daher vielen Dank für deine ausführliche Erklärung. Ich bekomme bei MsgBox element.getName() im Moment die Meldung "Das Objekt unterstützt diese Eigenschaft oder Methode nicht.: 'element.getname' Was für ein Objekt muss ich da vorher ertellen? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
K0NFUZIUS Moderator
Beiträge: 258 Registriert: 06.02.2006
|
erstellt am: 13. Nov. 2014 12:30 <-- editieren / zitieren --> Unities abgeben: Nur für Daudi2010
Die Funktion musst Du in Deiner Klasse definieren. (siehe mein erstes Beispiel) Code:
Class Bauteile Public Bauteil_Name Public Bauteil_X Public Bauteil_Y Public Default Function Init(name,x,y) Bauteil_Name = name Bauteil_X = x Bauteil_Y = y Set Init = Me End Function public function GetName() GetName = Bauteil_Name End Function End Class
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Daudi2010 Mitglied
Beiträge: 52 Registriert: 16.05.2014 E3.Series 2014
|
erstellt am: 13. Nov. 2014 13:36 <-- editieren / zitieren --> Unities abgeben:
Oh man das habe ich vor lauter schnell machen wieder vergessen! Danke. Aber was mir die ganze Zeit durch den Kopf schwirrt ist es auch möglich die zwei Arrays zu erstellen dann mit einer For-Schleife die zu vergleichen und die benötigten Werte in einem neuen Array zu speichern? also ganz ohne Klasse und Funktionen? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
K0NFUZIUS Moderator
Beiträge: 258 Registriert: 06.02.2006
|
erstellt am: 14. Nov. 2014 10:58 <-- editieren / zitieren --> Unities abgeben: Nur für Daudi2010
Das weiß ich leider nicht Ich weiß nicht wie man da drei Werte speichern könnte ohne die Daten in ein Objekt zu kapseln. In .NET oder C++ wäre das bestimmt anders möglich. Ich bin jetzt leider nicht der vbScript Experte. Ich tu mich da mit den Arrays schon schwer Aber ob Du jetzt das Objekt in das Array packst oder direkt die Werte, sollte doch egal sein... Du Erstellst jetzt ja auch zwei Arrays und kannst diese Vergleichen ... und dann das Objekt in ein drittes Array packen ... also ich seh da mal keinen Unterschied Gruß Jörg
[Diese Nachricht wurde von K0NFUZIUS am 09. Jul. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Daudi2010 Mitglied
Beiträge: 52 Registriert: 16.05.2014 E3.Series 2014
|
erstellt am: 18. Nov. 2014 13:01 <-- editieren / zitieren --> Unities abgeben:
So ich habe nun mal etwas probiert nur habe ich grad das Problem mit den ganzen IF und For Anweisungen und daher füllt sich das Array nicht richtig. Ich gleiche hier gleich die X-Werte ab und schreibe dann nur noch den Namen vom Eingang plus den X und Y wert von dem Betriebsmittel ins Array. Entweder aber füllt sich jede Reihe mit dem gleichen oder es füllt sich immer nur die erste Reihe und wird dann überschrieben. Code:
xmldevnam = "-X2" dev.Search xmldevnam, "=6029_039_412", "+0200" E3Sht.SetId(E3Prj.GetActiveSheetId) E3Sht.GetSymbolIds(intSymIds)
pincnt = dev.GetPinIds( pinids ) For p = 1 To pincnt pin.SetId pinids( p ) blkpin.setid pin.getconnectedPinid att = blkpin.GetAttributeValue ("PinFunktion")
For each intSymId in intSymIds E3Dev.SetId intSymId strDevName = E3Dev.getname
If InStr (att, "ED") = 1 Then
pin.GetSchemaLocation strSymXED, strSymYED, strSymGridED If instr(strDevName,"-I") = 1 Then E3Sym.SetID intSymId E3Sym.GetSchemaLocation strSymXI, strSymYI, strSymGridI If strSymXI = strSymXED Then
Dim i,y,x ReDim EingArr(30,5) For i = 0 To UBound(EingArr) EingArr(i,0) = att EingArr(i,1) = strSymXI EingArr(i,2) = strSymYI i = i+1 Next End If End If End If Next Next Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Daudi2010 Mitglied
Beiträge: 52 Registriert: 16.05.2014 E3.Series 2014
|
erstellt am: 19. Nov. 2014 13:39 <-- editieren / zitieren --> Unities abgeben:
So habe nun eine Lösung indem ich einfach die X-Werte gleich vergleiche und dann nur noch das nötige im Array speicher. Code: If strSymXI = strSymX Then AusgArr(x,0) = att AusgArr(x,1) = strSymXI AusgArr(x,2) = strSymYI x = x +1 End If Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |