Step 7 Datenbaustein unbekannter Größe druchsuchen / PLC Datentypen verwenden aber wie?!

hizer21

Level-1
Beiträge
8
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag die Damen und Herren!,

verwende: tia portal v14, CPU 1513f-1, wincc Flex panel KTP900F

also ich habe folgendes problem:

- ich versuche grad unser störmeldesystem auf TIA anzupassen bzw es evtl. generell neu zu schreiben.

alt: wir hatten ein DB (sagen wir DB100) in dem struct mäßig je nach Station ST01,ST02 wieder rum Structs enhalten waren.Diese waren je für die diese Station gültig nach Technologien gegliedert. Diese hatten dann jeweils 16 Bits 1INT für meldungen reserviert. Das ganze lief über Bitmeldeverfahren mit WinnCC flex. Dieser aufbau kam aus einem C-Programm als quelle der nur noch übersetzt werden musste. Diese wurden dann am Technolgiebaustein verschaltet.
Code:
stStörungen
    stST01
        stBandabsenkung
          xBandabsenkungNIO      Bool
         .............usw
Störungfindung: im DB100 waren dann alle Bits enthalten die eine störung lieferten. Habe das ganze mit einem FC durchsucht (ANY_pointer) und dann ein sammelbit ausgegeben.

Soweit so gut. jetzt in TIA :D

Da ja der neue Technologiehype mit den UDT Datentypen aufkommt, wäre es ja sinnvoll für jede Technologie eine eigene Stör UDt anzulegen die und diese wiederum im DB100 anzulegen somit ich meine Störungen alle beisammen habe. nur ist die Frage wie durchsuche ich jetzt meinen DB ?

Da: - unterschiedliche UDT Datentypen
- genaue Anzahl nicht bekannt
- Baustein soll von außen parametrierbar sein
- kein DB zugriff innerhalb des FC's = Standartbaustein

Nicht verwendet sollen:
- Program_Alarm und alle zugehörigen Komponenten da :
- wenn 100 Störungen = 100 multiinstanzen = bei kleiner CPU 1511 = Zykluszeit einer Mulitinstanz ca 100 microsek (kann man sich ausrechnen)
- sprachumschaltung nur per textlsiten möglich = alles unnötig

vorrausetzungen an den FC: - optimierter Baustein kein alten Awl Anypointeransätze


Jetzt ist die Frage wie realisiert man diesen ?
Sollte man den aufbau des DB 100 ganz verändern? wenn ja wie?
wie soll dann die auswertung laufen damit ich mein sammelstörungsbit bekomme?
zum anderen sollte dies einmal aus programmiert werden und nur der DB 100 veränderbar sein. Ohne das ich eine Stelle des Programms anfassen muss.

Bin auch für komplett andere Möglichkeiten offen...... die Parametrierung am Technologiebaustein durch übergabe einer Struct,Array oder weiteres sollte aber gegeben sein!

danke schonmal im vorraus!
 
Zuletzt bearbeitet:
Moin,
meiner Meinung nach schreibst du den Program_Alarm zu schnell ab. Dinge von vornherein auszuschließen ist meiner Erfahrung nach nicht unbedingt sinnvoll, gerade wenn man neu entwickeln muss oder möchte... aber das war ja nicht deine Frage ;)

Grundsätzlich ist es schwierig etwas wiederholt zu bearbeiten, wenn es keine Wiederholungen gibt. Also wenn man 10 unterschiedliche UDTs hat, habe ich 10 mal unterschiedlichen Code zum auswerten und bearbeiten. Eine Schleife ist von daher nicht sinnvoll. Also würde ich eher versuchen deine Structs oder UDTs dahingehend zu generalisieren, dass sie identisch sind und du diese dann in einem Array ablegen kannst. Also wo ist der "kleinste gemeinsame Nenner" deiner Structs/UDTs - kann man diesen Teil vielleicht vom Rest separieren, in ein Array packen und getrennt vom Rest bearbeiten? Und erst nach der Bearbeitung wieder einen Bezug zum "sich unterscheidenden Teil" herstellen?
Vielleicht kannst du ja mal zwei deiner Structs/UDTs hochladen und dann schauen wir mal was uns dazu einfällt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also: gemeinsamer Nenner :
- jede UDT beinhaltet 16 Bits = 1 INT für's BItmeldeverfahren da ja noch der kack tausch in WinCCflex ansteht, sprich 1 byte mit 2 byten usw.

theorie:
-ich habe bisher nur die einzelnen Bool Variablen anders bezeichnet je nach Technologie, wie z.B. Zylinder oder n Präger, dies könnte man generallisieren ok da würde ich mit gehen, sprich jede UDT ist gleich auch mit bezeichnung
( ist ja für uns erstmal nicht wichtig da die automatische zuordnung sowieso ausm c programm kommt und der anwender nicht darüber nachdenken muss)

das große Problem was ich dabei sehe ist die Unterteilung im Programm, sprich Wenn ich sagen wir mal ein array habe mit 100 einträgen mit der struct störung (16Bits), woher weiß der benutzer wo etwas zugehört ?

es sollte ja im DB halb wegs so hinterlegt werden

Unbenannt.JPG parametrierung am technologiebaustein
 
Also: gemeinsamer Nenner :
- jede UDT beinhaltet 16 Bits = 1 INT für's BItmeldeverfahren da ja noch der kack tausch in WinCCflex ansteht, sprich 1 byte mit 2 byten usw.
16 Bits = 1WORD in einem Interger stehen Zahlen ;)

theorie:
-ich habe bisher nur die einzelnen Bool Variablen anders bezeichnet je nach Technologie, wie z.B. Zylinder oder n Präger, dies könnte man generallisieren ok da würde ich mit gehen, sprich jede UDT ist gleich auch mit bezeichnung
( ist ja für uns erstmal nicht wichtig da die automatische zuordnung sowieso ausm c programm kommt und der anwender nicht darüber nachdenken muss)
das klingt gut und macht es einfacher.

das große Problem was ich dabei sehe ist die Unterteilung im Programm, sprich Wenn ich sagen wir mal ein array habe mit 100 einträgen mit der struct störung (16Bits), woher weiß der benutzer wo etwas zugehört ?
Im Post #1 sprichst du von Stationen ST01, ST02 usw. Könnte man nicht jeder Station sein zugehöriges Array-Element via In/Out zum Beispiel übergeben? Also Station 1 bekommt StörDB.StörArray[1] und Station 2 StörDB.StörArray[2]...
So würdest du die einzelnen Elemente mit den Querverweisen wiederfinden.
 
Im Post #1 sprichst du von Stationen ST01, ST02 usw. Könnte man nicht jeder Station sein zugehöriges Array-Element via In/Out zum Beispiel übergeben? Also Station 1 bekommt StörDB.StörArray[1] und Station 2 StörDB.StörArray[2]...
So würdest du die einzelnen Elemente mit den Querverweisen wiederfinden.

Das habe ich auch schon überlegt, aber sagen wir mal ich habe
StörDB.StärArray[1] für Station 1 dieses besteht sagen wir mal aus 5 UDT Störungen, sprich

StörDB.StärArray[1].test1[0]
StörDB.StärArray[1].test1[1]
StörDB.StärArray[1].test1[2]
StörDB.StärArray[1].test1[3]
StörDB.StärArray[1].test1[4]

wäre das ja möglich aber die zuordnung fehlt ja, das muss er sichtlich sein

besser wäre ja
StörDB.StärArray[1].Indexierung[0]
StörDB.StärArray[1].Bandabsenkung[1]
StörDB.StärArray[1].Zylinder[2]
usw.....

und das ist genau der punkt was mit kopfweh bereitet, ich mein ich wäre auch für einen anderen Lösungsweg offen frage ist nur wie? weil ich bin mit meinem Latein am Ende so bisschen :D
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
OK, das Problem verstehe ich.
bei diesem Problem könnte man mit der Kommentierung arbeiten. Ab TIA V14 ist es möglich jedes Array-Element einzeln im DB zu kommentieren:
StörDB.StärArray[1].test1[0] // Indexierung
StörDB.StärArray[1].test1[1] // Bandabsenkung
StörDB.StärArray[1].test1[2] // Zylinder
Finde ich in deinem Fall aber auch nicht ganz so cool.

Wie viele dieser Unter-Strukturen (Indexierung, Bandabsenkung, Zylinder usw.) gibt es denn insgesamt? Man könnte ja sagen jede deiner Stationen bekommt alle dieser Unterstrukturen StörDB.StörArray[x].AlleStörungen via In/Out übergeben und Station 1 nutzt halt nur "Indexierung", Station 2 halt "Indexierung" und "Zylinder" usw. Wäre das vielleicht eine Möglichkeit?
 
Howard ich glaube ich habe mein erstes Problem gelöst

ich sage dazu nur C# live on! PS: Programmiere nebenher imemrmalweider in C# und mir ist grad was eingefallen ;)

Stichwort: VERERBUNG!!!!!!!

Meine UDT's sehen jetzt zum Anfang so aus:

01.JPG

1. Störung :
02.JPG

2. UDT_ST01_Bandabsenkung und UDT_ST01_Indexierung ERBEN von UDT_Störung je nach Häufigkeit in der Anlage
03.JPG

3. Das wird zusammen gefasst in UDT_ST01 für jede einzelne Station

04.JPG

4. Der gesammte DB wird durch UDT_ST_Gesamt zusammengefasst

05.JPG

5. IM DB100 wird nur noch die UDT_st_Gesamt aufgerufen und das sieht dann so aus (bild im nächsten Post):


Zusatz: Somit könnte ich ein Eingang am FC schalten mit der Struktur UDT_ST_Gesamt die sich immer ändert bei:

- neu einspilen der UDT's welche aus dem C Programm denn kommen werden und nur im DB100 aufgerufen werden


Problematik zur Programmierung:

Der DB ändert sich ja immer kansnt du mir sagen wie ich jetzt den DB im FC unabhänig durchsuchen lassen kann wenn sich der aufbau je nach station immer ändert?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Schöne Lösung. :)
Jetzt hängt das ganze nur am typischen Siemens-Problem. Wenn das ganze hart symbolisch bleiben soll, hat man das Problem, dass man diese Symbolik nicht irgendwie dynamisch im Code erweitern oder sonst wie zusammenbauen kann. Deshalb meine vorherige Frage aus #6, ob man alle Stör-UDTs zusammenfassen kann und dann nur EIN Array vom Typ "AlleStörungen" anlegt?
Man kann im TIA leider nur die Array-Grenzen ermitteln und damit eine FOR-Schleife los laufen lassen. Man kann leider nicht prüfen, ob es einen DB-Eintrag "ST01" gibt usw. :(

Willst du in deinem DB nur schauen ob irgendein Bit gesetzt ist? Dann könntest du diesen z.B. Word-Weise mit Peek_WORD einlesen und auf <> 0 prüfen usw.
Man könnte aber auch von deinen Stationen direkt ein Sammelbit ansteuern lassen. Wenn eine Station einen Fehler meldet, dann setzt sie den Fehler in der entsprechenden UDT und setzt das Sammelbit. Am Anfang eines jeden Zyklus setzt du z.B. im OB1 das Sammelbit zurück - wenn eine Station einen Fehler hat, setzt sie es wieder. Wenn man das nicht mit einer globalen Information direkt in der Station machen will, dann ggf. wieder via In/Out.
 
ich glaube mit der Idee aus dem Baustein raus wird nichts werden, das bekomm ich in der firma nicht durch!

aber die Idee mit dem Peek_WORD klingt vll gut, kannst du mir mal ein genaues prog beispiel nennen? damit ichs versteh?
brauch immer code zum verstehen :)
 
Jetzt hängt das ganze nur am typischen Siemens-Problem. Wenn das ganze hart symbolisch bleiben soll, hat man das Problem, dass man diese Symbolik nicht irgendwie dynamisch im Code erweitern oder sonst wie zusammenbauen kann.
Das ist kein "typisches Siemens-Problem" - auch bei anderen PLC kann nicht über zur Laufzeit zusammengebastelte Symbolik auf PLC-Variablen zugreifen. Und das ist auch gut so (meine Meinung).

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
Schnittstelle:
    i vom Typ Int            
    tempWord vom Typ Word            
    Sammelstörung als Return oder Output Bool

Code:

#i := 0; // temps initialisieren
#tempWord := 0;

WHILE TRUE DO
    #tempWord := PEEK_WORD(area := 16#84, // Speicherbereich DB
                           dbNumber := 100, // DB-Nummer
                           byteOffset := #i,  // Word-Zähler in Byte umrechnen -> 2 Byte = 1 WORD
                           ENO => ENO);
    
    IF NOT ENO THEN // Schleife beenden bei Zugriffsfehler
        EXIT;
    END_IF;
    
    IF #tempWord <> 0 THEN
        #Sammelstörung := true; // Auch hier könnte man die Schleife schon beenden
    END_IF;
    
    #i += 2; // Zähler für Byte-Offset erhöhen
    
END_WHILE;
Der Peek läuft aber leider nur in nicht optimierten DBs
 
Zuletzt bearbeitet:
also nochmal zurück ;)

das mit dem peek fruchtet nciht so wie ich mir das erhofft habe kann ich auch nciht nutzen denn sit der DB wieder nicht optimiert und ich kann ihn nicht so weiter verwenden an anderer Stelle wie ich will.

ich muss glaube von dem Gedanken weg das Sammelbit im DB zu erfassen ;) was natürlich die frage auswirft wie kann ich die Störauswertung anders gestalten. was definitiv bleiben muss ist die Verschaltung am Technologiebaustein mit der UDT_Störung.


eine idee ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du könntest ja in deinem Stör-DB an oberster Stelle einen Bool Sammelstörung vorsehen. Und wie vorhin beschrieben den am Zyklus-Anfang löschen. Alle Stationen die Störungen generieren können, können dieses Sammelbit im Störfall setzen. Nach dem Aufruf aller Stationen siehst du dann, ob eine Station die Sammelstörung gesetzt hat oder nicht.
 
Zurück
Oben