TIA 24x7 Sollwerte automatisch auslesen

--alex--

Level-2
Beiträge
92
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

habe folgendes Problem.
Für eine Kühlstellensteuerung ist es gewünscht für jede Stunde einen eigenen Sollwerte zu definieren.
D.h. ich habe einen DB mit 168 (24x7) Sollwerten (INT).

Mein Ansatz wäre jetzt mittels "Wochentag" und "Stunde" den passenden Wert in eine eigene Variable zu schreiben und diese für die Regelung zu verwenden.

Wie gesagt, das wäre mein Ansatz, habe aber keine Idee wie ich das tatsächlich bewerkstelligen kann.
AWL ist nicht wirklich meine Stärke.

Vielleicht hat ja von Euch jemand ein paar Tipps für mich.

Anmerkung:
Wochentag und Stunde ist nicht das Problem.
Es geht mir um das "vernünftige" auslesen der entsprechenden Werte aus dem DB.


Danke
Alex
 
beginne in deinem db mit sonntag (wt=1)
im dbw0 liegt also sonntag, 0 uhr

nun die anfangsadresse berechnen
Code:
l wochentag
l 1
-i //da ja anfang in dbw0 ist
l 24
*i
t adresse_tag
l stunde
+i
t adresse
sld3 //pointer erzeugen
lar1
auf db10
l dw[ar1,p#0.0]
t tempsollwert
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Alex,

Ich kann dir dazu nur ans Herz legen dir den WeeklyTimer anzuschauen wie dort gearbeitet wird. Ist ein FB mit einem Instanz DB welcher dir Datum und Zeit etc. liefert. Gleichzeitig fungiert er als Wochenzeitschaltuhr. Bestimmt kannst du dir da auch abgucken was er macht um es umzuschreiben auf deine Bedürfnisse....
Er wird wohl einen Compare drin haben um Tag und Stunde zu vergleichen - Erweiterst du das so kannst du ja abhängig davon Werte aus einem Array laden.
Wir haben seinerzeit mal mit Linearer Interpolation gearbeitet. Hierbei brauchten wir auch einen DB mit sehr vielen Werten - wir haben die Werte über ein Programm in SCL gelesen... Hier mal ein Auszug:

,,IF #AnalogerEingangswert > (#Messpunkte_Sensor[1]-500) AND #AnalogerEingangswert < (#Messpunkte_Sensor[50]+1000) THEN IF #AnalogerEingangswert < #Messpunkte_Sensor[1] THEN
#y0 := "Messpunkte".Literpromin[1];
#y1 := "Messpunkte".Literpromin[2];
#x0 := #Messpunkte_Sensor[1];
#x1 := #Messpunkte_Sensor[2];
ELSIF #AnalogerEingangswert > #Messpunkte_Sensor[50] THEN
#y0 := "Messpunkte".Literpromin[49];
#y1 := "Messpunkte".Literpromin[50];
#x0 := #Messpunkte_Sensor[49];
#x1 := #Messpunkte_Sensor[50];
ELSE
FOR #i := 1 TO 49 DO
IF #AnalogerEingangswert >= #Messpunkte_Sensor[#i] AND #AnalogerEingangswert <= #Messpunkte_Sensor[#i + 1] THEN
#y0 := "Messpunkte".Literpromin[#i]; "


WeeklyTimer gibt es hier im Beispielprojekt:

https://support.industry.siemens.co...-simatic-s7-1200-in-step-7-v11?dti=0&lc=en-WW
 
Sonst könnte man die Solltwerte auch als "mehrdimensionales" Array anlegen.
Also: Tag - Array[0..6] of Struct - Stunde Array[0..23] of INT.

Wenn du TIA hast und ne 1200/1500er CPU dann kannst du die Werte direkt mit DbSollwerte.Tag[Variable].Stunde[Variable] ansprechen.

Wenn es ne 300er ist könntest du einen SCL-FC schreiben dem du Tag/Stunde übergibst, der dir dann den Sollwert ausspuckt.
z.b.:
Code:
#FcOUT_Sollw := "DbSollwerte".Tag[#FcIN_Tag].Stunde[#FcIN_Stunde];
 
Zuletzt bearbeitet:
Hallo Volker,

so ähnlich hätte ich mir das vorgestellt.
Jetzt habe ich aber im TIA Portal das Problem dass es einen DBW0 nicht ehr gibt.

Wäre es eventuell möglich die Namen wie folgt zu vergeben (Tag_Stunde)
1_14 --> Sonntag 14:00 Uhr
und dann auf diese zuzugreifen?

Alex
 
Zuviel Werbung?
-> Hier kostenlos registrieren
klar geht das auch in tia. was für eine cpu?
ansonsten mach es wie ronin schreibt. der erzeugte code ist fast identisch mit meinem awl-code
 

Anhänge

  • Zwischenablage04.jpg
    Zwischenablage04.jpg
    18 KB · Aufrufe: 14
  • Zwischenablage02.jpg
    Zwischenablage02.jpg
    46,7 KB · Aufrufe: 21
Jetzt habe ich aber im TIA Portal das Problem dass es einen DBW0 nicht ehr gibt.
@volker: Ich glaub Alex hat einen optimierten DB erzeugt (keine 300er/400er), daher kein DBW0 (keine Adressen).

@axel: Falls dass das Problem ist: Einfach beim DB Rechtsklick/Eigenschaften/Attribute - "Optimierter Bausteinzugriff" abhaken und dann den Db selber nochmal mit STRG+B (oder dem Menüknopf) übersetzen.
Dann hast du auch Adressen, für die Lösung mit den Pointern ist das absolut erforderlich. Das mit dem "mehrdimensionalen" Array geht auch mit dem optimierten DB.
 
Zuletzt bearbeitet:
Vielen Dank für die zahlreichen Hilfestellungen.
Ich habe es jetzt mit dem mehrdimensionalen Array gelöst.

@ronin: Du hattest recht. Es wurde zuerst ein optimierter db erzeugt. Ich habe den Haken bei "Optimierter Bausteinzugriff" abgehakt, aber das ich den nochmal übersetzen musste habe ich nicht gewusst.

@volker: Danke für die AWL Codeunterstützung.
 
Zurück
Oben