Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 21

Thema: daveReadBytes schreibt nicht in den Buffer (Excel VBA)

  1. #11
    Martin Glarner ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.06.2003
    Beiträge
    197
    Danke
    10
    Erhielt 17 Danke für 13 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Zottel
    Besten Dank, nun geht es.

    ' Read a value or a block of values from PLC.
    Private Declare Function daveReadBytes Lib "libnodave.dll" (ByVal dc As Long, ByVal area As Long, ByVal areaNumber As Long, ByVal start As Long, ByVal numBytes As Long, ByRef buffer As Byte) As Long
    Gruss Martin

  2. #12
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard

    Das Problem an der Sache ist nur:
    Mit dieser Deklaration mußt du zwangsläufig einen eigenen Puffer übergeben. Die C-Funktion prüft, ob der Zeiger auf den Puffer den Wert "NULL" hat. Das entspricht einem longint mit dem Wert 0. Falls es 0 ist, versucht sie nicht, Ergebnisse in den Puffer zu kopieren. Und ich habe bis jetzt keinen Weg gefunden, in VB einen "NULL"-Wert zu übergeben, so daß er auch von der aufgerufenen C-Funktion richtig erkannt wird.
    Falls mir kein VB-Freak einen Tip geben kann, werde ich es in der nächsten Version wahrscheinlich so machen:
    Bei daveReadBytes werde ich den Parameter für den Puffer entfernen, so daß immer mit dem internen Puffer gearbeitet werden muß.
    Wer mit einem eigenen Puffer arbeiten will, soll daveReadManyBytes benutzen. daveReadManyBytes kann einen Block lesen, der größer ist, als das, was in einem Zugriff aus die SPS übertragen werden kann und verteilt das Lesen wenn nötig auf mehrere Zugriffe. Da der interne Puffer dafür sowieso nicht ausreicht, bruacht es immer einen Puffer, der von der Anwendung zur Verfügung gestellt wird.
    In dem Fall, daß die Anzahl Bytes in einem einzigen Leseaufruf gelesen werden kann, unterscheidet sich daveReadManyBytes nur von daveReadBytes durch einen zusätzlichen call/return beim internen Aufruf von daveReadBytes.
    Leider ist in der gegenwärtigen Version daveReadManyBytes fälschlicherweise als daveManyReadBytes deklariert (Tippfehler).
    Wenn du keine bessere Idee hinsichtlich der Übergabe eines "NULL"-Zeigers auf den Puffer hast und dein Programm "zukunftssicher" schreiben willst, kopiere einfach die funktionierende Deklaration von daveReadBytes für daveReadManyBytes und benutze daveReadManyBytes statt daveReadBytes.

  3. #13
    Martin Glarner ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.06.2003
    Beiträge
    197
    Danke
    10
    Erhielt 17 Danke für 13 Beiträge

    Standard

    Hallo Zottel
    Besten Dank für den Hinweis.
    Ich habe "daveReadManyBytes" getestet. Leider funktioniert es nicht ganz ohne Problem.
    Wenn die Daten über S7Online gelesen werden, kann ich nur einmal Daten von der SPS auslesen. Beim zweiten Versuch wird der Laufzeitfehler '6' Überlauf ausgegeben. Ich nehme an, dass dies mit dem Problem Verbindungsabbau zusammenhängt. siehe unten.

    Hier noch meine Deklaration:
    Private Declare Function daveReadManyBytes Lib "libnodave.dll" (ByVal dc As Long, ByVal area As Long, ByVal areaNumber As Long, ByVal start As Long, ByVal numBytes As Long, ByRef buffer As Byte) As Long

    Zusatzfrage:
    Ich habe leider keine 400er CPU zum testen. Hast du schon einmal 65536 Byte von einer S7-400 gelesen?


    Frage zum Verbindungsabbau mit "/S7ONLINE"

    - Der Verbindungsaufbau mit "ph = openS7online(acspnt)" funktioniert.
    - Beim ersten Verbindungsaufbau wird der gültige Wert 0 zurückgegeben.
    Ab nun kann im Step7 unter PG/PC-Schnittstelle nichts mehr angepasst werden, was auch richtig ist.
    Meldung "Die benutzte Schnittstelle kommuniziert gerade. Sie können den Zugriffsweg im Moment nicht ändern"

    - Nach dem lesen sollte mit "res = daveDisconnectAdapter(di)" die Verbindung wieder abgebaut werden.
    Ich habe gelesen, das "res = closePort(ph)" bei S7Online nichts macht.

    - Beim nächsten Verbindungsaufbau bekomme ich ph=1, 2, 3, 4, 5, 6, 7, Acht)
    Beim 10.Verbindungsversuch wird -1 zurückgegeben.
    Sollte hier nicht jedesmal der Wert 0 zurückgegeben werden, wenn die Verbindung korrekt abgebaut wurde?

    - Wenn das Excel geschlossen und wieder geöffnet wird, funktioniert ein erneuter Verbindungsaufbau.
    - In Step7 kann die Schnittstelle wieder geändert werden, wenn das Excel geschlossen wurde.

    Als Lösung könnte ich die Verbindung nicht meht schliessen, doch in Step7 kann dann die Schnittstelle nicht mehr angepasst werden.

    Besten Dank für dein Hilfe
    Gruss Martin
    Zitieren Zitieren Libnodave: daveReadManyBytes in Excel VBA  

  4. #14
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard

    Zitat Zitat von Martin Glarner
    Hallo Zottel
    Besten Dank für den Hinweis.
    Ich habe "daveReadManyBytes" getestet. Leider funktioniert es nicht ganz ohne Problem.
    Wenn die Daten über S7Online gelesen werden, kann ich nur einmal Daten von der SPS auslesen. Beim zweiten Versuch wird der Laufzeitfehler '6' Überlauf ausgegeben. Ich nehme an, dass dies mit dem Problem Verbindungsabbau zusammenhängt. siehe unten.
    Hallo Martin,
    auch wenn meine Makros das anders machen: Wenn du fortlaufend Werte von der SPS lesen willst, solltest du nur einmal openSocket, setPort oder openS7online sowie initAdapter und connectPLC aufrufen (oder sub initialize), schon weil diese Funktionen recht viel Zeit benötigen. Anschließend rufst du halt daveReadBytes oder daveReadManyBytes sooft auf, wie du neue oder andere Werte holen willst.
    Meine Makros schließen die Verbindung sofort wieder, weil ich sonst "verwalten" müßte, ob eine Verbindung schon besteht und die einzelnen Makros nicht mehr unabhängig und weniger übersichtlich wären. Zudem müßte der user nach dem letzten Aufruf irgendeines Makros die Verbindung schließen.
    Hier noch meine Deklaration:
    Private Declare Function daveReadManyBytes Lib "libnodave.dll" (ByVal dc As Long, ByVal area As Long, ByVal areaNumber As Long, ByVal start As Long, ByVal numBytes As Long, ByRef buffer As Byte) As Long
    Sieht absolut richtig aus.
    Zusatzfrage:
    Ich habe leider keine 400er CPU zum testen. Hast du schon einmal 65536 Byte von einer S7-400 gelesen?
    Nein, ich habe keine solche CPU. Sollte aber gehen, entweder mit daveReadManyBytes oder mit antprechend vielen Aufrufen von daveReadBytes in "Häppchen".
    Frage zum Verbindungsabbau mit "/S7ONLINE"
    - Der Verbindungsaufbau mit "ph = openS7online(acspnt)" funktioniert.
    - Beim ersten Verbindungsaufbau wird der gültige Wert 0 zurückgegeben.
    Ab nun kann im Step7 unter PG/PC-Schnittstelle nichts mehr angepasst werden, was auch richtig ist.
    Zunächst mal kannst du unter "PC/PG-Schnittstelle einstellen" in der Systemsteuerung (nicht im Simatic-Manager) eigene Namen für einen "Zugriffsweg" definieren und diese dann statt s7online als Argument für openS7online benutzen.
    Step7 und Libnodave-Anwendungen können dann unabhängig voneinander arbeiten und auch verschiedene Zugriffswege und Geräte benutzen. Protool und ähnliche Programme machen das auch so.
    Meldung "Die benutzte Schnittstelle kommuniziert gerade. Sie können den Zugriffsweg im Moment nicht ändern"
    Sollte dann entweder nicht mehr auftreten oder nur wenn du versuchst, Parameter eines Gerätes (CPs, MPI-Adapters) zu ändern, daß im anderen Zugriffsweg benutzt wird.
    - Nach dem lesen sollte mit "res = daveDisconnectAdapter(di)" die Verbindung wieder abgebaut werden.
    Ich habe gelesen, das "res = closePort(ph)" bei S7Online nichts macht.

    - Beim nächsten Verbindungsaufbau bekomme ich ph=1, 2, 3, 4, 5, 6, 7, Acht)
    Beim 10.Verbindungsversuch wird -1 zurückgegeben.
    Sollte hier nicht jedesmal der Wert 0 zurückgegeben werden, wenn die Verbindung korrekt abgebaut wurde?
    Ja, das sollte es.
    Seit Version 0.8.1 sollte zum Schließen einer S7online-Verbindung die Funktion
    closeS7online verwendet werden. Die VB-Deklaration fehlt, glaube ich, noch. Du kannst sie ergänzen, indem du die Deklaration von closePort kopierst und den Funktionsnamen anpaßt.
    - Wenn das Excel geschlossen und wieder geöffnet wird, funktioniert ein erneuter Verbindungsaufbau.
    - In Step7 kann die Schnittstelle wieder geändert werden, wenn das Excel geschlossen wurde.
    Als Lösung könnte ich die Verbindung nicht meht schliessen, doch in Step7 kann dann die Schnittstelle nicht mehr angepasst werden.
    Mit den obigen Ratschlägen sollte ein Teil dieser Schwierigkeiten behoben sein, jedoch bin ich nicht sicher, welche genau. Ich hatte den diffusen Eindruck, daß Excel gewisse Resourcen "weiterbeansprucht", bis man es schließt, weiß jedoch nichts genaues und verstehe auch nicht, wie die S7onlinx.dll davon "wissen" könnte.
    Generell sind alle anderen Protokolle besser getestet. Wenn du also S7online nicht entweder für einen CP oder für gleichzeitiges Arbeiten mit Step7 benötigst, würde ich es nicht verwenden.
    Zitieren Zitieren Re: Libnodave: daveReadManyBytes in Excel VBA  

  5. #15
    Martin Glarner ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.06.2003
    Beiträge
    197
    Danke
    10
    Erhielt 17 Danke für 13 Beiträge

    Standard

    Hallo Zottel
    Besten Dank für die detailierte Antwort.

    Habe heute noch kurz Zeit gehabt "closeS7online" zu testen. Hat super funktioniert.

    Schönen Abend
    Gruss Martin

  6. #16
    Martin Glarner ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.06.2003
    Beiträge
    197
    Danke
    10
    Erhielt 17 Danke für 13 Beiträge

    Standard

    Hallo,
    Habe heute diverses getestet

    Frage von Martin:
    Ich habe "daveReadManyBytes" getestet. Leider funktioniert es nicht ganz ohne Problem.
    Wenn die Daten über S7Online gelesen werden, kann ich nur einmal Daten von der SPS auslesen. Beim zweiten Versuch wird der Laufzeitfehler '6' Überlauf ausgegeben. Ich nehme an, dass dies mit dem Problem Verbindungsabbau zusammenhängt. siehe unten.

    Antwort von Zottel:
    auch wenn meine Makros das anders machen: Wenn du fortlaufend Werte von der SPS lesen willst, solltest du nur einmal openSocket, setPort oder openS7online sowie initAdapter und connectPLC aufrufen (oder sub initialize), schon weil diese Funktionen recht viel Zeit benötigen. Anschließend rufst du halt daveReadBytes oder daveReadManyBytes sooft auf, wie du neue oder andere Werte holen willst.
    Meine Makros schließen die Verbindung sofort wieder, weil ich sonst "verwalten" müßte, ob eine Verbindung schon besteht und die einzelnen Makros nicht mehr unabhängig und weniger übersichtlich wären. Zudem müßte der user nach dem letzten Aufruf irgendeines Makros die Verbindung schließen.
    Ich lese die Daten eines DBs nur einmal aus der SPS, darum schliesse ich die Verbindung anschliessend wieder. Mit "closeS7online" funktioniert das schliessen nun einwandfrei, so dass in Step7 in PG/PC-Schnittstelle auch wieder geändert werden kann.

    Zusatzfrage von Martin:
    Ich habe leider keine 400er CPU zum testen. Hast du schon einmal 65536 Byte von einer S7-400 gelesen?

    Antwort von Zottel:
    Nein, ich habe keine solche CPU. Sollte aber gehen, entweder mit daveReadManyBytes oder mit antprechend vielen Aufrufen von daveReadBytes in "Häppchen".
    Habe aus einer S7-400 mit "daveReadManyBytes" einen DB mit der maximalen Länge von 65534 lesen können. Aus unerklärlichen Gründen lässt Step7 die Definition von 64kB (65536Byte) nicht zu.

    Frage zum Verbindungsabbau mit "/S7ONLINE"
    - Der Verbindungsaufbau mit "ph = openS7online(acspnt)" funktioniert.
    - Beim ersten Verbindungsaufbau wird der gültige Wert 0 zurückgegeben.
    Ab nun kann im Step7 unter PG/PC-Schnittstelle nichts mehr angepasst werden, was auch richtig ist.

    Antwort von Zottel:
    Zunächst mal kannst du unter "PC/PG-Schnittstelle einstellen" in der Systemsteuerung (nicht im Simatic-Manager) eigene Namen für einen "Zugriffsweg" definieren und diese dann statt s7online als Argument für openS7online benutzen.
    Step7 und Libnodave-Anwendungen können dann unabhängig voneinander arbeiten und auch verschiedene Zugriffswege und Geräte benutzen. Protool und ähnliche Programme machen das auch so.
    Habe einen eigenen Zugriffweg "Excel" statt "S7Online" eingerichtet und hat funktioniert. Bei deinem Beispiel steht "/S7Online" geht aber auch ohne den "/". Was hat der "/" für eine Bedeutung?



    Diese Parameter habe ich je nach Kommunikationsweg vorgegeben.
    S7Online: Timeout, Zuganspunkt, MPI-Nr.
    ISO over IP: Timeout, IP-Adresse, Rack-Nr., Slot-Nr.
    IBH NetLink: Timeout, IP-Adresse, MPI-Nr.
    MPI-Seriell: Timeout, Schnittstelle (z.B. COM1), Baudrate (z.B. 38400), Parität (z.B. O)

    Die ersten drei Varianten funktionieren mitlerweile sehr gut.



    Bei MPI-Seriell, habe ich noch folgende Probleme:

    Diese Deklation funktionierte nicht
    Code:
    Private Declare Function setPort Lib "libnodave.dll" (ByVal portName As String, ByVal baudrate As String, ByVal parity As Byte) As Long
    Habe sie geändert auf
    Code:
    Private Declare Function setPort Lib "libnodave.dll" (ByRef portName As String, ByRef baudrate As String, ByRef parity As Byte) As Long
    Ist dies korrekt?

    Code:
        port = "COM1"
        baud = "38400"
        parity = "O"
        ph = setPort(port, baud, Asc(parity))
    Beim diesem Verbindungsaufbau erhalte ich den Fehler -1

    Wozu muss die Parität angegeben werden?
    Ist diese immer "O"?

    Die Verbindung möche ich mit einem ACCON-MPI-Adapter von Deltalogic testen. Der Adapter funktioniert ohne Probleme mit Libnodave über "S7Online". Hat jemand diesen schon erfolgreich über "MPI-Seriell" getestet?

    Besten Dank
    Gruss Martin

  7. #17
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.227
    Danke
    534
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    @Martin
    Hast du mal versucht mit S7Online 2 SPS-en gleichzeitig anzusprechen und Daten auszulesen. Das funktioniert bei mir leider nicht, die Verbindungen werden korrekt geöffnet, aber die Daten stammen immer aus der ersten geöffneten Verbindung, egal was in der jeweils anderen SPS drinsteht.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  8. #18
    Martin Glarner ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.06.2003
    Beiträge
    197
    Danke
    10
    Erhielt 17 Danke für 13 Beiträge

    Standard

    @Ralle
    Nein, ich habe bis jetzt immer nur auf eine Steuerung zugegriffen.

    Ich erweitere unsere Exceldatei, mit der wir Datenbausteine deklarieren und anschliessend als Quellen nach Step7 exportieren.
    Mit Prodave lese ich die Aktualwerte aus der Steurung, damit die Anfangswerte aktualisiert werden können.
    Das gleichzeitige lesen ist daher bei mir nicht nötig.
    Gruss Martin

  9. #19
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard

    Zitat Zitat von Martin Glarner
    Hallo,
    Ich lese die Daten eines DBs nur einmal aus der SPS, darum schliesse ich die Verbindung anschliessend wieder. Mit "closeS7online" funktioniert das schliessen nun einwandfrei, so dass in Step7 in PG/PC-Schnittstelle auch wieder geändert werden kann.
    Ok. Es sind halt viele denkbare Anwendungen, bei denen man die Daten fortwährend aktualisieren möchte.
    Habe aus einer S7-400 mit "daveReadManyBytes" einen DB mit der maximalen Länge von 65534 lesen können. Aus unerklärlichen Gründen lässt Step7 die Definition von 64kB (65536Byte) nicht zu.
    Wie groß ist denn die maximale Länge eines DB?
    Habe einen eigenen Zugriffweg "Excel" statt "S7Online" eingerichtet und hat funktioniert. Bei deinem Beispiel steht "/S7Online" geht aber auch ohne den "/". Was hat der "/" für eine Bedeutung?
    Keine Ahnung.

    Bei MPI-Seriell, habe ich noch folgende Probleme:

    Diese Deklation funktionierte nicht
    Code:
        port = "COM1"
        baud = "38400"
        parity = "O"
        ph = setPort(port, baud, Asc(parity))
    Beim diesem Verbindungsaufbau erhalte ich den Fehler -1
    Die Deklaration für setport ist getestet und hat funktioniert. Obe deine geänderte Deklaration auch funktioniert, kann ich im Moment nicht testen. Der Wert -1 bei setport besagt, daß die serielle Schnittstelle nicht geöffnet werden konnte. Entweder existiert sie nicht oder eine anderes Programm beansprucht sie oder ein erstes Öffnen hat funktioniert, aber sie ist nicht geschlossen worden. In diesem Fall müßtest du zunächst Excel beenden. Möglicherweise wird auch der parity-Wert nicht richtig übergeben?
    Versuche mal:
    ph = setPort(port, baud, 79)
    79 ist der Wert des großen O.
    Wozu muss die Parität angegeben werden?
    Ist diese immer "O"?
    Nein. Bei MPI und Teleservice-Adapter im lokalen Betrieb ist sie O, bei Teleserviceadpter über Modem und PPI-Adapter ist sie E.
    Die Verbindung möche ich mit einem ACCON-MPI-Adapter von Deltalogic testen. Der Adapter funktioniert ohne Probleme mit Libnodave über "S7Online". Hat jemand diesen schon erfolgreich über "MPI-Seriell" getestet?
    Darüber habe ich keine Informationen. Du solltest auf jeden Fall Version 0.8 oder 0.8.1 verwenden, da diese toleranter mit den Antworten der Adapter umgehen.
    Lies bitte auch das FAQ.
    Wenn du Probleme mit dem Adapter vermutest, ist es viel einfacher, testMPI von der Kommandozeile aus zu versuchen. Ohne Optionen sowie mit den Optionen -2, -3 -4 stehen dir vier Varianten des seriellen Protokolls zwischen PC und Adapter zur Verfügung.
    Der Adapter MUSS auf 38400 Baud eingestellt sein.
    Nach einem Fehlversuch solltest du den Adapter kurz spannungsfrei machen.
    Geht testMPI mit keiner Option, so erhälst du mit der Option -d ein ausführliches Protokoll.
    Mit:
    testMPI -d >ausgabe.txt
    landet dieses in der Datei ausgabe.txt.
    Du soltest mir dann die Ausgaben folgender Tests schicken:
    testMPI -d >ausgabe.txt
    testMPI -2 -d >ausgabe2.txt
    testMPI -3 -d >ausgabe3.txt
    testMPI -4 -d >ausgabe4.txt
    Das steht alles auch im FAQ.

  10. #20
    Martin Glarner ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.06.2003
    Beiträge
    197
    Danke
    10
    Erhielt 17 Danke für 13 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Zottel

    Besten Dank, ich werde Morgen nochmals Tests mit dem Adapter machen.

    Wie groß ist denn die maximale Länge eines DB?
    S7-300 ohne MMC -> max 8kB
    S7-300 mit MMC -> max.16kB
    S7-300 CPU318 -> max.64kB
    S7-400 -> max.64kB (minus 2Byte ev. für STRUCT und END_STRUCT am Anfang und Ende?)
    Gruss Martin
    Zitieren Zitieren Max.Datenbausteingrössen  

Ähnliche Themen

  1. Excel: Libnodave.dll wird nicht gefunden
    Von mrdoc im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 04.09.2013, 14:19
  2. Buskoppler schreibt/liest nicht von den Klemmen
    Von ssommera im Forum CODESYS und IEC61131
    Antworten: 2
    Letzter Beitrag: 03.02.2011, 17:45
  3. VBA: Warum wird die Excel-Datei nicht geschlossen?
    Von Jan im Forum Hochsprachen - OPC
    Antworten: 15
    Letzter Beitrag: 26.09.2010, 12:01
  4. Antworten: 1
    Letzter Beitrag: 18.11.2005, 16:36

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •