Siemens 840D

  • Ist hier auch jemand unterwegs der Erfahrung mit der Siemens 840D NC Programmierung hat?


    Es müsste doch möglich sein eine Stringvariable als Zeiger zu benutzen oder? wenn man den String mit einer boolschen GUD Variable füttern würde und dann den Wert mit einer IF anweisung abfragen. Ja ich weis, ihr werdet gleich sagen wieso erst String dann bool und nicht gleich direkt die bool. Die boolsche Variable wird aus verschiedenen Parametern zusammen gesetzt Systemvariablen und Zählerwerten etc.


    Die Stringvariable macht auch alles so wie ich es will, wenn ich diese aber jetzt auf false oder True abfragen will sagt der String das sie auf 1 stehen würde, was aber nicht so ist. Ich habe das gefühl das meine Abfrage nur den String auf Inhalt oder nicht Inhalt prüft.


    Hat jemand schon mal sowas gemacht, das sollte doch funktionieren, oder?!?!??!



    Gruß
    Wasdel

  • ANZEIGE
  • Hi!


    Ich bin hier zufällig über Google hier reingestolpert... Erzähl' doch mal, was du vor hast, vielleicht geht das auch irgendwie einfacher. Bei Siemens gibt's immer mehrere Wege, die zum Ziel führen ;)


    IF geht, klar.
    IF R43<R45 GOTOF MARKE
    springt VORWÄRTS auf die Sprungmarke "Marke", die mit z.B.
    MARKE:
    definiert ist, wenn R43 kleiner als R45 ist. Prinzipiell müsste das auch mit Strings funktionieren, probiert habe ich es noch nie. Geht nicht auch ein Weg um den String herum? Boolsch oder Zahlen sind ein bisschen einfacher.
    "0" hat übrigens eine Sonderstellung im String und verkürzt diesen. Nicht, dass dir das dazwischen funkt.


    Hier noch ein Link zur DocOnWeb:
    https://www.automation.siemens.com/doconweb wenn ich das richtig im Kopf habe. Programmierhandbuch Arbeitsvorbereitung, Seite 1-30 (PDF Seite 44ff).


    Sollten wir das hier nicht hinkriegen: http://www.sinupedia.de
    Irgendwann die Tage wird wohl auch der Server wieder laufen, der ist irgendwie vorm Wochenende abgeschmiert.


    Hoffe, ich konnte helfen, steht ja auch schon ein paar Tage hier drin...


    Gruß, Tobi


    Edit: Hab' was gefunden...
    sollte funzen mit
    DEF STRING[6] STRG = "Ja" ;String mit Namen STRG und einer Länge von 6 Zeichen definieren, vorbelegen, dann statt "Ja" GUD oder was auch immer
    IF STRG == "Ja" GOTOF WEITER ;Wenn String == "Ja", dann weiter, sonst
    R47= 0 ;0 setzen
    GOTOF ENDE ;springe zum Ende, NICHT 1 schreiben
    WEITER: R47=1 ;wenn String == "Ja", dann kommen wir hier raus und schreiben 1
    ENDE: M17 :Ende Unterprogramm


    Wenn der String "Ja" heißt, kommt 1 in R47 (genauso könnte man irgendwas anderes schreiben, z.B. $A_IN), sonst 0.
    Leider hab' ich nix zum Testen da, aber so könnte es gehen. Vertipper habe ich aber oft, besonders ohne Kaffee.
    CASE OF geht übrigens auch.

    Einmal editiert, zuletzt von Tobias Adam ()

  • Servus ich hat schon geglaubt hier meldet sich keiner mehr hatte es schon fast abgehackt!


    Hab jetzt mitlerweile eine Möglichkeit gefunden wie ich das machen könnte. Aber die Lösung macht mich nicht so glücklich denn ich müste meine GUD definitionen in 2 bzw. 3D Arrays ändern, und die werden leider schon in vielen anderen Ansteuerungen verwendet deswegen will ich das eigentlich nicht.


    Bespiel:

    Code
    GUDXY
    DEF NCK BOOL TEST1_ON_OFF[10]       <-die 1 steht für den Kanal
    DEF NCK BOOL TEST2_ON_OFF[10]       <-die 2 steht für den Kanal
    DEF NCK BOOL TEST3_ON_OFF[10]       <-die 3 steht für den Kanal


    Programmbeispiel 1:




    Programmbeispiel 2:




    Meine Vermutung ist, das der String in meiner Abfrage nur auf Inhalt oder nicht Inhalt geprüft wird und da ja immer was drin ist, ist das VKE=1! Ich weis aber auch keine andere Syntax möglickeit mehr habe schon einiges versucht. Die Sache mit dem 2D bzw. 3D Arry funktioniert aber das will ich eigentlich nicht machen!


    Beispiel mit 2D Arry:

    Code
    GUDXY
    DEF NCK BOOL TEST_ON_OFF[3,10]



    Programmbeispiel 2:


  • Hallo Wasdel


    Du kannst deine GUD-Variablen doch einfach kanalbezogen definieren, also statt


    Code
    DEF NCK BOOL TEST1_ON_OFF[10]       <-die 1 steht für den Kanal


    dann


    Code
    DEF CHAN BOOL TEST_ON_OFF[10]       <-kanalindex nicht mehr notwendig


    Wenn in der Steuerung mehrere Kanäle definiert sind(MD 10010), dann wird für jeden Kanal eine getrennte Instanz Deiner Variable angelegt.
    Über den Bedienbereich 'Parameter' kannst Du Dir die aktuellen Werte jederzeit für jeden Kanal anzeigen lassen (kanalumschalttaste).


    Dein Programmcode sieht dann so aus:


    Code
    IF TEST_ON_OFF[ZAHLER-200]==TRUE
    
    
    Machwas
    
    
    ENDIF


    Je nachdem, in welchem Kanal der Code läuft, sorgt die NC automatisch dafür, dass die dem Kanal zugeordnete Instanz deines Feldes verwendet wird.


    Gruß Hinky

  • Ja das stimmt schon, aber mach das mal wenn du die Vorgabe hast an den GUD definitionen nichts zu ändern, da sonst noch viel mähr zu ändern währe aus die GUD's .


    Hast du noch ne ander Möglichkeit im Sinn?


    Gruß
    Wasdel

  • Hallo Sebbi (Oh, neuer Name ???),
    es gibt die Funktion EXECSTRING (allerdings erst ab NCU-Firmware 6.4). Damit ginge es wie folgt:



    Gruß Hinky

  • Ok das werde ich mal versuchen! Was meinst du mit NCU-Firmaware? Die Sytemsoftware vom Flash kärtchen. da habe ich 7.04. damit wird es wohl funktinieren! oder?


    Gruß
    Sebbi

  • Man lernt nie aus... So tief habe ich mich damit noch nie befasst.


    Moment- die Variable "Zeiger" ist ein String, enthält aber eine Zahl, richtig?


    Mit EXECSTRING könntest vielleicht deinen String, in der die Zahl steht, in ein INT umwandeln.
    DEF STRING ZEIGER
    DEF INT ZEIGER_INT
    EXECSTRING(" ZEIGER_INT="<<ZEIGER)
    Könnte funktionieren, aber ich muss das immer ausprobieren ;)
    Die Idee dahinter ist auf jeden Fall, die Zeile
    ZEIGER_INT=(Inhalt von String Zeiger) also z.B.
    ZEIGER_INT=203
    zur Ausführung zu bringen.
    Dann könntest du mit der neuen Variable ZEIGER_INT einfach mit IF, CASE etc. weiterarbeiten.


    Vielleicht bin ich aber auch ganz auf dem falschen Dampfer. Schließlich wusste ich bis vor 15 Minuten noch nix von EXECSTRING :oops:


    Gruß, Tobias

  • Ich habe es zwar immer noch nicht ausprobiert, aber wie Tobias Adam es hier verfasst hat würde ich das Ziel nicht verstehen oder wenn dann falsch. Also nochmal das Ziel.


    Die Variable Zeiger vom Typ String soll auf die Variable zeigen vom Typ Bool .


    Code
    Stringvar füttern
    DEF STRING[30] ZEIGER
    STOPRE
    ZEIGER="_TEST"<<$P_CHANNO<<"_OFF_ON["<<ZAHLER-200<<"]"



    Durch die IF Abfrage über den Zeiger soll parktisch indirekt der Inhalt (bzw. Status,Wert) der bollschen Variable ermittelt werden.


    Code
    IF ZEIGER==TRUE
    
    
    Machwas
    
    
    ENDIF
    STOPRE




    Ich bin mir inzwischen nicht mehr ganz sicher aber ich glaub ich hatte das mit EXECSTRING schon versucht, aber ich probiere es auf alle fälle noch einmal zur sicherheit, weis aber nicht wann ich dazu kommen werden.

  • Moin


    Also das mit dem Execstring funktioniert nicht, laut Doku ist das für ein Programmaufruf gedacht über einen String gadacht!


    Dieses Sinupedia http://www.sinupedia.de würde mich ja auch mal interresieren aber Seit dem Adam dies hier geschrieben hat habe ich es schon mehrfach versucht aber der ist wohl nicht mehr online oder hat der ne neue Adresse ich war da noch nie.


    Gruß
    Sebbi

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