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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Merkerwörter mit C# und Libnodave aus SPS lesen und schreiben

  1. #1
    Registriert seit
    13.01.2010
    Beiträge
    40
    Danke
    21
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo wieder mal.

    Ich versuche schon seit geraumer Zeit einen eigenen
    OPC-Server zu programmieren, welcher MW, Datenblöcke, Eingänge und Ausgänge lesen und schreiben kann.

    Die SPS (S7-300 CPU 315) kann ich mit Hilfe des eingebetteten
    S7online codes tadellos in Run und Stop befördern.

    Beim lesen der MW und DB bin ich aber auf ein Hinderniss gestoßen!
    Laut der beigelegten Doku von Libnodave unter "area" werden MW
    wie folgt definiert: z.B. MW4:
    daveReadBytes(dc,daveFlags,0,4,2,null)

    In meinem Programm ist der Befehl "daveReadBytes" aber nicht vorhanden.
    Habe die libnodave.net.dll aber eingebunden.

    Es gibt aber eine ähnliche Funktion mit anderen Parametern:
    dc.readBytes(int area, int DBnumber, int Start, int len, byte[]buffer)
    (dc = libnodave.daveconnection)

    1. Wurde die Funktion daveReadBytes durch Readbytes ersetzt und ist die in der Doku beschriebene Funktion lediglich veraltet? (Version 0.8.1)
    2. Oder muss ich die andere Libnodave.dll auch einbinden um an diese funktion zu gelangen? Wenn ja. Wie?

    Ich hab mal mit dem dc.readbytes gearbeitet und folgendes programmiert:
    Angenommen ich will den MW10 lesen

    int MWnr = 10;
    dc.readBytes(libnodave.daveFlags, 0, MWnr, 2, null); //gibt 0 zurück
    int erg = dc.getU32();
    txt_ausgabe.text = erg.tostring();

    Bekomme abnormale Ergebnisse raus:
    bei MWnr = 50, erg = 6553610
    bei MWnr = 10, erg = 84541450
    bei MWnr = 100, erg = 10

    werde daraus nicht wirklich schlau...

    3. Könnt ihr mir bitte helfen meinen Fehler zu finden?

    Ich hoffe ihr könnt mir helfen!

    lg Marco*
    "Dem sind keine Grenzen gesetzt, der sie nicht hinnimmt!"
    Zitieren Zitieren Merkerwörter mit C# und Libnodave aus SPS lesen und schreiben  

  2. #2
    Registriert seit
    29.03.2004
    Beiträge
    5.792
    Danke
    144
    Erhielt 1.706 Danke für 1.238 Beiträge

    Standard

    Zitat Zitat von Red-Sh4nks Beitrag anzeigen
    1. Wurde die Funktion daveReadBytes durch Readbytes ersetzt und ist die in der Doku beschriebene Funktion lediglich veraltet? (Version 0.8.1)
    Die Funktion ist die gleiche. Du hast wahrscheinlich in der Dokumentation des C-Codes nachgesehen.
    Da es in C keine Klassen und Namespaces gibt, gibt man den Funktionen entsprechende eindeutige Namen. Da in C# alle Methoden zur libnodave-Klasse gehören, kann man sich den "dave"-Prefix schenken.

    Zitat Zitat von Red-Sh4nks Beitrag anzeigen
    2. Oder muss ich die andere Libnodave.dll auch einbinden um an diese funktion zu gelangen? Wenn ja. Wie?
    S.O.
    Wirf mal einen Blick in die libnodave.net.cs Datei, denn in der wird die eigentliche C-dll eingebunden. Dort kann man sehen wie die Namen der Methoden umgesetzt werden.

    Zitat Zitat von Red-Sh4nks Beitrag anzeigen
    Ich hab mal mit dem dc.readbytes gearbeitet und folgendes programmiert:
    Angenommen ich will den MW10 lesen

    int MWnr = 10;
    dc.readBytes(libnodave.daveFlags, 0, MWnr, 2, null); //gibt 0 zurück
    int erg = dc.getU32();
    txt_ausgabe.text = erg.tostring();

    Bekomme abnormale Ergebnisse raus:
    bei MWnr = 50, erg = 6553610
    bei MWnr = 10, erg = 84541450
    bei MWnr = 100, erg = 10
    Ein Merkerwort hat 2 Bytes. Du liest auch nur 2 Bytes aus der SPS aus. Mit getU32() liest du aber 4 Bytes aus dem Empfangspuffer. Dort stehen dann undefinierte Werte drin (oder welche aus dem letzten Telegramm). Wenn du dir die Hex-Darstellung deiner abnormalen Ergebnisse ansiehst kannst du an den Bitmustern feststellen, dass sich die 50 und die 10 auch dort finden lässt.
    Ergo: Wenn du nur 2 Bytes aus der SPS liest, darfst du auch nur 2 Bytes aus dem Puffer lesen (getS16 oder getU16).

  3. Folgender Benutzer sagt Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    Red-Sh4nks (05.03.2010)

  4. #3
    Registriert seit
    13.01.2010
    Beiträge
    40
    Danke
    21
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Herzlichen Dank für die schnelle und vor allem eminent
    hilfreiche Antwort Thomas!

    Mit GetU16() bekomme ich die gewünschten Werte.
    Ich bin auch in der Lage Eingänge und Ausgänge zu
    lesen. Beim E und A setzen bin ich aber wieder auf
    eine Hürde gestoßen.

    Angenommen ich will auf Eingang 3 "1" setzen.
    Dann wende ich die Funktion dc.writeBytes an.

    geforderte Parameter:
    dc.writeBytes(int area, int DBnumber, int start, int len, byte[] buffer)

    mit eingesetzen Parametern:
    dc.writeBytes(libnodave.daveinputs,0, 3,1,null);

    Jedoch wird hier kein Wert mitgegeben, was überhaupt
    in den Eingang reingeschrieben werden soll (in diesem
    Fall eine 1) Wo kann ich diesen Wert mitgeben, oder
    habe ich in der Parameterübergabe einen Fehler?

    Mein obriger Befehl wird garnicht ausgeführt:
    "Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben."

    lg Marco*
    "Dem sind keine Grenzen gesetzt, der sie nicht hinnimmt!"

  5. #4
    Registriert seit
    27.10.2005
    Ort
    Schwäbisch Gmünd
    Beiträge
    5.235
    Danke
    634
    Erhielt 955 Danke für 769 Beiträge

    Standard

    Statt null das Array aus einem Byte mitgeben, das "1" ist.
    Rainer Hönle
    DELTA LOGIC GmbH

    Ein Computer kann das menschliche Gehirn nicht ersetzen. Engstirnigkeit kann unmöglich simuliert werden. (Gerd W. Heyse)

  6. Folgender Benutzer sagt Danke zu Rainer Hönle für den nützlichen Beitrag:

    Red-Sh4nks (06.03.2010)

  7. #5
    Registriert seit
    13.01.2010
    Beiträge
    40
    Danke
    21
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Der Code sieht wie folgt aus:

    int eingangsnr = 0;
    int zusetzenderwert = 1;
    int test;
    int a = 0x01

    byte[] b;
    b = new byte[1];
    b[0] = zusetzenderwert;

    test = dc.writeBytes(libnodave.daveInputs, 0, eingangsnr, 1, b)


    die Variable test erhält jedesmal den Wert 0. Also wird
    alles schonmal korrekt ausgeführt. Bei den Eingängen verändert
    sich jedoch nichts. Hab alles mit dem Byte so gemacht wie du gesagt
    hast Rainer.

    Außerdem hab ich noch die im Testprogramm angegebene
    Zeile ausprobiert und statt dem byte[] b

    BitConverter.GetBytes(a)

    eingesetzt. Hilft leider auch nichts...

    lg Marco*
    "Dem sind keine Grenzen gesetzt, der sie nicht hinnimmt!"

  8. #6
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.255
    Danke
    537
    Erhielt 2.705 Danke für 1.954 Beiträge

    Standard

    Eingänge beschreiben? Könnte eher sein, das das gar nicht geht, denn die Eingänge werden ja nach dem "beschreiben" durch den PC von der SPS aktualisiert und demzufolge mit den echten Eingangswerten versorgt.
    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

  9. #7
    Registriert seit
    27.10.2005
    Ort
    Schwäbisch Gmünd
    Beiträge
    5.235
    Danke
    634
    Erhielt 955 Danke für 769 Beiträge

    Standard

    Eingäge beschreiben geht bei der 300er, wenn keine physikalische Hardware vorhanden ist. Ansonsten werden die gerade geschriebenen Werte beim nächsten OB 1 Durchlauf wieder durch die SPS überschrieben.
    Rainer Hönle
    DELTA LOGIC GmbH

    Ein Computer kann das menschliche Gehirn nicht ersetzen. Engstirnigkeit kann unmöglich simuliert werden. (Gerd W. Heyse)

  10. #8
    Registriert seit
    13.01.2010
    Beiträge
    40
    Danke
    21
    Erhielt 0 Danke für 0 Beiträge

    Standard

    physikalische Hardware... Meinst du etwa die
    Schalter für die einzelnen Eingänge?
    "Dem sind keine Grenzen gesetzt, der sie nicht hinnimmt!"

  11. #9
    Registriert seit
    27.10.2005
    Ort
    Schwäbisch Gmünd
    Beiträge
    5.235
    Danke
    634
    Erhielt 955 Danke für 769 Beiträge

    Standard

    Ich meine eine beliebige Eingangskarte auf dieser Adresse
    Rainer Hönle
    DELTA LOGIC GmbH

    Ein Computer kann das menschliche Gehirn nicht ersetzen. Engstirnigkeit kann unmöglich simuliert werden. (Gerd W. Heyse)

  12. Folgender Benutzer sagt Danke zu Rainer Hönle für den nützlichen Beitrag:

    Red-Sh4nks (06.03.2010)

  13. #10
    Registriert seit
    13.01.2010
    Beiträge
    40
    Danke
    21
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Bin leider kein Profi auf dem Gebiet und kann mit
    deiner Antwort wenig anfangen. Ich werde mich mal
    mit meinem Professor am Dienstag unterhalten und
    in Erfahrung bringen was eine Eingangskarte ist und
    wie ich eine solche deaktiviere...

    lg Marco*
    "Dem sind keine Grenzen gesetzt, der sie nicht hinnimmt!"

Ähnliche Themen

  1. Libnodave Strings schreiben/lesen
    Von Hocheck im Forum Hochsprachen - OPC
    Antworten: 14
    Letzter Beitrag: 04.12.2017, 15:09
  2. Libnodave C# - WORD und STRING aus S7 lesen/schreiben
    Von dolo280 im Forum Hochsprachen - OPC
    Antworten: 10
    Letzter Beitrag: 13.01.2011, 12:04
  3. LibNoDave-Komponente DATE_AND_TIME lesen/schreiben
    Von marcengbarth im Forum Hochsprachen - OPC
    Antworten: 0
    Letzter Beitrag: 28.10.2009, 17:16
  4. Libnodave in SPS schreiben, ganze DB's lesen
    Von AirKlaus im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 17.05.2009, 23:06
  5. Libnodave Daten lesen/schreiben
    Von Acidic im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 02.06.2008, 08:32

Stichworte

Lesezeichen

Berechtigungen

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