Autor Beitrag
glubb
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 28.11.13 14:43 
Hey,

ich stehe vor einem Verständnissproblem zur Programmierung einer Assembly.
Uns liegt im Unternehmen eine Software zur Offline-Programmierung von Industrierobotern vor.
Dieses Programm verfügt über ein API. Ziel meiner Bemühungen soll nun sein, die Positionen, zu denen sich der Roboter bewegt von außen (per txt-File) beeinflussen zu können. Einer Position (genannt Pose) liegen dabei immer eine Anzahl von Gelenkwinkel zu Grunde. Also Beispielsweise: ein 6-Achs-Roboter hat 6 Freiheitsgrade und damit 6 Gelenke, deren Winkel zueinander bestimmt werden müssen.
Laut Software Development Kit gibt es folgende Relevante Klassen für mich:
Zitat:

TxPose > PoseData Property - Gets or sets the pose data of the pose. - Und der dazu angegebene C#-Code: public TxPoseData PoseData {get; set;}
TxPoseData > JointValues Property - Describes the pose of a device. - Gets or sets the joint values of the pose data. - public ArrayList JointValues {get; set;}


Den Button an sich habe ich bereits programmiert und in die Software integriert. Nur die Befehlslogik bekomme ich nicht gebacken.. Mangels Verständnis.
Mein Ziel wäre es, erst mal die bestehenden Posen auszulesen. Das würde mich schon etwas weiterbringen. Bei //The command logic seht ihr, was ich schon probiert habe.. nur ich bekomme es überhaupt nicht auf die Reihe, die bestehenden Posen auszulesen. Ich checke auch ehrlich gesagt nicht, was dieses {get; set;} sein soll. Den einfachen String in die txt zu schreiben war kein Ding.. aber diese Posen.l.. :?
Ich bin mir bewusst, dass die Fragestellung ziemlich schwammig ist. Aber leider bin ich auch nicht in der Lage präziser zu formulieren mangels C#-Wissen.
Aber vielleicht kann mir hier ja einer weiterhelfen.

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
using Tecnomatix.Engineering;
using Tecnomatix.Engineering.Ui;
using System.Resources;
using System.Collections;

namespace EngineeringCommands
{
      public class MyCommand: TxButtonCommand
      {
            public MyCommand()
            {
            }
            public override void Execute(System.Object cmdParams)
            {
                // The command logic

                //string Pose = TxPoseData CurrentPose {get}
                //TxPoseData GetRobotPose(ITxRoboticLocationOperation 1, TxRobotConfigurationData config);
                //TxPose GetPoseByName(string name = "3 nach 4");
                public TxPoseData PoseData {get; set;}


                // Compose a string that consists of three lines.
                string lines = "First line.\r\nSecond line.\r\nThird line.";
               
          
                // Write the string to a file.
                System.IO.StreamWriter file = new System.IO.StreamWriter("C:\\users\\***\\Desktop\\Posen.txt");
                file.WriteLine(lines);
                file.Close();
                  
            }
            public override string Name
            {
                  get
                  {
                        ResourceManager resourceMgr = new ResourceManager("Test_DLL.StringTable"this.GetType().Assembly);
                        return resourceMgr.GetString("CMD_NAME");
                  }
            }
            public override string Category
            {
                  get
                  {
                        ResourceManager resourceMgr = new ResourceManager("Test_DLL.StringTable"this.GetType().Assembly);
                        return resourceMgr.GetString("CMD_CATEGORY");
                  }
            }
      }
}


ich muss leider auch zugeben, dass ich C#-technisch ein ziemlicher DAU bin.
Ich war der Meinung, dasss ich mit meinen C & VB-Kenntnissen einigermaßen gut mit C# zurecht komme. Leider ist dem nicht so und ich stelle mich teilweise recht dumm an.
Ich bin über jede Hilfe dankbar :)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 28.11.13 14:56 
Um dein problem zu verstehen fehlt hier Hintergrund. Hat deine API keine Doku?

ausblenden C#-Quelltext
1:
public TxPoseData PoseData {get; set;}					


das ist aber defintiv falsch. In einer Methode eine Property erzeugen macht keine Sinn. Was möchtest du an dieser Stelle tun?
Ein TxPoseData Objekt erzeugen um es zu benutzen? Die API Doku sollte hergeben wie man die bekommt. Im simpelsten Fall tuts vielleicht schon ein new TxPoseData() mit oder ohne Parametern?

Edit: Ok ich habe deine Frage nochmal mit mehr Verstand gelesen ;)

Die von dir zitierte Hilfe zeigt nicht wie du das aufrufst sondern wie die zu benutzenden Properties definiert sind. Daraus kann man dann schließen was die Property für einen Typen erwartet und ob man die lesen und/oder schreiben kann. Die Erklarüng was Properties sind spar ich mir gerade das kann die Hilfe besser.

Wenn du also ein Objekt vom Typ TxPose hättest könntest du an die JointValues Daten kommen via

ausblenden C#-Quelltext
1:
ArrayList jointValues = MeineLiebeTxPoseInstanz.PoseData.JointValues;					


Du solltest also im Moment über die Doku rausfinden wie du an Posen (TxPose Objekte) kommst.

Moderiert von user profile iconTh69: Quote- durch C#-Tags ersetzt
glubb Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 03.12.13 14:46 
Hey,

vielen Dank schon mal für deine Hilfe. Und vor allem auch vielen Dank dafür, dass du dich mit meiner schwer verständlichen Fehlerbeschreibung rumschlägst.

Meine API hat eine Doku, die ich allerdings auch nur grob verstehe.
Bezüglich TxPose hab ich mal nen Screenshot von der Übersicht gemacht, in dem alle Methods, Properties & Events zu sehen sind.
Evtl. hilft das ja weiter.

Ich war der Meinung, dass mir die Property "PoseData" weiterhilft. Darum habe ich diese auch im ersten Thread zitiert und versuch mit diesem "get" & "set" zu arbeiten.


"GetAttribute" könnte doch noch ganz interessant sein oder?
Dazu gibt die Doku folgendes her:
Zitat:
See ITxObject.GetAttribute of the ITxObject interface.
ausblenden C#-Quelltext
1:
2:
3:
public TxAttribute GetAttribute( 
   string attributeName
)


Unter ITxObject.getAttribute:
Zitat:
Gets an attribute by its name.
ITxObject Interface represents all model objects.
ausblenden C#-Quelltext
1:
2:
3:
virtual TxAttribute GetAttribute( 
   string attributeName
)


Nur weiß ich leider wieder nicht wie ich damit arbeiten soll :/
Vor allem weil ich die Namen der Objekte ja gar nicht weiß.
Diese Posen wurden von mir per Hand in der Software programmiert und tragen Namen wie beispielsweise "1_nach_2"
Wie aber spreche ich diese in C# an? Wenn ich´s mit nachfolgendem Code probiere kann die DLL nicht erstellt werden, da 1_nach_2 im aktuellen Kontext nicht vorhanden ist.
ausblenden C#-Quelltext
1:
ArrayList jointValues = 1_nach_2.PoseData.JointValues;					
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4799
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 03.12.13 15:25 
Hallo glubb :welcome:

dir scheint es noch ein wenig am Verständnis von Objektorientierte Programmierung (OOP) zu mangeln.

Aufgrund deines Code-Beispiels im ersten Beitrag gehe ich mal davon aus, daß du innerhalb der von TxButton abgeleiteten Klasse vollen Zugriff auf deren Schnittstelle hast (und die Methoden in den Kommentaren scheinen mir auch die richtigen zu sein).

Tipp: Tippe einfach mal innerhalb deiner obigen Execute-Methode
ausblenden C#-Quelltext
1:
this.					

im VS Editor ein -> jetzt müßte dir Intellisense eine Liste der zur Verfügung stehenden Methoden und Eigenschaften anbieten - darunter z.B. auch "GetPoseByName".
Wenn ja, dann probiere einfach mal
ausblenden C#-Quelltext
1:
2:
TxPose pose = this.GetPoseByName("1_nach_2"// oder wie auch immer dein benanntes Pose-Objekt heißt
// P.S. das "this." kannst du dann auch weglassen

So und jetzt hast du das TxPose-Objekt und kannst wiederum dessen Methoden und Eigenschaften aufrufen:
ausblenden C#-Quelltext
1:
2:
3:
4:
if (pose != null)
{
   TxPoseData poseData = pose.PoseData; // <- hier rufst du jetzt die Eigenschaft auf
}

Und jetzt als Übungsaufgabe noch: Zugriff auf die JointValues...

Ich kenne die obige SDK nicht, habe aber schon genug andere Dokumentation gelesen. Daher gehe ich davon aus, daß es grundlegend so (oder ähnlich) anzusprechen ist.
Wenn nicht, dann finde heraus, in welcher Klasse die Methoden GetPoseByName, GetRobotPose etc. deklariert sind. Und wie Ralf Jansen schon geschrieben hat, dann mußt du anhand der Doku herausfinden, wie du an ein Objekt (Instanz) dieser Klasse herankommst (denn so funktioniert OOP ;-)).

P.S. Den Screenshot solltest du auch deinem Beitrag anhängen...
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 03.12.13 15:41 
Zitat:
TxPose pose = this.GetPoseByName("1_nach_2")

Hast du neuerdings Fähigkeiten in Kristallomantie :lol:
So sehr ich dem Fragesteller wünsche das es so einfach ist bezweifle ich das ein Typ der TxButtonCommand heißt solche Informationen liefert. Bei etwas das Posen kennt würde ich ein zentrales Objekt erwarten das ein irgendwie geartetes Model darstellt.

Können wir hier nicht einfach mal einen Blick auf die Doku werfen um uns ein Bild zu machen? Oder ist das was geheimes? Wenn ich Google mit Begriffen aus deinem Code füttere die mich irgendwohin führen sollten wo es eine Doku gibt komme ich maximal hier aus :(
glubb Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mi 04.12.13 16:01 
Hey,

vielen Dank für eure Hilfe.
Ihr habt auch Recht damit, dass ich bezüglich objektorientierter Programmierung noch kaum Erfahrungen gemacht habe.
Ich kenne zwar das Grundprinzip, verfalle aber immer wieder in die klassische Denkweise...

Ich habe einen Auszug aus der Dokumentation als pdf angehängt.
Die gesamte Doku kann ich aus lizenzrechtlichen Gründen wohl nicht hier online stellen.

Es handelt sich um alle Infos zur Klasse TxPose.
Auf Seite 2 des pdf´s findet ihr die, im letzten Post beschriebene Übersicht.

Vielleicht könnt ihr damit etwas anfangen und bekommt eine etwas genauere Vorstellung meines Problems.
Und vielen Dank nochmal. Echt spitzenmäßig...
Diese Software macht mich fertig.
Einloggen, um Attachments anzusehen!
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 04.12.13 16:20 
Also mir hilft das nicht weiter um dir zu helfen :( Die Frage ist ja wie kommt man an die TxPose Instanzen und nicht wie ein TxPose funktioniert.

TxPose hat eine Device Property die eventuell weiterhilft wenn die von einem TxIrgendwas Typ ist und das zentrale Objekt sein könnte was ich mir erhoffte. Dann solltest du dir mal dessen Doku ansehen.
Falls das Ding einfach ein DeviceContext aus System.Drawing enthält ist es allerdings auch nur ne Sackgasse und kannst das ignorieren.


PS. Wann merkt Siemens eigentlich das diese Heimlichtuherei bei Dokumenation, Bugtracking, Hilfe etc. nicht nach Enterprise aussieht sondern einfach nur nach geplanter Consulting Abzocke?