Negative Zahl richtig auslesen (AGLink)

MikeJ

Level-1
Beiträge
80
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

ich lese mittels AGLink einige DW einer S7-300 aus. So lange die Zahlen positiv sind, ist ja auch alles OK. Bei der Negativen kommt am PC verständlicherweise Müll raus. Gibt´s im .NET Framework dafür schon ne fertige Funktion um die Zahl wieder zu "Richten" oder muss ich mir das selbst basteln?!

Gruß Mike
 
Kenne das Produkt nicht, kann es sein, dass Du eine Extension anhängen musst?
Bei Applicom zB muss man schreiben DB100.DBD10 F damit das als Gleitkommazahl interpretiert wird.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
nein, ich gebe hier beim Abruf der Daten schon das Format an.
Also W für ein Word. Bei einem DoppelWord habe ich die Möglichkeit Value und fValue anzugeben und dann wird auch gleich umgerechnet. Beim Word bringt mir die Abfrage mit der Angabe Value leider gleich schon einen Fehler, da dies nur W zulässt.
 
Die Beispiel-Abfrage aus dem AGLink API Guide:

Dim rwfield(0) As AGL4.DATA_RW40
rwfield(0) = new AGL4.DATA_RW40()
rwfield(0).BitNr = 0
rwfield(0).DBNr = 100
rwfield(0).Offset = 28
'Bei ReadMix,WriteMix, OptReadMix oder OptWriteMix wird für "OpAnz" der Wert "1" erwartet
rwfield(0).OpAnz = 1
rwfield(0).OpArea = AGL4.AREA_DATA
rwfield(0).OpType = AGL4.TYP_WORD
rwfield(0).Result = 0
ReDim rwfield(0).W(rwfield(0).OpAnz)
rwfield(0).W(0) = 0

'Für einen erfolgreichen Aufruf, muss eine Verbindung bis zum AG aufgebaut sein.

Dim result As Int32 = agl.ReadMix(rwfield, rwfield.Length)



Hiermit frage ich DB100.DBW28 ab. In diesem Datenword steht laut VAT -5, AGLink liefert mir jedoch 65531.
Soweit ist das ja auch richtig, ich suche jetzt nur nach einer einfachen Möglichkeit die 65531 (im PC!) in -5 um zurechnen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
der return-value von agl.ReadMix() ist Int32? dann sollte er doch auch richtig dargestellt werden.

probiere mal

Code:
*
Convert.ToInt32(agl.ReadMix(rwfield, rwfield.Length));

Convert.ToInt32 wertet den input als zweierkomplement aus
 
Hallo,
leider ist es mir bisher noch nicht gelungen (trotz entsprechender Absichten) mich da intensiver einzuarbeiten - aber die folgende Zeile stört mich ein bißchen :
rwfield(0).OpType = AGL4.TYP_WORD
Versuch doch mal dort als OPType ein AGL4.TYP_INT (wenn es das gibt, was ich mir gut vorstellen kann) vorzugeben. Das sollte nah meiner Vorstellung das korrekte Ergebinis bringen ...

Gruß
Larry
 
Hallo zusammen,

sorry, ich hatte die exakte Rückmeldung der Funktion vergessen - sie wird Asynchron aufgerufen und der Rückgabewert beim Abruf eines Word´s ist UShort (also Vorzeichenlose 16Bit Ganzzahl).
Demnach 0 bis +65535 am PC, jedoch -32767 bis +32767 an der SPS.

Der Wert -5 an der SPS ergibt dann +65531 am PC
- die Konvertierung in INT32 ergibt +65531
- die Konvertierung in INT16 löst eine Ausnahme aus

Beim OPType kann ich für ein Word nur AGL4.TYP_WORD auswählen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du kannst den Int wertin ein Byte Array Konvertieren und zurückwandeln...

byte[] bytes = BitConverter.GetBytes(value);
int16 wrt = BitConverter.ToInt16(bytes , 0);

Ich denke das müsste klappen, da BitConverter.GetBytes bei einem UInt16 und Int16 die gleichen Bytes ergeben müsste. Danach wird das ganze mit BitConverter.ToInt16 als int16 interpretiert!

Aber Ich bin mir fast sicher, das AGLink das irgenwie auch direkt könnte! (Aber dazu kenne Ich die Lib zu wenig!)
 
Zurück
Oben