DIAdem

cancel
Showing results for 
Search instead for 
Did you mean: 

6 Variablen über DataP übertragen

Hallo!

 

Ich bin DIAdem-Neuling und habe ein kleines Problem:

 

Wir haben eine Abgasmessanlage, die wir über Diadem ansprechen (VBS-Skript). Das Messgerät gibt einen Code heraus, der in einer Schleife in die einzelnen Blöcke aufgeteilt wird (6 Abgaswerte).

Diese Abgaswerte sollen nun über DataP abgespeichert werden, jedoch dauert dies pro Messwert ca. 6 Sekunden.

Hier mal das Skript:

 

Dim     STX,ETX,DontCare,SCode,FCode
Dim     ReplyData
STX      = chr(2)
ETX      = chr(3)
DontCare = chr(21)
Dim WERT
Dim ausgabe(6)

Sub SFD_ReadChannel( ChannelNumberP, ParamP, DataP, ErrorP )

'------------Initialisierung---------------------
Set oUDI=CreateObject("DIAdem.SFD.UDI")
call oUDI.Open("TCP/IP", "AMAPC01:7700")
'------------------------------------------------
ICode="AKON" 'Zu Sendender AK-Kommando
Channel="0"

Ausgaben=array(0,0,0,0,0,0)


AKCommand=STX+DontCare+ICode+" K"+Channel+ETX 'Zusammenseten des AK-Befehls z.B. ">_AKON K0<"


 
Call oUDI.Write(AKCommand,,0) 'Senden des AK-Befehls an die AMA
 
 
AKRaw = oUDI.Read(1000) 'Empfangen der Antwort mit max 1000 Zeichen

'Schneiden der Daten auf richtiges Format und Richtigen Kanal
start=Instr(akraw," ")
waste=mid(akraw,start+1,100)
ende=instr(waste," ")
wert=left(waste,ende)

for xx=1 to 5
  start=Instr(waste," ")
  waste=mid(waste,start+1,100)
  ende=instr(waste," ")
  wert=left(waste,ende)
  minus=instr(wert,"-")

  komma=instrrev(wert,".")

  If minus=1 then
    wertneu=wert/(10^(7-komma))
  else
    wertneu=wert/(10^(6-komma))
  end if

  if komma=0 then
    wertneu=wert
  end if

  ausgabe(xx)=wertneu
Next

start=Instr(waste," ")
waste=mid(waste,start+1,100)
ende=Instr(waste,etx)
wert=left(waste,ende-1)
minus=instr(wert,"-")
komma=instrrev(wert,".")
werte=wert*1
  If minus=1 then
    wertneu=werte/(10^(7-komma))
  else
    wertneu=werte/(10^(6-komma))
  end if

  if komma=0 then
    wertneu=werte
  end if

ausgabe(6)=wertneu

ausgaben(0)=ausgabe(1)*1
ausgaben(1)=ausgabe(2)*1
ausgaben(2)=ausgabe(3)*1
ausgaben(3)=ausgabe(4)*0.0001
ausgaben(4)=ausgabe(5)*0.0001
ausgaben(5)=ausgabe(6)*0.0001
'Ende Schneiden

DataP=ausgaben(ChannelNumberP) 'Verteilen der Daten an die Ausgabevariabeln
End Sub 'Ende des Sub-Programms

call SFD_ReadChannel( ChannelNumberP, ParamP, DataP, ErrorP ) 'Ausführen der Abfrageroutine

 


Gibts da vielleicht ne andere Möglichkeit die Variablen abzuspeichern? Bin für jede Hilfe echt dankbar!

 

Gruß Basti

0 Kudos
Message 1 of 10
(5,459 Views)

Hallo Basti,

 

ich habe hier ein Codesegment mit welchem sich ein Benchmark durchführen lässt. Damit sollte es möglich sein herauszufinden, an welcher Stelle des Codes die 6 Sekunden verloren werden. Ich vermute aber, dass die for-Schleife, in welcher die String-Operationen durchgeführt werden für die Performance-Probleme verantwortlich ist.

 

*********************************************************************************

Dim StartTime, Elapsed
StartTime = Timer


Hier den betreffenden Codeteil / die Schleife einsetzen

 

Elapsed = Timer - StartTime
Call MsgBox("Elapsed Seconds: " & Elapsed, vbInformation)

*********************************************************************************

 

Eine bessere Möglichkeit wäre es das Messgerät mit DAC (falls das Modul in DIAdem vorhanden ist) direkt anzusprechen.

 

Viele Grüße

Frank

0 Kudos
Message 2 of 10
(5,407 Views)

Hatte vor kurzem nen Zähler eingefügt und es hängt definitiv an der Übertragung der Variablen mit DataP.

Lasse ich nur 1 Variable anzeigen, dauert es 1sec, bei 6 Variablen 6sec...gibt es noch eine andere Möglichkeit außer DataP die Abgasmesswerte auszugeben?

0 Kudos
Message 3 of 10
(5,403 Views)

Hallo Basti,

 

bei jedem Takt und für jeden Kanal wird die Funktion SFD_ReadChannel() aufgerufen. Es werden jedesmal Daten für 6 Kanäle eingelesen, wovon aber 5 Daten nicht benötigt werden. Du solltest für die Kommunikation mit dem Messgerät die Funktion SFD_GetScan() verwenden. Diese Funktion wird  je Takt nur einmal aufgerufen. Innerhalb dieser Funktion solltest Du die 6 Messwerte auf globale Variablen legen. In der Funktion SFD_ReadChannel() wird dann nur noch der Inhalt der globalen Variablen für den entsprechenden Kanal zurückgeliefert. So sollte dein Zeitproblem gelöst werden.

 

Im Script-Treiber solltest Du den Betriebsmodus auf "Asynchron zum Messtakt" einstellen, damit die übrige Messung nicht ausgebremst wird.

 

Ich hoffe es hilft dir weiter.

 

  Uwe Hein

  Miele & Cie. KG

  Gütersloh / Germany

 

 

0 Kudos
Message 4 of 10
(5,319 Views)

Hallo, vielen Dank schonmal!

 

Also einfach das Abfragen der Messwerte und die Schleife in eine SFD_GetScan-Routine einbinden und einfach anschließend eine SFD_Readchannel aufrufen, die die Daten über DataP=ausgaben(channelnumberP) überträgt.

 

Kann ich dann beim Aufrufen einfach "Call SFD_ReadChannel( ChannelNumberP, ParamP, DataP, ErrorP ) einfügen und dann noch zusätzlich in den Klammerausdruck "ausgaben" einfügen, damit die ermittelten Werte übertragen werden? Oder wird der Ausgaben-Array anders an die 2. Sub übermittelt?

0 Kudos
Message 5 of 10
(5,295 Views)

Hallo Basti,

 

ich habe ein Stück Beispielcode als Datei angehangen. Ich hoffe es verdeutlicht die Funktionalität.

 

Viel Erfolg und ein schönes Wochenende

 

  Uwe Hein

  Miele & Cie. KG

  Gütersloh / Germany

 

0 Kudos
Message 6 of 10
(5,284 Views)

Hallo Uwe,

 

dein Tipp war echt super, die Daten werden jetzt wesentlich schneller angezeigt, aber immernoch "nur" im 1-Sekunden-Takt bei asynchroner Messweise. Ist das das Limit bei Diadem oder hab ich vllt irgendwo eine Einstellung übersehen? Frage die Daten jetzt mit SFD_GetScan ab und leite sie an SFD_Readchannel weiter, wo einfach nur DataP=ausgaben steht, womit die 6 Abgaswerte visuell angezeigt werden. Ist das das maximum oder geht das irgendwie noch schneller?

 

Gruß Bastian

0 Kudos
Message 7 of 10
(5,210 Views)

Hallo Bastian,

 

hast Du einmal mit einem Schnittstellenanalysator die Geschwindigkeit des Gerätes analysiert? Vielleicht kommen die Daten nicht schneller aus dem Gerät?!

 

Wir können uns auch gerne einmal telefonisch unterhalten. Schicke mir dazu deine Kontaktdaten an uwe dot hein at miele dot de. Ich rufe dann zurück.

 

    Uwe Hein

    Miele & Cie. KG

    Gütersloh / Germany

0 Kudos
Message 8 of 10
(5,206 Views)

Hallo Uwe,

 

habe dir eine E-Mail geschickt.

Also das Gerät kann es wesentlich schneller, die Übertragungszeit dauert 10ms, hatte  mal einen Zähler eingebaut, die 1sek geht bei der Übergabe der Daten in Diadem verloren.

 

Gruß Bastian

0 Kudos
Message 9 of 10
(5,193 Views)

kusserob wrote:
Bin für jede Hilfe echt dankbar!

 



Hallo,

 

ich kann dir zwar bei deinem Problem nicht helfen, aber ich kann dir sagen dass eine AMA am besten funktioniert wenn sie kurz vor der Messung durch eine MEXA ersetzt wird!

0 Kudos
Message 10 of 10
(5,020 Views)