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

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 20 von 20

Thema: Frage(n) zum Datenbaustein

  1. #11
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.618
    Danke
    775
    Erhielt 646 Danke für 492 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von spirit Beitrag anzeigen
    Ok, danke René,

    in der bisherigen Programmierung kann also DB30.DBW0 nicht symbolisch dargestellt werden - hoffe das habe ich richtig verstanden...
    Du kannst nicht symbolisch per AWL drauf zugreifen. im Baustein ist es sehr wohl symbolisch dargestellt.

    kleiner anfangsdenkanstoss.
    Code:
    TYPE "testudt"
    VERSION : 0.1
    
    
    
    
      STRUCT     
       _1 : BOOL ;    
      END_STRUCT ;    
    END_TYPE
    
    
    DATA_BLOCK "dasistndb"
    TITLE =
    VERSION : 0.1
    
    
    
    
      STRUCT     
       DB_VAR0 : "testudt";    //vorläufige Platzhaltervariable
       DB_VAR1 : "testudt";    //vorläufige Platzhaltervariable
       DB_VAR2 : "testudt";    //vorläufige Platzhaltervariable
       DB_VAR3 : "testudt";    //vorläufige Platzhaltervariable
       DB_VAR4 : "testudt";    //vorläufige Platzhaltervariable
       DB_VAR5 : "testudt";    //vorläufige Platzhaltervariable
       DB_VAR6 : "testudt";    //vorläufige Platzhaltervariable
       DB_VAR7 : "testudt";    //vorläufige Platzhaltervariable
      END_STRUCT ;    
    BEGIN
       DB_VAR0._1 := FALSE; 
       DB_VAR1._1 := FALSE; 
       DB_VAR2._1 := FALSE; 
       DB_VAR3._1 := FALSE; 
       DB_VAR4._1 := FALSE; 
       DB_VAR5._1 := FALSE; 
       DB_VAR6._1 := FALSE; 
       DB_VAR7._1 := FALSE; 
    END_DATA_BLOCK
    
    
    DATA_BLOCK DB 2
    TITLE =
    VERSION : 0.0
    
    
     FB 2
    BEGIN
       Wert._1 := FALSE; 
       bTest := FALSE; 
       iTest := 0; 
    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     2 , DB     2 (
               Wert                     := "dasistndb".DB_VAR0);
    
    
    
    
    
    
    END_ORGANIZATION_BLOCK

  2. #12
    Registriert seit
    11.03.2011
    Beiträge
    384
    Danke
    32
    Erhielt 80 Danke für 69 Beiträge

    Standard

    Zitat Zitat von vollmi Beitrag anzeigen
    Wie soll das gehen? das ist eine Struktur.
    Oh! Habe ich übersehen.

  3. #13
    Registriert seit
    05.09.2011
    Beiträge
    176
    Danke
    43
    Erhielt 28 Danke für 20 Beiträge

    Standard

    Zitat Zitat von spirit Beitrag anzeigen

    [...]

    1)
    Wenn man das STRUCT im DB verlängern möchte, so geht das ja einfach über Kopieren & Einfügen. Dabei muss dann aber nachträglich sehr umständlich der Name angepasst werden, wenn es in der gleichen Nummerierung weitergehen soll. Geht das auch anders?
    Hallo!

    Anstelle eines Struct könntest du auch ein Array verwenden , ist dann einfacher erweiterbar (Wert[1]...Wert[n]) ... Soll es ein Struct sein, könnte ich mir vorstellen das über eine AWL-Quelle zu lösen (falls der Tippaufwand ernorm sein sollte). Dazu würde ich mir im Excel eine geeignete Formelstruktur zusammenbasteln und dann einfach per Excel den Zahlenwert erhöhen lassen bis zur gewünschten Grenze (alternativ auch ein Makro).

    Hat dieses Beispiel noch eine tiefgründigere Bedeutung?? Oder wieso willst du die Struktur verlängern?

    mfg

  4. #14
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.618
    Danke
    775
    Erhielt 646 Danke für 492 Beiträge

    Standard

    super genau das nicht mitgeliefert um was es eigentlich ging.
    Code:
    FUNCTION_BLOCK FB2
    
    
    VAR_INPUT
    Wert: testudt;    // Eingang da wird der UDT des DBs angehängt
    iWert AT Wert: INT; // Sicht auf den UDT
    END_VAR
    
    
    VAR_TEMP
    
    
    END_VAR
    VAR
    bTest: BOOL;    // zum testen variable in Bool
    iTest: INT;     // zum testen variable in INT
    END_VAR
    bTest := wert._1; // Hier wird der BOOL in der Struktur kopiert
    iTest := iWert;   // hier wird der Int der Sicht kopiert
    END_FUNCTION_BLOCK

  5. #15
    Avatar von spirit
    spirit ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    12.09.2012
    Beiträge
    961
    Danke
    183
    Erhielt 23 Danke für 22 Beiträge

    Standard

    Supi, lieben Dank vollmi!

    Aja, jetzt wird es klarer - hatte mich schon gewundert; es aber auf mich geschoben.
    Schaue mir das in Ruhe an und versuche es weiterzuentwickeln...


    Zitat Zitat von nutellahase Beitrag anzeigen
    Hat dieses Beispiel noch eine tiefgründigere Bedeutung?? Oder wieso willst du die Struktur verlängern?

    mfg
    Naja, noch ist es ein Übungsprojekt. Aber der tiefere Sinn liegt darin, dass der DB mal den Datenbaustein für Stör- u. Betriebsmeldungen darstellen soll und da wäre es nicht schlecht gewesen, wenn man die Meldungen relativ einfach erweitern hätte können - ohne allzu großen Schreibaufwand!

    Und bei der Abfrage, ob noch eine Störung anliegt, bin ich eben darauf gestoßen, dass "nur" DB30.DBW0 angezeigt wird; anstatt des symbolischen Namens.
    LG
    spirit

  6. #16
    Registriert seit
    05.09.2011
    Beiträge
    176
    Danke
    43
    Erhielt 28 Danke für 20 Beiträge

    Standard

    Zitat Zitat von spirit Beitrag anzeigen
    Supi, lieben Dank vollmi!

    Aja, jetzt wird es klarer - hatte mich schon gewundert; es aber auf mich geschoben.
    Schaue mir das in Ruhe an und versuche es weiterzuentwickeln...




    Naja, noch ist es ein Übungsprojekt. Aber der tiefere Sinn liegt darin, dass der DB mal den Datenbaustein für Stör- u. Betriebsmeldungen darstellen soll und da wäre es nicht schlecht gewesen, wenn man die Meldungen relativ einfach erweitern hätte können - ohne allzu großen Schreibaufwand!

    Und bei der Abfrage, ob noch eine Störung anliegt, bin ich eben darauf gestoßen, dass "nur" DB30.DBW0 angezeigt wird; anstatt des symbolischen Namens.
    Wenn du beim bitweisen Meldeverfahren bleibst würde ich ein Array nehmen ... im Falle einer Erweiterung müssest du nur den Index ändern! Ein (eindimensionales) Array kannst du dir wie eine Liste vorstellen. Oder du reservierst im Vorhinein schon einen gewissen Speicherplatz ... Strukturen enden und beginnen immer an einer Wordgrenze! Hat deine Struktur z.B. nur 6 Bool Variablen und du legst im DB eine weitere Variable (außerhalb der Struktur) an, dann sollte diese Variable im DB bei Adresse 2.0 beginnen.

  7. #17
    Registriert seit
    06.10.2003
    Beiträge
    3.406
    Danke
    448
    Erhielt 502 Danke für 406 Beiträge

    Standard

    Zitat Zitat von nutellahase Beitrag anzeigen
    Wenn du beim bitweisen Meldeverfahren bleibst würde ich ein Array nehmen ... im Falle einer Erweiterung müssest du nur den Index ändern! ...
    Ja, so einfach machen es sich viele Programmierer. Ich sehe das etwas anders. Rein programmtechnisch ist es natürlich schon einfacher, aber..

    Da es sich um Störmeldungen handelt, würde ich schon zu einem STRUCT tendieren, da man in einem STRUCT für jedes Bit einen symbolischen Namen und einen Kommentar vergeben kann. Das ist zwar zunächst ein größerer Aufwand, aber zumindest ist es lohneswert, darüber nach zu denken. Wer will schon ständig beim Programmiren nebenbei nachsehen was ARRAY[49] bedeutet? Auch Kunden, die diese Meldungen an einer Leittechnik später mal verarbeiten, sind darüber sehr erfreut. Was macht man dann, wenn man nur ein ARRAY hat? Richtig, man erstellt nachträglich ein fehlerträchtige Tabelle in Excel zur Dokumentation mit zig-malgen Testen und Vergleichen. Also, mein Fall ist das absolut nicht. Macht man es gleich richtig, so hat man eine einzige Datenbasis in Form eines DBs mit Symbol und Kommentar als Grundlage zum Programmieren, zum Testen und zur Übergabe.
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

  8. Folgende 4 Benutzer sagen Danke zu Onkel Dagobert für den nützlichen Beitrag:

    Aventinus (09.04.2014),ducati (09.04.2014),nutellahase (09.04.2014),PN/DP (09.04.2014)

  9. #18
    Registriert seit
    19.07.2010
    Beiträge
    1.289
    Danke
    213
    Erhielt 267 Danke für 233 Beiträge

    Standard

    Ich sehe das auch so. Ein Melde-DB als Array führt bei mir unmittelbar zu Brechreiz. Vielleicht sollte man dann noch jedesmal wenn man auf ein entsprechendes Bit zugreift einen Zeilenkommentar daneben hinschreiben.
    Und nach 10x
    Code:
    U    "DB_Meldung".Meldung[17]       // Motorschutzschalter FG07
    wird dann die Meldung geändert und ich garantiere dass dann an mindestens 5 Stellen der alte Zeilenkommentar bleibt. Oder eben wie o.g. die Excel-Tabelle nicht immer nachgeführt wird.
    mfG Aventinus

  10. #19
    Registriert seit
    06.10.2009
    Ort
    NRW
    Beiträge
    1.569
    Danke
    63
    Erhielt 258 Danke für 218 Beiträge

    Standard

    Ich sehe das bezüglich der Arrays genauso.
    Da ich aber auch geneigt bin alles symbolisch zu adressieren, stand ich exakt vor der gleichen Frage. Schließlich ist es ja naheliegend, das DB30.DBW0 auf <> 0 zu vergleichen, um ein Störbit zu setzen. Das geht aber nicht, wenn man symbolisch programmieren möchte.
    Ich bin mittlerweile den Weg gegangen, meine Störungen nach Anlagenteilen zu gruppieren. Zu jedem Anlagenteil gibt es einen eigenen DB mit den entsprechenden Störmeldebits.
    Weiter habe ich eine Funktion geschrieben, an die ich den jeweiligen DB antrage. In dieser Funktion wird die Länge des DB ausgelesen um dann in entsprechend vielen Schleifen die Bytes auf <> 0 zu vergleichen. So muss ich mich nicht darum kümmern, wieviele Störmeldewörter abgefragt werden müssen und kann den DB bei Bedarf einfach ergänzen. War ein Bit an, wird ein Störbit gesetzt. So erhalte ich ein Störbit, dass ggf. nur auf den betroffenen Anlagenteil wirkt.
    Das ist vermutlich nicht der "Königsweg", ist aber recht flexibel.
    Meine Motivation läuft nackig mit einem Cocktail über eine Wiese.

  11. Folgender Benutzer sagt Danke zu Tigerente1974 für den nützlichen Beitrag:

    Aventinus (09.04.2014)

  12. #20
    Registriert seit
    19.07.2010
    Beiträge
    1.289
    Danke
    213
    Erhielt 267 Danke für 233 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Tigerente1974 Beitrag anzeigen
    Ich sehe das bezüglich der Arrays genauso.
    Da ich aber auch geneigt bin alles symbolisch zu adressieren, stand ich exakt vor der gleichen Frage. Schließlich ist es ja naheliegend, das DB30.DBW0 auf <> 0 zu vergleichen, um ein Störbit zu setzen. Das geht aber nicht, wenn man symbolisch programmieren möchte.
    Ich bin mittlerweile den Weg gegangen, meine Störungen nach Anlagenteilen zu gruppieren. Zu jedem Anlagenteil gibt es einen eigenen DB mit den entsprechenden Störmeldebits.
    Weiter habe ich eine Funktion geschrieben, an die ich den jeweiligen DB antrage. In dieser Funktion wird die Länge des DB ausgelesen um dann in entsprechend vielen Schleifen die Bytes auf <> 0 zu vergleichen. So muss ich mich nicht darum kümmern, wieviele Störmeldewörter abgefragt werden müssen und kann den DB bei Bedarf einfach ergänzen. War ein Bit an, wird ein Störbit gesetzt. So erhalte ich ein Störbit, dass ggf. nur auf den betroffenen Anlagenteil wirkt.
    Das ist vermutlich nicht der "Königsweg", ist aber recht flexibel.
    Wenn dieser Weg nicht der "Königsweg" ist, dann kommt er meinem Verständnis von sauberer Programmierung schon beängstigend nahe. Mir ist absolut wichtig, dass alles symbolisch programmiert wird. Das Array-Thema hab ich schon erwähnt. Dann bleibt ja nur noch was in der von Tigerente beschriebenen Richtung übrig.
    mfG Aventinus

Ähnliche Themen

  1. Datenbaustein zum laden einer .csv Datei auf einem FTP Server
    Von Hans_J im Forum CODESYS und IEC61131
    Antworten: 3
    Letzter Beitrag: 20.12.2013, 10:17
  2. Fragen zum Datenbaustein
    Von anne im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 11.05.2010, 10:00
  3. Eine Frage zum Datenbaustein...
    Von pinolino im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 24.09.2009, 09:25
  4. Frage zum Vorgehen - Datenbaustein-
    Von RS83 im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 25.06.2007, 14:46
  5. Frage zum Datenbaustein?
    Von MRT im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 09.08.2005, 22:04

Lesezeichen

Berechtigungen

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