# Ordnerstruktur S7 Projekt



## Schnick und Schnack (25 November 2008)

Hallo zusammen.

Kann mir jemand sagen wo in der Windows Ordnerstruktur von einem S-7 Projekt die Informationen zu verwendeten Bausteinen liegt und wie ich die zur weitervewendung anzeigen kann? 

Ziel ist es, mit einem Tool ein (nicht archiviertes) S7 Projekt auszuwählen, und anzuzeigen welche Bausteine darin verwendet wurden.

Eine Möglichkeit wäre :\Projekte\Simatic\Testprojekt\s7asrcom\00000001 dort die erste Zeile der AWL Quellen durchforsten.

Vielleicht hat jemand noch ne klugere Idee

Gruss Anis


----------



## Thomas_v2.1 (25 November 2008)

Hallo,
du könntest die dBase-Datenbankdateien einlesen und daraus die Daten auswerten.
Allerdings ist das etwas verschachtelt, aber ich versuche mal ein paar Zusammenhänge aufzulisten:

Der Startpunkt für die "S7-Programm" Ordner ist die Datei:
_\hrs\S7RESOFF.DBF_

Der Inhalt des Feldes ID, z.B. eine 1, ist dann der Ordnername in dem sich die _SUBBLK.DBF_ und _BAUSTEIN.DBF_ befinden.
Also bei einer "1" im Feld ID liegen die Dateien im Ordner _\ombstx\offline\00000001\_.
In der _BAUSTEIN.DBF_ stehen die Informationen zu allen Bausteinen die sich im Programm befinden. Aber nicht im Klartext sondern alles mit Zahlenwerten
die man erstmal aufschlüsseln muss.
Die Bausteinnamen stehen in noch einer anderen Datei in einem anderen Ordner, und zwar Namens _\YDBs\xxxx\SYMLISTS.DBF_.
"xxxx" ist dann wieder eine ID aus einer anderen Tabelle.
Die Verknüpfung welche Symbolik zum welchem Programm gehört ist wieder in einer Datei _\YDBs\YLNKLIST.DBF_

Wie du siehst ist das alles sehr verwoben.

Und dann gibt es noch Ausnahmen, wenn z.B. öfters mal Programme gelöscht wurden, durch die ich noch nicht durchgestiegen bin.

Man will da im Detail auch gar nicht reingucken, weil man dann sieht was für ein gewachsenes Gerüst die ganze Kiste ist.
Es gibt glaub ich allein drei verschiedene Formate für einen Zeitstempel!


----------



## Schnick und Schnack (25 November 2008)

Vielen Dank für den Beitrag. Klingt schonmal sehr vielversprechend. 
Bin die nächsten Tage auf IBS aber werd mich nach meiner Rückkehr gleich mal reinhängen. Evtl. werd ich dann mit detailierteren Fragen aufs Thema zurückkommen.

Nochmals vielen Dank für die schnelle Antwort.


Gruss Anis


----------



## BPlagens (26 November 2008)

Hallo Thomas,

ich fand deine Ausführungen sehr interessant!

Hast du noch mehr raus bekommen? Mich würde vor allem interessieren, wo den die eigentlichen Inhalte der Bausteine gespeichert werden und da besonders der DB`s.

Der Gedanke dahinter ist ein Tool zu schreiben, das die aktual Werte als start Wert übernimmt.
Das ganze soll ohne AWL Quellen generieren exportieren - importieren laufen.

Vielen Dank!


----------



## mst (26 November 2008)

BPlagens schrieb:


> Hallo Thomas,
> 
> ich fand deine Ausführungen sehr interessant!
> 
> ...


 
http://www.sps-forum.de/showpost.php?p=24431&postcount=18

In dem Beitrag ist ein Link zum Download von DBFViewer mit dem man die Baustein Datenbank Datei öffnen kann.

Vielleicht kann man damit was machen....


----------



## BPlagens (26 November 2008)

passiert mir auch nicht oft, dass ich einen link zu meinem eigenen beitrag finden! 

danke!
cu


----------



## mst (26 November 2008)

BPlagens schrieb:


> passiert mir auch nicht oft, dass ich einen link zu meinem eigenen beitrag finden!
> 
> danke!
> cu


 
jetzt wo du es sagst....*ROFL*


----------



## Thomas_v2.1 (26 November 2008)

BPlagens schrieb:


> Hast du noch mehr raus bekommen? Mich würde vor allem interessieren, wo den die eigentlichen Inhalte der Bausteine gespeichert werden und da besonders der DB`s.



Hi,
wenn du die entsprechende SUBBLK.DBF hast die zu deinem Programm gehört kannst du den Datenbausteincode so auslesen:


```
SELECT MC5CODE FROM SUBBLK.DBF WHERE OBJECTID like 5 AND SUBBLKTYP like '00006'
```
Die OBJECTID musst du dir vorher aus der BAUSTEIN.DBF suchen, bzw. würde das mit einem SQL JOIN-Befehl eigentlich in einem Rutsch gehen. Aber ich habe noch kein Programm welches mit dBase-Dateien komfortabel umgehen kann.

Ich habe ein Programm mit C# geschrieben, aber da ist der Umgang mit dBase-Dateien auch eine Crux.


----------



## BPlagens (27 November 2008)

Vielen Dank Thomas!

Werde mal sehen was ich da schaffe!

cu
bernd


----------



## Gerhard Bäurle (28 November 2008)

Schnick und Schnack schrieb:


> Ziel ist es, mit einem Tool ein (nicht archiviertes) S7 Projekt auszuwählen, und anzuzeigen welche Bausteine darin verwendet wurden.



Hallo,

es gibt von Aglink eine Variante zum Lesen von Bausteinen,
vielleicht hilft Dir das weiter:

http://www.deltalogic.de/content/view/23/45/lang,de/


----------



## Thomas_v2.1 (28 November 2008)

Gerhard Bäurle schrieb:


> Hallo,
> 
> es gibt von Aglink eine Variante zum Lesen von Bausteinen,
> vielleicht hilft Dir das weiter:
> ...



Das Programm scheint aber auch nur die Symbolik auszulesen. Wenn jemand aber einen Baustein ohne Symbolik angelegt hat reicht es ja nicht nur in der Symboltabelle nachzuschauen.

Die Symboltabelle kann man ja recht einfach auslesen. Mal zwei Screenshots von meinem Testprogramm (vielleicht sollte ich das auch mal verkaufen...)


----------



## WernerS (30 November 2008)

Schnick und Schnack schrieb:


> Hallo zusammen.
> 
> Kann mir jemand sagen wo in der Windows Ordnerstruktur von einem S-7 Projekt die Informationen zu verwendeten Bausteinen liegt und wie ich die zur weitervewendung anzeigen kann?
> 
> ...



Wozu werden denn die Informationen benötigt?
Geht es dabei um Standardbausteine und/oder einen Verwendungsnachweis?


----------



## Schnick und Schnack (2 Dezember 2008)

Hallo Werner

Grundsätzlich um den Verwendungsnachweis von verschiedenen Versionen unserer Standardbausteine


----------



## WernerS (2 Dezember 2008)

*Für Geld gibt's fast alles*

Hallo Schnick und Schnack,

für die Verwaltung von S7 Standardbausteinen inklusive Verwendungsnachweis gibt es auch 2 kommerzielle Produkte: versiondog und VersionWorks.
Ich persönlich empfehle versiondog .


----------



## sinumerik.user (18 Oktober 2020)

Hallo Community,

wie Thomas_v2.1 am 25.11.2008 schrieb, gibt es drei verschiedene Formate eines Zeitstempels.
Zwei der Formate konnte ich bereits vollständig ergründen, doch bei dem Letzten habe ich noch keinen Ansatz.
Es geht um den Zeitstempel für die Quellen in der Datei S7CONTAI.DBF und den Feldern "CRDATE1" und "CRDATE2".
Hat diesen Zeitstempel schon jemand enträtselt und kann CRDATE1=  -507958783; CRDATE2= 30844243 in das Datum Erstellt am 18.10.2020  15:37:54 umrechnen?
Ich würde mich über einen Tipp oder Ansatz zur Berechnung freuen.

Vielen Danke

MfG
Sinumerik.User


----------



## Thomas_v2.1 (18 Oktober 2020)

Habe ich noch nicht verwendet. Es scheint zumindest so, dass in den beiden Feldern kombiniert nur der Zeitpunkt der letzten Änderung gespeichert wird, und das Erstelldatum an anderer Stelle.

Ich habe nur mal ein paar Werte duchgetestet und die angezeigten Werte im Simatic Manager dazugeschrieben. Das könntest du mal weiterführen. Sieht irgendwie danach aus als würde da rückwärts gerechnet.

```
crdate1 = 0		crdate2 = 0			18.06.2154 02:00:00

crdate1 = 1		crdate2 = 0			18.06.2154 02:00:00
crdate1 = 10000000	crdate2 = 0			18.06.2154 02:00:10
crdate1 = 1000000	crdate2 = 0			18.06.2154 02:00:10
crdate1 = 100000	crdate2 = 0			18.06.2154 02:00:10
crdate1 = 10000		crdate2 = 0			18.06.2154 02:00:0

crdate1 = 0		crdate2 = 1000			18.06.2154 01:18:16
crdate1 = 0		crdate2 = 10000			18.06.2154 01:18:16
crdate1 = 0		crdate2 = 100000		18.06.2154 01:18:16
crdate1 = 0		crdate2 = 1000000		18.06.2154 01:18:16
crdate1 = 0		crdate2 = 10000000		18.06.2154 01:18:16
crdate1 = 0		crdate2 = 12345678		18.06.2154 18:45:25
crdate1 = 0		crdate2 = 255		ff	18.06.2154 08:25:21
crdate1 = 0		crdate2 = 65280		ff00	18.06.2154 08:25:21
crdate1 = 0		crdate2 = 511		1ff	18.06.2154 08:25:21
crdate1 = 0		crdate2 = 65535		ffff	18.06.2154 08:25:21
crdate1 = 0		crdate2 = 16777215	ffffff	18.06.2154 08:25:21
crdate1 = 0		crdate2 = 33554431	1ffffff	18.06.2154 01:42:54
```


----------



## sinumerik.user (18 Oktober 2020)

Ich habe das mit Excel schon etwas fortgeführt.
Wenn ich CRDATAT1 unverändert lasse und CRDATAE2 und das Datum wie nachfolgende herunterziehe, berechnet Excel das Datum und die Uhrzeit bis auf ein paar Sekunden auch korrekt.
Dennoch habe ich die Systematik noch nicht verstanden und ich habe auch ein anderes Datum (02.03.2151) bei undefinierten Werten von CRDATE1 und CRDATE2.
Verwendet wird Step 7 5.6 SP1 HF5


CRDATE1CRDATE2Erstellt am Datum0002.03.2151 02:00:0018757344642804382002.03.2151 16:06:03-18757344642804382002.03.2151 16:06:5718757344642814382017.01.1984 18:33:56-18757344642814382017.01.1984 18:34:5018757344644094382003.04.2158  22:02:54-18757344644094382003.04.2158  22:03:49


----------



## Thomas_v2.1 (18 Oktober 2020)

Ich finde mein Step7dBase Projekt grad nicht wieder, aber die Quellordner hatte ich meine ich auch nie verarbeitet.

Andere Zeitstempel in den Projektdateien waren meine ich in 2 Bytes die Anzahl der Tage und in weiteren 4 Bytes die Anzahl an Millisekunden vom 1.1.1984 00:00:00 Uhr an gerechnet, das scheint hier nicht der Fall zu sein.  Was Siemens auch gerne verwendet, ist BCD codiert wie auch in Step7, mit zwei Varianten einmal mit 8 oder 10 Bytes. Dort geht das Jahr aber nur bis 2089.

Musst mal mit den Sysinternals Process Monitor aufzeichnen was für Dateien Step7 so verarbeitet wenn du dir die Bausteineigenschaften anzeigen lässt.


----------



## Thomas_v2.1 (18 Oktober 2020)

Sehr seltsam, ich habe das Projekt mit crdate1 = 0, crdate2 = 33554431 nochmal geöffnet, jetzt bekomme ich 07.09.2057 01:32:58 angezeigt. Ich habe aber noch Step7 V5.5.

Möglich wäre auch eine 64 Bit Gleitkommazahl kombiniert in den beiden Feldern, das verwendet wohl dBase selber als Timestamp Format, mit einer anderen Endianess als üblich.


----------



## PN/DP (18 Oktober 2020)

Gleitkommazahl - könnte das evtl. was mit dem Timestamp Format zu tub haben, was Siemens in Archiven verwendet?
Zeitstempel im csv-Archiv eines Comfort-Panels

Harald


----------



## Heinileini (18 Oktober 2020)

sinumerik.user schrieb:


> Ich habe das mit Excel schon etwas fortgeführt.
> Wenn ich CRDATAT1 unverändert lasse und CRDATAE2 und das Datum wie nachfolgende herunterziehe, berechnet Excel das Datum und die Uhrzeit bis auf ein paar Sekunden auch korrekt.
> Dennoch habe ich die Systematik noch nicht verstanden und ich habe auch ein anderes Datum (02.03.2151) bei undefinierten Werten von CRDATE1 und CRDATE2.



Wo lässt Du in Deiner Tabelle CRDATE1 unverändert? Du wechselst zwischen den Werten 0, 1875734464 und -1875734464.
Wo sind CRDATE1 und CRDATE2 undefiniert? Meinst Du damit die wohldefinierten Nullen?
Woher weisst Du, dass Excel das Datum und die Uhrzeit bis auf ein paar Sekunden korrekt berechnet? Womit vergleichst Du?
Ich habe die Systematik Deines Herunterziehens nicht verstanden.
Du müsstest zuvor einen Plan haben bzw. eine bestimmte Absicht damit verfolgen. Kannst Du darüber etwas sagen?
Welches ist der Zusammenhang der Spalte 'Erstellt am Datum' mit den beiden anderen Spalten? Negative Datumswerte oder Zeitwerte mag Excel nämlich gar nicht.

Nachfolgend der Excel Datumswert plus Zeitwert zu Deiner Spalte 'Erstellt am Datum':

```
Datum+Zeit      Datwert+Zeitwert
2151-03-02 02:00:00    91738,083333333
2151-03-02 16:06:03    91738,670868056
2151-03-02 16:06:57    91738,671493056
1984-01-17 18:33:56    30698,773564815
1984-01-17 18:34:50    30698,774189815
2158-04-03 22:02:54    94327,918680556
2158-04-03 22:03:49    94327,919317130
```


----------



## Thomas_v2.1 (18 Oktober 2020)

Die negativen Werte sind eben so wie sie in der dBase Datei gespeichert werden und du sie wieder auslesen kannst (z.B. mit Access). Wie schon geschrieben macht Siemens das an anderer Stelle auch so, dass in einer Integer Spalte ein spezial codierter Zeitstempel gespeichert wird und nicht der Zeitstempel von dBase verwendet wird. Diesen musst du eben als Integer auslesen, in die einzelnen Bytes zerlegen und daraus den richtigen Zeitstempel generieren.


----------



## Jochen Kühner (18 Oktober 2020)

Hab zwar zu den Feldern nix zu sagen, nur das ich ein paar Dinge welche ich damals genutzt habe hier dokumentiert habe:

https://github.com/dotnetprojects/D...ster/LibNoDaveConnectionLibrary/Documentation

aber viel steckt auch einfach nur im Code:

https://github.com/dotnetprojects/D...nectionLibrary/Projectfiles/Step7ProjectV5.cs


----------



## Thomas_v2.1 (19 Oktober 2020)

So wie es aussieht muss crdate1 und crdate1 zu einem 64 Bit Integer kombiniert werden, was dann die Anzahl x100 Nanosekunden seit dem 1.1.1600 angibt.

Mit deinem Beispielzeitstempel 18.10.2020 15:37:54
CRDATE1= -507958783
CRDATE2= 30844243

dez 30844243 = hex 1D6A553
dez -507958783 = hex E1B92A01

kombiniert
hex 1D6A553E1B92A01

entspricht
dez 132475018741885441

mal 10^-7 = 
13247501874.1885441 Sekunden

Wenn du das zurückrechnest kommst du je nach verwendetem Kalender (das ist noch genau zu ergründen) bei 1.1.1600 heraus.


Der "Zuletzt geändert am" in Step7 ist identisch mit "Geändert" Zeitstempel vom Windows Explorer. Der wird so wie es aussieht nicht selber gespeichert sondern aus den Dateieigenschaften ausgelesen. Wenn du die .awl mit einem Texteditor außerhalb von Step7 änderst, dann funktioniert das mit dem Zeitstempel nämlich auch noch.


----------



## DeltaMikeAir (20 Oktober 2020)

> Wenn du das zurückrechnest kommst du je nach verwendetem Kalender (das ist noch genau zu ergründen) bei 1.1.1600 heraus.



Dann scheint CRDATE 1+2 folgendes Format zu sein (bzw. auf dieser Grundlage zu basieren):

http://www.selfadsi.de/ads-attributes/user-lastLogonTimestamp.htm


----------



## Windoze (20 Oktober 2020)

Hallo,

ich hätte eher Vermutet, das es die Windows FILETIME-Struktur ist.
https://docs.microsoft.com/de-de/windows/win32/api/minwinbase/ns-minwinbase-filetime

Bei folgendem Programm

```
#include <Windows.h>
#include <stdio.h>

int main() {
    FILETIME ft = {0xE1B92A01,0x1D6A553};

    SYSTEMTIME st = {};
    FileTimeToSystemTime(&ft, &st);

    printf("%u.%u.%u  %u:%u:%u.%u", st.wDay, st.wMonth, st.wYear,
        st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);

    return 0;
}
```

kommt dies raus: 18.10.2020  13:37:54.188

Das ist der Korrekte Wert, nur in UTC. Wenn man jetzt noch die Zeitzone auf MESZ umrechnet (+2 Stunden) kommt man auf den Wert.


----------



## sinumerik.user (20 Oktober 2020)

Hallo,

schon mal vielen Dank für eure vielen nützlichen und sehr konstruktiven Hilfestellungen.
Ich bin gestern leider nicht weiter dazu gekommen, mir das weiter anzuschauen.
Doch ich werde mir gleich eure ganzen Tipps vornehmen und versuchen, damit das Rätsel vollständig zu lösen.
Ich werde hier auf jeden Fall auch meine Erkenntnisse weiter teilen, so wie ihr es schon getan habt.

Danke

MfG

sinumerik.user


----------



## DeltaMikeAir (20 Oktober 2020)

Was mich noch irritiert:
Aber was nun richtig ist, sollte sich ja über vorhandene Werte berechnen lassen, also CRDATE 1 + CRDATE2 aus Step 7.

Hier steht:


> Contains a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC )


https://docs.microsoft.com/de-de/wi...se/ns-minwinbase-filetime?redirectedfrom=MSDN

Hier steht:


> ausgedrückt in 100-Nanosekunden-Schritten seit dem 1. Januar 1600, 0:00 Uhr.


http://www.selfadsi.de/ads-attributes/user-lastLogonTimestamp.htm


----------



## sinumerik.user (21 Oktober 2020)

Hallo,

ich kann nun bestätigen, dass der Zeitstempel in CRDATE1 und CRDATE2 der FILETIME-Struktur entspricht.
Wie von Thomas_v2.1 beschrieben, müssen CRDATE2 und CRDATE1 zu einem 64 Bit Integer kombiniert werden.



> CRDATE1= -507958783
> CRDATE2= 30844243
> 
> dez 30844243 = hex 1D6A553
> ...




CRDATE1= -507958783
CRDATE2= 30844243

dez 30844243 = hex 1D6A553
dez -507958783 = hex E1B92A01

kombiniert: hex 1D6A553E1B92A01 = dez 132475018741885441

Diese 64 Bit Integer Ziffernfolge repräsentiert Intervalle von 100 Nanosekunden seit dem 1. Januar 1601 im UTC Format.
Wie Windoze damit schon richtig beschrieben hat, entspricht der Zeitstempel damit dem 18.10.2020 13:37:54.188 UTC.
Unter Berücksichtigung der Zeitzone und der Sommerzeit müssen nun noch 2 Stunden addiert werden.
So ergibt sich die gesuchte Angabe von Datum und Uhrzeit 18.10.2020 15:37:54:188.
Handelt es sich um ein Datum im Bereich der Winterzeit muss nur 1 Stunde für die Zeitzone addiert werden.

Ich habe das nun mit einigen Quellen ausprobiert und konnte das Datum so immer präzise berechnen.

Vielen Dank für eure Unterstützung.


----------



## sinumerik.user (24 September 2022)

Hallo,

wo und wie werden in Step7 Projekten verwendete GSD Dateien in der Ordnerstruktur oder Datenbanken des Projekts gespeichert?
Das Projekt muss irgendwo diese Dateien enthalten, da die GSD Dateien ja auch über das Projekt automatisch installiert werden, wenn in der aktuelle Step 7 Installation diese GSD Dateien noch nicht installiert sind. In den DBF Dateien habe ich bisher nur den Namen der verwendeten GSD Datei, den Namen des Symbolbildes der Station und einige Parameter der Station gefunden. Eine Suche nach Strings aus der GSD Datei z.B. Revision über das ganze Step 7 Projekt brachte kein Ergebnis. Daher vermute ich, dass die verwendeten GSD Dateien irgendwie zusammen gepackt werden. Also z.B. in ein ZIP Archiv. Wenn eine GSD Datei beim Import des Projekts automatisch installiert wurde, ist diese GSD Datei ja absolut identisch zu der originalen Datei welcher der erste Autor des Projekts verwendet hat. Sie enthält somit alle Kommentare und Parameter der originalen GSD Datei. Aus diesem Grund bin ich der Überzeugung, das die GSD Dateien unter Umständen irgendwie verschlüsselt in dem Projektverzeichnis zu finden sein müssen.
Ich bitte um Unterstützung wo ich diese Daten finden kann.

Mit bestem Gruß

sinumerik.user


----------



## Oberchefe (24 September 2022)

im Ordner Global liegt dem Namen nach vermutlich komprimiertes ab (Dateiendung .compressed).


----------



## Thomas_v2.1 (24 September 2022)

Ich habe mich auch schon gefragt, was denn alles online in der SPS gespeicher wird. Denn einige Informationen wie der Name der Verwendeten GSD-Datei sind auch in den Systemdaten vorhanden. Aber die gesamte GSD-Datei vermute ich nicht, zumindest nicht online.


Oberchefe schrieb:


> im Ordner Global liegt dem Namen nach vermutlich komprimiertes ab (Dateiendung .compressed).


Du meinst S7hCompressedMetadata.cmf? Oder liegt das an meiner Step7 5.5 Version. Dort habe ich noch eine S7hMetaData.umf, falls das die unkomprimierte Version ist, dann sind dort die Daten der GSD-Datei jedenfalls nicht enthalten.


----------



## Oberchefe (24 September 2022)

bei mir liegt da beispielsweise in einem Projekt eine Datei namens gsdml-v2.2-hilscher-cifx re pns-20120224.compressed.

Das riecht für mich stark nach GSD.


----------



## Thomas_v2.1 (24 September 2022)

Das habe ich eben auch mal ausprobiert, mit einem Danfoss FC an Profibus, da wird dort nichts abgelegt. Aber an der Datei gibt es Änderungen. Vielleicht ist das bei Profinet nochmal anders gelöst (hinten angeflanscht).


----------



## sinumerik.user (24 September 2022)

Hallo,
ich habe es auch gerade ausprobiert.
Wenn man Stationen im Bus hinzufügt oder entfernt, ändert sich die Datei S7hCompressedMetadata.cmf.
Habe mir das auch im Hex-Editor angeschaut, doch konnte ich noch nichts spannendes feststellen.
Auch beim Vergleich von zwei Dateien noch nicht.
Es ist auch die Frage wie ist die Datei komprimiert?


----------



## Thomas_v2.1 (24 September 2022)

Es scheint zumindest nicht die ganze Datei komprimiert zu sein, denn es ändern sich nur einzelne Teile davon wenn man etwas ändert. Typische Werte für einen zlib Header sind Werte wie 78 9c und dergleichen. Davon findet man einige Vorkommen, müsste man nochmal prüfen ob untypisch oft. Step7 wurde ja noch umfangreich mit den MFC programmiert, vielleicht gibt es da fertige Methoden um beispielsweise ein Objekt in einer Datei zu sichern.


----------



## sinumerik.user (24 September 2022)

Du meinst MFC = Microsoft Foundation Classes?
In meiner Datei habe ich leider noch nichts ähnliches zu nachfolgender Aufstellung gefunden:

 CMF |  FLG
0x78 | 0x01 - No Compression/low
0x78 | 0x9C - Default Compression
0x78 | 0xDA - Best Compression


----------



## Thomas_v2.1 (24 September 2022)

Also in der S7hCompressedMetadata scheint es nicht angelegt zu werden. Ich habe mal ein Projekt ohne Profibusteilnehmer gesichert, und dann ein Profibusteilnehmer ergänzt und dann die Dateien verglichen. Da sind keine Unterschiede zu finden.
Aber es scheint irgendwo komprimiert gespeichert zu werden, mit einer reinen Textsuche findet man nichts aus der GSD-Datei wieder.


----------



## sinumerik.user (24 September 2022)

Thomas_v2.1 schrieb:


> Aber es scheint irgendwo komprimiert gespeichert zu werden, mit einer reinen Textsuche findet man nichts aus der GSD-Datei wieder.


Das habe ich ja auch festgestellt.
Doch ich habe auch nach 2 Tagen Suche noch keinen Anhaltspunkt gefunden wo die Informationen zu der verwendeten GSD Datei gespeichert werden.


----------



## PN/DP (24 September 2022)

Mache ein Testprojekt und eine Kopie davon. Dann projektiere ein Gerät mit GSD Datei und speichern und schau welche Dateien neu/geändert sind. Oder ändert sich zuviel?


----------



## Thomas_v2.1 (24 September 2022)

Ist die GSD-Datei denn wirklich komplett vorhanden?
Man könnte z.B. eine sehr große GSD-Datei selber erstellen und einbinden, und dann schauen welche Datei sich ungewöhnlich vergrößert. Als Vergleichswert die GSD selber zippen.


----------



## sinumerik.user (24 September 2022)

Ja die GSD ist nach der automatischen installation komplett und absolut identisch vorhanden.
Ich habe ein Test Projekt erstellt und Archiviert.
Anschließend die GSD aus dem Installationsverzeichnis von Step7 gelöscht.
Dann das Projekt dearchiviert und geladen.
Wenn man dann die HW Konfig öffnet, erscheint die Meldung, dass die GSD Datei xy automatisch instelliert wurde.

Meine GSD Datei ist 23671 Byte groß.


----------



## Thomas_v2.1 (24 September 2022)

Werden die Kommentare in der GSD-Datei auch wiederhergestellt? Dann könnte man an der Stelle umfangreiche Zeichen (zufällige) unterbringen, dann müsste man ja etwas erkennen können.


----------



## sinumerik.user (24 September 2022)

Ja selbst die Kommentare werden wiederhergestellt.


----------



## Thomas_v2.1 (24 September 2022)

Grad mal einen Versuch gemacht. Das steckt definitiv in der h0mSave7\s7hstatx\HATTREME1.DBT.
In der Tabelle existieren mehrere MEMOARRAYM, denke mal das ist ein komprimiertes Bytearray. Die Vergrößerung ist ungefähr so viel, wie wenn ich die GSD mittels zip komprimiere.


----------



## sinumerik.user (24 September 2022)

Interessant, das schauche ich mir auch an.
Nur wie kann ich das wieder entpacken ohne dafür Step7 bemühen zu müssen?


----------



## Thomas_v2.1 (24 September 2022)

Du brauchst für die Programmiersprache deiner Wahl einen dBase Treiber. Um das alles einzulesen benötigst du aber noch etliche Daten mehr über die Projektstruktur, da alles über diverse IDs zusammenhängt. Wenn es dir nur um diese Daten geht, würde ich einfach alles in der Tabelle durchgehen und versuchen irgendwie zu entpacken.


----------



## sinumerik.user (25 September 2022)

Thomas_v2.1 schrieb:


> Du brauchst für die Programmiersprache deiner Wahl einen dBase Treiber. Um das alles einzulesen benötigst du aber noch etliche Daten mehr über die Projektstruktur, da alles über diverse IDs zusammenhängt.


Das weiß ich und habe auch schon einiges zum Aufbau und der Datenstruktur von Step7 Projekten verstanden.

Jetzt geht es zunächst nur um den Export der GSD Dateien aus dem Step7 Projekt.
Ich habe es noch nicht hinbekommen die Daten zu extrahieren.
Hier steht beschrieben wie die Datenstruktur innerhalb der DBT Datei aufgebaut ist:
dbf dbt file format
Ich habe für den Hexeditor 010 Editor ein Binary Template gebaut, doch es scheint noch etwas nicht zu passen.
Die Tabelle welche meiner Meinung nach die Daten enthalten muss, konnte ich noch nicht herauslösen und irgenwie entpacken.


----------



## Thomas_v2.1 (25 September 2022)

Ich habe dafür immer das XBase Modul von Perl verwendet. In C# gibt es auch Unterstützung für dBase, das funktioniert aber nicht mit allen Tabellen wie auch mit dieser hier nicht (eventuell weil mit Index?).
Auf jeden Fall weiß ich auch dann noch nicht, wie die Daten komprimiert wurden. Ich habe die Daten der Tabelle mal in eine Datei gespeichert, und versucht einfach mal mit 7zip zu entpacken. Das funktioniert aber auch nicht, obwohl 7zip viele Formate kennt. Also entweder da ist noch ein Header davor, oder das ist ein anderes Format. Da müsstest du eben mal ein paar Sachen ausprobieren wann sich wo etwas ändert.

Wozu benötigt man das denn so oft, dass sich der ganze Aufwand lohnt?


----------



## sinumerik.user (25 September 2022)

Alle unsere Projekte, welche vor der Auslieferung der Anlage gespeichert werden, sollen geprüft werden, ob die GSD Daten in der richtigen Version verwendet wurden. Wir sind Maschinenbauer und jeder Mitarbeiter der Inbetriebnahme könnte da Fehler machen.
Daher soll das zur Verbesserung der Qualität und Vermeidung von Problemen automatisch geprüft werden.
Ich hatte schon viele Probleme damit und muss ständig für Nachrüstungen GSD Dateien bereitstellen, da der Techniker weder diese noch das Ursprungsprojekt hat. Der Techniker muss das Projekt aus der Maschine herunterladen und die Hardware ändern. Doch wenn die GSD Daten fehlen oder ferhlerhaft sind ist die Anlage nach dem hochladen des Projekts nicht mehr betiebsbereit.

Ich arbeite dazu mit C# und habe auch festgestellt, das dies mit dieser dBase nicht funktioniert.

Habe auch schon viel probiert. Habe auch 7-Zip verwendet und versucht, meien Exporte so zu entpacken.


----------



## Thomas_v2.1 (25 September 2022)

Vielleicht reicht es ja, wenn du die gepackten Daten mit einem Referenzprojekt vergleichst.

Ich hatte mir mal notiert, dass ich das Perl-Modul von XBase von Linux verwenden musste, damit es unter Windows funktioniert. Aber keine Ahnung ob das bei einer aktuellen Installation immer noch so ist. Mit Perl kannst du die Daten so dumpen (erzeugt eine Datei je Zeile):


```
#!/usr/bin/perl -w
use strict;
use warnings;
use DBI;
use XBase;

my $s7_project_path = "G:/TestVergl/Proj";
 
my $data_source_name = 'DBI:XBase:' . $s7_project_path . '/hOmSave7/s7hstatx/';
my $dbh = DBI->connect($data_source_name) or die $DBI::errstr;
my $sth = $dbh->prepare('SELECT IDM, ATTRIIDM, ATTFORMATM, MEMOARRAYM FROM HATTRME1');
$sth->execute or die $sth->errstr;

my @row;
my $i = 1;
while(@row = $sth->fetchrow_array) {
    my $filename = 'ROW' . $i .'_IDM'. $row[0] . '_ATTRIIDM' . $row[1] .  '_ATTFORMATM' . $row[2] . '_MEMOARRAYM.dat';
    open my $fh, '>:raw', $filename or die;
    print $fh $row[3];
    close $fh;
    $i = $i + 1;
}
```


----------



## sinumerik.user (25 September 2022)

Eigentlich möchte ich einen Crawler bauern der alle Projekte die bei unseren verschiedenen Produktionsstandorten gesichert werden, durchgeht.
Die daraus extrahierten GSD's will ich auch automatisch verteilen und mit den originalen in unsere VersionControl abgleichen.
So das ich auch immer sicher nachvollziehen kann in welchem Projekt welche GSD Dateien für was verwendet wurden.
Am Ende soll dann auch eine Anwendung mit Datenbank dabei herauskommen, welche die GSD's auf den Notebooks all unserer Techniker weltweit installiert.
Schon mal vielen Danke für dein Engagement und Hilfe hier.


----------



## Thomas_v2.1 (25 September 2022)

Ich würde dann weiter so vorgehen, dass ich erst einmal ein paar Daten sammeln würde. Also Minimalprojekt mit einem DP-Slave. Dann an der GSD-Datei immer ein Zeichen tauschen, GSD neu installieren, konfigurieren und übersetzen, und Projekt sichern. Dann die Datenbanktabellen dumpen und vergleichen, um festzustellen ob es da noch einen festen Teil gibt. Perl ist auch nicht mehr die Sprache meiner Wahl, aber nur um zu sehen ob und wie es überhaupt geht, würde ich damit starten, weil man direkt loslegen kann.


----------



## PN/DP (25 September 2022)

sinumerik.user schrieb:


> Der Techniker muss das Projekt aus der Maschine herunterladen und die Hardware ändern. Doch wenn die GSD Daten fehlen oder ferhlerhaft sind ist die Anlage nach dem hochladen des Projekts nicht mehr betiebsbereit.


Wäre es nicht besser, lieber ein vernünftiges Projektdatei-Management aufzubauen, anstatt an dem Gemurkse herumzukontrollieren? Warum haben die Techniker kein Projekt mit der korrekten Hardware Konfig? Bei Eurem Vorgehen hat ja am Ende niemand ein aktuelles Projekt  Sieht da noch jemand durch?
Was hat dieses Vorgehen (Hardware-Konfig ohne Projekt herausladen, ändern und wieder hineinladen) mit "_Qualität und Vermeidung von Problemen_" zu tun??? Und die Software passt sich automatisch an die geänderte Hardware an?

Harald


----------



## sinumerik.user (25 September 2022)

@PN/DP
Wir haben als Konzern die kritische Größe überschritten um das ändern zu können, was du vorgeschlagen hast.
Wenn das so einfach wäre hätte ich es schon gemacht.
Ich habe Zugriff auf die Projekte der Maschinen. Die Software kann immer alle Funktionen und der Techniker muss nur die Hardwarekonfig anpsssen und die Funktionen in der Software aktivieren. Die Hardware wird aus kostengründen nicht immer maximal in die Maschinen eingebaut.
Aus Konwhow Schutz Gründen und vorallem aus Haftungsgründen zur CE darf nicht Hinz und Kunz an der Software herumdoktern und Änderungen vornehmen die potentiell gefährlich für Mensch und oder Maschine sind. Die Techniker müssen ja keine Softwareexperten sein, das ist bei der Anzahl auch nicht leistbar. Trotzdem danke für deinen Vorschlag und so falsch ist er ja auch nicht, nur leider nicht umsetzbar.

@Thomas_v2.1
Danke für deine Unterstützung ich werde mir das mal anschauen und evtl. wie du vorgeschlagen hast mit Perl weitere Versuche machen.
Ich habe zwar noch nie mit gearbeitet und muss erstmal alles einrichten aber werde dann mal versuchen Ergebnisse zu erzielen.
Schritt für Schritt in kleinen Schritten vorgehen das kenne ich.
Ich berichte wenn ich was neues entdecke.
Wenn jemand noch weitere Erkenntnisse hat sehr gerne.


----------



## Jochen Kühner (26 September 2022)

Mit meiner Bibliothek kannst du die DBF Files ja auch lesen, hab dazu sogar schon einen kleine DB Browser https://github.com/dotnetprojects/DotNetSiemensPLCToolBoxLibrary/tree/master/DbfReader

Wäre natürlich auch schön, wenn du da weiter kommst, wenn wir den support für die GSD Files dann direkt in die Bibliothek einbauen


----------



## Jochen Kühner (26 September 2022)

Hier gibts auch ein paar Infos zu verschiedenen Files und wofür die sind: https://github.com/dotnetprojects/D...ster/LibNoDaveConnectionLibrary/Documentation


----------



## Jochen Kühner (26 September 2022)

Würde jetzt noch tippen, das in der HOBJECT1.DBF das Feld "Id" mit dem Feld "IDM" in HATTRME1.DBF verknüpft ist (aber nur vermutung)
Fraglich ist dann noch wofür die Werte in AttrIIDM in HATTRME1.DBF stehen.


----------



## Thomas_v2.1 (26 September 2022)

Jochen Kühner schrieb:


> Mit meiner Bibliothek kannst du die DBF Files ja auch lesen, hab dazu sogar schon einen kleine DB Browser


Ist das bei dir ein eigener Treiber um die DBF Dateien zu verarbeiten? Der in .Net vorhandene kann nämlich nicht alle DBF-Dateien die in einem Step7-Projekt vorkommen lesen.


----------



## Jochen Kühner (26 September 2022)

Ist selbst geschrieben:









						DotNetSiemensPLCToolBoxLibrary/ParseDBF.cs at master · dotnetprojects/DotNetSiemensPLCToolBoxLibrary
					

Library to Access Siemens PLCs and Step5/Step7 Project Files - DotNetSiemensPLCToolBoxLibrary/ParseDBF.cs at master · dotnetprojects/DotNetSiemensPLCToolBoxLibrary




					github.com
				



bassiert auf einem CodeProject Projekt:





						Load a DBF into a DataTable
					

Load a DBF into a DataTable without using the Jet or other OLE Db drivers




					www.codeproject.com
				




Hab das dann um alles möglich erweitert und Fehler gefixt bis es lief.
Was noch fehlt ist MDX support, zum lesen brauch ich den ja nicht, aber wenn man schreibsupport einbauen möchte müssen auch die MDX Files aktualisert werden, dafür hatte ich schon mal Typen angelegt:








						DotNetSiemensPLCToolBoxLibrary/LibNoDaveConnectionLibrary/DBF/Structures/MDX at master · dotnetprojects/DotNetSiemensPLCToolBoxLibrary
					

Library to Access Siemens PLCs and Step5/Step7 Project Files - DotNetSiemensPLCToolBoxLibrary/LibNoDaveConnectionLibrary/DBF/Structures/MDX at master · dotnetprojects/DotNetSiemensPLCToolBoxLibrary




					github.com
				



und etwans angefangen:








						DotNetSiemensPLCToolBoxLibrary/MDXFile.cs at master · dotnetprojects/DotNetSiemensPLCToolBoxLibrary
					

Library to Access Siemens PLCs and Step5/Step7 Project Files - DotNetSiemensPLCToolBoxLibrary/MDXFile.cs at master · dotnetprojects/DotNetSiemensPLCToolBoxLibrary




					github.com
				



Das aber nie fertig gebaut


----------

