09-29-2011 01:26 PM
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
10-05-2011 09:32 AM
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
10-05-2011 10:05 AM
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?
10-06-2011 12:45 AM
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
10-06-2011 09:50 AM
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?
10-07-2011 12:26 AM
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
10-17-2011 01:42 PM
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
10-18-2011 12:41 AM
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
10-18-2011 08:27 AM
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
01-24-2012 01:28 PM
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!