Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Verdrehte Bits (Wilde Pointereien) (https://www.delphipraxis.net/97815-verdrehte-bits-wilde-pointereien.html)

3_of_8 16. Aug 2007 23:07

Re: Verdrehte Bits (Wilde Pointereien)
 
Das gute, alte Big Endian vs. Little Endian-Problem, wenn ich richtig sehe. Es würde z.B. so gehen:

Delphi-Quellcode:
function LittleBigIsEqual(const a, b: Integer): Boolean;
type TIntByteArray=array[0..3] of Byte;
begin
  Result:=(TIntByteArray(a)[0]=TIntByteArray(b)[3]) and
    (TIntByteArray(a)[1]=TIntByteArray(b)[2]) and
    (TIntByteArray(a)[2]=TIntByteArray(b)[1]) and
    (TIntByteArray(a)[3]=TIntByteArray(b)[0]);
end;
Einfacher wäre es vielleicht, wenn du das ganze byteweise holst.

Chemiker 16. Aug 2007 23:44

Re: Verdrehte Bits (Wilde Pointereien)
 
Hallo Phoenix,

die Anlage wird doch mit dem Programm der SPS gesteuert, oder wird mit Deinem Programm während die Anlage läuft Parameter verändert im SPS – Programm? Das würde ich aber für sehr gefährlich halten, weil es eigentlich den Sinn der SPS untergräbt, sonst würde man doch direkt einen PC für die Steuerung der Anlage benutzen.

Und der Status der Anlage sind doch auch Messdaten. Bei Paketen vermute ich mal werden z.B. Zähler, Lichtschranken, Barcodeleser, Geschwindigkeit des Bandes usw. vorhanden sein.

Also bei uns währe es nicht möglich direkt auf die SPS zuzugreifen und Daten auszulesen, weil es da zu leicht zu Fehlern kommen könnte. Es ist auch kein Problem für die SPS die Daten zu senden, bei uns kann die SPS mehr Daten senden als der Rechner überhaut verkraften kann. Deswegen sind wir dazu übergegangen das die SPS nur alle 5 sek. die Daten zum Rechner senden.

Bis bald Chemiker

oldmax 17. Aug 2007 05:46

Re: Verdrehte Bits (Wilde Pointereien)
 
Hi
Nun, ich weiß nicht, um was für eine SPS es sich handelt (Siemens, BBC, Mitsubishi... ) aber eine SPS wird nicht durch den Zugriff und Senden von Datenpaketen an irgendeine Visualisierung ausgebremst und wenn SPS-Programmierer das behaupten, haben sie entweder keine Ahnung oder keine Lust. (letzteres vermutlich, weil man nicht immer gleich einsieht, das so ein Tastenklimperer SPS-Daten haben will...)
Nun ist es auch nicht möglich, das zu lesende Daten im Programm Stolpersteinchen hinterläßt, dazu gehören auch notwendigerweise Schreibzugriffe. Wenn dabei Prozeßrelevante Daten von Rezeptdaten getrennt sind, ist ein schreibender Zugriff auf SPS Datenbausteine kein Problem. Natürlich steht da eine Maschine hinter, die das tut, was im Speicher an Programm hinterlegt ist und da braucht's schon etwas mehr Erfahrung und mit "ich probier mal so" sollte man auch vorsichtig sein.
Ok, Nun zum Problem. Es ist schon ein Unterschied, ob ich Binärinformation oder Zahlenwerte aus einem DB lese. Da diese richtig schön gemischt sein können, ist es notwendig, zu wissen, was steht wo und das sollte in der Doku der DB's hinterlegt sein. ( Ansonsten hat der SPS-Programmierer bös geschlampt und der Nachwelt ein überdimensionales Rätsel hinterlassen...)
Du kannst die Daten entsprechend Byte oder Wortweise aus dem DB holen, mußt dann aber dafür sorgen, das Zahlen und Binärinfos getrennt ausgewertet werden. Floatwerte über Binärmasken zu schicken halte ich für möglich, aber nicht für Sinnvoll, da hat ein PC doch andere Möglichkeiten Daten unverfälscht aufzuarbeiten. Wie gesagt, du mußt nachsehen, was ist Binär, was ist Integer und was Float. Und nicht zu vergessen, manchmal steht auch Text im DB.
Gruß oldmax
( eine von mir betreute Anlage ist 200m lang und das Schalthaus dazu in 2 Etagen, ca. sieben SPS und jede Menge dezentrale Peripherie und Datenkommunikation......)

Phoenix 17. Aug 2007 07:28

Re: Verdrehte Bits (Wilde Pointereien)
 
Es geht doch gar nicht um das fetchen der Daten aus der (Siemens-) SPS ;-)

Da wir in einer Anlage ggf. ZIG Visualisierungsrechner haben, und es vermieden werden soll, dass alle diese Rechner direkt von der SPS beschickt werden oder selber aus der SPS lesen müssen - das hat zum Teil damit zu tun, dass es zwischen Anlage und Verwaltung meistens eine Firewall gibt, die diese zwei Netze bis auf die Datenbank trennt - gibt es eben einen Service, der die kompletten Datenbausteine in einem konfigurierbaren Intervall aus der SPS liest und in die Datenbank schreibt. Und dort stehen sie ja auch richtig drin. Das läuft, das war vorgegeben, da hab ich schon fertigen Code zum Fetchen bekommen, und ich werde einen Teufel tun mich hier deswegen mit meinem Auftraggeber zu streiten ;-)

Die alte Visualisierung die ich gerade erneuere neu schreibe ist nach dem Fetchen hergegangen, und hat jedes einzelne Bit aus dem DB als eigenen Datensatz(!) in die Datenbank gepumpt. Das Problem war dann der Traffic, der ein einzelner Client auf dem Netz erzeugt hat, wenn dort einer die Visumaske aufgemacht hat. Das war dann noch so unglücklich gemacht, dass der echt für jedes Bit ein einzelnes Statement zum holen von der Datenbank gefeuert hat.

Deswegen war meine Idee, das aufdröseln der Daten in die einzelnen Bits eben auf den Client auszulagern, und die Datenbausteine komplett als Blob in die DB zu legen. Dort kann dann jeder der will darauf auswerten und gucken, welcher Antrieb läuft, welcher auf Handsteuerung läuft und wo ggf. welche Störung anliegt.

Ob nun Bits oder Zahlen in dem DB liegen ist mir recht wurscht. Ob die 10 in dem Byte da drin nun bedeutet, dass es die Zahl 10 ist oder dass da das zweite und vierte Bit (von rechts gesehen) gesetzt sind, das kann ich mit meiner Bitmasken-Prüfung einheitlich abfackeln. Auch Texte sind kein Problem.

Meine Frage bezog sich tatsächlich nur auf die Verdrehung der Bytes, sobald ich sie in einen Cardinal stecke. Und nun werde ich das mal mit einem DWORD probieren und gucken ob ich da dann noch drehen muss oder nicht ;-)

Phoenix 17. Aug 2007 07:35

Re: Verdrehte Bits (Wilde Pointereien)
 
Zitat:

Zitat von 3_of_8
Einfacher wäre es vielleicht, wenn du das ganze byteweise holst.

Einfacher ja, aber auf jeden Fall lansgamer. Und ich will vermeiden, dass es flackert wenn sich die Visu neu zeichnet und dazu die Daten aus dem Stream liest.

divBy0 17. Aug 2007 07:39

Re: Verdrehte Bits (Wilde Pointereien)
 
Das verdrehen der Bytes ist bei der S7 aber normal.

Wie ließt du die Daten denn aus der SPS? Mit LibNoDave?

Phoenix 17. Aug 2007 07:50

Re: Verdrehte Bits (Wilde Pointereien)
 
Nochmal langsam zum Mitschreiben *seufz*:
Die Daten werden in der richtigen Reihenfolge von der SPS gelesen.
Die Daten werden in der richtigen Reihenfolge in die Datenbank geschrieben.
Die Daten werden in der richtigen Reihenfolge aus der Datenbank gelesen.
Die Daten werden in der richtigen Reihenfolge in ein Array of Byte geschrieben.
Die Daten werden in der richtigen Reihenfolge aus dem Array of Byte gelesen.

Wenn ich dann jedoch
Delphi-Quellcode:
PCardinal( Integer(PByteArrayPointer) + AStartByte )^
mache, DANN und nicht vorher, werden meine Bytes verwürfelt.

Edit: Aber um Frage dennoch zu beantworten: Für die SPS-Kommunikation werden die LUCA-Komponenten von Langner genommen.

Phoenix 17. Aug 2007 09:02

Re: Verdrehte Bits (Wilde Pointereien)
 
Zitat:

Zitat von Olli
Suche hier:
http://jedi-apilib.cvs.sourceforge.n...11&view=markup
nach "RtlUlongByteSwap" und kopiere den Code. Ist von mir und du darfst es auch ohne die MPL/LGPL verwenden. Wegen einem zweibytigen Opcode muß ich keine Erwähnung irgendwo haben :mrgreen:

Ach was, hier ist sie:

Delphi-Quellcode:
function RtlUlongByteSwap(Source: ULONG): ULONG;
asm
  // This is not written as mnemonics to be compatible with D4!
  db   0Fh, 0C8h      // "bswap EAX" can only be executed on 486+!!!
(*
  // Does the same but perhaps slower ...
                        // Source = $11223344
  rol  AX, 08h       // Source = $11224433
  rol  EAX, 0Fh       // Source = $44331122
  rol  AX, 08h       // Source = $44332211
*)
end;

Hrm.

Ich habe die jetzt so eingebaut:
Delphi-Quellcode:
function TPLCDataModule.SwapBytes(Source: DWORD): DWORD;
asm
  // This is not written as mnemonics to be compatible with D4!
  db 0Fh, 0C8h      // "bswap EAX" can only be executed on 486+!!!
end;
Gibt nur ein Problem damit:
Seltsamerweise liefert die IMMER 888723972 zurück.

Das hier liefert übrigens den richtigen Wert:
Delphi-Quellcode:
Result := Cardinal( (FData^[AIndex] shl 24) + (FData^[AIndex + 1] shl 16) + (FData^[AIndex + 2] shl 8) + FData^[AIndex + 3] );
Aber ich befürchte, das ist um ca. den Faktor vier langsamer, als die Teile am Block rauszulesen.

Oder kann mich da wer beruhigen?

Hawkeye219 17. Aug 2007 09:09

Re: Verdrehte Bits (Wilde Pointereien)
 
Hi Sebastian,

wenn du SwapBytes als Methode definierst, steht im Register EAX der Zeiger auf die aktuelle Instanz, das eigentliche Argument Source wird im Register EDX übergeben. Das Tauschen ist aber unabhängig von der Klasse, deshalb würde ich es als einfache Funktion definieren:

Delphi-Quellcode:
function SwapBytes (Source: DWORD): DWORD;
asm
  // This is not written as mnemonics to be compatible with D4!
  db 0Fh, 0C8h      // "bswap EAX" can only be executed on 486+!!!
end;
Gruß Hawkeye

Phoenix 17. Aug 2007 09:19

Re: Verdrehte Bits (Wilde Pointereien)
 
:wall:

Ich glaub ich brauch heut noch nen Extra-Kaffee zum wachwerden. Klaro.. fühl mich heut früh wie ein Anfänger .oO


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 Uhr.
Seite 2 von 5     12 34     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz