problem mit schreiben von libnodave zu eine cp315-2dp/pd

fldrgn

Level-1
Beiträge
7
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Wir wollen durch libnodave 0.8.4.4 data lesen und schreiben von vb nach ein siemens s7 315-2dp/pd. Wir haben es shon geschaft data zu lesen aus ein merkerword. Nun wollen wir data wieder zuruck schreiben auf die selben platz aber wir kreigen eine fehler in dem folgende code:
Code:
  [DllImport("C:\\libnodave.dll"/*, PreserveSig=false */ )]
            protected static extern int daveWriteBytes(IntPtr dc, int area, int DBnumber, int start, int len, byte[] buffer);

            public int writeBytes(int area, int DBnumber, int start, int len, byte[] buffer)
            {
                return daveWriteBytes(pointer, area, DBnumber, start, len, buffer);
            }
den fehler die wir kreigen ist dem folgende: Attempted to read or write protected memory, this is often an indication that other memory is corrupt.
In step7 können wir aber sehen das der plc nicht protected ist.
Kan jemand uns helfen.
 

Anhänge

  • program.zip
    117,7 KB · Aufrufe: 14
Zuletzt bearbeitet:
Wir wollen durch libnodave 0.8.4.4 data lesen und schreiben von vb ...

code:
Code:
  [DllImport("C:\\libnodave.dll"/*, PreserveSig=false */ )]
            protected static extern int daveWriteBytes(IntPtr dc, int area, int DBnumber, int start, int len, byte[] buffer);

            public int writeBytes(int area, int DBnumber, int start, int len, byte[] buffer)
            {
                return daveWriteBytes(pointer, area, DBnumber, start, len, buffer);
            }
Für mich sieht das eher nach C(++/#) aus als nach vb ... :confused:

Wenn das unter .net läuft, dann solltet Ihr euch die entsprechenden Beispiele im Unterverzeichnis C-Sharp von libnodave mal anschauen, denn .net reagiert AFAIK allergisch auf die Übergabe von Pointern zwischen managed und unmanaged Code.

[edit]
OK, hab gerade gesehen, das ist schon aus den Beispielen ...

Hat "pointer" einen gültigen Wert ?
Ist "buffer" so groß, wie "len" behauptet ?
[/edit]

Gruß Axel
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
danke fur das snelle antwort.
Den pointer werd ins program selber angemacht und wer können shon ein merkerword lesen. Den pointer muss dan doch gut sein?
Den buffer had kein begrenzende wert.
 
Den pointer werd ins program selber angemacht und wer können shon ein merkerword lesen. Den pointer muss dan doch gut sein?
So denke ich auch.

Den buffer had kein begrenzende wert.
Wie ? Der muß doch irgendeine Größe haben. :confused:
Wenn nicht, dann ist auch kein Speicher für den Buffer reserviert, und damit klar, woher die Fehlermeldung kommt ... :rolleyes:


Gruß Axel
 
der is auch deklariert aber wirr haben ihn keine feste werde gegeben.
beispiel: Public byte[] B1; // Buffer
Dadurch kan er alle speicher gebrauchen den er notig had oder habben wir das falsch?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dadurch kan er alle speicher gebrauchen den er notig had oder habben wir das falsch?
Ganz falsch, der Speicher muß schon vor dem Funktionsaufruf reserviert sein, und die zu schreibenden Werte müssen auch schon drin stehen.

Woher sollte libnodave denn sonst wissen, was in die SPS geschrieben werden soll ?


Gruß Axel
 
da hast du ganz recht. wir können jetzt shon schreiben aber die data komt nog nicht gut an.
Selber denken wir das es vielicht in volgende code nicht ganz gut geht. Kan jemand uns sagen ob diese codes güt geschrieben sind?
Code:
[DllImport("C:\\libnodave.dll"/*, PreserveSig=false */ )]
protected static extern int davePut16(IntPtr dc, byte[] buffer, int value);
public int put16(byte[] buffer, int value)
{
    return davePut16(pointer, buffer, value);
}
 
da hast du ganz recht. wir können jetzt shon schreiben aber die data komt nog nicht gut an.
Selber denken wir das es vielicht in volgende code nicht ganz gut geht. Kan jemand uns sagen ob diese codes güt geschrieben sind?
Code:
[DllImport("C:\\libnodave.dll"/*, PreserveSig=false */ )]
protected static extern int davePut16(IntPtr dc, byte[] buffer, int value);
public int put16(byte[] buffer, int value)
{
    return davePut16(pointer, buffer, value);
}
Wenn die Fehlermeldung aus dem ersten Beitrag beim Aufruf der "davePut..."-Funktionen mit einem Buffer, für den noch kein Speicher reserviert ist, wundert mich das nicht.

Alle libnodave-Funktionen, an die ein Buffer übergeben wird, erwarten, daß der Speicher für diesen Buffer schon reserviert ist. Das Anwendungsprogramm muß die Speicherverwaltung übernehmen, libnodave macht das nur für die eigenen, internen Buffer.

Der Code der "davePut..."-Funktionen macht also genau das, was er soll, er muß aber mit korrekt initialisierten Parametern aufgerufen werden.

Ich würde es mal so versuchen: Public byte[500] B1; // Buffer


Gruß Axel
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
dem Public byte[500] B1; // Buffer habden wir shon ins program geschrieben. Das soll also das problem nicht sein. Wir kriegen auch kein fehler zu sehen aber den data den wir inlesen komt nicht an wen wir den data namelich wieder probieren aus zu lesen zeigt es 0 an
 
Zuletzt bearbeitet:
wir konnen nog immer nichts lesen aber werden mal versuchen ob es nicht irgendwo anders ligt.
vielem dank fur den hilfe bis jetzt
 
Zuviel Werbung?
-> Hier kostenlos registrieren
dem Public byte[500] B1; // Buffer habden wir shon ins program geschrieben. Das soll also das problem nicht sein. Wir kriegen auch kein fehler zu sehen aber den data den wir inlesen komt nicht an wen wir den data namelich wieder probieren aus zu lesen zeigt es 0 an
Keine Fehlermeldung beim Schreiben, aber der Wert in der SPS bleibt unverändert, habe ich das richtig verstanden ?

Läuft auf der SPS vielleicht ein Programm, das den Wert wieder auf 0 setzt ?

Was wird von Step7 aus der SPS gelesen ?
Was passiert, wenn mit Step7 ein anderer Wert in die SPS geschrieben wird ?


Gruß Axel
 
jetzt werkt es.
Wir hatten ein pointer zwisschen den buffer und den platz wo den data geschreben sollte werden. so den wubte nicht wo er schreiben muBB
Das war sehr stumm von uns:S
Danke fur die hilfe
 
Zurück
Oben