# Zwei Wörter vergleichen?



## Küffel (1 Oktober 2004)

Hallo,

bin einsteiger und probiere mich fast ausschließlich in FUP, vielleicht ist nun der Zeitpunkt gekommen um nach AWL überzugehen?!

Folgendes Problem:

1a) Ich habe ein Wort und möchte dieses mit einem anderen auf Gleichheit überprüfen und ein VKE=1 bei Gleichheit erhalten. 
Das kann doch nicht so schwer sein...

1b) Sollte die Lösung meines Problems nur in AWL umzusetzen sein, wie kann ich dann AWL in FUB einfügen? Da gibts doch bestimmt so etwas wie bei C wenn ich Assembler einbinde, oder?

Vielen Dank für eure Bemühungen

Küffel


----------



## Zottel (1 Oktober 2004)

1a)
L Wort1	// lade das 1.Wort in Akku 1
L Wort2	// lade das 2.Wort in Akku 1, wobei das 1. in Akku2 "rutscht"
=I		// vergleiche Akkus, Ergebnis ins VKE
= A0.4	// mit dem VKE kannst du normal weiterarbeiten...

1b) Du kannst auf AWL Darstellung umschalten und dann ein einzelnes Netzwerk in AWL schreiben. 
Bei der FUP-Darstellung des ganzen Bausteins erhältst du später an dieser Stelle eine Meldung, das Netzwerk sei nicht in FUP darstellbar und bekommst es wieder in AWL angezeigt.


----------



## Küffel (1 Oktober 2004)

*Vielen Dank*

Das ging ja wirklich schnell, Danke!!!


----------



## Markus (1 Oktober 2004)

geht aber auch in fup über eine comp box.

mach mal in fup die bibliotek auf, dort findest du vergleicher...


----------



## Anonymous (1 Oktober 2004)

@Markus

Aber keine für wort, oder habe ich was übersehen?


----------



## Question_mark (1 Oktober 2004)

*Vergleicher*

Hallo Gast,


> oder habe ich was übersehen?


Ja.
Gruss
Question_mark


----------



## Küffel (1 Oktober 2004)

Hallo Question_mark,

der Gast war ich, hatte vergessen mich anzumelden.

Habe unter Vergleicher aber nur welche die int, dint oder real erwarten. Markus schreibt was von einer comp box, wo finde ich die?

Programmieren Profis eigentlich alles in AWL?

Nochmals vielen Dank, und sorry für die sicherlich lächerlichen Fragen :?: 

Küffel


----------



## smoe (1 Oktober 2004)

> Habe unter Vergleicher aber nur welche die int, dint oder real erwarten.


int ist schon mal ein Wortformat, dint und real sind Doppelwörter.


> Programmieren Profis eigentlich alles in AWL?


Nein, Die Darstellung in FUP ist gebräuchlich weil übersichtlicher solange es nicht zu umständlich wird. Es gibt aber sicher "Coder" die alles in AWL schreiben um den Abstand zu uns normalen Programmierknechten zu verdeutlichen.  :wink: 


> Nochmals vielen Dank, und sorry für die sicherlich lächerlichen Fragen :?:


Es gibt keine lächerlichen Fragen. Wir haben alle mal angefangen.

Schau dir mal die Hilfe an zu den "Boxen". Da kommst dann schnell drauf wie das läuft. Einfach markieren und F1 drücken.

smoe


----------



## Question_mark (2 Oktober 2004)

*Vergleicher*

Hallo Küffel,


> aber nur welche die int, dint oder real erwarten


Int      = 16 Bit mit Vorzeichen (lat. Signum)
Word  = 16 Bit ohne Vorzeichen
Gleiche Wordbreite, also wird der Vergleich mit Int die gleichen Ergebnisse wie bei Word liefern.


> sorry für die sicherlich lächerlichen Fragen


Es gibt keine lächerlichen Fragen, nur lächerliche Antworten.
Aber ich denke mal , für eine schnelle Lösung in AWL hat Zottel Dir ja schon die Antwort geliefert.
Gruss
Qusestion_mark


----------



## Zottel (2 Oktober 2004)

> Int = 16 Bit mit Vorzeichen (lat. Signum)
> Word = 16 Bit ohne Vorzeichen
> Gleiche Wordbreite, also wird der Vergleich mit Int die gleichen Ergebnisse wie bei Word liefern.


Gerade das ist NICHT der Fall:
Der Verglaich von Ints interpretiert den Inhalt der Worte als Zweierkomplement. Das tut auch mein AWL-Beispiel. Bei "gleich" ist das egal, aber nicht bei "größer" und "kleiner"!

Also:
0x7ffe =32766
0x7fff =32767
0x8000 =-32768
...
0xffff =-1 

0xffff < 0x0000 !!!

Soweit ich weiß, kennt die S7 keinen Vergleich, der die Worte als positive Ganzzahl im Bereich 0..65535 interpretiert (unsigned short). Du kannst das aber nachbilden, indem du beide Zahlen in das untere Wort zweier DWORDs lädtst und deren obere Teilworte auf 0 setzt. Anschließend liefert ein DWORD Vergleich (=D) das Ergebnis.

Ein anderer Weg zur Nachbildung wäre, zunächst auszuwerten, ob eine der Zahlen negativ ist und davon abhängig das Vergleichsergebnis zu invertieren, aber das ist ist ziemlich umständlich und fehlerträchtig.


----------



## Question_mark (2 Oktober 2004)

*Vergleicher*

Hallo,


> Gerade das ist NICHT der Fall:


Da hat Zottel recht, das funktioniert nur bei Vergleich '==' oder '<>' oder wenn der Wert beider Zahlen <= 32767 und nicht negativ ist. Ich hatte dabei irgendwas von intelligenten Compilern im Hinterkopf, die den Datentyp automatisch erweitern. Das ist bei der S7 natürlich nicht der Fall !  
Ich denke, der beste Weg ist, wie von Zottel vorgeschlagen, den Umweg über DWORD's zu gehen.
Gruss
Question_mark
Editiert um 19.50 QM


----------



## ross (31 Dezember 2010)

Hallo, 
ich will auch zwei Wörte aus einem DB vergleichen, leider klapt es nicht - kann mir hier jemand sagen warum?


----------



## PN/DP (31 Dezember 2010)

ross schrieb:


> ich will auch zwei Wörte aus einem DB vergleichen, leider klapt es nicht


*Was genau* klappt denn nicht?
Gibt es irgendwelche Fehlermeldungen oder funktioniert die Programmlogik nicht wie erwartet?

Harald


----------



## jabba (31 Dezember 2010)

Ist das S7-300/400 dann heisst das

DB10.dbw0


----------



## ross (31 Dezember 2010)

PN/DP schrieb:


> *Was genau* klappt denn nicht?
> Gibt es irgendwelche Fehlermeldungen oder funktioniert die Programmlogik nicht wie erwartet?
> 
> Harald



Fehlermeldung gibts keine, 
von Programmlogik: "==I" vergleich Akku2 mit Akku1, werte direkt aus DB vergleichen sollte auch funktionieren da die Werte werden ins Akku geladen.
nur bei == gibts keine "1" warum?


----------



## borromeus (31 Dezember 2010)

Was ist ein "DBU"?


----------



## PN/DP (31 Dezember 2010)

ross schrieb:


> nur bei == gibts keine "1" warum?


Weil die Werte in DB10.DBW0 und DB10.DBW2 nicht gleich sind?

Harald


----------



## ross (31 Dezember 2010)

PN/DP schrieb:


> Weil die Werte in DB10.DBW0 und DB10.DBW2 nicht gleich sind?
> 
> Harald



es ist (soll) eine Füllmengeüberwachung, über TP wird ein Soll vorgegeben und in DB10.DBW2 abgelegt, die tatsächliche Menge wird in DB10.DBW0 abgelegt.
Ist der Sollwert erreicht, schalten sich die Pumpen aus.


----------



## jabba (31 Dezember 2010)

Dann würd ich aber schreiben


```
L DB10.dbw0
L DB10.DBW2
>=I
O Reset
=#HM2
```
Ansonsten würde wenn schon überfüllt sein sollte nicht abgeschaltet


----------



## PN/DP (31 Dezember 2010)

Jep, wie jabba schon schrieb: *>=I* benutzen.
(Screenshot machen hat sich Dank jabba erledigt  )

Harald


----------



## ross (31 Dezember 2010)

Danke, es funktioniert........und wieder was gelernt.

es stimmt doch ...Man wird nicht älter, sonder Besser!

noch einmal Danke und Guten Rutsch!


----------

