Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 6 ErsteErste 1234 ... LetzteLetzte
Ergebnis 11 bis 20 von 52

Thema: Großen FB in 2 Teile splitten - knifflig.

  1. #11
    Registriert seit
    01.10.2007
    Ort
    Waiblingen
    Beiträge
    3.317
    Danke
    767
    Erhielt 536 Danke für 419 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von kiestumpe Beitrag anzeigen
    ...das finde ich dann aber mehr dirty als quick. Würde ich mir nicht antun.
    ich würd es tun, wenn es fremder Code ist, den ich mal ausnahmsweise in eine Maschine reinpressen muss. Ansonsten ist es auf Dauer keine Lösung.

    Aber gut, ich hatte auch schon Bausteine mit mehr als 16k, die hätt ich auch so überhaupt nicht auseinandernehmen können, weil eben die gesamte Datenbasis von ebendieser Logig bearbeitet werden musste. Da hätte ich eventuell dann so gesaut, wenn es unbedingt nicht eine 318 hätt sein dürfen.

    Aber schlecht, ohne Kenntnis des Codes hier Ratschläge zu geben.

    Wie gesagt, wenn Weiterentwicklung geplant, sollte es schon eine saubere Lösung sein - im Zweifel dann eben doch eine 317 statt 315.

    Gruß

  2. #12
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    ... das sehe ich genau so wie Kiestumpe ...

  3. #13
    Registriert seit
    01.10.2007
    Ort
    Waiblingen
    Beiträge
    3.317
    Danke
    767
    Erhielt 536 Danke für 419 Beiträge

    Standard

    ich finds auch schöner, nicht zu murksen. Aber man darf doch mal mit dem Gedanken spielen, wenn so ne Systemgrenze erreicht ist

    Schmiermerker zu S5-Zeiten waren ja auch Murks

  4. #14
    Registriert seit
    24.10.2007
    Ort
    Niederlande
    Beiträge
    673
    Danke
    22
    Erhielt 143 Danke für 135 Beiträge

    Standard

    Wehn du plitte wolte kontte sie ein FB machen und in diese FB wieder kleinere FB's als Instans aufruffe.
    So sind alle daten in eine DB und so kunte sie die daten in de verschiedene unterprogramme auf dieser daten eingreifen.

  5. #15
    Avatar von rs-plc-aa
    rs-plc-aa ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    07.11.2004
    Beiträge
    697
    Danke
    69
    Erhielt 64 Danke für 48 Beiträge

    Standard

    Hallo,

    erst mal riesen Dank für die vielen Antworten !

    Ich bin gestern unmittelbar nach threaderöffnung zur Baustelle gefahren und kam auch erst um 1:00 Uhr (am) wieder zurück, hatte dann zwar neugierigkeitshalber die Antworten noch überflogen aber da die Streichhölzer an meinen Augen zu knicken drohten habe ich das noch mal verschieben müssen...

    Da doch ein paar verschiedene Ansätze genannt wurden möchte ich jetzt noch mal kurz versuchen die Problemstellung besser einzugrenzen - sagt Bescheid wenn ich noch was vergessen habe.

    Die Schrittkette funktioniert nach dem Prinzip des Vergleichens auf gleich, vielleicht wäre eine Sprungleiste besser aber da habe ich nicht so viel Spielraum mit der Nummernvergabe (reserve, Gruppierung, etc.)

    Ich habe mir natürlich auch noch jede Menge Gedanken dazu gemacht, habe jetzt gestern zwar eine 317er eingebaut weil es pressiert hat aber die ist auch nachher gleich wieder gewechselt.

    Ich wollte es mal so angehen:

    - Ähnliche Schrittreihen zusammenfassen und mit Bits den Grund des Schritts speichern um am Ende richtig verzweigen zu können.
    z.B. ist ein Abschaltevorgang oft gleich - nur der Grund und das anschließende Ziel ein anderes - so könnte der Vorgang vereinheitlicht werden und mit hilfe des Grundes unterschieden werden wohin es anschließend geht.

    Das Problem scheint auf jeden Fall die menge an Code zu sein und nicht die Schnittstelle (weswegen auch der IDB nicht zu groß ist sondern nur der FB)

    - Es gibt 2 Arten von Schrittreihen -> Verschiedene Start- und Stopreihen und den Dauerbetrieb

    Mein Gedanke jetzt: Start/Stop+Allgemeines vom Dauerbetrieb trennen (ob das dann ca. 50/50 ist muss ich mal noch sehen).

    Dann müssten die 2 FBs in etwa so aussehen:

    1.) Gemeinsame (bzw. identisch angelegte) IN, IN_OUT, Temp
    2.) Alles was vorher STAT war in einen Global DB legen und beiden als IN_OUT anhängen - dies beinhaltet u.A. auch die Schrittnummer.
    3.) Eingebettete Multiinstanz FBs wie z.B. der SFB4 (TON) bei beiden anlegen (separat)

    Bleibt nun nur zu prüfen ob das dann auch funkt...

    Wichtig ist eben nur die gemeinsame Schrittnummer da immer nur ein Schritt scharf sein darf und jederzeit durch ein Abbruchereignis o.Ä. in den Stop-Teil verzweigt werden können muss...

    Ach so - zu dem Temp Bereich fällt mir gerade noch was ein:

    Hier speichere ich DB Nummern zwischen um mit internen AUF DBxxx Befehlen was machen zu können.
    Diese müssten auf jeden fall am Anfang von beiden FB immer neu versorgt werden!

    Grund ist daß der FB mehrmals mit verscheidenen IDBs aufgerufen wird um gleichartige Maschinen getrennt von einander laufen lassen zu können - aber das ist wieder eine andere Geschichte - wobei hier mit der 315er sowieso nicht mehr als 2 Aufrufe gehen werden da sonst der OB1 an seine 16kB Grenze stößt und dieser kann wohl unmöglich gesplittet weden
    RS (rs-plc-aa)
    ______________________________________________
    Morgen ist Heute Gestern...
    ______________________________________________
    Installierst du noch - oder Arbeitest du schon ?
    ______________________________________________

  6. #16
    Registriert seit
    03.01.2006
    Ort
    Im sonnigen Süden von Österreich!
    Beiträge
    1.377
    Danke
    227
    Erhielt 183 Danke für 168 Beiträge

    Standard

    Zu dem Temp - Bereich:
    Den kannst du ja in den Stat bereich verschieben und dann hats du da keine Probleme mehr und den Stat bereich brauchst du nicht auslagern in einen global DB. Du kannst ja dann deinen zusatz FB mit UC / CC aufrufen und dann brauchst du keine Parameter übergeben! Du musst nur immer Aufpassen das der Deklarationsteil in beiden FB's gleich ist!

  7. #17
    Avatar von rs-plc-aa
    rs-plc-aa ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    07.11.2004
    Beiträge
    697
    Danke
    69
    Erhielt 64 Danke für 48 Beiträge

    Standard

    D.h. es wird wenn ich den zweiten FB mit gleicher Schnittstelle direkt nach dem ersten mit UC/CC aufrufe die Schnittstelle exakt gleich belegt ?

    Dann könnte dieser Ansatz wohl der erste Testkandidat werden!
    RS (rs-plc-aa)
    ______________________________________________
    Morgen ist Heute Gestern...
    ______________________________________________
    Installierst du noch - oder Arbeitest du schon ?
    ______________________________________________

  8. #18
    Registriert seit
    03.01.2006
    Ort
    Im sonnigen Süden von Österreich!
    Beiträge
    1.377
    Danke
    227
    Erhielt 183 Danke für 168 Beiträge

    Standard

    So habe dir das mal Ausprogrammiert:

    Code:
    FUNCTION_BLOCK FB 11
    TITLE =
    VERSION : 0.1
    
    VAR_INPUT
      Ein : BOOL ; 
      Ein_Word : WORD ; 
    END_VAR
    VAR_OUTPUT
      Aus : BOOL ; 
      Aus_Word : WORD ; 
    END_VAR
    VAR
      STAT_WORD : WORD ; 
      HM_FP_EIN : BOOL ; 
      FP_EIN : BOOL ; 
      STAT_AUS : BOOL ; 
    END_VAR
    BEGIN
    NETWORK
    TITLE =
          U     #Ein; 
          FP    #HM_FP_EIN; 
          =     #FP_EIN; 
    NETWORK
    TITLE =
          U     #FP_EIN; 
          X     #STAT_AUS; 
          =     #STAT_AUS; 
    NETWORK
    TITLE =
          U     #STAT_AUS; 
          SPBN  next; 
          L     #Ein_Word; 
          T     #STAT_WORD; 
    next: NOP   0; 
    END_FUNCTION_BLOCK
    FUNCTION_BLOCK FB 12
    TITLE =
    VERSION : 0.1
    
    VAR_INPUT
      Ein : BOOL ; 
      Ein_Word : WORD ; 
    END_VAR
    VAR_OUTPUT
      Aus : BOOL ; 
      Aus_Word : WORD ; 
    END_VAR
    VAR
      STAT_WORD : WORD ; 
      HM_FP_EIN : BOOL ; 
      FP_EIN : BOOL ; 
      STAT_AUS : BOOL ; 
    END_VAR
    BEGIN
    NETWORK
    TITLE =
          U     #STAT_AUS; 
          =     #Aus; 
    
    NETWORK
    TITLE =
          U     #Aus; 
          SPBN  next; 
          L     #STAT_WORD; 
          T     #Aus_Word; 
    next: NOP   0; 
    END_FUNCTION_BLOCK
    FUNCTION_BLOCK FB 10
    TITLE =
    //Von Aussen kann der Zusammengesetzte Baustein wie ein gnzer Betrachtet werden
    VERSION : 0.1
    
    VAR_INPUT
      Ein : BOOL ; 
      Ein_Word : WORD ; 
    END_VAR
    VAR_OUTPUT
      Aus : BOOL ; 
      Aus_Word : WORD ; 
    END_VAR
    VAR
      FB_Test : FB 11; 
    END_VAR
    VAR_TEMP
      Rette_AR2 : DINT ; 
    END_VAR
    BEGIN
    NETWORK
    TITLE =
          CALL #FB_Test (//Die Ausgänge von diesem Baustein nicht verwenden
               Ein                      := #Ein,
               Ein_Word                 := #Ein_Word);
    //Sichere Adressregister 2
          TAR2  ; 
          T     #Rette_AR2; 
    //Erzeuge Bausteinaufruf
          L     P##FB_Test; //Lade Pointer von Variable
          L     2#111111111111111111111111; 
          UD    ; //Maskiere Byte 0 von Pointer aus
          L     2#10000100; 
          SLD   24; 
          XOD   ; //Maskiere Pointer auf DB
          LAR2  ; //Pointer muss an das AR2 übergeben werden wegen Multiinstanz
          UC    FB    12; //Bausteinaufruf
    //Schreibe AR2 zurück
          L     #Rette_AR2; 
          LAR2  ; 
    // Hier können jetzt die Ausgänge von dem Baustein Abgefragt werden
          U     #FB_Test.Aus; 
          =     #Aus; 
          L     #FB_Test.Aus_Word; 
          T     #Aus_Word; 
     
     
    
    END_FUNCTION_BLOCK
    DATA_BLOCK DB 10
    TITLE =
    VERSION : 0.0
     FB 10
    BEGIN
       Ein := FALSE; 
       Ein_Word := W#16#0; 
       Aus := FALSE; 
       Aus_Word := W#16#0; 
       FB_Test.Ein := FALSE; 
       FB_Test.Ein_Word := W#16#0; 
       FB_Test.Aus := FALSE; 
       FB_Test.Aus_Word := W#16#0; 
       FB_Test.STAT_WORD := W#16#0; 
       FB_Test.HM_FP_EIN := FALSE; 
       FB_Test.FP_EIN := FALSE; 
       FB_Test.STAT_AUS := FALSE; 
    END_DATA_BLOCK
    ORGANIZATION_BLOCK OB 1
    TITLE = "Main Program Sweep (Cycle)"
    VERSION : 0.1
    
    VAR_TEMP
      OB1_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
      OB1_SCAN_1 : BYTE ; //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
      OB1_PRIORITY : BYTE ; //Priority of OB Execution
      OB1_OB_NUMBR : BYTE ; //1 (Organization block 1, OB1)
      OB1_RESERVED_1 : BYTE ; //Reserved for system
      OB1_RESERVED_2 : BYTE ; //Reserved for system
      OB1_PREV_CYCLE : INT ; //Cycle time of previous OB1 scan (milliseconds)
      OB1_MIN_CYCLE : INT ; //Minimum cycle time of OB1 (milliseconds)
      OB1_MAX_CYCLE : INT ; //Maximum cycle time of OB1 (milliseconds)
      OB1_DATE_TIME : DATE_AND_TIME ; //Date and time OB1 started
    END_VAR
    BEGIN
    NETWORK
    TITLE =
          CALL FB    10 , DB    10 (
               Ein                      := M      1.0,
               Ein_Word                 := MW    12,
               Aus                      := M      1.1,
               Aus_Word                 := MW    14);
    
    END_ORGANIZATION_BLOCK
    Ich finde da ist nicht recht viel kniffeliges drann.
    Den FB 10 kannst du von Aussen dann behandeln wie einen normalen Baustein!
    Das einzige auf das du achten musst ist das du die Ausgänge der des Aufgeteilten FB's erst nach dem zweiten FB aufruf hinausschreibst da du sonst immer eine Aktualisierung der Ausgänge nach dem ersten FB hast also mitten im Ursprünglichen Programm!

    Zur Bearbeitung des ursprünglichen FB's würde ich das so machen das ich als Quelle oder sonstiges den ganzen FB abgelegt habe da drinnen die änderungen mache danach den FB 2 mal kopiere (in die Aufgerufenen Bausteinnamen) und dann brauchst du nur mehr im ersten FB die untere hälfte und im zweiten FB die obere hälfte kopieren. Und natürlich die zusätzlichen Ausgänge im Übergeordneten FB nachtragen!

    godi

  9. #19
    Avatar von rs-plc-aa
    rs-plc-aa ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    07.11.2004
    Beiträge
    697
    Danke
    69
    Erhielt 64 Danke für 48 Beiträge

    Standard

    Das Problem mit den Ausgängen habe ich schon mal umgangen in dem ich einfach keine verwende - nur IN_OUT, da die meisten eh in gemeinsam benutzten (global-) DB Bereichen liegen.

    Das mit den Temp in STAT verschieben wird wohl - zumindest in bezug auf die DB Nummern nicht gehen weil sonst die Meldung kommt daß hier keine statischen Variablen verwendet werden durfen, also die Anweisung:

    Code:
    // DB Nummern für Zugriffe zuordnen und temporär zwischenspeichern:
          L     #DB_Nr_Laufzeitinfo        // IN
          T     #DB_Nr_Laufzeitinfo_Int  // TEMP
          L     #DB_Nr_Reserve_1
          T     #DB_Nr_Reserve_1_Int
          L     #DB_Nr_Reserve_2
          T     #DB_Nr_Reserve_2_Int
          L     #DB_Nr_Reserve_3
          T     #DB_Nr_Reserve_3_Int
     
    ...
     
          AUF   DB [#DB_Nr_Laufzeitinfo_Int] // kann NUR im Temp liegen!
          L     DBD    0
          L     L#1
          +D    
          T     DBD    0
    ... nicht funktioniert

    Aber das ließe sich ja elegant umschiffen wenn man immer im ersten Netzwerk den oberen Code (vor ... ) hat.

    Ich bin gerade schon am testen, schaue mir das Beispiel aber auch noch an...
    RS (rs-plc-aa)
    ______________________________________________
    Morgen ist Heute Gestern...
    ______________________________________________
    Installierst du noch - oder Arbeitest du schon ?
    ______________________________________________

  10. #20
    Registriert seit
    11.10.2006
    Ort
    Verden (Aller)
    Beiträge
    532
    Danke
    31
    Erhielt 58 Danke für 49 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Man kann ja aber eine Variable DB_Nummer im TEMP-Bereich einrichten und jedesmal neu zuweisen, vor dem Gebrauch. Das ist vor allem sinnig, wenn die DB-Aufschläge nur ein- oder zweimal vorkommen. Wozu sollte man das ganze Programm die DB-Nummern einzeln herumschleppen?

    Ich selbst gehe auch lieber den Weg:

    L DB100.DBD10
    T WEISSDERGEIER

    Das hat meist den Vorteil, daß der Ladebefehl mit Symbolik ist (sofern vorhanden)

    L DB_Kaugummi.Durchkauzaehler
    T WEISSDERGEIER

    Oder so:

    LAR1 P##DB_Kaugummi.Durchkauzaehler
    L w[AR1,P#4.0]
    T DB_Nummer //temp-Variable

    AUF DB[DB_Nummer]

    L D[AR1,P#0.0]
    T WEISSDERGEIER

    dann kann man mit dem Offset (P#0.0) spielen und solcherlei Dinge.
    "Ein lahmer Drecksplanet ist das, ich habe nicht das geringste Mitleid" (Prostetnik Vogon Jeltz)

Ähnliche Themen

  1. Profibus-Sensor - Signal splitten.
    Von DPuser im Forum Feldbusse
    Antworten: 14
    Letzter Beitrag: 01.08.2011, 10:51
  2. S7 in Programmteile splitten
    Von Servernexus im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 26.05.2011, 20:52
  3. AG_Recv /Datenstring Splitten
    Von s_alpen im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 20.10.2010, 10:26
  4. Ich hab vom großen S die schnauze voll
    Von stift im Forum Stammtisch
    Antworten: 38
    Letzter Beitrag: 07.02.2010, 20:05
  5. Chinch Ausgang splitten
    Von Markus im Forum Stammtisch
    Antworten: 6
    Letzter Beitrag: 19.09.2005, 23:26

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •