# Probleme mit daveGetxx() beim 2ten Abruf (VB6)



## Salva (20 Januar 2011)

Hallo zusammen,
bei mir liegt folgende Situation vor:
Ich lese mit der Funktion daveReadBytes(...) eine bestimmten Bereich der SPS in den internen Buffer. Dann hole ich mir mit unterschiedlichen daveGetxxAt(..) Funktionen verschieden Informationen raus und speicher diese in Variabelen. Dann mach ich mit daveGetU8AT(...) über eine Schleife den gesamten Bereich noch in eine Variable. Diese speicher ich dann in eine Datenbank.
Nun habe ich Folgendes Problem:
Die erste abhandlung von daveGetU8At(...) liefert mir die richtigen Werte.
Wenn ich dann die gesamten Informationen (Rawdata) über die Schleife auslese und in deine Variable speichere, kommt es ab und an vor dass am Anfang unsinn ausgelesen wird? 
Weiss einer warum das so ist und wie ich das abstellen kann?

Für schnelle Hilfe od. Lösungen wäre ich dankbar. 
grüße
Salva

EDIT:
@ Zottel:
Zusatzfrage:
Hab ich bei 2 Verbindungen zu einer SPS auch 2 verschiedene Intere Buffer?
Zusatzfrage die 2.:
Vorgabe :
eine Verbindung 
Funktion1 : daveReadBytes(..... Buffer1) 
Funktion2 : daveReadBytes(..... Buffer2)
überschreibt die Funktion 2 den Buffer trotzdem? Ich glaube genau dieses Problem habe ich.


----------



## Earny (21 Januar 2011)

Hallo Salva,

für das Lesen bei Position habe ich mal für VB.Net folgendes Beispiel erstellt und getestet. Es müsste auch bei VB6.0 funktionieren.


```
[SIZE=3][COLOR=#0000ff][SIZE=3][COLOR=#0000ff][SIZE=2]Dim[/SIZE][/COLOR][/SIZE][/COLOR][/SIZE] buf(11) [COLOR=#0000ff][COLOR=#0000ff]As[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]Byte[/COLOR]
[/COLOR][COLOR=#008000][COLOR=#008000]' 12 Bytes lesen![/COLOR]
[/COLOR]res = daveReadBytes(dc, daveFlags, 0, 20, 12, buf(0))
Var1 = daveGetS8At(dc, 0) [COLOR=#008000][COLOR=#008000]'Mit Vorzeichen: -128...0...127[/COLOR]
[/COLOR][COLOR=#008000][COLOR=#008000]'Der Wert des MB21 wird nicht gelesen![/COLOR]
[/COLOR]Var2 = daveGetS16At(dc, 2)
Var3 = daveGetS32At(dc, 4)
Var4 = daveGetFloatAt(dc, 8)
[COLOR=#0000ff][COLOR=#0000ff]End[/COLOR][/COLOR] [COLOR=#0000ff][COLOR=#0000ff]If[/COLOR]
[/COLOR]
```
 
Vielleicht hilft Dir das.


Gruß
Earny


----------



## Jochen Kühner (23 Januar 2011)

Salva schrieb:


> überschreibt die Funktion 2 den Buffer trotzdem? Ich glaube genau dieses Problem habe ich.



Es gibt ja in LibNoDave auch Funktionen welche nicht den interen Buffer sondern deinen eigenen verwenden, dann nutz doch die, dann sollts auch gehen!


----------



## Salva (24 Januar 2011)

Hallo Jochen,



> Es gibt ja in LibNoDave auch Funktionen welche nicht den interen Buffer  sondern deinen eigenen verwenden, dann nutz doch die, dann sollts auch  gehen!


Genau das habe ich auch schon probiert, aber scheinbar wird das ganze ignoriert!
Hier mal ein Auszug aus den Quellcode:
Funktion1 - Ruft die Daten jede 5min mal ab.

```
If rc = 0 Then
    res1 = daveReadBytes(dc, daveDB, DaBlo, DBstart, DBLen, bydRBbuf(0))
    'res1 = daveReadBytes(dc, daveDB, DaBlo, DBstart, DBLen, ldRBbuf)
    If res1 = 0 Then
      ReadDaBlo = 0
       ' SPS Daten Unbehandelt
      For iR = 0 To DBLen - 1                   ' Gesamte Länge der Ein-/Auslagerung
        z12 = daveGetU8At(dc, iR)                 ' Auslesen der Rohdaten
        'z12 = daveGetU8At(dcCopy, iR)          ' Auslesen der Rohdaten cdCopy = Kopie von dc
        'z12 = daveGetU8from(bydRBbuf(iR))     ' Auslesen der Rohdaten 
        strRawsps = strRawsps & CStr(z12)       ' schreiben der Rohdaten in strRawsps
      Next iR
      Call Logg("RohdatenSPS: " & strRawsps) Else
      ReadDaBlo = 1
      strE = daveStrError(res1)
      Call Logg("RDB Error read " & CStr(res1) & " " & strE)
      Call Logg("RDB    DC=" & CStr(dc) & " DB=" & CStr(DaBlo) & " Start=" & CStr(DBstart) & "Len=" & CStr(DBLen))
      ' Verbindung beenden. Wird dann bei der nächsten Abfrage neu aufgebaut
      Call cleanUp(ph, di, dc)
      ph = 0
      di = 0
      dc = 0
    End If
  End If
```
Funktion2 - Lifebit toggled jede sec. 

```
If rc = 0 Then
    res = daveReadBytes(dc, daveDB, DaBlo, DBstart, DBLen, bylifedRBbuf(0))
    'Call Logg("result=" & CStr(res))
    If res = 0 Then
      lifebitPC = 0
      llbpc = daveGetU8At(dc, 0)       ' Auslesen des PC-Lebensbits
      If (llbpc And 1) Then
        'Call Logg(CStr(llbpc))
        'Call Logg("Toggel 0 auf 1 ")
        llbpc = daveWriteBits(dc, daveDB, DaBlo, 0, 1, 0) ' Lebensbit vom PC toggle
      Else
        'Call Logg(CStr(llbpc))
        'Call Logg("Toggel 1 auf 0")
        llbpc = daveWriteBits(dc, daveDB, DaBlo, 0, 1, 1) ' Lebensbit vom PC toggle
      End If
    Else
      lifebitPC = 1
      strE = daveStrError(res)
      Call Logg("RDB Error read " & CStr(res) & " " & strE)
      Call Logg("RDB    DC=" & CStr(dc) & " DB=" & CStr(DaBlo) & " Start=" & CStr(DBstart) & "Len=" & CStr(DBLen))
      Call cleanUp(ph, di, dc)
      ph = 0
      di = 0
      dc = 0
    End If
  End If
```


----------



## Jochen Kühner (24 Januar 2011)

Salva schrieb:


> Hallo Jochen,
> 
> Genau das habe ich auch schon probiert, aber scheinbar wird das ganze ignoriert!
> Hier mal ein Auszug aus den Quellcode:
> ...




Also das kann ja jetzt nicht stimmen:

Du nutzt die Read Funktion für den eigen Puffer


```
res1 = daveReadBytes(dc, daveDB, DaBlo, DBstart, DBLen, bydRBbuf(0))
```

aber zum lesen willst du den libnodave internen verwenden:


```
z12 = daveGetU8At(dc, iR)
```

Du musst da LibNoDaveGetU8From nehmen!


----------



## Salva (24 Januar 2011)

Hallo Jochen, da hast du natürlich recht und das hab ich auch schon alles probiert, wollte nur mit den Quellcode verdeutlichen worum es geht! Wenn ich den eigenen Buffer auslese, sind da nur "00000000...." drin! 
wenn ich den Internen Buffer nehm sind irgendwann die ersten 10 Daten vom Rawdata_Buffer mit den Lifebit_Buffer beschrieben und somit falsch!

EDIT:
@ Jochen 
Irgendwie nützt er bei mir den selber definierten Speicher nicht. Ich habe keine Ahnung wieso, vielleicht weisst du da etwas! Ich programmiere das ganze in VB6. Bin für jeden Vorschlag offen.
Wie realisiert ihr ein "Lifebit" PC => SPS ? Auch so wie ich?
Bei meinen weiteren Überlegenung hab ich mir dann gedacht eine 2te Verbindung für das Lifebit aufzubauen, aber diese hab ich wieder verworfen, da es ja sein kann dass die "Datenverbindung" abreisst und die "Lifebitverbindung" noch aktiv ist, das würde mir dann acuh nix bringen!


----------



## Rainer Hönle (24 Januar 2011)

@Jochen:
Einfach nur die Zeilen zitieren, die auch für die Antwort relevant sind und nicht den ganzen Beitrag. Bleibt dann wesentlich übersichlicher.


----------



## Zottel (28 Januar 2011)

Salva schrieb:


> Hallo zusammen,
> EDIT:
> @ Zottel:
> Zusatzfrage:
> Hab ich bei 2 Verbindungen zu einer SPS auch 2 verschiedene Intere Buffer?


Jede daveConnection hat einen Puffer.


Salva schrieb:


> Zusatzfrage die 2.:
> Vorgabe :
> eine Verbindung
> Funktion1 : daveReadBytes(..... Buffer1)
> ...


 daveReadBytes(..... Buffer1)
liest zunächst immer Daten in den internen Puffer. 
Wenn du einen Puffer angibst, kopiert es anschließend den internen in deinen Puffer.
Wenn beide Aufrufe von daveReadBytes() mit demselben daveConnection-Parameter erfolgen, überschreibt der 2. Aufruf den internen Puffer.


----------

