Step 7 Frage(n) zum Datenbaustein

spirit

Level-1
Beiträge
961
Reaktionspunkte
23
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Ihr,

brauche bitte mal wieder eure Hilfe...

Folgendes Testbeispiel ist gegeben:


DB.jpgFC.jpg



Dazu hätte ich folgende Fragen:

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?

2)
Warum wird im FC / Netzwerk 3 nicht auch der Name (Melde_DB), so wie in Netzwerk 2, angezeigt? Hat das was mit dem Zugriff auf die Daten zu tun?


Vielen Dank!
 
zu 2)
Es muss das DB30.DBW0 einen symbolischen Namen haben.
Für das Projekt muss "Symbolik führend" eingestellt sein (Eigenschaft des Projektes).
Ausserdem kommt es auf die Einstellungen in Editor unter Extras, Ansicht an.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die Antwort miami;

aber der DB30 hat ja in der Symboltabelle einen Namen (Melde_DB) erhalten. Wird in Netzwerk 2 ja auch angezeigt; nur in NW 3 eben nicht!
 
Für DB30.DBW0 ist kein Symbol existent, dann kann auch keins dargestellt werden. Bei DB30.DBX0.0 sieht das anders aus, hier gibt's "Melde_DB".Wert._1.

Ein Teils symbolische, teils absolute Adressierung stellt der Simatic Manager nicht dar, deshalb gibt's kein "Melde_DB".DBW0.
 
Zuletzt bearbeitet:
Aja ok hovonlo,

das heißt es liegt also an DBW0, für das kein Symbol existiert?

Somit gibt es dann wohl auch keine Abhilfe...
 
Du könntest einfach ein Symbol anlegen...

Sorry für die doofe Frage, wo müsste das Symbol angelegt werden - Symboltabelle geht ja nicht. Im DB?

Und noch etwas: Können eigentlich auch die Kommentare aus dem DB im FC eingeblendet werden, bzw. wo muss das eingestellt werden?


Danke!
 
Du könntest einfach ein Symbol anlegen...

Wie soll das gehen? das ist eine Struktur.

_1 ist Teil von dbw0 (Struktur)

Man könnte statt in AWL aber in SCL programmieren.

Dann die Struktur als Ganzes an den Baustein übergeben.
Sicht drauf legen. dann den bitzugriff wie gehabt, aber nicht direkt auf den DB sondern auf die Schnittstelle des Bausteins.
dann den Wortzugriff über die Sicht ebenfalls symbolisch.

Dann kannst du an der Struktur (welche ich über UDT vorgeben würde) ändern was du willst im Baustein ändert sich dann sowieso nichts und beim Aufruf wird dann die Adresse der ganzen Struktur übergeben.

mfG René
 
Ok, danke René,

in der bisherigen Programmierung kann also DB30.DBW0 nicht symbolisch dargestellt werden - hoffe das habe ich richtig verstanden... :confused:


Das mit SCL probiere ich aus... danke!


Danke @ Tigerente!
 
Ok, danke René,

in der bisherigen Programmierung kann also DB30.DBW0 nicht symbolisch dargestellt werden - hoffe das habe ich richtig verstanden... :confused:

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
 
[...]

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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Supi, lieben Dank vollmi!

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


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.
 
Supi, lieben Dank vollmi!

Aja, jetzt wird es klarer - hatte mich schon gewundert; es aber auf mich geschoben. :wink:
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.
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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.
 
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.
 
Zurück
Oben