DIAdem

cancel
Showing results for 
Search instead for 
Did you mean: 

Kanalinhalt filtern

Ich habe ein Kanal mit Sensornummer und ein Kanal mit Testzustand z.B. :

  Sensornr           Testzustand
      15                       testen
      15                   eingelaufen
      15                   eingelaufen
      73                   eingelaufen
      73                      lagern
      73                   eingelaufen
      80                      lagern
      80                      lagern
      80                      testen
      95                      testen
      95                      testen
      95                   eingelaufen
      95                   eingelaufen

es kommt auch vor, dass d. Datum oder Sensornr. doppelt oder dreifach vorhanden ist.

ich wollte mit folgenden schritte folgendes filtert: Ich möchte in einer neuen Kanalgruppe mit alle Sensoren die eingelaufen sind

Dim sTestzustand : sTestzustand  = "eingelaufen"
 

' Steuerkanal definieren
Call chnCalculate("ch(""[2]/ControlChn"") = ctnv((ch(""[1]/[33]"") = " & CHR (34) & sTestzustand  & CHR (34) &  ")=0)")

'   abhängig vom Steuerkanal Ergebnisse berechnen
Call ChnNovHandle("[2]/ControlChn","'[1]/Sensornr", "Delete","XY",0,0,0)


Jetzt entsteht einen neue Kanalgruppe mit folgenden sensoren, die d. Bedingung erfüllen

Sensornr             Testzustand
      15                   eingelaufen
      15                   eingelaufen
      73                   eingelaufen
      73                   eingelaufen
      95                   eingelaufen
      95                   eingelaufen


Jetzte möchte ich aus diesem Ergebnis in einer neuen Kanalgruppe gezeigt bekommen, welche sensoren ich jetzte habe und nicht wieviele.

Das Ergebnis soll dann so aussehen:

Sensornr.
     15
     73
     95

wie kann ich sowas machen bzw. wie bekomme ich so ein Kanalinhalt?? DANKE!
0 Kudos
Message 1 of 12
(6,126 Views)
Hallo,
hier ist *ein* Vorschlag, wie man das machen kann. Sicher gibt es auch noch andere Lösungen. Der Trick ist, für das Sammeln der Sensoren das VBS Dictionary Objekt zu nutzen - auch wenn es sich hier nicht um klassische Dictionary Einträge handelt. Aber das Objekt bietet sehr hilfreiche Funktionen wie zum Beispiel .exists.

ValuetoChn ist eine ziemlich neue Funktion in DIAdem, wenn Sie eine ältere Version nutzen, können Sie aber die Werte einzeln in einen Kanal schreiben (statt der msgbox Funktion).

dim sensor, sensorarray, sensors,i
set sensors = CreateObject("Scripting.Dictionary")
for i = 1 to cl("Testzustand")
  if cht(i,cno("Testzustand")) = "eingelaufen" and not sensors.exists(chdx(i,cno("Sensor"))) then sensors.add chdx(i,cno("Sensor")), chdx(i,cno("Sensor"))
next
sensorarray = sensors.items

valuetochn sensorarray, "eingelaufene"

for each sensor in sensorarray
msgbox sensor
next
Gruß

Ingo Schumacher
Systems Engineering Manager CEERNational Instruments Germany
0 Kudos
Message 2 of 12
(6,111 Views)
Hallo, ich habe folgendes eingegeben, aber Fehlermeldung in dieser Zeile: Valuetochn sensorarray, "eingelaufen"  Der Variant konnte nicht in Kanäle gewandelt werden.

Call GroupDefaultSet(GroupIndexGet(GroupCreate("Sensoren")))

 
 Dim sensor, sensorarray, sensors , i
 
 Set sensors = CreateObject("Scripting.Dictionary")

      For i = 1 To cl("[1]/Testzustand")
 
 
 
           If cht(i,cno("Testzustand")) = "eingelaufen" and not  sensors.exists(chdx(i,cno("Sensor_Nr"))) then sensors.add chdx(i,cno("Sensor_Nr")), chdx(i,cno("Sensor_Nr"))
 
 
 
     Next

 sensorarray = sensors.items

Valuetochn sensorarray, "eingelaufen"

      For Each sensor in sensorarray

 Msgbox sensor

      Next
0 Kudos
Message 3 of 12
(6,105 Views)
Hallo,
gerade habe ich Ihre Variante nochmal auf meinem DIAdem 10.2 getestet - nachdem ich die Kanalnamen angepasst habe, läuft das Script fehlerfrei.
Welche DIAdem Version haben Sie denn im Einsatz?
Vielleicht liegt es ja auch an den Daten, wenn Sie einen Beispieldatensatz anhängen, würde ich das Script noch einmal damit testen.

Gruß
Ingo Schumacher
Systems Engineering Manager CEERNational Instruments Germany
0 Kudos
Message 4 of 12
(6,100 Views)
ich habe DIAdem 10.1
0 Kudos
Message 5 of 12
(6,099 Views)
Ich habe eben nochmal getestet: Es liegt nicht an der DIAdem Version, sondern doch an dem Datensatz.
Ich hatte den Fehler gemacht, davon auszugehen, dass der Kanal Sensor_NR numerisch ist. Aber das ist in Ihrem Datensatz ein Textkanal, richtig?
Textkanäle kann die Funktion ValueToChn mämlich nicht verarbeiten.

Man muss elso doch die Schleife verwenden, um den Kanal zu füllen, und entsprechend cht statt den chd / chdx Variablen.
Ich habe das Beispiel schnell umgeschrieben und hoffe, dass auch Sie es jetzt fehlerfrei nutzen können:

Call GroupDefaultSet(GroupIndexGet(GroupCreate("Sensoren")))
 
 Dim sensor, sensorarray, sensors , i
 Set sensors = CreateObject("Scripting.Dictionary")

      For i = 1 To cl("[1]/Testzustand")
           If cht(i,cno("Testzustand")) = "eingelaufen" and not  sensors.exists(cht(i,cno("Sensor_Nr"))) then sensors.add cht(i,cno("Sensor_Nr")), cht(i,cno("Sensor_Nr"))
      Next

 sensorarray = sensors.items

dim cnew : cnew = cno(chnalloc("eingelaufen",sensors.count,1,DataTypeString)(0))
i= 1
For Each sensor in sensorarray
 cht(i,cnew) = sensor
 i=i+1
next
Ingo Schumacher
Systems Engineering Manager CEERNational Instruments Germany
0 Kudos
Message 6 of 12
(6,092 Views)
Also der Datensatz von Sensor_Nr  ist numerisch. Das ist ein Ergebnis aus einer filterung

Sensor_Nr             Testzustand
      15                   eingelaufen
      15                   eingelaufen
      73                   eingelaufen
      73                   eingelaufen
      95                   eingelaufen
      95                   eingelaufen

jetzt soll in einer neuen Kanalgruppen ausgegeben werden, welche sensoren es sind und nicht wieviele, als 15,73 und 95

Ich hoffe ich habe es besser formuliert ;-))
0 Kudos
Message 7 of 12
(6,089 Views)
Eigentlich sollten die Scripte ganau das bewerkstelligen - ess sei denn, ich habe es immer noch falsch verstanden 😉

Die Frage ist nur, um was für einen Kanaltypen es sich bei "Sensor_Nr" handelt.
Ist der Kanal data type= float64, also numerisch, funktioniert die erste Variante des Scripts (mit ValueToChn)
Wenn der Kanal als Textkanal deklariert ist, auch wenn er Zahlen beinhaltet(data type = string), dann ist die zweite Variante (ohne ValueToChn) zu benutzen.
Ingo Schumacher
Systems Engineering Manager CEERNational Instruments Germany
0 Kudos
Message 8 of 12
(6,079 Views)
Der Kanal Sensor_Nr hat den Typ float64 aber mit der ersten Variante mit ValueToChn funktioniert es leider nicht. Gibt es keine andere alternative?


0 Kudos
Message 9 of 12
(6,077 Views)
Natürlich! Die Kombination 🙂
Die ValueToChn Kommando durch die schleife mit ChD ersetzen

dim cnew : cnew = cno(chnalloc("eingelaufen",sensors.count)(0))
i= 1
For Each sensor in sensorarray
 chd(i,cnew) = sensor
 i=i+1
next

Ingo Schumacher
Systems Engineering Manager CEERNational Instruments Germany
0 Kudos
Message 10 of 12
(6,074 Views)