Probleme mit cross.ocx

  • Hallo,


    Erst einmal vielen Dank für dieses Forum. Ich habe schon viele wertvolle Informationen gefunden und an meine französischen Kollegen und Schüler weitergegeben...


    Nun meine Frage. An der Schule (IMERIR/Perpignan), wo bin ich Bildverarbeitungs-Lehrer bin, besitzen wir einen KR6/2 Für ein Projekt, möchten wir die globalen Variabeln mit Hilfe derSchnittstelle cross.ocx auslesen. Wir programmieren mit dem C++Builder.


    Der Anfang war einfach, wir haben das Modul importiert und ohne großen Aufwand die folgende Funktion geschrieben:


    void __fastcall TForm1::BStartClick(TObject *Sender){
    short nr;
    TOLEBOOL ob;
    nr=Cross1->Start();
    ob=Cross1->StartResult(nr);
    Label1->Caption= (int)ob;
    }


    Das Roboter-Programm startet, allerdings gibt die Funktion StartResult den Wert "false" zurück.


    Ebenso funktionieren KRCOk, Stop, DisableStart, etc.


    Die Funktionen ShowVar oder DPShowVar (um die es uns ja eigentlich geht) bekommen wir jedoch nicht ans Laufen. Auch hier scheint es an der Rückgabe des Resultats zu liegen.


    nr=Cross1->ShowVar(WideString("nom"),WideString(""));
    ob=Cross1->ShowVarResult(nr,&res);


    Was machen wir falsch?


    Vielen Dank im Voraus,
    Tilman

  • Schritt für Schritt zum Roboterprofi!
  • Hallo,


    Leider bin ich mit meinem Problem "cross.ocx" nicht weiter gekommen :bawling:. Und scheinbar gibt es auch unter Euch niemanden, der diese Schnittstelle bereits benutzt hat :?: (ich habe zu mindestens nichts brauchbares im Forum und im Web gefunden...).


    Deshalb habe ich das Problem mit "crosscomm.exe" gelöst. Die Anbindung zwischen OfficeLite V4.1.7 und dem C++Builder war relativ einfach, inzwischen lese ich die Position $AXIS_ACT des Roboters korrekt aus :).


    Mein nächstes Ziel wird Ansteuerung eines virtuellen Roboterarms sein (VRML + JavaScript). Da gibt es viel Material :supi:.


    Vielen Dank,
    Tilman

  • ??? Problem CROSS.OCX:


    Meinst Du mit dem Roboterprogramm starten die BedienOberFlaeche BOF oder ein SRC-File im Robotersystem.


    Ich benutze die Interop.WBC_KrcLib.dll bei KSS V 5.x um Variablen zu lesen / schreiben oder andere Cross Aktionen auszufüren.


    Mit der OCX hab ich noch nix gemacht.
    würde mich schon interessieren was Du mit der so anstellst, gerade bei den älteren KUKA-Versionen, wo's die WBC no net gibt.


    Gruß
    Robotnik

  • Hallo Robotnik,


    Ich hatte irgendwo im Forum gelesen, daß man mit der cross.ocx auch Variablen lesen und setzen kann. Ich habe deswegen mal in diese Schnittstelle hineingeschaut, und die Anzahl und die Namen der Funktion schienen mir sehr verheißungsvoll zu sein.


    In der Tat, es wahr sehr einfach aus einem C++-Programm heraus zum Beispiel ein Programm zu starten (Start) oder zu stoppen (Stop). Oder auch das Starten zu blockieren (DisableStart).


    Aber mit der Rückgabe der Variablen hapert es bei mir (ShowVar). Da mache ich was falsch.


    Und es fehlt halt die Dokumentation! Deswegen hatte ich gehofft, einer von Euch hätte da mehr Erfahrung als ich.


    Gruß aus Frankreich,
    Tilman

  • Bei Benutzung der WBC...dll unter .NET deklarierst du folgendes:


    VB.NET
    Verweis auf WBC....dll erstellen


    Und der Programmcode ist dann,...:
    Class blablubb...


    Dim kukaservicefactory As KrcServiceFactory
    Dim ksyncvar As ICKSyncVar2
    Dim kinitialized As Boolean


    Private Sub Connect()


    kukaservicefactory = New KrcServiceFactory()


    Try....


    ksyncvar = kukaservicefactory.GetService("WBC_KrcLib.SyncVar", "PrimaryInterOpTest1")
    bConnected= True


    Catch Exeption....



    ksyncvar.ShowVar("$AXIS_ACT.A1")
    ksyncvar.SetVar("gnTemp", "1")


    End Sub


    So funzt's bei mir perfekt.

  • Hallo Robotnik,


    Vielen Dank für Dein Beispiel :danke:. Aber wir sind noch auf dem Stand V 4.1.4 SP02 für den Roboter und V4.1.7_ Build 8 für OfficeLite...


    Macht nichts, CrossComExe. funktioniert ja inzwischen bei uns (Server UDP der Position des Arms).


    A+,
    Tilman

  • Hallo Robotnik,


    die von Dir beschriebene Datei "Interop.WBC_KrcLib.dll", ist das eine importierte Typelibrary aus der "Cross3Krc.CIE"? Ich kenne mich mit .Net nicht so aus. Versuche zur Zeit über com und Delphi die Schnittstelle zu nutzen. Komm aber nicht wirklich weiter.


    Für jeden Tip oder Doko (muß ein riesen Geheimniss sein) währe ich dankbar.


    viel Grüße
    Aiko07

  • Hallo,



    <<Was machen wir falsch?>>


    Ja, es hat mich schon geärgert, daß ich es nicht geschafft habe, die cross.ocx zu benutzen! Deshalb habe ich es heute morgen noch einmal probiert... und siehe da, ich glaube, meinen Fehler gefunden zu haben: wir waren zu schnell!!!


    Hier ist eine Version, die funktioniert:


    //Job starten
    job=Cross->ShowVar(WideString("$AXIS_ACT"),WideString(""));


    //auf Antwort warten
    l1=GetTickCount();
    do{
    Sleep(10);
    b1=Cross->ShowVarResult(job,&res);
    }while(!(bool)b1 && GetTickCount()-l1<3000);


    ShowVar gibt die Job Nummer zurück. Das heißt allerdings noch nicht, daß die Antwort schon bereit steht. Deshalb eine kleine Schleife, in der bis zu einem Timeout von 3000ms auf die Antwort gewartet wird.


    Kuka könnte wahrscheinlich eine technisch versiertere Antwort geben, könnte :->



    A+,
    Tilman



    PS: Inzwischen (02/2011) wissen wir, daß es auch noch eine elegantere Lösung gibt. Die heißt "DcrossEvents". Das Prinzip: die Crossschnittstelle sendet an die Anwendung nach Ausführung eines Befehls eine "Message", mit Job-Nummer und Error-Code.

    Einmal editiert, zuletzt von Tilman ()

  • Guten Morgen,
    Ich habe ein fehlen in mein programm.
    Ich habe ein C++ programme dass lauft uber Krc2 und soll eine variabel lesen (Zum Beispiel $AXIS_ACT.A1).
    Ich habe den Librerie gelauft aber ich kann nich die Funtione ShowVar("$AXIS_ACT.A1") anrufen. Er kann diese funzione nicht finden in .dll
    Hier ist mein Code..
    Wass mache ich Falsh?


    typedef int (__stdcall *importFunction)(const char *var);


    void Myfunction()
    {
    importFunction _showvar;
    double result;


    HINSTANCE _loadedlibrary = loadLibrary(TEXT("Interop.WBC_KrcLib.dll"));
    if (_loadedlibrary == NULL) {
    printf("ERROR: unable to load DLL\n");
    }


    _showvar = (importFunction)GetProcAddress(_loadedlibrary, "ShowVar");
    if (_showvar == NULL) {
    printf("ERROR: unable to find DLL function\n");
    FreeLibrary(_loadedlibrary);
    }
    result = _showvar("$ACT_AXIS.A1");


    FreeLibrary(_loadedlibrary);
    }


    Komm immer: ERROR: unable to find DLL function

  • Hallo,


    leider kenne ich mich mit Kuka Robotern nicht aus, aber "Interop" klingt für mich irgendwie nach .net.


    Bis du sicher, dass diese DLL normale C-Funktionen exportiert ?


    Falls du mit Visual Studio arbeitest, was zeigt denn ein dumpbin /exports Interop.WBC_KrcLib.dll an ?


    Und zu deinem Programm


    Code
    _showvar = (importFunction)GetProcAddress(_loadedlibrary, "ShowVar");
       if (_showvar == NULL) {
          printf("ERROR: unable to find DLL function\n");
          FreeLibrary(_loadedlibrary);
       }
       result = _showvar("$ACT_AXIS.A1");


    Da gehört ein return hinter das FreeLibrary, sonst rufst du die Funktion auch auf, wenn sie gar nicht gefunden wurde.


    Grüße


    Urmel

  • Wenn du C++/CLI, also die .net Variante von C++ verwendest, sollte das gehen wie in dem VB.net Beispiel oben.
    http://www.roboterforum.de/rob….0.html;msg34899#msg34899
    Nur halt eben mit C++/CLI Syntax.


    Zugriff auf COM geht in C++ auch:
    http://msdn.microsoft.com/en-u…f485848%28v=VS.85%29.aspx


    Wie gesagt ich arbeite nicht mit Kuka, würde die bisherigen Beiträge hier aber mal so zusammenfassen, dass das die beiden möglichen Wege sind.


    Grüße


    Urmel

  • Hallo Ulisse,



    Du hast mir eine private Mitteilung gesendet, um mir dieselbe Frage zu stellen, die Du hier im Forum bereits zweimal gestellt hast. Das hilft nichts! Ich habe nämlich im Augenblick wenig Zeit, um Dir zu antworten. Davon mal abgesehen finde ich es nicht gut, privat anzufragen und zu antworten (es sei denn, es ist wirklich privat).


    Nur kurz:


    Mit der Bibliothek "Interop.WBC_KrcLib.dll" habe ich noch nicht gespielt... was Urmel Dir geschrieben hat, ist jedoch sehr vernünftig. Ich schließe mich da an.


    Ich habe benutzt: CrosscommExe.exe und Cross.ocx, und zwar mit der Version OfficeLite V4.1.7. Das funktioniert nicht nur mit OfficeLite, sondern auch auf dem richtigen Roboter. Allerdings gibt es ab der Version 5 wohl Crosscommexe.exe nicht mehr (scheinbar noch Cross.ocx, demnächst kaufen wir eine Lizenz für unsere Fachhochschule, dann kann ich mehr Auskunft geben).


    Diese beiden Bibliotheken benutzen die COM Technologie (oder auch ActiveX) von Microsoft. Das sind Objekte mit genau definierten Schnittstellen (IUnknown, IDispatch, etc.). Damit brauch man sich jedoch nicht rumärgern, weil moderne Programmierumgebungen das Importieren dieser Bibliotheken erlauben. Das habe ich bei meinem Projekt gemacht, welches Du von meinem Site runterladen kannst. Allerdings kannst Du den Code nur direkt verwenden, wenn Du den C++ Builder >= V5 von Borland besitzt.


    Noch ein kleiner Tipp : wenn Funktionen der API-Windows (wie GetProcAddress) nicht funktionieren, kann man mit GetLastError den Error-Code bekommen und dann mit FormatMessage in Textform anzeigen. Das hilft oft weiter.


    Letzte Anmerkung : ich rate von der Benutzung von Cross.ocx ab, da diese Schnittstelle nicht öffentlich dokumentiert ist (so weit ich weiß).



    Schönen Gruß,
    Tilman

    Einmal editiert, zuletzt von Tilman ()

  • Good Morning, :hilfe:
    I write a little program on VB to interact with my kuka (krc2).
    I can read and set variable very well.
    I'm trying now to call a .src file and to execute it. :wallbash:


    Anyone knows how?


    I use the library Interop.WBC...dll


    Thanks


    Angolero

  • you could start from sps.sub a program with a string.


    DECL CHAR strProgName[40]


    strProgName = "RUN /R1/Main()"


    CWRITE ($CMD,STAT,MODE,strProgName)


    Declare the strProgName global in $config.dat or in public datfile.
    with swrite you could add to "RUN /R1/" your program "prog1" without .src

  • Danke sehr Robotnik :grinser043:
    Ich habe noch eine frage dass kann ich nicht loesen.. leider..!! :bawling:
    Ich habe folgendes:


    Ich habe mit den kode von Robotnik :danke: eine variable geschrieben und gelesen..
    Funktioniert sehr gut..
    Jetzt :hilfe: probiere ich zu starten mit der gleiche metode ein file "moveAxis.src" dass soll die roboter bewegen in eine bestimmte positionen, mit ein PTP befehle.


    Diese file "moveAxis.src" habe ich under R1/ kopiert. Wie soll ich die VB code aendern damit dieser file diesen rufen kann?


    /*
    VB.NET
    Verweis auf WBC....dll erstellen
    Und der Programmcode ist dann,...:
    Class blablubb...
    Dim kukaservicefactory As KrcServiceFactory
    Dim ksyncvar As ICKSyncVar2
    Dim kinitialized As Boolean
    Private Sub Connect()
    kukaservicefactory = New KrcServiceFactory()
    Try....
    ksyncvar = kukaservicefactory.GetService("WBC_KrcLib.SyncVar", "PrimaryInterOpTest1")
    bConnected= True
    Catch Exeption....
    ksyncvar.???????????????
    End Sub
    */


  • soll die roboter bewegen in eine bestimmte positionen, mit ein PTP befehle.


    Hallo Ulisse,


    Ich habe mit dem cross.ocx herumgespielt, um von OfficeLite die Stellung der Achsen zu ermitteln. Eine Anwendung dieser Schnittstelle auf dem richtigen Roboter empfehle ich jedoch nicht, da sie nicht dokumentiert ist.


    Ich halte es sogar für gefährlich, wenn Basic-Programme die Bewegungen des Roboters steuern. Dafür gibt es KRL und präzise, von Kuka definierte Kommunikations-Schnittstellen.



    Tilman

    Einmal editiert, zuletzt von Tilman ()

  • Tilman
    Gebe Dir grundsätzlich recht.


    Aber der Dirloader von KUKA basiert auf genau dieser Schnittstelle.
    Die Schnittstelle ist sicher nix für Anfänger, wer sich aber damit auskennt, macht genauso sichere Anwendungen, wie sie aus dem Hause KUKA kommen.


    Ich muss gerade 1500 € hinlegen für das tolle Encyptiontool.


    Nur weil ich den Kunden nicht mehr alle meine Funktionen frei überlassen möchte.
    Und wie sich herausstellt, gibt es die Software ich glaub 1.1 nur für KSS-Version 5.3, 5.4, 5.5 und 5.6.


    Was ist denn mit den Kunden die nur 5.2 oder älter haben, oder den KR5sixx mit 7.0


    Eine absolute frechheit.
    Das Geld geb ich nur einmal aus, und ab sofort werde ich über Profibus, Devnet, Profinet mit den KUKA-Robotern sprechen.
    Der Code ist dann auf ner kleinen Kontrollerkarte für 300 euronen, mit Peripherie und Gehäuse, Netzteil und Co kostet das das selbe und funzt dann mit passender Doku für alle Robbis.


    Tschüss KUKA. Solln se doch sterben.

Erstelle ein Benutzerkonto oder melde dich an um zu kommentieren

Du musst ein Benutzerkonto haben um einen Kommentar hinterlassen zu können

Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Geht einfach!
Neues Benutzerkonto erstellen
Anmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden