Analogwert Ausgabe 0-10V

Nickel

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

Vielleicht kann mir einer Weiter helfen.
Ich habe eine Analogeausgangskarte und brauche den Wert 0-10V.
Wie kann ich es Realisieren (Program mäßig) in einer bestimmten Zeit (5s) den Wert von 0 auf 10V Steigen zu lassen.
Das ganze geht über einen Taster, den ich gedrückt halten muss um den Wert zu steigern.

Da ich noch nie mit einer Analogen Ausgangskarte gearbeitet habe wäre ich sehr froh über eure Hilfe! :-D

DANKE!!!!!!


Gruß
Nickel
 
Hallo,

um an der Karte 10V ausgeben zu können muß ein Wert auf das Ausgangswort geschrieben werden. Wie hoch dieser sein muß hängt von der Karte ab(8Bit/10Bite/12Bit oder so).Damit hast du die Anzahl der Schritte, die dein Zähler in der gewünchten Zeit hochzählen muß.Die Zeit(5s wie vorgeschlagen)teilst du durch die Anzahl der Schritteund erhältst damit einen Zeitwert. Somit kannst du einen Zähler mit einem Taster freigeben der mit ablauf des errechneten Zeitwertes jeweils 1 aufwärtszählt.das funktioniert auch mit einem Wort welches in entsprechenden Abständen incrementiert wird.Wie die Ausgabe dann auf die Analoge Karte erfolgt steht in deren Beschreibung(eventuell Daten noch schieben).
Grüße Thomas
 
Die Frage ist auch, wie genau diese Steigerung sein muss.
Ich bin auch noch halber Anfänger, aber kann mir gut vorstellen, dass Siemens bereits eine Funktion für solch eine Anwendung geschrieben hat.

Die Idee von Thomas ist meiner Meinung nach nicht falsch, aber scheitert daran, dass Deine SPS nicht so schnell sein wird.
In der Regel teilt sich ein Analogausgang in gut 27000 Schritten. Teilst Du nun Deine 5s durch 27000 befindest Du Dich schon im µ-Sekundebereich. Dein CPU-Zyklus wird aber auf jeden Fall größer sein.
Deshalb würde ich gröbere Schritte nehmen, um Deinen Analogwert zu erhöhen.
Gruß,
Tigerkroete
 
Erstmal dank ich euch!

@Per

Der Link ist nicht schlecht.
Nur wird das mit WCC realisiert.

Aber ich habe nur den S7 Manager zu verfügung.

Bei einer S7 400 wäre das nicht Problem aber ich habe eine 300er.

Troztdem vielen dank

Ich werde mich jetzt noch was damit auseinadersetzen und euch berichten wie weit ich gekommen bin.

DANKE
 
Zuviel Werbung?
-> Hier kostenlos registrieren
die antwort von thomas ist nicht ganz korrekt. völlig egal vieviel bit auflösung die karte hat.

im endefekt müssen 27648 (100%) erreicht werden.

wie gross die sprünge sein müssen ist abhängig von der zykluszeit.
diese kann man dem ob1 entnehmen und entsprechend verrechnen.
ist dann ein bisschen rechenaufwand.

oder man nimmt den ob35 mit 100ms.

daraus ergeben sich also 50 ansprünge des ob in 5 sec.
==> 27648 / 50 = 552,96 also rund 553. um diesen wert muss der sollwert pro ob-aufruf erhöht werden.
 
kein WCC nötig

Hallo Nickel,
du brauchst nur den FC10 aus diesen Beitrag von Siemens.
schau dir aber umbedingt auch den Aufruf im ob1 im Beispiel an.
Der Fc10 brauch die aktuelle Zykluszeit !

per
 
Hey.

Also ich bin noch nicht weiter gekommen.

@Per

Wie soll ich das im FC10 realisieren.

Habe in der Hilfe von S7 Manager geschaut und nichts über eine Rampenfunktion gefunden.
 
Also das ist doch schwieriger als ich gedacht habe.

wir haben es in AWL geschrieben

Netzwerk 1

go: U E 0.0
SPB up

Netzwerk 2

UP: L MW 120
L 2
+I

L MW 120
L 27000
>=I
S M 10.0

U M 10.0
SPB ende

L MW 120
T PAW 272

U MW 120
SPB go

Netwerk 3

ende: BEA


So in etwa sieht es aus habe das Prog auf der Arbeit gelassen.

Was haltet ihr davon wie kann ich es besser machen?!?!?!

Ich dank euch
 
naja. so richtig nachgedacht hast du nicht

wenn du nur 2 je zyklus dazuzählst benötigst du 13500 zyklen.
daraus folgt, dass du eine zykluszeit von 0,37ms haben müsstest um das in 5 sek zu schaffen.
doch wohl nicht wirklich realischtisch.:ROFLMAO:

Code:
      L     27000
      L     #OB1_PREV_CYCLE
      /I    
      T     MW   122                    //wertänderung je zyklus
      UN    E      0.0                  //up
      SPB   up0
      L     MW   120
      L     MW   122
      +I    
      T     MW   120
      L     27000
      <=I   
      SPB   up0
      L     27000
      T     MW   120
up0:  NOP   0
      UN    E      0.1                  //down
      SPB   dwn0
      L     MW   120
      L     MW   122
      -I    
      T     MW   120
      L     0
      >=I   
      SPB   dwn0
      L     0
      T     MW   120
dwn0: NOP   0
      UN    E      0.2                  //reset
      SPB   res0
      L     0
      T     MW   120
res0: NOP   0
      L     MW   120
      T     PAW  272
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Erstmal vielen Dank!

Ich habe noch gar nicht an die 5 Sekunden gedacht.

Mir ging es erstmal darum überhaupt was mit der Analogen Ausgangskarte hin zu bekommen.

Ich werde den script bei gelegenheit sofort ausprobieren!

DANKE!!!! :ROFLMAO:

P.S.

Ich bin auch erst ein Azubi im 2. Lehrjahr (Zur eigenverteidigung)
 
Zuletzt bearbeitet:
Ich werde den script bei gelegenheit sofort ausprobieren!
das ist kein script sondern ein s7 programm in awl. ;)

Ich bin auch erst ein Azubi im 2. Lehrjahr (Zur eigenverteidigung)
wir haben alle mal angefangen :s10:

da dort eine temp variable aus dem ob1 benutzt wird musst du dieses dort reinschreiben.
wenn du den code in einem anderen baustein nutzen möchtest (was sinn macht, da man im ob1 eigentlich kein programm schreibt) musst du die variable #OB1_PREV_CYCLE in z.b. ein mw transferieren und im entsprechendem fc benutzen.
 
Zuletzt bearbeitet:
Wie meinst du das mit der Variable das verstehe ich nicht ganz.

Ich nehme mir den Ob1 schreibe da Call FC1 rein...

im FC1 ein schreibe ich nicht das Script :ROFLMAO: sondern das S7 Programm.

Wie mache ich das jetzt mit der variable und wofür ist die?!

Danke
 
Zuviel Werbung?
-> Hier kostenlos registrieren
eben.
und in der fc1 gibt es die varibale #OB1_PREV_CYCLE (ist die zykluszeit des letzten zyklus) nicht.
dann würde die berechnung nicht funktionieren.

also schreibe im ob1 zusätzlich

L #OB1_PREV_CYCLE
T MW 124

in der fc1 ersetze
L #OB1_PREV_CYCLE
durch
L Mw 124

is klar ?
 
eben.
und in der fc1 gibt es die varibale #OB1_PREV_CYCLE (ist die zykluszeit des letzten zyklus) nicht.
dann würde die berechnung nicht funktionieren.

also schreibe im ob1 zusätzlich

L #OB1_PREV_CYCLE
T MW 124

in der fc1 ersetze
L #OB1_PREV_CYCLE
durch
L Mw 124

is klar ?



JO soweit ganz klar.

was meinst du mit dem "durch" ?

l #ob1_prev_cycle
DURCH
l mw 124


oder habe ich da was falsch verstanden!

Ich weis das ich die Variable im ob1 und im FC1 aufrufen muss
 
okay vergess was ich gesagt habe das war doof!

Wenn ich dein S7 Programm mir kopiere und mir in meinen FC 1 lade streicht er mir

L #OB1_PREV_CYCLE

Rot an warum?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Temp Variable #OB1_PREV_CYCLE

Hallo Nickel,


wenn Du in Deinem FC 1 L #OB1_PREV_CYCLE benutzt, wird es natürlich rot, da Du versuchst auf Lokaldaten ( #OB1_PREV_CYCLE ) vom OB 1 zuzugreifen.
Volker versucht Dir mit einer Engelsgeduld zu erklären,
dass die temp Variable #OB1_PREV_CYCLE nur im OB 1 vorkommt.
Das bedeutet; wenn man diese Variable in einem anderen Baustein benutzen möchte, z.B. in deinem FC 1, muß man sie übergeben.
Also im OB1 durch Lade #OB1_PREV_CYCLE und Transferiere in MW 100
zwischenspeichern/ ablegen. Im FC1 oder wo auch immer in deinem Programm, steht Dir diese Variable nun im MW 100 zur Verfügung.
 
Hey, und dafür bin ich dem Volker auch richtig dankbar.

Ich werde auf einmal mit einer Analogkarte konvrontiert und habe überhauptkeine Ahnung wie das geht.

Ich bin ja schon froh das ich die Karte ein wenig ansteuern kann.
In AWL zu schreiben ist für mich auch noch neuland.
Und dann kommt noch eine Variable dazu wo ich überhaupt nicht weis das es sowas gibt und wie ich die anwende.

Entschuldigt meine dummen Fragen aber ich weis da wirklich nicht weiter.

Es ist ja auch nicht so das ich versuche alles hier zu erfahren, ganz im gegenteil ich google und wältze die SPS Bücher durch.

Auf der S7 400er version ist das alles kein Problem da es da die richtigen Bausteine für gibt aber bei der 300er steh ich vor einem Buch mit 7 Siegel.

Bitte nehmt mir die Fragen nicht übel!

Dank

Gruß
Nickel
 
Kompl Rampenprogr.

DATA_BLOCK DB 1
TITLE =
VERSION : 0.1

STRUCT
DB_VAR : BOOL ; //vorläufige Platzhaltervariable
END_STRUCT ;
BEGIN
DB_VAR := FALSE;
END_DATA_BLOCK
DATA_BLOCK "Globaler DB10"
TITLE =
AUTHOR : 'Kleißler'
VERSION : 0.1

STRUCT
DB_VAR : INT ; //vorläufige Platzhaltervariable
ANALOGWERT : REAL ; //Analogwert
ANALOGWERT_BEARB : REAL ; //Analogwert nach Bearbeitung
Zykluszeit : REAL ; //Zykluszeit
FC_105_Fehlerinfo : WORD ; //Fehlerinformationen zum FC 105
FC_106_Fehlerinfo : WORD ; //Fehlerinformationen zum FC 106
END_STRUCT ;
BEGIN
DB_VAR := 0;
ANALOGWERT := 0.000000e+000;
ANALOGWERT_BEARB := 0.000000e+000;
Zykluszeit := 0.000000e+000;
FC_105_Fehlerinfo := W#16#0;
FC_106_Fehlerinfo := W#16#0;
END_DATA_BLOCK
FUNCTION "Anlage EIN/AUS" : VOID
TITLE =Allgemeine Funktionen
AUTHOR : 'Kleißler'
VERSION : 0.1
BEGIN
NETWORK
TITLE =HM Anlage EIN_AUS
U "S1 Anlage EIN";
S "HM Anlage EIN_AUS";
UN "S0 Anlage AUS";
R "HM Anlage EIN_AUS";
U "HM Anlage EIN_AUS";
= DB1.DBX 0.0;
NETWORK
TITLE =
U "HM Anlage EIN_AUS";
SPB M001;
NETWORK
TITLE =Abfrage n = 0
L "Globaler DB10".ANALOGWERT_BEARB;
L 0.000000e+000;
==R ;
= "HM_N=0";
NETWORK
TITLE =Anlage aus bei n = 0
M001: UN "S0 Anlage AUS";
S "HM Anlage gegen n=0";
U "HM_N=0";
R "HM Anlage gegen n=0";
NOP 0;
END_FUNCTION
FUNCTION "Ramp_up" : VOID
TITLE =
AUTHOR : 'Kleißler'
VERSION : 0.1
BEGIN
NETWORK
TITLE =Anlage EIN / AUS
UN "HM Anlage EIN_AUS";
SPB M100;

NETWORK
TITLE =Vergleich Istwert = Sollwert

L "Globaler DB10".ANALOGWERT_BEARB;
L "Globaler DB10".ANALOGWERT;
>=R ;
SPB M100;
NETWORK
TITLE =Addition für Rampe

L "Globaler DB10".ANALOGWERT_BEARB;
L 1.000000e+000;
+R ;
T "Globaler DB10".ANALOGWERT_BEARB;
NOP 0;
NETWORK
TITLE =Bausteinende

M100: NOP 0;
END_FUNCTION
FUNCTION "Ramp_down" : VOID
TITLE =
AUTHOR : 'Kleißler'
VERSION : 0.1
BEGIN
NETWORK
TITLE =Abfrage n = 0
L "Globaler DB10".ANALOGWERT_BEARB;
L 0.000000e+000;
<=R ;
SPB M100;


NETWORK
TITLE =Abfrage Anlage EIN
U "HM Anlage EIN_AUS";
SPB M100;


NETWORK
TITLE =Subtrahiere den Istwert
L "Globaler DB10".ANALOGWERT_BEARB;
L 1.000000e+000;
-R ;
T "Globaler DB10".ANALOGWERT_BEARB;
NOP 0;

NETWORK
TITLE =Bausteinende

M100: NOP 0;

END_FUNCTION
FUNCTION "Ramp_down_folgen" : VOID
TITLE =
AUTHOR : 'Kleißler'
VERSION : 0.1
BEGIN
NETWORK
TITLE =Abfrage Anlage ist EIN
UN "HM Anlage EIN_AUS";
U "HM Anlage gegen n=0";
SPB M001;

NETWORK
TITLE =Abfrage Sollwert ist größer gleich Istwert
L "Globaler DB10".ANALOGWERT;
L "Globaler DB10".ANALOGWERT_BEARB;
>=R ;
SPB M001;


NETWORK
TITLE =Subtraktion
L "Globaler DB10".ANALOGWERT_BEARB;
L 1.000000e+000;
-R ;
T "Globaler DB10".ANALOGWERT_BEARB;
NOP 0;

NETWORK
TITLE =Bausteinende
M001: BE ;

END_FUNCTION
FUNCTION "Analog einlesen" : VOID
TITLE =Analog einlesen
AUTHOR : 'Kleißler'
VERSION : 0.1
BEGIN
NETWORK
TITLE =Umschaltung Einrich,- Normalbetrieb
U "Einrichtbetrieb";
SPB M001;
NETWORK
TITLE =Analogwert normieren auf 0...100 für Normalbetrieb
U "immer low";
= L 0.0;
BLD 103;
U "immer high";
SPBNB _001;
CALL "SCALE" (
IN := PEW 800,
HI_LIM := 1.000000e+002,
LO_LIM := 0.000000e+000,
BIPOLAR := L 0.0,
RET_VAL := "Globaler DB10".FC_105_Fehlerinfo,
OUT := "Globaler DB10".ANALOGWERT);
_001: NOP 0;
NETWORK
TITLE =Bausteinende im Normalbetrieb
BEA ;
NETWORK
TITLE =Analogwert normieren auf 0...50 für Einrichtbetrieb
M001: U "immer low";
= L 0.0;
BLD 103;
U "immer high";
SPBNB _002;
CALL "SCALE" (
IN := PEW 800,
HI_LIM := 5.000000e+001,
LO_LIM := 0.000000e+000,
BIPOLAR := L 0.0,
RET_VAL := "Globaler DB10".FC_105_Fehlerinfo,
OUT := "Globaler DB10".ANALOGWERT);
_002: NOP 0;
END_FUNCTION
FUNCTION "Analog ausgeben" : VOID
TITLE =Analogwert ausgeben
AUTHOR : 'Kleißler'
VERSION : 0.1
BEGIN
NETWORK
TITLE =Analogwert normiert (0...100) ausgeben auf PAW 820
U "immer low";
= L 0.0;
BLD 103;
U "immer high";
SPBNB _001;
CALL "UNSCALE" (
IN := "Globaler DB10".ANALOGWERT_BEARB,
HI_LIM := 1.000000e+002,
LO_LIM := 0.000000e+000,
BIPOLAR := L 0.0,
RET_VAL := "Globaler DB10".FC_106_Fehlerinfo,
OUT := PAW 820);
_001: NOP 0;
END_FUNCTION
FUNCTION "ML steuern" : VOID
TITLE =ML Steuern
AUTHOR : 'Kleißler'
VERSION : 0.1
BEGIN
NETWORK
TITLE =HM n=0 anfahren
U "HM Anlage gegen n=0";
U "Takt 1s (1Hz)";
= "HM_n=0_anf";


NETWORK
TITLE =HM_Anlage EIN
U "HM Anlage EIN_AUS";
= "HM_Anlage EIN";


NETWORK
TITLE =ML Anlage EIN (GN)
O "HM_n=0_anf";
O "HM_Anlage EIN";
= "ML Anlage EIN (GN)";

NETWORK
TITLE =ML Anlage AUS (RD)
UN "HM Anlage EIN_AUS";
UN "HM Anlage gegen n=0";
= "ML Anlage AUS (RD)";

END_FUNCTION
ORGANIZATION_BLOCK "Programmstruktur"
TITLE = "Main Program Sweep (Cycle)"
AUTHOR : 'Kleißler'
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 =Hilfsmerker immer low/high
//CLR setzt das VKE auf den Signalzustand "0"
//SET setzt das VKE auf den Signalzustand "1"
CLR ;
= "immer low";
SET ;
= "immer high";
NETWORK
TITLE =Aufruf allgemeiner Funktionen
CALL "Anlage EIN/AUS" ;
CALL "Analog einlesen" ;
CALL "Analog ausgeben" ;
CALL "ML steuern" ;
NETWORK
TITLE =Zeitgesteuerte Aufrufe der Rampenbausteine
//Anstatt des anspringen der Zeitgesteuerten FC´s 2+3+4 über den HW Takt kann auch
//der OB35 (Weckalarm OG) über die HW Projektierung verwendet werden.
U "Takt 0,1s (10Hz)";
FP "HM Flanke M1.1";
= "FM 1.1";
O "FM 1.1";
CC "Ramp_up";
O "FM 1.1";
CC "Ramp_down";
O "FM 1.1";
CC "Ramp_down_folgen";
END_ORGANIZATION_BLOCK
 
Zurück
Oben