Vorzeichen Word

emilio20

Well-known member
Beiträge
825
Punkte Reaktionen
20
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo

Ich habe mir einen Baustein erstellt der ein Eingangs Word und ein Speicher Word miteinander vergleicht. Ändert sich was am Eingangs Word
möchte ich die Bits in ein MELDUNG_ALARM_FENSTER (WORD) schreiben.

Hierfür verwende ich folgende Funktion

Code:
MELDUNG_ALARM_FENSTER:=INT_TO_WORD (WORD_TO_INT(SPEICHER_FENSTER) - WORD_TO_INT(EW_FENSTER));

mein Problem ist das ich das forzeichen des MELDUNG_ALARM_FENSTER weg bekommen muss da ich machnal die falschen bits bekomme.

Ich bekomme z.b -512 DEZ benötige aber 512 DEZ

wie kann ich das Vorzeichen in einem Word entfernen ?
 
OP
emilio20

emilio20

Well-known member
Beiträge
825
Punkte Reaktionen
20
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo
jetzt habe ich aber das Problem bei den Positiven Zahlen.

Wie kann ich bei Word eine Bedienung abfragen?

Wenn negativ dann AND W#16#7FFF

Habs jetzt so gelöst

Code:
// Alammeldungen ausgeben
      IF ALARM = TRUE THEN
          IF WORD_TO_INT(SPEICHER_FENSTER) > WORD_TO_INT(EW_FENSTER)THEN
             MELDUNG_ALARM_FENSTER:=INT_TO_WORD (WORD_TO_INT(SPEICHER_FENSTER) - WORD_TO_INT(EW_FENSTER));
          ELSE
             MELDUNG_ALARM_FENSTER:=INT_TO_WORD (WORD_TO_INT(EW_FENSTER) - WORD_TO_INT(SPEICHER_FENSTER));
          END_IF;

jetzt klappts.

Aber was ich noch nicht wuste ich kann mit AND was ADDIEREN ? geht das mit jeder Var in SCL ?
 
Zuletzt bearbeitet:

zotos

Well-known member
Beiträge
4.461
Punkte Reaktionen
1.153
Warum verwendest Du nicht einfach die ABS() Funktion um das Vorzeichen zu eliminieren?
Code:
MELDUNG_ALARM_FENSTER:=INT_TO_WORD (ABS(WORD_TO_INT(SPEICHER_FENSTER) - WORD_TO_INT(EW_FENSTER)));

Dann kannst Du Dir die ganze IF Abfrage sparen.
 

Larry Laffer

Supermoderator
Teammitglied
Beiträge
13.092
Punkte Reaktionen
2.719
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo,
da es dir hier ja wahrscheinlich ums ausmaskieren geht ... warum benutzt du dafür denn nicht AND und Konsorten (also die Logik-Funktionen) anstatt der Rechenfunktionen, die dir wegen dem Vorzeichenbit (u.a.) ja immer wieder Probleme bereiten werden ?

Gruß
Larry
 

zotos

Well-known member
Beiträge
4.461
Punkte Reaktionen
1.153
Hallo,
da es dir hier ja wahrscheinlich ums ausmaskieren geht ... warum benutzt du dafür denn nicht AND und Konsorten (also die Logik-Funktionen) anstatt der Rechenfunktionen, die dir wegen dem Vorzeichenbit (u.a.) ja immer wieder Probleme bereiten werden ?

Gruß
Larry

Das sind aber grundverschiedene Sachen!

Mir ist ja auch nicht kalr was der TE versucht umzusetzen. Aber man kann durch einfaches Ausmaskieren nicht den Absolutwert ermitteln. Da kommt dann eine ganz andere Zahl raus!

Für den interessierten Leser:
http://de.wikipedia.org/wiki/Einerkomplement


[edit]Klar kann man da nun mit XOR usw es zwanghaft auch mittels Maskieren lösen... [/edit]
 
Zuletzt bearbeitet:

hucki

User des Jahres 2014
Beiträge
5.550
Punkte Reaktionen
1.651
...
[edit]Klar kann man da nun mit XOR usw es zwanghaft auch mittels Maskieren lösen... [/edit]
Warum ist das:
Code:
MELDUNG_ALARM_FENSTER := SPEICHER_FENSTER XOR EW_FENSTER;
gegen das:
Code:
MELDUNG_ALARM_FENSTER:=INT_TO_WORD (ABS(WORD_TO_INT(SPEICHER_FENSTER) - WORD_TO_INT(EW_FENSTER)));
zwanghaft?
 
Zuletzt bearbeitet:

zotos

Well-known member
Beiträge
4.461
Punkte Reaktionen
1.153
Zuviel Werbung?
->Hier kostenlos registrieren
Nochmal:
...
Mir ist ja auch nicht klar was der TE versucht umzusetzen.
...

Der Einwand mit XOR kam übrigens von mir. Die maskiererei mit hex7FFF, dass wilde wandeln von INT_TO_WORD und umgekehrt war auch nicht meine Idee.

Mein Einwand bezog sich lediglich darauf das man aus einer -512 am einfachsten und übersichtlichsten eine 512 erzeugen kann wenn man den Absolutwert davon nimmt.
 

hucki

User des Jahres 2014
Beiträge
5.550
Punkte Reaktionen
1.651
... Der Einwand mit XOR kam übrigens von mir. ...
Deswegen hat mich ja interessiert, warum Du als anerkannte SCL-Koryphäe Deinen eigenen Vorschlag für zwanghaft hältst?

Zumal der TE ja offensichtlich einige Funktionen nicht kennt.
[FONT=arial, sans-serif][/FONT]
 
OP
emilio20

emilio20

Well-known member
Beiträge
825
Punkte Reaktionen
20
Hallo
ich beschreibe mal kurz was ich vor hatte.

Ich wolle eine Alarmanlage Programmieren die bei Aktivierung den Zustand aller Fenster Speichert, da es im Sommer vorkommt das einige Fenster gekippt sind.

Hierfür habe ich alle Eingänge in ein EW gespeichert und dies auf Veränderung verglichen. Wenn sich jetzt ein Bit ändert wollte ich diese in ein MELDUNG_ALARM (Word) schreiben umso am HMI die entsprechende Text Meldung zu erzeigen z.b Einbruch Fenster Wohnzimmer.
Funktioniert mit dieser Funktion super


Code:
MELDUNG_ALARM_FENSTER:=INT_TO_WORD (ABS(WORD_TO_INT(SPEICHER_FENSTER) - WORD_TO_INT(EW_FENSTER)));
 

hucki

User des Jahres 2014
Beiträge
5.550
Punkte Reaktionen
1.651
Zuviel Werbung?
->Hier kostenlos registrieren
... Wenn sich jetzt ein Bit ändert ...
wie von Zotos gesagt, filtert XOR auch die geänderten Bits heraus:
Code:
[LEFT][COLOR=#333333]MELDUNG_ALARM_FENSTER := SPEICHER_FENSTER XOR EW_FENSTER;[/COLOR][/LEFT]
und Du sparst dir die ganze Umwandelei, aber letztendlich mußt Du mit klar kommen.
;)
 

Larry Laffer

Supermoderator
Teammitglied
Beiträge
13.092
Punkte Reaktionen
2.719
Da es ja tatsächlich um das Maskieren von Bits geht würde ich auf jeden Fall die XOR-Variante der Rechnerei vorziehen ...

Gruß
Larry
 
OP
emilio20

emilio20

Well-known member
Beiträge
825
Punkte Reaktionen
20
Ok versuche ich mal

Was genau machen diesen Funktionen AND OR mit einem WORD

Werden bei AND 2 Word Variablen Addiert ? Was passiert dann bei OR

XOR
EW1 1100_0100_1111_1111
EW2 1110_0100_1111_1111

EG 0010_0000_0000_0000

Ergebenis AND OR ??
 
Zuletzt bearbeitet:

Larry Laffer

Supermoderator
Teammitglied
Beiträge
13.092
Punkte Reaktionen
2.719
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo,
es wird nicht gerechnet sondern verknüpft. Beispiel :
Code:
1001
1110
AND
1000

1001
1000
OR
1001

1001
1110
XOR
0111
im Prinzip genau wie bei der Bit-Verknüpfung - nur für mehrere gleichzeitig ...

Gruß
Larry
 

Larry Laffer

Supermoderator
Teammitglied
Beiträge
13.092
Punkte Reaktionen
2.719
Bezogen auf dein Beispiel :
Code:
EW1  1100_0100_1111_1111
EW2  1110_0100_1111_1111
AND
EG    1100_0100_1111_1111

EW1  1100_0100_1111_1111
EW2  1110_0100_1111_1111
OR
EG    1110_0100_1111_1111
AND ergibt ein TRUE wenn beide Bits an gleicher Position = TRUE sind
OR ergibt ein TRUE wenn eines Bits an gleicher Position = TRUE sind
XOR ergibt ein TRUE wenn beide Bits an gleicher Position unterschiedlich sind

Gruß
Larry
 

zotos

Well-known member
Beiträge
4.461
Punkte Reaktionen
1.153
Zuviel Werbung?
->Hier kostenlos registrieren
Jetzt wird die Aufgabe ja langsam verständlich.

Ich würde das ganze wie folgt angehen:

Interessant sind doch die Fenster die gerade geöffnet werden, folglich würde ich mit einer negativen Flanke (Da ein geschlossenes Fenster ein True signal liefern sollte) der Signale eine Aktion ausführen (in dem Fall eine Meldung generieren).

Code:
Geoeffnet := Speicher AND NOT Aktuell;
Speicher := Aktuell;

Im Word Geoeffnet findet man nur Flanken und zwar die derer Fenster die gerade einen Signalwechsel von True auf False erlebt haben.
 

zotos

Well-known member
Beiträge
4.461
Punkte Reaktionen
1.153
Alternativ kann man die Übernahme vom Aktuellenwert in den Speicher noch bedingt machen dann bekommt man nicht nur Flanken.
 

SPS`ler

Member
Beiträge
11
Punkte Reaktionen
0
Hab auch mal ne Frage zum Word bzw DWord.
Wieso bekomme ich bei einem in der Symboltabelle angelegten Dword eine -2147483648 raus wenn ich bit 0.7 setze?
Ich dachte bei DWord gibt's kein Vorzeichen?

0.7-0.0 1.7-1.0 2.7-2.0 3.7-3.0
Für einen Störmanager benötige ich die Stelle des Bits mit der höchsten Wertigkeit um die dazugehörige Stelle auszugeben. Dies
funktioniert auch super bis bit 0.7 auslöst. Ich brauche keine -2147483648 sondern +2147483648 (10000000000000000000000000000000)

verwende ich ABS bei -2147483648 kommt ne 0

Was mach ich denn nun damit?
 
Oben