MC7-Code in AWL umzuwandeln

SPS_PC

Level-1
Beiträge
20
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
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?
 
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?
 
Das Einfachste habe ich jetzt ich denke mal, dass ich Ende der Woche fertig sein kann. :D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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! :p

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! :ROFLMAO:

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.
 
Zuletzt bearbeitet:
Attached you will find my attempts. Not guarenteed to be complete though!
 

Anhänge

  • mc7_opcode_table.zip
    23,8 KB · Aufrufe: 560
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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
 
Hi ronnie,

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

Code FC1:
Code:
Netzwerk 1:
L 1
T MB 0
L 1
T MB 1
L 1
T MB 2
L 1
T MB 3

Code FC800:
Code:
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
 

Anhänge

  • FC.jpg
    FC.jpg
    70,1 KB · Aufrufe: 248
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
No, I didn't know... :confused:
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:

Code:
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.

Code:
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... :cool:

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

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

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.
 
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:
 
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) :D

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:
 

Anhänge

  • mc7.jpg
    mc7.jpg
    67,6 KB · Aufrufe: 207
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
@ 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.
 
@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:
Code:
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.
 
@ 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... :eek:
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! ;)
 
Zurück
Oben