Step 7 Linearstrecke! Benötige Hilfe...

Tommy843

Level-1
Beiträge
147
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute...Ich habe leider noch nie programmiertechnisch was mit Linearstrecken zu tun gehabt und wollte mal zumindest so ungefähr wissen, wie man das programmiert und in welche Bausteine dass so grob unterteilt wird. Damit ich zumindest mal einen ganz groben Überblick habe. Fest steht, ich hab da mit Rexroth Indradrive zu tun. Kommunikation läuft über Profinet. Ich hab hier schon gelesen das man dafür ne extra Software nehmen kann/muss und man zumindest bisschen was über die GSD Datei macht. Indraworks oder so? Fest steht auch, das die Bewegung auf jeden Fall dynamisch werden soll, damit wir mit der Taktzeit hinkommen. Hat oder weiß jemand, wo ich so ne grobe Vorgehensweise herbekomme? Was ich da für Bausteine benötige und vor allem was da drin stehen muss? Wie außer den ganzen Meldungen(Start,stop, Bereit, Fehler usw....) halt vor allem die Soll- und Istwerte verarbeitet werden müssen? Sorry, aber ich kann in dem Fall wirklich NUR mit Unwissenheit glänzen, und davon hab ich leider ganz viel...:lol: Grüße
 
Also mit Indramat habe ich auch noch nichts gemacht
Wird aber wahrscheinlich auch nicht anders laufen als bei anderen Herstellern.

1. Profinet in der Hardware Config aktivieren
2. GSD bzw GSDML Datei für den FU (Bekommst du vom Hersteller) installieren
3. Sehr wahrscheinlich kannst du vom Hersteller auch FBs für die Kommunikation oder Beispielprogramme runterladen
4. Der Kommunikations FB braucht normalerweise folgendes
+ Anfangsadresse aus der Hardware Config
+ Positionssollwert
+ Geschwindigkeitssollwert
+ Beschleunigungssollwert
+ Steuerwort (einzelne Bits für Reglerfreigabe, Schnellhalt, Starte Positionierung, etc.)
5. Als Antwort bekommst Du das Statuswort
+ Regler bereit
+ Störung
+ Positionierung aktiv
+ Ziel erreicht
+ etc.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sehr schön. Das is zumindest schon mal eine kleine Erleuchtung. Gut okay, dann schau ich mal bei Rexroth nach ob ich da was finde. Ich weiß auch garnicht ob ich mit dieser Software überhaupt arbeiten kann. Die muss man ja garantiert käuflich erwerben so rießig wie die ausschaut...:ROFLMAO:
Kann mir kaum vorstellen das es die bei den Antrieben dazu gibt. Ich hab ja auch so ein Beispielprogram von einer Linearachse. Nur wenn ich schon sehe wie die da z.B. die Realposition berechnet haben, versteh ich fast nur noch "Train Station"...:shock:

So nächste Frage, wie würde denn der FB die Parameter bekommen? Läuft das über Laden/Transferieren aus Bereichszeigern?
 
Faszinierend, das Indraworks kann man wirklich runterladen. Ich hoffe ich hab die richtige Version, es gab da zwei. Nun mal schauen ob ich damit dann weiterkomme! Rückmeldung kommt...
 
Also mit Indramat habe ich auch noch nichts gemacht
Wird aber wahrscheinlich auch nicht anders laufen als bei anderen Herstellern.
4. Der Kommunikations FB braucht normalerweise folgendes
+ Anfangsadresse aus der Hardware Config
+ Positionssollwert
+ Geschwindigkeitssollwert
+ Beschleunigungssollwert
+ Steuerwort (einzelne Bits für Reglerfreigabe, Schnellhalt, Starte Positionierung, etc.)

Soo, in der Indraworks Geschichte komme ich irgendwie nicht weiter. Zumindest fehlt mir da leider momentan noch die Verbindung zum Antrieb.
Das Zeug liegt momentan noch unangeschlossen in der Ecke!
Hatt denn nicht zufällig irgendeiner so einen Kommunikations FB mal als Bespiel für mich? Egal von welcher Art von Servoantrieb, ich will mich da nur irgendwie langsam mal vortasten...

Grüße
 
Hab ich gerade, ich hab jetzt auch die GSD Datei für mein Profinet installiert. Aber wenn ich mir die Beschreibung bei Lenze so anschaue, kann ich mir nicht vorstellen dass das jemand einfach so aus dem Kopf programmiert. Da muss es irgendwas anderes geben. Ich glaub ich ruf Montag mal bei Rexroth an. Kost ja nix!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,#wenn es dir um die Ankopplung eines solchen Reglers via Profinet geht dann wäre der folgende Thread vielleicht etwas für dich :
http://www.sps-forum.de/antriebstec...et-mit-s7-1200-a.html?highlight=bosch+rexroth

Gruß
Larry

Stimmt, da steht viel interessantes drin. Ich habe aber leider noch gar keine Kommunikation zwischen meinem Laptop und einem Antrieb. So weit kam's noch nicht. Ich glaub ich muss das Teil sowieso vorher mal an den Saft hängen und einfach mal schauen wie weit ich komme, dauert eh noch bis meine Kollegen an der Anlage soweit sind und sich da überhaupt was testen lässt! Aber dein SCL Baustein ist schonmal ne schöne Sache. Muss man ausser diesem Baustein nochwas programmieren was nur für den Antrieb bestimmt ist?

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja ... den Antrieb auf eine Position zu fahren ist ja nur ein Teil - es gehört ja sicherlich noch etwas mehr zu deinem "Aggregat".
Du mußt also schon noch etwas tun ...

Gruß
Larry

Hallo Larry,

ich würde mir gerne deinen Baustein, der ja als AWL-Quelle zur Verfügung steht in SCL umbauen. Dann hab ich's verständnistechnisch leichter, zumindest was die spätere Fehlersuche angeht! Ist das so ohne weiteres möglich?

Gruß
 
Zuletzt bearbeitet:
Hallo, ich hoffe ihr könnt irgendwie mal kurz über meine SCL-Quelle drüber schauen. Habe den Baustein fast fertig, aber halt immernoch 11 Fehler drin. Bei den Diagnosenummern steh ich auf dem Schlauch. Weiß nicht wie man das in SCL schreibt. Da wo die Sprungbefehle waren hab ich was umgeschrieben wo ich meine es richtig gemacht zu haben. Übrigens habe ich eine 300'er CPU.
Code:
 FUNCTION_BLOCK FB100
 TITLE = 'Kommunikation Rexroth'
 VERSION : '0.1'
 VAR_INPUT
   Per_Handshake : INT ; //1. Peripherie-Adresse Handshake mit Servo
   Freigabe : BOOL ; //Freigabe Servo-Achse
   Quit_Stoerung : BOOL ; //Quittierung Störung
   Referenz_Fahrt : BOOL ; //Fahr-Ablauf "Referenz-Fahrt"
   Steu_Funkt_Tippen_vor : BOOL ; //Fahren "Tippen vor"
   Steu_Funkt_Tippen_zur : BOOL ; //Fahren "Tippen zurück"
   Steu_Funkt_Geschw_Tippen : REAL ; //Geschwindigkeit Tipp-Betrieb
   Fahr_Da_Setzen : BOOL ;//Fahrdaten übernehmen
   Fahr_Da_Start_in_Pos : BOOL ; //Fahre auf Position [Fahrdaten]
   Fahr_Da_Ziel_Pos : REAL ; //- Fahrauftrag : Ziel-Position
   Fahr_Da_Geschw : REAL ; //- Fahrauftrag : Geschwindigkeit
   Fahr_Da_Drehm : REAL ; //- Fahrauftrag : Drehmoment
 END_VAR
 VAR_OUTPUT
   OUT_Servo_bereit : BOOL ; //Servo-Achse bereit
   OUT_Servo_DiagnoseFehler : BOOL ; //Servo-Achse Diagnose-Fehler
   OUT_Servo_Referenz_OK : BOOL ; //Servo-Achse in Referenz
   OUT_Servo_Arbeitsbereich : BOOL ; //Servo-Achse im Arbeitsbereich
   OUT_Set_Daten_OK : BOOL ; //neue Fahr-Daten eingetragen
   OUT_Fahren_Ready : BOOL ; //Fahr-Programm beendet
   OUT_Ist_Position : REAL ; //akt. Position Servo-Achse
 END_VAR
 VAR
   Servo_Read_Daten : STRUCT  
    Status_Regler : STRUCT  //P-0-4078
     Ist_Betriebsart_1 : BOOL ; //00=Hauptbetriebsart / 01 - 11 = Nebenbetriebsarten
     Ist_Betriebsart_2 : BOOL ; 
     Sollwert_Quit : BOOL ; //1=Fahrbefehl ist übernommen
     Meldung_Zustand_1 : BOOL ; 
     Meldung_Zustand_2 : BOOL ; 
     Meldung_Zustand_3 : BOOL ; 
     betriebsbereit_1 : BOOL ; 
     betriebsbereit_2 : BOOL ; 
     Betriebsmodus_Quit_1 : BOOL ; //10=Betriebs-Modus
     Betriebsmodus_Quit_2 : BOOL ; 
     Referenz_OK : BOOL ; 
     Stillstand_Achse : BOOL ; 
     Sollwert_erreicht : BOOL ; 
     Kommando_Aenderung : BOOL ; 
     Betriebsmodus_Fehler : BOOL ; 
     Status_Sollwert : BOOL ; //0=Antrieb folgt Vorgabe / 1=nicht
    END_STRUCT ; 
    Fahrbereichs_Endschalter : STRUCT  //P-0-0222
     x10 : BOOL ; 
     x11 : BOOL ; 
     x12 : BOOL ; 
     x13 : BOOL ; 
     x14 : BOOL ; 
     x15 : BOOL ; 
     x16 : BOOL ; 
     x17 : BOOL ; 
     Endschalter_1 : BOOL ; 
     Endschalter_2 : BOOL ; 
     x02 : BOOL ; 
     x03 : BOOL ; 
     x04 : BOOL ; 
     x05 : BOOL ; 
     x06 : BOOL ; 
     x07 : BOOL ; 
    END_STRUCT ; 
    dummi : WORD ; //S-0-0000
    Ist_Position : DINT ; //S-0-0386
    Drehmoment : INT ; //S-0-0084
    [B][COLOR=#ff0000]Diagnose_Nr : DWord ;[/COLOR][/B] //S-0-0390
   END_STRUCT ; 
   Servo_Write_Daten : STRUCT  
    Steuern_Regler : STRUCT  //P-0-4077
     Betriebsart_1 : BOOL ; //00=Hauptbetriebsart / 01 - 11 = Nebenbetriebsarten
     Betriebsart_2 : BOOL ; 
     Res_1 : BOOL ; 
     Res_2 : BOOL ; 
     IPos_Sync : BOOL ; 
     Antrieb_Halt : BOOL ; 
     Antriebs_Freigabe : BOOL ; 
     Regler_Freigabe : BOOL ; 
     Sollwert_Uebernahme : BOOL ; //Toggle
     Betriebsmodus : BOOL ; 
     Referenzfahrt : BOOL ; 
     Positioniermodus : BOOL ; //0=absolut / 1=relativ
     Satzwechsel_Modus : BOOL ; //0=letzte Pos. muss abgeschlossen sein / 1=egal
     Reset_Fehler : BOOL ; 
     Tippen_Pos : BOOL ; 
     Tippen_Neg : BOOL ; 
    END_STRUCT ; 
    Signal_Steuerwort : STRUCT  //S-0-0145
     x10 : BOOL ; 
     x11 : BOOL ; 
     x12 : BOOL ; 
     x13 : BOOL ; 
     x14 : BOOL ; 
     x15 : BOOL ; 
     x16 : BOOL ; 
     x17 : BOOL ; 
     Fahren_auf_Festanschlag : BOOL ; //S-0-0149
     Antrieb_referenzieren : BOOL ; //S-0-0148
     Referenzbezug_loeschen : BOOL ; //S-0-0191
     x03 : BOOL ; 
     x04 : BOOL ; 
     x05 : BOOL ; 
     x06 : BOOL ; 
     x07 : BOOL ; 
    END_STRUCT ; 
    dummi : WORD ; //S-0-0000
    Ziel_Position : DINT ; //S-0-0282   - 4 NK-Stellen
    Fahr_Geschwindigkeit : DINT ; //S-0-0259   - 4 NK-Stellen
    LR_Kraft_Grenzwert : INT  := 500; //S-0-0092   - 0 NK-Stellen
   END_STRUCT ; 
   Faktor_Anpassung : STRUCT  
    Position : REAL  := 1.000000e+004; 
    Geschwindigkeit : REAL  := 1.000000e+003; 
    Drehmoment : REAL  := 1.000000e+000; 
   END_STRUCT ; 
 END_VAR
 VAR_TEMP
   Word_Per_Handshake : WORD ; 
   R_Fehler : INT ; 
   W_Fehler : INT ; 
 END_VAR
 // Kopplung an Servo Regler - Auslesen
 Word_Per_Handshake:=INT_TO_WORD(Per_Handshake); 
 DPRD_DAT(LADDR:=Word_Per_Handshake,RET_VAL:=R_Fehler,RECORD:=Servo_Read_Daten)
 // Ziel Positionen setzen
[U][B]IF Fahr_Da_Setzen AND NOT OUT_Set_Daten_OK THEN[/B]
     [B]Servo_Write_Daten.Ziel_Position:=[COLOR=#ff0000]REAL_to_DINT[/COLOR](Signal_Steuerwort.Ziel_Position*Faktor_Anpassung.Position);[/B][/U]
     Servo_Write_Daten.Fahr_Geschwindigkeit:=[COLOR=#ff0000][B][U]REAL_to_DINT[/U][/B][/COLOR](Faktor_Anpassung.Geschwindigkeit*Faktor_Anpassung.Geschwindigkeit);
[U][B]   Servo_Write_Daten.LR_Kraft_Grenzwert:=[COLOR=#ff0000][B][U]REAL_to_INT[/U][/B][/COLOR]((INT_TO_REAL(Servo_Read_Daten.Drehmoment))*Faktor_Anpassung.Drehmoment);[/B][/U]
     OUT_Set_Daten_OK:=true;
[U][B]END_IF;[/B][/U]
 // Servo_Achse bereit 
 OUT_Servo_bereit:=Servo_Read_Daten.Status_Regler.betriebsbereit_1 AND
 Servo_Read_Daten.Status_Regler.betriebsbereit_2 AND NOT 
 Servo_Read_Daten.Status_Regler.Betriebsmodus_Fehler;
 // Servo-Achse in Referenz
 OUT_Servo_Referenz_OK:=Servo_Read_Daten.Status_Regler.Referenz_OK;  
 OUT_Fahren_Ready:=Fahr_Da_Start_in_Pos AND
 Servo_Write_Daten.Steuern_Regler.Sollwert_Uebernahme AND
 Servo_Read_Daten.Status_Regler.Sollwert_Quit AND 
 Servo_Read_Daten.Status_Regler.Sollwert_erreicht AND
 Servo_Read_Daten.Status_Regler.Stillstand_Achse;  
 // Fehlerdiagnose 
[U][B]IF Servo_Read_Daten.Diagnose_Nr<>DW#16#A0160 AND
 Servo_Read_Daten.Diagnose_Nr<>DW#16#A0161 AND Servo_Read_Daten.Diagnose_Nr<>DW#16#A0012 AND[/B][B] Servo_Read_Daten.Diagnose_Nr<>DW#16#A1300 AND Servo_Read_Daten.Diagnose_Nr<>DW#16#A8260 THEN[/B][/U]
     OUT_Servo_DiagnoseFehler:=true;
 END_IF;
  
 // Ist Position 
 OUT_Ist_Position:=(DINT_TO_REAL(Servo_Read_Daten.Ist_Position))/Faktor_Anpassung.Position; 
 // Steuerfunktionen
 Servo_Write_Daten.Steuern_Regler.Antrieb_Halt:=Freigabe AND NOT Quit_Stoerung;
 Servo_Write_Daten.Steuern_Regler.Antriebs_Freigabe:=Freigabe AND NOT Quit_Stoerung; 
 Servo_Write_Daten.Steuern_Regler.Regler_Freigabe:=Freigabe AND NOT Quit_Stoerung; 
 // Störung quittieren
 Servo_Write_Daten.Steuern_Regler.Reset_Fehler:=Quit_Stoerung; 
 // Referenzfahrt
 Servo_Write_Daten.Signal_Steuerwort.Antrieb_referenzieren:=Referenz_Fahrt AND Freigabe; 
 // Sollwertübernahme
 Servo_Write_Daten.Steuern_Regler.Sollwert_Uebernahme:=Fahr_Da_Start_in_Pos AND Freigabe;
 // Anstatt VKE auf Null???
 Servo_Write_Daten.Steuern_Regler.Positioniermodus:=0; 
 Servo_Write_Daten.Steuern_Regler.Satzwechsel_Modus:=0;
 // Tippen vorwärts
 Servo_Write_Daten.Steuern_Regler.Tippen_Pos:=Steu_Funkt_Tippen_vor AND NOT Steu_Funkt_Tippen_zur; 
 // Tippen zurück
 Servo_Write_Daten.Steuern_Regler.Tippen_Neg:=Steu_Funkt_Tippen_zur AND NOT Steu_Funkt_Tippen_vor; 
 IF Servo_Write_Daten.Steuern_Regler.Tippen_Pos OR 
 Servo_Write_Daten.Steuern_Regler.Tippen_Neg THEN
     Faktor_Anpassung.Geschwindigkeit:=ROUND(Steu_Funkt_Geschw_Tippen*Faktor_Anpassung.Geschwindigkeit);
[U]   [B] Servo_Write_Daten.LR_Kraft_Grenzwert:=[COLOR=#ff0000][B][U]REAL_to_INT[/U][/B][/COLOR]((DINT_TO_REAL(100))*Faktor_Anpassung.Drehmoment);[/B][/U]
 ELSE
 Servo_Write_Daten.Fahr_Geschwindigkeit:=0;
 Servo_Write_Daten.LR_Kraft_Grenzwert:=0;
 END_IF;
 // Kopplung an Servo-Regler - Rückschreiben
 Servo_Write_Daten.LR_Kraft_Grenzwert:= 1200;
 DPWR_DAT(LADDR:=Word_Per_Handshake,RECORD:=Servo_Write_Daten,RET_VAL:=W_Fehler)
[U][B]END_FUNCTION_BLOCK[/B][/U]
Habe die Fehler markiert. Ich hoffe ihr findet da was...Wäre echt prima, weil so manche Fehler finde ich kurios ;)
 
Zuletzt bearbeitet von einem Moderator:
Hallo,
ich habe mal in deinem Beitrag die Passagen im Code editiert und anschließend ROT markiert, von denen ich meine, dass es so nicht geht. Der Weg erschien mir jetzt einfacher.

Im Einzelnen : -
- einen Vergleich auf dw#16#abcdef darf man nur bei einem DWORD machen - das geht nicht bei einem DINT (in SCL). Da habe ich die Deklaration geändert.
- den Befehl ROUND kannte ich bislang nicht - ich bin mir wegen dessen Funktion also nicht klar. Das, was du aber m.E. brauchtest war REAL_to_DINT bzw. REAL_to_INT.

Das sollte es m.E. gewesen sein. ich habe das jetzt aber nicht selber compiliert ... 8)
Falls es noch Probleme gibt dann bitte Rückmeldung ...

Gruß
Larry

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ah, super, endlich Feedback!

Ja Larry keine Ahnung, habe jetzt mit dem was du rot gemacht hast noch einmal übersetzt. Aber der Compiler meckert immer noch mit 4 Fehlern :sb5:...
Vor allem sagt er mir auch bei dem "END_FUNCTION_BLOCK"--->Baustein nicht korrekt
Raff ich net!

Oder bei einem Strichpunkt nach dem End-If bei "Ziel Position setzen" kommt--->Unbekannte Anweisung
Ich bin ratlos....
Code:
FUNCTION_BLOCK FB100
TITLE = 'Kommunikation Rexroth'
VERSION : '0.1'

VAR_INPUT
  Per_Handshake : INT ; //1. Peripherie-Adresse Handshake mit Servo
  Freigabe : BOOL ; //Freigabe Servo-Achse
  Quit_Stoerung : BOOL ; //Quittierung Störung
  Referenz_Fahrt : BOOL ; //Fahr-Ablauf "Referenz-Fahrt"
  Steu_Funkt_Tippen_vor : BOOL ; //Fahren "Tippen vor"
  Steu_Funkt_Tippen_zur : BOOL ; //Fahren "Tippen zurück"
  Steu_Funkt_Geschw_Tippen : REAL ; //Geschwindigkeit Tipp-Betrieb
  Fahr_Da_Setzen : BOOL ;//Fahrdaten übernehmen
  Fahr_Da_Start_in_Pos : BOOL ; //Fahre auf Position [Fahrdaten]
  Fahr_Da_Ziel_Pos : REAL ; //- Fahrauftrag : Ziel-Position
  Fahr_Da_Geschw : REAL ; //- Fahrauftrag : Geschwindigkeit
  Fahr_Da_Drehm : REAL ; //- Fahrauftrag : Drehmoment
END_VAR
VAR_OUTPUT
  OUT_Servo_bereit : BOOL ; //Servo-Achse bereit
  OUT_Servo_DiagnoseFehler : BOOL ; //Servo-Achse Diagnose-Fehler
  OUT_Servo_Referenz_OK : BOOL ; //Servo-Achse in Referenz
  OUT_Servo_Arbeitsbereich : BOOL ; //Servo-Achse im Arbeitsbereich
  OUT_Set_Daten_OK : BOOL ; //neue Fahr-Daten eingetragen
  OUT_Fahren_Ready : BOOL ; //Fahr-Programm beendet
  OUT_Ist_Position : REAL ; //akt. Position Servo-Achse
END_VAR
VAR
  Servo_Read_Daten : STRUCT  
   Status_Regler : STRUCT  //P-0-4078
    Ist_Betriebsart_1 : BOOL ; //00=Hauptbetriebsart / 01 - 11 = Nebenbetriebsarten
    Ist_Betriebsart_2 : BOOL ; 
    Sollwert_Quit : BOOL ; //1=Fahrbefehl ist übernommen
    Meldung_Zustand_1 : BOOL ; 
    Meldung_Zustand_2 : BOOL ; 
    Meldung_Zustand_3 : BOOL ; 
    betriebsbereit_1 : BOOL ; 
    betriebsbereit_2 : BOOL ; 
    Betriebsmodus_Quit_1 : BOOL ; //10=Betriebs-Modus
    Betriebsmodus_Quit_2 : BOOL ; 
    Referenz_OK : BOOL ; 
    Stillstand_Achse : BOOL ; 
    Sollwert_erreicht : BOOL ; 
    Kommando_Aenderung : BOOL ; 
    Betriebsmodus_Fehler : BOOL ; 
    Status_Sollwert : BOOL ; //0=Antrieb folgt Vorgabe / 1=nicht
   END_STRUCT ; 
   Fahrbereichs_Endschalter : STRUCT  //P-0-0222
    x10 : BOOL ; 
    x11 : BOOL ; 
    x12 : BOOL ; 
    x13 : BOOL ; 
    x14 : BOOL ; 
    x15 : BOOL ; 
    x16 : BOOL ; 
    x17 : BOOL ; 
    Endschalter_1 : BOOL ; 
    Endschalter_2 : BOOL ; 
    x02 : BOOL ; 
    x03 : BOOL ; 
    x04 : BOOL ; 
    x05 : BOOL ; 
    x06 : BOOL ; 
    x07 : BOOL ; 
   END_STRUCT ; 
   dummi : WORD ; //S-0-0000
   Ist_Position : DINT ; //S-0-0386
   Drehmoment : INT ; //S-0-0084
   Diagnose_Nr : DWORD ; //S-0-0390
  END_STRUCT ; 
  Servo_Write_Daten : STRUCT  
   Steuern_Regler : STRUCT  //P-0-4077
    Betriebsart_1 : BOOL ; //00=Hauptbetriebsart / 01 - 11 = Nebenbetriebsarten
    Betriebsart_2 : BOOL ; 
    Res_1 : BOOL ; 
    Res_2 : BOOL ; 
    IPos_Sync : BOOL ; 
    Antrieb_Halt : BOOL ; 
    Antriebs_Freigabe : BOOL ; 
    Regler_Freigabe : BOOL ; 
    Sollwert_Uebernahme : BOOL ; //Toggle
    Betriebsmodus : BOOL ; 
    Referenzfahrt : BOOL ; 
    Positioniermodus : BOOL ; //0=absolut / 1=relativ
    Satzwechsel_Modus : BOOL ; //0=letzte Pos. muss abgeschlossen sein / 1=egal
    Reset_Fehler : BOOL ; 
    Tippen_Pos : BOOL ; 
    Tippen_Neg : BOOL ; 
   END_STRUCT ; 
   Signal_Steuerwort : STRUCT  //S-0-0145
    x10 : BOOL ; 
    x11 : BOOL ; 
    x12 : BOOL ; 
    x13 : BOOL ; 
    x14 : BOOL ; 
    x15 : BOOL ; 
    x16 : BOOL ; 
    x17 : BOOL ; 
    Fahren_auf_Festanschlag : BOOL ; //S-0-0149
    Antrieb_referenzieren : BOOL ; //S-0-0148
    Referenzbezug_loeschen : BOOL ; //S-0-0191
    x03 : BOOL ; 
    x04 : BOOL ; 
    x05 : BOOL ; 
    x06 : BOOL ; 
    x07 : BOOL ; 
   END_STRUCT ; 
   dummi : WORD ; //S-0-0000
   Ziel_Position : DINT ; //S-0-0282   - 4 NK-Stellen
   Fahr_Geschwindigkeit : DINT ; //S-0-0259   - 4 NK-Stellen
   LR_Kraft_Grenzwert : INT  := 500; //S-0-0092   - 0 NK-Stellen
  END_STRUCT ; 
  Faktor_Anpassung : STRUCT  
   Position : REAL  := 1.000000e+004; 
   Geschwindigkeit : REAL  := 1.000000e+003; 
   Drehmoment : REAL  := 1.000000e+000; 
  END_STRUCT ; 
END_VAR
VAR_TEMP
  Word_Per_Handshake : WORD ; 
  R_Fehler : INT ; 
  W_Fehler : INT ; 
END_VAR
// Kopplung an Servo Regler - Auslesen
Word_Per_Handshake:=INT_TO_WORD(Per_Handshake); 
DPRD_DAT(LADDR:=Word_Per_Handshake,RET_VAL:=R_Fehler,RECORD:=Servo_Read_Daten)

// Ziel Positionen setzen
[U][B]IF Fahr_Da_Setzen AND NOT OUT_Set_Daten_OK THEN[/B][/U]                                                                             <---Unbekannte Anweisung
[U][B]   Servo_Write_Daten.Ziel_Position:=REAL_TO_DINT(Signal_Steuerwort.Ziel_Position*Faktor_Anpassung.Position);[/B][/U] <---Ungültig
    Servo_Write_Daten.Fahr_Geschwindigkeit:=ROUND(Faktor_Anpassung.Geschwindigkeit*Faktor_Anpassung.Geschwindigkeit);
    Servo_Write_Daten.LR_Kraft_Grenzwert:=REAL_TO_INT(Servo_Read_Daten.Drehmoment*Faktor_Anpassung.Drehmoment);
    OUT_Set_Daten_OK:=true;
END_IF;

// Servo_Achse bereit 
OUT_Servo_bereit:=Servo_Read_Daten.Status_Regler.betriebsbereit_1 AND
Servo_Read_Daten.Status_Regler.betriebsbereit_2 AND NOT 
Servo_Read_Daten.Status_Regler.Betriebsmodus_Fehler;

// Servo-Achse in Referenz
OUT_Servo_Referenz_OK:=Servo_Read_Daten.Status_Regler.Referenz_OK;  
OUT_Fahren_Ready:=Fahr_Da_Start_in_Pos AND
Servo_Write_Daten.Steuern_Regler.Sollwert_Uebernahme AND
Servo_Read_Daten.Status_Regler.Sollwert_Quit AND 
Servo_Read_Daten.Status_Regler.Sollwert_erreicht AND
Servo_Read_Daten.Status_Regler.Stillstand_Achse;  

// Fehlerdiagnose 
IF Servo_Read_Daten.Diagnose_Nr<>DW#16#A0160 AND
Servo_Read_Daten.Diagnose_Nr<>DW#16#A0161 AND Servo_Read_Daten.Diagnose_Nr<>DW#16#A0012 AND
Servo_Read_Daten.Diagnose_Nr<>DW#16#A1300 AND Servo_Read_Daten.Diagnose_Nr<>DW#16#A8260 THEN
    OUT_Servo_DiagnoseFehler:=true;
[U][B]END_IF;[/B][/U]                                                                                                                                       <----Unbekannte Anweisung
 
// Ist Position 
OUT_Ist_Position:=(DINT_TO_REAL(Servo_Read_Daten.Ist_Position))/Faktor_Anpassung.Position; 
// Steuerfunktionen
Servo_Write_Daten.Steuern_Regler.Antrieb_Halt:=Freigabe AND NOT Quit_Stoerung;
Servo_Write_Daten.Steuern_Regler.Antriebs_Freigabe:=Freigabe AND NOT Quit_Stoerung; 
Servo_Write_Daten.Steuern_Regler.Regler_Freigabe:=Freigabe AND NOT Quit_Stoerung; 
// Störung quittieren
Servo_Write_Daten.Steuern_Regler.Reset_Fehler:=Quit_Stoerung; 
// Referenzfahrt
Servo_Write_Daten.Signal_Steuerwort.Antrieb_referenzieren:=Referenz_Fahrt AND Freigabe; 
// Sollwertübernahme
Servo_Write_Daten.Steuern_Regler.Sollwert_Uebernahme:=Fahr_Da_Start_in_Pos AND Freigabe;
// Anstatt VKE auf Null???
Servo_Write_Daten.Steuern_Regler.Positioniermodus:=0; 
Servo_Write_Daten.Steuern_Regler.Satzwechsel_Modus:=0;
// Tippen vorwärts
Servo_Write_Daten.Steuern_Regler.Tippen_Pos:=Steu_Funkt_Tippen_vor AND NOT Steu_Funkt_Tippen_zur; 
// Tippen zurück
Servo_Write_Daten.Steuern_Regler.Tippen_Neg:=Steu_Funkt_Tippen_zur AND NOT Steu_Funkt_Tippen_vor; 
IF Servo_Write_Daten.Steuern_Regler.Tippen_Pos OR 
Servo_Write_Daten.Steuern_Regler.Tippen_Neg THEN
    Faktor_Anpassung.Geschwindigkeit:=ROUND(Steu_Funkt_Geschw_Tippen*Faktor_Anpassung.Geschwindigkeit);
    Servo_Write_Daten.LR_Kraft_Grenzwert:=REAL_TO_INT((DINT_TO_REAL(100))*Faktor_Anpassung.Drehmoment);
ELSE
Servo_Write_Daten.Fahr_Geschwindigkeit:=0;
Servo_Write_Daten.LR_Kraft_Grenzwert:=0;
END_IF;
// Kopplung an Servo-Regler - Rückschreiben
Servo_Write_Daten.LR_Kraft_Grenzwert:= 1200;

DPWR_DAT(LADDR:=Word_Per_Handshake,RECORD:=Servo_Write_Daten,RET_VAL:=W_Fehler)

[U][B]END_FUNCTION_BLOCK[/B][/U]                                                                                                    <----Baustein nicht korrekt

Also der erste und zweite Fehler, da kann ich vielleicht irgendwo einen Gedankenfehler haben, aber die andern beiden??? Kein Plan
Aber trotzdem vielen Dank Herr Laffer!:cool:
 
Zuletzt bearbeitet:
Hallo,
der Fehler entsteht jetzt eine Zeile vorher : DPRD_DAT möchte am Ende auch ein Semikolon stehen haben ... ;)
Für END_Function_Block interessiert er sich wahrscheinlich auch deswegen nicht, weil noch eine Sequenz offen ist ...

Gruß
Larry
 
Hallo,
der Fehler entsteht jetzt eine Zeile vorher : DPRD_DAT möchte am Ende auch ein Semikolon stehen haben ... ;)
Für END_Function_Block interessiert er sich wahrscheinlich auch deswegen nicht, weil noch eine Sequenz offen ist ...

Gruß
Larry

Sorry, aber die Möglichkeit hatte ich schon gestern durch. Weil jetzt zeigt er mir "ungültiger oder fehlender Funktionstyp" an.
Es sei denn es wäre jetzt wirklich was an den Bausteinaufrufen falsch. Weil jetzt sind's nur noch 2 Fehler.
Jeweils bei DPRD_DAT und DPWR_DAT!

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sorry ... ist mir glatt durchgegangen ...
Beides sind Funktionen, die einen Return-Wert zurückliefern, den du (in SCL) abfragen mußt :
Code:
myResult := DPWR_DAT(LADDR:=Word_Per_Handshake,RECORD:=Servo_Write_Daten,RET_VAL:=W_Fehler) ;
// myResult ist vom Typ INT
Versuch es mal so ...

Gruß
Larry
 
Sorry ... ist mir glatt durchgegangen ...
Beides sind Funktionen, die einen Return-Wert zurückliefern, den du (in SCL) abfragen mußt :
Code:
myResult := DPWR_DAT(LADDR:=Word_Per_Handshake,RECORD:=Servo_Write_Daten,RET_VAL:=W_Fehler) ;
// myResult ist vom Typ INT
Versuch es mal so ...

Gruß
Larry

Ich glaube es nicht, 0 Fehler :ROFLMAO:...
Vielen herzlichen Dank! :cool:
 
Naja ... den Antrieb auf eine Position zu fahren ist ja nur ein Teil - es gehört ja sicherlich noch etwas mehr zu deinem "Aggregat".
Du mußt also schon noch etwas tun ...

Gruß
Larry

Es ging mir jetzt primär nur um diesen einen Antrieb. Ich weiß nämlich nicht wie schnell sich verdrahtungstechnisch die Gelegenheit bietet mit Indraworks weiter zu machen. Genügt dieser eine Baustein um den Schlitten "schnell" auf EINE Position zu fahren? Mein unerfahrenes Auge sagt mir nämlich anhand von dem was da alles berechnet wird dass das funktionieren müsste. Da ist ja Geschwindigkeit, Drehmoment und Grenzwerttechnisch alles drin.

Grüße
 
Zurück
Oben