Step 7 Sinumerik 840d Synchronaktionen - PLC: FC21 "Transfer", FB4 "PI_Serv", FC9 "ASUP"

Need4Speed

Level-1
Beiträge
31
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Sinumerik 840d Synchronaktionen - PLC: FC21 "Transfer", FB4 "PI_Serv", FC9 "ASUP"

Liebes Forum,

wir haben eine Lösung konzipiert (und halbwegs umgesetzt), mit der wir Achswerte der NC (Drehmoment, Drehzahl, Position, Lage, usw) auslesen. Der Ansatz ist so, dass es ein NC Programm gibt, mit dem werden Synchronaktionen [1] in der NC gestartet, die die Werte lesen und via R/$R Parameter und $AC_Merker[n] speichern und dann mit $A_DBR[] in das Dual Port RAM schreiben. In der PLC lese ich dann mit dem FC21 "Transfer" das Dual Port RAM im OB35 (um hier unabhängig von den Zykluszeiten des OB1 zu sein) aus.

Wo es jetzt noch etwas hakt ist, dass ich gerne das NC Programm mit den Synchronaktionen von der PLC aus verwalten (starten, stoppen, Status abfragen) möchte. Dazu kann man mit dem FB4 "PI_Serv" die Aktion "ASUP" (asynchrones Unterprogramm, DB16.ASUP) verwenden, um das ASUP für den eigentlichen Start des Programm mit dem FC9 vorzubereiten (man muss den Pfad und Dateinamen des Programms im FB4 "PI_Serv" angeben). Weitere Parameter sind "Req" (Flanke um den Aufruf zu aktivieren), "Unit" (Nummer des Kanals) und "Interrupt" (wird später beim Aufruf/Start durch den FC9 benötigt).


Nun zu meinen konkreten Fragen:

FB4 "PI_Serv":

- Was ist die Rolle des Parameters "Unit" (Kanal) - da ich leider Sinumerik Neuling bin, verstehe ich nicht, was es mit den Kanälen auf sich hat. Jede NC hat ja mindestens einen Kanal (Kanal 1) - was sind die Aufgaben eines "Kanals" und warum gibt es mehr als einen? Wird ein Kanal ausschliesslich für die Kommunikation zwischen PLC und NC verwendet, oder gibt es abhängig von der Ausbaustufe der Sinumerik mehrere parallele NCK (NCU?), so dass diese auch untereinander kommunizieren können? Und letztlich, geht die Übertragung mit dem Dual Port RAM zwischen NC und PLC auch über einen Kanal, oder ist das (hoffentlich) unabhängig?

- Rolle des Parameters "Done" - in der Step7 Doku steht, dass man den Req wieder auf 0 setzten muss, sobald "Done==1", d.h. ich merke mir, ob der Aufruf im FB4 erfolgreich war und kann dann anschliessend mit dem FC9 das Unterprogramm auch tatsächlich aufrufen. Was aber nun, wenn z.B. durch einen Reset an der NC die Ergebnisse des FB4 "PI_Serv" nicht mehr gültig sind sozusagen? Wäre es also angebracht, immer beim Reset des NCK (über die Nahtstelle überwachen), auch den Aufruf des FB4 "PI_Serv" neu zu machen? Oder gibt es die Möglichkeit, den Status des konkreten FB4 "PI_Serv" (hat ja einen dedizierten Instanz DB) jeweils im OB1 aktiv abzufragen und dann bei Bedarf wieder zu starten?

- Rolle des Parameters "WVar1" (Nummer des Interrupts) - der wird später auch vom FC9 verwendet, damit das zusammen passt und der FC9 Aufruf weiss, um welches ASUP es konkret geht; aber wie wähle ich jetzt den geeigneten Interrupt - muss ich mir da anschauen, welche anderen FC9 (bzw. FB4 "PI_Serv") Aufrufe es schon gibt und welche Interrupts hier verwendet werden und suche mit dann einen freien, nicht verwendeten aus? Oder können Interrupts auch schon ausschliesslich innerhalb der NC belegt sein, die dann hier nicht verwendet werden dürfen? Ist es richtig, dass es nur 8 Interrupts gibt, oder ist das abhängig von der Ausbaustufe der Sinumerik? Gibt es vielleicht sogar einen Abfrage FC der erkennen kann, ob ein Interrupt noch frei ist? Dann könnte ich da alle durch probieren und schauen, welcher noch frei ist (ggf. im Ob100).


FC 9 "ASUP - Start von aysnchronen Unterprogrammen"

In der Hilfe steht " Der Parameter "Ref" wird im ersten OB1-Zyklus mit dem Wert 0 initialisiert, aus diesem Grund muss jeder FC9 absolut aufgerufen werden. Alternativ kann der Parameter "Ref" durch den Anwender im Anlauf mit dem Wert 0 initialisiert werden . Damit sind auch bedingte Aufrufe möglich."

- Was ist denn in dem Zusammenhang mit "absolut aufrufen" und "bedingt aufrufen" gemeint?
- Mein NC Programm besteht im Prinzip nur aus Synchronaktionen (ID/IDS [1]) - da würde es doch reichen, das ASUP nur einmal aufzurufen und dann die positive Flanke so lange lassen, bis der FC9 am Parameter "Done" und "Activ" eine "1" meldet? Oder muss ich - trotzdem im ASUP nur Synchronaktionen deklariert sind - den FC9 zyklisch aufrufen und das "Activ" Bit abfragen (und entsprechend darauf reagieren).


Sodele, die Frage wurde jetzt leider doch länger ... Danke, dass ihr so weit gelesen habt!!

Viele Grüße, Jürgen


[1] https://support.industry.siemens.com/cs/document/109760806/sinumerik-840d-sl-828d-synchronaktionen
 
Zuletzt bearbeitet:
Moin Jürgen!

Kanal bei Siemens NC:
Jeder Kanal ist wie eine eigene NC. Mehrere Kanäle können zu einer BetriebsArtenGruppe (="BAG") zusammengefasst werden.
Die Steuerung kann mehrere BAG - je nach Option/Lizenz.
Beim Schreiben in die NC bzw. beim Lesen aus der NC von der PLC aus muss man häufig spezifizieren, welcher NC-Kanal gemeint ist.
ASUP dürfte in einem eigenen Kanal laufen, sonst könnte man dem ASUP z.B. kein eigenes Reset bzw. NC-Start "spendieren".

ASUP starten, stoppen, etc. …:
Was hältst Du davon, die ASUP 1-mal zu starten und als EndlosSchleife zu konstruieren und sie von der PLC über eine R-Parameter-Schnittstelle zu steuern?

Bedingte und unbedingte ("absolute") BausteinAufrufe:
Unbedingt: Baustein wird "gnadenlos" in jedem Zyklus aufgerufen.
Bedingt: Baustein wird "nur bei Bedarf" aufgerufen.

Schönes WE, Gruss Heinileini
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
wenn in dem Asup nur die Synchronaktionen in die Nc geschrieben werden
dann startet man den Asup nur einmal dafür braucht es keine Steuerung aus der PLC

Hier hat man was grundsätzlich falsch verstanden.

Eine Synchronaktion wird im NC Speicher eingerichtet / installiert. wenn sie mit Hilfe eines Asups eingerichtet wird braucht man den Asup nur einmal dafür
der Asup hat nix mit der Abarbeitung der Synchronakiton zutun.
Dafür gibt es die Schlüsselworte der Synchronaktion Every........ und die Verknüpfung für die Ausführung

bei dem was der TE machen will sollte die Synchroaktion ohne Verknupfung zur Ausführung als IDS mit dem Progevent bei Steuerungshochlauf geladen werden.
ganz ohne Interrupt und PLC gefummel.

PS : eine ASUP der per Interrupt ausgelöst wird laüft nicht parallel zu Hauptprogramm. die NC unterbricht das Hauptprogramm arbeitet den ASUP ab und macht beim Hauptprogramm weiter.
die geplante Vorgehensweise den ASUP immer wieder zu starten würde die NC zum stottern bringen
 
Hallo Peter,

vielen Dank für die Antwort. In dem ASUP habe ich tatsächlich nur statische Synchronaktionen:

Code:
N100 IDS=111 DO 
    $A_DBR[100]=$AA_IM[X]
    $A_DBR[104]=$AA_IM[Y]
    $A_DBR[108]=$AA_IM[Z]
    $A_DBR[112]=$AA_IM[A]
    $A_DBR[116]=$AA_IM[C]

Den Aufwand mit FB4/FC9 möchte ich nur deswegen machen, weil ich dachte, dass die PLC dafür sorgen muss, dass bei NCK Reset, oder Neustart immer gewährleistet ist, dass die Synchronaktionen aktiv sind. Kannst du mir sagen, wie man das Programm als "Autostart" einfügt? Oder muss der Werker immer nach dem Hochfahren der Sinumerik das machen?

Zu den statischen Synchronaktionen hätte ich auch noch folgenden Fragen, falls du das zufällig weisst:

  1. wieviele kann man da bedenkenlos hinterlegen, diese werden ja im IPO Takt aufgerufen und belasten die NCU zusätzlich
  2. weisst du wo man in der Doku finden kann, welches die maximale Anzahl an Aktionen (nachdem "DO") sein darf? Wenn man bei z.B. 5 Achsen dann z.B. 7 Parameter ($AA_IM, $AA_VC, $VA_TORQUE, $AA_LOAD, $AA_POWER, $AA_TORQUE, $AA_CURR) lesen möchte, dann sind es ja schon 35 Aktionen
  3. wie kann man erkennen, ob die Sinumerik durch die Synchronaktionen überlastet wird? Reicht es zu schauen, ob die CPU Belastung des Interpolatortaktes z.B. <80% ist nachdem die Synchronaktionen geladen sind? Oder muss man das Werkstück anschliessend (z.B.) auf Konturfehler überprüfen? Oder geht die Sinumerik sogar in STOP, wenn ein Überlastung droht?
  4. Kann man überschlagen, wie lange die Abarbeitung der Synchronaktionen dauert? In meinem Fall (35 Aktionen) sind es ja jeweils 2 Operationen: $AA_IM lesen und $A_DBR schreiben - bei den vielen Dokus meine ich, das ich irgendwo stand, dass eine Operation ca. 10 Microsekunden dauert; ich finde es aber leider nicht mehr

Und ist es erlaubt zu schreiben:

Code:
N1 DEF INT OFFSET = 100
N100 IDS=111 DO 
    $A_DBR[(OFFSET + 0)] = $AA_IM[X]
    $A_DBR[(OFFSET + 4)] = $AA_IM[Y]

; bei $R Parametern darf man ja $R[(hier berechne ich den Offset)] machen


Vielen Dank und viele Grüße,

Jürgen
 
Zuletzt bearbeitet:
frage 3 wird in dem von dir verlinktem Dokument kapitel 3.3.2 behandelt
frage 1,3,4 in kapitel.3.12 ,

Autostart -> Progevent ich such morgen mal Doku dazu
was für eine 840Dsl haste denn da
NC Version würde schon helfen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Peter,

vielen Dank für den Tipp zu Kapitel 3.12 - tatsächlich, da ist es zu finden: Grundlast (Synchronaktion aufrufen und Vergleichen) + 2μs pro Aktion ($AA_IM[] Lesen, $A_DBR Zuweisen) - mit etwas Reserve dann max 10μs - bei 5 Achsen, 7 Parameter = 35 Aktion

best case ca. 100μs (10μs + 35 * 2μs) mit Offset statisch: $A_DBR[200] = $AA_IM[X] $A_DBR[204] = $AA_IM[Y] ...

worst case ca. 350μs (10μs + 35 * 10μs) mit Offset dynamisch: $A_DBR[(OFFSET + 0)] = $AA_IM[X] $A_DBR[(OFFSET + 4)] = $AA_IM[Y] ... damit ist dann eigentlich schon nicht mehr zu spaßen ... (in der Doku ist die Multiplikation mit 12μs angegeben, dann schätze ich mal, dass die Addition schneller geht)

Bezüglich Frage "3." habe ich es im Kapitel 3.3.12 "Auslastungsauswertung" gefunden (nicht Kapitel 3.3.2) - super!

Bei der 840Dsl handelt es sich um eine 720.3 - oder meinst du mit "NC Version" noch was anderes?

Vielen Dank! Jürgen
 
Hallo Peter, vielen Dank!

Habe die Seitenangabe "542" zuerst falsch verstanden, weil ich auf die Seitenzahl im Dokument geschaut hatte. Zur Info für die anderen Leser, es ist auf Seite 542 des PDF (absolut), welches die Seite 526 bei den Seitenzahlen im Dokument (relativ) ist (aktuellste Version "12/2017 - SINUMERIK 840D sl Betriebssystem NCU") gefunden. Dort werden sowohl PROG_EVENT und CYCPE1MA.SPF, als auch CYCPE_MA.SPF erwähnt.

Ich versuche mal zusammenzufassen, was ich verstanden habe:
  1. PROG_EVENT wird von der Sinumerik ausgelöst (z.B. Hochlauf, Reset, ...) --> das ist mein Trigger um die statischen Synchronaktionen zu starten
  2. Kapitel 21.3.3: "Wenn Sie die Funktionalität des PROG_EVENT erweitern möchten, müssen Sie diesen nicht in das Verzeichnis Hersteller-Zyklen kopieren, sondern Sie legen zwei neue Herstellerzyklen an. Verwenden Sie für die Herstellerzyklen die Namen CYCPE1MA.SPF bzw. CYCPE_MA.SPF. Für die Herstellerzyklen CYCPE1MA.SPF bzw. CYCPE_MA.SPF sind am Anfang und am Ende des PROG_EVENT.SPF entsprechende Sprungmarken vorbereitet. Wenn die Herstellerzyklen CYCPE1MA.SPF bzw. CYCPE_MA.SPF in der NC angelegt sind, wird vom PROG_EVENT entsprechend in diese Herstellerzyklen verzweigt."
  3. Nachdem ja nur nach dem PROG_EVENT (wenn Hochlaufen oder Reset) die statischen Synchronaktionen starten sollen, würde es vermutlich reichen, nur die Datei "CYCPE_MA.SPF" anzulegen und diese dort aufrufen.

Bei der "Konkurrenz" ist noch Diskussion [1] mit etwas mehr Details, unter anderem sagen die, es gibt noch einen Zyklus, der für die Anwender vorgesehen ist. In dem Dokument [2] "Installation Guide SINUMERIK 840Di sl SW 01.04.00.00" wird dann konkret vom "CYCPE1US.SPF" (und "CYCPE_US.SPF") gesprochen. Ich könnte mir zusammenreimen, dass "...MA..." den Maschinenhersteller meint, und "...US..." den Benutzer/User. Ich werde es zuerst mal mit "CYCPE_US.SPF" versuchen, falls das nichts bewirkt, dann mit "CYCPE_MA.SPF".

Danke nochmal an Peter (sobald ich wieder an die Maschine komme, schaue ich in der Diagnose die genaue Version nach)!

Viele Grüße, Jürgen



[1] https://de.industryarena.com/siemens/forum/variable-bei-reset-mit-wert-belegen--72715.html
[2] https://cache.industry.siemens.com/dl/files/143/25997143/att_37383/v1/installation_010400_76.pdf
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
ich hatte heut etwas wenig zeit.
bei älteren NC Versionen gibt es nur den Progevent.spf
innerhalb des Progevent gibt es eine Variable die den Aufruf des Progevent beschreibt

der Progevent wird bei Hochlauf , NC Start ,NC Stop ,Reset ......
aufgerufen

diese Variable gibt es auch bei CYCPEMA ,CYCPEMA1 die sind führ den USER gedacht. der erste wird am anfang des Progevent gerufen der andere am ende
damit kann man entscheiden ob die Funktionen vor oder nach den OEM Progevent ausgeführt werde.
in deinem fall solltest du die SyncronAktionen nach NC hochlauf laden als IDS vor her solltest du kontrollieren welche IDS nummern schon belegt sind.
da zu nach Hochlauf in Grundbild des HMI die horizontale Softkeyleiste verlängern ">" dann Softkey "SYNC Akt " da siehst du die Liste der Syncronaktionen.
 
Hallo Peter,

die Sinumerik hat die Version "V04.05 + SP 04 + HF 04" - dann versuche ich zuerst "CYCPE_MA.SPF", und falls das nicht funktioniert "Progevent.SPF". Was die PROG_EVENT Variable betrifft, müsste ich einfach "IF $P_PROG_EVENT AND 0x100" abfragen, laut Listenhandbuch "Maschinendaten und Parameter" ist es das Datum 20108 "PROG_EVENT_MASK" (Bit 0 = 1 : Teileprogramm-Start, Bit 1 = 1 : Teileprogramm-Ende, Bit 2 = 1 : Bedientafel-Reset, Bit 3 = 1 : Hochlauf, Bit 4 = 1 : reserviert, Bit 5 = 1 : Safety-Programm im Hochlauf).

Vielen Dank auch für den Hinweis, wie man sich noch freie bzw. schon belegte IDS Nummer anzeigen lassen kann! Zu den Synchronaktionen hätte ich noch eine Frage: laut Funktionshandbuch Synchronfunktionen ist es ja so, dass jede Synchronaktion mindestens 4 Elemente enthält, insgesamt sind im Standard aber nur 159 Elemente insgesamt für alle Synchronaktion vorgesehen (MD28250 „MM_NUM_SYNC_ELEMENTS"; kann durch Kaufoption aber hoch gesetzt werden). Dann wären die "freien" Ausdrücke bei ein paar Achswerte recht schnell "verbraucht". Wenn ich jetzt aber in einer Synchronaktion ein Teileprogrogramm aufrufe, z.B. so:

Code:
DEF INT DPR_OFFSET = 200;
DEF INT SEMAPHORE = DPR_OFFSET;

N10 IDS = 123 WHENEVER (SEMAPHORE == 0) DO PROC DPR_ACHSDATEN (DPR_OFFSET + 4)

PROC DPR_ACHSDATEN (INT DPR_DATA_OFFSET)
; z.B. 5 Achsen, 5 Werte
$A_DBR[DPR_DATA_OFFSET] = $AA_IM[X];
$A_DBR[DPR_DATA_OFFSET + 4] = $AA_LOAD[X];
$A_DBR[DPR_DATA_OFFSET + 8] = $AA_CURR[X];
...
$A_DBR[DPR_DATA_OFFSET + 24] = $AA_IM[Y];
$A_DBR[DPR_DATA_OFFSET + 28] = $AA_LOAD[Y];
$A_DBR[DPR_DATA_OFFSET + 32] = $AA_CURR[Y];
...
RET

Zählt der Aufruf "DO PROC DPR_ACHSDATEN" als ein Element, oder werden alles Sätze im Teileprogramm zusammengezählt um die Anzahl der Elemente zu ermitteln?

Vielen Dank vorab! Jürgen
 
Zuletzt bearbeitet:
Du hattest von 35 "Aktionen" geschrieben, Jürgen.
Ich vermute mal, dass Du auf …
2 Elemente für die Semaphore,
2 Elemente für die 1 Abfrage der 1 SynchronAktion und
70 Elemente für die 5 Achsen x 7 Parameter x 2 Elemente
also insgesamt 74 Elemente kommst.
Das habe ich jetzt "ohne Sinn und Verstand" (ohne genauere Kenntnis, was nun wirklich als Element gezählt wird) über den Daumen gepeilt.
Gruss, Heinileini
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Servus Heinileini, das stimmt - allerdings war ich da leider sprachlich nicht ganz präzise bzw. mir war nicht bewusst, dass "MD28250: MM_NUM_SYNC_ELEMENTS" wirklich Elemente (Ausdrücke) einer Synchronaktion meint, und nicht die Synchronaktion selbst - im "Funktionshandbuch Synchronaktionen" ist es relativ genau beschrieben, wie man hier zählen muss. Die Zahl von 35 hat sich auf die native Rechnung: 7 Achsen, 5 Werte (oder umgekehrt) bezogen - aber es kommt schon einiges zusammen:

Laut "Funktionshandbuch Synchronaktionen" ist es so:

AnweisungAnzahl benötigter Elemente
Operator in Bedingung1
Aktion>= 1
Zuweisung2
weitere Operanden in komplexen Ausdrücken1

Ich überschlage mal so: WHENEVER (SEMAPHORE == 0) DO $A_DBR[OFFSET_AKTUELL] = $IM_AA[X] OFFSET_AKTUELL = OFFSET_AKTUELL + 4;

(SEMAPHORE == 0)11x Operator "==" in der Bedingung
DO1nicht sicher, ob das schon als Aktion zählt
$A_DBR[OFFSET_AKTUELL] = $IM_AA[X]2Zuweisung
OFFSET_AKTUELL = OFFSET_AKTUELL + 43Zuweisung, weiterer Operand ("+")


Das wären dann 5 Aktionen für jeden Achswert, also bei 5 Achsen und 7 Werte müssten es 175 Elemente sein, was über dem Limit der 159 im Standard sind. Dann muss ich aber noch ein bisschen drum herum machen (Einleitung der Aktion (Bedingung Semaphore == 0), Fehlerhandling (overflow flag setzten falls Semaphore != 0), Semaphore auf 1 setzten).

So jedenfalls meine Rechnung nach dem schwäbischen Dreisatz :)

VG, Jürgen
 
Darf man denn nicht
$A_DBR[DPR_DATA_OFFSET + 4] = $AA_LOAD[X];
schreiben statt
DPR_DATA_OFFSET = DPR_DATA_OFFSET + 4
A_DBR[DPR_DATA_OFFSET] = $AA_LOAD[X];
bzw. werden bei ersterer Schreibweise auch so viele Elemente "verbraten"?
Und ich dachte, meine Betrachtung sei schon auf WurstKäse (worst case) ausgerichtet ;o)

Warte wir mal ab, was Peter dazu beitragen kann! Ich kann - wie gesagt - nur vermuten.
 
Ich glaube man muss hier mal ein wenig ausholen.

1 was habt ihr mit den Daten vor ?
2 in welchem Zeitraster braucht ihr die Daten?

erstmal so fürs Verständnis
Die NC kann nur ein NC Programm abarbeiten , ein Asup ist ein NC Programm das den Hauptlauf (eigentlich laufendes NC Programm ) unterbricht , irgendwas tut und wieder den Hauptlauf anstößt.
gestartet wird der ASUP durch Interrupt , aus der PLC , oder Synchronaktionen.
jetzt kannste kurz überlegen was passiert wenn du deine Achsdaten per DPR_Achsdaten schreibst.
Eine Synchronaktion wird in den Speicher der NC geschrieben und werkelt vor sich hin parallel zum Hauptlauf.

So wie ich das sehe musst du deine Daten erstmal in einen Puffer schreiben. der muss mindestens so groß sein das der Laufzeit unterschied zwischen PLC und NC ausgeglichen wird wenn du denn alle werte haben willst.

gehen wir mal von IPO 4ms und PLC 40ms wenn du dann mit der FC21 die Daten abholst erwischst du ja nur jeden xten Wert
ich würde in dem Fall 2 Puffer anlegen die jeweils 20 Datensätze haben
1 Puffer beschreiben wenn voll -> 2 Puffer Beschreiben , PLC bescheid geben Puffer 1 abholen -> usw....

und Du wirst nicht an den kauf Optionen vorbei kommen.

kannst mir ja mal per PN mitteilen was ihr da so treibt .
 
Zurück
Oben