DE4010828A1 - Verfahren zum dekompilieren eines anwenderprogramms bei einer industriesteuerung - Google Patents

Verfahren zum dekompilieren eines anwenderprogramms bei einer industriesteuerung

Info

Publication number
DE4010828A1
DE4010828A1 DE4010828A DE4010828A DE4010828A1 DE 4010828 A1 DE4010828 A1 DE 4010828A1 DE 4010828 A DE4010828 A DE 4010828A DE 4010828 A DE4010828 A DE 4010828A DE 4010828 A1 DE4010828 A1 DE 4010828A1
Authority
DE
Germany
Prior art keywords
contact
jump
code
matrix
ladder
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
DE4010828A
Other languages
English (en)
Other versions
DE4010828B4 (de
Inventor
Neil W Knutsen
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Allen Bradley Co LLC
Original Assignee
Allen Bradley Co LLC
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Allen Bradley Co LLC filed Critical Allen Bradley Co LLC
Publication of DE4010828A1 publication Critical patent/DE4010828A1/de
Application granted granted Critical
Publication of DE4010828B4 publication Critical patent/DE4010828B4/de
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/53Decompilation; Disassembly

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Programmable Controllers (AREA)

Description

Die Erfindung bezieht sich auf Industriesteuerungen und befaßt sich insbesondere mit einem Verfahren zum Rückgewinnen des bei der Programmierung solcher Steuerungen benutzten Leiterlogikquellencode aus dem kompilierten Anwenderprogramm, das auf solchen Steuerungen abläuft, und zwar ohne die Verwendung von Berechtigungsmarken oder Tokens benutzenden Dekompilierbefehlen.
Industriesteuerungen, wie sie beispielsweise aus den US-PS 38 10 118, 39 42 158, 41 65 534 oder 44 42 504 bekannt sind, werden typischerweise mit Industrieanlagen, Ausrüstungen oder Maschinen verbunden, beispielsweise mit Fertigungsstraßen oder Werkzeugmaschinen, und ihre Aufgabe besteht darin, solche Anlagen oder Maschinen gemäß einem gespeicherten Programm zu steuern. Bei diesen Industriesteuerungen, wie sie aus den oben genannten Patenten bekannt sind, enthalten die gespeicherten Programme Befehle, die im Zuge ihrer Ausführung den Zustand von ausgewählten Sensoren oder Fühlgliedern an der gesteuerten Vorrichtung überprüfen und ausgewählte Stell- oder Betätigungsglieder an der gesteuerten Vorrichtung in Abhängigkeit vom Zustand eines oder mehrerer der überprüften Fühlglieder aktivieren oder deaktivieren bzw. ein- oder ausschalten. Die Eingänge zu der Steuerung können diskrete Binärsignale sein, die beispielsweise von Schaltern stammen können, die das Erreichen von Grenz- oder Auslösewerten erfassen können, beispielsweise in bezug auf eine Verschiebung oder Bewegung, die Temperatur, die Zeit oder andere kontinuierlich veränderbare Größen. Bei den Eingängen kann es sich aber auch um analoge Meßwerte der Größen selbst handeln, die vor der Verarbeitung im allgemeinen in die digitale Binärform überführt werden.
Gleichermaßen können die Ausgänge der Steuerung entweder Binärausgänge sein, die von mechanischen oder Festkörperrelais stammen, oder aber auch Analogausgänge, die mit Hilfe von Digital/Analog-Umsetzern gewonnen werden.
Industriesteuerungen sind typischerweise in einer Leiterlogiksprache programmiert, in der die Befehle durch die Elemente eines Relais- oder Kontaktleiterdiagramms (nach Art einer Leiter ausgebildeter Kontaktplan) dargestellt sind. Die Leiterlogiksprache ist in einer Form, die von Steuerungs- und Regelungstechnikern leicht verstanden wird und in einem hohen Maße durch Industrienormen standardisiert ist. Zur Unterstützung des Anwenders beim Entwickeln und Editieren von Leiterlogikprogrammen wurden Programmiergeräte entwickelt, wie sie beispielsweise aus den US-PS 37 98 612, 38 13 649 und 40 70 702 bekannt sind.
Während der Ausführung werden Leiterlogikprogramme befehlsweise in Maschinencodebefehle umgeformt, die direkt von der Rechner-Hardware ausgeführt werden können, die den Grundstein der Steuerung bildet. Diese Umformung wird von einem Interpreterprogramm durchgeführt, das jede Leitersprosse oder jeden Unterabschnitt einer Leitersprosse analysiert und dem Rechner eine Maschinencodesubroutine darbietet, die durch den betreffenden Teil der Leiter definiert ist. Eine Industriesteuerung, die in der Leiterlogiksprache programmiert ist, kann daher mit Hilfe einer Maschine realisiert werden, die von herkömmlicher Rechnerarchitektur Gebrauch macht.
Steuerungen, die auf der Grundlage eines Interpreters beruhen, haben jedoch zwei Nachteile. Der eine Nachteil ist, daß das Interpreterprogramm zusammen mit dem Leiterlogikprogramm während des Betriebs der Steuerung in einem Speicher der Steuerung gespeichert sein muß. Dadurch wird der für das Leiterlogikprogramm zur Verfügung stehende Speicherraum eingeschränkt. Der zweite Nachteil ist, daß infolge der ständigen Interpretation des Leiterlogikprogramms während des Betriebs der Steuerung die Arbeitsweise der Steuerung verlangsamt wird. Die sich ergebenden Geschwindigkeitsgrenzen können zu einer Verminderung der Länge des auszuführenden Leiterlogikprogramms führen.
Eine bekannte Möglichkeit zum Erhöhen der Geschwindigkeit der Programmausführung und zum besseren Ausnutzen des Speichers besteht darin, das Leiterlogikprogramm in den Maschinencode zu kompilieren und nur den Maschinencode in der Steuerung während des Betriebs zu speichern. Ein Duplikat des ursprünglichen Leiterlogikprogramms wird separat gespeichert, beispielsweise auf einer Floppydisk oder einem Magnetband, so daß man das ursprüngliche Programm heranziehen kann, wenn später Programmänderungen erforderlich sein sollten. Das Abspeichern von Kopien des ursprünglichen Leiterlogikprogramms ist jedoch bei industrieller Anwendung äußerst unbequem, da die von der Steuerung separat gespeicherten Programme gegen Verschmutzung, Beschädigung, Löschung usw. geschützt werden müssen.
Eine alternative Möglichkeit besteht darin, den gespeicherten Maschinencode zurück in das Leiterlogikprogramm zu dekompilieren, das kann vom Programmierer verstanden und editiert werden kann. Das Dekompilier- und Kompilierprogramm können in einem separaten Programmiergerät oder Programmierterminal gespeichert werden, um keinen Speicherraum in der Steuerung zu verschwenden. Obgleich diese Möglichkeit aus der Sicht des Benutzers oder Anwenders äußerst attraktiv ist, tritt das Problem auf, daß es bei Benutzung von vielen herkömmlichen Kompilierungsverfahren unmöglich ist, das Leiterlogikprogramm aus dem Maschinencode wiederzugewinnen. Dies beruht darauf, daß viele Kompilierungsverfahren wirksam Information ausrangieren, die erforderlich ist, um eindeutig zu identifizieren, welche der vielen möglichen Leiterlogikstrukturen die besondere Logiksequenz erzeugte, die im Maschinencode verkörpert ist.
Solche Kompilierer können daher im kompilierten Maschinencode zusätzliche Quellensprachentokens enthalten, die von der Steuerung nicht ausgeführt werden, sondern lediglich dazu dienen, den Maschinencode in die Leiterlogikbefehle zu dekompilieren. Ein Beispiel für eine solche Technik ist in einer US-Patentanmeldung Nr. 07/161,484, eingereicht am 29. Februar 1988, beschrieben.
Ziel der Erfindung ist es, für eine Industriesteuerung einen Dekompilierer zu schaffen, der direkt auf den Maschinencode einwirken kann, um das ursprüngliche Leiterdiagramm zu gewinnen, und zwar ohne Quellencodetokens.
Der nach der Erfindung geschaffene Dekompilierer folgt einem Satz vordefinierter Regeln zum Auslesen der Anwenderprogrammbefehle, die im Speicher der Steuerung gespeichert sind, und um Konstruieren einer Zwischenverbindungsmatrix, deren Spalten Kontaktnummern oder Kontaktzahlen darstellen und deren Reihen Knoten darstellen, bei denen Kontakte miteinander verbunden sind.
In dieser Zwischenverbindungsmatrix gespeicherte Daten können verwendet werden, um die graphische Struktur des Quellenleiterdiagramms zu reproduzieren, oder diese Daten können zerlegt oder analysiert werden, um eine maschinenlesbare Darstellung des ursprünglichen Leiterdiagramms zu gewinnen, das dann editiert werden kann.
Ein wesentlicher technischer Vorteil der Erfindung besteht darin, daß die in der Steuerung erforderliche Speicherkapazität geringer ist. Die Möglichkeit, ein Leiterdiagramm unmittelbar aus dem Maschinencode wiederzugewinnen, ohne daß dafür Quellencodetokens gespeichert werden müssen, führt in der Steuerung zu einer Verminderung des Speicherumfangs, der zum Ablegen des kompilierten Steuerungsprogramms erforderlich ist. Der Dekompilierer arbeitet direkt auf eine Maschinencodeimplementierung oder Maschinencodeausführung des Leiterlogikprogramms, worin Kontakte nur durch bedingte Verzweigungs- oder Sprunganweisungen dargestellt sind, deren Ziele andere Verzweigungs- oder Sprunganweisungen oder die SPULE-EIN- und SPULE-AUS-Routinen sind.
Die Erfindung gestattet ein einfaches und leichtes Editieren eines gesteuerten Maschinencodeprogramms, und zwar ohne Rückgriff auf Kopien des ursprünglichen Quellenleiterlogikprogramms. Das Editieren erfordert es, daß das Programm als I-Code existiert, eine editorlesbare Version des graphischen Leiterdiagramms. Die vom Dekompilierer erzeugte Zwischenverbindungsmatrix kann durch Anwenden einer Reihe von Matrixvereinfachungsregeln in den I-Code zerlegt werden, wobei Parallel- und Serienkontakte innerhalb der Matrix vereinigt werden, während eine I-Codestrangdarstellung der Leiterkontakte tabulliert wird. Die Fähigkeit, den Objektmaschinencode in den I-Code zu dekompilieren, beseitigt die Notwendigkeit des Aufbewahrens einer editierbaren Kopie des Quellenleiterlogikprogramms.
Die Erfindung gestattet die Dekompilierung von Leiterlogikprogrammen aus dem kompilierten Maschinencode in einer Form, die vollständig verschiebbar ist. Der Dekompilierer arbeitet mit einem Reihensprungformat-Maschinencode, der in erster Linie aus bedingten Sprungbefehlen besteht. Solche Befehle verwenden relative Adressierung und sind leicht verschieblich innerhalb des Speichers der Steuerung.
Nach der Erfindung ist auch eine schnelle Kompilierung und Dekompilierung der Leiterlogikprogramme möglich. Der Reihensprungformat-Maschinencode, der vom Kompilierer erzeugt wird, wird in einer Weise kompiliert, die Vorwärtsreferenzen vermeidet und kann daher in einem einzigen Durchgang kompiliert werden.
Ein bevorzugtes Ausführungsbeispiel der Erfindung wird im folgenden an Hand von Zeichnungen beschrieben. Es zeigt
Fig. 1 eine perspektivische Ansicht einer Industriesteuerung, in der die Erfindung realisiert ist,
Fig. 2 ein schematisches Blockschaltbild von Baueinheiten der in Fig. 1 dargestellten Industriesteuerung,
Fig. 3 ein schematisches Blockschaltbild eines in Fig. 2 dargestellten Prozessormoduls,
Fig. 4 ein allgemeines Flußdiagramm zur Erläuterung der Umformung eines Leiterlogiksteuerprogramms in einen Reihensprungformat-Maschinencode,
Fig. 5 entfällt,
Fig. 6 ein detailliertes Flußdiagramm zum Aufzeigen der Kompilierung des I-Code in den Reihensprungformat-Maschinencode, wie es in Fig. 4 angedeutet ist,
Fig. 7 ein Flußdiagramm einer Nachfolgekontaktroutine, die von dem in Fig. 6 veranschaulichten Kompiliererprogramm verwendet wird,
Fig. 8 ein Flußdiagramm einer den nächsten offenen Kontakt betreffenden Routine, die von dem in Fig. 6 veranschaulichten Kompilierprogramm verwendet wird,
Fig. 9 ein detailliertes Flußdiagramm zum Aufzeigen der Dekompilierung des Reihensprungformat-Maschinencode in den I-Code, wie in Fig. 4 angedeutet,
Fig. 10 ein Flußdiagramm der Zielnumerierungsroutine, die von dem in Fig. 9 veranschaulichten Dekompilierprogramm verwendet wird,
Fig. 11 ein Flußdiagramm der Matrixvereinfachungsroutine, die von dem in Fig. 9 veranschaulichten Dekompilierprogramm verwendet wird,
Fig. 12 (a) ein Beispiel eines Leiterlogikdiagramms vor der Umformung nach Fig. 4,
Fig. 12 (b) eine ASCII-Strangdarstellung des I-Code, der erzeugt wird mittels des Leiterlogikdiagramms nach Fig. 12 (a),
Fig. 12 (c) eine vereinfachte Darstellung des Reihensprungformat-Maschinencode, der vom Kompilierer aus dem I-Code von Fig. 12 (b) erzeugt wird,
Fig. 13 eine Veranschaulichung einer schrittweisen Dekompilierung des Maschinencode, der in Fig. 12 (c) gezeigt ist,
Fig. 14 eine Veranschaulichung einer Matrixvereinfachungsroutine, die von der Dekompilierungsroutine verwendet wird,
Fig. 15 (a) bis (c) eine Veranschaulichung der Verwendung einer Zwischenverbindungsmatrix zur Rekonstruktion des graphischen Leiterlogikdiagramms.
Allgemeine Beschreibung der Leiterlogikprogrammierung
Die Leiterlogikprogrammierung (ladder logic programming) kann man auch mit Stromlauflogik- oder Kontaktlogikprogrammierung bezeichnen. Zunächst soll auf Fig. 4 Bezug genommen werden. Der Anwender entwickelt eine I-Codedarstellung seines Leiterlogikprogramms 50 unter Verwendung eines Tastenfeldes 52, wie es durch Pfeile 51 und 57 dargestellt ist. Ein Leiterlogikdiagramm (ladder logic diagram) 59, das man auch mit Stromlauflogikplan oder Kontaktlogikplan bezeichnen kann, ist auf einem Sichtschirm 58 dargestellt, so daß der Bediener die Genauigkeit seiner Arbeit überprüfen und das Diagramm bzw. den Plan editieren kann, um ihn in Übereinstimmung mit dem gewünschten Leiterlogikprogramm 50 zu bringen. Das Tastenfeld 52 und der Schirm 58 sind Teile eines Programmierterminals 21, wie es beispielsweise aus der US-PS 45 27 20 bekannt ist.
Unter Verwendung des Programmierterminals 21 wird der eingegebene I-Code 54 in den Maschinencode kompiliert und in die Industriesteuerung 10 geladen, wie es durch einen Pfeil 56 angedeutet ist. Das Terminal 21 wird dann abgetrennt, und der in der Industriesteuerung 10 gespeicherte Maschinencode betreibt die Industriesteuerung 10 gemäß dem gespeicherten Leiterlogikprogramm. Das in der Steuerung 10 gespeicherte Leiterlogikprogramm enthält Befehle, die vom Prozessor der Steuerung direkt ausführbar sind, die aber nicht direkt in ein Leiterlogikdiagramm 59 übersetzbar sind. Immer wenn der Anwender dieses in der Industriesteuerung 10 gespeicherte Steuerprogramm editieren möchte, wird dies nach der Erfindung dadurch erreicht, daß das Programmierterminal 21 wieder angeschlossen wird und die Maschinencodeform des Anwenderprogramms entladen wird und der in der Steuerung 10 gespeicherte Maschinencode de- oder entkompiliert wird, um den I-Code 54 wiederzugewinnen. Dieser in Fig. 4 durch einen Pfeil 55 angedeutete Vorgang wird im Programmierterminal 21 ausgeführt. Der Anwender kann dann das Leiterlogikprogramm, wie es auf dem Schirm 58 als Leiterdiagramm 59 dargestellt ist, mit Hilfe des Tastenfeldes 52 editieren. Das Leiterdiagramm kann auch Stromlaufplan oder Kontaktplan genannt werden.
Leiterlogikprogramm
Das Leiterlogikprogramm 50 wird vom Anwender unter Beachtung der Anforderungen der zu steuernden Anlage oder des zu steuernden Prozesses erzeugt und in einer Leiterlogikdiagrammform geschrieben, die einem Steuerungs- und Regelungstechniker auch in Form eines Stromlaufplans oder Kontaktplans wohlbekannt ist. In Fig. 12 (a) ist ein Beispiel einer Sprosse eines Leiterdiagramms dargestellt, wie es als Teil eines Leiterlogikprogramms erzeugt werden kann. Eine solche Leitersprosse kann man auch unter Bezugnahme auf die Bezeichnungen Stromlaufplan und Kontaktplan als Strompfad oder Querverbindung bezeichnen. Per Übereinkunft sind auf den beiden einander gegenüberliegenden Seiten des Leiterdiagramms senkrechte Stromschienen 100 und 106 vorgesehen. Zwischen den Stromschienen 100 und 106 bildet der Bediener die horizontalen Strompfade oder Sprossen des Leiterdiagramms aus. Jede Leitersprosse enthält eine Reihe normalerweise geöffneter Kontakte oder Schließer 102, normalerweise geschlossener Kontakte oder Öffner 108 und eine Relaisspule 104, die in Reihe miteinander oder parallel zueinander mit Hilfe von Verzweigungsanfängen 110 und Verzweigungsenden 112 geschaltet sein können. Jeder Kontakt 102 oder 108 stellt einen zu überprüfenden Eingang oder einen zu überprüfenden internen Zustand dar, und die Spule 104 stellt ein Stell- oder Betätigungsglied dar, das für diesen Teil des Leiterlogikprogramms zu aktivieren ist. Sind beispielsweise die von den Kontakten 102′ und 108′ dargestellten Eingangsbedingungen derart, daß die Kontakte 102′ und 108′ geschlossen sind, dann wird die durch die Spule 104 dargestellte Betätigungsvorrichtung aktiviert. Gemäß standardisierter Übereinkunft darf in dem Leiterdiagramm der Strom lediglich von links nach rechts fließen. Folglich kann man jeden Kontakt so betrachten, daß er einen "Kopf"-Anschluß und einen "Schwanz"-Anschluß hat, wobei der Strom vom Schwanz zum Kopf fließt.
I-Code
Wie bereits an Hand von Fig. 4 erläutert, wird das Leiterlogikprogramm 50 als I-Code in die Industriesteuerung 10 eingegeben, und zwar mittels des Tastenfeldes 52 des Programmierterminals 21. Der I-Code enthält prinzipiell die nachfolgende ASCII-Befehlsmnemonik, wobei jede mnemonische Bezeichnung ein I-Codesymbol darstellt:
XIC: Prüfe auf geschlossen (normalerweise geöffnet)
XIO: Prüfe auf geöffnet (normalerweise geschlossen)
SOR, EOR: Beginn einer Leitersprosse, Ende einer Leitersprosse
BST, BND: Verzweigungsbeginn, Verzweigungsende
LST, LND: Beginn einer Stufe, Ende einer Stufe
OTE: Ausgang freigegeben oder aktivieren
Zahlreiche zusätzliche Ausgangssymbole kann man ebenfalls verwenden, beispielsweise Zeitglieder und Zählglieder. Solche Ausgänge folgen für die Zwecke der folgenden Betrachtungen den gleichen Regeln wie ein normaler Ausgang.
Jedes Symbol stellt ein graphisches Element des Leiterdiagramms dar. Ein "SOR"-Symbol zeigt den Beginn einer Leitersprosse an, und ein "EOR"-Symbol zeigt das Ende einer Leitersprosse an. Ein Verzweigungsbeginn- "BST"-Symbol zeigt irgendeinen Knoten an, der zwei oder mehr Kontakte miteinander verbindet und bei dem die Schwänze aller Kontakte mit Ausnahme eines Kontaktes mit dem Kopf eines anderen Kontaktes verbunden sind oder mit der Stromschiene 100 verbunden sind. Umgekehrt zeigt ein Verzweigungsende-"BND"-Symbol irgendeinen Knoten an, bei dem zwei oder mehr Kontakte miteinander verbunden sind und bei dem die Köpfe aller Kontakte mit Ausnahme eines Kontaktes mit dem Schwanz eines anderen Kontaktes verbunden sind oder mit der Ausgangsspule verbunden sind. Das "LST"-Symbol zeigt den Beginn einer neuen Stufe von Kontakten innerhalb einer Verzweigung an, und das "LND"-Symbol zeigt das Ende einer solchen Stufe von Kontakten an.
Jeder Kontakt innerhalb des Leiterdiagramms ist im I-Code mit einem "XIC"- oder "XIO"-Symbol bezeichnet, und zwar in Abhängigkeit davon, ob der Kontakt ein Schließer (normalerweise geöffnet) oder ein Öffner (normalerweise geschlossen) ist. Jedes Kontaktsymbol enthält noch eine nachfolgende ganze Zahl, die den jeweiligen Kontakt eindeutig identifiziert. Das "OTE"-Symbol stellt eine Ausgangsspule dar.
Der I-Code, der dem in Fig. 12 (a) dargestellten Leiterlogikdiagramm äquivalent ist, ist in Fig. 12 (b) gezeigt. Die besondere Reihenfolge oder Ordnung der Kontakte, die bei der Erzeugung des I-Code hervorgebracht wird, wird "Reihensprungordnung" ("series jump ordering") genannt und kann kurz wie folgt beschrieben werden: Kontakte im Leiterlogikdiagramm werden aufeinanderfolgend geordnet und numeriert, wobei auf der Oberseite der Sprosse begonnen wird und in Richtung von links nach rechts vorangeschritten wird. Wird ein Verzweigungsende festgestellt, wird mit der Numerierung bei den nicht numerierten Kontakten am Beginn der nächsten Verzweigungsstufe fortgefahren. Dieser Vorgang wird fortgeführt, bis alle Kontakte numeriert sind.
Beschreibung eines bevorzugten Ausführungsbeispiels Hardware
Es wird nunmehr auch auf Fig. 1 und 2 Bezug genommen. Eine darin gezeigte Industriesteuerung 10 enthält zwei Gestelle oder Rahmen 12 und 13 mit separaten Netzteilen 14 bzw. 15. Jeder der Rahmen 12 und 13 weist eine Reihe von Schlitzen auf, die verschiedenartige Funktionsmodule 16 und 17 aufnehmen können. Jedem der Rahmenschlitze ist eine eindeutige Adresse zugeordnet, so daß der von dem jeweiligen Schlitz aufgenommene Modul zweifelsfrei identifiziert werden kann. Die beiden Rahmen 12 und 13 enthalten jeweils auch eine Rückebene 18 bzw. 18′ mit elektrischen Verbindern und elektrischen Leiterbussen, über die die Funktionsmodule 16 und 17 miteinander verbunden sind und über die die Energiezufuhr von den Netzteilen 14 und 16 zu den Modulen erfolgt. Die Rückebenen 18 und 18′ enthalten jeweils einen parallelen Adreßbus 32 bzw. 32′, einen parallelen Datenbus 33 bzw. 33′, einen Satz Steuerleitungen 34 bzw. 34′ und einen parallelen 5-Bit-Schlitzadreßbus 35 bzw. 35′. Ein separater Verbinder ist an der Rückebene für jeden Schlitz in einem Rahmen vorgesehen, um diese Busse und Steuerleitungen mit einem in den Schlitz eingesetzten Modul zu verbinden. Ein Mehrleiterkabel 20 verbindet die Rückebenen 18 und 18′ der beiden Rahmen 12 und 13 miteinander in einer solchen Weise, daß eine gemeinsame Systemrückebene 19 gebildet wird. Ein weiteres Mehrleiterkabel 20′ erstreckt die Systemrückebene vom zweiten Rahmen 13 zu weiteren Rahmen der industriellen Steuerung, die nicht dargestellt sind. Die Rahmen sind über die Kabel 20 und 20′ nach Art einer sogenannten Gänseblümchen-Kette (daisy chain) miteinander verbunden. Eine detaillierte Beschreibung einer Rückebene, wie sie für die Zwecke der Erfindung geeignet ist, findet man in der DE-OS 39 24 384.
Der erste Rahmen 12 enthält einen Prozessormodul 16, der ein anwenderdefiniertes Leiterlogikprogramm ausführt, das in einem Speicher des Moduls gespeichert ist, und der auf diese Weise eine mit der Industriesteuerung 10 verbundene gesteuerte Einrichtung oder Anlage betreibt. Ein Programmieranschlußgerät oder Programmierterminal 21 ist über ein Kabel 22 mit dem Prozessormodul 16 verbunden und dient dazu, die Betriebsweise der industriellen Steuerung zu überwachen und den Prozessormodul 16 zu programmieren. Der Prozessormodul 16 ist mit den Rückebenebussen 32, 33 und 35 sowie mit den Steuerleitungen 34 verbunden.
Der erste Rahmen 12 enthält auch eine Reihe Eingabe/Ausgabe-Module 17, kurz E/A-Module genannt, die zwischen dem Prozessor 16 einerseits und den Fühler- und Betätigungsvorrichtungen der von der Steuerung 10 gesteuerten Maschine andererseits ein elektrisches Interface oder eine elektrische Schnittstelle bilden. Die Bezeichnung E/A-Modul betrifft somit hier einen Modul, der die Schnittstelle für externe Glieder, Geräte oder Vorrichtungen an oder bei der gesteuerten Maschine bildet. Solche E/A-Module können allein eine Eingangsfunktion, allein eine Ausgangsfunktion oder sowohl eine Eingangs- als auch Ausgangsfunktion haben. E/A-Module, die eine Eingangsfunktion ausüben, verbinden den Prozessormodul 16 mit Sensor- oder Fühlvorrichtungen der gesteuerten Maschine, wohingegen Ausgangsfunktionsmodule die Verbindung zu Betätigungsgliedern oder Betätigungsvorrichtungen der gesteuerten Maschine herstellen. Jeder der E/A-Module kann ein Wechselstromeingangs- oder Wechselstromausgangsgerät oder aber ein Gleichstromeingangs- oder Gleichstromausgangsgerät sein oder eine Eingangs/Ausgangs-Schnittstelle für analoge Geräte vorsehen, beispielsweise für Resolver und Positionsanzeigegeräte. Eine typische Industriesteuerung 10 enthält eine Auswahl der verschiedenartigen E/A-Module.
Die verschiedenen Komponenten des Prozessormoduls 16, die schematisch in Fig. 3 dargestellt sind, sind untereinander über einen Satz aus drei internen Bussen verbunden: ein Steuerbus 24 bestehend aus einer Anzahl einzelner Steuerleitungen, die verschiedene Komponenten miteinander verbinden, ein paralleler Datenbus 25 und ein paralleler Adreßbus 26. Ein Mikroprozessor 28, bei dem es sich beispielsweise um einen Mikroprozessor vom Typ MCS-8051, hergestellt von der Intel Corporation, Santa Clara, Californien, handeln kann, ist mit den drei internen Bussen 24 bis 26 verbunden. Der Mikroprozessor 28 führt ein Betriebssystemprogramm aus, das in einem Festwertspeicher (ROM) 29 gespeichert ist. Das Betriebssystemprogramm steuert den Gesamtbetrieb der industriellen Steuerung 10. Ferner führt der Mikroprozessor 28 ein anwenderdefiniertes Leiterlogikprogramm aus, das in einem Direktzugriffsspeicher (RAM) 30 als maschinenausführbarer Objektcode gespeichert ist. Ferner ist im RAM 30 eine standardisierte Eingabe/Ausgabe-Datentabelle gespeichert, die den Zustand der Fühler- und Betätigungsvorrichtungen enthält. Der RAM 30 stellt auch Speicherplätze für Zähler, Zeitgeber und Zwischenrechenwerte bereit, die vom Mikroprozessor 28 bei der Ausführung der Betriebs- und Leiterlogikprogramme verwendet werden. Ein Adreßdecoder 31 spricht auf spezifische Adressen an, die über den Moduladreßbus 26 gesendet werden, und zwar durch Erzeugen von Steuersignalen am Bus 24, die es ermöglichen, daß der Mikroprozessor Zugriff zu den Speichern 29 und 30 als auch zur Systemrückebene 19 erlangt.
Der Zugriff zu den Systemrückebenebussen 32 bis 35 entweder durch den Prozessormodul 16 oder einen anderen Modul wird durch eine Interbussteuerschaltung 36 kontrolliert, die an sich bekannte Schaltungen enthalten kann, welche dazu dienen, die Buszugriffsarbitration (schiedsrichterlichen Buszugriff) auszuführen. Als Antwort auf das richtige Anforderungssignal gibt die Interbussteuerschaltung 36 einen Satz oder eine Gruppe bidirektionaler Datenpuffer 37 frei, um den internen Datenbus 25 des Prozessormoduls 16 mit dem Rückebenedatenbus 33 zu verbinden. Ein Schlitzadreßlatch 39 kann von der Interbussteuerschaltung 36 freigegeben werden, um ein 5-Bit-Datenwort in Parallelform vom Prozessormoduldatenbus 25 an den Rückebeneschlitzadreßbus 35 zu legen.
Die Verbindungen zwischen den internen Bussen des Prozessormoduls 16 und den Bussen der Rückebene 19 gestattet es, daß der Mikroprozessor 28 wahlweise Zugriff zu irgendeinem der E/A-Module 17 in den Rahmen 12 und 13 erlangen kann.
Reihensprungformat
Der I-Code 54, wie er in Fig. 4 dargestellt ist, wird unter Bezugnahme auf die bisherige Erläuterung nicht von der Industriesteuerung 10 ausgeführt, sondern kompiliert, wie es durch den Pfeil 56 angedeutet ist. Dieser Maschinencode ist im "Reihensprungformat" ("series jump format"). Im Reihensprungformat ist jeder Kontakt durch einen einzigen Sprung- oder Verzweigungsbefehl dargestellt. Dieser Befehl überprüft das Eingabe/Ausgabe-Eingangsbildtabellenbit, das den Kontakt darstellt, und springt entweder zu einem anderen kontaktüberprüfenden Befehl oder einer spuleneinschaltenden oder spulenausschaltenden Routine. In Fig. 12 (c) ist die vereinfachte kompilierte Reihensprungformatform der in Fig. 12 (a) gezeigten Leitersprosse veranschaulicht, und zwar dargestellt in MCS-51-Maschinencodemnemonik. Unter Bezugnahme auf standardisierte Programmierungsübereinkunft ist die erste Spalte hinter den Zeilennummern für Kennzeichen reserviert, die die Sprungziele bezeichnen. Die nächste Spalte ist Mnemonik für den Maschinencodebefehl, und zwar entweder JNB oder JB. JNB bedeutet "Springe, wenn Bit ist nicht gesetzt" (jump if bit not set), und JB bedeutet "Springe, wenn Bit ist gesetzt" (jump if bit set). Die nächste Spalte enthält die Operanden für den Befehl, wobei der erste Operand das Bit in der Eingangsbildtabelle identifiziert, das durch den Befehl JNB oder JB zu überprüfen ist, und der zweite Operand die Kennung oder das Kennzeichen des Sprungziels angibt. In der tatsächlichen Praxis müssen die Bits zunächst von einem externen RAM wieder gewonnen werden. Eine detaillierte Beschreibung des Maschinencodebefehlssatzes für MCS-51 findet man in einer Druckschrift der Firma Intel Corporation: "Microcontroller User's Manual", Bestellnummer 210 359-001 (Mai 1982).
Der durch das Programmierterminal 21 ausgeführte Kompilierer bearbeitet jede Leitersprosse im I-Code nach Fig. 12 (b) zwecks Erzeugung des Maschinencodes des in Fig. 12 (c) dargestellten Typs. Um nicht aufgelöste Vorwärtsreferenzen zu vermeiden, arbeitet der Kompilierer am I-Code von rechts nach links und erzeugt den kompilierten Maschinencode vom letzten Befehl aus bis hin zum ersten Befehl.
Fig. 6 zeigt das Kompilierhauptprogramm. Der erste Schritt des Kompilierprozesses, der bei einem Prozeßblock 201 dargestellt ist, erzeugt die Maschinencodebefehle zum Setzen und Rücksetzen des Ausgangsbildtabellebit, das dem Einschalten oder Ausschalten der Spule der Leitersprosse zugeordnet ist, wobei im kompilierten Code die Kennzeichnung "EIN" bzw. "AUS" verwendet wird. Diese beiden gekennzeichneten Schritte bilden die letzten beiden Befehle des kompilierten Code und werden nachfolgend "SPULE-EIN"-Routine und "SPULE-AUS"-Routine genannt.
Der im Prozeßblock 200 dargestellte zweite Schritt des Kompilierungsprozesses ist das Sortieren des I-Code, um ein Nachfolgekontaktfeld (succeeding contact array) oder Nachfolgekontaktanordnung A zu erzeugen. Der Inhalt jedes Elements A(i) des Feldes oder der Anordnung A enthält die Zahl des Kontaktes unmittelbar zur Rechten des Kontaktes "i" im Leiterdiagramm des Leiterlogikprogramms oder ein Symbol, das die Ausgangsspule darstellt, wenn sich die Ausgangsspule unmittelbar zur Rechten befindet. Bei dem in Fig. 12 (a) dargestellten Leiterlogikprogramm wäre somit der Nachfolgekontakt für den Kontakt "3" der Kontakt "5", und der Inhalt des Elements A (3) des Feldes oder der Anordnung A wäre "5". Der Nachfolgekontakt für den Kontakt "2" ist die Ausgangsspule, und der Inhalt von A (2) wäre das Spulensymbol. Eine Routine zum Erzeugen dieser Liste von Nachfolgekontakten ist in Fig. 7 dargestellt und wird noch im einzelnen erläutert.
Es wird weiter auf Fig. 6 Bezug genommen, aus der hervorgeht, daß bei einem Prozeßblock 202 jedes Element A(i) beginnend mit einem Kontakt n überprüft wird, wobei n der Kontakt mit der höchsten Zahl oder Nummer in der zu kompilierenden Leitersprosse ist. In Abhängigkeit vom Wert des Nachfolgekontakts und vom I-Codekontaktsymbol, das "I" zugeordnet ist, erzeugt der Kompilierer entweder einen "Normalsprung"-Befehl oder einen "Umkehrsprung"-Befehl. Ein "Normalsprung" ist hier ein Maschinencode-JB-Befehl, wenn das "i" zugeordnete Kontaktsymbol gleich "XIC" ist, und ein JNB-Befehl, wenn das "i" zugeordnete Kontaktsymbol gleich "XIO" ist. Demgemäß ist ein "Umkehrsprung" ein JNB-Befehl, wenn das "i" zugeordnete Kontaktsymbol ein "XIC"-Kontakt ist, und ein JB-Befehl, wenn das "i" zugeordnete Kontaktsymbol gleich "XIO" ist.
Bei einem dargestellten Prozeßblock 204 wird speziell überprüft, ob A(i) die Ausgangsspule als "Nachfolgekontakt" enthält. Ist dies der Fall, gibt der Kompilierer einen "Normalsprung"-Befehl zum "EIN"-Kennzeichen oder zur "EIN"-Marke aus, d. h. zur SPULE-EIN-Routine. Der erste kompilierte Befehl wird unmittelbar vorausgehend den SPULE-EIN- und SPULE-AUS-Routinen gespeichert.
Wenn beim Prozeßblock 204 festgestellt wird, daß der Nachfolgekontakt A(i) nicht die Spule ist, wird überprüft, ob der Nachfolgekontakt größer als der gegenwärtige Kontakt "i" ist. Trifft dies zu, gibt der Kompilierer einen "Umkehrsprung"-Befehl an den nächsten "geöffneten" Kontakt "k" nach dem gegenwärtigen Kontakt ab, und zwar unter Bezugnahme auf die Prozeßblöcke 210 und 214. Die Routine zum Identifizieren des nächsten offenen oder geöffneten Kontakts "k" ist in Fig. 8 dargestellt und wird später noch beschrieben. Falls es keinen nächsten Kontakt "k" gibt, dann gibt der Kompilierer den Maschinencode für einen Umkehrsprung zur SPULE-AUS-Routine aus.
Beim Prozeßblock 212 wird überprüft, ob der Nachfolgekontakt A(i) um mehr als eins größer als der gegenwärtige Kontakt i ist. Trifft dies zu, gibt der Kompilierer einen Normalsprung zum Nachfolgekontakt A(i) aus.
Mittels von Prozeßblöcken 218, 220 werden die Schritte der Prozeßblöcke 204, 208 und 212 für jeden Kontakt "i" des I-Code, in Umkehrreihenfolge wiederholt, bis die gesamte I-Codesprosse kompiliert ist. Die Routine zum Erzeugen der Anordnung von Nachfolgekontakten A, wie sie in dem obigen Kompilierprogramm benutzt wird und wie es in Fig. 7 dargestellt ist, beginnt durch Setzen einer Zählervariablen auf -1 und Überprüfen des I-Code vom Beginn an, wie es durch Prozeßblöcke 222, 224 und 226 gezeigt ist. Wie es in Prozeßblöcken 228 und 230 dargestellt ist, wird immer dann, wenn ein LND-Symbol ("Stufenende") im I-Code festgestellt wird, dieser Zähler gleich 0 gesetzt. Wird ein BST-Symbol (Verzweigungsbeginn) festgestellt, wird der Zähler um 1 inkrementiert, und zwar gemäß Prozeßblöcken 232 und 234. Wird ein BND-Symbol (Verzweigungsende) festgestellt, wird der Zähler um 1 dekrementiert, und zwar gemäß Prozeßblöcken 240 und 242.
Wie es im Block 240 dargestellt ist, wird, wenn ein Kontakt festgestellt wird und der Zählwert kleiner als 0 ist, dieser Kontakt als der Nachfolgekontakt für "i" gewertet und die Kontaktzahl oder Kontaktnummer in der Anordnung A(i) gespeichert, gemäß dem Prozeßblock 242.
Ist der Nachfolgekontakt gemäß Prozeßblock 242 nicht identifiziert worden, wird gemäß einem Prozeßblock 246 der Rest des I-Code überprüft. Wenn kein Nachfolgekontakt für den Kontakt "i" identifiziert wird, dann empfängt A(i) ein vorbestimmtes Symbol, das anzeigt, daß die Spule der "Nachfolgekontakt" ist. Wenn entweder ein Kontakt oder die Spule als ein Nachfolgekontakt für den Kontakt "i" identifiziert wird, dann wird "i" gemäß den Prozeßblöcken 224 und 250 inkrementiert, bis ein Nachfolgekontakt A(i) für alle Kontakte in der Sprosse erhalten wird.
In Fig. 8 ist die Routine zum Identifizieren des nächsten geöffneten Kontaktes dargestellt, die auch in dem oben beschriebenen Kompilierprogramm verwendet wird. Bei Prozeßblöcken 250 und 252 wird der gegenwärtige Kontakt "i" vom Kompilierprogramm empfangen, und ein Zähler sowie eine Markierungs- oder Anzeigevariable werden gleich 0 gesetzt. Zur Rechten dieses Kontaktes "i" wird der I-Code überprüft, wie es durch einen Prozeßblock 254 veranschaulicht ist. Wird im I-Code ein BST-Symbol (Verzweigungsbeginn) festgestellt, wird der Zähler um 1 inkrementiert, und zwar gemäß Prozeßblöcken 256 und 258. Wird ein BND-Symbol (Verzweigungsende) festgestellt, wird der Zähler um 1 inkrementiert und die Anzeigervariable wird zurückgesetzt, wie es Prozeßblöcke 260 und 262 zeigen. Wird ein LND-Symbol (Stufenende) festgestellt und ist der Zähler gleich 0, wird die Markierung oder der Anzeiger gesetzt, und zwar gemäß Prozeßblöcken 264 und 268.
Wird gemäß einem Prozeßblock 270 ein Kontakt festgestellt, während der Anzeiger gesetzt ist, ist dieser Kontakt der nächste offene Kontakt k. Wird bei einem Prozeßblock 274 das Ende der Sprosse festgestellt, bevor ein nächster offener Kontakt "k" identifiziert wird, erhält "k" die Marke oder das Kennzeichen der SPULEN-AUS-Routine.
Das Format des kompilierten Code, der durch den oben beschriebenen Kompilierungsprozeß erzeugt wird, wird hier als Reihensprungformat-Maschinencode bezeichnet. Der De- oder Entkompilierer der Erfindung wird durch das Programmierterminal 21 ausgeführt, und zwar mit dem Ziel, einen solchen Reihensprungformatcode in ein Leiterlogikdiagramm oder in ein I-Codeformat umzuformen, zwecks Editierung oder Überprüfung durch den Anwender, wie es in Fig. 4 gezeigt ist. Die Entkompelierung wird vorgenommen ohne die Verwendung von Zusatzquellencodetokens, die im Maschinencode eingebettet sind.
Leiterlogikdekompilierer
Es wird nunmehr auch auf Fig. 9 Bezug genommen. Der erste Schritt des De- oder Entkompilierers besteht entsprechend der Darstellung in einem Prozeßblock 280 darin, dem ersten Operanden jeder Sprunganweisung eine Indexzahl "i" zuzuordnen. Wie bereits oben erwähnt stellt dieser erste Operand die Eingangsbildadresse eines besonderen Eingangskontakts dar, so daß man den Index "i" als Eingangskontaktnummer oder Eingangskontaktzahl betrachten kann. Aus Gründen der Bequemlichkeit wird die Indexzahl "i" auch dafür verwendet, um auf die besondere Sprunganweisung hinzuweisen, die diesen Operanden umgibt. Bei einem Prozeßblock 282 wird ein Feld (array) oder eine Anordnung T(i) erzeugt, wobei T(i) das Target oder Ziel der Sprunganweisung darstellt, die dem Operanden i zugeordnet ist. Das Ziel kann sein entweder eine andere Sprunganweisung, die durch ihren Operanden "i" identifiziert ist, oder die SPRUNG-EIN-Routine, die als ein Sprung zum "EIN"-Kennzeichen identifiziert ist, oder die SPRUNG-AUS-Routine, die als ein Sprung zum "AUS"-Kennzeichen identifiziert ist. Bei einem Prozeßblock 282 wird ein zweites Feld (array) oder eine zweite Anordnung B(i) gebildet, wobei B(i) entweder den Strang "XIO" enthält, wenn die dem Operanden "i" zugeordnete Sprunganweisung ein JNB-Befehl ist, oder den Strang "XIC" enthält, wenn die dem Operanden "i" zugeordnete Sprunganweisung ein JB-Befehl ist. Die Werte B(i) können verkippt (toggled) sein: eine solche Verkippung formt ein XIO in ein XIC um und umgekehrt.
Beim Prozeßblock 286 wird eine auf Null gestellte Zwischenverbindungsmatrix M erzeugt, deren Zeilen gleich der Maximalanzahl von Kontakten ist, die an einer Sprosse zulässig sind, und die n Spalten hat, wobei n der Maximalwert von "i" ist, d. h. die Anzahl von Sprungbefehlen oder Kontakten in der zu de- oder entkompilierenden Sprosse. Beginnend bei einem Prozeßblock 290 mit dem Sprungbefehl n wird eine Matrixindexvariable a gleich 1 gesetzt. Bei einem Prozeßblock 292 wird T(i) überprüft, um zu sehen, ob das Sprungziel ein Sprung zur SPULE-EIN-Routine ist. Trifft dies zu, wird M(1,i), wobei 1 die Zeile und "i" die Spalte der Zwischenverbindungsmatrix M ist, mit einem "+1"-Anschlußanzeiger geladen. Bei einem Prozeßblock 296 wird T(i) überprüft, um zu sehen, ob das Sprungziel auf die SPULE-AUS-Routine gerichtet ist. Trifft dies zu, wird die Matrixindexvariable a um 1 inkrementiert und B(i) wird verkippt bzw. umgeschaltet und für jede Spalte x von M mit einer Spaltenzahl größer als "i" und enthaltend keine "-1"-Anschlußanzeiger wird M(A,x) geladen mit einem "-1"-Anschlußanzeiger gemäß einem Prozeßblock 298.
Bei einem Prozeßblock 502 wird T(i) überprüft, um zu sehen, ob das Sprungziel eine andere Sprunganweisung ist. Trifft dies zu, ruft der Dekompilierer die Nummerzielroutine (number target routine) oder Zielnumerierroutine auf, wie es in Fig. 10 gezeigt ist.
Es wird jetzt auch auf Fig. 10 Bezug genommen. Der erste Schritt der Nummerzielroutine ist bei einem Prozeßblock 310 gezeigt. Danach wird die Spalte T(i) der Matrix M überprüft, um zu sehen, ob sie einen "-1"-Anschlußanzeiger enthält. Trifft dies zu, wird bei einem Prozeßblock 312 ein "+1"-Anschlußanzeiger in einen Matrixplatz M(x,i) plaziert, wobei x die Zeile ist, die den "-1"-Anschlußanzeiger in der Matrixspalte T(i) enthält.
Wenn die Spalte T(i) der Matrix M einen "-1"-Anschlußanzeiger nicht enthält, wird die Matrixindexvariable a um 1 inkrementiert, B(i) wird verkippt bzw. umgeschaltet, und der Matrixplatz M(a,i) wird mit einem "+1"-Anschlußanzeiger geladen. Es wird auch jede Spalte der Matrix mit x größer als Spalte "i" und kleiner als Spalte T(i), die nicht einen "-1"-Anzeiger enthält, mit einem "-1"-Anschlußanzeiger geladen. Die Routine kehrt dann zu dem in Fig. 9 gezeigten De- oder Entkompilierprogramm zurück.
Bei einem Prozeßblock 305 überprüft das Entkompilierprogramm, ob alle Sprunganweisungen "i" ausgeführt worden sind. Falls dies nicht der Fall ist, kehrt das Programm zu der nächsten vorangegangenen Sprunganweisung zurück, wie dies in einem Block 307 dargestellt ist, und bildet eine Schleife, bis alle Sprungbefehle durch die obigen Schritte verarbeitet worden sind. Falls beim Prozeßblock 305 alle Sprunganweisungen verarbeitet worden sind, wird die Matrixindexvariable a um 1 inkrementiert, und ein "-1"-Anschlußanzeiger wird in jede Spalte der Matrix M gegeben, die keinen "-1"-Anschlußanzeiger enthält.
Die Zwischenverbindungsmatrix M enthält jetzt eine Darstellung des wiederzugewinnenden Leiterlogikdiagramms. Jede Spaltenzahl stellt einen Kontakt dar, und jede Reihen- oder Zeilenzahl stellt einen Knoten dar, bei dem Kontakte miteinander verbunden sein können. Ein "+1"-Anschlußanzeiger in einem Matrixelement zeigt einen "stromaufwärts" gelegenen Anschluß eines Kontakts und eine Verbindung zwischen diesem Anschluß und irgendeinem anderen Kontakt mit einem "-1"-Anschlußanzeiger oder einem "+1"-Anschlußanzeiger in dieser Zeile oder Reihe an. Ein "-1"-Anschlußanzeiger in einem Matrixelement zeigt einen "stromabwärts" gelegenen Anschluß eines Kontakts und eine Verbindung zwischen diesem Anschluß und irgendeinem anderen Kontakt mit einem "-1"-Anschlußanzeiger oder einem "+1"-Anschlußanzeiger in dieser Zeile oder Reihe an. Eine graphische Rekonstruktion des Leiterlogikdiagramms kann man dadurch schnell ausführen, daß die Kontakte in der angegebenen Weise miteinander verbunden werden. Die Zwischenverbindungsmatrix M kann auch durch zwei Vektoren dargestellt werden, deren Länge gleich der Maximalanzahl von Kontakten in einer Sprosse mit der Kontaktanzahl entsprechenden Elementen ist. Die Elemente des ersten Vektors enthalten die Reihennummer oder Reihenzahl der "+1"-Anzeiger der Kontakte. Der zweite Vektor enthält die Reihennummer oder Reihenzahl der "-1"-Anzeiger der Kontakte.
Zum Erzeugen des de- oder entkompilierten I-Code zusätzlich zu dem Leiterdiagramm, ruft der Entkompilierer eine in Fig. 1 dargestellte Matrixvereinfachungsroutine auf.
Der erste Schritt der Matrixvereinfachungsroutine ist es, eine Stranganordnung I mit den in B(i) gespeicherten Kontaktidentifiziersträngen zu initialisieren, d. h. XIC und XIO. Dies geschieht bei einem Prozeßblock 320. Bei einem Prozeßblock 318 wird die Zwischenverbindungsmatrix M auf benachbarte übereinstimmende Spalten überprüft. Wird eine Übereinstimmung festgestellt, werden bei einem Prozeßblock 321 die Reihen oder Zeilen überprüft, die "+1"- und "-1"-Anzeiger enthalten. Wenn kein weiteres "+1"-Element in der Zeile gefunden wird, die die "+1"-Elemente enthält, oder wenn kein weiteres "-1"-Element in der Reihe oder Zeile des "-1"-Elements vorhanden ist, werden die Stränge BST und LST ("Verzweigungsbeginn" und "Stufenbeginn") in der Anordnung I vor den Kontaktidentifiziersträngen für die ersten übereinstimmenden Spalten eingesetzt, die Stränge LND und LST ("Stufenende" und "Stufenbeginn") werden in der Anordnung I zwischen den Kontaktidentifizierern für die ersten und zweiten übereinstimmenden Spalten eingesetzt, und die Stränge LND und BND ("Stufenende" und "Verzweigungsende") werden in die Anordnung I nach dem zweiten übereinstimmenden Strang eingesetzt. Wenn gemäß dem Prozeßblock 321 sowohl ein zusätzliches "+1"- und "-1"-Element in den entsprechenden Zeilen der übereinstimmenden Spalten auftritt, werden ein LND und LST zwischen die Kontaktidentifizierer für diese Spalten eingesetzt (BST, LST und LND, BND werden später eingegeben, wenn die vereinigte Spalte mit anderen Spalten vereinigt ist). Eine der beiden Spalten wird dann eliminiert, wobei die Matrix um eine Spalte gemäß einem Prozeßblock 328 vermindert wird.
Bei einem Prozeßblock 326 wird die Matrix M auf Zeilen überprüft, die nur einen einzigen benachbarten "-1"-Anschlußanzeiger und "+1"-Anzeiger enthalten. Wird eine solche Zeile gefunden, werden die beiden Spalten verkettet, wobei wiederum die Gesamtanzahl der Spalten in der Matrix M um eine Spalte reduziert wird. Zur Anordnung I werden keine Zusätze gemacht.
Mit diesen beiden Prozessen wird fortgefahren, bis nur noch eine einzige Matrixspalte übrig bleibt, wie es bei einem Prozeßblock 334 festgestellt wird. Die Anordnung I enthält jetzt den de- oder entkompilierten I-Code. Sofern boolesche Logik- oder Verknüpfungsgleichungen erwünscht sind, erfolgt die obige Umsetzung in ähnlicher Weise, ausgenommen daß BST LST ersetzt ist durch "(", LND LST ist ersetzt durch ein "+" (logisches ODER), und LND BND ist ein")". Die resultierende Gleichung ist ein boolescher Ausdruck mit der implizierten Multiplikation zwischen Termen, die eine "UND"-Funktion darstellen, und dem Zusatz von Termen, die eine "ODER"-Funktion darstellen.
Dekompilierungsbeispiel
Fig. 13 (a) zeigt den ersten Schritt zur De- oder Entkompilierung des Maschinencode nach Fig. 12 (c). Die Zwischenverbindungsmatrix M 400 wird gebildet, wie es beim Prozeßblock 286 des Entkompilierers gezeigt ist, und enthält fünf Spalten entsprechend den fünf Kontakten des Leiterdiagramms nach Fig. 12 (a). Die Zwischenverbindungsmatrix M kann eine spezifizierte Maximalanzahl von Zeilen enthalten, die gleich der Maximalanzahl der Kontakte pro Sprosse ist. Bei dem bevorzugten Ausführungsbeispiel ist allerdings anfangs gemäß Fig. 13 (a) nur eine Zeile dargestellt. Eine Stranganordnung 402, in der Symbole entsprechend den Werten von B(i), wie oben bestimmt, dargestellt sind, wird ebenfalls erzeugt gemäß dem Prozeßblock 284 des Entkompilierers.
Bei der Entkompilierung von Schritt 5 des Maschinencodes, wie in Fig. 12 (c) gezeigt, wo ein Sprung zur "SPULE-EIN"-Routine dargestellt ist, wird ein "+1"-Anschlußanzeiger in der ersten Zeile und fünften Spalte der Matrix M gemäß der Matrix nach Fig. 13 (b) gesetzt. Dies spiegelt wieder die Prozeßblöcke 292 und 284 des Entkompilierungsprogramms.
Fig. 13 (c) kann man entnehmen, daß ein "+1"-Anschlußanzeiger in der vierten Spalte und ein "-1"-Anschlußanzeiger in der fünften Spalte der zweiten Reihe der Matrix M gemäß den Prozeßblöcken 296 und 298 des Entkompilierers plaziert wird. Diese Aktionen erfolgen als Antwort auf den vierten Maschinensprachenbefehl, der in Fig. 12 (c) gezeigt ist und einen Sprung zur "SPULE-AUS"-Routine darstellt. Es sei bemerkt, daß das vierte Symbol im Strang I "verkippt" ("toggled") bzw. umgeschaltet worden ist, und zwar von dem Symbol für einen geschlossenen Kontakt zu dem Symbol für einen geöffneten Kontakt.
Fig. 13 (d) zeigt die Ergebnisse der Entkompilierung des dritten Maschinensprachenbefehls, der einen Sprung zum fünften Maschinensprachenbefehl darstellt. Gemäß dem Prozeßblock 302 und der in Fig. 10 dargestellten Zahl- oder Nummernzielroutine wird ein "+1"-Anschlußanzeiger in die Zeile 2 Spalte 3 der Matrix M eingesetzt, wodurch dem Umstand Rechnung getragen wird, daß die Spalte 5, d. h. die Spalte, die dem Ziel des Sprungs entspricht, bereits einen "-1"-Anschlußanzeiger enthält, wie es im Prozeßblock 310 erfaßt wird.
Der zweite Maschinensprachenbefehl ruft nach einem Sprung zur "EIN"-Routine, und daher erhält Zeile 1 Spalte 2 der Matrix M einen "+1"-Anschlußanzeiger gemäß dem Prozeßblock 292 und 294, wie es in Fig. 13 (e) dargestellt ist.
Aufgrund des ersten Maschinensprachenbefehls, der einen Sprung zur "AUS"-Routine darstellt, erhält, wie es in Fig. 13 (f) dargestellt ist, Zeile 3 Spalte 1 der Matrix M einen "+1"-Anschlußanzeiger und Zeile 3 Spalte 2 bis Spalte 4 einen "-1"-Anschlußanzeiger. Spalte 5, die bereits einen "-1"-Anschlußanzeiger enthält, bekommt keinen "-1"-Anschlußanzeiger gemäß dem Prozeßblock 298. Es wird wiederum darauf aufmerksam gemacht, daß der Sinn des ersten Symbols in der Stranganordnung I umgeschaltet oder verändert worden ist, und zwar von einem Symbol, das einen normalerweise offenen Kontakt (Schließer) darstellt, in ein Symbol, das einen normalerweise geschlossenen Kontakt (Öffner) darstellt.
Nachdem alle Sprunganweisungen entkompiliert worden sind, wird gemäß den Prozeßblöcken 305 und 306 eine neue Zeile in der Matrix M erzeugt, und alle Spalten, in denen sich noch kein "-1"-Anschlußanzeiger befindet, erhalten einen "-1"-Anschlußanzeiger, wie es in Fig. 13 (g) dargestellt ist. Die Matrix M ist jetzt vollendet, und es wird die Matrixvereinfachungsroutine aufgerufen, wie sie in Fig. 11 dargestellt ist.
Es wird jetzt auch auf Fig. 15 (a) bis (c) Bezug genommen. Es ist darin eine direkte Rekonstruktion des Leiterlogikdiagramms dargestellt. In Fig. 15 (a) ist die vervollständigte Zwischenverbindungsmatrix M gezeigt, allerdings im Gegenuhrzeigersinn um 90°C gedreht. Fig. 15 (b) zeigt Kontakte, die gemäß ihren Anschlußpositionen, wie sie durch die "+1"-Anschlußanzeiger und "-1"-Anschlußanzeiger in der Zwischenverbindungsmatrix angegeben sind, dieser Zwischenverbindungsmatrix überlagert sind. Fig. 15 (c) zeigt das resultierende Leiterlogikdiagramm, wobei die Kontakte per Übereinkunft zu der höchsten leeren Position verschoben sind und die Ausgangsspule sowie die Stromschienen hinzugefügt sind.
Der I-Code kann aus der Zwischenverbindungsmatrix mittels der Matrixvereinfachungsroutine extrahiert werden.
Die Matrixvereinfachungsroutine wendet zwei Regeln an, eine Regel zur Vereinfachung paralleler Kontakte und eine Regel zur Vereinfachung serieller Kontakte. Die erste Matrixvereinfachungsregel, die durch die Prozeßblöcke 318, 322, 324 und 328 dargestellt ist, wird angewendet auf die Spalten 3 und 4, wie es in Fig. 14 (a) gezeigt ist. Diese beiden Spalten sind einander identisch und können daher als parallele Kontakte miteinander vereinigt werden. Das Ergebnis einer solchen Kombination oder Vereinigung ist in Fig. 14 (b) dargestellt, in der die Strangsymbole in I eingesetzte Verzweigungs- und Stufen-Skizzierungen enthalten.
Die Matrix nach Fig. 14 (b) ist so markiert, daß die neue vereinigte oder kombinierte Spalte "(3 + 4)" und die Spalte 5 identifiziert werden, die jetzt zusammen in Form von Reihenkontakten gemäß den Regeln nach den Prozeßblöcken 326, 332 und 330 vereinfacht werden können. Als Ergebnis dieser Vereinfachung sind diese Spalten zu einer Spalte "(3 + 4) · 5" vereinigt, wie es aus Fig. 14 (c) hervorgeht. Skizzierungen sind der Stranganordnung I nicht hinzugefügt.
Fig. 14 (c) identifiziert die neue Spalte "(3 + 4) · 5" und auch die Spalte 2 als Spalten, die als Parallelkontakte vereinfacht werden können, und zwar gemäß den Prozeßblöcken 318, 322, 324 und 328, wie es oben beschrieben ist. Das Ergebnis dieser Vereinfachung ist in Fig. 14 (d) gezeigt. Die beiden letzten Spalten, die in Fig. 14 (d) dargestellt sind, können gemäß den Prozeßblöcken 326, 332 und 330 zu Reihenkontakten kombiniert werden, wobei die Stranganordnung I erzeugt wird, die in Fig. 14 (e) dargestellt ist und die den entkompilierten I-Code zeigt.
Das oben beschriebene bevorzugte Ausführungsbeispiel kann in mannigfacher Weise abgewandelt und modifiziert werden, ohne daß dabei der Schutzumfang verlassen wird. So können beispielsweise zusätzliche Ausgangs- oder Ausgabegeräte, wie Zähler und Zeitgeber, leicht dadurch in den Entkompilierungsprozeß eingezogen werden, daß Zeitgeber- oder Zähler-EIN- und -AUS-Routinen an die Stelle der SPULE-EIN- und SPULE-AUS-Routinen treten. Ferner kann man andere Typen oder Arten von Kontakten zusätzlich zu den beschriebenen Kontakten XIO und XIC verwenden, beispielsweise andere Binärzustandskontakte, die für eine besondere Beziehung, beispielsweise "größer als", "gleich" oder "nicht gleich" oder Kombinationen von diesen Beziehungen, zwei Zahlen überprüfen.

Claims (2)

1. Verfahren zum Dekompilieren einer Reihensprungformat-Maschinencode-Implementierung eines Leiterlogikprogramms enthaltend eine Reihe von Sprunganweisungen, von denen jede zum Überprüfen eines Kontaktzustands und zum Springen zu einem Ziel dient, und enthaltend eine SPULE-EIN- sowie eine SPULE-AUS-Routine, in ein Leiterlogikprogramm, das miteinander verbundene Kontakte, von denen jeder einen Kopfanschluß und einen Schwanzanschluß aufweist, und eine Ausgangsspule enthält, welches Verfahren die nachfolgenden Schritte enthält:
  • a) Zuordnen einer Indexnummer zu jeder Sprunganweisung gemäß ihrer Ordnung im Maschinencode,
  • b) Bestimmen des Ziels für jede Sprunganweisung,
  • c) Anwenden eines Satzes vorbestimmter Regeln auf jede Sprunganweisung, in Abhängigkeit von ihrem Ziel, zum Erzeugen einer Zwischenverbindungsmatrix mit Kontaktkopfanzeigerelementen und Kontaktschwanzanzeigerelementen, die in Spalten entsprechend den Kontaktnummern und in Zeilen entsprechend den Knoten von Kontaktzwischenverbindungen angeordnet sind,
  • d) Identifizieren eines Kontaktkopfanschlusses und eines Kontaktschwanzanschlusses mit jedem Kontaktkopfanzeigerelement und Kontaktschwanzanzeigerelement innerhalb einer Spalte der Zwischenverbindungsmatrix,
  • e) Verbinden von Kontaktanschlüssen mit Anzeigerelementen in einer Reihe mit anderen Kontaktanschlüssen mit Anzeigerelementen in dieser Reihe zum Erzeugen einer Darstellung eines Leiterdiagramms des Leiterlogikprogramms.
2. Verfahren zum Dekompilieren eines Reihensprungformat-Maschinencode enthaltend eine Reihe von Sprunganweisungen, von denen jede zum Überprüfen eines Kontaktzustands und zum Springen zu einem Ziel dient, und enthaltend eine SPULE-EIN- und SPULE-AUS-Routine, in einen I-Code, der maschinenlesbare Symbole enthält, welches Verfahren die folgenden Schritte enthält:
  • a) Zuordnen einer Indexnummer zu jeder Sprunganweisung gemäß ihrer Ordnung im Maschinencode,
  • b) Bestimmen des Ziels für jede Sprunganweisung,
  • c) Anwenden eines Satzes vorbestimmter Regeln auf jede Sprunganweisung, in Abhängigkeit von ihrem Ziel, zum Erzeugen eines Kontaktkopfanzeigerelements oder eines Kontaktschwanzanzeigerelements,
  • d) Speichern jedes Anzeigerelements in einer Zwischenverbindungsmatrix, in der die Spalten den Kontaktnummern und die Reihen den Knoten der Kontaktzwischenverbindungen entsprechen,
  • e) Vereinigen von Spalten der Zwischenverbindungsmatrix durch Serien- und Parallelvereinfachungsregeln,
  • f) Speichern von I-Codesymbolen in einem Speicher, welche so gespeicherten Symbole bezogen sind sowohl auf die Spalten der Zwischenverbindungsmatrix, die vereint werden, und auf die Vereinfachungsregel, die zur Vereinigung benutzt wird.
DE4010828A 1989-04-05 1990-04-04 Verfahren zum Warten einer Industriesteuerung Expired - Fee Related DE4010828B4 (de)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US07/333,196 1989-04-05
US07/333,196 US5005152A (en) 1989-04-05 1989-04-05 Industrial controller with decompilable user program

Publications (2)

Publication Number Publication Date
DE4010828A1 true DE4010828A1 (de) 1990-10-11
DE4010828B4 DE4010828B4 (de) 2006-02-02

Family

ID=23301747

Family Applications (1)

Application Number Title Priority Date Filing Date
DE4010828A Expired - Fee Related DE4010828B4 (de) 1989-04-05 1990-04-04 Verfahren zum Warten einer Industriesteuerung

Country Status (3)

Country Link
US (1) US5005152A (de)
JP (1) JP2939288B2 (de)
DE (1) DE4010828B4 (de)

Families Citing this family (29)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5225975A (en) * 1988-04-04 1993-07-06 Square D Company Network programmable logic controller system with ladder editor and parallel and synchronous logic and I/O scanning
US5177420A (en) * 1989-05-01 1993-01-05 Honda Giken Kogyo Kabushiki Kaisha Method of and apparatus for generating control program
US5373438A (en) * 1989-07-18 1994-12-13 Matsushita Electric Industrial Co., Ltd. Sequence controlling method
CA2066724C (en) * 1989-09-01 2000-12-05 Helge Knudsen Operating system and data base
CA2284245C (en) * 1989-09-01 2001-02-06 Amdahl Corporation Operating system and data base having an access structure formed by a plurality of tables
US5581759A (en) * 1990-04-02 1996-12-03 Hitachi, Ltd. Apparatus and method for controlling a system process
JP2530380B2 (ja) * 1990-04-02 1996-09-04 株式会社日立製作所 プロセス制御方法及び制御用コントロ―ラ
US5210837A (en) * 1990-06-15 1993-05-11 Digital Equipment Corporation Methods and apparatus for transforming machine language program control into high-level language constructs by manipulating graphical program representations
JP2765423B2 (ja) * 1992-01-23 1998-06-18 三菱電機株式会社 プログラマブルコントローラ及びその制御方法
US5377315A (en) * 1992-10-06 1994-12-27 Leggett; Andrew G. Regeneration of process control flow diagrams for programmable logic controllers
US5586328A (en) * 1994-10-21 1996-12-17 Microsoft Corporation Module dependency based incremental compiler and method
US5781776A (en) * 1995-11-01 1998-07-14 Allen Bradley Company, Inc. Industrial controller permitting program editing during program execution
US5896289A (en) * 1996-09-05 1999-04-20 Allen-Bradley Company, Llc Output weighted partitioning method for a control program in a highly distributed control system
US5796603A (en) * 1996-10-17 1998-08-18 Allen Bradley Company, Inc. Partitioning program for highly distributed control system to reduce network traffic
US5844794A (en) * 1996-10-18 1998-12-01 Allen Bradley Company, Llc Electronic data communications system having data consumer defining data transmission structure
US6021357A (en) * 1996-11-25 2000-02-01 Eaton Corporation Apparatus for solving ladder logic
US5881290A (en) * 1996-12-09 1999-03-09 Allen-Bradley Company, Llc Industrial controller decompiler accommodating an expandable instruction set
US5819097A (en) * 1996-12-09 1998-10-06 Allen Bradley Company, Llc Industrial controller compiler with expandable instruction set
GB9921720D0 (en) * 1999-09-14 1999-11-17 Tao Group Ltd Loading object-oriented computer programs
GB2363215B (en) * 1999-11-30 2004-01-21 Sgs Thomson Microelectronics Disassembling object code
US20060190106A1 (en) * 2001-07-30 2006-08-24 Rockwell Automation Technologies, Inc. Method for consistent storage of data in an industrial controller
US7065415B2 (en) * 2001-07-30 2006-06-20 Rockwell Automation Technologies, Inc. Method for consistent storage of data in an industrial controller
US8407675B1 (en) 2007-02-06 2013-03-26 The United States Of America As Represented By The Secretary Of The Navy Extraction of executable code and translation to alternate platform
US20220012346A1 (en) * 2013-09-13 2022-01-13 Vmware, Inc. Risk assessment for managed client devices
US10095594B2 (en) * 2016-05-31 2018-10-09 Bristol, Inc. Methods and apparatus to implement communications via a remote terminal unit
US10360125B2 (en) 2016-05-31 2019-07-23 Bristol, Inc. Methods and apparatus to communicatively couple field devices to a remote terminal unit
JP6828700B2 (ja) * 2018-01-19 2021-02-10 株式会社安川電機 電力変換システム、プログラミング支援装置、プログラミング支援方法、プログラム、及び記憶媒体
CN112379635B (zh) * 2020-11-19 2022-03-04 航天新长征大道科技有限公司 Plc梯形图解析方法、装置、电子设备及可读存储介质
CN114610288B (zh) * 2022-05-12 2022-09-16 之江实验室 基于阵列式解析基元结构的后端编译器实现方法及装置

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4722071A (en) * 1985-04-19 1988-01-26 Pertron Controls, Corporation Compiler for evaluating Boolean expressions

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4326207A (en) * 1977-11-18 1982-04-20 Hitachi, Ltd. Programmable sequence controller
JPS6010644B2 (ja) * 1978-09-13 1985-03-19 日産自動車株式会社 シ−ケンス表示制御方法
JPS55135908A (en) * 1979-04-11 1980-10-23 Hitachi Ltd Sequence program input device
JPS56162103A (en) * 1980-05-16 1981-12-12 Toshiba Mach Co Ltd Sequence control device
JPS5760411A (en) * 1980-09-29 1982-04-12 Toyoda Mach Works Ltd Status display device of sequence controller
US4742443A (en) * 1985-03-28 1988-05-03 Allen-Bradley Company Programmable controller with function chart interpreter
US5287548A (en) * 1988-02-29 1994-02-15 Allen-Bradley Company, Inc. Programmable controller having a stored program with both machine language instructions and source code data

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4722071A (en) * 1985-04-19 1988-01-26 Pertron Controls, Corporation Compiler for evaluating Boolean expressions

Also Published As

Publication number Publication date
JP2939288B2 (ja) 1999-08-25
JPH02287704A (ja) 1990-11-27
DE4010828B4 (de) 2006-02-02
US5005152A (en) 1991-04-02

Similar Documents

Publication Publication Date Title
DE4010828B4 (de) Verfahren zum Warten einer Industriesteuerung
DE3610433C2 (de) Verfahren zum Steuern einer Maschine mit einer speicherprogrammierbaren Steuerung mit Funktionsplaninterpreter
DE1499200B2 (de) Datenverarbeitungsanlage mit vorranggesteuerter programm unterbrechung
DE2723523A1 (de) Kompression und dekompression von gespeicherten digitaldaten
DE2936915C2 (de) Verfahren und Vorrichtung zur Steuerung eines Ein-Aus-Anzeige-Wählsignals in einer Anzeige- und Ablaufsteuerung
DE2015971A1 (de) Datenverarbeitungssystem zur Verarbeitung eines Stromes mehrfacher Operanden
DE1474095B1 (de) Programmgesteuerte Datenverarbeitungsanlage
DE2647574C2 (de) Vorrichtung zum Verarbeiten von durch ein Anfangs- und Endzeichen begrenzten Datenfeldsegementen variabler Länge bei einem Umlaufspeicher
DE1499206B2 (de) Rechenanlage
DE1925427A1 (de) Datenuebertragungsvorrichtung zum UEbertragen von Daten zwischen Informationsspeichern
DE1266026B (de) Verfahren und Anordnung zum Verhüten einer Änderung eines Speichermhaltes
DE2739525A1 (de) Prozessor
DE60221515T2 (de) Speichersystem für schleifenbeschleunigung nach wunsch
EP2126644B1 (de) Verfahren zur umwandlung von kontaktplänen
DE2235883C3 (de) Datenverarbeitungseinrichtung
EP1950635B1 (de) Verfahren zum Betrieb eines Automatisierungssystems
DE1774421B1 (de) Mehrprogramm datenverarbeitungsanlage
DE1296427B (de) Datenbearbeitungssystem
DE1499284C3 (de) Datenverarbeitungsanlage
DE1499286B2 (de) Datenbearbeitungsanlage
DE1194605B (de) Verbesserung an Geraeten zur Verarbeitung von Angaben, Informationen od. dgl.
DE2915113A1 (de) Busvorrichtung fuer ein datenverarbeitendes system
DE1449567C3 (de) Digitales Datenverarbeitungssystem
DE1549582B1 (de) Anordnung zur bestimmung der niedrigstwertigen bit position
DE1424756B2 (de) Schaltungsanordnung zum fehlergesicherten Einführen oder Wiedereinführer, von Programmen in den Hauptspeicher einer datenverarbeitenden Anlage

Legal Events

Date Code Title Description
8110 Request for examination paragraph 44
8128 New person/name/address of the agent

Representative=s name: LIPPERT, H., DIPL.-ING., PAT.-ANW., 60322 FRANKFUR

8128 New person/name/address of the agent

Representative=s name: JUNG HML, 80799 MUENCHEN

8364 No opposition during term of opposition
8328 Change in the person/name/address of the agent

Representative=s name: HML, 80799 MUENCHEN

8339 Ceased/non-payment of the annual fee