Probleme mit SFC 14 / SFC 15 in FB

Zuviel Werbung?
-> Hier kostenlos registrieren
@ Larry Laffer:

So war ja mein erster Ansatz:

Das ich also je Achse jeweils einen FB habe der alle Daten in einem InstanzDB liegen hat.

Da ich aber insgesamt 8 einzelne Funktionen je Achse habe, hätte dieser eine FB etwas 50 Äusgänge.

Weil mir das als etwas zu groß erschien wollte ich dann eben 8 einzelne FB´s je Achse machen und damit fing das Problem an.

smartie
 
@ HaDi:
Wenn im Netzwerk 3 (FC1 bzw. FC2) #MX1.PO (temp !) per SFC15 zum Umrichter übertragen wird, ohne vorher beschrieben zu werden, dann kann das (mit viel Glück) nur bei einem Umricher gut gehen.
Genau das war das Problem.

Setze ich den SFC15 (Daten zum Umrichter schreiben) an das Ende der FC1 / FC2 dann funktioniert alles so wie es soll und es werden keine Bits vertauscht.

Aber jetzt muss ich trotzdem noch irgendwie eine Struktur reinbringen.

Soll ich denn jetzt für die Kommunikation mit den einzelnen Achsen einen FC oder einen FB verwenden?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Soll ich denn jetzt für die Kommunikation mit den einzelnen Achsen einen FC oder einen FB verwenden?
Das ist eigentlich Banane ... im Falle eines FB's ersparst du dir "nur" den Globaldaten-DB (oder einen vergleichbaren Speicherbereich ...
Ich persönlich finde da einen FB schöner.

Wenn du 50 Variablen auf deiner Schnittstelle hast, dann ist da irgend etwas auch noch nicht sauber ... wofür so viele Variablen ? Läßt sich da nicht noch etwas sinnvoll zusammenfassen ?

...
 
Hallo Larry,

die 50 Ausgänge pro Achse sind si schon ok.

Ich habe 7 Betriebsarten mit jeweils mindestens 3 Rückmeldungen (AKTIV, FERTIG, GESTOPPT).
Von diesen 7 Betriebsarten lassen sich 6 Stück übereinanderlegen (also gleichzeitig ansteuern) und das wird so auch benötigt.

Und dann gibt es noch einen Status FB der eben die Statusmeldungen der Achse ausgibt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ich glaub ich gebs auf, ich kriegs einfach nicht hin.

Helmut oder Larry könnt ihr mir vielleicht bitte noch einmal für einen Doofi wie mich erklären wie ihr das ganze angehen würdet.

Ich erklär auch noch mal ganz kurz wie ich es mir vorstelle:

Insgesamt gibt es 4 Achsen.

Je Achse soll es 8 Funktionsbausteine für die verschiedenen Funktionen der Servos geben (Referenzieren, Tippen, Drehzahlregelung, .. Status).

Jeder der 8 einzelnen FB´s muss zu jeder Zeit aufgerufen werden können (unabhängig von den anderen).
Einen einzigen großen FB für jede Achse möchte ich ungern machen da dieser etwa 50 Äusgänge haben würde.

Die Daten von und für die einzelnen Achsen müssen per SFC14/15 auf den DP-Slave geschrieben werden.


Ich hab einfach keine Ahnung wie ich das ganze angehen soll und bin mittlerweile echt am verzweifeln. :confused::confused::confused:

smartie
 
Hallo Smartie,
meiner meinung nach solltest du einen FB machen der eine Achse,
komplett verwaltet (ähnlich den FC von mir) den du nur noch über
die Schinttstelle die Aufträge zuteilst. Wie z.b. Tippen, Referenzieren,
Positonieren und was dir noch so einfällt.
Ich glaube nicht das die Schnittstelle so fett wird wie du befürchtest.

Diesen FB kannst du dann wieder als Instanz in den Kopf eines FB's ziehen.
In diesem FB werden dann die Aufträge an den Achs_FB zugeteilt.
So hast du später alles schön zusammen und mußt nicht immer wieder
schauen wer löst jetzt gerade irgendeine Betriebsart aus oder welche
Betriebsart ist gerade Aktiv.

Der Kopf für dein Achsbaustein könnte so aussehen als Beispiel.
Code:
FUNCTION_BLOCK "MX Achse"
TITLE =
VERSION : 0.1


VAR_INPUT
  IO_Adresse : WORD ;    
  Start : BOOL ;    
  Stop : BOOL ;    
  Tippen_plus : BOOL ;    
  Tippen_minus : BOOL ;    
  Ref : BOOL ;    
  Endlage_plus : BOOL ;    
  Endlage_minus : BOOL ;    
  Soll_Pos : DINT ;    
  Soll_Geschw : DINT ;    
END_VAR
VAR_OUTPUT
  Ist_Position : DINT ;    
  Ist_Geschw : DINT ;    
END_VAR
VAR
  PI : STRUCT     
   Motor_steht : BOOL ;    //Statuswort : Motor steht
   Antrieb_betriebsbereit : BOOL ;    //Statuswort : Antrieb ist betriebsbereit
   Antrieb_referenziert : BOOL ;    //Statuswort : Antrieb ist referenziert
   Reserve_1 : BOOL ;    //Statuswort : Reserve
   Bremse_offen : BOOL ;    //Statuswort : Bremse ist offen (falls vorhanden)
   Fehler_FU : BOOL ;    //Statuswort : Fehler Frequenzumrichter
   Warnung_FU : BOOL ;    //Statuswort : Warnung Frequenzumrichter
   Fehler_IEC : BOOL ;    //Statuswort : Fehler MotionController
   Kommunikation_aufgebaut : BOOL ;    //Statuswort : Kommunikation (PLC <> MX) aufgebaut
   FU_freigegeben : BOOL ;    //Statuswort : Frequenzumrichter freigegeben
   Synchron : BOOL ;    //Statuswort : Synchron (zur Interpolierten Lageregelung)
   Sicherer_Halt : BOOL ;    //Statuswort : Sicherer Halt
   Betriebsart_24V : BOOL ;    //Statuswort : Betriebsart 24V (400V Versorgung fehlt)
   Prozessdaten_nicht_breit : BOOL ;    //Statuswort : Prozessdaten nicht bereit
   Reserve : BOOL ;    //Statuswort : Reserve
   SW_Endschalter_belegt : BOOL ;    //Statuswort : Software-Endschalter belegt
   AM_Referenzieren : BOOL ;    //Angewählter AxisMode : Referenzieren
   AM_Drehzahlregelung : BOOL ;    //Angewählter AxisMode : Drehzahlregelung
   AM_Pos_Abs : BOOL ;    //Angewählter AxisMode : Positionieren Absolut
   AM_Pos_Rel : BOOL ;    //Angewählter AxisMode : Positionieren Relativ
   AM_Tippen : BOOL ;    //Angewählter AxisMode : Tippen
   AM_Kurvenscheibe : BOOL ;    //Angewählter AxisMode : Kurvenscheibe
   AM_Synchronlauf : BOOL ;    //Angewählter AxisMode : Synchronlauf
   AM_Reserve : BOOL ;    //Angewählter AxisMode : Reserve
   AM_Referenzieren_fertig : BOOL ;    //AxisMode : Referenzieren fertig
   AM_Drehzahl_erreicht : BOOL ;    //AxisMode : Drehzahl erreicht
   AM_Pos_Abs_inP : BOOL ;    //AxisMode : Positioneren Absolut - In Position
   AM_Pos_Rel_inP : BOOL ;    //AxisMode : Positioneren Relativ - In Position
   AM_Tippen_Sollgeschw_err : BOOL ;    //AxisMode : Tippen - Sollgeschwindigkeit erreicht
   AM_Reserve_1 : BOOL ;    //AxisMode : Reserve
   AM_Reserve_2 : BOOL ;    //AxisMode : Reserve
   AM_Reserve_3 : BOOL ;    //AxisMode : Reserve
   AM_Referenzieren_stop : BOOL ;    //AxisMode : Referenzieren gestoppt
   AM_Drehzahlregelung_stop : BOOL ;    //AxisMode : Drehzahlregelung gestoppt
   AM_Pos_Abs_stop : BOOL ;    //AxisMode : Positionieren Absolut gestoppt
   AM_Pos_Rel_stop : BOOL ;    //AxisMode : Positionieren Relativ gestoppt
   AM_Tippen_stop : BOOL ;    //AxisMode : Tippen gestoppt
   AM_Kurvenscheibe_stop : BOOL ;    //AxisMode : Kurvenscheibe gestoppt
   AM_Synchronlauf_stop : BOOL ;    //AxisMode : Synchronlauf gestoppt
   AM_Reserve_4 : BOOL ;    //AxisMode : Reserve
   Akt_AM_Referenzieren : BOOL ;    //Axis Mode : Referenzieren - Aktiv
   Akt_AM_Drehzahlregelung : BOOL ;    //Axis Mode : Drehzahlregelung - Aktiv
   Akt_AM_Pos_Abs : BOOL ;    //Axis Mode : Positionieren Absolut - Aktiv
   Akt_AM_Pos_Rel : BOOL ;    //Axis Mode : Positionieren Relativ - Aktiv
   Akt_AM_Tippen : BOOL ;    //Axis Mode : Tippen - Aktiv
   Akt_AM_Kurvenscheibe : BOOL ;    //Axis Mode : Kurvenscheibe - Aktiv
   Akt_AM_Synchronlauf : BOOL ;    //Axis Mode : Synchronlauf - Aktiv
   Akt_AM_Reserve_1 : BOOL ;    //Axis Mode : Reserve
   Umrichterstatus : WORD ;    //Umrichterstatus
   Ist_Geschwindigkeit : WORD ;    //Ist-Geschwindigkeit
   Ist_Drehzahl : WORD ;    //Ist-Drehzahl
   Ist_Position_Anwender : DWORD ;    //Ist-Position in Anwendereinheit
   Ist_Position_Modulo : DWORD ;    //Ist-Position in Modulo
   IEC_Fehlernummer : WORD ;    //IEC Fehlernummer
   IEC_Subfehlernummer : WORD ;    //IEC Subfehlernummer
   FU_Fehlernummer : WORD ;    //Frequenzumrichter Fehlernummer
   FU_Subfehlernummer : WORD ;    //Frequenzumrichter Subfehlernummer
   Ist_Drehmoment : WORD ;    //Ist-Drehmoment
  END_STRUCT ;    
  PO : STRUCT     
   Reglersperre : BOOL ;    //Reglersperre
   Freigabe_Schnellstop : BOOL ;    //Freigabe/Schnellstop
   Freigabe_Halt : BOOL ;    //Freigabe/Halt
   Reserve_1 : BOOL ;    //Reserve
   Bremse_oeffnen : BOOL ;    //Bremse öffnen (falls vorhanden)
   Reserve_2 : BOOL ;    //Reserve
   Reset : BOOL ;    //Reset
   Reserve_3 : BOOL ;    //Reserve
   Reserve_4 : BOOL ;    //Reserve
   Tippen_Pos : BOOL ;    //Tippen Positiv
   Tippen_Neg : BOOL ;    //Tippen Negativ
   Reserve_5 : BOOL ;    //Reserve
   Reserve_6 : BOOL ;    //Reserve
   Reserve_7 : BOOL ;    //Reserve
   Reserve_8 : BOOL ;    //Reserve
   SW_Endschalter_AUS : BOOL ;    //Software-Endschalter deaktivieren
   AM_Referenzieren : BOOL ;    //Axis Mode : Referenzieren
   AM_Drehzahlregelung : BOOL ;    //Axis Mode : Drehzahlregelung
   AM_Pos_Abs : BOOL ;    //Axis Mode : Positionieren Absolut
   AM_Pos_Rel : BOOL ;    //Axis Mode : Positionieren Relativ
   AM_Tippen : BOOL ;    //Axis Mode : Tippen
   AM_Kurvenscheibe : BOOL ;    //Axis Mode : Kurvenscheibe
   AM_Synchronlauf : BOOL ;    //Axis Mode : Synchronlauf
   AM_Reserve : BOOL ;    //Axis Mode : Reserve
   STRT_Referenzieren : BOOL ;    //Axis Mode : START - Referenzieren
   STRT_Drehzahlregelung : BOOL ;    //Axis Mode : START - Drehzahlregelung
   STRT_Pos_Abs : BOOL ;    //Axis Mode : START - Positionieren Absolut
   STRT_Pos_Rel : BOOL ;    //Axis Mode : START - Positionieren Relativ
   STRT_Reserve_1 : BOOL ;    //Axis Mode : START - Reserve
   STRT_Kurvenscheibe : BOOL ;    //Axis Mode : START - Kurvenscheibe
   STRT_Synchronlauf : BOOL ;    //Axis Mode : START - Synchronlauf
   STRT_Reserve_2 : BOOL ;    //Axis Mode : START - Reserve
   Tippen_V_Soll : WORD ;    //Tippen - Sollgeschwindigkeit
   Tippen_Acc_Dec : WORD ;    //Tippen - Beschleunigung / Verzögerung
   DZR_V_Soll : WORD ;    //Drehzahlregelung - Sollgeschwindigkeit
   DZR_Acc_Dec : WORD ;    //Drehzahlregelung - Beschleunigung / Verzögerung
   Pos_Abs_V_Soll : WORD ;    //Positionieren Absolut - Sollgeschwindigkeit
   Pos_Abs_Acc_Dec : WORD ;    //Positionieren Absolut - Beschleunigung / Verzögerung
   Pos_Abs_Zielposition : DWORD ;    //Positionieren Absolut - Zielposition
   Pos_Rel_V_Soll : WORD ;    //Positionieren Relativ - Sollgeschwindigkeit
   Pos_Rel_Acc_Dec : WORD ;    //Positionieren Relativ - Beschleunigung / Verzögerung
   Pos_Rel_Distanz : DWORD ;    //Positionieren Relativ - Distanz
   Alle_BA_Ruck : WORD ;    //Alle Betriebsarten : Ruck
  END_STRUCT ;    
END_VAR
BEGIN
NETWORK
TITLE =



END_FUNCTION_BLOCK

Schön wäre auch zu wissen was deine Achsen machen sollen,
soll es eine einfach point to point positonierung sein oder
sollen die Achsen eine Tabelle abfahren usw.

nur nicht aufgeben, hier werden Sie geholfen ;)
 
Hallo Helmut, ich kann mir deinen Code gerade nicht ansehen da ich vom Handy aus online bin.

Aber ich will versuchen die Funktion der Achsen etwas besser zu schildern:

Insgesamt habe ich vier Achsen, drei physikalische und eine virtuelle Achse die als Master weitestgehend die anderen Achsen steuert. Alle Achsen zusammen steuern ein Handling.

Jede Achse hat folgende Betriebsarten, die überlagert werden können und auch müssen:

REFERENZIEREN, DREHZAHLREGELUNG, POSITIONIEREN ABSOLUT, POSITIONIEREN RELATIV, TIPPEN, KURVENSCHEIBE, SYNCHRONLAUF.

Jede der Betriebsarten hat den Eingang START und die Ausgänge AKTIV, FERTIG und GESTOPPT.

Die Betriebsarten Drehzahlregelung, Positionieren Abs und Rel sowie Tippen haben zudem noch die Eingänge Geschwindigkeit, Beschleunigung sowie Zielposition.

Da alle Betriebsarten überlagert werden können müssen diese Werte jeweils übergeben werden.

Dazu kommt dann noch ein Status Baustein der die üblichen Ein- und Ausgänge wie Reglersperre, Istposition, Drehzahl, Störung, etc. hat.
Insgesamt habe ich für eine Achse 49 Ausgänge die ich auf jeden Fall brauche.
Eingänge müssten es etwa 30 sein.
Kann die ja mal morgen hochladen.

smartie
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen,

wie versprochen stelle ich mal die Ein- und Ausgänge alller einzelnen Betriebsarten zusammen:

Referenzieren

Code:
VAR_INPUT
  REFERENZIEREN_START : BOOL ;    
  IO_ADRESSE : INT ;    //IO_Adresse der Achse aus Hardwarekonfiguration
END_VAR
VAR_OUTPUT
  AKTIV : BOOL ;    
  FERTIG : BOOL ;    
  GESTOPPT : BOOL ;    
END_VAR
Drehzahlregelung
Code:
VAR_INPUT
  DREHZAHLREGELUNG_START : BOOL ;    
  GESCHWINDIGKEIT : INT ;    
  BESCHLEUNIGUNG : INT ;    
  IO_ADRESSE : INT ;    //IO_Adresse der Achse aus Hardwarekonfiguration
END_VAR
VAR_OUTPUT
  AKTIV : BOOL ;    
  DREHZAHL_ERREICHT : BOOL ;    
  GESTOPPT : BOOL ;    
END_VAR
Positionieren Absolut
Code:
VAR_INPUT
  POSITIONIEREN_ABS_START : BOOL ;    
  GESCHWINDIGKEIT : INT ;    
  BESCHLEUNIGUNG : INT ;    
  ZIELPOSITION : DINT ;    
  IO_ADRESSE : INT ;    //IO_Adresse der Achse aus Hardwarekonfiguration
END_VAR
VAR_OUTPUT
  AKTIV : BOOL ;    
  POSITION_ERREICHT : BOOL ;    
  GESTOPPT : BOOL ;    
END_VAR
Positionieren Relativ
Code:
VAR_INPUT
  POSITIONIEREN_REL_START : BOOL ;    
  GESCHWINDIGKEIT : INT ;    
  BESCHLEUNIGUNG : INT ;    
  DISTANZ : DINT ;    
  IO_ADRESSE : INT ;    //IO_Adresse der Achse aus Hardwarekonfiguration
END_VAR
VAR_OUTPUT
  AKTIV : BOOL ;    
  POSITION_ERREICHT : BOOL ;    
  GESTOPPT : BOOL ;    
END_VAR

Tippen

Code:
VAR_INPUT
  TIPPEN_POSITIV : BOOL ;    
  TIPPEN_NEGATIV : BOOL ;    
  GESCHWINDIGKEIT : INT ;    
  BESCHLEUNIGUNG : INT ;    
  IO_ADRESSE : INT ;    //IO_Adresse der Achse aus Hardwarekonfiguration
END_VAR
VAR_OUTPUT
  AKTIV : BOOL ;    
  GESCHWINDIGKEIT_ERREICHT : BOOL ;    
  GESTOPPT : BOOL ;    
END_VAR
Kurvenscheibe
Code:
VAR_INPUT
  KURVENSCHEIBE_START : BOOL ;    
  IO_ADRESSE : INT ;    //IO_Adresse der Achse aus Hardwarekonfiguration
END_VAR
VAR_OUTPUT
  AKTIV : BOOL ;    
  GESTOPPT : BOOL ;    
END_VAR
Synchronlauf
Code:
VAR_INPUT
  SYNCHRONLAUF_START : BOOL ;    
  IO_ADRESSE : INT ;    //IO_Adresse der Achse aus Hardwarekonfiguration
END_VAR
VAR_OUTPUT
  AKTIV : BOOL ;    
  GESTOPPT : BOOL ;    
END_VAR
Status
Code:
VAR_INPUT
  REGLERSPERRE : BOOL ;    
  FREIGABE_SCHNELLSTOPP : BOOL ;    
  FREIGABE_HALT : BOOL ;    
  BREMSE_OEFFNEN : BOOL ;    
  RESET : BOOL ;    
  RUCK_ALLE_BA : INT ;    
  IO_ADRESSE : INT ;    //IO_Adresse der Achse aus Hardwarekonfiguration  
END_VAR
VAR_OUTPUT
  MOTOR_STEHT : BOOL ;    
  BETRIEBSBEREIT : BOOL ;    
  REFERENZIERT : BOOL ;    
  BREMSE_OFFEN : BOOL ;    
  FEHLER_FU : BOOL ;    
  WARNUNG_FU : BOOL ;    
  FEHLER_IEC : BOOL ;    
  KOMMUNIKATION_OK : BOOL ;    
  FREIGEGEBEN : BOOL ;    
  SYNCHRON : BOOL ;    
  SICHERER_HALT : BOOL ;    
  BETRIEBSART_24V : BOOL ;    
  PDO_NICHT_BEREIT : BOOL ;    
  SW_ENDSCHALTER_BELEGT : BOOL ;    
  FU_FEHLERNUMMER : WORD ;    
  FU_SUBFEHLERNUMMER : WORD ;    
  IEC_FEHLERNUMMER : WORD ;    
  IEC_SUBFEHLERNUMMER : WORD ;    
  UMRICHTERSTATUS : WORD ;    
  IST_GESCHWINDIGKEIT : INT ;    
  IST_DREHZAHL : INT ;    
  ISTPOSITION_ANWENDER : DINT ;    
  ISTPOSITION_MODULO : DINT ;    
  IST_DREHMOMENT : INT ;    
END_VAR
Damit habe ich insgesamt 25 Eingänge und 43 Ausgänge wenn ich das alles in einen FB packe.

smartie
 
... ich sehe das genau so wie Helmut - ein FB für eine Achse mit allen (wirklich) benötigten Parametern.
Bei diener E-Parameter-Liste will ich mal nichts sagen - das wird schon passen ...
Aber brauchst du die Ausgangsparameter wirklich alle ? Oder sind davon vielleicht einige (oder viele) auch einfach nur "nice-to-have" oder für eine Visu bestimmt. Wenn für Visu dann könnte die auch lesend auf den I-DB zugreifen ...

Gruß
LL
 
Hallo Larry,

ich habe mir jetzt mal einen großen FB gebastelt, der die SFC14 / SFC 15 enthält.

Diesen FB rufe ich je Achse einmal auf und das funktioniert auch ganz gut.

Einige der Ausgangsparameter (wie Fehlernummern) sind in der Tat einfach nur "nice-to-have" die ich in der Visu anzeigen will.
Ich kopiere diese im Moment in einen Datenbaustein, aber ich kann sie natürlich auch nur aus dem DB lesen.

(Aber ist das wirklich "sauber" so? - Ich hätte jetzt eher gedacht das man auf Daten aus einem InstanzDB eher nicht zugreift.)

smartie
 
Zuviel Werbung?
-> Hier kostenlos registrieren
(Aber ist das wirklich "sauber" so? - Ich hätte jetzt eher gedacht das man auf Daten aus einem InstanzDB eher nicht zugreift.)

Wenn du von der visu darauf zugreifst dann tust du das symbolisch und in dem Fall außerdem auch noch "nur lesend" (hoffe ich). Darin sehe ich kein Problem. Wenn du den FB irgendwann mal änderst, dann wird die Zuordnung der Variablen automatisch mit geändert - du brauchst dann nur die Visu-Projektierung neu übertragen ...

Gruß
LL
 
Zurück
Oben