Das Vergleichen von Werten funktioniert einfach nicht?!

S7Sync

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

ich habe folgendes Problem beim realisieren einer Schaltuhr und hoffe ihr könnt mir hilfreiche Lösungsansätze geben....

- es soll ein Zahlenwert (Word) mit einem anderen Zahlenwert (Word) verglichen werden
- beide Zahlenwerte werden als Eingangsvariable an einen FB geschrieben, jeweils als WORD deklariert

im FB sieht es dann z.B. so aus:
IN Variable: Uhrzeit [WORD]
Einschalten_1 [WORD]
STAT Variable: Funktion_1_EIN [BOOL]
Funktion_1_AUS [BOOL]

L #Uhrzeit ---- hier steht online z.B. 1240 (12:40Uhr) Istzeit
L #Einschalten_1 ---- hier wird ein Hexwert angezeigt
==D
= #Funktion_1_EIN

L #Uhrzeit
L #Ausschalten_1
==D
= #Funktion_1_AUS

usw.

Nun die Fragen:
Wenn ich die Uhrzeit mit einer Schaltzeit vergleichen möchte wird die Variable nicht auf 1 geschaltet, woran liegt das?
Wenn ich den Hexcode in dezimal übersetze steht dann auch z.B. 1240 drin, also muss der Vergleich doch ein VKE 1 ergeben?
Gibt es evtl. Formatprobleme?

CPU 3152DP alte Bauform
Step7 5.5 SP2

Ich hoffe das sind ausreichend Informationen.
 
Hallo,
ich würde bei den Vergleichen IMMER mit >=I statt ==I arbeiten ...
Probier das mal - vielleicht liegt es ja auch bei dir daran ...

Gruß
Larry
 
also so :
Code:
L #Uhrzeit                         ---- hier steht online z.B. 1240 (12:40Uhr) Istzeit
 L #Einschalten_1                ---- hier wird ein Hexwert angezeigt
 >=I
S #Funktion_1_EIN

 L #Uhrzeit
 L #Ausschalten_1
 >=I
R #Funktion_1_EIN

oder :
Code:
U(
L #Uhrzeit                         ---- hier steht online z.B. 1240 (12:40Uhr) Istzeit
L #Einschalten_1                ---- hier wird ein Hexwert angezeigt
 >=I
)
U(
L #Uhrzeit
L #Ausschalten_1
<I
= #Funktion_1_EIN
Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
und wenn du die 1240 in HEX darstellen lässt?
beide werte müssen in der selben darstellungsart gleich sein

ich kann auch den Hexcode übersetzen, der ergibt dann 1240! Deswegen wundert es mich, dass es nicht klappt?!

Ich werd mal die genannten Lösungsansaätze ausprobieren...
 
Hallo,
ich würde bei den Vergleichen IMMER mit >=I statt ==I arbeiten ...
Probier das mal - vielleicht liegt es ja auch bei dir daran ...

Gruß
Larry

ist es dann zu vernachlässigen, dass online im Status eben in der #Uhrzeit Variable z.B. 1240 steht und in der #Einschalten_1 z.B. 4D8 oder muss hier das selbe Formatangezeigt werden (wie "vierlagig" schreibt)? Wenn die angezeigten Werte im gleichen Format angezeigt werden müssen, wie kann ich die IN Variable so deklarieren das sie mir den Hex Code auch in Dez anzeigt, also die 1240 zu7 sehen ist?
 
ist es dann zu vernachlässigen, dass online im Status eben in der #Uhrzeit Variable z.B. 1240 steht und in der #Einschalten_1 z.B. 4D8
Eigentlich schon da 4D8 = 1280
Was mich wundert: Der Zeitwert 1 wurde doch auch als Word deklariert somit müsste er auch als Hex angezeigt werden.
Wenn die angezeigten Werte im gleichen Format angezeigt werden müssen, wie kann ich die IN Variable so deklarieren das sie mir den Hex Code auch in Dez anzeigt, also die 1240 zu7 sehen ist?
Als "INT"
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So....
nun ist es bald soweit - ich verzweifele.
ABER einen teilerfolg konnte ich verzeichnen.

ich habe die IN Variablen auf INT geändert, in AWL die Vergleichoperation von ==D auf ==I gestellt ==> Ergebnis ohne Erfolg
Dann habe ich die IN Variablen wieder auf WORD geändert, rest so belassen.
jeweils den IDB neu generiert und übertragen
irgendwie habe ich es geschafft das nun beim onlinestatus in beiden Variablen Dezimalwerte angezeigt werden und kein Hexcode!
An dieser stelle funktioniert der Vergleich wie gewünscht, jedoch ein paar Zeilen weiter (Variable enden mit ***_2) hab ich immernoch Hexcode stehen?????

Wie kann das sein, die Deklarationen sin bei den STAT Variablen identisch...

hier mal ein Ausschnitt des FB, wobei der erste Teilabschnitt funktioniert, alles nach den "-----" leider nicht.....


MoFr: U(
U #Schaltzeit1_aktiviert
SPB ON2
SPA NXT3

ON2: L #Uhrzeit
L #Einschalten_1
==I

)
= #Funktion_MoFr_T1_Ein

U(
L #Uhrzeit // Istzeit mit
L #Ausschalten_1
==I
)
= #Funktion_MoFr_T1_Aus
//--------------------------------------
NXT3: U(
U #Schaltzeit2_aktiviert
SPB ON3
SPA NXT4

ON3: L #Uhrzeit
L #Einschalten_2
==I
)
= #Funktion_MoFr_T2_Ein

U(
L #Uhrzeit // Istzeit mit
L #Ausschalten_2
==I
)
= #Funktion_MoFr_T2_Aus
//--------------


Wer hat eine Idee was das nun sein kann?

mfg
 
Nachtrag!

Es ist definitiv so, dass die STAT Variablen mit WORD deklariert sind

ABER

der Onlinestatuswert in Hex angezeigt wird!

Die Uhrzeitvariable ist ebenfalls WORD, wird aber in Dezimal angezeigt?!?!? Also liegt es definitiv am Format, ein Umstellen auf Int bringt jedoch keine Änderung. Das Hexformat lässt sich einfach nicht in Dez ändern :-(

Ich bitte um weitere Ratschläge

Vielen Dank im Voraus
 
Hi,

in der Onlineansicht wird ein Wert doch immer erst in HX angezeigt. Erst wenn ich mit der rechten Maustaste umstelle, kann ich den Wert mir auch als DEZ oder Gleitpunkt anzeigen lassen.
(Ich hoffe, ich liege richtig)

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
in der Onlineansicht wird ein Wert doch immer erst in HX angezeigt. Erst wenn ich mit der rechten Maustaste umstelle, kann ich den Wert mir auch als DEZ oder Gleitpunkt anzeigen lassen.

Hallo,
es wird immer erst Hex angezeigt? Selbst wenn ein INT Wert an der IN Variable anliegt?
Seltsam ist aber, dass bei der #Uhrzeit Variable (IN) mit Word Deklaration ein Dez Wert im Onlinestatus angezeigt wird. Nur bei der #Einschalten_1 (_2,_3) wird der INT Wert als Hex angezeigt/gewandelt?! - warum auch immer.

Der sch... Hexcode muss doch ind dez zu bekommen sein - verdammt :-(

Ich danke für jeden Hinweis und werde diesem Tipp nachgehen - ich bin gespannt.

Für weitere Tipps bin ich offen.
danke im Voraus.

mfg
 
Hallo,
wenn dich die Darstellung stört (es handelt sich hier wirklich nur um eben die) dann mach die Eingangsvariable zu einem INT und sie wird dir dezimal angezeigt.
Was mir bei deinen Code-Versuchen so auffällt ist das generelle Zuweisen, das du betreibst.
Wenn du hinter einem Vergleich eine Variable mit "=" zuweisst und eben nicht setzt ober rücksetzt dann hat sie den gewünschten Zustand nur zu dem Zeitpunkt - eine Minute später nicht mehr. Ist das das was du willst ?
Auf der Basis hatte ich auch deinen Code korrigiert ... (siehe meine Beitrag von Gestern)

Gruß
Larry
 
Was mir bei deinen Code-Versuchen so auffällt ist das generelle Zuweisen, das du betreibst.
Wenn du hinter einem Vergleich eine Variable mit "=" zuweisst und eben nicht setzt ober rücksetzt dann hat sie den gewünschten Zustand nur zu dem Zeitpunkt - eine Minute später nicht mehr. Ist das das was du willst ?
gut, wenn es sich lediglich um die Darstellung handelt muss es an etwas anderem leigen das der Vergleich nicht VKE1 wird. Ja es reicht das die Variable zugewiesen wird, der Ausgang des FB wird in einem anderen NW in Abhängigkeit einiger anderer Verknüpfungen gesetzt.

Ich habe eine weitere Erkenntnis:
es muss irgendwie an dem FB liegen, da ich den Vergleich mal in einem FC gemacht habe (Uhrzeit [WORD] gleich Einschaltzeit [WORD]) und siehe da - es funktioniert....
ich werde mal den FB hochladen, viellleicht könntest du mal drauf gucken ;-)

Anbei der FB mit dem IDB und dem FB aufruf in einem FC (die Ein- Ausschaltzeiten kommen aus einer WinCCflex RT)

Vielen Dank.

mfg
 

Anhänge

  • Schaltuhr.zip
    928,6 KB · Aufrufe: 1
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Könntest du vielleicht auch einfach den besagten FB (z.B. als AWL-Quelle) hier mal einstellen ...?

Wird der FB in einem anderem FB aufgerufen ?

der FB Aufruf wird in einem FC realisiert

Hier die AWL-Quelle (die ersten drei NW musste ich wegen Beitragslänge löschen, aber da gab es keine Probleme):

FUNCTION_BLOCK "FB_Schaltuhr"
TITLE =Dreikanal Wochen Zeitschaltuhr
AUTHOR :
VERSION : 0.1


VAR_INPUT
Uhrzeit : WORD ;
Wochentag : BYTE ;
Mo_bis_Fr : BOOL ;
Sa_bis_So : BOOL ;
Mo_bis_So : BOOL ;
Einschalten_1 : WORD ;
Ausschalten_1 : WORD ;
Einschalten_2 : WORD ;
Ausschalten_2 : WORD ;
Einschalten_3 : WORD ;
Ausschalten_3 : WORD ;
END_VAR
VAR_OUTPUT
Schaltuhr_aktiviert : BOOL ;
END_VAR
VAR
Funktion_MoFr_T1_Ein : BOOL ;
Funktion_MoFr_T1_Aus : BOOL ;
Funktion_MoFr_T2_Ein : BOOL ;
Funktion_MoFr_T2_Aus : BOOL ;
Funktion_MoFr_T3_Ein : BOOL ;
Funktion_MoFr_T3_Aus : BOOL ;
Funktion_SaSo_T1_Ein : BOOL ;
Funktion_SaSo_T1_Aus : BOOL ;
Funktion_SaSo_T2_Ein : BOOL ;
Funktion_SaSo_T2_Aus : BOOL ;
Funktion_SaSo_T3_Ein : BOOL ;
Funktion_SaSo_T3_Aus : BOOL ;
Funktion_MoSo_T1_Ein : BOOL ;
Funktion_MoSo_T1_Aus : BOOL ;
Funktion_MoSo_T2_Ein : BOOL ;
Funktion_MoSo_T2_Aus : BOOL ;
Funktion_MoSo_T3_Ein : BOOL ;
Funktion_MoSo_T3_Aus : BOOL ;
Schaltzeit1_aktiviert : BOOL ; //Schaltzeit 1 Zeiten eingestellt
Schaltzeit2_aktiviert : BOOL ; //Schaltzeit 2 Zeiten eingestellt
Schaltzeit3_aktiviert : BOOL ; //Schaltzeit 3 Zeiten eingestellt
Montag : BOOL ;
Dienstag : BOOL ;
Mittwoch : BOOL ;
Donnerstag : BOOL ;
Freitag : BOOL ;
Samstag : BOOL ;
Sonntag : BOOL ;
Woche : BOOL ; //Wochentag liegt zwischen Montag bis Freitag
Wochenende : BOOL ; //Wochentag liegt auf einem Samstag/Sonntag
END_VAR
BEGIN


NETWORK
TITLE =Schaltzeit nach gewählter Funktion
//Abfrage welche Funktion gewählt ist, danach die Istzeit mit der eingestellten
//Schaltzeit vergleichen und mit VKE=1 eine Variable auf "1" setzen.
//================================================Funktion 1
U( ;
U #Mo_bis_Fr; //Funktion Montag bis Freitag
UN #Sa_bis_So;
UN #Mo_bis_So;
U #Woche;
) ;
SPB MoFr;
SPA FKT2;
//--------------------------------------
MoFr: U( ;
U #Schaltzeit1_aktiviert;
SPB ON2;
SPA NXT3;
ON2: L #Uhrzeit;
L #Einschalten_1;
==I ;

) ;
= #Funktion_MoFr_T1_Ein;

U( ;
L #Uhrzeit;
L #Ausschalten_1;
==I ;
) ;
= #Funktion_MoFr_T1_Aus;
//--------------------------------------
NXT3: U( ;
U #Schaltzeit2_aktiviert;
SPB ON3;
SPA NXT4;
ON3: L #Uhrzeit;
L #Einschalten_2;
==I ;

) ;
= #Funktion_MoFr_T2_Ein;

U( ;
L #Uhrzeit;
L #Ausschalten_2;
==I ;
) ;
= #Funktion_MoFr_T2_Aus;

//--------------------------------------
NXT4: U( ;
U #Schaltzeit3_aktiviert;
SPB ON4;
SPA NXT5;
ON4: L #Uhrzeit;
L #Einschalten_3;
==I ;
) ;
= #Funktion_MoFr_T3_Ein;

U( ;
L #Uhrzeit;
L #Ausschalten_3;
==I ;
) ;
= #Funktion_MoFr_T3_Aus;
NXT5: NOP 0;

//================================================Funktion 2
FKT2: U( ;
U #Sa_bis_So;
UN #Mo_bis_Fr;
UN #Mo_bis_So;
U #Wochenende;
) ;
SPB SaSo;
SPA FKT3;
//--------------------------------------
SaSo: U( ;
U #Schaltzeit1_aktiviert;
SPB ON5;
SPA NXT6;
ON5: L #Uhrzeit;
L #Einschalten_1;
==I ;
) ;
= #Funktion_SaSo_T1_Ein;

U( ;
L #Uhrzeit;
L #Ausschalten_1;
==I ;
) ;
= #Funktion_SaSo_T1_Aus;
//--------------------------------------
NXT6: U( ;
U #Schaltzeit2_aktiviert;
SPB ON6;
SPA NXT7;
ON6: L #Uhrzeit;
L #Einschalten_2;
==I ;
) ;
= #Funktion_SaSo_T2_Ein;

U( ;
L #Uhrzeit;
L #Ausschalten_2;
==I ;
) ;
= #Funktion_SaSo_T2_Aus;
//--------------------------------------
NXT7: U( ;
U #Schaltzeit3_aktiviert;
SPB ON7;
SPA NXT8;
ON7: L #Uhrzeit;
L #Einschalten_3;
==I ;
) ;
= #Funktion_SaSo_T3_Ein;

U( ;
L #Uhrzeit;
L #Ausschalten_3;
==I ;
) ;
= #Funktion_SaSo_T3_Aus;
NXT8: NOP 0;
//================================================Funktion 3
FKT3: U #Mo_bis_So;
UN #Mo_bis_Fr;
UN #Sa_bis_So;
SPB MoSo;
SPA NX11;
//--------------------------------------
MoSo: U( ;
U #Schaltzeit1_aktiviert;
SPB ON8;
SPA NXT9;
ON8: L #Uhrzeit;
L #Einschalten_1;
==I ;
) ;
= #Funktion_MoSo_T1_Ein;

U( ;
L #Uhrzeit;
L #Ausschalten_1;
==I ; // gleich?
) ;
= #Funktion_MoSo_T1_Aus;
//--------------------------------------
NXT9: U( ;
U #Schaltzeit2_aktiviert;
SPB ON9;
SPA NX10;
ON9: L #Uhrzeit;
L #Einschalten_2;
==I ;
) ;
= #Funktion_MoSo_T2_Ein;

U( ;
L #Uhrzeit;
L #Ausschalten_2;
==I ;
) ;
= #Funktion_MoSo_T2_Aus;
//--------------------------------------
NX10: U( ;
U #Schaltzeit3_aktiviert;
SPB ON10;
SPA NX11;
ON10: L #Uhrzeit;
L #Einschalten_3;
==I ;
) ;
= #Funktion_MoSo_T3_Ein;

U( ;
L #Uhrzeit;
L #Ausschalten_3;
==I ;
) ;
= #Funktion_MoSo_T3_Aus;
NX11: NOP 0;

NETWORK
TITLE =Schaltuhrausgang Einschalten

U #Mo_bis_Fr;
U( ;
O #Funktion_MoFr_T1_Ein;
O #Funktion_MoFr_T2_Ein;
O #Funktion_MoFr_T3_Ein;
) ;
O ;
U #Sa_bis_So;
U( ;
O #Funktion_SaSo_T1_Ein;
O #Funktion_SaSo_T2_Ein;
O #Funktion_SaSo_T3_Ein;
) ;
O ;
U #Mo_bis_So;
U( ;
O #Funktion_MoSo_T1_Ein;
O #Funktion_MoSo_T2_Ein;
O #Funktion_MoSo_T3_Ein;
) ;
S #Schaltuhr_aktiviert;
NETWORK
TITLE =Schaltuhrausgang Ausschalten

U #Mo_bis_Fr;
U( ;
O #Funktion_MoFr_T1_Aus;
O #Funktion_MoFr_T2_Aus;
O #Funktion_MoFr_T3_Aus;
) ;
O ;
U #Sa_bis_So;
U( ;
O #Funktion_SaSo_T1_Aus;
O #Funktion_SaSo_T2_Aus;
O #Funktion_SaSo_T3_Aus;
) ;
O ;
U #Mo_bis_So;
U( ;
O #Funktion_MoSo_T1_Aus;
O #Funktion_MoSo_T2_Aus;
O #Funktion_MoSo_T3_Aus;
) ;
R #Schaltuhr_aktiviert;
END_FUNCTION_BLOCK
 
Ist deine Uhrzeit möglicherweise BCD-codiert?

Grüße von HaDi

nein, die Uhrzeit schreibe ich in ein Byte
z.B.

db200.dbb28 [BYTE] = Stunde (Anzeigewert 0 bis 23)
db200.dbb29 [BYTE] = Minute (Anzeigewert 0 bis 59)

wenn ich dann db200.dbw28 aufrufe erhalte ich z.B. 1315 für 13:15Uhr angezeigt, diesen Wert möchte ich in dem besagten FB vergleichen....
 
nein, die Uhrzeit schreibe ich in ein Byte
z.B.

db200.dbb28 [BYTE] = Stunde (Anzeigewert 0 bis 23)
db200.dbb29 [BYTE] = Minute (Anzeigewert 0 bis 59)
...
Die Stelle würd ich gern mal sehen.
Wenn du Dezimalwerte in die DBB´s schreibst dann würd ich im DBW für 13:15 den Inhalt 0D0F erwarten.
Ruf doch das DBW mal in einer VAT auf und spiel mit dem Anzeigeformat rum ...

Grüße von HaDi
 
Zurück
Oben