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



## fldrgn (9 April 2008)

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:

```
[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.


----------



## afk (9 April 2008)

fldrgn schrieb:


> Wir wollen durch libnodave 0.8.4.4 data lesen und schreiben von vb ...
> 
> code:
> 
> ...


Für mich sieht das eher nach C(++/#) aus als nach vb ...  

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


----------



## fldrgn (9 April 2008)

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.


----------



## afk (9 April 2008)

fldrgn schrieb:


> 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.



fldrgn schrieb:


> Den buffer had kein begrenzende wert.


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


Gruß Axel


----------



## fldrgn (9 April 2008)

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?


----------



## afk (9 April 2008)

fldrgn schrieb:


> 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


----------



## fldrgn (10 April 2008)

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?

```
[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);
}
```


----------



## afk (10 April 2008)

fldrgn schrieb:


> 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?
> 
> ```
> ...


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


----------



## fldrgn (10 April 2008)

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


----------



## afk (10 April 2008)

Gibt es jetzt noch ein Problem, oder funktioniert jetzt alles ? 

Gruß Axel


----------



## fldrgn (10 April 2008)

wir konnen nog immer nichts lesen aber werden mal versuchen ob es nicht irgendwo anders ligt. 
vielem dank fur den hilfe bis jetzt


----------



## afk (10 April 2008)

fldrgn schrieb:


> 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


----------



## fldrgn (10 April 2008)

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


----------

