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

Ergebnis 1 bis 7 von 7

Thema: daveGetBlockInfo

  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
    Wollte mal wissen, wie man die Länge eines DBs rausfinden kann und
    bin dabei auf daveGetBlockInfo gestoßen. In C# wird ja eine Funktion wie

    nicht wie:
    daveGetBlockInfo

    sondern als:
    dc.GetBlockInfo

    Kann die Funktion aber nicht finden.

    Gibt es die Funktion daveGetBlockInfo bzw. dc.GetBlockInfo in dotNet bzw. C# nicht?

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

  2. #2
    Registriert seit
    04.04.2008
    Beiträge
    389
    Danke
    85
    Erhielt 39 Danke für 24 Beiträge

    Standard

    Hallo Marco,

    ich habe das mal mit VB versucht. Ich bekomme zwar keine Fehlermeldung, aber auch kein Ergebnis:

    Code:
    'Libnodave-Deklarationen:
    'Public Const daveBlockType_OB = "8"
    'Public Const daveBlockType_DB = "A"
    'Public Const daveBlockType_SDB = "B"
    'Public Const daveBlockType_FC = "C"
    'Public Const daveBlockType_SFC = "D"
    'Public Const daveBlockType_FB = "E"
    'Public Const daveBlockType_SFB = "F"
    'Aus dem Forum:
    'Private Const daveBlockType_OB = 56 'asc("8")
    'Private Const daveBlockType_DB = 65 'asc("A")
    'Private Const daveBlockType_SDB = 66 'asc("B")
    'Private Const daveBlockType_FC = 67 'asc("C")
    'Private Const daveBlockType_SFC = 68 'asc("D")
    'Private Const daveBlockType_FB = 69 'asc("E")
    'Private Const daveBlockType_SFB = 70 'asc("F")
     
    PrivateSub btnDB3Lesen_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles btnDB3Lesen.Click
    Dim buf(4000) AsByte, res1 AsInteger
    res1 = internalDaveGetBlockInfo(dc, buf(0), 65, 3)
    txtDC_1.Text = dc
    txtRes1.Text = res1
    EndSub
    
    Wenn ich das hier im Forum richtig gelesen habe(?), dann sollte im Rückgabewert res1 der Wert stehen. Da steht aber immer eine 0 drin?!
    Oder muss der Buffer ausgewertet werden? Dazu würde passen, dass der zweite Parameter mit ByRef (Zeigerparameter mit Rückgabe) übergeben wird.
    Den dritten Parameter habe ich auf 65 gesetzt (Typ: DB). Den vierten Parameter auf 3 (DB3 soll ausgewertet werden).
    Oder verstehen sich die Parameter ganz anders?

    Gruß
    Earny

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

    Standard

    Vielen Dank für deine Antwort!

    Bei res1 steht 0 drin, weil das heißt, dass internaldavegetblockinfo erfolgreich ausgeführt wurde. Die Länge steht dann wl im Puffer! Was für eine Programmiersprache verwendest du?
    "Dem sind keine Grenzen gesetzt, der sie nicht hinnimmt!"

  4. #4
    Registriert seit
    04.04.2008
    Beiträge
    389
    Danke
    85
    Erhielt 39 Danke für 24 Beiträge

    Standard

    ich verwende VB.Net, allerdings ohne den .Net-Wrapper (libnodave.net.dll). Das sieht deshalb aus wie bei VB6.0 oder Excel.

    Ich habe im Moment keine Idee, wie ich den Buffer auswerten soll, da ich weder eine aussagekräftige Beschreibung noch ein passendes Beispiel gefunden habe. Ich bin auch nicht sicher, ob ich die Bedeutung der beiden letzten Argumente richtig eingeschätzt habe. Was meinst Du?

    Gruß
    Earny

  5. #5
    Registriert seit
    04.04.2008
    Beiträge
    389
    Danke
    85
    Erhielt 39 Danke für 24 Beiträge

    Standard

    es könnte sein, dass die Funktion zur Bestimmung der DB-Länge DaveGetProgramBlock ist. Darin hat das letzte Argument den Namen "length". Nachdem ich mir das, was die daveGetBlockInfo-Funktion in den Buffer schreibt mal angesehen habe (siehe Anlage), habe ich mich im Modul12 nochmal umgesehen und könnte mir vorstellen, dass daveGetProgrammBlock die richtige Funktion ist.

    Gruß
    Earny
    Angehängte Dateien Angehängte Dateien
    Geändert von Earny (19.04.2010 um 18:43 Uhr)

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

    Standard

    Hallo Earny!

    Ich hatte in den letzten Tagen wenig Zeit. Tut mir Leid, ich bin
    noch nicht dazu gekommen, diese Funktionen auszuprobieren.
    Werde aber spätestens am Donnerstag dazu kommen. Falls die
    Funktion daveGetProgramBlock aber tatsächlich in C#
    (über die Libnodave.net.dll) vorhanden sein, bin ich mir sicher, dass
    dies die gesuchte Funktion ist.

    Ich melde mich am Donnerstag

    Edit:
    Die Werte aus deinem Anhang sehen brauchbar aus, aber da ich nicht
    weiß wie viele und welche Blöcke du angelegt hast, kann ich noch nichts
    genaues dazu sagen. Wie gesagt, ich muss die Funktion selbst testen
    "Dem sind keine Grenzen gesetzt, der sie nicht hinnimmt!"

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Die Antwort kommt etwas spät, aber doch:

    Bei C# .net gibt es die Funktion .davegetBlockinfo nicht.
    Daher weiß man auch nicht die Länge eines Blocks, was
    für das Lesen des Blocks ja sehr wichtig ist.

    Den mit einer Länge, die größer ist als die des Blocks, sind
    alle Werte 0.
    Und mit einer Länge, die kleiner ist als die des Blocks, erhält
    man nicht alle Werte.

    Daher habe ich die binäre Suche angewandt um die exakte
    Länge des DBs ausfindig zu machen. Wl gibt es auch bessere
    Wege, aber wens interessiert:

    Code:
    bool gefunden = false;
                        byte[] DBIPuffer;
                        int DBLmin = 0;
                        int DBLmax = 1024;
                        int mitte;
                        int gesuchtezahl = 0;
                        int DBlaenge;
    
                        while (!gefunden)
                        {
                            mitte = DBLmin + ((DBLmax - DBLmin) / 2);
    
    
                            if (dc.readBytes(libnodave.daveDB, DBPuffer[rr], 0, mitte, null) == 0)
                            {
                                DBLmin = mitte + 1;
                            }
                            else
                            {
                                DBLmax = mitte - 1;
                            }
                            if (DBLmax <= DBLmin)
                            {
                                gesuchtezahl = DBLmin;
                                gefunden = true;
                            }
                        }
    
                        //Da das Minimum angegeben wird, kann es sein, dass eine Zahl gewählt etwas kleiner als
                        //die Blocklänge ist. Daher wird hier nochmals versucht die Zahl um 1 zu erhöhen
                        DBIPuffer = new byte[gesuchtezahl + 1];
                        while (dc.readBytes(libnodave.daveDB, DBPuffer[rr], 0, gesuchtezahl, DBIPuffer) == 0)
                        {
                            gesuchtezahl++;
                            DBIPuffer = new byte[gesuchtezahl + 1];
                        }
                        DBlaenge = gesuchtezahl - 1;
                        dbnr[DBcounter] = DBPuffer[rr];
                        dbgr[DBcounter] = DBlaenge;
                        DBcounter ++;
                        //Jede gerade Zahl (inklusive 0) 0,2,4,6,... speichert die Nr des DBs
                        //und jede ungerade darauffolgende Zahl speichert dessen Länge
    "Dem sind keine Grenzen gesetzt, der sie nicht hinnimmt!"
    Zitieren Zitieren Auflösung  

Ähnliche Themen

  1. DaveGetBlockInfo, format von modification date ??
    Von Ruud im Forum Hochsprachen - OPC
    Antworten: 5
    Letzter Beitrag: 20.04.2015, 09:34
  2. daveGetBlockInfo => VB.Net
    Von Fliegertiger im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 20.12.2007, 13:26

Lesezeichen

Berechtigungen

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