DIAdem

cancel
Showing results for 
Search instead for 
Did you mean: 

Anzeigeformat des Kanals ändern

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)

0 Kudos
Message 1 of 11
(5,887 Views)

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 ?

0 Kudos
Message 2 of 11
(5,883 Views)

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?  
0 Kudos
Message 3 of 11
(5,880 Views)

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

0 Kudos
Message 4 of 11
(5,878 Views)

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?  
0 Kudos
Message 5 of 11
(5,867 Views)

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

 

 

 

0 Kudos
Message 6 of 11
(5,860 Views)

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

 

 

 

Message Edited by Twigeater on 09-30-2008 11:01 PM
Matthias Alleweldt
Project Engineer / Projektingenieur
Twigeater?  
0 Kudos
Message 7 of 11
(5,843 Views)

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?  
0 Kudos
Message 8 of 11
(5,827 Views)

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

0 Kudos
Message 9 of 11
(5,822 Views)

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?  
0 Kudos
Message 10 of 11
(5,818 Views)