09-30-2008 04:04 AM
Hallo,
ich benutze DIAdem seit kurzem und brauche hilfe bzw. Tipps um weiter zu kommen.
In einem Kanal (Anzeigeformat: numerisch / Datentyp: Float64 ) möchte ich Werte, die ich in HEX konvertiere, im selben Kanal speichern.
dazu-----> temp = "AB01"
Variable1=Mid(temp,1,2)
Variable2=Mid(temp,3,2)
09-30-2008 04:10 AM
Sorry war noch nicht fertig 🙂
temp = HEX (CHD(i,Int(kanalindex)))
temp = "AB01" ' Beispiel
Variable1=Mid(temp,1,2)
Variable2=Mid(temp,3,2)
funktion Append ? Variable2 + Variable1
wie führe ich die beiden Variablen zusammen?
wie speichere ich den Wert im selben channel zurück ?
muss ich den Datenyp bzw. anzeigeformat ändern ?
09-30-2008 04:21 AM
Hallo The Saint!
Mal davon ausgegangen das du zum Schluss wieder eine Zahl haben willst, verstehe ich deinen Code so das du einen 16Bit Integer hast, dessen beiden Bytes du einfach addieren willst. Weil es so schön 'menschenverständlich' ist willst du dafür über das HEX-Format gehen, um die beiden Bytes herauszubekommen. Korrrekt?
Matthias
Matthias Alleweldt Project Engineer / Projektingenieur | Twigeater? |
09-30-2008 04:59 AM
Hallo Mathias,
ich möchte zwar die Bytes zwar herausbekommen aber auch neu zusammenführen.
es handelt sich hier um CAN Botschaften, die mir DIAdem nach der Konvertierung (ins TDM) in Integer Form darstellt. Es gibt kanäle mit 16Bit und andere mit 48Bit.
Nach der Konvertierung INT->HEX sind LSB und MSB umgetauscht, deswegen will ich spliten, neu zusammenführen und ins Kanal als HEX speichern.
warum als HEX? weil ich dann die Bedeutung von den CAN Botschaften als HEX in XML Form habe. Dies werde ich dann in DIAdem parsen, um die Bedeutungen in String format in die Kanäle zu kriegen.
fragen Sie mich falls es noch nicht klar ist
Danke im voraus
Youssef
09-30-2008 09:14 AM
Hallo Youssef!
Es ist mir wirklich noch nicht 100%ig klar ob du die korrigierten Werte wieder als Zahlemwerte haben willst oder als String-Representation im HEX-Format? Du schreibst das es Werte sowohl mit 16 wie auch mit 48Bit gibt. Sollen bei beiden nur LSB und MSB getauscht werden? Bei 48Bit kommt mir das etwas ungewöhnlich vor!
Matthias
Matthias Alleweldt Project Engineer / Projektingenieur | Twigeater? |
09-30-2008 12:22 PM
Hallo Matthias,
Nein, ich möchte die Werte als String-Representation im HEX-Format speichern.
Nicht nur die beiden Bits sollen umgetauscht werden (nur LSB & MSB umtauschen hat kein Sinn), sondern in der Form :
33846 -->> HEX(33846) = 8436 --->> 3684
5243146 -->> HEX(5243146) = 50010A --->> 0A0150
Anbei ist ein Bsp Test.zip (Mein Ziel am Ende ist der Kanalgruppe :Nach_XML_Konvertierung)
Danke
Youssef
09-30-2008 03:59 PM - edited 09-30-2008 04:01 PM
Hallo Youssef!
Jetzt ist es schon fast klar. Ich hab nur noch ein Verständnisproblem damit das deine Konvertierung unabhängig von der Bytezahl zu sein scheint. Ist das so richtig? Erweitert man dein Beispiel noch um eine Zeile mit dem Wert 1 ergibt sich folgende Liste:
1 -->> HEX(1) = 01 --->> 01 01000000
33846 -->> HEX(33846) = 8436 --->> 3684 36840000
5243146 -->> HEX(5243146) = 50010A --->> 0A0150 0A015000
Die blauen Werte wären die m.E. bei 4 Byte sich ergeben müssen.
So nun zum Lösungsansatz. Ist erstaunlich umfangreich und ggf. noch nicht perfekt. Es gibt auch mindestens zwei Lösungen. Ich hab mal die etwas einfachere reingestellt, sollte die Performance nicht reichen muss man einen etwas anderen Weg gehen. Die Anzahl der Bytes hol ich mir über die Kanaleigenschaft 'CANNoOfBits'. Die Erklärung des Codes ist in den Kommentaren:
Option Explicit ' Ergebnisgruppe erstellen (wenn vorhanden vorher löschen If GroupIndexGet("Ergebnis") > 0 Then Call GroupDel( GroupIndexGet("Ergebnis") ) End If Call GroupCreate("Ergebnis") Call GroupDefaultSet( GroupIndexGet("Ergebnis") ) ' Konvertierung der beiden Kanäle Call Convert("SWA/Data_SWA") Call Convert("SWA/var_SWA") ' Konvertierungsfunktion, Übergabeparameter ist der vollqualifierte Kanalname Function Convert(ByRef sgSource) Dim i Dim j Dim s Dim nChn Dim nChnHex Dim sgHex Dim nBytes ' Kanalnummer des Quellkanals bestimmen nChn = CNo(sgSource) ' Ergebnistexkanal mit gleichem Namen anlegen Call ChnAlloc(ChnName(nChn),ChnLength(nChn),1,DataTypeString,"Text") ' Kanalnummer des Ergebnistextkanals ermitteln nChnHex = CNo("Ergebnis/" & ChnName(nChn)) ' Anzahl Bytes bestimmen nBytes = ChnPropValGet(nChn, "CANNoOfBits") / 8 ' Umwandlung in einer Schleife über alle Werte (ggf. nicht performant!) For i=1 To ChnLength(nChn) ' Wert in HEX-String umwandeln sgHex = Hex( ChdX(i,nChn) ) ' ggf. mit führenden Nullen auffüllen sgHex = String(nBytes*2-Len(sgHex),"0") & sgHex ' Bytereihenfolge umkehren s = "" For j=0 to nBytes s = Mid(sgHex,j*2+1,2) & s Next ' neu zusammengesetzt in einen Textkanal speichern ChT(i,nChnHex) = s Next End Function
Sollte was unklar sein bitte nachfragen.
Matthias
Matthias Alleweldt Project Engineer / Projektingenieur | Twigeater? |
10-01-2008 01:32 AM
Da man hier anscheinend Postings nur von der selben IP editieren kann, hier eine kleine Code-Korrektur als Anhang.
Zeile
For j=0 to nBytes
muss
For j=0 to nBytes-1
sein.
Matthias
Matthias Alleweldt Project Engineer / Projektingenieur | Twigeater? |
10-01-2008 06:00 AM
Hallo Matthias,
Danke erstmal für die Hilfe.
es hilft mir schon voranzukommen, bloß ich wollte die Werte im selben Kanal speichern, weil es wichtige Eigenschaften (information) enthält.
kann man nicht "Datentyp" des Kanals ändern und dann die Konvertierung innerhalb des Kanals durchführen?
ansonsten würde ich ein Temp-Kanal in selben Kanalgruppe erstellen, die Eigenschaften von "sgSource" ins neue Kanal kopieren, Konvertierung durchführen und am Ende den sgSource löschen.
MFG
Youssef
10-01-2008 06:29 AM
Hallo Youssef!
Mit dem ChnCopy Befehl kann man Kanäle inklusive aller Eigenschaften kopieren, mit Ausnahme des Kommentar (IMHO sehr doof!). Eine Möglichkeit den Datentyp eines vorhandenen Kanals zu verändern gibt es meines Wissens nicht. Eine Lösung für dich bietet der Befehl ChnPropCopy, mit dem man die Eigenschaften auf den neu allokierten Textkanal kopieren kann.
Matthias
Matthias Alleweldt Project Engineer / Projektingenieur | Twigeater? |