Programm ok?

Volt81

Level-1
Beiträge
9
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

nachdem ich kürzlich ein unerwartetes Problem mit meinem Programm hatte möchte ich hier gerne mal einen anderen Programmteil zur Vorsicht von euch überprüfen lassen.
Es ist nichts besonderes, ich möchte aber gerne mal wissen ob es eine bessere Lösung dafür gibt, und vorallem auch ob man das ganze zusätzlich überwachen/absichern kann. Sollte dieses Programm nämlich mal nicht funktionieren könnte es zum crash kommen.
Durch diese Funktion soll der entsprechende Antrieb ab einer bestimmten Position verlangsamt werden. Leider habe ich hier niemanden auf der Arbeit den ich dazu befragen kann, daher bin ich für jede Antwort dankbar ;)

Screenshot_S7.JPG

Hier mal eine Beschreibung:

Im Netzwerk 13 wird die Geschwindigkeit an den Fu übertragen, dabei wird ein Wert von nem HW_Poti vorgegeben (#Wert)

Im Netzwerk 14 habe ich jetzt gesagt: Wenn der Antrieb (Biegearm) zurückgefahren wird (M40.0) UND die Position <= 2° ist (M180.1) UND der Wert des Potis größer als 19,92 (entspricht 3mm/s) ist, soll FC8 in NW13 "abgeschaltet" werden. Im NW14 soll dann stattdessen ein Wert von 3000 (3mm/s) an den Umrichter geschickt werden. Ist der Wert des Potis unter 19,92 kann die Geschwindigkeit ganz normal reguliert werden.

Was sagt ihr dazu?

Gruß
Volt81
 
Im Netzwerk 13 wird die Geschwindigkeit an den Fu übertragen, dabei wird ein Wert von nem HW_Poti vorgegeben (#Wert)
Hallo Volt,
so wie ich das sehe liegt die Variable "#Wert" (Poti) als Real vor. Was macht denn der FC8? Wandelt er die Realzahl in eine INT?
Im NW 15 wird auf jeden Fall eine INT an das AW geschrieben, was ja auch sinn macht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Autsch, das schreit.

Du beschreibst den Ausgang AW130 an zwei verschiedenen Stellen - zwar abwechselnd aber das ist unschön. Wenn Du so weitermachen würdest, könnte man irgendwann das Programm kaum noch verstehen. (Meine Maxime: Ausgänge werden genau einmal beschrieben oder im selben NW einmal gesetzt und rückgesetzt.)

Also mein Vorschlag ist: Erweitere den FC8 um einen 2. Sollwert und ein Umschaltbit. Das Umschaltbit ist der M180.5. Der Sollwert 2 ist die Konstante (3000 / 3.00E+3). Und im FC8 schaltest Du in Abhängigkeit vom Umschaltbit zwischen Sollwert 1 und 2 um.

Wenn Du Hilfe brauchst, dann poste mal den Inhalt vom FC8 (Schnittstelle und Code).
 
Zuletzt bearbeitet:
Hallo Leute,

danke für eure Antworten.

Im FC8 wird der Sollwert für den FU gebildet. Hier ist mal der Inhalt des FC´s so wie er ursprünglich programmiert wurde.

FC8-Ist.JPG


Ich habe jetzt erst mal selber versucht das ganze in den FC8 einzuprogrammieren, also so wie Asci es ja auch bereits vorgeschlagen hat ;)
Schaut es euch bitte mal an. Ich habe es zwar am PG simuliert, wo es wohl auch funktioniert hat, aber vielleicht macht man das ja doch ganz anders.
Den Wert für Soll_Max_2 habe ich vorerst verdreifacht. Damit müsste die Geschwindigkeit ja dann auch 1/3 der ursprünglichen Geschwindigkeit betragen. Den genauen Wert muss ich mir dann nochmal vor Ort errechnen.

FC8-Soll.JPGFC8-Schnittst..JPG


Was sagt ihr dazu?


Gruß
Volt81
 
Hallo Volt81,

jetzt kommen wir langsam in die richtige Richtung.

Also, ich würde das Umschaltbit auch von Aussen (#UseValue2, BOOL) reinholen und den M180.5 nicht im FC anbinden. Dadurch wird eine Funktion mehrfach verwendbar, was der eigentliche Sinn einer "closed function" ist.

Da Du noch ein wenig zu kompliziert gedacht hast (Zwei Sprünge), schlage ich Dir folgenden Code vor:

Code:
      L    #Sollwert
      UN   #UseValue2
      SPB  Sow2
      L    #Sollwert2
Sow2: L    1.638300e+004
      *R
      L    #Soll_Max
      /R
      TRUNC
      T    #Sollwert_FU

Der Hintergrund ist ganz einfach: Man läd schonmal den 1.Sollwert in den Akku1 und wenn das Umschaltbit (#UseValue2) gesetzt ist, dann überschreibt man Akku1 mit dem 2. Sollwert und macht ganz normal weiter.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ach ja, hätte ich fast vergessen:

Es ist absolut richtig, dass Du Dir hier Rat holst. Aber wir können Dir nicht die Absolution im Sinne einer Programmfreigabe erteilen. Die Verantwortung der Nutzung bleibt bei Dir. Deshalb solltest Du Programmänderungen möglichst nicht zum Feierabend vornehmen, sondern wenn Du mit der Arbeit beginnst und dann nimm Dir die Zeit, die Anlage ein paar Stunden zu beobachten und zu testen. Mit Testen meine ich auch ein paar "Nicht-Normale" Situationen. Man kann zum Beispiel einen Sensorausfall simulieren. Je nachdem, was Dir als Test sinnvoll erscheint.

Mit der Zeit wird Deine Erfahrung wachsen und Du wirst sicherer an die Aufgaben rangehen.
 
Hallo Asci,

besten Dank für deine Hilfe, freut mich echt dass ihr hier so hilfsbereit seid :).
Finde deinen Code super, wäre ich in der Form nie selbst drauf gekommen.. dabei ises so logisch *grins*.

Dass ich von euch keine Absulotion erwarten kann weiß ich, würde ich natürlich auch nie. Im Endeffekt bin ich selber für meine Änderungen verantworlich. Aber das mit dem Testen der Nicht-Normalen-Situationen ist ein gutes Stichwort.

Gibt es noch irgendwelche Möglichkeiten diese ganze Funktion in irgendeiner Form zu überwachen?
Wenn der Antrieb nämlich mal nicht langsamer wird ist da nur noch der HW-Endschalter der die Funktion bei 0° abschaltet. Aber dann ises zu spät weil der Biegearm durch seine Geschwindigkeit relativ weit nachläuft.

Ich denke da grad an den Positionsgeber. Wenn der mal beim zurückfahren ausfällt weiß die S7 ja garnicht mehr dass der Antrieb kleiner als 8° steht und somit langsamer werden soll. Hmm.. das muss ich in den nächsten Tagen wirklich mal ausprobieren.

Falls du da noch nen tip für mich hast wie man solche Sachen sicherer gestalten kann würd ich mich wirklich sehr freuen.
Ich hoffe nur, ich nerve dich nicht mit meiner ganzen Fragerei :rolleyes:

Gruß
Volt81
 
Zuletzt bearbeitet:
Ab und zu steht man mal auf dem Schlauch, das ist normal. :rolleyes: Aber mit zunehmender Erfahrung wird das seltener. :cool:

Thema Positionsgeberüberwachung:
Frage: Wie wird der Antrieb beim zurückfahren gestoppt? Position oder Endschalter?

Wenn Endschalter, kannst Du beim Erreichen des Endschalters eine Mindest-Position überprüfen und gegebenenfalls eine Störung auslösen.

Wenn Position, dann würde der Antrieb ja auch hinten auf den Endlagenschalter auflaufen und einen Chrash verursachen. da würde mir nur eine Laufzeitüberwachung einfallen mit voreilenden Endschaltern. Mann könnte durch voreilende Endschalter auch einen Notstopp initiieren oder die aktuellen Endlagenschalter mehr nach vorne stellen, dass ein Notstopp zum Bremsen ausreicht.

Da gibt es viele Möglichkeiiten, aber nicht jede passt zu euer Anlage....
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo asci,

ich habe mir deinen Code nochmal in ruhe angeschaut. Die Idee ist gut, passt aber leider nicht ganz zu meinem Programm.
In dem von dir geschriebenen Code gibt es 2 Sollwerte, aber nur einen Soll_Max_wert.
Da der Sollwert aber von einem Potentiometer kommt muss dieser auch beibehalten werden. Andernfalls wäre die Geschwindigkeit ja nicht mehr variabel. Ich hätte es aber gerne so, dass ab einer Position von 2° nicht schneller als 3mm/s gefahren werden kann. Unterhalb dieser Grenze soll die Geschwindigkeit aber trotzdem noch einstellbar sein.
Dafür muss ich dann einen größeren Soll_Max_Wert verwenden.

Ich wüsste jetzt nicht wie ich das ohne 2 Sprünge machen soll. Aber vielleicht hast du ja noch ne Idee. Andernfalls verwende ich meinen Code von gestern.

Was die Überwachung angeht... wir haben am Ende (0°) wirklich nur einen HW-Endschalter.
Vielleicht werde ich das so machen:
1. Für die Endlage bei 0° werde ich einen zusätzlichen Software-Endschalter einprogrammieren. (Falls der HW-Endschalter mal nicht funktioniert)
2. Für die "Langsamfahrt", welche ja bei <=2° beginnt werde ich bei 1° einen zusätzlichen HW-Endschalter anbringen. Wenn dieser dann überfahren wird UND die Geschwindigkeit immernoch höher als 3mm/s ist soll der Antrieb abschalten und eine Störmeldung ausgeben.

So hätte ich dann beide Funktionen zusätzlich abgesichert.

Gruß
Volt81
 
Zuletzt bearbeitet:
Hey, machs Dir nicht so kompliziert, Sollwert 2 ist Deine Konstante für die festgelegte Geschwindigkeit. Du schaltest mit M180.5 nur zwischen den beiden Sollwerten um. Sollwert 1 kommt vom Poti und Sollwert 2 von Deiner Konstante. Das Max ist nur ein Umrechnungsfaktor, den solltest Du so lassen und ignorieren sonst steigst Du von der falschen Seite auf das Pferd.

Überwachung - ? ja klingt gut, ich kenn halt die Maschine nicht...:cool:
 
Ach jetzt verstehe ich wie du das meinst. Das Netzwerk 14 bleibt wie es ist. Wenn dann das Potentiometer höher als 1.992e+001 ist wird mittels M180.5 der Sollwert1 durch den Sollwert2 (Festwert) im FC8 überschrieben.
Ich dachte die ganze Zeit du möchtest diese Funktion mit in den FC8 einbauen.
Also praktisch so, dass der Umrechnungsfaktor geändert wird sobald der Antrieb in diesen Bereich reinfährt. Dann würde der Vergleicher im NW14 nämlich wegfallen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Edit
Ähh, der nachfolgende Post bezieht sich auf den ursprünglichen Text des vorherigen Posts:
/Edit

Jetzt geh aber mal vom Schlauch runter ... grins

Also ich versuche es mal von dieser Seite:

Der FC 8 ist erstmal eine Weiche, die entweder den Sollwert 1 oder 2 je nach dem Zustand von #UseValue2 verwendet. Der Parameter #Soll_Max dient ja "nur" zur Anpassung der Ausgabe. (Ich gebe zu, von der ürsprünglichen Aufgabe des FC8 ausgehend ist es ein wenig umständlich geworden.)

Also zurück zu den Sollwerten. Sollwert 1 kommt jetzt von einem Poti. Ob jetzt der Sollwert 2 von einem anderen Poti kommt oder eine von Dir vorgegebene Konstante ist, ist dem FC8 völlig egal. Der FC8 gibt brav den umgerechneten Sollwert je nach Zustand von #UseValue2 aus. Wenn das Problem darin besteht, das Du den 2. Sollwert gerne ohne Berechnung direkt übergeben willst, dann mach es so:

Code:
      L    #Sollwert
      L    1.638300e+004
      *R
      L    #Soll_Max
      /R
      UN   #UseValue2
      SPB  Sow2
      L    #Sollwert2_Direkt      //REAL, wenn du den als Integer oder DInteger übergeben willst, dann muss TRUNC (ohne "Sow2:") direkt nach /R stehen.
Sow2: TRUNC
      T    #Sollwert_FU

Das ist halt das Gleiche (nur nach der Berechnung), aber ändert nichts daran, das es ein Sollwert ist, den Du dann als Konstante übergibst.

Warscheinlich bereitet Dir auch #Soll_Max Kopfzerbrechen. Man hätte die vielleicht besser #CALC_Out oder so nennen sollen, weil das ist kein Max-Wert, sondern Bestanteil der Umrechnung Poti zu Geschwindigkeit an Umrichter.
 
Zuletzt bearbeitet:
Sorry, ich hätte eine neue Antwort schreiben sollen. Du bist aber auch immer schnell.... *grins*
Naja, ich möchte mich auf jeden Fall noch mal bei dir bedanken, du hast mir wirklich sehr geholfen.

Gruß
Volt81
 
Zurück
Oben