# MC7-Code in AWL umzuwandeln



## SPS_PC (15 Mai 2009)

Hallo Zusammen,

hat schon jemand versucht den MC7-Code wieder in AWL 
umzuwandeln? Oder hat jemand eine Befehlstabelle mit den
Hex-Werten, wie sie noch zu S5-Zeiten existierte?


----------



## Thomas_v2.1 (15 Mai 2009)

Hi,
für MC5-Code gibt es so etwas:

http://sourceforge.net/projects/mc5decode/

Wenn du so etwas für MC7-Code findest wäre ich daran auch interessiert. Oder zumindest eine Tabelle mit den Hex-Codes würde schonmal weiterhelfen. Sich das zu händisch rauszupicken wird eine ganz schöne Sisyphusarbeit.


----------



## Human (15 Mai 2009)

Thomas_v2.1 schrieb:


> Sich das zu händisch rauszupicken wird eine ganz schöne Sisyphusarbeit.


 
Jaja, das ist es, hab das mal vor ein paar Wochen angefangen eine Tabelle zu schreiben, ist aber wegen des Umfangs noch nicht fertig, aber wenn lass ich euch das wissen!


----------



## SPS_PC (16 Mai 2009)

Hi Thomas,

wenn ich was finde, lass ich es dir zukommen.

Hi Human,

wenn du möchtes kann ich dich ja unterstützen,
welche Befehle oder Hex-Codes fehlen denn noch?


----------



## Human (19 Mai 2009)

Das Einfachste habe ich jetzt ich denke mal, dass ich Ende der Woche fertig sein kann.


----------



## SPS_PC (19 Mai 2009)

Hi Human,

ich habe mittlerweile auch die Bitbefehle, Laden, Transferieren
und die Netzwerkaufteilung dekodiert.

Jetzt will ich noch die Bausteinaufrufe und die Ablaufbefehle raus bekommen.

Was mir noch nicht klar ist, wie das mit den Parameter funktionert,
wird wohl irgendwo im hinteren Teil des Bausteins abgelegt.


----------



## Human (19 Mai 2009)

Kannst ja mal den Grundaufbau eines Bausteins raussuchen (Start, Ende, Bausteinnummer, Erstell-, Geändert-, Schnittstellenzeit, Name, Familie, Version, Header, Checksumme (glaub ich, dass da eine drin ist))), die ganzen Bitbefehle hab ich schon lange, was mir noch fehlt nurnoch die Programmsteuerbefehle, aber die müsste ich dann heute auch noch fertig bekommen! 

Das mit den Bausteinaufrufen ist ein bisschen kniffelig, aber die Parameter stehen im Aufruf zwischen 10 01 und 10 02 drinnen, das kann ich dir schonmal verraten! 

Im Anhang ist mal drin, was ich bisher entschlüsseln konnte.

Die MC7-Programmsteuerung ist noch nicht fertig bzw. Teilweise auch noch nicht ganz richtig.


----------



## FlorisV (19 Mai 2009)

Attached you will find my attempts. Not guarenteed to be complete though!


----------



## FlorisV (19 Mai 2009)

Function parameters are listed in code, just after the call and an associated unconditional jump, like:

      UC    FC   214;                         // 3D D6
      JU    M00E8;                            // 70 0B 00 08
       P#V8.0;                                // 87 00 00 40
       P#V14.0;                               // 87 00 00 70
       P#V16.0;                               // 87 00 00 80
       ...
       <parameter list continous>
       ...
M00E8:LAR2  LD     4;                         // FE 6B 00 04

access to these pointers is in an offset in the operand of the instruction, like:

; L #iByte
      L     B Param    4;                     // FB C1 00 04

in this case iByte was the 2nd input parameter

The 4 is a word offset, which seems to have its origan at the start of the call instruction.


// ---------------------------

Function block parametes are a totally different story. They can be accessed through instantiated memory, just like static variables.


----------



## ronnie.b (20 Mai 2009)

Hallo zusammen.
Wie lange ist denn der Bausteinheader(??falls das auch in der .wld drin steht) und wo/wie finde ich denn die einzelnen Netzwerke?
Das auslesen der Hexcodes hab ich dank der hier eingestellten Listen schon raus.

Gruß Ronnie


----------



## Human (20 Mai 2009)

Hi ronnie,

Im Anhang findest du zwei Bausteine: einen FC800 und einen FC1 (der nachfolgende Code ist eingefärbt.

Code FC1:

```
Netzwerk 1:
L 1
T MB 0
L 1
T MB 1
L 1
T MB 2
L 1
T MB 3
```
 
Code FC800:

```
Netzwerk 1:
L 1
T MB 0
Netzwerk 2:
L 1
T MB 1
Netzwerk 3:
L 1
T MB 2
Netzwerk 4:
L 1
T MB 3
```


----------



## FlorisV (21 Mai 2009)

Didn't know about the .wld trick, just read up on it.

I am using the following procedure:

In the project directory find the subdir "ombstx\offline"

In this folder you will find one "numbered" subfolder for each S7program in your project. In these program subfolders you will find 2 databases:
Baustein.dbf
Subblk.dbf
Studied them with an appropriate viewer to get the grips on them. Interresting data is in memo fields in these databases. Some of these fields are in plain text and can be studied with viewers, others (that interrest us) contain binary data.

The memo field of a database are stored in seperate files (*.dbt). The field in the dbf file only contains an id to an entry in the .dbt table http://www.clicketyclick.dk/databases/xbase/format/dbf.html can tell you a lot about getting access to these fields. 

Each "Subblk" record entry contains memo fields "MC5CODE", "SSBPART", "ADDINFO". These contain the number of the associated memo block in the dbt file.

Blocks in your s7blocks container have associated records in the Subblk database. There are one or more records per block, they differ in "SUBBLKTYP". So far I am pretty shure of the following:

For FC x:
entry with SUBBLKTYPE == 12 and BLKNUMBER == x has the number of the memoblok containing <the binary code> in field "MC5CODE"
entry with SUBBLKTYPE == 5 and BLKNUMBER == x has the number of the memoblok containing <the interface description in plain text> in field "MC5CODE"

For OB x:
entry with SUBBLKTYPE == 8 and BLKNUMBER == x has the number of the memoblok containing <the binary code> in field "MC5CODE"
entry with SUBBLKTYPE == 6 and BLKNUMBER == x has the number of the memoblok containing <the interface description in plain text> in field "MC5CODE"

For FB x:
entry with SUBBLKTYPE == 14 and BLKNUMBER == x has the number of the memoblok containing <the binary code> in field "MC5CODE"
entry with SUBBLKTYPE == 4 and BLKNUMBER == x has the number of the memoblok containing <the interface description in plain text> in field "MC5CODE"

In other memoblocks you can find things as network titles, block title, comments, etc.


----------



## Human (21 Mai 2009)

No, I didn't know... 
All I found out was with the libnodave (upload of the blocks into files) and I read the files with a HEX-Editor! :TOOL:

Sodele... und dann hab ich mal ein bisschen im Kopf der Datei ein bisschen herumgedoktort:

Der Anfang der Aufbaus eines Bausteins:


```
70 70 // Bausteinstart
01 // Baustein geschützt oder nicht???
01 // ???
XX // Erstellsprache
YY // Bausteintyp
ZZ ZZ // Bausteinnummer
00 00 00 66 // Ladespeicherbereich
00 00 00 00 // ???
00 00 02 13 24 38 // letzte Code-Änderung
04 00 BB 8B 24 37 // letzte Schnittstellen-Änderung
00 0E // ??
00 06 // ??
00 00 // Länge Lokaldaten
00 0A // Länge des MC7-Codes
30 03 00 01 30 03 00 01 // Programmcode (hier 2x L  1)
... // Bausteinende
 
Erstellsprache (XX):
01 = AWL
02 = KOP
03 = FUP
04 = SCL
05 = DB
06 = GRAPH
 
Bausteintyp (YY): 
08 = OB
0A = DB
0B = SDB
0C = FC
0D = SFC
0E = FB
0F = SFB 
 
Zeit:
BYTE: 01 02 03 04 05 06
      00 00 02 13 24 38 // letzte Code-Änderung
      04 00 BB 8B 24 37 // letzte Schnittstellen-Änderung
 
01 - 04 Tageszeit (Millisekunde des Tages)
05 - 06 Tage seit dem 01.01.1984
 
letzte Code-Änderung:
00 00 02 13 = 513 ms
24 38       = 9272 Tage
 
letzte Schnittstellen-Änderung:
04 00 BB 8B = 67156875 ms = 18 h 39 min 16 sec 875 ms
24 37       = 9271 Tage
```
 
Und dann hab ich auch noch mal das Ende ein bisschen unter die Lupe genommen:

Nach dem Programmcode kommt immer die 65 (HEX) als Einleitung zum Bausteinende.

Dann die Baussteinschnittstelle (IN, OUT, IN_OUT, TEMP, RETURN) oder Netzwerkunterteilung (hab ich noch nicht herausgefunden), dann die jeweils 8 Zeichen Autor, Familie, Name und zu guter letzt die Versionsnummer und dann noch ein Schluss, den ich noch nicht entziffern konnte.


```
Versionsnummer (1 Byte):
 
01 = V 0.1
10 = V 1.0
 
min: 00 = V 0.0
max: FF = V 15.15
```
 
Ich hoffe, dass ich mich verständlich ausgedrückt habe und das was ich gerade verzapft habe auch jemand versteht, ist ja auch schon 3 Uhr nachts... 

So und jetzt darf mal wieder jemand anderes was herausfinden... 

Und ich probier mal das Datenbankdingens aus... :TOOL:


----------



## Thomas_v2.1 (21 Mai 2009)

Human schrieb:


> So und jetzt darf mal wieder jemand anderes was herausfinden...
> 
> Und ich probier mal das Datenbankdingens aus... :TOOL:



Ich habe ein Testprogramm in Visual C# 2005 geschrieben mit dem sich die Datenbank-Dateien eines Step7-Projektes einlesen lassen.

So ein paar Auswertungen habe ich drin, wie z.B. 
- Symbolik auslesen
- Datenbausteine auslesen (inklusive Konvertieren/Export in eine CSV-Datei)
- Auslesen der Variablendeklarationen und MC7-Hex Code von FCs / FBs

Da das eine große Baustelle ist bitte bei Interesse eine PN an mich, dann schicke ich das Programm mit Quellcode zu.

Andere Teile habe ich noch in Perl geschrieben weil man damit auch recht einfach dBase-Dateien einlesen kann. Z.B. um ein CPU-Passwort aus dem Projekt bzw. einer wld-Datei wieder in Klartext zu verwandeln.


----------



## Thomas_v2.1 (21 Mai 2009)

Kleiner Screenshot im Anhang...


----------



## Human (21 Mai 2009)

Hört sich nicht schlecht an (Hast Post)! :TOOL:

Aber ich dachte in dem Thread würde es darum gehen wie man den MC7-Code, der sich in einer CPU befindet wieder zurückzubilden in AWL bzw. den AWL-Code in ein Programm, das von der CPU nutzbar ist zu wandeln??? :shock:


----------



## Human (23 Mai 2009)

So, hab die letzten 30 Stunden nun fast ununterbrochen am Stück an dem Programm gebastelt, das sich da im Anhang befindet.

Ganz kurz zur Funktion: Das Programm lädt aus einer S7-CPU über Ethernet die Bausteine herunter und generiert aus dem MC7-Code den passenden AWL-Code.

1. IP eingeben
2. Programme aus CPU lesen
3. Doppelklick auf den gewünschten Baustein

Geht bis jetzt nur mit einer Ethernet-CPU bzw. WinAC, ich hab dafür eine CPU 315 2PN/DP dafür im Einsatz (steht irgendwo im Haus rum) 

Was noch fehlt:
- Netzwerkunterteilungen
- Schnittstellenbeschreibung
- Sprünge
- Bausteinaufrufe

Dann hab ich da noch ein paar kleine Ergänzungen in die MC7-Tabellen gemacht.

Im Anhang ein Screenshot.

@ Zottel
Die Funktionen mit dem Upload der Programme funktioniert ja schon ganz gut, aber irgendwie hab ich bisher noch keine Funktion gefunden Bausteine wieder zurückzuschreiben bzw. wird es die in Zukunft geben? :TOOL:


----------



## Zottel (23 Mai 2009)

Human schrieb:


> @ Zottel
> Die Funktionen mit dem Upload der Programme funktioniert ja schon ganz gut, aber irgendwie hab ich bisher noch keine Funktion gefunden Bausteine wieder zurückzuschreiben bzw. wird es die in Zukunft geben? :TOOL:


Da mußt du mir erstmal sagen, welche Richtung du mit "upload" meinst?
Beide Richtungen sind seit Jahren dabei:
SPS -> Datei: testISO_TCP.exe --readout
Datei -> SPS: testISO_TCPload.exe

Vom "produktiven" Einsatz des zweiten Programms würde ich abraten. Bei den SDBs muß man m.W. eine bestimmte Reihenfolge einhalten. Es mögen auch andere Risiken und Nebenwirkungen möglich sein.


----------



## Thomas_v2.1 (23 Mai 2009)

@Human: Das sieht doch schonmal gut aus!

Was haltet ihr davon eine OP-Code Tabelle in einem allgemeingültigen Format aufzustellen?
Ich denke da z.B. an eine XML oder CSV-Datei. Somit hätte man nur eine Datei die es zu pflegen gilt, und jeder könnte diese je nach Verwendung in sein eigenes Programm einlesen.

Als Grundlage könnte man z.B. den Aufbau wie im Programm mc5decode machen:

```
struct symboltabelle
{
  unsigned short code;    // MC5 Code
  unsigned short code1;   // MC5 Code (32 Bit)
  unsigned int   codelen; // Länge des MC5 Codes in Bits
  unsigned int   parlen;  // Länge der auf den code folenden Parameter un Bits
  unsigned int   cmask;   // Zum Ausmaskieren des Codeteils
  unsigned int   pmask;   // Zum Ausmaskieren des Parameterteils
  char         * operation; // Operation im Klartext
  char         * operand;   // Operand im Klartext;
  char         *(*printpar)(unsigned int parameter);
};
typedef struct symboltabelle symtab_t;
```
Damit es sprachunabhängig ist, müsste man die Callbackfunktion für printpar noch umschreiben, z.B. in einem Formatstring à la printf.


----------



## Human (24 Mai 2009)

@ Zottel
Jetzt wo du es sagst seh ich es auch, dass es die gibt... :shock:
...und hab mir die auch mal ein bisschen angeschaut und hab da keinen Plan was was da passiert... 
So eine einfache 3 Funktionen wie Upload-Funktionen, das sieht irgendwie kompliziert aus?

@ Thomas
Mich würde interessieren wie du da den CALL-Befehl oder Befehle der indirekten Addressierung reinkriegen willst!


----------



## Zottel (24 Mai 2009)

Human schrieb:


> So eine einfache 3 Funktionen wie Upload-Funktionen, das sieht irgendwie kompliziert aus?


Damit ich den obenstehenden Satz zu verstehe, solltest du ihn neu formulieren. Damit ich seinen Sinn erraten könnte, soltest du meine vorige Frage beantworten: 'Da mußt du mir erstmal sagen, welche Richtung du mit "upload" meinst?'
Der kompliziertere Vorgang ist der zum Laden eines Bausteins in die CPU.
Das geschieht in etwa so:
1 PG sagt der CPU, daß es einen bestimmten Baustein in die CPU laden will.
2 CPU fordert Bausteindaten vom PG an.
3 PG sendet soviel Daten, wie in eine PDU passen und sagt, ob mehr folgen.
4 Wenn ja, weiter bei 2
5 Nun existiert der neue Baustein im Speicher der CPU. Vermutlich wird er aber noch noicht ausgeführt.
6 PG schickt den request mit dem Wort "INSERT". Vermutlich wird daraufhin der alte durch den neuen Baustein ersetzt.

Beachte, daß zwischen 1 und 2 die CPU sozusagen die Rolle des Initiators für den weiteren Dialog übernimmt.


----------



## SPS_PC (26 Mai 2009)

Hi Human,

die Netzwerkaufteilung steht meiner Meinung nach am Bausteinende
nach HexCode 55, gefolgt von der Anzahl der Netzwerke
erst Low dann Highbyte. Die folgenden Bytes geben die Länge des Netzwerks an. Auch wieder Low- dann Highbyte.

Nicht wundern wenn nur ein paar Einträge möglich sind.
Wenn mehr Netzwerke angelegt werden vergrösser sich das Feld.
Beim Löschen von Netzwerken wird das Feld aber nicht mehr verkleinert.


Beispiel

0:x55 Kennung
0:x02 Anzahl NW's Low => 2 NW's
0:x00 Anzahl NW's High
0:x04 Länge 1. NW Low
0:x00 Länge 1. NW High
0:x06 Länge 2. NW Low
0:x00 Länge 2. NW High


----------



## Human (26 Mai 2009)

Sodele und ich hab mal ein bisschen was an der Snittstellensuche gemacht, bei den OBs, FCs und SFCs funktioniert das schon.

Was jetzt noch nicht funktioniert ist wenn ein Befehl auf die Ret_Val-, In-, Out-, In_Out-Parameter zugreift, dann ist die Zeile noch leer, weil ich das über einen ganz anderen Speicherbereich geht, der über die Schnittstelle herausgelesen werden muss, ein bisschen komisch, die Netzwerke kommen in den nächsten Tagen auch noch, was mir noch ein bisschen Sorgen macht ist wo die Schnittstellenlänge bei den FBs und SFBs stehen, das ist irgendwie anders als bei den OBs, FCs und SFCs oder ich muss die Bytes dann drehen, bin noch da dran, wenn ich das habe dann sag ich auch wie das dann ganz funktioniert.

Im Anhang mal die aktuelle Version, meiner MC7-Doku, es sind die UC- und CC-Befehle noch hinzugekommen, wie auch die indirekte Addressierung und die Pointerbefehle (sind auch schon im Programm drin)... wegen dem CALL-Befehl bin ich noch nicht wirklich weiter gekommen, der ist echt zu hart...

Und das mit dem Netzwerken fehlt mir auch noch ein wenig und DBs sind auch noch nicht die Stärke des Programms...


----------



## SPS_PC (27 Mai 2009)

Hi Human

was fehlt dir denn genau mit bei den Netzwerken?
War mein Beispiel nicht Aussagekräftig genug?


----------



## Human (27 Mai 2009)

@SPS_PC
Das Beispiel ist super, aber das fängt ja auch nicht einfach so mal an weils lustig ist, sondern da kommen ja zuerst die Ganzen Schnittstellensachen und dann die Eigenschaften (Name, Familie usw.) und dann kommen ja die Netzwerke und das muss man ja auch irgendwie rauskriegen (hier mal ein Längenangabe, dann mal eine fest definierte Länge usw...), ich glaub ich hab heute abend mal wieder eine ruhige Minute in der ich das mal wieder ein bisschen näher an mich ranführen kann... 
und dann sollte ich das auch noch für die anderen Verbindungstypen zuganglich machen... wer hat außer mir schone eine Ethernat-Spiel-CPU rumstehen?


----------



## Human (5 Juni 2009)

Sodele, hab mal wieder ein bisschen Zeit gefunden und hab meine Schnittstellensuche beendet und hab dann auch gleich noch eine seperate Anzeige für Datenbausteine eingabaut, die allerdings noch nicht ganz fertig ist. 

Wie die Schnittstellenbeschreibung aufgebaut ist und DBs usw. schreib ich demnächst auch mal auf und meine Quellen stell ich dann auch mal rein, aber kann ich so noch nicht!


----------



## Human (7 Juni 2009)

Und schon wieder ist ein wunderschönes Wochenende vorbei und ich war nicht ganz untätig.

Es sind noch ein paar Bausteinangaben dazugekommen wie Autor, Famile, Name, Version, uvm., die Addressierung der Datenbausteine müsste jetzt stimmen und die Aktualwerte der Datenbausteine werden auch noch angezeigt.

An dieser Stelle möchte ich mich dann auch mal an der Mithilfe von Rainer Hönle bedanken, der mir mit der einen Seite aus seinen privaten Archiven sehr sehr weitergeholfen hat (die Seite wird noch eingerahmt )!

Dann möchte ich mich noch bei Zottel bedanken, der mir bisher immer mit seinem Rat zur Seite stand.


Dann werde ich auch gerade hin und wieder auf die Ziele meiner Arbeit gefragt.
Ich mache das was ich mache einfach so just for fun! Ich beabsichtige nicht eine neue Super-Programmiersoftware a la Step7 zu kreieren und das sowieso nicht aus verschieden Gründen:
1. Würde das wahrscheinlich keine Sau nutzen (nichtmal ich!!!),
2. Hab ich dazu keine Zeit, Siemens hat das ja auch nicht über Nacht gemacht und ich hab auch keine anderen Programmierer.
3. Eigentlich will ich damit nur meine Kollegen die lieben SPS-Programmierer ein bisschen überwachen können, die immer behaupten: "Jaja, ich hab alles richtig, bei mir tut das!", ohne dass ich immer mein Step7-Laptop mitschleifen muss. *ROFL*

Und dann noch was zum Anhang:

Ich würde mich sehr über ein Feedback freuen!!!


----------



## SPS_PC (11 Juni 2009)

ich habe endlich auch ein bisschen Zeit gefunden und weiter
am MC7-Code geforscht. Das Ergebnis sieht wie folgt aus

++++++++++++++ Übergabeparameter +++++++++++++++++++++++++
Bsp.: 1
...... // MC7-Code
0x 65, 0x 00, // MC7-Code Bausteinende
0x 01, // ??
0x 01, 0x 00, // Bausteinnummer low+high hier 1
0x 00, 0x 00, // Länge der Parameter low+high in Byte hier 0
0x 00, 0x 00, // ??
0x vv, // ??
0x 02, 0x 00, // Anzahl Netzwerke low+high
0x 08, 0x 00, // Länge NW 1
0x 0C, 0x 00, // Länge NW 2


Bsp.: 2
...... // MC7-Code 
0x 65, 0x 00, // MC7-Code Bausteinende
0x 01, // ??
0x 0A, 0x 00, // Bausteinnummer low+high hier 10
0x 04, 0x 00, // Länge der Parameter in Byte hier 4
0x 00, 0x 00, // ??

0x bb, 0x cc, // 1. Parameter 
0x 02, 0x 01, // 2. Parameter
0x vv // ??
0x 02, 0x 00, // Anzahl Netzwerke low+high
0x 08, 0x 00, // Länge NW 1
0x 0C, 0x 00, // Länge NW 2
.....

// ----------- Beschreibung ---------------------
bb = Datentyp des Parameters
01 = Bool
02 = Byte
03 = Char
04 = Word
05 = Int
06 = DWord
07 = DInt
08 = Real
09 = Date
0A = Time of Date
0B = Time
0C = S5Time
0D =
0E = Date_And_Time
0F = 
10 = Array z.B 10 02 02 = out
.....................01 = ?? Beginn der Deklaration
.....................14 = low Byte Startwert
.....................00 = high Byte Startwert Array hier 20
.....................19 = low Byte Endwert Array 
.....................00 = high Byte Endwert hier 25
.....................05 = DatenTyp des Arrays hier Int
.....................02 = ?? Ende der Deklaration
11 = UDT z.B 11 01 01 = in
...................02 = Anzahl der Deklarationen
...................04 02 = Word out
...................01 02 = Bool out
13 = String z.B 13 01
.....................FE
14 = Pointer
15 = 
16 = Any
FE = String

cc = Typ des Parameters
01 = in
02 = out
03 = in_out
04 = stat
05 = temp
06 = Ret_Val

vv = ??????



__________________________________________________________
+++++++++++++++++++ Autor Familie usw... +++++++++++++++++
0x 2, 0x 0, 0x 8, 0x 0, 0x C, 0x 0, // NW Angaben dieser Bereich 
ist in der Länge variabel
0x 0, 0x 0, 0x C, 0x 0, 0x C, 0x 0, 0x 0, 0x 0, 
0x F, 0x 0, 
0x4A, 0x41, 0x4A, 0x41, 0x4A, 0x41, 0x4A, 0x41, // Autor
0x54, 0x65, 0x73, 0x74, 0x54, 0x65, 0x73, 0x74, // Familie
0x42, 0x41, 0x55, 0x42, 0x41, 0x55, 0x42, 0x41, // Name
0x67, // Version 6.7 
0x 0, 0xC5, 0xE3, 0x 0, 0x 0, 0x 0, 0x 0, 0x 0, 0x 0, 0x 0, 0x 0, 


Human hätte ich dein Tool eher gesehen, hätte ich mir viel Arbeit sparen
können. Dein Tool ist echt gut. Nur bei dem Übergabeparameter "string"
stimmt was nicht. Vielleicht kannst du ja mal deine Erkenntnisse mit meinen vergleichen.


----------



## Human (11 Juni 2009)

> 11 = UDT


Naja, kann UDT sein, aber eigentlich ist es STRUCT, lade mal deinen Baustein in die CPU und lade ihn wieder in ein anderes Projekt zurück, dann kommt ein STRUCT raus mit dem was im UDT drinstand! 



> Human hätte ich dein Tool eher gesehen, hätte ich mir viel Arbeit sparen
> können. Dein Tool ist echt gut. Nur bei dem Übergabeparameter "string"
> stimmt was nicht. Vielleicht kannst du ja mal deine Erkenntnisse mit meinen vergleichen.


 
Endlich mal ein Feedback, ich danke dir!
Den String hatte ich irgendwie vergessen... mach ich jetzt mal rein...


----------



## Human (12 Juni 2009)

Du hast den Spaß mit den Startwerten vergessen:



> cc = Typ des Parameters
> 01 = in
> 02 = out
> 03 = in_out
> ...


09 = in mit Startwert
0A = out mit Startwert
0B = in_out mit Startwert
0C = stat mit Startwert



> 0x 04, 0x 00, // Länge der Parameter in Byte hier 4
> 0x 00, 0x 00, // ??


?? = Länge der Startwerte auch in Byte


----------



## SPS_PC (12 Juni 2009)

Mit den Startwerten war ich noch nicht so weit,
deshalb hab ich es weggelassen. Da du sonst keine Einwende hast, gehe ich mal davon aus, dass meine Annahmen (Angaben) stimmen.

Heute will ich mich mal die DB's machen. Der Kopf und das Ende sieht auf den ersten Blick aus wie bei den anderen Bausteinen.


----------



## SPS_PC (12 Juni 2009)

So hier noch ein Bsp für die Startwerte

......
0x 01, 0x 00
0x 04, 0x 00  // 4 Byte Parameter
0x 03, 0x 00  // 3 Byte Startwerte
0x 02, 0x 09  // Byte,  in mit Startwert
0x 04, 0x 0C  // Word, stat mit Startwert
0x CC           // 1. Startwert Byte mit Wert 'CC'
0x BB, 0x 00  // 2. Startwert Word mit wert '00 BB'
......


----------



## Human (12 Juni 2009)

Im DB steht alles im STAT-Interface in einem STRUCT und wo sonst der Pogrammcode ist sind die Aktualwerte des Bausteins und sonst ist eigentlich alles gleich!


----------



## Human (14 Juni 2009)

Hab mal wieder das Wochenende genutzt und wieder was gemacht:

- den Typ String hinzugefügt,
- den AWL-Text strukturiert,
- alle NoDave-Verbindungen eingefügt (ich denke mal, dass nicht alle funktionieren)
- bisschen am Layout was herumgeschraubt,
- eine Korrektur in der Doku bei den UC/CC-FC-Aufrufen,
- ein paar kleine Bugs entfernt

[ironie]
Wie immer freue ich mich jetzt schon, dass niemand was dazu schreibt...
[/ironie]


----------



## FlorisV (14 Juni 2009)

Maybe you do not get much reaction, but your contributions are read !

In your doc's I couldn't find:

U OS
U OV
U >0
U <0
U UO
U <>0
U ==0
U >=0
U BIE

also same list for UN, O, ON, X, and XN.

mc7.exe gets me only a list of OB's and DB's when I try it on the current PLC's I work on (all VIPA), than it stops and does nothing. Will try latest version next week.


----------



## Human (14 Juni 2009)

FlorisV schrieb:


> Maybe you do not get much reaction, but your contributions are read !
> 
> In your doc's I couldn't find:
> 
> ...


I didn't know that this operations exist... thank you (in you docs it is not too!) 

If you (or someone else) knows exotic undocumented operators like this tell it me! 



FlorisV schrieb:


> mc7.exe gets me only a list of OB's and DB's when I try it on the current PLC's I work on (all VIPA), than it stops and does nothing. Will try latest version next week.


 
I think this is because this problem: http://www.sps-forum.de/showthread.php?t=27801

It is fixed in the new version! 

[EDIT]
Die oben genannten fehlenden Operatoren sind jetzt auch implementiert!

Noch was zu den oben genannten Datenbausteinen:
Die normalen DBs haben nur ein STAT-Interface, die Instanz-Datenbausteine haben auch ein IN, OUT, IN_OUT und STAT-Interface, sollte ich vielleicht in der nächsten Version auch noch hinzufügen...
[/EDIT]


----------



## FlorisV (15 Juni 2009)

Human schrieb:


> I didn't know that this operations exist... thank you (in you docs it is not too!)


 
Haven't updated my online docs yet. Want it to be as complete as possible before I dothat again. Yesterday I started on comparing our docs, and found this. A complete compare will take some time (Time is a critical resource here...)



Human schrieb:


> It is fixed in the new version!


 
Yep, now it works for me!



Human schrieb:


> [ironie]
> Wie immer freue ich mich jetzt schon, dass niemand was dazu schreibt...
> [/ironie]


 
Maybe you are going too fast for us...


----------



## Human (15 Juni 2009)

> 10 = Array z.B 10 02 02 = out
> .....................01 = Anzahl der Dimensionen
> .....................14 = low Byte Startwert
> .....................00 = high Byte Startwert Array hier 20
> ...


 
Das eine unbekannte Byte ist mir durch einen Zufall (SFB32) einfach so in die Hände gefallen!


----------



## Human (18 Juni 2009)

Und mal wieder ein bisschen was erweitert:

- Die Aufteiung durch die Netzwerke werden angezeigt,
- Die Bausteine sind in englischer und deutscher Mnemonik anzeigbar,
- hab noch einen fehlenden Operator gefunden (TAK) und in Programm wie auch Doku aktualisiert,
- kleinere Fehlerbehebungen

Und da ist es :


----------



## Thomas_v2.1 (19 Juni 2009)

Was mir gerade aufgefallen ist: wenn man einen komplett leeren Baustein auslesen will gibt es einen Fehler wegen Zugriffsverletzung.

Ansonsten ist das ja schon ziemlich vollständig oder? (Bis auf Parameter...)


----------



## Human (19 Juni 2009)

Naja, was noch fehlt ist der von mir etwas verhasste "CALL"-Befehl...

Die Parameter... ja, die fehlen im AWL-Code auch noch, bin leider noch nicht ganz dazu gekommen...

Und wegen der Zugriffsverletzung muss ich mal schauen, was da passiert... kannst du mir den Baustein mal in einem S7-Projekt schicken, dann weiß ich genau was du meinst! 

Was mir jetzt allerdings noch richtig Sorgen macht sind die SDBs, die sehen irgendwie ganz komisch aus... ich tippe mal darauf, dass das einfach die Hardeware-Konfiguration ist, aber um das herauszufinden bin ich glaube ich nochmal genau so lange beschäftigt bis das geht, ist ja ein relativ komplexes Thema...

[EDIT]
Brauchst mir den Baustein doch nicht zu schicken, hab den Fehler doch gleich gefunden, DANKE!!!

Update im Anhang!
[/EDIT]


----------



## Thomas_v2.1 (19 Juni 2009)

Human schrieb:


> Und wegen der Zugriffsverletzung muss ich mal schauen, was da passiert... kannst du mir den Baustein mal in einem S7-Projekt schicken, dann weiß ich genau was du meinst!


Ich habe einfach einen neuen FC erzeugt und diesen direkt in die SPS geladen. Kann aber auch sein dass es an meiner Test-SPS hier liegt - ich will nichts beschwören.


Human schrieb:


> Was mir jetzt allerdings noch richtig Sorgen macht sind die SDBs, die sehen irgendwie ganz komisch aus... ich tippe mal darauf, dass das einfach die Hardeware-Konfiguration ist, aber um das herauszufinden bin ich glaube ich nochmal genau so lange beschäftigt bis das geht, ist ja ein relativ komplexes Thema...



Im SDB 999 sind schonmal Routing Informationen / HW Konfig, das hab ich dank Ralle gerade im Siemens Forum gelesen:
http://www.automation.siemens.com/WW/forum/guests/PostShow.aspx?language=de&PostID=125362


----------



## Human (19 Juni 2009)

Thomas_v2.1 schrieb:


> Ich habe einfach einen neuen FC erzeugt und diesen direkt in die SPS geladen. Kann aber auch sein dass es an meiner Test-SPS hier liegt - ich will nichts beschwören.


Ich glaube nicht wirklich, dass es da wirkliche Unterschiede bei der Erzeugung der Bausteine gibt, was mir aufgefallen ist, dass die Bausteine in der SPS erst geprüft werden, ob sie gültig sind, z.B. wenn ich in meiner CPU 315 2 PN/DP ein "ENT" oder "LEAVE" drinnen habe macht der kurz was und sagt dann, dass da was Böses drinnen ist...



Thomas_v2.1 schrieb:


> Im SDB 999 sind schonmal Routing Informationen / HW Konfig, das hab ich dank Ralle gerade im Siemens Forum gelesen:
> http://www.automation.siemens.com/WW/forum/guests/PostShow.aspx?language=de&PostID=125362


 
Werd mir das mal, in nächster Zeit zu Gemüte führen, wenn ich den Rest, der noch in Planung ist umgesetzt ist... jetzt erstmal die grundlegende AWL-Übersetzung fertig machen!


----------



## Human (24 Juni 2009)

Bin mal wieder dazugekommen was an dem Programm was zu machen.

Aktuelle Änderungen/Erweiterungen:
- Schnittstellen für Instanzdatenbausteine hinzugefügt (IN, OUT, usw.),
- Schnittstellenvariablen werden im Programm angezeigt,
- und noch ein paar Kleinigkeiten zurechtgebogen


----------



## Thomas_v2.1 (27 Juni 2009)

Irgendwas passt da mit den Adressregisterfunktionen noch nicht.

Ich habe mal ohne Sinn in einen FC

TAR1  MD    10
+AR1  P#10.0
LAR1  MD    10

geschrieben, dann wird:
         TAR1     MD       10

         U        DIX      65075.0
ausgegeben.


----------



## Human (29 Juni 2009)

Danke für die Rückmeldung!

Ich sitze gerade irgendwo in  den USA am Flughafen und komme erst wieder in 2 Wochen an meinem heimischen PC auf dem ich das ändern kann, werde ich aber dann sofort erledigen!


----------



## FlorisV (6 Juli 2009)

Spend considerable time last weekend while comparing disassemblers and documentation, and came up with the following:
1) I'm working with VIPA PLCs, access via ISO on TCP. Some files I uploaded using MC7.exe contained a whole series of "NOP 0" at the end of the code, and some parts of code I was expecting were missing. 
Much later I discovered the "testISO_TCP" delivered with Libnodave also did not seem to work correctly in this setup. Although I had a lot of large blocks in my PLC (>32k), the larges one I got using "testISO_TCP -d --readoutall" was 11k. 

I believe this is caused by the following line in "doUpload()", nodave.c (version 0.8.4.4):

```
netLen=p2.data[1] /* +256*p2.data[0]; */ /* for long PDUs, 
I guess it is so */;
```
The (original) comment here suggests the packetlength could also be 2 byte. Looking at the generated debug data I was convinced in my case the netLen should be made up from both p2.data[1] and p2.data[0], so I changed this line accoding to the suggestion in the comment: 

```
netLen=p2.data[1] +256*p2.data[0]; /* for long PDUs, I guess it is so */;
```
After change and recompile the "testISO_TCP -d --readoutall" works fine. 
When I switched the original dll that came with mc7.exe with this recompiled one I get the results I expect. Seems like the authors guess was right!

I'm using the following VIPA PLC:
CPU with Ethernet-PG/OP
Slot 100 
VIPA 315-2AG12 V3.4.2 Px000078.pkg, SERIALNUMBER ..... 
SUPPORTDATA : PRODUCT V3420, HARDWARE V0111, 5679G-V10 , HX000026.100 , Bx000227 V6420, Ax000086 V1200, Ax000056 V0000, fx000007.wld V1120, : 
Slot 201 
VIPA 342-1DA70 V3.1.9 Px000062.pkg, SUPPORTDATA : PRODUCT V3190, BB000218 V5190, AB000068 V4160, 
ModuleType CB2C0010​Now this was working I really started to appreciate yor work! 
2) Comparing the output of two disassemblers, I found and corrected many flaws in my own one :-(.

The AWL code below for FC21 contains the instructions which I think are not correctly disassembled in mc7.exe.
​Looking forward to the next version!


----------



## Zottel (8 Juli 2009)

When I wrote Libnodave, I did only had a 315 at my disposal. Although I guessed right, I decided to stay on the safe side because if the data[0] field served for other purposes, any value above 4? (buffer size / 256) would lead to overflow problems.
There are some more issues with PDU length >240. I plan to update Libnodave code as soon as I find time to do so.


----------



## FlorisV (10 Juli 2009)

Ok, Thanks

btw, found the same behaviour with the following hardware:
416-2DP                (6ES7 416-2XN05-0AB0 / V5.1)
CP443-1 Advanced  (6GK7 443-1EX41-0XE0 / V1.0)​are you interested in the "testISO_TCP --readoutall" debug output of these systems?


----------



## zskecskemeti (13 August 2009)

hallo,

könnte mir bitte jemand sagen, was zwischen NW's und author+family+name+version ist (und wovon haengt es ab wie lang es ist)?

3 beispiele (blau markiert):


```
...snip...
E1 84 D8 84 83 00 98 0A  A3 00 98 0C [COLOR=Red]65 00[/COLOR] 01 01
00 [COLOR=Silver]00 00 00 00[/COLOR] 01 [COLOR=Silver]06 00[/COLOR]  16 00 1A 00 08 00 08 00 
04 00 04 00 [COLOR=DeepSkyBlue]00 00 00 00[/COLOR]  41 54 41 54 41 54 41 54
46 54 46 54 46 54 46 54  4E 54 4E 54 4E 54 4E 54
22 00 1B 87 00 00 00 00  00 00 00 00
```


```
...snip...
[COLOR=Red]65 00[/COLOR] 01 05 00 [COLOR=Silver]00 00 00  00[/COLOR] 01 [COLOR=Silver]0A 00[/COLOR] 08 00 08 00
14 00 0A 00 14 00 0A 00  04 00 04 00 04 00 04 00
[COLOR=DeepSkyBlue]00 00[/COLOR] 41 54 41 54 41 54  41 54 46 54 46 54 46 54
46 54 4E 54 4E 54 4E 54  4E 54 22 00 5B BC 00 00
00 00 00 00 00 00
```


```
...snip...
00 0C [COLOR=Red]65 00[/COLOR] 01 20 00[COLOR=Silver] 12  00 [/COLOR][COLOR=Black][COLOR=Silver]00 00[/COLOR] [/COLOR][COLOR=Black]01 01 05 01 01
01 05 01 01 01 01 02 05  05 05 05 05 05 20 [/COLOR][COLOR=Black][COLOR=Silver]04 00
[/COLOR][/COLOR][COLOR=Black]12 00 12 00 10 00 1A 00  [/COLOR][COLOR=DeepSkyBlue]02 00 02 00 0B 00 0D 00[/COLOR]
41 54 41 54 41 54 41 54  46 54 46 54 46 54 46 54
4E 54 4E 54 4E 54 4E 54  22 00 3C 39 00 00 00 00
00 00 00 00
```
danke


----------



## Forscher (17 August 2009)

Meine Erkenntnisse zum Baustein-Header hab ich im (nicht ganz passenden) Thread 
http://www.sps-forum.de/showthread.php?t=28051 (Beitrag #8 ) veröffentlicht.
Vielleicht hilft es dir weiter.

Bei DBs war das Wort vornedran immer die Bausteinlänge.


----------



## zskecskemeti (18 August 2009)

Human: mc7-reader scheint die schnittstellenvariablen in manchen situationen falsch zu interpretieren

beispiel: SFC6 (RD_SINFO) [getestet mit: VIPA 315-2AG10-0331, 6ES7 416-3XR05-0AB0, 6ES7 318-2AJ00-0AB0]


```
70 70 01 09 01 0D 00 06  00 00 00 7E 00 00 00 00
03 B0 9C D2 11 0C 03 B0  9C D2 11 0C 00 30 00 04
00 00 00 02 65 00 01 00  00 29 00 00 00 [COLOR=Red]05 16 01[/COLOR]
[COLOR=RoyalBlue]11 02 08[/COLOR] [COLOR=DeepSkyBlue]02 02 02 02 02  02 02 02 02 02 02 02 04
02 06 02[/COLOR] [COLOR=RoyalBlue]11 02 08[/COLOR] [COLOR=DeepSkyBlue]02 02  02 02 02 02 02 02 02 02
02 02 04 02 06 02[/COLOR] 00 00  00 00 20 20 20 20 20 20
20 20 44 42 5F 46 55 4E  43 54 52 44 5F 53 49 4E
46 4F 10 00 00 00 00 00  00 00 00 00 00 00
```
das sind 


einmal ret_val int,
out struct [byte, byte, byte, byte, byte, byte, word, dword],
und nochmal out struct [byte, byte, byte, byte, byte, byte, word, dword]
mc7-reader zeigt in diesem fall mehrere return values, den ersten struct falsch, und den zweiten korrekt

grund: anstatt den normalen "05 06" für "ret_val int" ist hier "05 16 01"


----------



## zskecskemeti (18 August 2009)

Forscher: danke, aber den header habe ich schon (siehe anhang), ich wollte nur wissen was zwischen netzwerklaenge-definitionen und author-feld da ist


----------



## zskecskemeti (18 August 2009)

Human: es gibt probleme auch mit "stat" schnittstellenvariablen bei fb's, wo "fb" (0x15) oder "sfb" (0x1B) als datentyp da steht

beispiel:

```
70 70 01 01 03 0E 00 65  00 00 00 6C 00 00 00 00
03 14 C0 0E 24 91 03 14  C0 0E 24 91 00 1C 00 06
00 00 00 02 65 00 01 65  00 14 00 00 00 [COLOR=Red]1B 05 00[/COLOR]
[COLOR=Gray]11 04 07[/COLOR] [COLOR=Silver]01 01 0B 01 01  02 0B 02 02 04 0B 04 0B
04[/COLOR] 4E 01 00 00 00 00 00  41 31 30 31 41 31 30 31
46 31 30 31 46 31 30 31  4E 31 30 31 4E 31 30 31
10 00 D5 13 00 00 00 00  00 00 00 00
```
struktur: 
0x15/0x1B: fb/sfb, danach fb/sfb-nummer (low/high), und ein struct* mit der kopie von der schnittstelle des (ref.) bausteins


(*: das soll der grund dafür sein, dass man bei structs den parametertyp (in/out/in_out,usw...) auch per item definieren muss)


----------



## Jochen Kühner (10 Juni 2010)

*Quellcode???*

Ist es möglich zu dem Programm auch den Quellcode zu erhalten?

Würde die Möglichkeit AWL Code umzuwandeln gerne in mein LibNodave Connection Library einbauen, aber das ganze nochmal zu machen wenn man den Quellcode viel. haben kann ist sonst zuviel arbeit!


----------



## Jochen Kühner (15 Juni 2010)

Danke an Human nochmal für den Code zu seinem MC7.exe.

Ich habe das ganze mit einem Tool nach C-Sharp konvertiert und in meine Library eingebaut! Auch sind bei mir jetzt die Call's implementiert (hoffe soweit richtig!)


----------



## Human (15 Juni 2010)

Nur der Vollständigheit halber, könntest du das kurz erläutern wie du dabei vorgegangen bist bzw. wie die aussehen? :shock:


----------



## Jochen Kühner (15 Juni 2010)

Human schrieb:


> Nur der Vollständigheit halber, könntest du das kurz erläutern wie du dabei vorgegangen bist bzw. wie die aussehen? :shock:



Sobald Ich etwas Feedback dazu bekommen habe ob meine implementierung richtig ist. Wenn du's testen willst:

http://jochensserver.dyndns.org/wordpress/?page_id=55

Hier gibt's den Quellcode und ein Testprogramm (testWpfC).


----------



## Jochen Kühner (16 Juni 2010)

SO habs nun mit noch ein paar Bausteinen durchgetestet... Denke mal es funktioniert soweit.

Call in Step7

ein UC sieht ja normalerweise so aus:

3D 01 70 0B 00 02

wobei die 02 bedeuten -> keine Parameter
04 -> 1 Parameter
06 -> 2 Parameter
usw...

Die Parameter sind ja dann schon in deiner doku beschrieben.

Wobei 87 nur für L und nicht für DB steht, da ja der DB wert in lokaldaten umgespeichert wird!

Und 84 == DB und 85 == DI aber nur für dirkete werte wie dbx0.0 ODER did4 nicht bei db.dbx diese werden in lokaldaten umgespeichert!


----------



## Jochen Kühner (16 Juni 2010)

Was fehlt noch im Excel Dokument:

UC FC [LWjjjj]
0xfb 0x60 0xjj 0xjj 0x70 0x0b 0x00 0x02

UC FC [DBWjjjj]
0xfb 0x50 0xjj 0xjj 0x70 0x0b 0x00 0x02

UC FC [DIWjjjj]
0xfb 0x40 0xjj 0xjj 0x70 0x0b 0x00 0x02


BEi CC statts 60, 50, 40 ==> 61 51 41


----------



## Jochen Kühner (16 Juni 2010)

Hab das in mein Programm gleich mal eingebaut...

http://jochensserver.dyndns.org/wordpress/?page_id=55


----------



## Jochen Kühner (6 Juli 2010)

*Doku...*

Hatt den jemand auch was in Textform zu dem aufbau der Parameter bzw. der DB Datenstruktur und Wertestruktur.

Ich hab zwar schon was aber aus dem Quellcode rauslesen ist ja umständlich! Dachte vielleicht hat das jemand bisschen dokumentiert?


----------



## umname2015 (21 Dezember 2015)

Hallo Thomas

können Sie mir das Testprogramm zu senden?
(can you send me that test program)?


----------



## Jochen Kühner (21 Dezember 2015)

An wen schreibst du denn? Um welches test Programm geht es?


----------



## Thomas_v2.1 (21 Dezember 2015)

Wie ich das aus seinem anderen Thread verstanden habe, will er einen SDB wieder in die Hardwarekonfiguration zurückübersetzen.
Ich wüsste nicht, dass sich da schonmal jemand dran gemacht hat die SDBs zu entschlüsseln.


----------



## umname2015 (22 Dezember 2015)

Sorry I mentioned wrong name!
Hi Jochen
I'm Looking for an open source  project that decrypt all Blocks which is in PLC memory(all OBs, all SFCs, All SFBs, All SDBs ,...). At this moment, I got all blocks in MC7 format using Libnodave, but just decoded only OBs and FCs and FBs by DotNetSiemensToolbox.dll, not SDBs and DBs. how can I decode this blocks(SDBs and DBs) and read original content Written by SIMATIC S7?
Regards


----------



## Thomas_v2.1 (22 Dezember 2015)

umname2015 schrieb:


> how can I decode this blocks(SDBs and DBs) and read original content Written by SIMATIC S7?


Open it with a hex editor, reverse engineer the data format, write code which interpretes these files.
If you are complete, push the code back to Jochens toolbox sourcecode.


----------



## umname2015 (23 Dezember 2015)

Please let me know about Jochens Toolbox, and how can I get the source code!


----------



## Rainer Hönle (23 Dezember 2015)

Look at Jochens signature above ;-)


----------



## umname2015 (23 Dezember 2015)

Yeah I know but I can not open the links in that page.


----------



## Jochen Kühner (24 Dezember 2015)

look here : https://github.com/dotnetprojects/DotNetSiemensPLCToolBoxLibrary


----------



## dau2020 (22 April 2020)

*Parser Fehler MC7->DB*

Hallo Jochen,

ich versuche einen MC7-DB mit Deiner ToolBoxLibrary zu Dekompilieren, leider kommt es zu einem Fehler in GetInterface. Scheinbar wird die Struktur nicht korrekt geparst, beim Aufruf von FillActualValuesInDataBlock kommt es dann zum Schreiben außerhalb des definierten Bereiches der "actualValueBytes". Kannst du mir helfen, an welcher Stelle das Parsen fehlschlägt?
BTW: Der DB kommt aus einer SIMATIC S7-300 CPU 319-3 PN/DP.

Anhang anzeigen DB1806.txt


Danke im Vorraus.

Gruß,
Andreas


----------



## Jochen Kühner (25 April 2020)

Die Struktur Parsen geht ja, die Frage ist, stimmt die?
Bei den Werten muss man schauen wo es fehlschlägt, bzw. Wie weit die Werte stimmen.
Dann muss man halt schauen was falsch gemacht wird

```
DB1806
000.0: ROOTNODE: STRUCT
000.0: 	IN: STRUCT
000.0: 		IN0: BOOL
001.0: 		IN1: BYTE := 255
002.0: 		IN2: WORD := 5000
004.0: 		IN3: WORD := 500
006.0: 		IN4: INT := 1
008.0: 		IN5: INT
010.0: 		IN6: INT
012.0: 		IN7: INT
014.0: 	OUT: STRUCT
014.0: 		Out0: BOOL
014.1: 		Out1: BOOL
016.0: 		Out2: DWORD
020.0: 	IN_OUT: STRUCT
020.0: 	STATIC: STRUCT
020.0: 		STAT0: WORD
022.0: 		STAT1: INT
024.0: 		STAT2: INT
026.0: 		STAT3: INT
028.0: 		STAT4: INT
030.0: 		STAT5: INT
032.0: 		STAT6: INT
034.0: 		STAT7: BOOL
034.1: 		STAT8: BOOL
034.2: 		STAT9: BOOL
034.3: 		STAT10: BOOL
034.4: 		STAT11: BOOL
034.5: 		STAT12: BOOL
034.6: 		STAT13: BOOL
035.0: 		STAT14: BYTE
036.0: 		STAT15: INT
038.0: 		STAT16: WORD
040.0: 		STAT17: INT
042.0: 		STAT18: INT
044.0: 		STAT19: WORD
046.0: 		STAT20: WORD
048.0: 		STAT21: WORD
050.0: 		STAT22: WORD
052.0: 		STAT23: WORD
054.0: 		STAT24: BYTE
056.0: 		STAT25: INT
058.0: 		STAT26: WORD
060.0: 		STAT27: ARRAY [1..240] OF BYTE
300.0: 		STAT28: STRUCT
300.0: 			STAT29: STRUCT
300.0: 				STAT30: BOOL := True
300.1: 				STAT31: BOOL := True
300.2: 				STAT32: BOOL := True
300.3: 				STAT33: BOOL
301.0: 				STAT34: BYTE := 255
302.0: 				STAT35: WORD := 1
304.0: 				STAT36: WORD := 3456
306.0: 				STAT37: WORD := 3456
308.0: 				STAT38: ARRAY [0..3] OF BYTE
312.0: 				STAT39: WORD
314.0: 				STAT40: WORD := 1000
316.0: 			STAT41: STRUCT
316.0: 				STAT42: BYTE
317.0: 				STAT43: BYTE := 1
318.0: 				STAT44: WORD := 500
320.0: 				STAT45: WORD := 1500
322.0: 			STAT46: STRUCT
322.0: 				STAT47: BYTE
323.0: 				STAT48: BYTE := 1
324.0: 				STAT49: WORD := 500
326.0: 				STAT50: WORD := 1500
328.0: 			STAT51: STRUCT
328.0: 				STAT52: BOOL
329.0: 				STAT53: BYTE
330.0: 				STAT54: WORD := 60
332.0: 				STAT55: TIME_OF_DAY := 01.01.0001 03:05:00
336.0: 		STAT56: FB1805
336.0: 		STAT57: STRUCT
336.0: 			STAT58: BOOL
336.1: 			STAT59: BOOL
338.0: 			STAT60: WORD
340.0: 			STAT61: WORD := -1
342.0: 			STAT62: ANY
352.0: 			STAT63: ANY
362.0: 			STAT64: ANY
372.0: 			STAT65: BOOL
372.1: 			STAT66: BOOL
372.2: 			STAT67: BOOL
372.3: 			STAT68: BOOL
374.0: 			STAT69: WORD
376.0: 			STAT70: BOOL
376.1: 			STAT71: BOOL
376.2: 			STAT72: BOOL
378.0: 			STAT73: WORD
380.0: 			STAT74: STRUCT
380.0: 				STAT75: STRUCT
380.0: 					STAT76: BYTE
381.0: 					STAT77: BYTE := 1
382.0: 					STAT78: WORD := 500
384.0: 					STAT79: WORD := 1500
386.0: 				STAT80: STRUCT
386.0: 					STAT81: BYTE
387.0: 					STAT82: BYTE := 1
388.0: 					STAT83: WORD := 500
390.0: 					STAT84: WORD := 1500
392.0: 				STAT85: STRUCT
392.0: 					STAT86: REAL
396.0: 					STAT87: REAL
400.0: 					STAT88: REAL
404.0: 					STAT89: BYTE
406.0: 					STAT90: WORD
408.0: 					STAT91: DATE_AND_TIME
416.0: 					STAT92: DATE_AND_TIME
424.0: 					STAT93: DATE_AND_TIME
432.0: 				STAT94: STRUCT
432.0: 					STAT95: ARRAY [0..3] OF BYTE
436.0: 					STAT96: WORD
438.0: 					STAT97: WORD
440.0: 					STAT98: BOOL
441.0: 					STAT99: BYTE
442.0: 					STAT100: BYTE
444.0: 					STAT101: WORD
446.0: 					STAT102: WORD
448.0: 				STAT103: STRUCT
448.0: 					STAT104: BYTE
450.0: 					STAT105: WORD
452.0: 					STAT106: WORD
454.0: 				STAT107: WORD := -1
456.0: 				STAT108: ARRAY [0..63] OF STRUCT
456.0: 					STAT109: DWORD
460.0: 					STAT110: DATE_AND_TIME
468.0: 					STAT111: WORD
470.0: 					STAT112: DWORD
474.0: 					STAT113: REAL
478.0: 					STAT114: REAL
482.0: 					STAT115: REAL
2376.0: 			STAT116: STRUCT
2376.0: 				STAT117: STRUCT
2376.0: 					STAT118: BOOL
2376.1: 					STAT119: BOOL
2376.2: 					STAT120: BOOL
2376.3: 					STAT121: BOOL
2377.0: 					STAT122: BYTE
2378.0: 					STAT123: WORD
2380.0: 					STAT124: WORD
2382.0: 					STAT125: WORD
2384.0: 					STAT126: ARRAY [0..3] OF BYTE
2388.0: 					STAT127: WORD
2390.0: 					STAT128: WORD
2392.0: 				STAT129: STRUCT
2392.0: 					STAT130: BYTE
2393.0: 					STAT131: BYTE
2394.0: 					STAT132: WORD
2396.0: 					STAT133: WORD
2398.0: 				STAT134: STRUCT
2398.0: 					STAT135: BYTE
2399.0: 					STAT136: BYTE
2400.0: 					STAT137: WORD
2402.0: 					STAT138: WORD
2404.0: 				STAT139: STRUCT
2404.0: 					STAT140: BOOL
2405.0: 					STAT141: BYTE
2406.0: 					STAT142: WORD
2408.0: 					STAT143: TIME_OF_DAY
2412.0: 			STAT144: BOOL
2412.1: 			STAT145: BOOL
2412.2: 			STAT146: BOOL
2412.3: 			STAT147: BOOL
2412.4: 			STAT148: BOOL
2412.5: 			STAT149: BOOL
2412.6: 			STAT150: BOOL
2412.7: 			STAT151: BOOL
2413.0: 			STAT152: BOOL
2413.1: 			STAT153: BOOL
2413.2: 			STAT154: BOOL
2413.3: 			STAT155: BOOL
2413.4: 			STAT156: BOOL
2413.5: 			STAT157: BOOL
2413.6: 			STAT158: BOOL
2413.7: 			STAT159: BOOL
2414.0: 			STAT160: BOOL
2414.1: 			STAT161: BOOL
2414.2: 			STAT162: BOOL
2414.3: 			STAT163: BOOL
2414.4: 			STAT164: BOOL
2414.5: 			STAT165: BOOL
2414.6: 			STAT166: BOOL
2414.7: 			STAT167: BOOL
2415.0: 			STAT168: BYTE
2416.0: 			STAT169: BYTE
2417.0: 			STAT170: BYTE
2418.0: 			STAT171: WORD
2420.0: 			STAT172: WORD
2422.0: 			STAT173: INT
2424.0: 			STAT174: WORD
2426.0: 			STAT175: STRUCT
2426.0: 				STAT176: WORD := 64
2428.0: 				STAT177: WORD
2430.0: 				STAT178: BYTE := 1
2431.0: 				STAT179: BOOL
2432.0: 				STAT180: BYTE := 2
2433.0: 				STAT181: BYTE := 2
2434.0: 				STAT182: BYTE
2435.0: 				STAT183: BYTE
2436.0: 				STAT184: BYTE
2437.0: 				STAT185: BYTE
2438.0: 				STAT186: ARRAY [1..16] OF BYTE
2454.0: 				STAT187: ARRAY [1..6] OF BYTE
2460.0: 				STAT188: ARRAY [1..6] OF BYTE
2466.0: 				STAT189: ARRAY [1..16] OF BYTE
2482.0: 				STAT190: ARRAY [1..6] OF BYTE
2488.0: 				STAT191: WORD
2490.0: 			STAT192: FB1803
2490.0: 			STAT193: STRUCT
2490.0: 				STAT194: BOOL
2492.0: 				STAT195: WORD
2494.0: 				STAT196: BOOL
2494.1: 				STAT197: BOOL
2494.2: 				STAT198: BOOL
2496.0: 				STAT199: WORD
2498.0: 				STAT200: ANY
2508.0: 				STAT201: BOOL
2508.1: 				STAT202: BOOL
2510.0: 			STAT203: FB1801
2510.0: 			STAT204: STRUCT
2510.0: 				STAT205: BOOL
2512.0: 				STAT206: WORD
2514.0: 				STAT207: INT
2516.0: 				STAT208: BOOL
2516.1: 				STAT209: BOOL
2516.2: 				STAT210: BOOL
2518.0: 				STAT211: WORD
2520.0: 				STAT212: ANY
2530.0: 				STAT213: BOOL
2530.1: 				STAT214: BOOL
2532.0: 			STAT215: FB1802
2532.0: 			STAT216: STRUCT
2532.0: 				STAT217: BOOL
2534.0: 				STAT218: WORD
2536.0: 				STAT219: INT
2538.0: 				STAT220: BOOL
2538.1: 				STAT221: BOOL
2538.2: 				STAT222: BOOL
2540.0: 				STAT223: WORD
2542.0: 				STAT224: INT
2544.0: 				STAT225: ANY
2554.0: 				STAT226: BOOL
2554.1: 				STAT227: BOOL
2556.0: 			STAT228: FB1804
2556.0: 			STAT229: STRUCT
2556.0: 				STAT230: BOOL
2558.0: 				STAT231: WORD
2560.0: 				STAT232: BOOL
2560.1: 				STAT233: BOOL
2560.2: 				STAT234: BOOL
2562.0: 				STAT235: WORD
2564.0: 				STAT236: BOOL
2564.1: 				STAT237: BOOL
2566.0: 			STAT238: STRUCT
2566.0: 				STAT239: WORD
2568.0: 				STAT240: WORD
2570.0: 			STAT241: ARRAY [1..28] OF BYTE
2598.0: 			STAT242: WORD
2600.0: 			STAT243: INT
2602.0: 			STAT244: TIME
2606.0: 			STAT245: TIME
2610.0: 			STAT246: TIME
2614.0: 			STAT247: TIME
2618.0: 			STAT248: TIME
2622.0: 			STAT249: TIME
2626.0: 			STAT250: TIME
2630.0: 			STAT251: TIME
2634.0: 			STAT252: WORD
2636.0: 			STAT253: ARRAY [0..1] OF BYTE
2638.0: 			STAT254: STRUCT
2638.0: 				STAT255: BYTE
2639.0: 				STAT256: BYTE
2640.0: 				STAT257: WORD
2642.0: 				STAT258: WORD
2644.0: 			STAT259: STRUCT
2644.0: 				STAT260: BYTE
2645.0: 				STAT261: BYTE
2646.0: 				STAT262: WORD
2648.0: 				STAT263: WORD
2650.0: 			STAT264: DWORD
2654.0: 			STAT265: DWORD
2658.0: 			STAT266: WORD
2660.0: 			STAT267: WORD
2662.0: 			STAT268: WORD
2664.0: 			STAT269: WORD
2666.0: 			STAT270: WORD
2668.0: 			STAT271: WORD
2670.0: 			STAT272: WORD
2672.0: 			STAT273: WORD
2674.0: 			STAT274: WORD
2676.0: 			STAT275: WORD
2678.0: 			STAT276: WORD
2680.0: 			STAT277: WORD
2682.0: 			STAT278: WORD
2684.0: 			STAT279: WORD
2686.0: 			STAT280: INT
2688.0: 			STAT281: STRUCT
2688.0: 				STAT282: BYTE
2689.0: 				STAT283: BYTE
2690.0: 				STAT284: WORD
2692.0: 				STAT285: WORD
2694.0: 			STAT286: STRUCT
2694.0: 				STAT287: BYTE
2695.0: 				STAT288: BYTE
2696.0: 				STAT289: WORD
2698.0: 				STAT290: WORD
2700.0: 			STAT291: INT
2702.0: 			STAT292: ARRAY [0..15] OF BYTE
2718.0: 			STAT293: ARRAY [0..4095] OF BYTE
6814.0: 			STAT294: ARRAY [0..4095] OF BYTE
10910.0: 		STAT295: BYTE
10912.0: 	RET_VAL: STRUCT
```


----------



## dau2020 (14 Mai 2020)

Hallo Jochen,

ich glaube es gibt noch einen Fehler im Interface-Parser.
In dem von Dir geposteten Interface-Extract sind die folgenden Zeilen erkennbar:

```
336.1: 			STAT59: BOOL
338.0: 			STAT60: WORD
```
und

```
376.2: 			STAT72: BOOL
378.0: 			STAT73: WORD
```

Scheinbar wird immer beim Übergang von BOOL auf WORD ein Byte zu viel addiert, daher schlägt vermutlich dann auch die Zuweisung der Startwerte fehl.

Gruß,
Andreas


----------



## Jochen Kühner (17 Mai 2020)

schau mal in step7, denke das ist richtig.
hab leider keine zeit das zu debuggen.
denke wenn du die aktualwerte unterschiedlich befüllst, dann kannst du rausfinden bis wohin diese richtig sind und so den fehler finden.


----------



## JesperMP (18 Mai 2020)

Es ist richtig so.
Wenn man in ein DB Typen wechseln, wie von BOOL auf WORD in den beispiel, wird immer von den nächste gerade Byte fortgesetzt.

edit: Oder wenn man einen neuen STRUCT beginnt, wird auch von den nächsten geraden byte fortgestzt.


----------

