Please help!!! Connection, reading data with S7 300(LibNoDave.dlll, C#)

ceasar

Level-1
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Здравствуйте, все.

Прошу помощи.
Мне нужно считать данные с таблиц контроллера.
Подключение к контроллеру я реализовал вот так:

Code:
try 
            { 
                int a = 0, res, b = 0, c = 0; 
                float d = 0;

                fds.rfd = libnodave.openSocket(102, IP); 
                fds.wfd = fds.rfd; 
                if (fds.rfd > 0) 
                {
                    di = new libnodave.daveInterface(fds, "IF1", 0, libnodave.daveProtoISOTCP, libnodave.daveSpeed187k); //
                    di.setTimeout(1000000); 
                    // res=di.initAdapter(); // does nothing in ISO_TCP. But call it to keep your programs indpendent of protocols 
                    // if(res==0) { 
                    dc = new libnodave.daveConnection(di, 0, rack, slot); 
                    if (0 == dc.connectPLC()) 
                    { 
                        
                           ............


                    } 
                    dc.disconnectPLC(); 
                    // } 
                    // di.disconnectAdapter(); // does nothing in ISO_TCP. But call it to keep your programs indpendent of protocols 
                    libnodave.closeSocket(fds.rfd); 
                } 
                else 
                {
                    MessageBox.Show("Couldn't open TCP connaction to " + IP);
                } 
            } 
            catch (Exception ex) 
            { 
                MessageBox.Show(ex.ToString()); 
            }

Verbindung erfolgreich ist.
Jetzt habe ich auf Daten aus den Tabellen des Controllers lesen müssen, werden in der ersten Tabelle das Datum \ Zeit des Zählers, die zweite Tabelle der numerischen Meter.

Tabellen der Nachweis kann in der komplexen gesehen werden

1.jpg2.jpg
 
Hallo, alle.

Bitte helfen Sie.
Ich muss Byte-Array in der Art von Datum / Uhrzeit zu konvertieren. (C #)[FONT=arial, sans-serif]
[/FONT]
[FONT=arial, sans-serif]byte[] buffer = new buffer[] {0,0,0,0,0,0,0,0};[/FONT]
DateTime dt;

dt < - buffer - ???
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist zwar schwer zu verstehen was du genau vorhast, vielleicht schreibst du es besser in englisch (falls du das besser kannst als deutsch).

Ich denke aber du möchtest den S7 Datentyp DATE_AND_TIME in eine DateTime Variable in .Net konvertieren.
Wenn man die Millisekundengenauigkeit nicht benötigt, geht das so:

Code:
int BcdToInt(byte b)
{
    return (10 * (b / 16) + (b % 16));
}

DateTime S7DateAndTime_To_DateTime(byte[] s7dateandtime)
{
    if (s7dateandtime.Length < 8)
        throw new System.ArgumentException("Parameter DATE_AND_TIME has to be minimum 8 bytes");

    int y, m, d, H, M, S;
    y = BcdToInt(s7dateandtime[0]);
    m = BcdToInt(s7dateandtime[1]);
    d = BcdToInt(s7dateandtime[2]);
    H = BcdToInt(s7dateandtime[3]);
    M = BcdToInt(s7dateandtime[4]);
    S = BcdToInt(s7dateandtime[5]);
    y = (y <= 89 ? y += 2000 : y += 1900);
    return new DateTime(y, m, d, H, M, S);
}

Wenn eine DATE_AND_TIME Variable im DB1 an DBX0.0 beginnt kann man das dann (vereinfacht) so lesen.
Code:
byte[] buffer = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 };
res = dc.readBytes(libnodave.daveDB, 1, 0, buffer.Length, buffer);
DateTime dt = S7DateAndTime_To_DateTime(buffer);
 
Zurück
Oben