Moin
ich möchte Mittels API Schnittstelle und entsprechender dll meinen über USB angeschlossenen Servoregler ansprechen.
Hier zu verwende ich Cypress Enable, da diese auch in meiner Steuerungssoftware eingebettet ist.
Cypress ist stark an VB angeleht, nur hat es weniger Funktionen.
Ich habe mich ein wenig in Sachen API eingelesen. Also Begriffe wie UnManage, BSTR, Wrapper ect. hab ich schon mal gelesen .
Den Zugriff auf den Regler, das lesen und schreiben von Parametern habe ich nach vielen Versuchen (endlich) hinbekommen.
Leider kann ich meinen Code nur einmal durchlaufen lassen, da ich beim zweiten Durchlauf einen Fehler aus der dll (Internal error <setComPar>) bekomme.
Meine Vermutung, es hängt mit dem Pointer auf das "communication session object" oder dem Thread!? zusammen.
Ich muss den Scripteditor schließen und erst nach erneutem öffnen kann ich den Code einmalig fehlerfrei abarbeiten.
Kann man nicht den Pointer speichern? Mit strPtr und CopyMemory in der nächsten Laufzeit wiederholen?
Leider hat Cypress kein strPtr und die API von varPtr ist ja nicht das selbe.
Hier erstmal das Reference Manual,
der C# Header,
... und mein Code für die Initialisiereung:
Code:
Cypress Enable
Vermutlich ist meine Vorgehensweise für diese Art von Abfragen ungeeignet.
Solche API Zugriffe laufen doch normalerweise in einem Main-Thread!? in einer Schleife?
Und von dem werden dann die Funktionen aus gestartet?
Muss ich vielleicht mit Objekten und Klassen Arbeiten?
In der Hinsicht habe ich noch nicht so viel gemacht/Erfahrung.
Ich würde mich über Tipps und Ratschläge freuen, die mich weiter voran bringen können.
Gruß
Robert
ich möchte Mittels API Schnittstelle und entsprechender dll meinen über USB angeschlossenen Servoregler ansprechen.
Hier zu verwende ich Cypress Enable, da diese auch in meiner Steuerungssoftware eingebettet ist.
Cypress ist stark an VB angeleht, nur hat es weniger Funktionen.
Ich habe mich ein wenig in Sachen API eingelesen. Also Begriffe wie UnManage, BSTR, Wrapper ect. hab ich schon mal gelesen .
Den Zugriff auf den Regler, das lesen und schreiben von Parametern habe ich nach vielen Versuchen (endlich) hinbekommen.
Leider kann ich meinen Code nur einmal durchlaufen lassen, da ich beim zweiten Durchlauf einen Fehler aus der dll (Internal error <setComPar>) bekomme.
Meine Vermutung, es hängt mit dem Pointer auf das "communication session object" oder dem Thread!? zusammen.
Ich muss den Scripteditor schließen und erst nach erneutem öffnen kann ich den Code einmalig fehlerfrei abarbeiten.
Kann man nicht den Pointer speichern? Mit strPtr und CopyMemory in der nächsten Laufzeit wiederholen?
Leider hat Cypress kein strPtr und die API von varPtr ist ja nicht das selbe.
Hier erstmal das Reference Manual,
der C# Header,
... und mein Code für die Initialisiereung:
Code:
Visual Basic-Quellcode
- 'Cypress Enable Code
- Declare Function openDCE Lib "C:\HIWIN\dce\toolswin\winkmi\mpi.dll" (ByVal pwdin As String,ByVal cnfname As String) As Long
- Declare Function setComPar Lib "C:\HIWIN\dce\toolswin\winkmi\mpi.dll" ( ByVal port As Integer, _
- ByVal baudrate As Integer, _
- ByVal mode As Integer, _
- ByVal trid As Integer, _
- ByVal rcid As Integer, _
- ByVal cancanbaudrate As Integer, _
- ByVal msgStand As Integer, _
- ByVal canpipelevel As Integer, _
- ByVal timeout As Integer, _
- ByVal locktime As Integer, _
- ByVal iternum As Integer, _
- ByVal pcom As Long) As Long
- Declare Function closePort Lib "C:\HIWIN\dce\toolswin\winkmi\mpi.dll" (ByVal pcom As Long) As Long
- Declare Function deleteDCE Lib "C:\HIWIN\dce\toolswin\winkmi\mpi.dll" (ByVal pcom As Long, ByVal closeMFC As Integer) As Long
- Declare Function GetVarN Lib "C:\HIWIN\dce\toolswin\winkmi\mpi.dll" ( ByVal varName As String, _
- ByRef pdata As Long, _
- ByVal slave As Integer, _
- ByVal pcom As Long) As Long
- Dim pcom As Long
- Dim pdata As Double, tmpPdata As Double
- Dim pwdin As String, cnfname As String
- Dim slave As Integer, po As Integer, tmpGetVarN As Integer
- pwdin = "c:\hiwin\dce\"
- cnfname = "lightening.dce"
- slave = 0
- pcom = openDCE(pwdin,cnfname) 'A pointer points to a communication session object. This pointer may be supplied to all other functions as the parameter pcom.
- po = setComPar(7,8,1,0,0,0,0,0,50,200,6,pcom) 'setzt und öffnet den Port
- tmpGetVarN = getVarN("X_enc_pos",pdata,0,pcom) 'einfache Abfrage eines Parameters im Regler
- tmpPdata = pdata
- If tmpGetVarN = 0 Then
- Print tmpPdata
- Else
- Print errStr(tmpGetVarN)
- End If
- Call closePort(pCom)
- Call deleteDCE(pCom,0)
- Function errStr(errcode As Integer) As String
- Dim tmpErrStr As String
- Select Case errcode
- Case 0
- 'tmpErrStr = "OK!"
- Case 31
- tmpErrStr = "Slave number out of range (0~31)!"
- Case 101
- tmpErrStr = "Read failed!"
- Case 102
- tmpErrStr = "Write failed!"
- Case 103
- tmpErrStr = "Frame error!"
- Case 104
- tmpErrStr = "No answer!"
- Case 105
- tmpErrStr = "Check sum error!"
- Case 106
- tmpErrStr = "Size out of range!"
- Case 107
- tmpErrStr = "Parity error!"
- Case 108
- tmpErrStr = "Over run error!"
- Case 109
- tmpErrStr = "Buffer over flow!"
- Case 110
- tmpErrStr = "Frame error!"
- Case 111
- tmpErrStr = "Abort!"
- Case 112
- tmpErrStr = "Net sync error!"
- Case 113
- tmpErrStr = "Can error!"
- Case 114
- tmpErrStr = "Answer size error!"
- Case 115
- tmpErrStr = "Start byte error!"
- Case 116
- tmpErrStr = "Master boot!"
- Case 117
- tmpErrStr = "EtherCAT mega-ulink error!"
- Case 118
- tmpErrStr = "EtherCAT mega-ulink in test mode!"
- Case 151
- tmpErrStr = "Communication FIFO full!"
- Case 152
- tmpErrStr = "Size transmit error!"
- Case 153
- tmpErrStr = "Communication is not available!"
- Case 154
- tmpErrStr = "No connection to remote side!"
- Case 155
- tmpErrStr = "Local communication blocked!"
- Case 156
- tmpErrStr = "Communication failed!"
- Case 157
- tmpErrStr = "No connection to remote side via Ehernet!"
- Case 158
- tmpErrStr = "EtherCAT mega-ulink slave not respond!"
- Case 201
- tmpErrStr = "Unrecognized variable!"
- Case 202
- tmpErrStr = "Slave name not defined!"
- Case 203
- tmpErrStr = "The list contain one or more unrecognized variables in slave!"
- Case 204
- tmpErrStr = "Variable is not short type!"
- Case 220
- tmpErrStr = "Variable is not a 64 bit type!"
- Case 221
- tmpErrStr = "Variable is a 64 bit type!"
- Case 251
- tmpErrStr = "Unrecognized function in slave!"
- Case 252
- tmpErrStr = "Slave name not defined!"
- Case 260
- tmpErrStr = "PDL function is not running in slave!"
- Case 261
- tmpErrStr = "Slave is in boot mode!"
- Case 262
- tmpErrStr = "Task number out of range!"
- Case 263
- tmpErrStr = "Slave in not in boot mode!"
- Case 270
- tmpErrStr = "Write buffer denied!"
- Case 271
- tmpErrStr = "Buffer size to set out of range!"
- Case 272
- tmpErrStr = "Read variable denied!"
- Case 273
- tmpErrStr = "Number of variables out of range!"
- Case 274
- tmpErrStr = "Expected answer length too big!"
- Case 275
- tmpErrStr = "Support only array access type 16/32 bits!"
- Case 300
- tmpErrStr = "Scope restart!"
- Case 301
- tmpErrStr = "Scope support only 2 variables!"
- Case 500
- tmpErrStr = "Link busy!"
- Case 501
- tmpErrStr = "No support!"
- Case 502
- tmpErrStr = "Master boot!"
- Case 503
- tmpErrStr = "No slave!"
- Case 504
- tmpErrStr = "Link error!"
- Case 505
- tmpErrStr = "Slave error!"
- Case 506
- tmpErrStr = "Invalid address!"
- Case 525
- tmpErrStr = "Server busy!"
- Case 600
- tmpErrStr = "State number out of range!"
- Case 601
- tmpErrStr = "Unrecognized state in slave!"
- Case 602
- tmpErrStr = "Slave name not defined!"
- Case 651
- tmpErrStr = "No support id communication command!"
- Case 801
- tmpErrStr = "Extra parameters!"
- Case 802
- tmpErrStr = "Missing parameters!"
- Case 803
- tmpErrStr = "Unrecognized command!"
- Case 1000
- tmpErrStr = "Communication driver is NULL!"
- Case Else
- tmpErrStr = "Sonstiger Fehler!"
- End Select
- errStr = tmpErrStr
- End Function
Vermutlich ist meine Vorgehensweise für diese Art von Abfragen ungeeignet.
Solche API Zugriffe laufen doch normalerweise in einem Main-Thread!? in einer Schleife?
Und von dem werden dann die Funktionen aus gestartet?
Muss ich vielleicht mit Objekten und Klassen Arbeiten?
In der Hinsicht habe ich noch nicht so viel gemacht/Erfahrung.
Ich würde mich über Tipps und Ratschläge freuen, die mich weiter voran bringen können.
Gruß
Robert
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „human“ ()