LabVIEWForum.de
Motorola S-Record - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Motorola S-Record (/Thread-Motorola-S-Record)

Seiten: 1 2


Motorola S-Record - JATler - 14.08.2017 10:06

Hallo,

ich habe ein file im Motorola S-Record Format und möchte die line checksum prüfen. Im Beispiel sind Start code, Record type und Cecksum bereits entfernt, also nur noch die Daten übrig. Gibt es ein Möglichkeit das ohne Schleife durch String Formatierung, Umwandlung oder ähnliches besser zu lösen ?

Gruß,
JATler


RE: Motorola S-Record - GerdW - 14.08.2017 11:38

Hallo JATler,

Zitat:Gibt es ein Möglichkeit das ohne Schleife durch String Formatierung, Umwandlung oder ähnliches besser zu lösen ?
Du hast einen Input-String.
Du willst mit dessen Inhalt eine Rechnung (mit Zahlenwerten!) durchführen.
Du willst dazu den String in seine Einzelwerte zerlegen und jeden Wert auch einzeln behandlen.

Warum willst du für all das auf eine Schleife und etwas Mathematik verzichten? (Wie soll das gehen?)
Was stört dich an deiner vorhandenen Lösung?


RE: Motorola S-Record - jg - 14.08.2017 11:58

Ich hätte es ähnlich gemacht. Allerdings stimmt deine Checksummen-Berechnung nicht, vgl. hier.

Gruß, Jens


RE: Motorola S-Record - JATler - 14.08.2017 12:07

Hallo GerdW,

ja, ich habe einen Input-String dessen Inhalt ich in Einzelwerte zerlegen und damit rechnen will und nein, ich will nicht jeden einzeln behandeln. Mein file hat über 20.000 Zeilen, sodass diese Schleifenlösung dauert. Ich hoffe auf eine etwas elegantere Lösung und schnellere Lösung. Um bei meinem Beispiel zu bleiben, ich will: 22h + 00h + 00h + 00h + 34h + 63h + ... + 69h rechnen, damit ist Chksum Berechnung noch nicht abgeschlossen, das ist aber das wesentliche Problem. Die Einzelwerte sind immer 2 Characters lang. Habe Versuche mit String deserialisieren und Tabellen-String nach Array gemacht (siehe Anhang), kriegs aber nicht hin.

Gruß
... oder anders gefragt:

Wie kann ich diesen String (ohne Schleife, mit einer Funktion) in ein 1D Array aus zwei Zeichen langen Strings umwandeln ?


RE: Motorola S-Record - GerdW - 14.08.2017 12:50

Hallo JATler,

Zitat:Wie kann ich diesen String (ohne Schleife, mit einer Funktion) in ein 1D Array aus zwei Zeichen langen Strings umwandeln?
Genau das ist der Knackpunkt.
Dein String ist eben in "normalem" Displaymode und du musst eben erstmal je zwei Zeichen nehmen und dann in eine Zahl umwandeln. Das geht am einfachsten mit einer Schleife…
Wenn der String schon im "Hex-Display" wäre, ginge es einfacher!

Zitat:Mein file hat über 20.000 Zeilen, sodass diese Schleifenlösung dauert.
Die Umwandlung und die Checksum-Berechnung in ein reentrant-VI programmieren. Dann die Zeilen deiner Datei einlesen und mit einer parallelisierten FOR-Loop abarbeiten. Mein Octacore hier arbeitet VIs bei effizienter Programmierung eben auch mit (nahezu) 8facher Geschwindigkeit ab… Big Grin


RE: Motorola S-Record - jg - 14.08.2017 15:59

(14.08.2017 12:50 )GerdW schrieb:  Hallo JATler,

Zitat:Wie kann ich diesen String (ohne Schleife, mit einer Funktion) in ein 1D Array aus zwei Zeichen langen Strings umwandeln?
Genau das ist der Knackpunkt.
Dein String ist eben in "normalem" Displaymode und du musst eben erstmal je zwei Zeichen nehmen und dann in eine Zahl umwandeln. Das geht am einfachsten mit einer Schleife…
Wenn der String schon im "Hex-Display" wäre, ginge es einfacher!
Damit er sicher übertragbar ist, liegt so ein Motorola S-Record File aber im "ASCII-Modus" vor...

Gruß, Jens


RE: Motorola S-Record - JATler - 15.08.2017 07:29

Moin,

also, mal zur Ansicht (siehe Anhang), die Schleifenlösung ist schon was langsames, mein "Nichtschleifenansatz" ist zwei- bis dreimal schneller. Parallelisierung ist natürlich ein Ansatz, da ich aber nicht genau weiß wie viele S-Records es sind muss man sicher einigen Gehirnschmalz in die "Verteilung" stecken. Ich hatte gehofft durch eine geschickte Transformation des Strings ein Array aus zwei-Zeichen-Strings zu erzeugen, welches ich dann auf die Funktion Hex-String-nach-Zahl gebe und dieses wiederum auf Array addieren usw. Da ist man ja mit der Funktion Tabellen-String nach Array auch nah dran, nur leider gibts im S-Record kein Trennzeichen. Kann ich nicht irgenwie eine Formatierung vorgeben die LV dazu veranlasst immer zwei Zeichen in ein Array-Element zu packen ?

Gruß,
JATler


RE: Motorola S-Record - jg - 15.08.2017 09:08

Nette Umsetzung! Top1

Gruß, Jens


RE: Motorola S-Record - GerdW - 15.08.2017 09:13

Hallo JATler,

Zitat:Kann ich nicht irgenwie eine Formatierung vorgeben die LV dazu veranlasst immer zwei Zeichen in ein Array-Element zu packen ?
Du könntest ScanFromString mit dem Format %2s verwenden - aber ob das jetzt schneller wird…

Zu deiner Umsetzung:
- Bei der zweiten Umsetzung würde ich das "-48" vor dem ArrayDecimate durchführen…

Hier noch ein anderer Ansatz:
[attachment=58136]
Du musst nur die LookupTable (LUT) für die Umwandlung von ASCII-Wert in Zahlenwert vervollständigen, die Tipparbeit habe ich mir hier gespart…
(Edit: auch hier kann die Umwandlung über die LUT natürlich vor dem Decimate durchgeführt werden.)

Zitat:Parallelisierung ist natürlich ein Ansatz
Damit meinte ich die parallelisierte FOR-Loop wie im Bild.


RE: Motorola S-Record - JATler - 15.08.2017 09:39

... so, wird langsam, Faktor 7 bis 8 (siehe Anhang)

LUT ist nochmal ein schöner Ansatz, probier ich aus und danke für den Tip "ScanFromString mit dem Format %2s"

Warum würdest Du die "-48" vor dem ArrayDecimate durchführen ? Wenn ich das in beide Zweige packe habe ich doch die Chance auf Parallelisierung oder ?

Gruss