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

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 19 von 19

Thema: S7 Projektdateien -> IP Adressen auslesen...

  1. #11
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.758
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ja, hab die Datei mal mit nem Hex Editor angeschaut, aber noch nicht groß analysiert. Man müsste einträge ändern, schauen wie sich die Datei dann ändert. So wies aussieht ist das erste Byte vor nem String immer die Länge. Dann sollten für die Teilnehmer ja IP, Subnet, MacAdresse, ... enthalten sein. Was mich im Moment wundert, warum ist die IP 3 mal in der Datei...
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  2. #12
    Registriert seit
    21.10.2010
    Beiträge
    158
    Danke
    21
    Erhielt 29 Danke für 17 Beiträge

    Standard

    Hab mir das mal angeschaut, weil mich das ganze auch interessiert hat. Hab zwar auch keine Ahnung vom Aufbau der Datei, aber mit folgendem C-Programm können alle IP-Adressen aus einem Step7-Projekt ausgelesen werden. Der Code ist nicht gerade schön, nur schnell zusammengestöpselt, aber funktioniert bei mir bei allen Projekten. Man müsste aber noch einiges verbessern und einen Weg suchen, bei dem nur die IP-Adressen der CPU zurückgegeben werden. Vielleicht nehme ich mir noch mal Zeit, um das ganze genauer zu untersuchen.

    Code:
    #include <stdio.h>
    
    #include <windows.h>
    
    #include <stdarg.h>
    
    
    int FileOpenDialog(LPSTR szDest, LPSTR szTitle, LPCSTR szStartDir, LPCSTR szFilter);
    
    int search(LPSTR lpszPath, LPSTR lpszFilename);
    
    int CheckFile(LPSTR lpszFilename);
    
    void RestoreS7Ip(char* pwd);
    
    int Win_Debug(const char *szFormat, ...);
    
    
    int iFound = 0;
    
    
    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
    
    {
    
        char Dest[MAX_PATH];
    
        LPCSTR szStartPath = NULL;  //"U:\\S7_daten"
    
        int iFileOffset = FileOpenDialog(Dest, "Choose S7 project file", szStartPath, "S7 project file\0*.s7p\0");
    
        if (iFileOffset == 0) return 0;
    
    
        Dest[iFileOffset] = '\0';
    
        strcat_s(Dest, "S7Netze\\S7NONFGX.tab");
    
        
    
        CheckFile(Dest);
    
    
        if (iFound == 0) Win_Debug("No IP address found!");
    
    
        return 0;
    
    }
    
    
    int CheckFile(LPSTR lpszFilename)
    
    {
    
        HANDLE hFile;
    
        hFile = CreateFile(lpszFilename, 0, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
    
        int iLen = GetFileSize(hFile, NULL);
    
        CloseHandle(hFile);
    
    
        unsigned char *buff = (unsigned char*)malloc(iLen + 1);
    
    
        FILE *fp;
    
        fopen_s(&fp, lpszFilename, "rb");
    
        fread(buff, iLen, 1, fp);
    
    
        int i, j;
    
        char sIp[16] = { 0 };
    
    
        for (i = 0; i < iLen - 8; i++)
    
        {
    
            if (
    
                (buff[i + 0] == 0xe0) &&
    
                (buff[i + 1] == 0x0f) &&
    
                (buff[i + 2] == 0x00) &&
    
                (buff[i + 3] == 0x00) &&
    
                (buff[i + 4] == 0xe0) &&
    
                (buff[i + 5] == 0x0f) &&
    
                (buff[i + 6] == 0x00) &&
    
                (buff[i + 7] == 0x00) &&
    
                (buff[i + 8] == 0x00))
    
            {
    
                iFound += 1;
    
                for (j = 20; j <28; j++)
    
                {
    
                    sIp[j - 20] = buff[i + j];
    
                }
    
                sIp[8] = '\0';
    
    
                RestoreS7Ip(sIp);
    
                Win_Debug("IP: %s", sIp);
    
            }
    
        }
    
    
        fclose(fp);
    
        free(buff);
    
        return 0;
    
    }
    
    int FileOpenDialog(LPSTR szDest, LPSTR szTitle, LPCSTR szStartDir, LPCSTR szFilter)
    
    {
    
        OPENFILENAME ofn;
    
        ZeroMemory(&ofn, sizeof(ofn));
    
    
        ofn.lStructSize = sizeof(ofn);
    
        ofn.hwndOwner = NULL;
    
        ofn.lpstrFile = szDest;
    
        ofn.lpstrFile[0] = '\0';
    
        ofn.nMaxFile = MAX_PATH;
    
        ofn.lpstrFilter = szFilter;
    
        ofn.nFilterIndex = 1;
    
        ofn.lpstrTitle = szTitle;
    
        ofn.lpstrFileTitle = NULL;
    
        ofn.nMaxFileTitle = 0;
    
        ofn.lpstrInitialDir = szStartDir;
    
        ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
    
    
        if (!GetOpenFileName(&ofn)) return 0;
    
    
        strcpy_s(szDest, MAX_PATH, ofn.lpstrFile);
    
        return ofn.nFileOffset;
    
    }
    
    
    int Win_Debug(const char *szFormat, ...)
    
    {
    
        char szBuffer[1024];
    
        va_list    pArgList;
    
        va_start(pArgList, szFormat);
    
        _vsnprintf_s(szBuffer, sizeof(szBuffer), szFormat, pArgList);
    
        va_end(pArgList);
    
        return MessageBox(NULL, szBuffer, "S7 IP address", MB_ICONINFORMATION | MB_TOPMOST);
    
    }
    
    
    void RestoreS7Ip(char* sIp)
    
    {
    
        int i, j;
    
        char part[4] = { 0 };
    
        int num[4];
    
        for (i = 0, j = 0; i < 7; i+=2, j++)
    
        {
    
            memcpy_s(part, sizeof(part), &(sIp[i]), 2);
    
            num[j] = (int)strtol((const char*)part, NULL, 16);
    
        }
    
        sprintf_s(sIp, 16, "%i.%i.%i.%i", num[0], num[1], num[2], num[3]);
    
    }
    
    
    
    Geändert von funkey (11.02.2015 um 10:18 Uhr)

  3. #13
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.758
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Man müsste mal versuchen einzugrenzen wo die Struktur für eine IP Adresse in dem File beginnt, vor den durch deinen Code ausgelsenen werten scheint ja auch noch die MAC Adresse zu stehen... Ich werd mir ml ein file mit zick IP's und CP's anlegen und schauen was Ich rausfinde!

    Könnte ja sein das die verheiratung zwischen CP und IP auch z.B. über das LNK File in dem Ordner geht.
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  4. #14
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.758
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Also der Abstand zwischen 2 Ip Adressen, wenn Ich sie so wie funkey ermittle beträgt in der Datei rund 1900 Bytes (bei einem Lean CP). Jetzt müsste man rausfinden wo die einzelnen Strukturen beginnen, was steht überhaupt drinn, wo steht die Länge, gibts einen festen Aufbau oder ist er abhängig von der Hardware (CP, PN/CPU, ...). Mal schauen wie weit man hier noch kommen kann...
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

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

    Standard

    Du kannst ja mal mit dem Sysinternals Process Monitor mitloggen, auf welche Dateien Step7 überhaupt zugreift wenn du in der HW-Konfig die IP-Adresseinstellungen aufrufst. Theoretisch kann sich Step7 die Informationen auch wieder aus den SDBs zurückübersetzen - die SPS kanns ja auch.

    Damit habe ich damals zumindest diese "spezielle" Verbindung zwischen RSRVD4_L und linkhrs herausgefunden.

  6. #16
    Registriert seit
    21.10.2010
    Beiträge
    158
    Danke
    21
    Erhielt 29 Danke für 17 Beiträge

    Standard

    Zitat Zitat von Jochen Kühner Beitrag anzeigen
    Also der Abstand zwischen 2 Ip Adressen, wenn Ich sie so wie funkey ermittle beträgt in der Datei rund 1900 Bytes (bei einem Lean CP). Jetzt müsste man rausfinden wo die einzelnen Strukturen beginnen, was steht überhaupt drinn, wo steht die Länge, gibts einen festen Aufbau oder ist er abhängig von der Hardware (CP, PN/CPU, ...). Mal schauen wie weit man hier noch kommen kann...
    Ich habe noch keinen Zusammenhang gefunden, bei mir sind die Strukturen alle unterschiedlich aufgebaut und auch die Informationen sind in unterschiedlicher Reihenfolge enthalten. MMn fangen die Strukturen irgendwo bei 'AddressIsValid' an. Aber dieser String ist auch für Profibus-Strukturen ohne IP vorgesehen und nicht nur für ProfiNet /IP-Adress-Strukturen. MAC-Adressen sind auch nicht immer an der gleichen Stelle.
    Hier noch ein überarbeiteter C-Code von mir, mit dem man die IP-Adressen, den Namen und die Type auslesen kann:

    Code:
    #include <stdio.h>
    
    #include <windows.h>
    
    #include <stdarg.h>
    
    
    struct _S7NetInfo
    
    {
    
        char szMac[18];
    
        char szIP[16];
    
        char szSubNetMask[16];
    
        char szGateway[16];
    
        char szName[32];
    
        char szType[32];
    
    };
    
    
    typedef _S7NetInfo S7NetInfo;
    
    
    int search(LPSTR lpszPath, LPSTR lpszFilename);
    
    int CheckFile(LPSTR lpszFilename);
    
    int GetS7NetInfos(LPSTR lpszFilename, S7NetInfo *aInfos, int iInfoCount);
    
    void RestoreS7Ip(char* pwd);
    
    int Win_Debug(const char *szFormat, ...);
    
    int GetBufferOffsetFromSearchArray(unsigned char *buff, int iBuffLen, int iStart, int iStop, unsigned char* search, int iSearchLen);
    
    
    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
    
    {
    
        int i, iFound;
    
        char szPath[1024];
    
    
        GetModuleFileName(NULL, szPath, sizeof(szPath));
    
        char* ptr = strrchr(szPath, '\\');
    
        ptr[1] = '\0';
    
        strcat_s(szPath, "S7NONFGX.tab");
    
    
        iFound = GetS7NetInfos(szPath, NULL, 0);
    
        switch (iFound)
    
        {
    
        case -1:
    
            Win_Debug("Error file not found!");
    
            break;
    
        case 0:
    
            Win_Debug("No IP address found!");
    
            break;
    
        default:
    
            S7NetInfo *Infos = (S7NetInfo*)calloc(iFound, sizeof(S7NetInfo));
    
            iFound = GetS7NetInfos(szPath, Infos, iFound);
    
            for (i = 0; i < iFound; i++)
    
            {
    
                Win_Debug("IP : %s\nName : %s\nType : %s", Infos[i].szIP, Infos[i].szName, Infos[i].szType);
    
            }
    
            free(Infos);
    
        }
    
    
        return 0;
    
    }
    
    
    int GetS7NetInfos(LPSTR lpszFilename, S7NetInfo *aInfos, int iInfoCount)
    
    {
    
        HANDLE hFile;
    
        DWORD dwBytesRead;
    
        
    
        int iOffset = 0, iOffsetName = 0, iOffsetValid = 0, iOffsetIp = 0, iFound = 0;
    
        hFile = CreateFile(lpszFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
    
        int iFileSize = GetFileSize(hFile, NULL);
    
        if (iFileSize <= 0)
    
        {
    
            CloseHandle(hFile);
    
            return -1;
    
        }
    
        unsigned char *buff = (unsigned char*)malloc(iFileSize + 1);
    
        ReadFile(hFile, buff, iFileSize, &dwBytesRead, NULL);
    
        CloseHandle(hFile);
    
    
        unsigned char searchValid[] = { 'A', 'd', 'd', 'r', 'e', 's', 's', 'I', 's', 'V', 'a', 'l', 'i', 'd' };
    
        unsigned char searchName[] = { 'B', 'a', 'u', 'g', 'r', 'u', 'p', 'p', 'e', 'n', 'n', 'a', 'm', 'e' };
    
        unsigned char searchIp[] = { 0xe0, 0x0f, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00 };
    
    
        while ((iOffsetIp = GetBufferOffsetFromSearchArray(buff, iFileSize, iOffset, iFileSize, searchIp, sizeof(searchIp))) >= 0)
    
        {
    
            iOffset = iOffsetIp + 1;
    
            iFound += 1;
    
    
            if (aInfos != NULL)
    
            {
    
                if (iInfoCount < iFound) break;
    
    
                iOffsetValid = GetBufferOffsetFromSearchArray(buff, iFileSize, iOffsetIp, iOffsetIp - 2000, searchValid, sizeof(searchValid));
    
    
                iOffsetName = GetBufferOffsetFromSearchArray(buff, iFileSize, iOffsetValid, iOffsetIp + 2000, searchName, sizeof(searchName));
    
                iOffsetName += 24;
    
    
                memcpy_s(aInfos[iFound - 1].szName, sizeof(aInfos[iFound - 1].szName), &(buff[iOffsetName + 1]), buff[iOffsetName]);
    
    
                iOffsetName += buff[iOffsetName] + 1;
    
                iOffsetName += buff[iOffsetName] + 1;
    
                memcpy_s(aInfos[iFound - 1].szType, sizeof(aInfos[iFound - 1].szType), &(buff[iOffsetName + 1]), buff[iOffsetName]);
    
    
                //memcpy_s(aInfos[iFound - 1].szMac, sizeof(aInfos[iFound - 1].szMac), &(buff[iOffsetIp - 254]), 12);
    
                iOffsetIp += 20;
    
                memcpy_s(aInfos[iFound - 1].szIP, sizeof(aInfos[iFound - 1].szIP), &(buff[iOffsetIp]), 8);
    
                RestoreS7Ip(aInfos[iFound - 1].szIP);
    
    
            }
    
        }
    
        return iFound;
    
    }
    
    
    int Win_Debug(const char *szFormat, ...)
    
    {
    
        char szBuffer[1024];
    
        va_list    pArgList;
    
        va_start(pArgList, szFormat);
    
        _vsnprintf_s(szBuffer, sizeof(szBuffer), szFormat, pArgList);
    
        va_end(pArgList);
    
        return MessageBox(NULL, szBuffer, "S7 IP address", MB_ICONINFORMATION | MB_TOPMOST);
    
    }
    
    
    void RestoreS7Ip(char* sIp)
    
    {
    
        int i, j;
    
        char part[3] = { 0 };
    
        int num[4];
    
        for (i = 0, j = 0; i < 7; i+=2, j++)
    
        {
    
            memcpy_s(part, sizeof(part), &(sIp[i]), 2);
    
            num[j] = (int)strtol((const char*)part, NULL, 16);
    
        }
    
        sprintf_s(sIp, 16, "%i.%i.%i.%i", num[0], num[1], num[2], num[3]);
    
    }
    
    
    int GetBufferOffsetFromSearchArray(unsigned char *buff, int iBuffLen, int iStart, int iStop, unsigned char* search, int iSearchLen)
    
    {
    
        int i, j, ok;
    
    
        if (iStart > iStop)
    
        {
    
            for (i = iStart; i > iStop && i > 0; i--)
    
            {
    
                ok = 1;
    
                for (j = 0; j < iSearchLen; j++)
    
                {
    
                    if (buff[i + j] != search[j])
    
                    {
    
                        ok = 0;
    
                        break;
    
                    }
    
                }
    
                if (ok == 1) return i;
    
            }
    
        }
    
        else
    
        {
    
            for (i = iStart; i < iStop && i < iBuffLen; i++)
    
            {
    
                ok = 1;
    
                for (j = 0; j < iSearchLen; j++)
    
                {
    
                    if (buff[i + j] != search[j])
    
                    {
    
                        ok = 0;
    
                        break;
    
                    }
    
                }
    
                if (ok == 1) return i;
    
            }
    
        }
    
        return -1;
    
    }

  7. #17
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.758
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    SvenMag hat auf GitHub auch schon etwas Code gepostet. Damit kann man auch schon die Zuordnung zum CP auslesen...https://github.com/jogibear9988/DotN.../pull/20/files
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  8. #18
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.758
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Hab nun etwas in meine ToolBox gebaut. IP's von manchen CPs werden schon ausgelesen, CPUs noch nicht... Der meiste Code ist von SvenMag, hab aber das auslesen des Namens funkey übernommen...
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  9. #19
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.758
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Also SvenMag scheint es nun zuverlässig implementiert zu haben, bei mir lassen sich CP's und CPU's nun auslesen... Falls es jemand braucht, der Code ist im Haupt-Branch auf Github eingecheckt...
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

Ähnliche Themen

  1. Antworten: 7
    Letzter Beitrag: 02.09.2011, 11:43
  2. Antworten: 16
    Letzter Beitrag: 01.02.2011, 10:38
  3. Wie Projektdateien vergleichen?
    Von pretender2009 im Forum Feldbusse
    Antworten: 3
    Letzter Beitrag: 27.10.2009, 12:50
  4. IP Adressen Auslesen
    Von Anonymous im Forum PC- und Netzwerktechnik
    Antworten: 3
    Letzter Beitrag: 27.01.2006, 21:09
  5. IP Adressen auslesen
    Von Anonymous im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 13.10.2005, 09:00

Lesezeichen

Berechtigungen

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