2016-08-03 4 views
0

Ich arbeite derzeit an der Kommunikation mit einem FANUC 31i Modell B-Controller. Mein Ziel ist es, ein Teileprogramm hochzuladen, zu verifizieren, dass kein Datenverlust vorliegt, und das Programm bei Bedarf zu löschen.C#: Übergeben Sie einen Zeiger auf die Zeichenfolge, um den zurückgegebenen Wert zu halten

FANUC verfügt über eine FOCAS-Bibliothek mit hilfreichen Funktionen zur Verwendung in C#. Unten ist der DllImport, mit dem ich Probleme habe.

Laut ihrem technischen Team muss ich einen Zeiger auf eine Zeichenfolge übergeben, um den zurückgegebenen Wert in Object a gespeichert zu halten. Die Zeichenfolge ist der Dateipfad des Teileprogramms, das gerade in das System hochgeladen wurde. Dies ist mir wichtig, da ich das hochgeladene Programm als Hauptprogramm auswählen kann. Diese

ist, was ich verwende in meinem Haupt-Code:

Object mg1 = new object(); 
     rslt = Focas64.cnc_pdf_rdmain(this.i31Handle,); 
     if (rslt != 0) 
     { 
      StopActivity(true); 
      return; 
     } 

Ich bin nicht allzu vertraut mit C# oder Codierung für diese Angelegenheit. Also bitte verdummt es für mich. Vielen Dank!

+0

Warum die C++ Tag, wenn Sie C# verwenden? Sie sind verschiedene Sprachen. –

+0

Die FOCAS-Bibliothek wurde ursprünglich für C++ entwickelt. Ich dachte, es wäre in dieser Situation relevant. Ich werde es für jetzt entfernen –

+0

Was ist die genaue Signatur der Funktion "cnc_pdf_rdmain" in der C oder C++ Header-Datei? – cynic

Antwort

0

konnte ich dieses Problem unten beheben der Arbeitscode lautet:

 // Verify code 
     byte[] a = new byte[244]; 
     rslt = Focas64.cnc_pdf_rdmain(this.i31Handle, a); 
     string result = System.Text.Encoding.UTF8.GetString(a); 
     if (rslt != 0) 
     { 
      StopActivity(true, Convert.ToString(rslt), this.tDownloadls, true); 
      return; 
     } 
0

Ich weiß nicht viel über die FANUC-Produkte, über die Sie sprechen, aber hier sind ein paar Grundlagen.
Sie können eine Zeichenfolge wie diese

string myString; 

dann erhalten einen Zeiger darauf wie diese ähnliche

string myString; 
rslt = Focas64.cnc_pdf_rdmain(this.i31Handle, &myString); 
+0

Es kann wichtig sein zu beachten, dass Sie einen Zeiger nur dann dereferenzieren können, wenn Sie sich in einem unsicheren Block befinden, und der C# -Compiler lässt Sie nur unsicheren Code verwenden, wenn Sie es explizit angeben. https://msdn.microsoft.com/en-us/library/aa288474(v=vs.71).aspx –

+0

Argumente FlibHndl [in] Geben Sie das Bibliothekshandle an. Siehe "Bibliotheksgriff" für Details. file_path [out] Geben Sie den Zeiger für die Zeichenfolge an, die "Aktuelles Laufwerk + Ordner + Dateiname" speichert. Weisen Sie 244 Byte Länge für die maximale Länge der Zeichenfolge von 242 Zeichen zu. Die Zeichenfolge ist NULL beendet. –

+0

Möglicherweise kann dies Ihnen helfen, die Argumente in der cnc_pdf_rdmain –

0

Sie die folgende aussehen könnte erstellen verwenden könnte

&myString; 

So Ihr Code Vorschlag:

[DllImport("FWLIB64.dll", EntryPoint="cnc_pdf_rdmain")] 

public static unsafe extern short cnc_pdf_rdmain(ushort FlibHndl, [ Out, MarshalAs(UnmanagedType.AsAny) ] out Object a); 

Object mg1 = new object(); 
rslt = Focas64.cnc_pdf_rdmain(this.i31Handle, out mg1); 
if (rslt != 0) 
{ 
    StopActivity(true); 
    return; 
} 
string result = mg1.ToString(); 
Console.WriteLine(result); 
+0

zu verstehen Ich habe dies bereits versucht und es löst diese Ausnahme: 'System.Runtime.InteropServices.MarshalDirectiveException' in SpaceX aufgetreten - DragonHPC.exe Zusätzliche Informationen: Kann nicht Marshal ' Parameter # 2 ': AsAny kann nicht für Rückgabetypen, ByRef-Parameter, ArrayWithOffset oder Parameter, die von unmanaged an verwaltet übergeben werden, verwendet werden. –

+0

'AsAny' ist ein billiger Platzhalter und funktioniert nicht immer wie erwartet. Ich gehe normalerweise nicht in pinvoke/export Sachen innerhalb von .NET, aber wenn Sie ein technisches Dokument haben (das den erwarteten Datentyp zeigt, wahrscheinlich in C/C++), würde das helfen. Andernfalls, wenn Sie 32bit verwenden, versuchen Sie, 'AsAny' zu einem int-Typ zu ändern (oder, wenn 64bit, versuchen Sie den langen Typ). Dies sind die grundlegenden C-Style-Pointer-Typen, dann übergeben Sie den '& myString'-Zeiger dazu (fühle mich nicht zurück, kann dieses Zeug ein echter Schmerz sein, vor allem für Uneingeweihte) – jleach

+0

Ich glaube nicht, dass Sie Zeichenfolge verwenden können Typen als Zeiger. –

0

Die dllimport-Linie ist komisch. Ich bin mir nicht sicher, warum FANUC Ihnen das gegeben hat, wenn der Typ bekannt ist (char *). Es gibt ein einfaches Verfahren zum Marshalling einer Zeichenfolge zu char *. Sie müssen wissen, ob das Zeichen * ANSI oder auch breit codiert ist.

Normalerweise würden Sie so etwas wie MarshalAs(UnmanagedType.LPStr)] verwenden, das heißt

[DllImport ("does-not-exist")] 
private static extern void Foo (
     [Out, MarshalAs(UnmanagedType.LPStr)] string ansiString) 

Außerdem werden Sie zuerst die Zeichenfolge Größe wollen, so gibt es Raum, um es zu schreiben ist. Also mach die Zeichenkette 244 Zeichen lang

string s = new string(' ',244); 
Focas64.cnc_pdf_rdmain(this.i31Handle, s); 

Es ist schon eine Weile her. Ich habe gerade mein Wissen aktualisiert here.

+0

Hoffentlich funktioniert das. Ich werde es in 2 Stunden testen können. Die CNC-Maschinen haben momentan keinen Strom = –

0

Ich glaube nicht, dass Sie die richtige Fanuc-Funktion für das verwenden, was Sie tun möchten. Die Funktion cnc_pdf_rdmain wird verwendet, um den Pfad des auf dem Computer registrierten Hauptprogramms abzurufen. Sie können diese Funktion nicht beeinflussen und können sie nicht mit dieser Funktion herunterladen. Es sagt dir nur den Weg.

Ich habe dies in VB funktioniert.net

Erste aus der Dokumentation Fanuc:

#include "fwlib32.h" or "fwlib64.h" 
FWLIBAPI short WINAPI cnc_pdf_rdmain(unsigned short FlibHndl, char *file_path); 

und die VB-Deklaration:

Declare Function cnc_pdf_rdmain Lib "FWLIB32.DLL" _ 
    (ByVal FlibHndl As Integer, <[In], Out> ByVal a() As Char) As Short 

Jetzt in meiner Anwendung (Dies wird von Fanuc vorge geliefert):

Dim mpPath As Char() 
ReDim mpPath(212) 

LastError = cnc_pdf_rdmain(Hndl, mpPath) 

(LastError wurde als Integer definiert und Hndl ist das Handle für die Focas-Verbindung, die zuvor eingerichtet wurde. Beachten Sie, dass die Größe des Char-Arrays in der Fanuc-Dokumentation angegeben ist)

Dies wird eine Zeichenfolge in mpPath zurückgeben, die etwa wie folgt aussieht: "// CNC_MEM/1234", wenn das Programm 1234 als Hauptprogramm von der obersten Ebene geladen wird Verzeichnis.

Verwandte Themen