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

Ergebnis 1 bis 5 von 5

Thema: Datenhandling - Zugriff von vielen FCs & FBs auf die gleichen Daten

  1. #1
    Registriert seit
    28.03.2009
    Beiträge
    83
    Danke
    16
    Erhielt 4 Danke für 4 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hi,
    versucht euch mal folgendes Scenario vorzustellen, wie würdet ihr das vereinfachen/verbessern?!

    Wir haben hier ein Altprojekt, welches ich als Referenz für ein Musterprojekt nehmen soll.
    Es handelt sich um eine Anlage mit dutzenden und identischen Anlagenkomponenten (sagen wir mal Fahrzeuge dazu), deren Daten in je einem DB abgelegt sind (ca. 1Kbyte mit Status, Fehler, Aufträge, Fahrroute, Fahrziele, etc...)

    Es gibt zudem dutzende FCs und FBs mit Teilfunktionen (Strategien, Auswertungen, Arithmetik, Schnittstellen/Kommunikation, etc..) die sequentiell
    aufgerufen werden.
    Je nach Eingangsparameter (FC:IN FahrzeugNr as INT), wird folgendermaßen gearbeitet.
    Code:
     
          L     #Fahrzeug_Nr //Das ist der Eingansparameter
          +     100 //Die FahrzeugDBs liegen im Bereich 101-199
          T     #FZG_DB
          AUF   DB [#FZG_DB]
     
    L DBX....
    L DBW....
    ...
    ..
    Um das Ganze etwas übersichtlicher zu gestalten, hat sich ein ehemaliger Kollege die Mühe gemacht, TeilStrukturen der Fahrzeug-DBs im temporären Stack der jeweiligen FCs nachzubilden, damit er:
    Code:
    //Rangieren der Nutzdaten in den temp. Stack
    // Ziel_Soll
          L     DBD  300                 
          T     LD    20                    
    // Ziel_Routing
          L     DBD  304                    
          T     LD    24 
     
    ...Hier kommt das eigentliche Programm...
     
    //ZurückRangieren des temp. Stack in das entsprechende DB
    // Ziel_Soll
      L     LD    20                    
      T     DBD  300                 
    // Ziel_Routing
      L     LD    24 
      T     DBD  304
    wenigstens mit sinnvollen Bezeichnungen der temporären Variablen arbeiten kann, anstatt mit DBX, DBW, DBB und DBD.

    Allerdings, über den Querverweis findet man nichts, erst recht nicht, wenn man Doppelwortweise über den Temp.Datenstack hin-und herrangiert hat.

    Mit einer symbolischen Adressierung kann man es leider in diesem Fall vergessen.
    Ich habe lange überlegt und nachgeforscht, ob es eine Alternativmethode existiert, mit dem man diese Aufgabenstellung meistern und sich die Flexibilität beibehalten kann. Ich kenne nur zwei, welche mir aber auch nicht so richtig gefallen.
    • -Den Umweg über ein Schmier-DB. Sprich, am Anfang des jeweiligen Funktion ein Blockmove von NutzDB auf SchmierDB. Dann wird im Programm symbolisch mit den Adressen des SchmierDBs gearbeitet, um dann am Schluss wieder ein Blockmov von SchmierDB auf NutzDB zu machen.
      Vorteil: Querverweis funktioniert, übersichtlicher
      Nachteil: Zykluszeit und not very fashion

    • Die UC/CC Methode, bei der die untergeordneten FBs immer die Instansdaten des übergeordneten FBs mitbenutzen.
      FB_Fahrzeug1
      UC FB_FunktionA
      UC FB_FunktionB

      FB_Fahrzeug2
      UC FB_FunktionA
      UC FB_FunktionB

      Vorteil: Gibt es einen?
      Nachteil: Querverweis funktioniert genausowenig

    Habt ihr ideen?
    Zitieren Zitieren Datenhandling - Zugriff von vielen FCs & FBs auf die gleichen Daten  

  2. #2
    Registriert seit
    23.04.2009
    Ort
    Allgäu
    Beiträge
    3.042
    Danke
    241
    Erhielt 863 Danke für 617 Beiträge

    Standard

    Zitat Zitat von logo78 Beitrag anzeigen
    -Den Umweg über ein Schmier-DB. Sprich, am Anfang des jeweiligen Funktion ein Blockmove von NutzDB auf SchmierDB. Dann wird im Programm symbolisch mit den Adressen des SchmierDBs gearbeitet, um dann am Schluss wieder ein Blockmov von SchmierDB auf NutzDB zu machen.

    • Vorteil: Querverweis funktioniert, übersichtlicher
      Nachteil: Zykluszeit und not very fashion
    Also ich würde auch diese Variante empfehlen.
    Das kopieren auf die Lokaldaten finde ich nicht so gut.

    Und von wegen Zykluszeit, jetzt kopierst du ja auch alle Daten einzeln auf den Stack, der Blockmove macht ja auch nichts anderes.
    Gruß
    Paule
    ----------------------------------------------------------------------------
    > manchmal verliert man und manchmal gewinnen die anderen <

  3. #3
    Registriert seit
    19.07.2010
    Beiträge
    1.288
    Danke
    213
    Erhielt 267 Danke für 233 Beiträge

    Standard

    Du könntest die Strukturen umstellen.
    Stell dir Deine Datenhaltung als Tabelle vor. Jetzt hast du als Spalten die DB´s (für jedes Fahrzeug einen) und die einzelnene Daten hast du in den Zeilen.
    Wenn du das ganze umdrehst hast du einen DB mit Fahrzeugnummern, einen mit Routen, einen mit Aufträgen usw.

    Das ganze deklarierst du als Array. Je nach dem was du brauchst, Fahrzeugnummer als Int, Aufträge als UDT - was weiß ich.
    Über den Index kannst du die passenden Daten wieder zusammenführen.
    mfG Aventinus

  4. #4
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.745
    Danke
    209
    Erhielt 420 Danke für 337 Beiträge

    Standard

    Kannst auch einen UDT oder Struct als In Paremter machen, und von ausen die Daten an diese Anlegen, aber das dauert zumindest auf einer 315 weitaus länger als ein Blockmove.

    Also Ich definiere eigendlich meist einen Pointer als IN, lege die Daten von ausen darauf, und kopier mirs in meinem FC in Lokaldaten. In den Lokaldaten verwende Ich dann denn gleichen UDT wie im DB!
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten
    Zitieren Zitieren UDT als IN Parameter  

  5. #5
    logo78 ist offline Benutzer
    Themenstarter
    Registriert seit
    28.03.2009
    Beiträge
    83
    Danke
    16
    Erhielt 4 Danke für 4 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    @Aventinus,
    ich verstehe was du meinst, das könnte man machen, wenn die Menge der FahrzeugDaten überschaubar wären und wenn man von vornerein wüsste, dass jede Funktion nur einen bestimmten 'Range' bräuchte.
    Aber wir haben hier DBs mit je 1kbyte! an Daten mit allen möglichen DatenTypen, u.U. das Ganze dutzende Male (viele Fahrzeuge) und jede Funktion muss auf das gesamte Datenspektrum des jeweiligen Fahrzeugs zugreifen können.
    Das kann leider so nicht funktionieren.

    @Jochen,
    aus dem o.G. Grund fällt die Möglichkeit mit Eingangsparametern aus.
    Das wäre wohl bei jeder Funktion ein UDT mit 1Kbyte
    Ein ziemlicher Overhead.

    Außerdem muss ich ja Werte lesen und auch beschreiben können, somit müsste die hässlichen In/Out benutzen, welches aber auch nicht geht,
    da beim sequentiellen abarbeiten/durchreichen der Daten, jeder FC die nicht benutzten Datenbereiche 'nullt', da ja Siemens intern auch 'nur' den Lokalstack(in/out) auf den Datenbereich rangiert.
    Geändert von logo78 (01.09.2010 um 06:12 Uhr)

Ähnliche Themen

  1. Zugriff auf Daten in FB
    Von Ralle im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 20.03.2011, 12:25
  2. Zugriff auf temporäre Daten in OB
    Von Holger Levetzow im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 11.05.2010, 09:48
  3. Zugriff einer CPU auf Daten 2. CPU über LAN
    Von Nico99 im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 06.02.2010, 12:17
  4. Datenhandling
    Von mbredi im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 15.02.2006, 15:11
  5. SCL direkter Zugriff auf DB Daten möglich?
    Von plc_tippser im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 20.01.2005, 14:36

Lesezeichen

Berechtigungen

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