DIAdem

cancel
Showing results for 
Search instead for 
Did you mean: 

Anfänger: Script zur Transformation von Fräskräften?

Hallo Rednaxela,

 

machbar ist das alles.

Du kannst aus DIAdem heraus direkt eine Excel Datei erstellen. Dabei hast du aber nicht die Möglichkeit selektiv - also nur bestimmte Kanäle - zu speichern.

Du kannst aber auch über die OLE-Schnittstelle Daten an Excel übertragen - dann auch selektiv. Beispiel: "Clientbetrieb von DIAdem mit Excel als Server".

Du kannst aber auch eine TDM Datei erstellen und diese direkt in Excel laden. Mit DIAdem wird das Excel-Add-In installiert. Auf Rechnenrn, auf denen kein DIAdem läuft, kann das Add-In aber nachträglich installiert werden. Hier st der Link zum kostenlosen Excel-Add-In (http://zone.ni.com/devzone/cda/tut/p/id/7526).

 

Gruß

Walter

Clientbetrieb von DIAdem mit Excel als Server

0 Kudos
Message 11 of 25
(2,625 Views)

Hi Walter,

 

danke für den Tipp mit dem Beispiel "Clientbetrieb von DIAdem mit Excel als Server"! Ist aber (noch) etwas zu kompliziert für mich, versteh das Beispiel ehrlich gesagt nicht so ganz! Wie gesagt, arbeite jetzt seit einer Woche mit DIAdem und hatte vorher auch keine Erfahrung mit vbs!

----

 

Ich realisiere den Excel-Export bis jetzt so:

Dim Antwort
Antwort = msgbox("Excel-Export der Ergebnisse gewünscht?", vbYesNo)

if Antwort = vbYes then
'Excel export
EXCELChnCount=16
ExcelExpChn(1)=5
ExcelExpChn(2)=6
ExcelExpChn(3)=7
ExcelExpChn(4)=8
ExcelExpChn(5)=9
ExcelExpChn(6)=10
ExcelExpChn(7)=11
ExcelExpChn(8)=12
ExcelExpChn(9)=13
ExcelExpChn(10)=14
ExcelExpChn(11)=15
ExcelExpChn(12)=16
ExcelExpChn(13)=17
ExcelExpChn(14)=18
ExcelExpChn(15)=19
ExcelExpChn(16)=20
Call EXCELExport(AutoActPath & "Excel-Exporte\Versuchsergebnisse.xls", , 0, AutoActPath & "Excel-Exporte\vorlage.stp")

Else
MsgBox "Das Script wurde beendet!"
AutoQuit()
End If

 

 

Das klappt soweit!


Nur, wie bekomm ich jetzt noch hin, dass beim Speichern in "Versuchsergebnisse.xls" jedesmal ein neues Tabellenblatt erstellt wird und zwar mit einem Namen, der sich aus zuvor eingegebenen Variablen zusammen setzt?
Die Variablen sind:

Call GlobalDim("d, p, fz, re, Vc, TVnr, Z, FS")
d = 12
p = 0.5
fz = 0.1
re = 0.4
Vc = 200
TVnr = 1
Z = 1
FS = "test"

 

Name des Tabellenblatts könnte im Script so lauten:
&FS&"_TV"&TVnr&"_radius"&re&

 


So, dass in der Excel-Datei das Tabellenblatt dann so heißt:
test_TV1_radius0.4
 
Laut DIAdem-Hilfe kann man unter...
ExcelExport(EXCELFile, EXCELSheet, EXCELDlgFlag, EXCELConfigFile)
...den Namen des Tabellenblatts eingeben... aber das klappt irgendwie nicht...?

Grüße und danke!

0 Kudos
Message 12 of 25
(2,606 Views)

Hallo Rednaxela,

 

das Beispiel Expl_OLE.VBS im DIAdem-Example-Verzeichnis beschreibt genau die Kommunikation. Um eine neue Seite in Excel anzulegen, benötigt man den entsprechenden Excel-Befehl. Wenn du mit DIAdem 11.1 arbeitetst, kannst du dir, zur Erleichterung, beim Scripten die Type-Library für Excel aktivieren (SCRIPT->Script->Komponenten-Bibliotheken...), dann werden dir die Excel-Befehle und -Methoden durch die Code-Vervollständigung (Punkt-Syntax) angeboten.

Im Beispiel: Excel.Workbooks(DiademExcelWorkbook).Sheets.Add(...)

 

Gruß

Walter

0 Kudos
Message 13 of 25
(2,595 Views)

Hey!
DANKE! Nach langem Versuchen und Rumprobieren klappt alles mit OLE! Wirklich super!


Noch eine letzte Kleinigkeit:

Am Ende meines Scripts will ich die aktuelle "Default-Datei" im Datenportal abspeichern. Ich benutze folgenden Code, welcher auch funktioniert!

Dim Speichern1
Speichern1 = msgbox("Die aktuell im Datenportal verwendete Datei abspeichern unter ...\Auswertung\ ?", vbYesNo)
    if Speichern1 = vbYes then
        'Speichert den gesamten Datenbestand des DIAdem-Datenportals mit den zugehörigen Eigenschaften in einer Datendatei.
        Call DATAFILESAVE(AutoActPath & "\Auswertung\ & TEST & "_TV" & TVnr & "_fz" & fz &".tdm", "TDM")            
    else
        AutoQuit()
    end If

 

 

Nur würde ich gerne wissen, wie ich es hinbekomme, dass an der Stelle "TEST" automatisch der Name der aktuellen Default-Datei eingesetzt wird? Da gibt es doch bestimmt auch nen Befehl, oder?
Grüße!
0 Kudos
Message 14 of 25
(2,547 Views)

UPDATE:

Hab das letzte Problem soeben gelöst 🙂 Folgender Code:

 

 

Dim Speichern1
Dim Gruppenname1
Gruppenname1 = ChnPropGet("[1]/Fv", "sourcedatafilename")
Speichern1 = msgbox("Die aktuell im Datenportal verwendete Datei abspeichern unter ...\Auswertung\ ?", vbYesNo)
    if Speichern1 = vbYes then
        Call DATAFILESAVE(AutoActPath & "\Auswertung\" & Gruppenname1 & "_TV" & TVnr & "_fz" & fz & ".tdm", "TDM")            'Speichert den gesamten Datenbestand des DIAdem-Datenportals mit den zugehörigen Eigenschaften in einer Datendatei.
    else
        AutoQuit()
    end If

 

 

Nur leider gibt er als Dateiname dann Folgendes aus:
"sp_kraft2_vc200_fvar_r04_p05_1.TDM_TV1.1_fz0,1.tdm"

Geht es auch so, dass "TDM" in der Mitte weggelassen wird? Also, dass "tdm" ausschließlich am Ende steht?

Grüße!

0 Kudos
Message 15 of 25
(2,544 Views)

Gerade ist mir noch was in den Weg gekommen:

oExcel.ActiveWorkbook.SaveAs(AutoActPath & "\Auswertung\" & Gruppenname & ".xls")

 

Kannst mir jemand sagen, wieso das so nicht funktioniert? Es kommt die Meldung:

111  19:08:04 Fehler:
     Fehler in <Main4.VBS> (Zeile: 464, Spalte: 50):
     Auf die Datei konnte nicht zugegriffen werden. Versuchen Sie die folgenden Lösungsvorschläge:
     • Überprüfen Sie, ob der angegebene Ordner vorhanden ist.
     • Stellen Sie sicher, dass  der Ordner, in dem sich die Datei befindet, nicht schreibgeschützt ist.
     • Vergewissern Sie sich, dass der Dateiname keines der folgenden Zeichen enthält:  <  >  ?  [  ]  : | oder  *
     • Der Dateiname darf nicht länger als 218 Zeichen sein.


--> Ordner ist vorhanden!
--> Kein Schreibschutz!
--> Keines der Zeichen entahlten!
--> Name ist nicht zu lang!

Wenn ich es wie folgt mache, geht es:

oExcel.ActiveWorkbook.SaveAs("C:\Dokumente und Einstellungen\Administrator\Desktop\Script Alex Selfmade\Auswertung\" & Gruppenname & ".xls")

 

Woran liegt das, was mache ich falsch?

Gruß,
Alex

 

0 Kudos
Message 16 of 25
(2,537 Views)

Hallo Rednaxela

 

Das ist eine Fehlermeldung aus dem Excel nicht aus DIAdem. Das Problem sind doppelte "\\" im Pfad. Da ist Excel "empfindlicher" als DIAdem. Die Pfade in DIAdem wie AutoActpath enden alle mit "\". Dazu kommt das "\" in "\Auswertung\".

 

Die Zeile sollte funktionieren.

oExcel.ActiveWorkbook.SaveAs(AutoActPath & "Auswertung\" & Gruppenname & ".xls")

Winfried

0 Kudos
Message 17 of 25
(2,529 Views)

Hey Winfried! Danke für den Tipp! Funktioniert so!

 

Stoße immer wieder auf neue Sachen:

1)
Über folgenden Zeilen in meinem Script füge ich Kurven in ein 2D-Diagramm ein:

' add channels
Call AddChannels(oTopArea, "", "[1]/Fv", "Black")
Call AddChannels(oTopArea, "", "[1]/Fvn", "Blue")
Call AddChannels(oTopArea, "", "[1]/Fz", "Green")
Call AddChannels(oTopArea, "", "[1]/Result XY", "Red")
'-------------------------------------------------------------------------------
' add channel pair
'-------------------------------------------------------------------------------
Sub AddChannels(oArea, iCh1, iCh2, sColor)
Dim oCurrDispObj
' create display object
Set oCurrDispObj = oArea.DisplayObj

' add two new channel pairs given by the parameters iCh1 and iCh2
Call oCurrDispObj.Curves.Add(iCh1, iCh2)

' set color
oCurrDispObj.Curves(1).color = sColor
End Sub

 

Irgendwie macht DIAdem die Farben trotzdem so, wie es sie will!? Ich seh den Fehler nicht!


2)
Beim Excel-Export übertrage ich bspw. den Kanal "[1]/CopyYFv" in eine Spalte! Kann ich den max und min Wert dieser Spalte markieren, z.B. mit rot und blau? Mein Excel-Export-Code:

Call DataMatrixToExcel()

'-------------------------------------------------------------------------------
' DataMatrixToExcel
' Diese Prozedur uebertraegt die Daten aus der Datenmatrix an Excel.
' Dazu wird Excel als Apllikation gestartet und die Daten werden über die
' Active-X Schnittstelle von Excel übertragen
'-------------------------------------------------------------------------------
Sub DataMatrixToExcel

Dim oExcel,oWorkbookT,oSheetT,iChannelT,lFirstDataRowT,lChnCountT,lLengthT,lProzent, iIndex1, iIndex2

'-------------------------------------------------
' Excel als Applikation starten :
'-------------------------------------------------
Set oExcel = CreateObject("Excel.Application")
' Erste Zeile mit Daten :
lFirstDataRowT = 6

'-------------------------------------------------
' Neues Woorkbook und Sheet in Excel anlegen :
'-------------------------------------------------
Set oWorkbookT = oExcel.Workbooks.Add()
'Sheet in Excel anlegen
Set oSheetT = oWorkbookT.Sheets.Add


' Kanaele zaehlen
lChnCountT = 0
For iChannelT = 1 To ChnNoMax
if ( 0 >= Len(ChnName(iChannelT)) ) Then Exit For
lChnCountT = lChnCountT + 1
Next

' Namen des Tabellenblatts setzen in das die DIAdem-Daten eingetragen werden
oSheetT.Name = "TV" & TVnr & "_fz" & fz

'-------------------------------------------------
' Informationen aus dem Kanalheader uebertragen :
'-------------------------------------------------
For iChannelT = 1 To lChnCountT
oSheetT.Cells(1, iChannelT) = ChnName(iChannelT)
oSheetT.Cells(2, iChannelT) = ChnComment(iChannelT)
oSheetT.Cells(3, iChannelT) = ChnDim(iChannelT)
oSheetT.Cells(4, iChannelT) = ChnLength(iChannelT)
' Noch was fuers Auge ....
oSheetT.Cells(5, iChannelT).Interior.ColorIndex = 48
oSheetT.Columns(iChannelT).AutoFit
Next

'-------------------------------------------------
' Kanaldaten übertragen
'-------------------------------------------------
For iChannelT = 5 To lChnCountT
Call LoopInit()
Call MsgLineDisp("Übertragung des Kanals '"&ChnName(iChannelT)&"' ("&CStr(ChnLength(iChannelT))&" Werte)")

' ----- ist ein NV-Wert im Kanal ?
if ucase(ChnNovKey(iChannelT)) = "YES" then
For iIndex1 = 1 To ChnLength(iChannelT)
oSheetT.Cells(lFirstDataRowT+iIndex1-1, iChannelT) = GetValue(iIndex1,iChannelT)
lProzent = (iIndex1*100)/ChnLength(iChannelT)
If ( 0 = (lProzent Mod 5 ) ) Then Call LoopInc(lProzent)
Next
else
For iIndex2 = 1 To ChnLength(iChannelT)
oSheetT.Cells(lFirstDataRowT+iIndex2-1, iChannelT) = GetValueX(iIndex2,iChannelT)
lProzent = (iIndex2*100)/ChnLength(iChannelT)
If ( 0 = (lProzent Mod 5 ) ) Then Call LoopInc(lProzent)
Next
end if

Call LoopDeInit()
Next

' Excel anzeigen
oExcel.Visible = true
If MsgBox("Excel schließen?", vbYesNo Or vbQuestion, "Bestätigen") = vbYes Then

' Save actual Excel-Workbook
oExcel.ActiveWorkbook.SaveAs(AutoActPath & "Auswertung\" & Gruppenname & ".xls")   
' In VBS, Excel must be closed explicitly.
oExcel.Quit

Else

' Save actual Excel-Workbook
oExcel.ActiveWorkbook.SaveAs(AutoActPath & "Auswertung\" & Gruppenname & ".xls")
End If

' Set object references to 'Nothing'.
Set oSheetT = Nothing
Set oExcel = Nothing

End Sub

' ----- holt Werte und prüft nicht auf NV
function GetValueX(iIdxT, iChnT)

GetValueX = CHD(iIdxT,iChnT)

end function

' ----- holt Werte und prüft auf NV
function GetValue(iIdxT, iChnT)

dim vVal
vVal = CHD(iIdxT,iChnT)
if IsNull(vVal) then
GetValue = "Novalue"
else
GetValue = vVal
end if    

end function

 
Gruß

0 Kudos
Message 18 of 25
(2,525 Views)

Hallo Rednaxela

 

Punkt 1 ist schnell erklärt. Du setzt immer die Farbe der ersten Kurve.

Ändere den Code etwas ab. Curves.add liefert ja die erstellte Kurve als Objekt zurück. Das Objekt kannst du dann nehmen und verändern.

Sub AddChannels(oArea, iCh1, iCh2, sColor)
Dim oCurrDispObj
' create display object
Set oCurrDispObj = oArea.DisplayObj

' add two new channel pairs given by the parameters iCh1 and iCh2
Dim oNewCurve
  set oNewCurve = oCurrDispObj.Curves.Add(iCh1, iCh2)

' set color
oNewCurve.color = sColor
End Sub

Gruß Winfried

0 Kudos
Message 19 of 25
(2,521 Views)

Hi Winfried!

 

Wow, das geht aber schnell hier! Super, somit wäre auch Punkt1 geklärt! Vielen, vielen Dank!

 

Bleibt noch Punkt2! Aber, ich denke, der ist etwas schwieriger zu lösen...?

 

Grüße,

Alex

0 Kudos
Message 20 of 25
(2,516 Views)