Die Programmiersprache der P03
Für die PROMODUL-K hat es noch genügt, sich einen Schaltplan vorzustellen, und
diesen dann in KOP umzusetzen. Prinzipiell gilt das auch für die Bitanweisungen der P03. Für die Wortanweisungen ist es aber empfehlenswert, sich die CPU eines Prozessors vorzustellen. Die wahre CPU einer P03 Steuerung ist ein Mikroprozessor der 80x86 Reihe. Das CPU Modell das der P03 Sprache zugrundeliegt ist eine vereinfachte Pseudomaschine. Ein Compiler der Programmiersoftware PRODOC5 verwandelt den Kontaktplan und die Wortbefehle in Anweisungen, die durch den Mikroprozessor der P03 CPU ausgeführt
werden können.
PRODOC 5
Die PRODOC 5 ist die Software mit der eine P03 programmiert, parametriert und getestet wird. Die Software enthält ein sehr umfangreiches Hilfesystem. Ziel der Entwicklung war, den Anwender so selbstständig zu machen, dass er sich alle Informationen aus der Software holen kann.
Deshalb ziehen Sie zunächst das Hilfesystem der P03 zu Rate. Dieses steht Ihnen immer und überall zur Verfügung. Meine Webpage können Sie nur erreichen, wenn Sie Internetzugang haben.
Unter LINK finden Sie Hilfe zur Installation der Software, sowie die ersten Schritte bei der Anwendung.
In den folgenden Themen werde ich mich immer wieder auf PRODOC beziehen.
Compiler
Die P03 hat eine CPU mit einem Mikroprozessor der 8068 Reihe. Diese Prozessoren verstehen Anweisungen wie S 1000 oder LDR 2400 nicht. Es muß also das Quellprogramm auf eine dem Mikroprozessor verständliche Sprache gebracht werden.
Dazu gibt es prinzipiell zwei Verfahren: Interpretieren oder Kompilieren.
- interpretieren: Das SPS Programm wird als Quelldatei in die SPS geladen. Die CPU der SPS schnappt sich aus dem Programmspeicher der SPS die nächste Anweisung, übersetzt (interpretiert) diese und führt sie sogleich aus.
- Kompilieren: Das SPS Programm wird in einen durch den Mikroprozessor direkt ausführbaren Code übersetzt. Dieser Code (Objektcode) wird in die SPS übertragen. Die CPU führt dieses Programm aus.
Ein Vorteil der Interpretation besteht darin, dass jederzeit nachvollziehbar ist, was die SPS macht. Man braucht nur das Quellprogramm aus der SPS hochzuladen um zu erkennen, was läuft. Das ist vor allem bei Programmänderungen lange nach der Inbetriebnahme vorteilhaft, wenn das ursprüngliche Quellprogramm nichtmehr vorliegt.
Ein weiterer Vorteil besteht darin, daß das Programm in der SPS bei Laufzeit geändert werden kann. Eine Online-Änderung.
Nachteilhaft ist, dass der Interpreter jede Anweisung erst lesen, auf Plausibilität prüfen muß und dann erst ausführen kann. Das verbraucht Rechenzeit. Allerdings wird das durch immer leistungsfähigere Prozessoren wett gemacht.
Ein Vorteil der kompilierenden Programmausführung besteht darin, dass die CPU den Programmcode unmittelbar ausführen kann. Rechenzeiten für die die übersetzung des Quellcodes einschließlich der Plausibilitätsprüfungen entfallen. Die Programmausführung wird bedeutend schneller. Ausserdem kann der Compiler das Quellprogramm analysieren und die Ausführung weiterhin optimieren.
Ein Nachteil besteht darin, dass der Objetcode, das lauffähige Programm nichtmehr in ein SPS Quellprogramm rückübersetzt werden kann. Nun ist aber diese "Uploadfähigkeit" ein wichtiges Charakteristikum einer SPS. Um das zu ermöglichen werden in die P03 zwei Programme geladen:
Der ausführbare Objektcode und ein komprimiertes Quellprogramm.
Beim Hochladen des SPS Programms von der Steuerung in den PC wird nur der Quellcode geholt.
Der Speicherraum in der P03 ist begrenzt. Bei größeren Programmen kann es geschehen, dass der Programmspeicher nicht ausreicht, um sowohl den lauffähigen Objektcode und den komprimierten Quellcode in der SPS abzuspeichern. Für diesen Fall kann man auch den Objektcode allein, ohne Quellcode in den Programmspeicher der P03 zu laden. Dann kann allerdings das SPS Programm nichtmehr aus der Steuerung in das Programmiergerät hochgeladen werden. Für Programmänderungen ist man auf auf eine aktuelles
Originalprogramm angewiesen.
Adressraum:
Wie bei den Systemen PDPS und P02 unterscheidet die P03 in Wort und Bitadressen, die nichts miteinander zu tun haben. Es sind also nicht, wie bei einem bekannten anderem System, die Bits Teile von Bytes, Worten und Doppelworten. Einzelbits oder auch Merker befinden sich im Bitadressraum. Worte, oder auch Wortmerker befinden sich im Wortadressraum. Für den wortweisen Zugriff auf auf eine Gruppe von Einzelbits (Bitmerkern) oder den bitweisen Zugriff auf Worte gibt es eigene Befehle.
Die Adressen der P03 werden im
oktalen Zahlensystem angegeben.
Die Bereiche können über die Programmiersoftware PRODOC 5 vergeben werden:
Prinzipiell sind die Adressen wie folgt vergeben:
Bit
|
Wort
|
4400Q bis 5000Q
|
384 batteriegepufferte Bits (remanente Merker). Der Zustand dieser Bits (Merker) überlebt eine Unterbrechung der Versorgungsspannung, oder die Betätigung der Reset Taste. Die untere Grenze dieses Bereichs kann über die Menüzeile "gepufferte Merker" angepasst werden. Der Bereich reicht bis zum oberen Ende des Bitmerkerbereichs
|
50Q bis 4400Q
|
2.264 Bits ("Bitmerker"). Der Zustand dieser Bits wird beim Einschalten der Versorgungsspannung (oder nach Betätigung der Resettaste) auf Null gesetzt. D.h. Selbsthaltungen sind, wie bei einer Schützsteuerung, nach "Spannung EIN" zurückgesetzt. Die Obergrenze dieses Bereichs kann über die Menüzeile "Bitmerker ... bis Adresse" angepasst werden
|
0 bis 47Q
|
intern belegt; z.B. Blinkbits
|
|
1 bis 4000Q
|
2047 Worte, batteriegepuffert. Die Obergrenze kann durch die Menüzeile "Wortmerker ... bis Adresse" angepasst werden.
|
100Q bis 277Q
|
Teilbereich der Wortmerker mit 14-Bit Worten, batteriegepuffert. Diese Worte dienen als Zählzellen bei HRA und NRA Befehlen, z.B. für Zeiten und Zähler. Dabei werden die Zählflanken in den obersten Bits gespeichert. Siehe "Datenwort der P03". Die Untergrenze dieses Bereichs wird über die Menüzeile "14 Bit Wortmerker Basisadresse" eingestellt, die Obergrenze über die Menüzeile "14 Bit Wortmerker Anzahl".
Die Anzahl der Wortmerker wird oktal vorgegeben. 100Q (oktal) entsprechen also 64D(dezimal) Worten
|
0
|
reserviert für CPU: Erweiterungsregister
|
|
Interne Bits
|
ADR.
|
Als Eingang programmiert z.B
0007 0004
---] [--- ---]/[---
|
Als Ausgang programmiert z.B
0000
---( A )
|
0
|
wird durch den Vergleichsbefehl (z.B. CDW) zusammen mit den Bits 1 und 2 gesetzt.
Bit 0 = 0: Der Inhalt des Akkumulators ist nicht kleiner als der Vergleichswert. Oder auch größer oder gleich dem Vergleichswert.
Bit 0 = 1: Der Inhalt des Akkumulators ist kleiner als der Vergleichswert.
|
Abschluß eines Netzwerks. Die nächste Anweisung steht immer am Anfang des nächsten Netzwerks
|
1
|
wird durch den Vergleichsbefehl (z.B. CDW) zusammen mit den Bits 0 und 2 gesetzt.
Bit 0 = 0: Der Inhalt des Akkumulators ist nicht gleich dem Vergleichswert.
Bit 0 = 1: Der Inhalt des Akkumulators ist gleich dem Vergleichswert.
|
Freigabe für Interrupt von einer Bitkarte
|
2
|
wird durch den Vergleichsbefehl (z.B. CDW) zusammen mit den Bits 0 und 1 gesetzt.
Bit 2 = 0: Der Inhalt des Akkumulators ist nicht größer als der Vergleichswert. Oder auch kleiner oder gleich dem Vergleichswert.
Bit 2 = 1: Der Inhalt des Akkumulators ist größer als der Vergleichswert.
|
Freigabe für Interrupt von einer Wortkarte
|
3
|
Vorzeichen (oberstes Bit des Datenwortes)
Bit 3 = 0: positive Zahl
Bit 3 = 1: negative Zahl
|
Reserve
|
4
|
Eingeprägte logische "0"
S 4 unterbricht den Strang (immer aus)
O 4 leitet den logischen Zustand weiter (immer ein)
|
Reserve
|
5
|
Überlauf nach Addition oder Subtraktion
|
Reserve
|
6
|
Blinkbit 10 Hz.
synchron zu HP1: dieses Bit bleibt während der ganzen Laufzeit von HP1 und den aufgerufenen Unterprogrammen stabil. Zustandswechsel erfolgt, falls nötig, am Anfag des nächsten Zyklus von HP1.
|
Reserve
|
7
|
Blinkbit 1 Hz.
synchron zu HP1: dieses Bit bleibt während der ganzen Laufzeit von HP1 und den aufgerufenen Unterprogrammen stabil. Zustandswechsel erfolgt, falls nötig, am Anfag des nächsten Zyklus von HP1.
|
Reserve
|
10
|
Busstörung; keine Störung: high; Störung: low. Der Störzustand bleibt gespeichert, auch wenn der Grund der Störung wieder abgefallen ist.
|
Reserve
|
11
|
Netzteilstörung
|
Reserve
|
12
|
Reserve
|
Ein Impuls auf diese Adresse versucht, das Störflipflop 10 (Busstörung) zurück zu setzen. Erfolglos, wenn der Störgrund für die Busstörung permanent ansteht.
|
13
|
Zustand des Betriebsbereit Relais
|
Schaltet Betriebsbereit-Relais ein, schaltet die Ausgangskarten frei, Schaltet die Betriebsanzeige LED auf grün.
|
14
|
Reserve
|
Reserve
|
15
|
Fehler bei relativem Speicherzugriff
|
versucht, Fehlerbit 15 (Relativfehler) zurückzusetzen
|
16
|
Buszugriff auf nicht vorhandenes Modul
|
versucht, Fehlerbit 16 (Karte fehlt) zurückzusetzen
|
17
|
Division oder BCD Wandlung fehlerfrei
|
|
20
|
Ergebnis bei vorzeichenrichtigem Vergleich: Akku kleiner als Operand (wird zusammen mit Bit 21 und Bit 22 gesetzt)
|
|
21
|
Ergebnis bei vorzeichenrichtigem Vergleich: Akku gleich wie Operand (wird zusammen mit Bit 20 und Bit 22 gesetzt)
|
|
22
|
Ergebnis bei vorzeichenrichtigem Vergleich: Akku größer als Operand (wird zusammen mit Bit 20 und Bit 21 gesetzt)
|
|
23
|
Interruptfrequenz zu hoch; HP1 läuft länger als programmierte Zykluszeit
|
|
24
|
Reserve
|
Reserve
|
25
|
Batteriefehler
|
|
26
|
10 Hz Takt synchron zu Quartz, Zustandwechsel währen der Laufzeit von HP1 und all seinen Unterprogrammen möglich
|
|
27
|
1 Hz Takt synchron zu Quartz, Zustandwechsel währen der Laufzeit von HP1 und all seinen Unterprogrammen möglich
|
|
30
|
Zustandsabfrage Akkumulator Bit 0
|
Bit 0 des Akkumulators setzen, wenn Zustand = 1
Bit 0 des Akkumulators löschen, wenn Zustand = 0
|
31
|
Zustandsabfrage Akkumulator Bit 1
|
Bit 1 des Akkumulators setzen, wenn Zustand = 1
Bit 1 des Akkumulators löschen, wenn Zustand = 0
|
32
|
Zustandsabfrage Akkumulator Bit 2
|
Bit 2 des Akkumulators setzen, wenn Zustand = 1
Bit 2 des Akkumulators löschen, wenn Zustand = 0
|
|
... etc.
|
... etc.
|
46
|
Zustandsabfrage Akkumulator Bit 14
|
Bit 14 des Akkumulators setzen, wenn Zustand = 1
Bit 14 des Akkumulators löschen, wenn Zustand = 0
|
47
|
Zustandsabfrage Akkumulator Bit 15
|
Bit 15 des Akkumulators setzen, wenn Zustand = 1
Bit 15 des Akkumulators löschen, wenn Zustand = 0
|
|
Zurück zur Themenübersicht
Ein-/Ausgänge
Ein- und Ausgänge werden über die Steckplatzliste der Programmiersoftware PRODOC 5 vereinbart:
Datenformat Wort:
Das Datenwort der P03 ist 16 Bit breit. Beim Datenwort für Zählbefehle dienen die obersten Bits zur Abspeicherung der Flanken. Das Datenwort für Zählbefehle ist 14 Bit breit
Zurück zur Themenübersicht
Die CPU der P03
Die CPU ist aus der Reihe INTEL 8086. Die Software emuliert eine weiterentwickelte PDPS CPU mit 16 Bit Datenformat.
Programmzähler
Für jede der vier Tasks gibt es einen Programmzähler, der Unterprogrammsprünge ausführen kann. Programmsprünge nach vorne oder nach hinten (goto) sind nicht programmierbar
Register
Datenregister: Das Datenregister entspricht dem Akkumulator eines Mikroprozessors. Er dient als Merkzelle für Zwichenergebnisse. Das Datenregister ist entsprechend dem Wortformat der P03 16 Bit breit.
Adressregister: Dieses Register entspricht dem Indexregister eines Mikroprozessors und dient zur Berechnung der Speicheradresse von relativ adressierten Befehlen.
Hilfsregister: verlängert das Datenregister um ein 16 Bit Wort nach links für Doppelwortoperationen bei Schiebebefehlen, Multiplikationen und Divisionen. Das Hilfsregister wird über die Adresse 0 erreicht (LDA 0, LRA 0)
VKE oder Bit Akku: enthält das Zwischenergebnis (Verknüpfungsergebnis) von logischen Netzwerken
des SPS Programms. Das VKE steuert auch die Ausführung der Wortanweisungen.
Bit Abeitsspeicher und E/A:
Die P03 hat voneinander getrennt einen Bitspeicherbereich und einen Wortspeicherbereich. Der Bit Arbeitsspeicher der P03 wird über Bitbefehle erreicht. Es gibt also keine Operandenkennung, die bezeichnet, ob es sich um eine Wort- oder Bitadresse handelt.
Bitanweisungen geifen auf den Bitbereich zu, Wortanweisungen greifen auf den Wortbereich zu.
Die Bit Eingänge und Bit Ausgänge sind Teil des Bitspeicherbereichs der P03 ("memory mapped I/O").
Die Lage der Ein- und Ausgänge wird über die Steckplatzliste vorgegeben. Es gibt also keine Operandenkennung, die kennzeichnet, ob ein Bitbefehl mit einem Bit Eingang, einem Bit Ausgang oder eine Bit Merkeradresse handelt.
Beispiele (AWL):
S 100 ;"Schliesser" von einer Bitadresse; sie ist ein E/A, wenn diese in der Steckplatzliste als Ein- oder Ausgang definiert ist
S 3000 ;"Schliesser" von einer Bitadresse; sie ist ein E/A, wenn diese in der Steckplatzliste als Ein- oder Ausgang definiert ist.
A 1000 ;Zuweisung auf eine Bitadresse; sie ist ein Ausgang, wenn diese in der Steckplatzliste als Ausgang definiert ist.
LRA 1000 ;Wortzugriff auf die Wortadresse 1000. Kein Einfluß auf den Bitspeicher
S 3000 ;"Zuweisung auf eine Bitadresse; sie ist ein Ausgang, wenn diese in der Steckplatzliste als Ausgang definiert ist.
Es empfiehlt sich also, stets die Steckplatzliste vor Augen zu haben.
Zumeist werden die Eingänge ab Adresse 100 gelegt, die Ausgänge ab Adresse 1000.
Zurück zur Themenübersicht
Wort Arbeitsspeicher und Wort E/A
Die P03 hat voneinander getrennt einen Bitspeicherbereich und einen Wortspeicherbereich. Der Bit Arbeitsspeicher der P03 wird über Bitbefehle erreicht. Es gibt also keine Operandenkennung, die bezeichnet, ob es sich um eine Wort- oder Bitadresse handelt.
Wortanweisungen geifen auf den Wortbereich zu, Bitanweisungen greifen auf den Bitbereich zu.
Die Anzahl der Wortmerker wird über das Menü "Steuerungsparameter" definiert.Über die Steckplatzliste werden die Wort Ein-/Ausgangskarten definiert. Auf diese wird jedoch mit speziellen Wortbefehlen zugegriffen
Beispiele (AWL):
LDA 2125 ;Zugriff auf die Wortspeicheradresse 2125.
HRA 200 ;Zählbefehl auf die Wortadresse 200. PRODOC überwacht, ob diese Adresse im 14 Bit Wortspeicherbereich liegt.
A 200 ;Bitbefehl mit Zuweisung auf eine Bitadresse; kein Einfluß auf die Wortadresse 200.
Zurück zur Themenübersicht
Interaktion von Wort- und Bitanweisungen:
Netzwerke mit Bitanweisungen werden wie in der PROMODUL-K aufgebaut. Wortanweisungen können an beliebiger Stelle des Netzwerkes stehen.
Wortanweisungen werden dann ausgeführt wenn sie im aktiven Pfad eines Netzwerkes stehen
00160:| 0100 3025
|---WWW-------] [H--|
|
00162: | 0101 0004
|---WWW-------]/[N--------------
| |
00164: | 0301 0102 0004 |
|---] [-------WWW-------]/[N----
| |
00167: | 1241 0103 0004 | 0104 1310
|---]/[-------WWW-------]/[H------WWW------( A )
|
Die Wortanweisung WWW 0100 wird immer ausgeführt
Die Wortanweisung WWW 0101 wird ausgeführt, wenn das Merkerbit 3025 EIN ist.
Die Wortanweisung WWW 0102 wird ausgeführt, wenn das Merkerbit 3025 EIN und der Eingang 301 EIN ist.
Die Wortanweisung WWW 0103 wird ausgeführt, wenn das Merkerbit 3025 EIN und der Ausgangsmerker 1241 AUS ist.
Die Wortanweisung WWW 0104 wird ausgeführt, wenn das Merkerbit 3025 EIN ist (der ÖN 0004 schaltet immer durch).
|