Messwerte einlesen und abspeichern.

tino2512

Level-1
Beiträge
86
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo erstmal,

ich hab folgendes Problem:

Ich möchte Messwerte, welche mir ein PEW 528 liefert abspeichern und dies ca. alle 3 Sekunden. Grund dafür ist die Aufnahme einer Temperaturkurve. Mit einem Thermistor wird die Temperatur des Wassers gemessen und über Profibus an die S7-400 als ADC 13-Bit Wert weitergegeben. Bei einem vorher eingestellten Wasserpegel wird die Heizung per E0.0 eingeschaltet. Nachdem die Heizung eingeschaltet wurde sollen alle 3Sekunden das PEW 528 eingelesen werden und der Messwert z.B. in einem Datenbaustein nacheinander hinterlegt werden.

Wie kann ich das am besten realisieren?

mfg Tino
 
Willst du das in AWl oder SCL machen?

Such bei AWL auf jeden Fall mal hier im Forum zuerst unter "indirekter Adressierung" um dich mal grundlegend damit vertraut zu machen.

Hier mal ein kleiner Vorgeschmack:

http://www.sps-forum.de/showpost.php?p=84289&postcount=3

läuft nur andersherum ;) !

PS: Und schau mal in die FAQ unter "Pointer Zeiger FIFO LIFO" und "Index in S7 AWL"

Einfacher geht das in SCL, da legst du ein Array an und kannst auf die ArrayElemente mit einem einfachen Index zugreifen, in etwa, wie man das aus VB und Delphi kennt.
 
Zuletzt bearbeitet:
Willst du das in AWl oder SCL machen?

Such bei AWL auf jeden Fall mal hier im Forum zuerst unter "indirekter Adressierung" um dich mal grundlegend damit vertraut zu machen.

Hier mal ein kleiner Vorgeschmack:

http://www.sps-forum.de/showpost.php?p=84289&postcount=3

läuft nur andersherum ;) !

indirekte Adressierung ist mir schon ein Begriff. Ich möchte es in AWL programmieren. Nur funktioniert es so wie ich es habe nicht. Darum wollte ich mir hier Anregungen holen oder Ratschläge was ich wohl falsch gemacht habe.

Ich rufe meinen FB1 im OB1 auf. Mein FB1 beinhaltet folgendes:

Code:
U M 0.0 // nach 3 Sek wird das Merkerbit gesetzt
SPBN M001
CLR 
L PEW 528 // PEW gibt Werte zwischen 7677 und 880 als 13 Bit wieder
 
T MD 20
R M 0.0
CALL FC 1
Messwerte:=MD20
M001: NOP 0

Im FC 1 steht folgendes:

Code:
AUF DB 10
L MW 42
T #n
L 1600
L #n
>I 
SPB m1
L 0
T #n
m1: T MW 42
SLD 3
T MD 24
L MD 20
T DBD [MD 24]
L #n
+ 4
T #n
T MW 42


Auf den Bildern sieht man nochmal alle Einstellungen
 

Anhänge

  • DB10.JPG
    DB10.JPG
    80,5 KB · Aufrufe: 15
  • FB1.JPG
    FB1.JPG
    129,6 KB · Aufrufe: 20
  • FC1.JPG
    FC1.JPG
    114,5 KB · Aufrufe: 26
Zuletzt bearbeitet:
Wo hast du den Code her?
Sieht ein wenig aus, als ob ein Teil davon aus einem S5-Programm stammt.
Hab leider im Moment kein Step7 zur Hand, also mal in aller Kürze und ungetestet :ROFLMAO: :

U M 0.0 // nach 3 Sek wird das Merkerbit gesetzt
SPBN M001

L PEW 528 // PEW gibt Werte zwischen 7677 und 880 als 13 Bit wieder
T MD 20 //warum eigentlich in ein MD, ein 13-Bit-Wert wird dadurch nicht genauer, soll es ein Real sein, dann wandeln!
//Also besser
ITD
DTR
T MD20 //nun ist es eine Real

SET //Sicher ist Sicher, damit M0.0 auch zurückgesetzt wird, was sollte das CLR bei dir???
R M 0.0
CALL FC 1
Messwerte:=MD20
M001: NOP 0

Im FC 1:

AUF DB 10
L 400
L MW 42 //hier merkst du dir die Position, besser als INOUT im FC1 definieren und dann dort ranschreiben
>I
SPB m1
L 0
m1: NOP 0
T MW 42
ITD //der Vollständigkeit halber
L 4 //1 Real ist 4 Byte lang
* D
SLD 3 //in das Pointerformat überführen
//statt dem Roten könnte man auch einfach
//SLD 5
//schreiben, erfüllt den gleichen Zweck
LAR 1 //ins Adressregister 1 laden
L Messwerte
T DBD [AR1, P#0.0]
L MW42
L 1
+I
T MW 42

Du solltest also statt MW42 eine INOUT-Variable Zaehler als INT im FC1 definieren und diese statt MW42 nehmen, Außen an den FC 1 schreibst du dann dein MW42 an den Parameter Zaehler ran.

PS: Kai kann das sicher noch optimieren :ROFLMAO: !
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wo hast du den Code her?

Also erstmal vielen vielen Dank für deine Hilfe. Ich hab den Code mal aus einer früheren Übungsaufgabe angepasst. Ich bin noch nicht ganz so geübt mit den Umgang mit Step7, da ich nicht jeden Tag damit arbeite sondern nur gelegentlich. Das wird sich hoffentlich bald ändern wenn ich meine Diplomarbeit schreibe. Leide bekommt man in der Hochschule nicht viel praktisches beigebracht, was ich sehr schade finde, da dies doch das Handwerkszeug sein sollte.
Ich hab mal das Programm nach deinen Vorschlägen verbessert.

FB1:
Code:
         U     M      0.0                  // Merker 0.0 wird gesetzt wenn z.B. 3 Sekunden abgelaufen sind
      SPBN  M001
      L     PEW  528                    // PEW gibt Werte zwischen 7677 und 880 als 13 Bit wieder
      ITD   
      DTR   
      T     MD    20
      SET   
      R     M      0.0
      CALL  FC     1
       Messwerte:=MD20
       Zaehler  :=MW42
M001: NOP   0

FC1:
Code:
      AUF   DB    10
      L     #Zaehler
      T     #n
      L     400
      <I    
      SPB   m1
      L     0
m1:   NOP   0
      T     #Zaehler
      ITD   
      SLD   5
      LAR1  
      L     #Messwerte
      T     DBD [AR1, #P0.0]        //hier wird noch ein Fehler angezeigt
      L     #Zaehler
      L     1
      +I    
      T     #Zaehler

Bei T DBD [AR1, #P0.0] wird mir ein Fehler angezeigt. Messwerte hab ich auch als in_out Variable im FC1 deklariert.
Testen kann ich das Programm erst am Donnerstag in der Hochschule.
Ausserdem hätte ich gerne gewußt, mit welchem Programm ich daheim auch Ein- und Ausgänge simulieren kann. Und woher ich das bekomme.

mfg Tino
 
Zuletzt bearbeitet:
#Zaehler als INOUT im FC 1 deklarieren und im OB1 am FC1 dann an den Parameter Zaehler MW42 ranschreiben. --> Quatsch, hast du ja gemacht

T #n kannst du weglassen

Ich hab noch einen Feholer drin:

Richtig:

Code:
      AUF   DB    10
      L     400              //Reihenfolge geändert
      L     #Zaehler
      >I                      //Abfrage geändert
      SPB   m1
      L     0
m1:   NOP   0
      T     #Zaehler
      ITD   
      SLD   5
      LAR1  
      L     #Messwerte
      T     DBD [AR1, P#0.0]        //war #P0.0, was falsch ist!!!
      L     #Zaehler
      L     1
      +I    
      T     #Zaehler
 
Zuletzt bearbeitet:
Nein, P#0.0 ist richtig, das ist der Offset für das Adressregister 1, hier also faktisch 0.
Hab noch den Code im vorigen Post geändert, war noch ein Fehler von mir drin, bitte mal vergleichen!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke Ralle,

deine Änderungen hatte ich gesehen. Nun werde ich das mal am Donnerstad testen. Hoffentlich klappt es ;-)

Ich hatte noch nach einem Programmgefragt, mit dem ich ein und Ausgänge simulieren kann ohne das ich das Programm in eine CPU laden muss. Daheim hab ich nämlich kein S7 zur Hand.

Gruß Tino
 
Ich nehme PLCSIM, das ist beim Prof.-Paket von Step7 dabei. Es gibt auch noch etwas von Deltalogic und von MHJ. Da war gerade ein Beitrag von Hans.S (glaube ich), der hat über die Studentenversion geschrieben.

http://www.sps-forum.de/showthread.php?t=9628

Suche nach "Simulator" bringt vielleicht auch was.
 
Zuletzt bearbeitet:
Zurück
Oben