Variablenstruktur für ActivX aufruf
Moderator: Moderatoren
Variablenstruktur für ActivX aufruf
Hallo Forenmitglieder,
für eine Kraftauswertung (HBM) möchte ich die ActivX Schnittstelle benutzen.
1. Ethernet nach vorhandenen HBM Geräten scannen.
MyScanResults := oQXSystem:ScanForQXDevices()
Wie kann ich mein Array bzw. meine Variable unter Xbase definieren, das dies den geforderten Typen entspricht ?
**
** Angabe im Vbasic-Programm
** Dim MyScanResults() As ScanResult
**In der COM API Hilfe habe ich folgendes gefunden.
** public ScanResult(UInt64 UUID, string Name, string ModuleType, string IPAddress, int Port);
Mit freundlichen Grüßen
mkersch
für eine Kraftauswertung (HBM) möchte ich die ActivX Schnittstelle benutzen.
1. Ethernet nach vorhandenen HBM Geräten scannen.
MyScanResults := oQXSystem:ScanForQXDevices()
Wie kann ich mein Array bzw. meine Variable unter Xbase definieren, das dies den geforderten Typen entspricht ?
**
** Angabe im Vbasic-Programm
** Dim MyScanResults() As ScanResult
**In der COM API Hilfe habe ich folgendes gefunden.
** public ScanResult(UInt64 UUID, string Name, string ModuleType, string IPAddress, int Port);
Mit freundlichen Grüßen
mkersch
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Variablenstruktur für ActivX aufruf
hi,
>Wie kann ich mein Array bzw. meine Variable unter Xbase definieren, das dies den geforderten Typen entspricht ?
es klingt jetzt blöd, aber ich meine es wirklich so : ausprobieren !!!
der Type "string" und "Int" sind ja kein Problem ... und was ist UInt64 UUID ?
Die "Bezeichnung" das es sich um ein (VB) Array handelt "könnte" auch auf eine "Collection" hinweisen.
Das wäre dann dann ein Object wo du an die "Elemente" meisten mit :item(nNo) rankommst
In diesem Fall könnte dir VTType() / SafeArray weiterhelfen die (VB) "Collection" in ein Xbase++ Array umzuwandeln.
( siehe Alaska Newsgroup public.xbase++.activex )
>Wie kann ich mein Array bzw. meine Variable unter Xbase definieren, das dies den geforderten Typen entspricht ?
es klingt jetzt blöd, aber ich meine es wirklich so : ausprobieren !!!
soll ja ein Array zurück geben und ich sehe nicht das du ihm ein Array, mit "Struktur", als Parameter übergeben sollst.public ScanResult(UInt64 UUID, string Name, string ModuleType, string IPAddress, int Port)
der Type "string" und "Int" sind ja kein Problem ... und was ist UInt64 UUID ?
Die "Bezeichnung" das es sich um ein (VB) Array handelt "könnte" auch auf eine "Collection" hinweisen.
Das wäre dann dann ein Object wo du an die "Elemente" meisten mit :item(nNo) rankommst
In diesem Fall könnte dir VTType() / SafeArray weiterhelfen die (VB) "Collection" in ein Xbase++ Array umzuwandeln.
( siehe Alaska Newsgroup public.xbase++.activex )
gruss by OHR
Jimmy
Jimmy
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: Variablenstruktur für ActivX aufruf
Hallo, Mkersch.
Im Umgang mit einem Control namens "ImageKit" hat es mir geholfen, die entsprechende Methode einmal "leer" mit einem Zero-Size-Array (by reference) aufzurufen, um dieses Array quasi von der Methode formatieren zu lassen.
Danach hatte das Array das vom Control gewünschte Format, und ich konnte es in der App auswerten.
Im Umgang mit einem Control namens "ImageKit" hat es mir geholfen, die entsprechende Methode einmal "leer" mit einem Zero-Size-Array (by reference) aufzurufen, um dieses Array quasi von der Methode formatieren zu lassen.
Code: Alles auswählen
aArray := {}
oControl:MyMethod(@aArray, ...) // alle anderen Parameter auf NIL oder Standardwerte
* und dann gleich noch einmal, aber mit den richtigen Daten
Herzlich,
Tom
Tom
Re: Variablenstruktur für ActivX aufruf
Vielen Dank für Eure schnellen Antworten.
Leider kann ich mit den VTType() bzw. mit Collection nicht viel anfangen.
Könntet Ihr mir Anhand eines Beispiels "unter die Arme" helfen.
mfg.
Michael
Leider kann ich mit den VTType() bzw. mit Collection nicht viel anfangen.
Könntet Ihr mir Anhand eines Beispiels "unter die Arme" helfen.
mfg.
Michael
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Variablenstruktur für ActivX aufruf
schon mal im Alaska Forum gesucht ?mkersch hat geschrieben:Leider kann ich mit den VTType() bzw. mit Collection nicht viel anfangen.
Könntet Ihr mir Anhand eines Beispiels "unter die Arme" helfen.
Beispiel VB "Datetime" = YYMMDDHHMMSS
Code: Alles auswählen
cStartTime := DTOS(Date())+STRTRAN("09:30",":","")
oEvent:treatDateAsString(.T.):setProperty("StartTime",VTType():new( cStartTime , VT_DATE))
Code: Alles auswählen
objWMIService := CreateObject("WbemScripting.SWbemLocator" ):ConnectServer(strComputer, "Root\CIMv2")
colItems := objWMIService:ExecQuery("select * from Win32_MotherboardDevice",,48)
bCollBlock := {|oService,n| AADD(aItem,{ n,;
oService:getProperty("Availability"),;
oService:getProperty("Caption"),;
oService:getProperty("ConfigManagerErrorCode"),;
oService:getProperty("ConfigManagerUserConfig"),;
oService:getProperty("CreationClassName"),;
oService:getProperty("Description"),;
oService:getProperty("DeviceID"),;
oService:getProperty("ErrorCleared"),;
oService:getProperty("ErrorDescription"),;
oService:getProperty("InstallDate"),;
oService:getProperty("LastErrorCode"),;
oService:getProperty("Name"),;
oService:getProperty("PNPDeviceID"),;
oService:getProperty("PowerManagementCapabilities"),;
oService:getProperty("PowerManagementSupported"),;
oService:getProperty("PrimaryBusType"),;
oService:getProperty("RevisionNumber"),;
oService:getProperty("SecondaryBusType"),;
oService:getProperty("Status"),;
oService:getProperty("StatusInfo"),;
oService:getProperty("SystemCreationClassName") })}
ComEvalCollection(colItems, bCollBlock )
gruss by OHR
Jimmy
Jimmy
Re: Variablenstruktur für ActivX aufruf
AUGE_OHR danke für die Antwort.
Da ich noch keinen Lösungsweg sehe nochmals meine Aufgabenstellung.
Zur Auswertung von Kraftwerten muss ich mittels einer "COM / ActiveX" Schnittstelle die Daten einlesen.
Als Beispiel ist ein VBasic Programm mitgeliefert.
Mit der Methode ScanForQXDevice() wird über die Ethernet Schnittstelle jedes HBM Gerät eingelesen.
In einem Array (???) wird das Ergebnis abgelegt.
In VB ==> MyScanResult(1).UUID // UINT64
MyScanResult(1).Name // String
MyScanResult(1).Module.Typ // String
MyScanResult(1).IPAdresse // String
MyScanResult(1).Port // INT
MyScanResult(2).UUID // zweites Gerät UINT64
usw.
MyScanResults := oQXSystem:ScanForQXDevices()
Da in meiner XbaseHilfe VTType() und ComEvalCollection nicht beschrieben sind, finde ich noch keinen Ansatz diese Aufgabenstellung zu lösen.
Außerdem habe ich in den Newsgroup's keine entsprechenden Hinweise gefunden.
mfg.
mkersch
Da ich noch keinen Lösungsweg sehe nochmals meine Aufgabenstellung.
Zur Auswertung von Kraftwerten muss ich mittels einer "COM / ActiveX" Schnittstelle die Daten einlesen.
Als Beispiel ist ein VBasic Programm mitgeliefert.
Mit der Methode ScanForQXDevice() wird über die Ethernet Schnittstelle jedes HBM Gerät eingelesen.
In einem Array (???) wird das Ergebnis abgelegt.
In VB ==> MyScanResult(1).UUID // UINT64
MyScanResult(1).Name // String
MyScanResult(1).Module.Typ // String
MyScanResult(1).IPAdresse // String
MyScanResult(1).Port // INT
MyScanResult(2).UUID // zweites Gerät UINT64
usw.
MyScanResults := oQXSystem:ScanForQXDevices()
Da in meiner XbaseHilfe VTType() und ComEvalCollection nicht beschrieben sind, finde ich noch keinen Ansatz diese Aufgabenstellung zu lösen.
Außerdem habe ich in den Newsgroup's keine entsprechenden Hinweise gefunden.
mfg.
mkersch
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Variablenstruktur für ActivX aufruf
Hi,
Ein Variant unter VB ist das was wir schon lange kennen, eine Variable, die den Typ ändern kann.
Allerdings kann VB und die übersetzende Xbase++ Schnittstelle den richtigen Datentyp nicht erraten,
dieser wird - soviel ich weiß - mit VTType() übergeben. Ich meine das in den ActiveX Beispielen gelesen zu haben.
Die Suche nach "xbase VTType" bei Google ergab einige Treffer ...
daraus ersieht man, dass VTType() eine Xbase++ Klasse ist, die einen Wert in ein spezielles Variant Datenformat wandelt. Auf meiner Platte finde ich nichts zu VTType() ... vielleicht hier im Forum, wobei man nach VTType* suchen muss...
VT_DATE mit den anderen Datentypen ist der Online-Hilfe erwähnt, vermutlich ist VTType() dass ab und an angesprochen wird nur direkt bei Alaska zu bekommen.
Dein VB Array ist komplexer, es handelt sich um ein Array mit Strukturen (TYPE ...).
Für Strukturen benutzt man am besten die ot4xb on http://www.xbwin.com
Wenn du eine saubere Struktur baust, könnte die Typwandlung ein ein solches Element wieder automatisch funktionieren, leider habe ich aber mit ActiveX nur begrenzte Erfahrung.
Ich hoffe es hilft etwas
Ein Variant unter VB ist das was wir schon lange kennen, eine Variable, die den Typ ändern kann.
Allerdings kann VB und die übersetzende Xbase++ Schnittstelle den richtigen Datentyp nicht erraten,
dieser wird - soviel ich weiß - mit VTType() übergeben. Ich meine das in den ActiveX Beispielen gelesen zu haben.
Die Suche nach "xbase VTType" bei Google ergab einige Treffer ...
Code: Alles auswählen
oCalendarItem:StartTime := VTType():new( "20090815090000", VT_DATE)
VT_DATE mit den anderen Datentypen ist der Online-Hilfe erwähnt, vermutlich ist VTType() dass ab und an angesprochen wird nur direkt bei Alaska zu bekommen.
Dein VB Array ist komplexer, es handelt sich um ein Array mit Strukturen (TYPE ...).
Für Strukturen benutzt man am besten die ot4xb on http://www.xbwin.com
Wenn du eine saubere Struktur baust, könnte die Typwandlung ein ein solches Element wieder automatisch funktionieren, leider habe ich aber mit ActiveX nur begrenzte Erfahrung.
Ich hoffe es hilft etwas
Gruß
Hubert
Hubert
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Variablenstruktur für ActivX aufruf
hm ... äh ... wir sprechen von der SL1 v1.9.355, oder ?mkersch hat geschrieben:Da in meiner XbaseHilfe VTType() und ComEvalCollection nicht beschrieben sind
solltes du noch < SL1 haben musst du erst mal updaten da es erst ab v1.9.355 die Funktion ComEvalCollection() gibt.
ich meine in der Alaska Newsgroupmkersch hat geschrieben:Außerdem habe ich in den Newsgroup's keine entsprechenden Hinweise gefunden.
ich denke schon das ich grundsätzlich deine Frage verstehe, aber das "ausprobieren" musst du schon selbst.mkersch hat geschrieben:nochmals meine Aufgabenstellung ...
Ich gehe zwar davon aus das dein *.OCX auf IDispatch basiert, aber das muss man "ausprobieren" ob man es überhaupt aus Xbase++ "ansprechen" kann.
Wenn du "Ergebnisse" hast können wir weiter darüber reden, aber dazu benötigen wir "Code".
gruss by OHR
Jimmy
Jimmy
Re: Variablenstruktur für ActivX aufruf
Guten Tag Forenmitglieder
Die Zeile mit ScanForQXDevices() bring eine Fehlermeldung:
Fehler BASE/5 Beschreibung : Ungültiger numerischer Wert für Operation Operation : <1> <= <1> Thread ID : 1 Aufgerufen von AUTOMATIONOBJECT:NOMETHOD(1234)
Was mache ich falsch ?
mfg.
mkersch
Code: Alles auswählen
oQXSystem := GetObject( ,"HBM.QuantumX.QXSystem_" )
IF NIL == oQXSystem
? "Fehler: ", ComLastError()
? "Beschreibung:"
? ComLastMessage()
RETURN
ENDIF
oTest := oQXSystem:ScanForQXDevices()
Fehler BASE/5 Beschreibung : Ungültiger numerischer Wert für Operation Operation : <1> <= <1> Thread ID : 1 Aufgerufen von AUTOMATIONOBJECT:NOMETHOD(1234)
Was mache ich falsch ?
mfg.
mkersch
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Variablenstruktur für ActivX aufruf
Aufgrund der Fehlermeldung übergibst du den falschen Parameter oder den richtigen falschmkersch hat geschrieben:Was mache ich falsch ?
So nun im Ernst, offensichtlich hat hier außer dir niemand diese Hard-/Software und daher sind wir auf deine Infos angewiesen. Wir wissen z.B. nichts über die nötigen Parameter dieser Methode ...
Es wäre nützlich, wenn du ein komplettes funktionierendes Beispiel in C oder VB hier zeigen könntest.
Eine Mischung aus VB Rückgabewerten und Xbase++ Aufrufen wird keine Antworten zu Tage fördern.
Gruß
Hubert
Hubert
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Variablenstruktur für ActivX aufruf
die Zeile 1234 ist es sicherlich nicht ... kommt er wirklich bis zu der Zeile ???mkersch hat geschrieben:Die Zeile mit ScanForQXDevices() bring eine Fehlermeldung:Code: Alles auswählen
oQXSystem := GetObject( ,"HBM.QuantumX.QXSystem_" ) IF NIL == oQXSystem ? "Fehler: ", ComLastError() ? "Beschreibung:" ? ComLastMessage() RETURN ENDIF oTest := oQXSystem:ScanForQXDevices()
Fehler BASE/5 Beschreibung : Ungültiger numerischer Wert für Operation Operation : <1> <= <1> Thread ID : 1 Aufgerufen von AUTOMATIONOBJECT:NOMETHOD(1234)
da du keine Parameter angegeben hast, kommt der erste Teil der Fehlermeldung : Operation : <1> <= <1>
NOMETHOD heisst das was es sagt : Die Methode gibt es ("so") nicht ... oder ist es vielleicht eine Property ?
auch sagte ich ja das Xbase++ nur IDispatch kann ... könnte sein das es zu den anderen 50% gehört ?
Ich würde deshalb versuchen zuerst die Methode :About "testen" die fast jedes OCX hat
wie Hubert schon sagte, wir brauchen deutlich mehr Informationen ( Url, VB oder C Sample )
um zu helfen
p.s. GetObject setzt voraus das du eine Instanz laufen hast. CreateObject wäre besser.
Wenn du allerdings auf das activeX "reagieren" willst, musst du über das XbpActiveXControl() und :SubscribeEvent() gehen
gruss by OHR
Jimmy
Jimmy
Re: Variablenstruktur für ActivX aufruf
Vielen Dank für die Info
Heute habe ich den ganzen Tag versucht an mein Kraftmesssystem zu kommen, leider ohne Erfolg.
Mit den VBasic Beispiel klappt es sofort.
Mit Xbase gibt es immer noch eine Fehlermeldung
Die folgende Zeile bringt die Fehlermeldung
result := oQXSystem:Connect("192.168.0.20",bin2l("5001"))
---------------------------
Xbase++ Fehlermeldung
---------------------------
Fehler Automation/6500 Beschreibung : Connection failed. Error in framework: #-1000620 TCP: Connect failed Operation : Connect Thread ID : 1 Betriebsystem Fehler : -2146232832 Called from MAIN(33)
---------------------------
OK Abbrechen
---------------------------
Was soll ich noch versuchen ?
mfg.
mkersch
Heute habe ich den ganzen Tag versucht an mein Kraftmesssystem zu kommen, leider ohne Erfolg.
Mit den VBasic Beispiel klappt es sofort.
Code: Alles auswählen
Dim QXSystem As QXSystem_
Dim QXSimpleDAQ As QXSimpleDAQ_
Dim MyDevice As Device
Dim MyScanResults() As ScanResult
Sub init()
Set QXSystem = New QXSystem_
Set QXSimpleDAQ = New QXSimpleDAQ_
End Sub
Sub AddToProtocol(message As String)
'Text1.Text = Text1.Text + message
RichTextBox1.Text = RichTextBox1.Text + message
RichTextBox1.SelStart = Len(RichTextBox1.Text)
End Sub
Private Sub ClearText_Click()
'Text1.Text = ""
'Text1.
RichTextBox1.Text = ""
End Sub
Private Sub ConnectToFirstDevice_Click()
On Error GoTo ErrorHandler1
If (UBound(MyScanResults) > -1) Then
Dim result As String
AddToProtocol (vbNewLine + "Try to connect to device : " + MyScanResults(0).Name + ", " + MyScanResults(0).IpAddress + ", " + MyScanResults(0).UUID_ + vbNewLine)
result = QXSystem.Connect(MyScanResults(0).IpAddress, MyScanResults(0).Port)
'all connected devices (and later also their subdevices!!) are added into two lists!:
'List1: QXSystem.SubDevicesLinear : devices and their subdevices are added without hierarchy information
'List2: QXSystem.SubDevicesHierarchical : devices are added and subdevices are stored under their parent devices
'MsgBox ("DeviceUUID=" + result)
'Dim MySubDevices() As SubDevice
'MySubDevices = QXSystem.SubdevicesLinear
AddToProtocol (vbNewLine + "Successfully connected to device! " + vbNewLine)
End If
Exit Sub
ErrorHandler1:
MsgBox (Err.Description)
'Resume Next
End Sub
Private Sub CreateAndAssignASignal_Click()
On Error GoTo errorhandler
'Signals for CANBus are of type AsyncSignal!
'If you want to assign an AsyncSignal to a CAN channel, you have to assert
'that the connector is of type CANBUS!
'e.g.:
'Dim MyConnector As New Connector
'MyConnector.ActiveType = eConnectorTypes_CANBUS
'MyConnector.Number = 0
'QXSystem.AssignConnector MyScanResults(0).UUID_, MyConnector
'Dim MyAsyncSignal As New AsyncSignal
'MyAsyncSignal.MaxRepTime_ = 10
'QXSystem.AssignAsyncSignal MyScanResults(0).UUID_, 0, 0, MyAsyncSignal
'Signals for ANALOG_IN_CHANNELs are of type SyncSignal!
'Lets assign a SyncSignal to the first connector
'Assert that the first connector is of type ANALOG_IN_CHANNEL:
Dim MyConnector As New Connector
MyConnector.ActiveType = eConnectorTypes_ANALOG_IN_CHANNEL
MyConnector.Number = 0
QXSystem.AssignConnector MyScanResults(0).UUID_, MyConnector
'Assign a SyncSignal
Dim MySyncSignal As New SyncSignal
MySyncSignal.FilterType.ActiveType = eFilterTypes_LOWPASS
MySyncSignal.FilterType.LowPass.FilterCharacteristic = eFilterCharacteristics_BESSEL
MySyncSignal.FilterType.LowPass.FilterFrequency_ = 100
MySyncSignal.Number = 0
'and assign it to the first connector...
QXSystem.AssignSyncSignal MyScanResults(0).UUID_, 0, MySyncSignal
AddToProtocol vbNewLine + "ModifySettings:AssignSSyncSignal: " + MyScanResults(0).Name + " ," + MyScanResults(0).UUID_ + ":" + vbNewLine + MySyncSignal.ConvertToXML + vbNewLine
Exit Sub
errorhandler:
AddToProtocol vbNewLine + "AssignSignal: Exception occured: " + Err.Description + vbNewLine
'Get detailed information about the problems that occured assigning the signal
Dim Problems() As Problem
Problems = QXSystem.ReadLastProblems
AddToProtocol Str(UBound(Problems) + 1) + " problems occured:" + vbNewLine
For i = 0 To UBound(Problems)
AddToProtocol "Problem: " + Problems(i).Text + ":" + Problems(i).Value + vbNewLine
Next
End Sub
Private Sub CreateAndAssignSensor_Click()
On Error GoTo errorhandler
'Let's setup a BridgeSensor (see how intellisense supports you!!)
Dim MySensor As New Sensor
'Determine the type of sensor....
MySensor.SensorType.ActiveType = eSensorTypes_BRIDGE
'and set up its properties...
MySensor.SensorType.Bridge.BridgeType = eBridgeTypes_FULL
MySensor.SensorType.Bridge.ExciteAmplitude_ = 5
MySensor.SensorType.Bridge.MaxElectrical_ = 10
MySensor.SensorType.Bridge.Wiring = eWirings_WIRE_6
'Determine the scaling type of the sensor
MySensor.ScalingType.ActiveType = eScalingTypes_ZEROSPAN
'and set up its properties...
MySensor.ScalingType.ZeroSpan.ElectricalSpan_ = 10
MySensor.ScalingType.ZeroSpan.ElectricalZero_ = 0
MySensor.ScalingType.ZeroSpan.PhysicalSpan_ = 100
'Let's try to assing this sensor to the the first connector of the first connected device
'Notice that Connectors start with number 0 (in contrast to the labeling on the physical device).
'We have to be shure that the connector is of type ANALOG_IN_CHANNEL - otherwise assigning the
'sensor will not work (the connector could be OFF or of type CANBUS)...
Dim MyConnector As New Connector
MyConnector.ActiveType = eConnectorTypes_ANALOG_IN_CHANNEL
MyConnector.Number = 0
QXSystem.AssignConnector MyScanResults(0).UUID_, MyConnector
'Assign the sensor
QXSystem.AssignSensor MyScanResults(0).UUID_, 0, MySensor
AddToProtocol vbNewLine + "ModifySettings:AssignSensor: " + MyScanResults(0).Name + " ," + MyScanResults(0).UUID_ + ":" + vbNewLine + MySensor.ConvertToXML + vbNewLine
Exit Sub
errorhandler:
AddToProtocol vbNewLine + "AssignSensor: Exception occured: " + Err.Description + vbNewLine
'Get detailed information about the problems that occured assigning the sensor
Dim Problems() As Problem
Problems = QXSystem.ReadLastProblems
AddToProtocol Str(UBound(Problems) + 1) + " problems occured:" + vbNewLine
For i = 0 To UBound(Problems)
AddToProtocol "Problem: " + Problems(i).Text + ":" + Problems(i).Value + vbNewLine
Next
End Sub
Private Sub DisconnectDevice_Click()
QXSystem.Disconnect MyScanResults(0).IpAddress, MyScanResults(0).Port
AddToProtocol vbNewLine + "Disconnect device: " + MyScanResults(0).Name + ", " + MyScanResults(0).IpAddress + ", " + MyScanResults(0).UUID_ + vbNewLine
End Sub
Private Sub ExploreDevice_Click()
Dim Connectors() As Connector
'Explore the Device using the Connectors(0..n)! (use intellisense in your debugger!!)
If (MyDevice = Null) Then
MsgBox ("Please connect to a device before you explore it... or just use this devicedummy")
Set MyDevice = New Device
End If
Connectors = MyDevice.Connectors
AddToProtocol vbNewLine + vbNewLine + "Some details about the connected device:" + vbNewLine
AddToProtocol "Name of the device = " + MyDevice.System.ModuleName + vbNewLine
AddToProtocol "Number of connectors = " + Str(UBound(Connectors) + 1) + vbNewLine
AddToProtocol "Sensortypes that are connected at the connectors: " + vbNewLine
For i = 0 To UBound(Connectors)
AddToProtocol "Sensortype at connector(" + Str(i) + ")=" + Str(Connectors(i).AnalogInChannel.Sensor.SensorType.ActiveType) + vbNewLine
AddToProtocol "Channelname at connector(" + Str(i) + ")=" + Connectors(i).AnalogInChannel.ChannelName + vbNewLine
Next
End Sub
Private Sub Form_Load()
init
End Sub
Private Sub Form_Unload(Cancel As Integer)
QXSystem.Unload
End Sub
Private Sub GetAvailableNetworkAdapters_Click()
AddToProtocol ("Framework.dll Version=" + QXSystem.ReadDllVersion())
Dim Adapters() As NetworkAdapter
Adapters = QXSystem.ReadNetworkAdapters
AddToProtocol vbNewLine + "Number of available network adapters= " + Str(UBound(Adapters) + 1) + vbNewLine
For i = 0 To UBound(Adapters)
AddToProtocol "Adapter " + Str(i) + ":" + vbNewLine
AddToProtocol ("AdapterName :" + Adapters(i).AdapterName + vbNewLine)
AddToProtocol ("Description :" + Adapters(i).Description + vbNewLine)
AddToProtocol ("IPAddress :" + Adapters(i).IpAddress + vbNewLine)
AddToProtocol ("PhysicalAddress :" + Adapters(i).PhysicalAddress + vbNewLine)
AddToProtocol ("AdapterType :" + Adapters(i).AdapterType + vbNewLine)
Next
End Sub
Private Sub GetMeasurementValues_Click()
On Error GoTo errorhandler
'Get the measurement values
'To get the measurement values you have to do 2 things:
'1. Let the API get the measurement-values-datablock of all devices that are part of the measurement
'We just use one device here - since we are connected to one device only.
'2. Get the measurement values of the subcribed signals.
AddToProtocol vbNewLine + "Get measurement values " + vbNewLine
Dim values As MeasurementValues
Dim NumberOfMeasurementValues As Long
Dim myValues() As Double
'1.
QXSimpleDAQ.GetDataBlock
'Now all measurement values are distributed to the corresponding buffers of the subscribed signals
'2. Get the measurement values of the signals (we subscribed 3 signals)
For i = 0 To 2
NumberOfMeasurementValues = QXSimpleDAQ.GetSignalData(i, values)
AddToProtocol "Number of accumulated measurement values of channel " + Str(i) + ": " + Str(NumberOfMeasurementValues) + vbNewLine
'have a look into the values object (e.g. while debugging here..)
'myValues = values.values
Next
Exit Sub
errorhandler:
AddToProtocol vbNewLine + "Get measurement values: Exception occured: " + Err.Description + vbNewLine
End Sub
Private Sub ReadDevice_Click()
Dim SubdevicesLinear() As SubDevice
SubdevicesLinear = QXSystem.SubdevicesLinear
If (UBound(SubdevicesLinear) > -1) Then
'there is at least one connected device!
'get an object representation of that device!
Set MyDevice = QXSystem.ReadDevice(SubdevicesLinear(0).UUID_)
AddToProtocol ("\nRead device with UUID: " + SubdevicesLinear(0).UUID_ + ":" + vbNewLine + MyDevice.ConvertToXML + vbNewLine)
Else
AddToProtocol (vbNewLine + "NO no .. You first have to connect a device!" + vbNewLine)
End If
End Sub
Private Sub ReadSingleMeasurementValue_Click()
'Please notice: This function does not work within the IDE...
On Error GoTo errorhandler
' Dim MyDoubles() As Double
' Dim MyStati() As Long
' Call QXSimpleDAQ.GetSingleShot(MyScanResults(0).UUID_, False, MyDoubles, MyStati)
Dim MeasurementVal As Single
Dim MeasurementVal_2 As Double
Dim MyConnectorType As eConnectorTypes
QXSimpleDAQ.GetSinglePoint MyScanResults(0).UUID_, 0, 0, 0, eConnectorTypes_ANALOG_IN_CHANNEL, MeasurementVal
'QXSimpleDAQ.GetSinglePoint_2 MyScanResults(0).UUID_, 0, 0, eScaleType_SCALETP_NONE, MeasurementVal_2
AddToProtocol vbNewLine + "Read single measurment: value= " + Str(MeasurementVal) + vbNewLine
Exit Sub
errorhandler:
AddToProtocol vbNewLine + "Read single measurement value: Exception occured: " + Err.Description + vbNewLine
End Sub
Private Sub ScanForQXDevices_Click()
MyScanResults = QXSystem.ScanForQXDevices
AddToProtocol (vbNewLine + "Scan for QuantumX devices: " + Str(UBound(MyScanResults) + 1) + " Device(s) found:" + vbNewLine)
For i = 0 To UBound(MyScanResults)
AddToProtocol (MyScanResults(i).Name + ", " + MyScanResults(i).IpAddress + ", " + MyScanResults(i).UUID_ + vbNewLine)
Next
End Sub
Private Sub SetupMeasurement_Click()
'There are 2 ways of getting measurement values:
'1. Repeatedly calling GetSinglePoint, GetSingleShot ...
'2. Subscribe signals - start measurement - get values - stop measuremnt
'In the following example we use the second way to get measurement values.
'To setup a measurement you first have to "subscribe" all signals that are part of the measurement.
On Error GoTo errorhandler
'Subcribe signals (signal number 1 of channel1, channel2 and channel 3)
QXSimpleDAQ.SubscribeSignal MyScanResults(0).UUID_, 0, 0, 0, eConnectorTypes_ANALOG_IN_CHANNEL, 0, 10000
QXSimpleDAQ.SubscribeSignal MyScanResults(0).UUID_, 1, 0, 0, eConnectorTypes_ANALOG_IN_CHANNEL, 1, 10000
QXSimpleDAQ.SubscribeSignal MyScanResults(0).UUID_, 2, 0, 0, eConnectorTypes_ANALOG_IN_CHANNEL, 2, 10000
'QXSimpleDAQ.SubscribeSignal MyScanResults(0).UUID_, 0, 0, 0, eConnectorTypes_CANBUS, 0, 10000
'QXSimpleDAQ.SubscribeSignal MyScanResults(0).UUID_, 0, 1, 0, eConnectorTypes_CANBUS, 0, 10000
'QXSimpleDAQ.SubscribeSignal MyScanResults(0).UUID_, 0, 2, 0, eConnectorTypes_CANBUS, 0, 10000
AddToProtocol vbNewLine + "Setup measurement: 3 signals subscribed:" + vbNewLine
Exit Sub
errorhandler:
AddToProtocol vbNewLine + "Setup measurement: Exception occured: " + Err.Description + vbNewLine
End Sub
Private Sub StartMeasurement_Click()
'Start the measurement
On Error GoTo errorhandler
QXSimpleDAQ.StartDAQ False
AddToProtocol vbNewLine + "Measurement started" + vbNewLine
Exit Sub
errorhandler:
AddToProtocol vbNewLine + "Start measurement: Exception occured: " + Err.Description + vbNewLine
End Sub
Private Sub StopMeasurement_Click()
'Stop the measuring
QXSimpleDAQ.StopDAQ
AddToProtocol vbNewLine + "Measurement stopped" + vbNewLine
End Sub
Code: Alles auswählen
// Erzeugen einer Word Anwendung mit CreateObject()
#pragma library( "ascom10.lib" )
// public ScanResult(UInt64 UUID, string Name, string ModuleType, string IPAddress, int Port);
#include "activex.ch"
PROCEDURE Main
LOCAL oQXSystem,oQXSimpleDAQ
local test
local NullArgs
local oTest
local result
oQXSystem := CreateObject( "HBM.QuantumX.QXSystem_" )
oQXSimpleDAQ := CreateObject( "HBM.QuantumX.QXSimpleDAQ_" )
// oQXSystem := GetObject( ,"HBM.QuantumX.QXSystem_" )
// oQXSimpleDAQ := GetObject(, "HBM.QuantumX.QXSimpleDAQ_" )
IF NIL == oQXSystem
? "Fehler: ", ComLastError()
? "Beschreibung:"
? ComLastMessage()
RETURN
ENDIF
result := oQXSystem:Connect("192.168.0.20",bin2l("5001"))
// oQXSystem:ScanForQXDevices(bin2i("0"))
IF NIL == oQXSimpleDAQ
? "Fehler: ", ComLastError()
? "Beschreibung:"
? ComLastMessage()
RETURN
ENDIF
oQXSystem:quit()
// Auflösen der Referenz
oQXSystem:destroy()
oQXSimpleDAQ:quit()
// Auflösen der Referenz
oQXSimpleDAQ:destroy()
inkey(0)
RETURN
result := oQXSystem:Connect("192.168.0.20",bin2l("5001"))
---------------------------
Xbase++ Fehlermeldung
---------------------------
Fehler Automation/6500 Beschreibung : Connection failed. Error in framework: #-1000620 TCP: Connect failed Operation : Connect Thread ID : 1 Betriebsystem Fehler : -2146232832 Called from MAIN(33)
---------------------------
OK Abbrechen
---------------------------
Was soll ich noch versuchen ?
mfg.
mkersch
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Variablenstruktur für ActivX aufruf
Bist Du "Schuld" an PDR 6295?
Jan
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Variablenstruktur für ActivX aufruf
Hi,
wenn bin2l("5001") irgendetwas mit der Zahl 5001 zu tun hat, dann ist das auf jeden Fall falsch.
Ich weiß auch nicht, ob man den "BIN" Wert direkt so angeben kann, was sollte das auch bringen ?
Welchen Wert möchtest du wie übergeben ?
Der VB Quellcode ist niederschmetternd umfangreich und viele seltsame AS / IS Verweise ... das sieht übel aus
wenn bin2l("5001") irgendetwas mit der Zahl 5001 zu tun hat, dann ist das auf jeden Fall falsch.
Ich weiß auch nicht, ob man den "BIN" Wert direkt so angeben kann, was sollte das auch bringen ?
Welchen Wert möchtest du wie übergeben ?
Der VB Quellcode ist niederschmetternd umfangreich und viele seltsame AS / IS Verweise ... das sieht übel aus
Gruß
Hubert
Hubert
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Variablenstruktur für ActivX aufruf
leider finde ich -2146232832 nicht in meiner Errorliste, aber wenn ich danach "google" dann scheint es ein Init Problem zu sein.mkersch hat geschrieben:Xbase++ Fehlermeldung
---------------------------
Fehler Automation/6500 Beschreibung : Connection failed. Error in framework: #-1000620 TCP: Connect failed Operation : Connect Thread ID : 1 Betriebsystem Fehler : -2146232832 Called from MAIN(33)
Frage : gibt es von dem activeX eine Demo ? URL ?
... was nichts für Xbase++ zu sagen hat.mkersch hat geschrieben:Mit den VBasic Beispiel klappt es sofort
wie ich schon sagte funktionieren, mit Xbase++ v1.9.3xx nur activeX die auf IDispatch aufbauen ... also 50% ...
... ich würde nun es mit h... oder Windev versuchen ob man da ran kommt ...
gruss by OHR
Jimmy
Jimmy
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Variablenstruktur für ActivX aufruf
ist das von http://www.hbm.com ?mkersch hat geschrieben:für eine Kraftauswertung (HBM)
wenn ja, ist das activeX von catman® ?
wenn ja, hast du unter http://www.hbm.com/de/menu/anwendungen/ ... beispiele/die Beispiele und "Knowledge Base" gesehen ?
ich würde bei dem Hersteller anfragen ob das activeX von IDispatch abgeleitet ist.
gruss by OHR
Jimmy
Jimmy
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Variablenstruktur für ActivX aufruf
Hi,
wenn es um hardware nahe Steuerungen geht ist Xbase++ nicht gerade erste Wahl.
Aber man kann natürlich die Steuerung in einer anderen Sprache machen und dann selbst die
Werte an Xbase++ weitergeben.
Mit VB habe ich da keine Erfahrung, c/c++ wäre wohl am einfachsten oder delphi ... ich würde PowerBasic nehmen
Damit könnte man Funktionen / DLL erstellen die dann die Umsetzungen vornehmen.
Pablo ( www.xbwin.com ) hat da viel Erfahrung und erledigt Auftragsarbeiten.
Wenn Ihr niemanden habt der die Schnittstellen bedienen kann, schickt mal eine eMail an Pablo ...
wenn es um hardware nahe Steuerungen geht ist Xbase++ nicht gerade erste Wahl.
Aber man kann natürlich die Steuerung in einer anderen Sprache machen und dann selbst die
Werte an Xbase++ weitergeben.
Mit VB habe ich da keine Erfahrung, c/c++ wäre wohl am einfachsten oder delphi ... ich würde PowerBasic nehmen
Damit könnte man Funktionen / DLL erstellen die dann die Umsetzungen vornehmen.
Pablo ( www.xbwin.com ) hat da viel Erfahrung und erledigt Auftragsarbeiten.
Wenn Ihr niemanden habt der die Schnittstellen bedienen kann, schickt mal eine eMail an Pablo ...
Gruß
Hubert
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Variablenstruktur für ActivX aufruf
Hi,
ich habe Pablo mal das Problem so gut es ging geschildert und versuche mich an einer Übersetzung der Antwort ...
falls jemand einen Fehler in der Übersetzung findet, bitte mitteilen.
ist ein ganz normaler Prototyp, das einzige Problem daran ist, dass Alaska nicht dokumentiert wie man einen Wert wie VtType():New( uValue , VT_UI8 ) übergibt.
Eventuell ist auch gemeint, dass VtType() überhaupt nicht dokumentiert ist.
Wird für uValue ein uValue := 8byte string erwartet ?
eventuell in lo hi order {LoInt32,HiInt32} ? oder soll er numerisch sein und Xbase++ kümmert sich darum ?
Kann die Xbase++ ActiveX Schnittstelle diese Aufgabe überhaupt erledigen ?
(gemeint sind wohl Typen von Parametern etc.)
wobei nMethod die Postion der nötigen Methode in der VTBL ist. Also der Methodenindex/ID.
nMethod ist sehr einfach aus den TLB oder C headers herauszulesen (wenn er das sagt ).
pInterface kann einfach aus oAxObject:interface geladen werden.
uUuid kann entweder ein 8byte string, {LoInt32Part,HiInt32Part}, eine xbase Zahl oder ein ot4xb LARGE_INTEGER or ULARGE_INTEGER object sein.
Jeder dieses Datentypen sollte richtig konvertiert werden (automatisch ?)
c_sw erledigt die Ansi->unicode Umsetzung automatisch, somit kann dieser Parameter einfach als Xbase++ ansi string angegeben werden (NICHT OEM ?)
Er bat mich, das hier zu übersetzen und zu veröffentlichen, was ich gerne tue.
ich habe Pablo mal das Problem so gut es ging geschildert und versuche mich an einer Übersetzung der Antwort ...
falls jemand einen Fehler in der Übersetzung findet, bitte mitteilen.
Pablo hat geschrieben: > public ScanResult(UInt64 UUID, string Name, string ModuleType, string IPAddress, int Port)
is a very common prototype, the only trouble is that Alaska don't document how to provide the value for
VtType():New( uValue , VT_UI8 )
uValue := 8bye string?, {LoInt32,HiInt32}?, numeric?
or if is able to handle it
Code: Alles auswählen
public ScanResult(UInt64 UUID, string Name, string ModuleType, string IPAddress, int Port)
Eventuell ist auch gemeint, dass VtType() überhaupt nicht dokumentiert ist.
Wird für uValue ein uValue := 8byte string erwartet ?
eventuell in lo hi order {LoInt32,HiInt32} ? oder soll er numerisch sein und Xbase++ kümmert sich darum ?
Kann die Xbase++ ActiveX Schnittstelle diese Aufgabe überhaupt erledigen ?
(gemeint sind wohl Typen von Parametern etc.)
Falls Alaska dies nicht unterstützt, gibt es andere Lösungsansätze:Pablo hat geschrieben:But there are some other approaches if the Alaska guys don't give support for this:
Wenn man die TLB (was ist das ?) oder die C++ header hat (also ein C++ Beispiel), kann man mit Pablos ot4xb Tools die Methoden direkt aufrufen.Pablo hat geschrieben:Havving the TLB or the C++ headers can be called just using
IFpQCall( nMethod , "__sl__uqc_swc_swc_sw__sl",pInterface, uUuid, cName, cModuleType,cIP, nPort )
where nMethod is the position of the method inside in the VTBL ( very easy to know having the TLB or the C headers)
pInterface can be obtained from oAxObject:interface
uUuid can be 8byte string, {LoInt32Part,HiInt32Part} , xbase numeric , or an ot4xb LARGE_INTEGER or ULARGE_INTEGER object
any of this cases cases will be properly converted
c_sw make automatic Ansi->unicode conversion so string parameters can be just Xbase++ ansi strings
Code: Alles auswählen
IFpQCall( nMethod , "__sl__uqc_swc_swc_sw__sl",pInterface, uUuid, cName, cModuleType,cIP, nPort )
nMethod ist sehr einfach aus den TLB oder C headers herauszulesen (wenn er das sagt ).
pInterface kann einfach aus oAxObject:interface geladen werden.
uUuid kann entweder ein 8byte string, {LoInt32Part,HiInt32Part}, eine xbase Zahl oder ein ot4xb LARGE_INTEGER or ULARGE_INTEGER object sein.
Jeder dieses Datentypen sollte richtig konvertiert werden (automatisch ?)
c_sw erledigt die Ansi->unicode Umsetzung automatisch, somit kann dieser Parameter einfach als Xbase++ ansi string angegeben werden (NICHT OEM ?)
Ohne TLB muss man ein kleines C++ wrapper Programm nutzen um die Aufrufe zu verpacken.Pablo hat geschrieben: Whithout the TLB must use invoke that maybe easy and fast using a small C++ wrapper
Maybe you can translate this to german and put quoted in the forum
Regards,
Pablo
Er bat mich, das hier zu übersetzen und zu veröffentlichen, was ich gerne tue.
Gruß
Hubert
Hubert
- Martin Altmann
- Foren-Administrator
- Beiträge: 16555
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 115 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: Variablenstruktur für ActivX aufruf
TLB müsste für Type LiBrary (Typenbibliothek) stehen.
Viele Grüße,
Martin
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Re: Variablenstruktur für ActivX aufruf
Vielen Dank für Eure Unterstützung
==> E-Mail an Fa. HBM
wir setzen schon seit vielen Jahren HBM Messtechnik ein.
Auf der Sensor-Messe in Nürnberg habe ich mit Ihnen, zwecks Kommunikation zu MX840, gesprochen.
Sie haben mir empfohlen mit der QuantumX API COM auf das MX840 Gerät zuzugreifen.
Dies funktioniert auch mit dem mitgelieferte VBasic (VB6) Programm einwandfrei.
Wir möchten die Messwerte jedoch mit XBASE++ (Objektorientierte Datenbankprogrammiersprache von der Fa. Alaska) lesen.
(Das komplette Messwertverwaltungsprogramm ist bereits in XBase++ geschrieben)
Wir wollten dies mit der QuantumX API (COM) lösen.
In der Vergangenheit haben wir schon öfters Activex Componenten mit erfolg in Xbase++ eingebunden. Jedoch die QuantumX Komponenten
Z.B: ScanForDevices bzw. Connect erzeugen Laufzeitfehler.
Dieses Problem habe ich ausführlich im Xbase Forum behandelt. Ein User tippt, das QuantumX nicht auf iDispatch aufgebaut ist.
siehe Forenbeitrag ==> http://www.xbaseforum.de/viewtopic.php?f=28&t=4274
Ist QuantumX API (COM) auf iDispatch aufgebaut ?
Was würden Sie mir empfehlen wie ich auf die Daten zugreifen soll ?
==> Antwort Fa. HBM
die Hilfe der High-Level API referenziert eher auf die Verwendung in der .NET Laufzeitumgebung.
Die API unterstützt aber auch die COM-Technologie. Datentypen können aber im Einzelfall abweichen, so z.B. UINT64 für die UUID (das ist die MAC-Adresse des Geräts). Typischerweise ist UINT64 bei COM ein String.
Haben Sie sich die Typendeklaration unseres COM-Beispiels unter VB angesehen?
Leider wissen wir nicht wie man ein Array vom Typ ScanResults in XBase++ anlegt.
Ich hoffe, wir konnten Ihnen weiterhelfen.
mfg.
mkersch
==> E-Mail an Fa. HBM
wir setzen schon seit vielen Jahren HBM Messtechnik ein.
Auf der Sensor-Messe in Nürnberg habe ich mit Ihnen, zwecks Kommunikation zu MX840, gesprochen.
Sie haben mir empfohlen mit der QuantumX API COM auf das MX840 Gerät zuzugreifen.
Dies funktioniert auch mit dem mitgelieferte VBasic (VB6) Programm einwandfrei.
Wir möchten die Messwerte jedoch mit XBASE++ (Objektorientierte Datenbankprogrammiersprache von der Fa. Alaska) lesen.
(Das komplette Messwertverwaltungsprogramm ist bereits in XBase++ geschrieben)
Wir wollten dies mit der QuantumX API (COM) lösen.
In der Vergangenheit haben wir schon öfters Activex Componenten mit erfolg in Xbase++ eingebunden. Jedoch die QuantumX Komponenten
Z.B: ScanForDevices bzw. Connect erzeugen Laufzeitfehler.
Dieses Problem habe ich ausführlich im Xbase Forum behandelt. Ein User tippt, das QuantumX nicht auf iDispatch aufgebaut ist.
siehe Forenbeitrag ==> http://www.xbaseforum.de/viewtopic.php?f=28&t=4274
Ist QuantumX API (COM) auf iDispatch aufgebaut ?
Was würden Sie mir empfehlen wie ich auf die Daten zugreifen soll ?
==> Antwort Fa. HBM
die Hilfe der High-Level API referenziert eher auf die Verwendung in der .NET Laufzeitumgebung.
Die API unterstützt aber auch die COM-Technologie. Datentypen können aber im Einzelfall abweichen, so z.B. UINT64 für die UUID (das ist die MAC-Adresse des Geräts). Typischerweise ist UINT64 bei COM ein String.
Haben Sie sich die Typendeklaration unseres COM-Beispiels unter VB angesehen?
Leider wissen wir nicht wie man ein Array vom Typ ScanResults in XBase++ anlegt.
Ich hoffe, wir konnten Ihnen weiterhelfen.
mfg.
mkersch
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Variablenstruktur für ActivX aufruf
Hi,
ich kann mich nur wiederholen, du musst entweder mit BAP (l2bin(), f2bin()) einen String erzeugen,
der dem Aufbau dieser Struktur entspricht und so oft verketten wie du Array-Elemente brauchst
(ein Xbase++ Array ist anders aufgebaut als in VB) oder du nutzt die ot4xb von Pablo zur Definition
der Struktur und verkettest diese.
Es müsste auch möglich sein ein VB6 Programm zu erstellen, das die .NET Messgeräte bedient
und per COM Server mit eigenen Schnittstellen die Daten an dein Xbase++ Programm weitergibt.
Falls du eine Subscription mit Support hast, kannst du natürlich auch bei Alaska nach Unterstützung fragen.
ich kann mich nur wiederholen, du musst entweder mit BAP (l2bin(), f2bin()) einen String erzeugen,
der dem Aufbau dieser Struktur entspricht und so oft verketten wie du Array-Elemente brauchst
(ein Xbase++ Array ist anders aufgebaut als in VB) oder du nutzt die ot4xb von Pablo zur Definition
der Struktur und verkettest diese.
Es müsste auch möglich sein ein VB6 Programm zu erstellen, das die .NET Messgeräte bedient
und per COM Server mit eigenen Schnittstellen die Daten an dein Xbase++ Programm weitergibt.
Falls du eine Subscription mit Support hast, kannst du natürlich auch bei Alaska nach Unterstützung fragen.
Gruß
Hubert
Hubert
Re: Variablenstruktur für ActivX aufruf
Vielen Dank für Eure Bemühungen
"Letzer Versuch"
Seit 1990 (Clipper Sommer 87) beschäftige ich mich mit dem Xbase Dialekt. Wir estellen Prüfprogramme.
Leider ist dies nicht mein Hauptbetätigungsfeld (Maschinensteuerungen Siemens S7, Roboter Hirata usw.)
Da ich die Internas von Xbase++ nicht gut kenne, wende ich mich ein letztes mal an Euch mit der Bitte um Unterstüzung.
Wie kann ich ScanResult mit ot4xb von Pablo abbilden ?
public ScanResult(UInt64 UUID, string Name, string ModuleType, string IPAddress, string SubNetmask, int Port);
Array[1].UUID // für ersten Atapter
Array[1].Name
Array[1].ModuleType
Array[1].IPAddress
Array[1].SubNetmask
Array[1].Port
Array[2]. UUID // für zweiten Atapter
usw.
Meine Versuche:
BEGIN STRUCTURE mScanResult
MEMBER DWORD64 UUID
MEMBER LONG Name
MEMBER LPSTR ModuleType
MEMBER LPSTR IPAdress
MEMBER LPSTR SubNetMask
MEMBER INT32 Port
END STRUCTURE
local oScan := {mScanResult():New()}
oScan := oQXSystem:ScanForQXDevices()
mfg.
mkersch
"Letzer Versuch"
Seit 1990 (Clipper Sommer 87) beschäftige ich mich mit dem Xbase Dialekt. Wir estellen Prüfprogramme.
Leider ist dies nicht mein Hauptbetätigungsfeld (Maschinensteuerungen Siemens S7, Roboter Hirata usw.)
Da ich die Internas von Xbase++ nicht gut kenne, wende ich mich ein letztes mal an Euch mit der Bitte um Unterstüzung.
Code: Alles auswählen
Dim QXSystem As QXSystem_
Dim QXSimpleDAQ As QXSimpleDAQ_
Dim MyDevice As Device
Dim MyScanResults() As ScanResult
' Geräte scannen
MyScanResults = QXSystem.ScanForQXDevices
' Gerät connecten
result = QXSystem.Connect(MyScanResults(0).IpAddress, MyScanResults(0).Port)
public ScanResult(UInt64 UUID, string Name, string ModuleType, string IPAddress, string SubNetmask, int Port);
Array[1].UUID // für ersten Atapter
Array[1].Name
Array[1].ModuleType
Array[1].IPAddress
Array[1].SubNetmask
Array[1].Port
Array[2]. UUID // für zweiten Atapter
usw.
Meine Versuche:
BEGIN STRUCTURE mScanResult
MEMBER DWORD64 UUID
MEMBER LONG Name
MEMBER LPSTR ModuleType
MEMBER LPSTR IPAdress
MEMBER LPSTR SubNetMask
MEMBER INT32 Port
END STRUCTURE
local oScan := {mScanResult():New()}
oScan := oQXSystem:ScanForQXDevices()
mfg.
mkersch
- brandelh
- Foren-Moderator
- Beiträge: 15706
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Variablenstruktur für ActivX aufruf
ist das jetzt eine Drohungmkersch hat geschrieben:Vielen Dank für Eure Bemühungen
"Letzer Versuch"
Im Ernst, die Ansteuerung von ActiveX Objekten zählt nicht zu den einfachsten Dingen.
Warum willst du genau diese Aufgabe mit Xbase++ machen, wenn du dich da nicht gut auskennst ?
Wäre es nicht sinnvoller die Steuerungsdaten per VB Programm (mit Unterstützung des Herstellers) zu ermitteln und diese dann z.B. als Datei oder TCPIP an das Auswertungsprogramm zu übermitteln ?
Wenn es Xbase++ sein soll, wäre ein outsourcen sinnvoll.
Gerade die Ansteuerung von "exotischer" Hardware (zumindest im Xbase++ Umfeld) setzt tiefgreifende
Kenntnisse von Protokollen und Speicherbelegung voraus.
Offensichtlich hat sich hier noch niemand mit genau dieser Hardware beschäftigt.
Ich kann dafür (ohne irgendeinen persönlichen Nutzen) Pablo Botella empfehlen. Er hat nicht nur die Bibliothek ot4xb geschrieben, er lebt von solchen schwierigen Aufgabenstellungen und weiß wovon er spricht.
Ich versuche mich mal an der Strukturbeschreibung, mit VB habe ich nichts am Hut, aber...
Code: Alles auswählen
In VB ==> MyScanResult(1).UUID // UINT64
MyScanResult(1).Name // String
MyScanResult(1).Module.Typ // String
MyScanResult(1).IPAdresse // String
MyScanResult(1).Port // INT
ich käme bei der Strukturbeschreibung auf ...mkersch hat geschrieben:Code: Alles auswählen
BEGIN STRUCTURE mScanResult MEMBER DWORD64 UUID MEMBER LONG Name MEMBER LPSTR ModuleType MEMBER LPSTR IPAdress MEMBER LPSTR SubNetMask MEMBER INT32 Port END STRUCTURE
Code: Alles auswählen
BEGIN STRUCTURE mScanResult
MEMBER DWORD64 UUID // ok
MEMBER LPSTR Name // laut VB String ? SZSTR ? DYNSZ ?
MEMBER ??? Module.Type // laut BV Module.Typ -> 2 Typen !!!
MEMBER LPSTR IPAdress // laut VB String ? SZSTR ? DYNSZ ?
MEMBER LPSTR SubNetMask // ???? fehlt in der VB Beschreibung
MEMBER ??? Port // DWORD oder WORD oder LONG ???
END STRUCTURE
INT32 ist laut ot4xb Doku ein Synonym für DWORD, d.h. andere könnten es so benennen.
Hier muss man DWORD (32 bit unsigned) oder WORD (16 bit unsigned) oder LONG (32 bit signed) etc. benutzen.
Was genau, muss aus der Doku hervorgehen. Es müsste eine Art von INCLUDE Datei geben die diese Strukturen enthält, oder aber diese werden direkt aus dem ActiveX geladen, das weiß ich nicht.
Zum Schluss einige Beispiele wie solches bei meinem PowerBasic aussieht, vielleicht hilft das beim Finden:
Code: Alles auswählen
TYPE FINDREPLACE
lStructSize AS DWORD
hWndOwner AS DWORD
hInstance AS DWORD
Flags AS DWORD
lpstrFindWhat AS ASCIIZ PTR
lpstrReplaceWith AS ASCIIZ PTR
wFindWhatLen AS WORD
wReplaceWithLen AS WORD
lCustData AS LONG
lpfnHook AS DWORD
lpTemplateName AS ASCIIZ PTR
END TYPE
%FR_DOWN = &H00000001&
%FR_WHOLEWORD = &H00000002&
%FR_MATCHCASE = &H00000004&
%FR_FINDNEXT = &H00000008&
%FR_REPLACE = &H00000010&
%FR_REPLACEALL = &H00000020&
Da fällt mir ein, es gibt doch für ActiveX einen COM Browser ...
Mit dem Programm im XPPw32\bin\Tlb2Ch.exe kann man die Eigenschaften von ActiveX COM Schnittstellen abfragen und eine CH Datei erstellen lassen. Vielleicht hilf das ?
Re: Variablenstruktur für ActivX aufruf
Hallo Forenmitglieder,
mein letzter Artikel war keine "Drohung"
Nochmals vielen Dank für Eure Bemühungen.
Mein Projekt werde ich jetzt mit einer Art "Low-Level API von HBM" und ot4xb weiterverfolgen.
Erste Erfolge sind sichtbar !
mfg.
mkersch
mein letzter Artikel war keine "Drohung"
Nochmals vielen Dank für Eure Bemühungen.
Mein Projekt werde ich jetzt mit einer Art "Low-Level API von HBM" und ot4xb weiterverfolgen.
Erste Erfolge sind sichtbar !
mfg.
mkersch