AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Verdrehte Bits (Wilde Pointereien)

Ein Thema von Phoenix · begonnen am 16. Aug 2007 · letzter Beitrag vom 4. Sep 2007
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#11

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 17. Aug 2007, 00:07
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#12

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 17. Aug 2007, 00:44
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
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
oldmax

Registriert seit: 27. Apr 2006
Ort: Gieboldehausen
167 Beiträge
 
#13

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 17. Aug 2007, 06:46
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......)
Noch ist mein Rechner mir zu Diensten.... ansonsten habe ich die Macht ihn zu vernichten !
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#14

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 17. Aug 2007, 08:28
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
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#15

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 17. Aug 2007, 08:35
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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von divBy0
divBy0

Registriert seit: 4. Mär 2007
Ort: Sponheim
1.021 Beiträge
 
Delphi XE2 Professional
 
#16

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 17. Aug 2007, 08:39
Das verdrehen der Bytes ist bei der S7 aber normal.

Wie ließt du die Daten denn aus der SPS? Mit LibNoDave?
Marc
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#17

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 17. Aug 2007, 08:50
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 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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#18

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 17. Aug 2007, 10:02
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

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:
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?
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#19

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 17. Aug 2007, 10:09
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
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#20

Re: Verdrehte Bits (Wilde Pointereien)

  Alt 17. Aug 2007, 10:19


Ich glaub ich brauch heut noch nen Extra-Kaffee zum wachwerden. Klaro.. fühl mich heut früh wie ein Anfänger .oO
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:46 Uhr.
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