summaryrefslogtreecommitdiff
path: root/ldmicro/obj/helptext.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ldmicro/obj/helptext.cpp')
-rw-r--r--ldmicro/obj/helptext.cpp3877
1 files changed, 0 insertions, 3877 deletions
diff --git a/ldmicro/obj/helptext.cpp b/ldmicro/obj/helptext.cpp
deleted file mode 100644
index 16d60fd..0000000
--- a/ldmicro/obj/helptext.cpp
+++ /dev/null
@@ -1,3877 +0,0 @@
-// generated by txt2c.pl from
-#include <stdlib.h>
-#ifdef LDLANG_DE
-char *HelpTextDe[] = {
- "",
- "EINFÜHRUNG",
- "===========",
- "",
- "LDmicro erzeugt einen systemspezifischen Code für einige Microchip PIC16",
- "und Atmel AVR Mikroprozessoren. Üblicherweise wird die Software für diese",
- "Prozessoren in Programmsprachen, wie Assembler, C oder BASIC geschrieben.",
- "Ein Programm, welches in einer dieser Sprachen abgefasst ist, enthält",
- "eine Anweisungsliste. Auch sind die diese Sprachen sehr leistungsfähig",
- "und besonders gut geeignet für die Architektur dieser Prozessoren,",
- "welche diese Anweisungsliste intern abarbeiten.",
- "",
- "Programme für speicherprogrammierbare Steuerungen (SPS) andererseits,",
- "werden oftmals im Kontaktplan (KOP = ladder logic) geschrieben.",
- "Ein einfaches Programm, könnte wie folgt aussehen:",
- "",
- " || ||",
- " || Xbutton1 Tdon Rchatter Yred ||",
- " 1 ||-------]/[---------[TON 1.000 s]-+-------]/[--------------( )-------||",
- " || | ||",
- " || Xbutton2 Tdof | ||",
- " ||-------]/[---------[TOF 2.000 s]-+ ||",
- " || ||",
- " || ||",
- " || ||",
- " || Rchatter Ton Tneu Rchatter ||",
- " 2 ||-------]/[---------[TON 1.000 s]----[TOF 1.000 s]---------( )-------||",
- " || ||",
- " || ||",
- " || ||",
- " ||------[END]---------------------------------------------------------||",
- " || ||",
- " || ||",
- "",
- " (TON ist eine Anzugsverzögerung, TOF eine Abfallverzögerung.",
- " Die --] [-- Anweisungen bedeuten Eingänge, die sich ähnlich, wie Relais-",
- " kontakte verhalten. Die --( )-- Anweisungen bedeuten Ausgänge, die sich",
- " ähnlich, wie Relaisspulen verhalten. Viele gute Bezugsquellen werden für",
- " KOP im Internet oder sonst wo angeboten; Einzelheiten zu dieser speziellen",
- " Ausführung werden weiter unten angegeben.)",
- "",
- "Einige Unterschiede sind jedoch offensichtlich:",
- "",
- "* Das Programm wird in einem grafischen Format dargestellt",
- " und nicht mit einer aus Anweisungen bestehenden Textliste. Viele",
- " Anwender werden dies zunächst als besser verständlich auffassen.",
- "",
- "* Diese Programme erscheinen wie einfachste Schaltpläne, mit",
- " Relaiskontakten (Eingängen) and Spulen (Ausgängen). Dies ist recht",
- " intuitiv für Programmierer, die über Kenntnisse der Theorie von",
- " Elektroschaltplänen verfügen.",
- "",
- "* Der ‘ladder logic compiler’ übernimmt was wo berechnet wird.",
- " Es ist nicht notwendig einen Code zu schreiben, um zu errechnen, wann",
- " der Status (Zustand) der Ausgänge neu bestimmt werden muss, z.B. auf",
- " Grund einer Änderung eines Eingangs oder Timers. Auch braucht man die",
- " Reihenfolge der Berechnungen nicht anzugeben; die SPS-Hilfsprogramme",
- " übernehmen dies.",
- "",
- "LDmicro kompiliert ‘ladder logic’ (KOP) in PIC16- oder AVR-Code.",
- "Die folgenden Prozessoren werden unterstützt:",
- "",
- " * PIC16F877",
- " * PIC16F628",
- " * PIC16F876 (ungetestet)",
- " * PIC16F88 (ungetestet)",
- " * PIC16F819 (ungetestet)",
- " * PIC16F887 (ungetestet)",
- " * PIC16F886 (ungetestet)",
- " * ATmega8 (ungetestet)",
- " * ATmega16 (ungetestet)",
- " * ATmega32 (ungetestet)",
- " * ATmega128",
- " * ATmega64",
- " * ATmega162 (ungetestet)",
- "",
- "Es wäre einfach noch weitere AVR- oder PIC16-Prozessoren zu unterstützen,",
- "aber ich habe keine Möglichkeit diese zu testen. Falls Sie einen",
- "bestimmten benötigen, so nehmen Sie Kontakt mit mir auf und ich werde",
- "sehen, was ich tun kann.",
- "",
- "Mit LDmicro können Sie ein Kontaktplan-Programm zeichnen bzw. entwickeln.",
- "Auch können Sie dies in Realzeit mit Ihrem Computer simulieren. Wenn",
- "Sie dann überzeugt sind, dass Ihr Programm korrekt ist, so können",
- "Sie die Pins, entsprechend dem Programm als Ein- oder Ausgänge, dem",
- "Mikroprozessor zuweisen. Nach der Zuweisung der Pins können Sie den PIC-",
- "oder AVR-Code für Ihr Programm kompilieren. Der Compiler erzeugt eine",
- "Hex-Datei, mit dem Sie dann Ihren Mikroprozessor programmieren. Dies",
- "ist mit jedem PIC/AVR-Programmer möglich.",
- "",
- "LDmicro wurde entworfen, um in etwa mit den meisten kommerziellen",
- "SPS-Systemen ähnlich zu sein. Es gibt einige Ausnahmen und viele Dinge",
- "sind ohnehin kein Standard in der Industrie. Lesen Sie aufmerksam die",
- "Beschreibung jeder Anweisung, auch wenn Ihnen diese vertraut erscheint.",
- "Dieses Dokument setzt ein Grundwissen an Kontaktplan-Programmierung",
- "und der Struktur von SPS-Software voraus (wie: der Ausführungszyklus,",
- "Eingänge lesen, rechnen und Ausgänge setzen).",
- "",
- "",
- "WEITERE ZIELE",
- "=============",
- "",
- "Es ist auch möglich einen ANSI C - Code zu erzeugen. Diesen können",
- "Sie dann für jeden Prozessor verwenden, für den Sie einen C-Compiler",
- "besitzen. Sie sind dann aber selbst verantwortlich, den Ablauf zu",
- "bestimmen. Das heißt, LDmicro erzeugt nur ein Stammprogramm für einen",
- "Funktions- SPS-Zyklus. Sie müssen den SPS-Zyklus bei jedem Durchlauf",
- "aufrufen und auch die Ausführung (Implementierung) der E/A-Funktionen,",
- "die der SPS-Zyklus abruft (wie: lesen/schreiben, digitaler Eingang usw.).",
- "Für mehr Einzelheiten: Siehe die Kommentare in dem erzeugten Quellcode.",
- "",
- "Ganz zuletzt kann LDmicro auch für eine virtuelle Maschine einen",
- "prozessor-unabhängigen Byte-Code erzeugen, welche mit der KOP-Kodierung",
- "(ladder logic) laufen soll. Ich habe eine Beispiel-Anwendung des",
- "VM/Interpreters vorgesehen, in ziemlich gutem C geschrieben. Dieses",
- "Anwendungsziel wird halbwegs auf jeder Plattform funktionieren, so lange",
- "Sie Ihre eigene VM vorsehen. Dies könnte für solche Anwendungen nützlich",
- "sein, für die Sie KOP (ladder logic) als Datentransfer-Sprache verwenden",
- "möchten, um ein größeres Programm anzupassen. Für weitere Einzelheiten:",
- "Siehe die Kommentare in dem Beispiel-Interpreter.",
- "",
- "",
- "OPTIONEN DER BEFEHLSZEILEN ",
- "==========================",
- "",
- "ldmicro.exe läuft normalerweise ohne eine Befehlszeilen-Option.",
- "Das heißt, dass Sie nur ein Tastenkürzel zu dem Programm benötigen",
- "oder es auf dem Desktop abspeichern und dann auf das Symbol (die Ikone)",
- "doppelklicken, um es laufen zu lassen. Danach können Sie alles ausführen,",
- "was das GUI (Graphical User Interface) zulässt.",
- "",
- "Wenn man an LDmicro einen alleinstehenden Dateinamen in der Befehlszeile",
- "vergeben hat (z. B. ‘ldmicro.exe asd.ld’), wird LDmicro versuchen ‘asd.ld’",
- "zu öffnen, falls diese existiert. Dies bedeutet, dass man ldmicro.exe",
- "mit .ld Dateien verbinden kann, sodass dies automatisch abläuft, wenn",
- "man auf eine .ld Datei doppelklickt.",
- "",
- "Wenn man an LDmicro das Argument in der Befehlszeile in folgender Form",
- "vergeben hat: ‘ldmicro.exe /c src.ld dest.hex’, so wird es versuchen",
- "‘src.ld’ zu kompilieren und unter ‘dest.hex’ abzuspeichern. LDmicro endet",
- "nach dem Kompilieren, unabhängig davon, ob die Kompilierung erfolgreich",
- "war oder nicht. Alle Meldungen werden auf der Konsole ausgegeben. Dieser",
- "Modus ist hilfreich, wenn man LDmicro von der Befehlszeile laufen",
- "aus lässt.",
- "",
- "",
- "GRUNDLAGEN",
- "==========",
- "",
- "Wenn Sie LDmicro ohne Argumente aufrufen, so beginnt es als ein leeres",
- "Programm. Wenn Sie LDmicro mit dem Namen eines ‘ladder’ (KOP)-Programms",
- "(z.B. xxx.ld) in der Befehlszeile öffnen, dann wird es versuchen dieses",
- "Programm am Anfang zu laden.",
- "",
- "LDmicro verwendet sein eigenes internes Format für das Programm und",
- "man kann kein logisches Zeichen aus einem anderen (Fremd-)Programm",
- "importieren.",
- "",
- "Falls Sie nicht ein schon vorhandenes Programm laden, dann wird Ihnen",
- "ein Programm mit einem leeren Netzwerk geliefert. In dieses können Sie",
- "einen Befehl einfügen; z. B. könnten Sie auch eine Reihe von Kontakten",
- "einfügen (Anweisung -> Kontakte Einfügen), die zunächst mit ‘Xneu’",
- "bezeichnet werden. ‘X’ bedeutet, dass der Kontakt auf einen Eingang",
- "des Mikroprozessors festgelegt ist. Diesen Pin können Sie später zuweisen,",
- "nachdem Sie den Mikroprozessor gewählt haben und die Kontakte",
- "umbenannt haben. Der erste Buchstabe zeigt an, um welche Art Objekt es",
- "sich handelt. Zum Beispiel:",
- "",
- " * XName -- Auf einen Eingang des Mikroprozessors festgelegt",
- " * YName -- Auf einen Ausgang des Mikroprozessors festgelegt",
- " * RName -- Merker: Ein Bit im Speicher (Internes Relais)",
- " * TName -- Ein Timer; Anzugs- oder Abfallverzögerung",
- " * CName -- Ein Zähler, Aufwärts- oder Abwärtszähler",
- " * AName -- Eine Ganzzahl, von einem A/D-Wandler eingelesen",
- " * Name -- Eine Allzweck-Variable als Ganzzahl",
- "",
- "Wählen Sie den Rest des Namens, sodass dieser beschreibt, was das Objekt",
- "bewirkt und das dieser auch einmalig im Programm ist. Der gleiche Name",
- "bezieht sich immer auf das gleiche Objekt im Programm. Es wäre zum",
- "Beispiel falsch eine Anzugsverzögerung (TON) ‘TVerzög’ zu nennen und im",
- "selben Programm eine Abfallverzögerung ‘TVerzög’ (TOF), weil jeder Zähler",
- "(oder Timer) seinen eigenen Speicher benötigt. Andererseits wäre es",
- "korrekt einen „Speichernden Timer“ (RTO) ‘TVerzög’ zu nennen und eine",
- "entsprechende Rücksetz-Anweisung (RES) = ‘TVerzög’, weil in diesem",
- "Fall beide Befehle dem gleichen Timer gelten.",
- "",
- "Die Namen von Variablen können aus Buchstaben, Zahlen und Unter-",
- "strichen (_) bestehen. Der Name einer Variablen darf nicht mit einer",
- "Nummer beginnen. Die Namen von Variablen sind fallabhängig.",
- "",
- "Ein Befehl für eine gewöhnliche Variable (MOV, ADD, EQU, usw.), kann",
- "mit Variablen mit jedem Namen arbeiten. Das bedeutet, dass diese Zugang",
- "zu den Timer- und Zähler-Akkumulatoren haben. Das kann manchmal recht",
- "hilfreich sein; zum Beispiel kann man damit prüfen, ob die Zählung eines",
- "Timers in einem bestimmten Bereich liegt.",
- "",
- "Die Variablen sind immer 16-Bit Ganzzahlen. Das heißt sie können von",
- "-32768 bis 32767 reichen. Die Variablen werden immer als vorzeichen-",
- "behaftet behandelt. Sie können auch Buchstaben als Dezimalzahlen festlegen",
- "(0, 1234, -56). Auch können Sie ASCII-Zeichenwerte (‘A’, ‘z’) festlegen,",
- "indem Sie die Zeichen in „Auslassungszeichen“ einfügen. Sie können",
- "ein ASCII-Zeichen an den meisten Stellen verwenden, an denen Sie eine",
- "Dezimalzahl verwenden können.",
- "",
- "Am unteren Ende der Maske (Bildanzeige) sehen Sie eine Liste aller",
- "Objekte (Anweisungen, Befehle) des Programms. Diese Liste wird vom",
- "Programm automatisch erzeugt; es besteht somit keine Notwendigkeit diese",
- "von Hand auf dem Laufenden zu halten. Die meisten Objekte benötigen",
- "keine Konfiguration. ‘XName’, ‘YName’, und ‘AName’ Objekte allerdings,",
- "müssen einem Pin des Mikroprozessors zugeordnet werden. Wählen Sie zuerst",
- "welcher Prozessor verwendet wird (Voreinstellungen -> Prozessor). Danach",
- "legen Sie Ihre E/A Pins fest, indem Sie in der Liste auf diese jeweils",
- "doppelklicken.",
- "",
- "Sie können das Programm verändern, indem Sie Anweisungen (Befehle)",
- "einfügen oder löschen. Die Schreibmarke (cursor)im Programm blinkt,",
- "um die momentan gewählte Anweisung und den Einfügungspunkt anzuzeigen.",
- "Falls diese nicht blinkt, so drücken Sie den <Tabulator> oder klicken",
- "Sie auf eine Anweisung. Jetzt können Sie die momentane Anweisung löschen",
- "oder eine neue Anweisung einfügen; links oder rechts (in Reihenschaltung)",
- "oder über oder unter (in Parallelschaltung) mit der gewählten Anweisung.",
- "Einige Handhabungen sind nicht erlaubt, so zum Beispiel weitere",
- "Anweisungen rechts von einer Spule.",
- "",
- "Das Programm beginnt mit nur einem Netzwerk. Sie können mehr Netzwerke",
- "hinzufügen, indem Sie ‘Netzwerk Einfügen Davor/Danach’ im Programm-Menü",
- "wählen. Den gleichen Effekt könnten Sie erzielen, indem Sie viele",
- "komplizierte parallele Unterschaltungen in einem einzigen Netzwerk",
- "unterbringen. Es ist aber übersichtlicher, mehrere Netzwerke zu verwenden.",
- "",
- "Wenn Sie Ihr Programm fertig geschrieben haben, so können Sie dieses",
- "mit der Simulation testen. Danach können Sie es in eine Hex-Datei für",
- "den zugedachten Mikroprozessor kompilieren.",
- "",
- "",
- "SIMULATION",
- "==========",
- "",
- "Um den Simulationsbetrieb einzugeben, wählen Sie ‘Simulieren ->",
- "Simulationsbetrieb’ oder drücken Sie <Strg+M>. Das Programm wird",
- "im Simulationsbetrieb unterschiedlich dargestellt. Es gibt keine",
- "Schreibmarke (cursor) mehr. Die „erregten“ Anweisungen erscheinen hellrot,",
- "die „nicht erregten“ erscheinen grau. Drücken Sie die Leertaste, um das",
- "SPS-Programm nur einen einzelnen Zyklus durchlaufen zu lassen. Wählen",
- "Sie für einen kontinuierlichen Umlauf in Echtzeit ‘Simulieren -> Start",
- "Echtzeit-Simulation’ oder drücken Sie <Strg+R>. Die Maske (Bildanzeige)",
- "des Programms wird jetzt in Echtzeit, entsprechend der Änderungen des",
- "Status (des Zustands) des Programms aktualisiert.",
- "",
- "Sie können den Status (Zustand) eines Eingangs im Programm einstellen,",
- "indem Sie auf den jeweiligen auf der Liste am unteren Ende der",
- "Maske (Bildanzeige) doppelklicken oder auf die jeweilige ‘XName’",
- "Kontakt-Anweisung im Programm. Wenn Sie den Status (Zustand) eines",
- "Eingangs-Pins ändern, so wird diese Änderung nicht unmittelbar in",
- "der Maske (Bildanzeige) wiedergegeben, sondern erst wenn sich die",
- "SPS im zyklischen Umlauf befindet. Das geschieht automatisch wenn das",
- "SPS-Programm in Echtzeit-Simulation läuft, oder wenn Sie die Leertaste",
- "drücken.",
- "",
- "",
- "KOMPILIEREN ZUM SYSTEMSPEZIFISCHEN CODE",
- "=======================================",
- "",
- "Letztlich ist es dann nur sinnvoll eine .hex Datei zu erzeugen, mit",
- "der Sie Ihren Mikroprozessor programmieren können. Zunächst müssen",
- "Sie die Teilenummer des Mikroprozessors im Menü ‘Voreinstellungen ->",
- "Prozessor’ wählen. Danach müssen jedem ‘XName’ oder ‘YName’ Objekt",
- "einen E/A-Pin zuweisen. Tun Sie dies, indem auf den Namen des Objekts",
- "doppelklicken, welcher sich in der Liste ganz unten in der Maske",
- "(Bildanzeige) befindet. Ein Dialogfenster wird dann erscheinen und Sie",
- "können daraufhin einen noch nicht vergebenen Pin von der Liste aussuchen.",
- "",
- "Als nächstes müssen Sie die Zykluszeit wählen, mit der Sie das",
- "Programm laufen lassen wollen, auch müssen Sie dem Compiler mitteilen",
- "mit welcher Taktgeschwindigkeit der Prozessor arbeiten soll. Diese",
- "Einstellungen werden im Menü ‘Voreinstellungen -> Prozessor Parameter...’",
- "vorgenommen. Üblicherweise sollten Sie die Zykluszeit nicht ändern,",
- "denn diese ist auf 10ms voreingestellt, dies ist ein guter Wert für",
- "die meisten Anwendungen. Tippen Sie die Frequenz des Quarzes (oder des",
- "Keramik-Resonators) ein, mit der Sie den Prozessor betreiben wollen und",
- "klicken auf Okay.",
- "",
- "Jetzt können Sie einen Code von Ihrem Programm erzeugen. Wählen Sie",
- "‘Kompilieren -> Kompilieren’ oder ‘Kompilieren -> Kompilieren unter...’,",
- "falls Sie vorher Ihr Programm schon kompiliert haben und einen neuen Namen",
- "für die Ausgangsdatei vergeben wollen. Wenn Ihr Programm fehlerfrei ist,",
- "wird LDmicro eine Intel IHEX Datei erzeugen, mit der sich Ihr Prozessor",
- "programmieren lässt.",
- "",
- "Verwenden Sie hierzu irgendeine Programmier Soft- und Hardware, die Sie",
- "besitzen, um die Hex-Datei in den Mikroprozessor zu laden. Beachten Sie",
- "die Einstellungen für die Konfigurationsbits (fuses)! Bei den PIC16",
- "Prozessoren sind diese Konfigurationsbits bereits in der Hex-Datei",
- "enthalten. Die meisten Programmiersoftwares schauen automatisch nach",
- "diesen. Für die AVR-Prozessoren müssen Sie die Konfigurationsbits von",
- "Hand einstellen.",
- "",
- "",
- "ANWEISUNGS-VERZEICHNIS",
- "======================",
- "",
- "> KONTAKT, SCHLIESSER XName RName YName",
- " ----] [---- ----] [---- ----] [----",
- "",
- "Wenn ein ‘unwahres’ Signal diese Anweisung erreicht, so ist das",
- "Ausgangssignal ‘unwahr’. Wenn ein ‘wahres’ Signal diese Anweisung",
- "erreicht, so ist das Ausgangssignal ‘wahr’. Dies nur, falls der",
- "vorliegende Eingangspin, Ausgangspin oder eines Merkers (Hilfsrelais)",
- "‘wahr’ ist, anderenfalls ist es unwahr. Diese Anweisung fragt den Status",
- "(Zustand) eines Eingangspins, Ausgangspins oder Merkers (Hilfsrelais) ab.",
- "",
- "",
- "> KONTAKT, ÖFFNER XName RName YName",
- " ----]/[---- ----]/[---- ----]/[----",
- "",
- "Wenn ein ‘unwahres’ Signal diese Anweisung erreicht, so ist das",
- "Ausgangssignal ‘unwahr’. Wenn ein ‘wahres’ Signal diese Anweisung",
- "erreicht, so ist das Ausgangssignal ‘wahr’. Dies nur, falls der",
- "vorliegende Eingangspin, Ausgangspin oder der Merker (= internes",
- "Hilfsrelais) ‘unwahr’ ist, anderenfalls ist es ‘unwahr’. Diese Anweisung",
- "fragt den Status (Zustand) eines Eingangspins, Ausgangspins oder Merkers",
- "(Hilfsrelais) ab. Dies ist das Gegenteil eines Schließers.",
- "",
- "",
- "> SPULE, NORMAL (MERKER,AUSGANG) RName YName",
- " ----( )---- ----( )----",
- "",
- "Wenn ein ‘unwahres’ Signal diese Anweisung erreicht, so wird der",
- "vorliegende Merker (Hilfsrelais) oder Ausgangspin nicht angesteuert. Wenn",
- "ein ‘wahres’ Signal diese Anweisung erreicht, so wird der vorliegende",
- "Merker (Hilfsrelais) oder Ausgangspin angesteuert. Es ist nicht sinnvoll",
- "dieser Spule eine Eingangsvariable zuzuweisen. Diese Anweisung muss",
- "ganz rechts im Netzwerk stehen.",
- "",
- "",
- "> SPULE, NEGIERT (MERKER,AUSGANG) RName YName",
- " ----(/)---- ----(/)----",
- "",
- "Wenn ein ‘wahres’ Signal diese Anweisung erreicht, so wird der vorliegende",
- "Merker (Hilfsrelais)oder Ausgangspin nicht angesteuert. Wenn ein",
- "‘unwahres’ Signal diese Anweisung erreicht, so wird der vorliegende Merker",
- "(Hilfsrelais) oder Ausgangspin angesteuert. Es ist nicht sinnvoll dieser",
- "Spule eine Eingangsvariable zuzuweisen. Dies ist das Gegenteil einer",
- "normalen Spule. Diese Anweisung muss im Netzwerk ganz rechts stehen.",
- "",
- "",
- "> SPULE, SETZEN RName YName",
- " ----(S)---- ----(S)----",
- "",
- "Wenn ein ‘wahres’ Signal diese Anweisung erreicht, so wird der vorliegende",
- "Merker (Hilfsrelais)oder Ausgangspin auf ‘wahr’ gesetzt. Anderenfalls",
- "bleibt der Status (Zustand) des Merkers (Hilfsrelais) oder Ausgangspins",
- "unverändert. Diese Anweisung kann nur den Status (Zustand) einer Spule",
- "von ‘unwahr’ nach ‘wahr’ verändern, insofern wird diese üblicherweise in",
- "einer Kombination mit einer Rücksetz-Anweisung für eine Spule verwendet.",
- "Diese Anweisung muss ganz rechts im Netzwerk stehen.",
- "",
- "",
- "> SPULE, RÜCKSETZEN RName YName",
- " ----(R)---- ----(R)----",
- "",
- "Wenn ein ‘wahres’ Signal diese Anweisung erreicht, so wird der vorliegende",
- "Merker (Hilfsrelais) oder Ausgangspin rückgesetzt. Anderenfalls bleibt der",
- "Status (Zustand) des Merkers (Hilfsrelais) oder Ausgangspins unverändert.",
- "Diese Anweisung kann nur den Status (Zustand) einer Spule von ‘wahr’ nach",
- "‘unwahr’ verändern, insofern wird diese üblicherweise in einer Kombination",
- "mit einer Setz-Anweisung für eine Spule verwendet. Diese Anweisung muss",
- "ganz rechts im Netzwerk stehen.",
- "",
- "",
- "> ANZUGSVERZÖGERUNG Tdon",
- " -[TON 1.000 s]-",
- "",
- "Wenn ein Signal diese Anweisung erreicht, welches seinen Status",
- "(Zustand) von ‘unwahr’ nach ‘wahr’ ändert, so bleibt das Ausgangssignal",
- "für 1,000 s ‘unwahr’, dann wird es ‘wahr’. Wenn ein Signal diese",
- "Anweisung erreicht, welches seinen Status (Zustand) von ‘wahr’ nach",
- "‘unwahr’ ändert, so wird das Ausgangssignal sofort ‘unwahr’. Der Timer",
- "wird jedes Mal rückgesetzt (bzw. auf Null gesetzt), wenn der Eingang",
- "‘unwahr’ wird. Der Eingang muss für 1000 aufeinanderfolgende Millisekunden",
- "‘wahr’ bleiben, bevor auch der Ausgang ‘wahr’ wird. Die Verzögerung",
- "ist konfigurierbar.",
- "",
- "Die ‘TName’ Variable zählt, in der Einheit der jeweiligen Zykluszeit,",
- "von Null ab hoch. Der Ausgang der TON-Anweisung wird wahr, wenn die",
- "Zählervariable größer oder gleich der vorliegenden Verzögerung ist.",
- "Es möglich die Zählervariable an einer anderen Stelle im Programm zu",
- "bearbeiten, zum Beispiel mit einer TRANSFER-Anweisung (MOV).",
- "",
- "",
- "> ABFALLVERZÖGERUNG Tdoff",
- " -[TOF 1.000 s]-",
- "",
- "Wenn ein Signal diese Anweisung erreicht, welches seinen Status",
- "(Zustand) von ‘wahr’ nach ‘unwahr’ ändert, so bleibt das Ausgangssignal",
- "für 1,000 s ‘wahr’, dann wird es ‘unwahr’. Wenn ein Signal diese",
- "Anweisung erreicht, welches seinen Status (Zustand) von ‘unwahr’ nach",
- "‘wahr’ ändert, so wird das Ausgangssignal sofort ‘wahr’. Der Timer wird",
- "jedes Mal rückgesetzt (bzw. auf Null gesetzt), wenn der Eingang ‘unwahr’",
- "wird. Der Eingang muss für 1000 aufeinanderfolgende Millisekunden ‘unwahr’",
- "bleiben, bevor auch der Ausgang ‘unwahr’ wird. Die Verzögerung ist",
- "konfigurierbar.",
- "",
- "Die ‘TName’ Variable zählt, in der Einheit der jeweiligen Zykluszeit,",
- "von Null ab hoch. Der Ausgang der TOF Anweisung wird wahr, wenn die",
- "Zählervariable größer oder gleich der vorliegenden Verzögerung ist.",
- "Es möglich die Zählervariable an einer anderen Stelle im Programm zu",
- "bearbeiten, zum Beispiel mit einer TRANSFER-Anweisung (MOV).",
- "",
- "",
- "> SPEICHERNDER TIMER Trto",
- " -[RTO 1.000 s]-",
- "",
- "Diese Anweisung zeichnet auf, wie lange sein Eingang ‘wahr’ gewesen",
- "ist. Wenn der Eingang für mindestens 1.000 s ‘wahr’ gewesen ist, dann",
- "wird der Ausgang ‘wahr’. Andernfalls ist er ‘unwahr’. Der Eingang muss",
- "für 1000 aufeinanderfolgende Millisekunden ‘wahr’ gewesen sein; wenn",
- "der Eingang für 0,6 s ‘wahr’ war, dann ‘unwahr’ für 2,0 s und danach für",
- "0,4 s wieder ‘wahr’, so wird sein Ausgang ‘wahr’. Nachdem der Ausgang",
- "‘wahr’ wurde, so bleibt er ‘wahr’, selbst wenn der Eingang ‘unwahr’",
- "wird, so lange der Eingang für länger als 1.000 s ‘wahr’ gewesen ist.",
- "Der Timer muss deshalb von Hand mit Hilfe der Rücksetz-Anweisung",
- "rückgesetzt (auf Null gesetzt) werden.",
- "",
- "Die ‘TName’ Variable zählt, in der Einheit der jeweiligen Zykluszeit,",
- "von Null ab hoch. Der Ausgang der RTO-Anweisung wird wahr, wenn die",
- "Zählervariable größer oder gleich der vorliegenden Verzögerung ist.",
- "Es möglich die Zählervariable an einer anderen Stelle im Programm zu",
- "bearbeiten, zum Beispiel mit einer TRANSFER-Anweisung (MOV).",
- "",
- "",
- "> RÜCKSETZEN Trto Citems",
- " ----{RES}---- ----{RES}----",
- "",
- "Diese Anweisung rücksetzt einen Timer oder Zähler. TON oder TOF Timer",
- "werden automatisch rückgesetzt, wenn ihr Eingang ‘wahr’ oder ‘unwahr’",
- "wird, somit ist die RES-Anweisung für diese Timer nicht erforderlich. RTO",
- "Timer und CTU/CTD Zähler werden nicht automatisch rückgesetzt, somit",
- "müssen diese von Hand mit Hilfe der RES-Anweisung rückgesetzt (auf Null)",
- "werden. Wenn der Eingang ‘wahr’ ist, so wird der Timer oder Zähler",
- "rückgesetzt; wenn der Eingang ‘unwahr’ ist, so erfolgt keine Aktion.",
- "Diese Anweisung muss ganz rechts im Netzwerk stehen.",
- "",
- " _",
- "> ONE-SHOT RISING, STEIGENDE FLANKE --[OSR_/ ]--",
- "",
- "Diese Anweisung wird normalerweise ‘unwahr’ ausgewiesen. Wenn der Eingang",
- "der Anweisung während des momentanen Zyklus ‘wahr’ ist und während des",
- "vorgehenden ‘unwahr’ war, so wird der Ausgang ‘wahr’. Daher erzeugt diese",
- "Anweisung bei jeder steigenden Flanke einen Impuls für einen Zyklus.",
- "Diese Anweisung ist hilfreich, wenn Sie Ereignisse an der steigenden",
- "Flanke eines Signals auslösen wollen.",
- "",
- " _",
- "> ONE-SHOT FALLING, FALLENDE FLANKE --[OSF \\_ ]--",
- "",
- "Diese Anweisung wird normalerweise ‘unwahr’ ausgewiesen. Wenn der Eingang",
- "der Anweisung während des momentanen Zyklus ‘unwahr’ ist und während des",
- "vorgehenden ‘wahr’ war, so wird der Ausgang ‘wahr’. Daher erzeugt diese",
- "Anweisung bei jeder fallenden Flanke einen Impuls für einen Zyklus.",
- "Diese Anweisung ist hilfreich, wenn Sie Ereignisse an der fallenden",
- "Flanke eines Signals auslösen wollen.",
- "",
- "",
- "> BRÜCKE, ÖFFNUNG ----+----+---- ----+ +----",
- "",
- "Der Eingangszustand einer Brücke ist immer gleich seinem Ausgangszustand.",
- "Der Ausgangszustands einer Öffnung ist immer ‘unwahr’. Diese Anweisungen",
- "sind bei der Fehlerbehebung (debugging) besonders hilfreich.",
- "",
- "",
- "> MASTER CONTROL RELAIS -{MASTER RLY}-",
- "",
- "",
- "Im Normalfall ist der Anfang (die linke Stromschiene) von jedem Netzwerk",
- "‘wahr’. Wenn eine ‘Master Control Relais’ Anweisung ausgeführt wird dessen",
- "Eingang ‘unwahr’ ist, so werden die Anfänge (die linke Stromschiene)",
- "aller folgenden Netzwerke ‘unwahr’. Das setzt sich fort bis die nächste",
- "‘Master Control Relais’ Anweisung erreicht wird (unabhängig von dem",
- "Anfangszustand dieser Anweisung). Diese Anweisungen müssen daher als Paar",
- "verwendet werden: Eine (vielleicht abhängige), um den „gegebenenfalls",
- "gesperrten“ Abschnitt zu starten und eine weitere, um diesen zu beenden.",
- "",
- "",
- "> TRANSFER, MOV {destvar := } {Tret := }",
- " -{ 123 MOV}- -{ srcvar MOV}-",
- "",
- "Wenn der Eingang dieser Anweisung ‘wahr’ ist, so setzt diese die",
- "vorliegende Zielvariable gleich der vorliegenden Quellvariablen",
- "oder Konstanten. Wenn der Eingang dieser Anweisung ‘unwahr’ ist, so",
- "geschieht nichts. Mit der TRANSFER-Anweisung (MOV) können Sie jede",
- "Variable zuweisen; dies schließt Timer und Zähler Statusvariablen ein,",
- "welche mit einem vorgestellten ‘T’ oder ‘C’ unterschieden werden. Eine",
- "Anweisung zum Beispiel, die eine ‘0’ in einen ‘TBewahrend’ transferiert,",
- "ist äquivalent mit einer RES-Anweisung für diesen Timer. Diese Anweisung",
- "muss ganz rechts im Netzwerk stehen.",
- "",
- "",
- "> ARITHMETISCHE OPERATIONEN {ADD kay :=} {SUB Ccnt :=}",
- " -{ 'a' + 10 }- -{ Ccnt - 10 }-",
- "",
- "> {MUL dest :=} {DIV dv := }",
- " -{ var * -990 }- -{ dv / -10000}-",
- "",
- "Wenn der Eingang einer dieser Anweisungen ‘wahr’ ist, so setzt diese",
- "die vorliegende Zielvariable gleich dem vorliegenden arithmetischem",
- "Ausdruck. Die Operanden können entweder Variabelen (einschließlich Timer-",
- "und Zählervariabelen) oder Konstanten sein. Diese Anweisungen verwenden",
- "16-Bitzeichen Mathematik. Beachten Sie, dass das Ergebnis jeden Zyklus",
- "ausgewertet wird, wenn der Eingangszustand ‘wahr’ ist. Falls Sie eine",
- "Variable inkrementieren oder dekrementieren (d.h., wenn die Zielvariable",
- "ebenfalls einer der Operanden ist), dann wollen Sie dies vermutlich",
- "nicht; normalerweise würden Sie einen Impuls (one-shot) verwenden,",
- "sodass die Variable nur bei einer steigenden oder fallenden Flanke des",
- "Eingangszustands ausgewertet wird. Dividieren kürzt: D.h. 8 / 3 = 2.",
- "Diese Anweisungen müssen ganz rechts im Netzwerk stehen.",
- "",
- "",
- "> VERGLEICHEN [var ==] [var >] [1 >=]",
- " -[ var2 ]- -[ 1 ]- -[ Ton]-",
- "",
- "> [var /=] [-4 < ] [1 <=]",
- " -[ var2 ]- -[ vartwo]- -[ Cup]-",
- "",
- "Wenn der Eingang dieser Anweisung ‘unwahr’ ist, so ist der Ausgang",
- "auch ‘unwahr’. Wenn der Eingang dieser Anweisung ‘wahr’ ist, dann ist",
- "Ausgang ‘wahr’; dies aber nur, wenn die vorliegende Bedingung ‘wahr’",
- "ist. Diese Anweisungen können zum Vergleichen verwendet werden, wie:",
- "Auf gleich, auf größer als, auf größer als oder gleich, auf ungleich,",
- "auf kleiner als, auf kleiner als oder gleich, eine Variable mit einer",
- "Variablen oder eine Variable mit einer 16-Bitzeichen-Konstanten.",
- "",
- "",
- "> ZÄHLER CName CName",
- " --[CTU >=5]-- --[CTD >=5]—",
- "",
- "Ein Zähler inkrementiert (CTU, aufwärtszählen) oder dekrementiert",
- "(CTD, abwärtszählen) die bezogene Zählung bei jeder steigenden Flanke",
- "des Eingangszustands des Netzwerks (d.h. der Eingangszustand des",
- "Netzwerks geht von ‘unwahr’ auf ‘wahr’ über). Der Ausgangszustand des",
- "Zählers ist ‘wahr’, wenn die Zähler- variable ist größer oder gleich 5",
- "und andernfalls ‘unwahr’. Der Ausgangszustand des Netzwerks kann ‘wahr’",
- "sein, selbst wenn der Eingangszustand ‘unwahr’ ist; das hängt lediglich",
- "von Zählervariablen ab. Sie können einer CTU- und CTD-Anweisung den",
- "gleichen Namen zuteilen, um den gleichen Zähler zu inkrementieren und",
- "dekrementieren. Die RES-Anweisung kann einen Zähler rücksetzen oder auch",
- "eine gewöhnliche Variablen-Operation mit der Zählervariablen ausführen.",
- "",
- "",
- "> ZIRKULIERENDER ZÄHLER CName",
- " --{CTC 0:7}--",
- "",
- "Ein zirkulierender Zähler arbeitet wie ein normaler CTU-Zähler, außer",
- "nach der Erreichung seiner Obergrenze, rücksetzt er seine Zählervariable",
- "auf Null. Zum Beispiel würde der oben gezeigte Zähler, wie folgt zählen:",
- "0, 1, 2, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2,.... Dies ist",
- "hilfreich in Kombination mit bedingten Anweisungen der Variablen‘CName’;",
- "Sie können dies als eine Folgeschaltung verwenden. CTC-Zähler takten",
- "mit der aufsteigenden Flanke der Eingangsbedingung des Netzwerks.",
- "Diese Anweisung muss ganz rechts im Netzwerk stehen.",
- "",
- "",
- "> SCHIEBEREGISTER {SHIFT REG }",
- " -{ reg0..3 }-",
- "",
- "Ein Schieberegister besteht aus einer Reihe von Variablen. So bestünde",
- "zum Beispiel ein Schieberegister aus den Variablen ‘reg0’, ‘reg1’,",
- "‘reg2’, and ‘reg3’. Der Eingang des Schieberegisters ist ‘reg0’. Bei",
- "jeder steigenden Flanke der Eingansbedingung des Netzwerks, schiebt das",
- "Schieberegister nach rechts. Dies bedeutet es wie folgt zuweist: ‘reg3’",
- "nach ‘reg2’, ‘reg2’ nach ‘reg1’ und ‘reg1’ nach ‘reg0’. ‘reg0’ bleibt",
- "unverändert. Ein großes Schieberegister kann leicht viel Speicherplatz",
- "belegen. Diese Anweisung muss ganz rechts im Netzwerk stehen.",
- "",
- "",
- "> NACHSCHLAG-TABELLE {dest := }",
- " -{ LUT[i] }-",
- "",
- "Eine Nachschlag-Tabelle ist eine Anordnung von n Werten. Wenn die",
- "Eingangsbedingung des Netzwerks ‘wahr’ ist, so wird die Ganzzahl-Variable",
- "‘dest’ mit dem Eintrag in der Nachschlag-Tabelle gleichgesetzt, der der",
- "Ganzzahl-Variablen ‘i’ entspricht. Das Verzeichnis beginnt bei Null,",
- "insofern muss sich ‘i’ zwischen 0 und (n-1) befinden. Das Verhalten",
- "dieser Anweisung ist undefiniert, wenn sich die Werte des Verzeichnisses",
- "außerhalb dieses Bereichs befinden.",
- "",
- "",
- "> NÄHERUNGS-LINEAR-TABELLE {yvar :=}",
- " -{PWL[xvar] }-",
- "",
- "Dies ist eine gute Methode für die Näherungslösung einer komplizierten",
- "Funktion oder Kurve. Sie könnte zum Beispiel hilfreich sein, wenn Sie",
- "versuchen eine Eichkurve zu verwenden, um die rohe Ausgangsspannung",
- "eines Fühlers in günstigere Einheiten zu wandeln.",
- "",
- "Angenommen Sie versuchen eine Näherungslösung für eine Funktion zu finden,",
- "die eine Eingangs-Ganzzahlvariable ‘x’ in Ausgangs-Ganzzahlvariable ‘y’",
- "wandelt. Einige Punkte der Funktion sind Ihnen bekannt; so würden Sie",
- "z.B. die folgenden kennen:",
- "",
- " f(0) = 2",
- " f(5) = 10",
- " f(10) = 50",
- " f(100) = 100",
- "",
- "Dies bedeutet, dass sich die Punkte",
- "",
- " (x0, y0) = ( 0, 2)",
- " (x1, y1) = ( 5, 10)",
- " (x2, y2) = ( 10, 50)",
- " (x3, y3) = (100, 100)",
- "",
- "in dieser Kurve befinden. Diese 4 Punkte können Sie in die Tabelle der",
- "‘Näherungs-Linear’-Anweisung eintragen. Die ‘Näherungs-Linear’-Anweisung",
- "wird dann auf den Wert von ‘xvar’ schauen und legt den Wert von ‘yvar’",
- "fest. Sie stellt ‘yvar’ so ein, dass die ‘Näherungs-Linear’-Kurve sich",
- "durch alle Punkte bewegt, die Sie vorgegeben haben. Wenn Sie z.B. für",
- "‘xvar’ = 10 vorgegeben haben, dann stellt die Anweisung ‘yvar’ auf gleich",
- "50 ein.",
- "",
- "Falls Sie dieser Anweisung einen Wert ‘xvar’ zuweisen, der zwischen zwei",
- "Werten von ‘x’ liegt, denen Sie Punkte zugeordnet haben, dann stellt die",
- "Anweisung ‘yvar’ so ein, dass (‘xvar’, ‘yvar’) in der geraden Linie liegt;",
- "diejenige die, die zwei Punkte in der Tabelle verbindet. Z.B. erzeugt",
- "‘xvar’ = 55 bei ‘yvar’ = 75. Die beiden Punkte in der Tabelle sind (10,",
- "50) und (100, 100). 55 liegt auf halbem Weg zwischen 10 und 100 und 75",
- "liegt auf halbem Weg zwischen 50 und 100, somit liegt (55, 75) auf der",
- "Linie, die diese zwei Punkte verbindet.",
- "",
- "Die Punkte müssen in aufsteigender Reihenfolge der x-Koordinaten",
- "angegeben werden. Einige mathematische Operationen, erforderlich für",
- "bestimmte Nachschlag-Tabellen mit 16-Bit-Mathematik, kann man ggf. nicht",
- "ausführen. In diesem Falle gibt LDmicro eine Warnmeldung aus. So würde",
- "z.B. die folgende Nachschlag-Tabelle eine Fehlermeldung hervorrufen:",
- "",
- " (x0, y0) = ( 0, 0)",
- " (x1, y1) = (300, 300)",
- "",
- "Sie können diesen Fehler beheben, indem sie den Abstand zwischen den",
- "Punkten kleiner machen. So ist zum Beispiel die nächste Tabelle äquivalent",
- "zur vorhergehenden, ruft aber keine Fehlermeldung hervor.",
- "",
- " (x0, y0) = ( 0, 2)",
- " (x1, y1) = (150, 150)",
- " (x2, y2) = (300, 300)",
- "",
- "Es wird kaum einmal notwendig sein, mehr als fünf oder sechs Punkte",
- "zu verwenden. Falls Sie mehr Punkte hinzufügen, so vergrößert dies",
- "Ihren Code und verlangsamt die Ausführung. Falls Sie für ‘xvar’ einen",
- "Wert vergeben, der größer ist, als die größte x-Koordinate der Tabelle",
- "oder kleiner, als die kleinste x-Koordinate in der Tabelle, so ist das",
- "Verhalten der Anweisung undefiniert. Diese Anweisung muss ganz rechts",
- "im Netzwerk stehen.",
- "",
- "",
- "> A/D-WANDLER EINLESEN AName",
- " --{READ ADC}--",
- "",
- "LDmicro kann einen Code erzeugen, der ermöglicht, die A/D-Wandler",
- "zu verwenden, die in manchen Mikroprozessoren vorgesehen sind.",
- "Wenn der Eingangszustand dieser Anweisung ‘wahr’ ist, dann wird eine",
- "Einzellesung von dem A/D-Wandler entnommen und in der Variablen ‘AName’",
- "gespeichert. Diese Variable kann anschließend mit einer gewöhnlichen",
- "Ganzzahlvariablen bearbeitet werden (wie: Kleiner als, größer als,",
- "arithmetisch usw.). Weisen Sie ‘Axxx’ in der gleichen Weise einen Pin",
- "zu, wie Sie einen Pin für einen digitalen Ein- oder Ausgang vergeben",
- "würden, indem auf diesen in der Liste unten in der Maske (Bildanzeige)",
- "doppelklicken. Wenn der Eingangszustand dieses Netzwerks ‘unwahr’ ist,",
- "so wird die Variable ‘AName’ unverändert belassen.",
- "",
- "Für alle derzeitig unterstützten Prozessoren gilt: Eine 0 Volt Lesung",
- "am Eingang des A/D-Wandlers entspricht 0. Eine Lesung gleich der",
- "Versorgungsspannung (bzw. Referenzspannung) entspricht 1023. Falls Sie",
- "AVR-Prozessoren verwenden, so verbinden Sie AREF mit Vdd. (Siehe Atmel",
- "Datenblatt, dort wird eine Induktivität von 100µH empfohlen). Sie können",
- "arithmetische Operationen verwenden, um einen günstigeren Maßstabfaktor",
- "festzulegen, aber beachten Sie, dass das Programm nur Ganzzahl-Arithmetik",
- "vorsieht. Allgemein sind nicht alle Pins als A/D-Wandler verwendbar. Die",
- "Software gestattet Ihnen nicht, einen Pin zuzuweisen, der kein A/D",
- "bzw. analoger Eingang ist. Diese Anweisung muss ganz rechts im Netzwerk",
- "stehen.",
- "",
- "",
- "> PULSWEITEN MODULATIONSZYKLUS FESTLEGEN duty_cycle",
- " -{PWM 32.8 kHz}-",
- "",
- "LDmicro kann einen Code erzeugen, der ermöglicht, die PWM-Peripherie",
- "zu verwenden, die in manchen Mikroprozessoren vorgesehen ist. Wenn die",
- "Eingangsbedingung dieser Anweisung ‘wahr’ ist, so wird der Zyklus der",
- "PWM-Peripherie mit dem Wert der Variablen ‘duty cycle’ gleichgesetzt. Der",
- "‘duty cycle’ muss eine Zahl zwischen 0 und 100 sein. 0 entspricht immer",
- "‘low’ und 100 entsprechend immer ‘high’. (Wenn Sie damit vertraut sind,",
- "wie die PWM-Peripherie funktioniert, so bemerken Sie, dass dies bedeutet,",
- "dass LDmicro die ‘duty cycle’-Variable automatisch prozentual zu den",
- "PWM-Taktintervallen skaliert [= den Maßstabfaktor festlegt].)",
- "",
- "Sie können die PWM-Zielfrequenz in Hz definieren. Es kann vorkommen, dass",
- "die angegebene Frequenz nicht genau erreicht wird, das hängt davon ab,",
- "wie sich diese innerhalb der Taktfrequenz des Prozessors einteilt. LDmicro",
- "wählt dann die nächst erreichbare Frequenz; falls der Fehler zu groß ist,",
- "so wird eine Warnung ausgegeben. Höhere Geschwindigkeiten können die",
- "Auflösung beeinträchtigen.",
- "",
- "Diese Anweisung muss ganz rechts im Netzwerk stehen. Die ‘ladder",
- "logic’-Laufzeit verbraucht (schon) einen Timer, um die Zykluszeit",
- "zu messen. Dies bedeutet, dass die PWM nur bei den Mikroprozessoren",
- "verfügbar ist, bei denen mindestens zwei geeignete Timer vorhanden sind.",
- "PWM verwendet den PIN CCP2 (nicht CCP1) bei den PIC16-Prozessoren und",
- "OC2 (nicht OC1A) bei den AVR-Prozessoren.",
- "",
- "",
- "> REMANENT MACHEN saved_var",
- " --{PERSIST}--",
- "",
- "Wenn der Eingangszustand dieser Anweisung ‘wahr’ ist, so bewirkt",
- "dies, dass eine angegebene Ganzzahl-Variable automatisch im EEPROM",
- "gespeichert wird. Dies bedeutet, dass ihr Wert bestehen bleiben wird,",
- "auch wenn der Prozessor seine Versorgungsspannung verliert. Es ist",
- "nicht notwendig, die Variable an klarer Stelle im EEPROM zu speichern,",
- "dies geschieht automatisch, so oft sich der Wert der Variablen",
- "ändert. Bei Spannungswiederkehr wird die Variable automatisch vom",
- "EEPROM zurückgespeichert. Falls eine Variable, die häufig ihren Wert",
- "ändert, remanent (dauerhaft) gemacht wird, so könnte Ihr Prozessor sehr",
- "rasch verschleißen, weil dieser lediglich für eine begrenzte Anzahl von",
- "Schreibbefehlen konstruiert ist (~100 000). Wenn der Eingangszustand des",
- "Netzwerks ‘unwahr’ ist, so geschieht nichts. Diese Anweisung muss ganz",
- "rechts im Netzwerk stehen.",
- "",
- "",
- "> UART (SERIELL) EMPFANGEN var",
- " --{UART RECV}--",
- "",
- "LDmicro kann einen Code erzeugen, der ermöglicht UART zu verwenden,",
- "welcher in manchen Mikroprozessoren vorgesehen ist.",
- "Bei AVR-Prozessoren mir mehrfachem UART, wird nur UART1 (nicht UART0)",
- "unterstützt. Konfigurieren Sie die Baudrate, indem Sie ‘Voreinstellungen",
- "-> Prozessor-Parameter’ verwenden. Bestimmte Baudraten werden mit",
- "bestimmten Quarzfrequenzen nicht erreichbar sein. In diesem Fall gibt",
- "LDmicro eine Warnmeldung.",
- "",
- "Wenn der Eingangszustand dieser Anweisung ‘unwahr’ ist, so geschieht",
- "nichts. Wenn der Eingangszustand ‘wahr’ ist, so versucht diese Anweisung",
- "ein einzelnes Schriftzeichen vom UART-Eingang zu empfangen. Wenn",
- "kein Schriftzeichen eingelesen wird, dann ist der Ausgangszustand",
- "‘unwahr’. Wenn ein ASCII-Zeichen eingelesen wird, so wird sein Wert in",
- "‘var’ abgespeichert und der Ausgangszustand wird für einen einzelnen",
- "Zyklus ‘wahr’.",
- "",
- "",
- "> UART (SERIELL) SENDEN var",
- " --{UART SEND}--",
- "",
- "LDmicro kann einen Code erzeugen, der ermöglicht UART zu verwenden,",
- "welcher in manchen Mikroprozessoren vorgesehen ist.",
- "Bei AVR-Prozessoren mir mehrfachem UART, wird nur UART1 (nicht UART0)",
- "unterstützt. Konfigurieren Sie die Baudrate, indem Sie ‘Voreinstellungen",
- "-> Prozessor-Parameter’ verwenden. Bestimmte Baudraten werden mit",
- "bestimmten Quarzfrequenzen nicht erreichbar sein. In diesem Fall gibt",
- "LDmicro eine Warnmeldung.",
- "",
- "Wenn der Eingangszustand dieser Anweisung ‘unwahr’ ist, so geschieht",
- "nichts. Wenn der Eingangszustand ‘wahr’ ist, so schreibt diese",
- "Anweisung ein einzelnes Schriftzeichen zum UART. Der ASCII-Wert des",
- "Schriftzeichens, welches gesendet werden soll, muss vorher in ‘var’",
- "abgespeichert worden sein. Der Ausgangszustand dieses Netzwerks ist",
- "‘wahr’, wenn UART beschäftigt ist (gerade dabei ein Schriftzeichen zu",
- "übermitteln) und andernfalls ‘unwahr’.",
- "",
- "Denken Sie daran, dass einige Zeit zum Senden von Schriftzeichen",
- "beansprucht wird. Überprüfen Sie den Ausgangszustand dieser Anweisung,",
- "sodass das erste Schriftzeichen bereits übermittelt wurde, bevor Sie",
- "versuchen ein zweites Schriftzeichen zu übermitteln. Oder verwenden Sie",
- "einen Timer, um eine Verzögerung zwischen die Schriftzeichen fügen. Sie",
- "dürfen den Eingangszustand dieser Anweisung nur dann auf ‘wahr’ setzen",
- "(bzw. ein Schriftzeichen übermitteln), wenn der Ausgangszustand ‘unwahr’",
- "ist (bzw. UART unbeschäftigt ist).",
- "",
- "Untersuchen Sie die “Formatierte Zeichenfolge”-Anweisung, bevor Sie",
- "diese Anweisung verwenden. Die “Formatierte Zeichenfolge”- Anweisung",
- "ist viel einfacher in der Anwendung und fast sicher fähig, das zu tun,",
- "was Sie beabsichtigen.",
- "",
- " ",
- "> FORMATIERTE ZEICHENFOLGE ÜBER UART var",
- " -{\"Druck: \\3\\r\\n\"}-",
- "",
- "LDmicro kann einen Code erzeugen, der ermöglicht UART zu verwenden,",
- "welcher in manchen Mikroprozessoren vorgesehen ist.",
- "Bei AVR-Prozessoren mir mehrfachem UART, wird nur UART1 (nicht UART0)",
- "unterstützt. Konfigurieren Sie die Baudrate, indem Sie ‘Voreinstellungen",
- "-> Prozessor-Parameter’ verwenden. Bestimmte Baudraten werden mit",
- "bestimmten Quarzfrequenzen nicht erreichbar sein. In diesem Fall gibt",
- "LDmicro eine Warnmeldung.",
- "",
- "Wenn der Eingangszustand des Netzwerks für diese Anweisung von ‘unwahr’",
- "auf ‘wahr’ übergeht, so beginnt diese eine vollständige Zeichenfolge",
- "über den seriellen Anschluss zu senden. Wenn die Zeichenfolge die",
- "besondere Reihenfolge ‘\\3’ enthält, dann wird diese Folge durch den Wert",
- "von ‘var’ ersetzt, welcher automatisch in eine Zeichenfolge gewandelt",
- "wird. Die Variable wird formatiert, sodass diese exakt 3 Schriftzeichen",
- "übernimmt. Falls die Variable zum Beispiel gleich 35 ist, dann wird die",
- "exakte ausgegebene Zeichenfolge, wie folgt aussehen: ‘Druck: 35\\r\\n’",
- "(beachten Sie das zusätzliche Freizeichen). Wenn stattdessen die Variable",
- "gleich 1432 ist, so wäre das Verhalten der Anweisung undefiniert,",
- "weil 1432 mehr als drei Stellen hat. In diesem Fall wäre es notwendig",
- "stattdessen ‘\\4’ zu verwenden.",
- "",
- "Falls die Variable negativ ist, so verwenden Sie stattdessen ‘\\-3d’",
- "(oder ‘\\-4d’). LDmicro wird hierdurch veranlasst eine vorgestellte",
- "Freistelle für positive Zahlen und ein vorgestelltes Minuszeichen für",
- "negative Zahlen auszugeben.",
- "",
- "Falls mehrere “Formatierte Zeichenfolge”-Anweisungen zugleich ausgegeben",
- "werden (oder wenn eine neue Zeichenfolge ausgegeben wird bevor die",
- "vorherige vollendet ist), oder auch wenn diese mit UART TX Anweisungen",
- "vermischt, so ist das Verhalten undefiniert.",
- "",
- "Es ist auch möglich diese Anweisung für eine feste Zeichenfolge zu",
- "verwenden, die über den seriellen Anschluss gesendet wird, ohne den Wert",
- "einer Ganzzahlvariablen in den Text zu interpolieren. In diesem Fall",
- "fügen Sie einfach diese spezielle Steuerungsfolge nicht ein.",
- "",
- "Verwenden Sie ‘\\\\’ für einen zeichengetreuen verkehrten Schrägstrich.",
- "Zusätzlich zur Steuerungsfolge für die Interpolierung einer Ganzzahl-",
- "Variablen, sind die folgenden Steuerungszeichen erhältlich:",
- "",
- " * \\r -- carriage return Zeilenschaltung",
- " * \\n -- new line Zeilenwechsel",
- " * \\f -- form feed Formularvorschub",
- " * \\b -- backspace Rücksetzen",
- " * \\xAB -- character with ASCII value 0xAB (hex)",
- " -- Schriftzeichen mit ASCII-Wert 0xAB (hex)",
- "",
- "Der Ausgangszustand des Netzwerks dieser Anweisung ist ‘wahr’, während",
- "diese Daten überträgt, ansonsten ‘unwahr’. Diese Anweisung benötigt eine",
- "große Menge des Programmspeichers, insofern sollte sie sparsam verwendet",
- "werden. Die gegenwärtige Umsetzung ist nicht besonders effizient, aber",
- "eine bessere würde Änderungen an sämtlichen Ausläufern des Programms",
- "benötigen.",
- "",
- "",
- "EIN HINWEIS ZUR VERWENDUNG DER MATHEMATIK",
- "=========================================",
- "",
- "Denken Sie daran, dass LDmicro nur 16-Bit mathematische Operationen",
- "ausführt. Dies bedeutet, dass das Endresultat jeder Berechnung,",
- "die Sie vornehmen, eine Ganzzahl zwischen -32768 und 32767 sein muss.",
- "Dies bedeutet auch, dass die Zwischenergebnisse Ihrer Berechnungen alle",
- "in diesem Bereich liegen müssen.",
- "",
- "Wollen wir zum Beispiel annehmen, dass Sie folgendes berechnen möchten",
- "y = (1/x) * 1200, in der x zwischen 1 und 20 liegt.",
- "Dann liegt y zwischen 1200 und 60, was in eine 16-Bit Ganzzahl passt,",
- "so wäre es zumindest theoretisch möglich diese Berechnung auszuführen.",
- "Es gibt zwei Möglichkeiten, wie Sie dies codieren könnten: Sie können",
- "die Reziproke (Kehrwert) ausführen and dann multiplizieren:",
- "",
- " || {DIV temp :=} ||",
- " ||---------{ 1 / x }----------||",
- " || ||",
- " || {MUL y := } ||",
- " ||----------{ temp * 1200}----------||",
- " || ||",
- "",
- "Oder Sie könnten einfach die Division in einem Schritt direkt vornehmen.",
- "",
- " || {DIV y :=} ||",
- " ||-----------{ 1200 / x }-----------||",
- "",
- "",
- "Mathematisch sind die zwei äquivalent; aber wenn Sie diese ausprobieren,",
- "so werden Sie herausfinden, dass die erste ein falsches Ergebnis von",
- "y = 0 liefert. Dies geschieht, weil die Variable einen Unterlauf",
- "[= resultatabhängige Kommaverschiebung] ergibt. So sei zum Beispiel x = 3,",
- "(1 / x) = 0.333, dies ist aber keine Ganzzahl; die Divisionsoperation",
- "nähert dies, als 'temp = 0'. Dann ist y = temp * 1200 = 0. Im zweiten",
- "Fall gibt es kein Zwischenergebnis, welches einen Unterlauf [= resultats-",
- "abhängige Kommaverschiebung] ergibt, somit funktioniert dann alles.",
- "",
- "Falls Sie Probleme bei Ihren mathematischen Operationen erkennen,",
- "dann überprüfen Sie die Zwischenergebnisse auf Unterlauf [eine",
- "resultatabhängige Kommaverschiebung] (oder auch auf Überlauf, der dann",
- "im Programm in Umlauf kommt; wie zum Beispiel 32767 + 1 = -32768).",
- "Wann immer möglich, wählen Sie Einheiten, deren Werte in einem Bereich",
- "von -100 bis 100 liegen.",
- "",
- "Falls Sie eine Variable um einen bestimmten Faktor vergrößern müssen, tun",
- "Sie dies, indem Sie eine Multiplikation und eine Division verwenden. Um",
- "zum Beispiel y = 1.8 * x zu vergrößern, berechnen Sie y = (9/5) * x,",
- "(was dasselbe ist, weil 1,8 = 9/5 ist), und codieren Sie dies als",
- "y = (9 * x)/5, indem Sie die Multiplikation zuerst ausführen.",
- "",
- " || {MUL temp :=} ||",
- " ||---------{ x * 9 }----------||",
- " || ||",
- " || {DIV y :=} ||",
- " ||-----------{ temp / 5 }-----------||",
- "",
- "",
- "Dies funktioniert mit allen x < (32767 / 9), oder x < 3640. Bei höheren",
- "Werten würde die Variable ‘temp’ überfließen. Für x gibt es eine",
- "ähnliche Untergrenze.",
- "",
- "",
- "KODIER-STIL",
- "===========",
- "",
- "Ich gestatte mehrere Spulen in Parallelschaltung in einem einzigen",
- "Netzwerk unterzubringen. Das bedeutet, sie können ein Netzwerk, wie",
- "folgt schreiben:",
- "",
- " || Xa Ya ||",
- " 1 ||-------] [--------------( )-------||",
- " || ||",
- " || Xb Yb ||",
- " ||-------] [------+-------( )-------||",
- " || | ||",
- " || | Yc ||",
- " || +-------( )-------||",
- " || ||",
- " ",
- "Anstatt diesem:",
- "",
- " || Xa Ya ||",
- " 1 ||-------] [--------------( )-------||",
- " || ||",
- " || ||",
- " || ||",
- " || ||",
- " || Xb Yb ||",
- " 2 ||-------] [--------------( )-------||",
- " || ||",
- " || ||",
- " || ||",
- " || ||",
- " || Xb Yc ||",
- " 3 ||-------] [--------------( )-------||",
- " || ||",
- "",
- "Rein theoretisch bedeutet das, dass Sie irgendein Programm, als ein",
- "gigantisches Netzwerk, schreiben könnten. Und es bestünde überhaupt",
- "keine Notwendigkeit mehrere Netzwerke zu verwenden. In der Praxis ist",
- "dies aber eine schlechte Idee, denn wenn Netzwerke komplexer werden, so",
- "werden sie auch schwieriger zu editieren, ohne Löschen und neu Schreiben",
- "von Anweisungen.",
- "",
- "Jedoch, ist es manchmal ein guter Einfall, verwandte Logik in einem",
- "einzelnen Netzwerk zusammenzufassen. Dies erzeugt einen beinahe",
- "identischen Code, als ob sie getrennte Netzwerke entworfen hätten, es",
- "zeigt aber, dass diese Anweisungen (Logik) verwandt ist, wenn man diese",
- "im Netzwerk-Diagramm betrachtet.",
- "",
- " * * *",
- "",
- "Im Allgemeinen hält man es für eine schlechte Form, den Code in einer",
- "solchen Weise zu schreiben, dass sein Ergebnis von einer Folge von",
- "Netzwerken abhängt. So zum Beispiel ist der folgende Code nicht besonders",
- "gut, falls ‘xa’ und ‘xb’ jemals ‘wahr’ würden.",
- "",
- " || Xa {v := } ||",
- " 1 ||-------] [--------{ 12 MOV}--||",
- " || ||",
- " || Xb {v := } ||",
- " ||-------] [--------{ 23 MOV}--||",
- " || ||",
- " || ||",
- " || ||",
- " || ||",
- " || [v >] Yc ||",
- " 2 ||------[ 15]-------------( )-------||",
- " || ||",
- "",
- "Ich werde diese Regel brechen und indem ich dies so mache, entwerfe ich",
- "einen Code-Abschnitt, der erheblich kompakter ist. Hier zum Beispiel,",
- "zeige ich auf, wie ich eine 4-Bit binäre Größe von ‘xb3:0’ in eine",
- "Ganzzahl wandeln würde.",
- "",
- " || {v := } ||",
- " 3 ||-----------------------------------{ 0 MOV}--||",
- " || ||",
- " || Xb0 {ADD v :=} ||",
- " ||-------] [------------------{ v + 1 }-----------||",
- " || ||",
- " || Xb1 {ADD v :=} ||",
- " ||-------] [------------------{ v + 2 }-----------||",
- " || ||",
- " || Xb2 {ADD v :=} ||",
- " ||-------] [------------------{ v + 4 }-----------||",
- " || ||",
- " || Xb3 {ADD v :=} ||",
- " ||-------] [------------------{ v + 8 }-----------||",
- " || ||",
- "",
- "Falls die TRANSFER-Anweisung (MOV) an das untere Ende des Netzwerks",
- "gebracht würde, anstatt auf das obere, so würde der Wert von ‘v’, an",
- "anderer Stelle im Programm gelesen, gleich Null sein. Das Ergebnis dieses",
- "Codes hängt daher von der Reihenfolge ab, in welcher die Anweisungen",
- "ausgewertet werden. Im Hinblick darauf, wie hinderlich es wäre, diesen",
- "Code auf eine andere Weise zu schreiben, nehme ich dies so hin.",
- "",
- "",
- "BUGS",
- "====",
- "",
- "LDmicro erzeugt keinen sehr effizienten Code; es ist langsam in der",
- "Ausführung und geht verschwenderisch mit dem Flash- und RAM-Speicher",
- "um. Trotzdem kann ein mittelgroßer PIC- oder AVR-Prozessor alles, was",
- "eine kleine SPS kann, somit stört dies mich nicht besonders.",
- "",
- "Die maximale Länge der Variabelen-Bezeichnungen (-Namen) ist sehr",
- "begrenzt. Dies ist so, weil diese so gut in das KOP-Programm (ladder)",
- "passen. Somit sehe ich keine gute Lösung für diese Angelegenheit.",
- "",
- "Falls Ihr Programm zu groß für die Zeit-, Programmspeicher- oder",
- "Datenspeicher-Beschränkungen des Prozessors ist, den Sie gewählt haben,",
- "so erhalten Sie keine Fehlermeldung. Es wird einfach irgendwo anders alles",
- "vermasseln. (Anmerkung: Das AVR STK500 gibt hierzu Fehlermeldungen aus.)",
- "",
- "Unsorgfältiges Programmieren bei den Datei Öffnen/Abspeichern-Routinen",
- "führen wahrscheinlich zu der Möglichkeit eines Absturzes oder es wird",
- "ein willkürlicher Code erzeugt, der eine beschädigte oder bösartige .ld",
- "Datei ergibt.",
- "",
- "Bitte berichten Sie zusätzliche Bugs oder richten Sie Anfragen für neue",
- "Programm-Bestandteile an den Autor (in Englisch).",
- "",
- "Thanks to:",
- " * Marcelo Solano, for reporting a UI bug under Win98",
- " * Serge V. Polubarjev, for not only noticing that RA3:0 on the",
- " PIC16F628 didn't work but also telling me how to fix it",
- " * Maxim Ibragimov, for reporting and diagnosing major problems",
- " with the till-then-untested ATmega16 and ATmega162 targets",
- " * Bill Kishonti, for reporting that the simulator crashed when the",
- " ladder logic program divided by zero",
- " * Mohamed Tayae, for reporting that persistent variables were broken",
- " on the PIC16F628",
- " * David Rothwell, for reporting several user interface bugs and a",
- " problem with the \"Export as Text\" function",
- "",
- "Particular thanks to Heinz Ullrich Noell, for this translation (of both",
- "the manual and the program's user interface) into German.",
- "",
- "",
- "COPYING, AND DISCLAIMER",
- "=======================",
- "",
- "DO NOT USE CODE GENERATED BY LDMICRO IN APPLICATIONS WHERE SOFTWARE",
- "FAILURE COULD RESULT IN DANGER TO HUMAN LIFE OR DAMAGE TO PROPERTY. THE",
- "AUTHOR ASSUMES NO LIABILITY FOR ANY DAMAGES RESULTING FROM THE OPERATION",
- "OF LDMICRO OR CODE GENERATED BY LDMICRO.",
- "",
- "This program is free software: you can redistribute it and/or modify it",
- "under the terms of the GNU General Public License as published by the",
- "Free Software Foundation, either version 3 of the License, or (at your",
- "option) any later version.",
- "",
- "This program is distributed in the hope that it will be useful, but",
- "WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY",
- "or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License",
- "for more details.",
- "",
- "You should have received a copy of the GNU General Public License along",
- "with this program. If not, see <http://www.gnu.org/licenses/>.",
- "",
- "",
- "Jonathan Westhues",
- "",
- "Rijswijk -- Dec 2004",
- "Waterloo ON -- Jun, Jul 2005",
- "Cambridge MA -- Sep, Dec 2005",
- " Feb, Mar 2006",
- "",
- "Email: user jwesthues, at host cq.cx",
- "",
- "",
- NULL
-};
-#endif
-
-#ifdef LDLANG_FR
-char *HelpTextFr[] = {
- "INTRODUCTION",
- "============",
- "",
- "LDmicro génére du code natif pour certains microcontroleurs Microchip",
- "PIC16F et Atmel AVR. Usuellement les programmes de developpement pour ces",
- "microcontrolleurs sont écrits dans des langages comme l'assembleur , le",
- "C ou le Basic. Un programme qui utilise un de ces langages est une suite",
- "de commandes. Ces programmes sont puissants et adaptés à l'architecture",
- "des processeurs, qui de façon interne exécutent une liste d'instructions.",
- "",
- "Les API (Automates Programmables Industriels, PLC en anglais, SPS en",
- "allemand) utilisent une autre voie et sont programmés en Langage à",
- "Contacts (ou LADDER). Un programme simple est représenté comme ceci :",
- "",
- "",
- " || ||",
- " || Xbutton1 Tdon Rchatter Yred ||",
- " 1 ||-------]/[---------[TON 1.000 s]-+-------]/[--------------( )-------||",
- " || | ||",
- " || Xbutton2 Tdof | ||",
- " ||-------]/[---------[TOF 2.000 s]-+ ||",
- " || ||",
- " || ||",
- " || ||",
- " || Rchatter Ton Tnew Rchatter ||",
- " 2 ||-------]/[---------[TON 1.000 s]----[TOF 1.000 s]---------( )-------||",
- " || ||",
- " || ||",
- " || ||",
- " ||------[END]---------------------------------------------------------||",
- " || ||",
- " || ||",
- "",
- "(TON est une tempo travail; TOF est une tempo repos. les commandes --] [-- ",
- "représentent des Entrées, qui peuvent être des contacts de relais. Les ",
- "commandes --( )-- sont des Sorties, qui peuvent représenter des bobines de ",
- "relais. Beaucoup de références de programmes de langage à contacts (LADDER) ",
- "existent sur Internet et sont à quelques détails près, identiques à ",
- "l'implémentation représentée ci-dessus.",
- "",
- "Un certain nombre de différences apparaissent entre les programmes en",
- "langage évolués ( C, Basic, Etc..) et les programmes pour API:",
- "",
- " * Le programme est représenté dans un format graphique, et non",
- " comme une liste de commandes en format texte. Beaucoup de personnes",
- " trouve cela plus facile à comprendre.",
- "",
- " * Au niveau de base, le programme apparait comme un diagramme",
- " de circuit avec des contacts de relais (Entrées) et des bobines",
- " (Sorties). Ceci est intuitif pour les programmeurs qui connaissent",
- " la théorie des circuits électriques.",
- "",
- " * Le compilateur de langage à contacts vérifie tout ceci lors",
- " de la compilation. Vous n'avez pas à écrire de code quand une",
- " Sortie est remplacée et est remise en Entrée ou si une temporisation",
- " est modifiée, vous n'avez pas non plus à spécifier l'ordre où les",
- " calculs doivent être effectués. L'outil API (PLC) s'occupe de cela",
- " pour vous.",
- "",
- "",
- "LDmicro compile le langage à contact (ladder) en code pour PIC16F ou",
- "AVR. Les processeurs suivants sont supportés:",
- "",
- " * PIC16F877",
- " * PIC16F628",
- " * PIC16F876 (non testé)",
- " * PIC16F88 (non testé)",
- " * PIC16F819 (non testé)",
- " * PIC16F887 (non testé)",
- " * PIC16F886 (non testé)",
- " * ATmega128",
- " * ATmega64",
- " * ATmega162 (non testé)",
- " * ATmega32 (non testé)",
- " * ATmega16 (non testé)",
- " * ATmega8 (non testé)",
- "",
- "Il doit être facile de supporter d'autres PIC ou AVR, mais je n'est",
- "aucun moyen pour les tester. Si vous en voulez un en particulier faites",
- "moi parvenir votre demande et je verrai ce que je peux faire.",
- "",
- "En utilisant LDmicro, vous dessinez un diagramme à contacts pour votre",
- "programme. Vous pouvez simuler le fonctionnement logique en temps réel sur",
- "votre PC. Quand vous êtes convaincu que le fonctionnement est correct,",
- "vous pouvez affecter les broches du microcontroleur pour les Entrées et",
- "Sorties, ensuite vous compilez votre programmeen code AVR ou PIC. Le",
- "fichier de sortie du compilateur est un fichier .HEX que vous devrez",
- "mettre dans le microcontroleur en utilisant un programmateur pour PIC",
- "ou AVR.",
- "",
- "",
- "LDmicro est conçu pour être similaire à la majorité des API commerciaux.",
- "Il y a quelques exceptions, et une partie des possibilités n'est",
- "pas standard avec le matériel industriel. Lire attentivement la",
- "description de chaque instruction même si elle parait familière. Ce",
- "document considère que vous avez une connaisance de base du langage à",
- "contact et de la structure des logiciels pour automates programmables.",
- "Cycle d'exécution : Lecture des Entrées -> Calculs -> Ecriture des Sorties",
- "",
- "",
- "CIBLES ADDITIONNELLES ",
- "=====================",
- "",
- "Il est aussi possible de générer du code ANSI C . Vous pouvez utiliser",
- "ceci pour n'importe quel processeur dont vous avez un compilateur C,",
- "mais le runtime est de votre responsabilité. LDmicro gérére uniquement",
- "le source pour le cycle de l'API. Vous êtes responsable de l'appel de",
- "chaque séquence du cycle et de l'implémentation de toutes les Entrées",
- "/ Sorties (Lecture/Ecriture des Entrées digitales, etc ...). Voir les",
- "commentaires dans le code source pour plus de détails.",
- "",
- "Finalement, LDmicro peut générer un code byte indépendant du processeur",
- "pour une machine virtuelle prévue pour faire fonctionner ce type de code.",
- "J'ai prévu un exemple simple d'implémentation d'un interpréteur /VM",
- "écrit en code C le plus portable possible. La cible fonctionne juste sur",
- "quelques plateformes ou vous pouvez prévoir votre VM. Ceci peut être utile",
- "pour des applications ou vous pouvez utiliser le languages à contacts",
- "comme du langage script pour customiser un programme important. Voir",
- "les commentaires dans l'exemple pour les détails.",
- "",
- "",
- "OPTIONS LIGNE DE COMMANDE",
- "=========================",
- "",
- "LDmicro.exe fonctionne normallement sans options de ligne de commande.",
- "Vous pouvez faire un raccourci vers le programme et le sauvegarder sur",
- "l'écran , il suffit alors de faire un double clic pour le faire démarrer",
- "et vous vous retrouvez ainsi dans l'interface utilisateur.",
- "",
- "Si un nom de fichier est passé en ligne de de commande de LDmicro, (ex:",
- "`ldmicro.exe asd.ld'), alors LDmicro va essayer d'ouvrir `asd.ld', si",
- "il existe. Une erreur se produira si `asd.ld' n'existe pas. Vous avez",
- "la possibilité d'associer LDmicro avec les fichiers d'extention .ld.",
- "Ceci permet à LDmicro de démarrer automatiquement lors d'un double clic",
- "sur un fichier xxx.ld.",
- "",
- "Si les arguments de la ligne de commande sont passés sous la forme:",
- "`ldmicro.exe /c src.ld dest.hex', LDmicro compilera le programme`src.ld',",
- "et sauvegardera le fichier compilé sous`dest.hex'. Après compilation",
- "LDmicro se termine, que la compilation soit correcte ou pas. Aucun",
- "message n'est affiché sur la console. Ce mode est pratique uniquement",
- "lorsque vous exécutez LDmicro en ligne de commande.",
- "",
- "",
- "BASES",
- "=====",
- "",
- "Si vous exécutez LDmicro sans arguments de ligne de commande, il démarre",
- "avec un programme vide. Si vous démarrer avec le nom d'un programme",
- "langage à contacts (xxx.ld) en ligne de commande, il va essayer de",
- "charger le programme au démarrage. LDmicro utilise son format interne",
- "pour le programme , il ne peut pas importer de programmes édités par",
- "d'autres outils.",
- "",
- "Si vous ne chargez pas un programme existant, LDmicro démarre en insérant",
- "une ligne vide. Vous pouvez ajouter les instructions pour votre programme:",
- "par exemple ajouter un jeu de contacts (Instruction -> Insérer Contact)",
- "qui sera nommé `Xnew'. `X' désigne un contact qui peut être lié à une",
- "broche d'entrée du microcontroleur, vous pouvez affecter la broche pour",
- "ce contact plus tard après avoir choisi le microcontroleur et renommé",
- "les contacts. La première lettre indique de quel type de composants il",
- "s'agit par exemple :",
- "",
- " * Xnom -- Relié à une broche d'entrée du microcontroleur",
- " * Ynom -- Relié à une broche de sortie du microcontroleur",
- " * Rnom -- `Relais interne': un bit en mémoire",
- " * Tnom -- Temporisation; Tempo travail, tempo repos, ou totalisatrice",
- " * Cnom -- Compteur, Compteur ou décompteur",
- " * Anom -- Un entier lu sur un comvertisseur A/D ",
- " * nom -- Variable générique (Entier : Integer)",
- "",
- "Choisir le reste du nom pour décrire l'utilisation de ce que fait cet",
- "objet et qui doit être unique dans tout le programme. Un même nom doit",
- "toujours se référer au même objet dans le programme en entier.Par",
- "exemple , vous aurez une erreur si vous utilisez une tempo travail",
- "(TON) appellée TDelai et une tempo repos (TOF) appellée aussi TDelai",
- "dans le même programme, le comptage effectué par ces tempo utilisera le",
- "même emplacement en mémoire, mais il est acceptable d'avoir une tempo",
- "sauvegardée (RTO) Tdelai même nom avec une instruction de RES, dans ce",
- "cas l'instruction fonctionne avec le même timer.",
- "",
- "Les noms de variables peuvent être des lettres, chiffres ou le",
- "caractère _. Un nom de variable ne doit pas commencer par un chiffre.",
- "Les noms de variables sont sensibles à la casse (majuscule/minuscules).",
- "",
- "Les instructions de manipulation de variables (MOV, ADD, EQU,",
- "etc.) peuvent travailler avec des variables de n'importe quel nom. Elles",
- "peuvent avoir accès aux accumulateurs des temporisations ou des",
- "compteurs. Cela peut quelquefois être très utile, par exemple si vous",
- "voulez contrôler la valeur d'un compteur ou d'une temporisation dans",
- "une ligne particulière.",
- "",
- "Les variables sont toujours des entiers 16 bits. Leur valeur peut",
- "donc être comprise entre -32768 et 32767 inclus. Les variables sont",
- "toujours signées. Vous pouvez les spécifier de façon littérale comme",
- "des nombres décimaux normaux (0, 1234, -56), vous pouvez aussi les",
- "spécifier en caractères ASCII ('A', 'z') en mettant le caractère entre",
- "des guillemets simples. Vous pouvez utiliser un caractère ASCII dans la",
- "majorité des endroits où vous pouvez utiliser les nombres décimaux.",
- "",
- "En bas de l'écran, vous pouvez voir la liste de tous les objets",
- "utilisés dans votre programme. La liste est automatiquement générée",
- "à partir du programme. La majorité des objets ne necessitent aucune",
- "configuration. Seuls : les objets `Xnom', `Ynom', and `Anom' doivent être",
- "affectés à une broche du micro La première chose à faire est de choisir",
- "la microcontroleur utilisé : Paramères -> Microcontroleur ensuite vous",
- "affectez les broches en faisant un double clic dans la liste.",
- "",
- "Vous pouvez modifier le programme en insérant ou supprimant des",
- "instructions. Le curseur clignote dans la programme pour indiquer",
- "l'instruction courante sélectionnée et le point d'insertion. S'il ne",
- "clignote pas pressez <Tab> ou cliquer sur une instruction, ou vous",
- "pouvez insérer une nouvelle instruction à la droite ou à la gauche",
- "(en série avec), ou au dessous ou au dessus (en parallèle avec) de",
- "l'instruction sélectionnée. Quelques opérations ne sont pas permises ,",
- "par exemple aucune instruction permise à droite de la bobine.",
- "",
- "Le programme démarre avec uniquement une ligne. Vous pouvez ajouter",
- "plusieurs lignes en sélectionnant Insertion -> Ligne avant ou après",
- "dans le menu. Vous pouvez faire un circuit complexe en plaçant plusieurs",
- "branches en parallèle ou en série avec une ligne, mais il est plus clair",
- "de faire plusieurs lignes.",
- "",
- "Une fois votre programme écrit, vous pouvez le tester par simulation,",
- "et le compiler dans un fichier HEX pour le microcontroleur de destination.",
- "",
- "SIMULATION",
- "==========",
- "",
- "Pour entrer dans la mode simulation choisir Simulation -> Simuler",
- "ou presser <Ctrl+M> le programme est affiché différemment en mode",
- "simulation. Les instructions activées sont affichées en rouge vif, les",
- "instructions qui ne le sont pas sont affichées en grisé. Appuyer sur la",
- "barre d'espace pour démarrer l'API pour 1 cycle. Pour faire fonctionner",
- "continuellement en temps réel choisir Simulation ->Démarrer la simulation",
- "en temps réel ou presser <Ctrl+R> L'affichage du programme est mise à",
- "jour en temps réel en fonction des changements d'état des entrées.",
- "",
- "Vous pouvez valider l'état des entrées du programme en faisant un",
- "double clic sur l'entrée dans la liste au bas de l'écran, ou sur le",
- "contact `Xnom' de l'instruction dans le programme, pour avoir le reflet",
- "automatiquement de la validation d'une entrée dans le programme, il",
- "faut que le programme soit en cycle.(le démarrer par <Ctrl+R> ou barre",
- "d'espace pour un seul cycle).",
- "",
- "COMPILER EN CODE NATIF",
- "======================",
- "",
- "Le point final est de générer un fichier .HEX qui sera programmé dans le",
- "microcontroleur que vous avez choisi par Paramètres -> Microcontroleur",
- "Vous devez affecter les broches d'entrées sorties pour chaque 'Xnom'",
- "et 'Ynom'. Vous pouvez faire cela en faisant un double clic sur la nom",
- "de l'objet dans la liste au bas de l'écran. Une boite de dialogue vous",
- "demande de choisir une des broches non affectées dans la liste.",
- "",
- "Vous devez aussi choisir la temps de cycle que voulez utiliser pour",
- "votre application, vous devez aussi choisir la fréquence d'horloge du",
- "processeur. Faire Paramètres -> Paramètres MCU dans le menu. En général,",
- "le temps de cycle peut être laissé à la valeur par défaut (10 ms) qui est",
- "une bonne valeur pour la majorité des applications. Indiquer la fréquence",
- "du quartz utilisé (ou du résonateur céramique ou autres..) et cliquer OK.",
- "",
- "Maintenant vous pouvez créer le fichier pour intégrer dans le",
- "microcontroleur. Choisir Compilation -> Compiler, ou compiler sous...",
- "Si vous avez précédemment compilé votre programme, vous pouvez spécifier",
- "un nom différent de fichier de sortie. Si votre programme ne comporte",
- "pas d'erreur (lié à la structure du programme), LDmicro génére un fichier",
- "IHEX prêt à être programmé dans le chip.",
- "",
- "Utilisez votre logiciel et matériel de programmation habituel pour",
- "charger le fichier HEX dans la microcontroleur. Vérifiez et validez",
- "les bits de configuration (fuses), pour les processeurs PIC16Fxxx ces",
- "bits sont inclus dans le fichier HEX, et la majorité des logiciels de",
- "programmation les valident automatiquement, pour les processeurs AVR ,",
- "vous devez le faire manuellement.",
- "",
- "REFERENCE DES INSTRUCTIONS ",
- "==========================",
- "",
- "> CONTACT, NORMALLEMENT OUVERT Xnom Rnom Ynom",
- " ----] [---- ----] [---- ----] [----",
- "",
- " Si le signal arrivant à cette instruction est FAUX (0) le signal",
- " de sortie est aussi faux (0), s'il est vrai , il sera aussi vrai",
- " en sortie si et uniquement si la broche d'Entrée ou de Sortie",
- " ou de Relais interne est vraie, sinon l'instruction sera fausse.",
- " Cette instruction peut vérifier l'état d'une broche d'entrée, d'une",
- " broche de sortie ou d'un relais interne",
- "",
- " ",
- "> CONTACT, NORMALLEMENT FERME Xnom Rnom Ynom",
- " ----]/[---- ----]/[---- ----]/[----",
- "",
- " Si le signal arrivant à cette instruction est FAUX (0) le signal",
- " de sortie est vrai (1), s'il est vrai , il sera faux en sortie .",
- " Cette instruction peut vérifier l'état d'une broche d'entrée, d'une",
- " broche de sortie ou d'un relais interne. Fonctionne en opposition",
- " par rapport au contact normallement ouvert.",
- "",
- "",
- "> BOBINE, NORMALE Rnom Ynom",
- " ----( )---- ----( )----",
- "",
- " Si le signal arrivant à cette instruction est faux, alors le relais ",
- " interne ou la broche de sortie est faux (mise à zéro). Si le signal",
- " arrivant à cette instruction est vrai(1), alors le relais interne ou",
- " la broche de sortie est validée (mise à 1). Il n'est pas important",
- " d'affecter une variable à une bobine.",
- " Cette instruction est placée le plus à droite dans une séquence.",
- " ",
- "",
- "> BOBINE, INVERSE Rnom Ynom",
- " ----(/)---- ----(/)----",
- "",
- " Si le signal arrivant à cette instruction est vrai, alors le relais ",
- " interne ou la broche de sortie est faux (mise à zéro). Si le signal",
- " arrivant à cette instruction est faux(0), alors le relais interne ou",
- " la broche de sortie est validée (mise à 1). Il n'est pas important ",
- " d'affecter une variable à une bobine.",
- " Cette instruction est placée le plus à droite dans une séquence.",
- "",
- "",
- "> BOBINE, ACCROCHAGE Rnom Ynom",
- " ----(S)---- ----(S)----",
- "",
- " Si le signal arrivant à cette instruction est vrai, alors le",
- " relais interne ou la broche de sortie est validée (mise à 1). Cette",
- " instruction permet de changer l'état d'un relais ou d'une sortie :",
- " uniquement passe à vrai, ou reste vrai si elle était déjà à 1,",
- " elle est typiquement utilisée en combinaison avec une Bobine REMISE",
- " A ZERO.",
- " Cette instruction est placée le plus à droite dans une séquence.",
- "",
- "",
- "> BOBINE, REMISE A ZERO Rnom Ynom",
- " ----(R)---- ----(R)----",
- "",
- " Si le signal arrivant à cette instruction est vrai, alors le relais ",
- " interne ou la sortie est mise à zéro (0), si elle était déjà à 0, ",
- " il n'y a aucun changement, cette instruction change l'état d'une ",
- " sortie uniquement si elle était à 1, cette instruction fonctionne en ",
- " combinaison avec l'instruction ci-dessus Bobine à ACCROCHAGE.",
- " Cette instruction est placée le plus à droite dans une séquence.",
- "",
- "",
- "> TEMPORISATION TRAVAIL Tdon ",
- " -[TON 1.000 s]-",
- "",
- " Quand la signal arrivant à cette instruction passe de faux à vrai",
- " (0 à 1), le signal de sortie attend 1.000 seconde avant de passer",
- " à 1. Quand le signal de commande de cette instruction passe ZERO,",
- " le signal de sortie passe immédiatement à zéro. La tempo est remise",
- " à zéro à chaque fois que l'entrée repasse à zéro. L'entrée doit être",
- " maintenue vraie à 1 pendant au moins 1000 millisecondes consécutives",
- " avant que la sortie ne devienne vraie. le délai est configurable.",
- "",
- " La variable `Tnom' compte depuis zéro en unités de temps de scan.",
- " L'instruction Ton devient vraie en sortie quand la variable du",
- " compteur est plus grande ou égale au delai fixé. Il est possible",
- " de manipuler la variable du compteur en dehors, par exemple par une",
- " instruction MOVE.",
- "",
- "",
- "> TEMPORISATION REPOS Tdoff ",
- " -[TOF 1.000 s]-",
- "",
- " Quand le signal qui arrive à l'instruction passe de l'état vrai",
- " (1) à l'état faux (0), la sortie attend 1.000 s avant de dévenir",
- " faux (0) Quand le signal arrivant à l'instruction passe de l'état",
- " faux à l'état vrai, le signal passe à vrai immédiatement. La",
- " temporisation est remise à zéro à chaque fois que l'entrée devient",
- " fausse. L'entrée doit être maintenue à l'état faux pendant au moins",
- " 1000 ms consécutives avant que la sortie ne passe à l'état faux. La",
- " temporisation est configurable.",
- "",
- " La variable `Tname' compte depuis zéro en unités de temps de scan.",
- " L'instruction Ton devient vraie en sortie quand la variable du",
- " compteur est plus grande ou égale au delai fixé. Il est possible",
- " de manipuler la variable du compteur en dehors, par exemple par une",
- " instruction MOVE.",
- "",
- "",
- "> TEMPORISATION TOTALISATRICE Trto ",
- " -[RTO 1.000 s]-",
- "",
- " Cette instruction prend en compte le temps que l'entrée a été à l'état",
- " vrai (1). Si l'entrée a été vraie pendant au moins 1.000s la sortie",
- " devient vraie (1).L'entrée n'a pas besoin d'être vraie pendant 1000 ms",
- " consécutives. Si l'entrée est vraie pendant 0.6 seconde puis fausse",
- " pendant 2.0 secondes et ensuite vraie pendant 0.4 seconde, la sortie",
- " va devenir vraie. Après être passé à l'état vrai, la sortie reste",
- " vraie quelque soit la commande de l'instruction. La temporisation",
- " doit être remise à zéro par une instruction de RES (reset).",
- "",
- " La variable `Tnom' compte depuis zéro en unités de temps de scan.",
- " L'instruction Ton devient vraie en sortie quand la variable du",
- " compteur est plus grande ou égale au delai fixé. Il est possible",
- " de manipuler la variable du compteur en dehors, par exemple par une",
- " instruction MOVE.",
- "",
- "",
- "> RES Remise à Zéro Trto Citems",
- " ----{RES}---- ----{RES}----",
- "",
- " Cette instruction fait un remise à zéro d'une temporisation ou d'un",
- " compteur. Les tempos TON et TOF sont automatiquement remisent à zéro",
- " lorsque leurs entrées deviennent respectivement fausses ou vraies,",
- " RES n'est pas donc pas nécessaire pour ces tempos. Les tempos RTO",
- " et les compteurs décompteurs CTU / CTD ne sont pas remis à zéro",
- " automatiquement, il faut donc utiliser cette instruction. Lorsque",
- " l'entrée est vraie , le compteur ou la temporisation est remis à",
- " zéro. Si l'entrée reste à zéro, aucune action n'est prise.",
- " Cette instruction est placée le plus à droite dans une séquence.",
- "",
- "",
- "> FRONT MONTANT _",
- " --[OSR_/ ]--",
- "",
- " La sortie de cette instruction est normallement fausse. Si",
- " l'instruction d'entrée est vraie pendant ce scan et qu'elle était",
- " fausse pendant le scan précédent alors la sortie devient vraie. Elle",
- " génére une impulsion à chaque front montant du signal d'entrée. Cette",
- " instruction est utile si vous voulez intercepter le front montant",
- " du signal.",
- "",
- "",
- "> FRONT DESCENDANT _",
- " --[OSF \\_]--",
- "",
- " La sortie de cette instruction est normallement fausse. Si",
- " l'instruction d'entrée est fausse (0) pendant ce scan et qu'elle",
- " était vraie (1) pendant le scan précédent alors la sortie devient",
- " vraie. Elle génére une impulsion à chaque front descendant du signal",
- " d'entrée. Cette instruction est utile si vous voulez intercepter le",
- " front descendant d'un signal.",
- "",
- "",
- "> COURT CIRCUIT (SHUNT), CIRCUIT OUVERT",
- " ----+----+---- ----+ +----",
- "",
- " Une instruction shunt donne en sortie une condition qui est toujours ",
- " égale à la condition d'entrée. Une instruction Circuit Ouvert donne ",
- " toujours une valeur fausse en sortie.",
- " Ces instructions sont en général utilisées en phase de test.",
- "",
- "",
- "> RELAIS DE CONTROLE MAITRE",
- " -{MASTER RLY}-",
- "",
- " Par défaut, la condition d'entrée d'une ligne est toujours vraie. Si",
- " une instruction Relais de contrôle maitre est exécutée avec une",
- " valeur d'entrée fausse, alors toutes les lignes suivantes deviendront",
- " fausses. Ceci va continuer jusqu'à la rencontre de la prochaine",
- " instruction relais de contrôle maitre qui annule l'instruction de",
- " départ. Ces instructions doivent toujours être utilisées par paires:",
- " une pour commencer (qui peut être sous condition) qui commence la",
- " partie déactivée et une pour la terminer.",
- "",
- "",
- "> MOUVOIR {destvar := } {Tret := }",
- " -{ 123 MOV}- -{ srcvar MOV}-",
- "",
- " Lorsque l'entrée de cette instruction est vraie, elle va mettre la",
- " variable de destination à une valeur égale à la variable source ou à",
- " la constante source. Quand l'entrée de cette instruction est fausse",
- " rien ne se passe. Vous pouvez affecter n'importe quelle variable",
- " à une instruction de déplacement, ceci inclu l'état de variables",
- " compteurs ou temporisateurs qui se distinguent par l'entête T ou",
- " C. Par exemple mettre 0 dans Tsauvegardé équivaut à faire une RES",
- " de la temporisation. Cette instruction doit être complétement à",
- " droite dans une séquence.",
- "",
- "",
- "> OPERATIONS ARITHMETIQUES {ADD kay :=} {SUB Ccnt :=}",
- " -{ 'a' + 10 }- -{ Ccnt - 10 }-",
- "",
- "> {MUL dest :=} {DIV dv := }",
- " -{ var * -990 }- -{ dv / -10000}-",
- "",
- " Quand l'entrée de cette instruction est vraie, elle place en",
- " destination la variable égale à l'expression calculée. Les opérandes",
- " peuvent être des variables (en incluant les variables compteurs et",
- " tempos) ou des constantes. Ces instructions utilisent des valeurs 16",
- " bits signées. Il faut se souvenir que le résultat est évalué à chaque",
- " cycle tant que la condition d'entrée est vraie. Si vous incrémentez",
- " ou décrémentez une variable (si la variable de destination est",
- " aussi une des opérandes), le résultat ne sera pas celui escompté,",
- " il faut utiliser typiquement un front montant ou descendant de la",
- " condition d'entrée qui ne sera évalué qu'une seule fois. La valeur",
- " est tronquée à la valeur entière. Cette instruction doit être",
- " complétement à droite dans une séquence.",
- "",
- "",
- "> COMPARER [var ==] [var >] [1 >=]",
- " -[ var2 ]- -[ 1 ]- -[ Ton]-",
- "",
- "> [var /=] [-4 < ] [1 <=]",
- " -[ var2 ]- -[ vartwo]- -[ Cup]-",
- "",
- " Si l'entrée de cette instruction est fausse alors la sortie est",
- " fausse. Si l'entrée est vraie, alors la sortie sera vraie si et",
- " uniquement si la condition de sortie est vraie. Cette instruction",
- " est utilisée pour comparer (Egalité, plus grand que,plus grand ou",
- " égal à, inégal, plus petit que, plus petit ou égal à) une variable à",
- " une autre variable, ou pour comparer une variable avec une constante",
- " 16 bits signée.",
- "",
- "",
- "> COMPTEUR DECOMPTEUR Cnom Cnom",
- " --[CTU >=5]-- --[CTD >=5]--",
- "",
- " Un compteur incrémente ( Compteur CTU, count up) ou décrémente",
- " (Décompteur CTD, count down) une variable à chaque front montant de",
- " la ligne en condition d'entrée (CAD quand la signal passe de l'état",
- " 0 à l'état 1. La condition de sortie du compteur est vraie si la",
- " variable du compteur est égale ou plus grande que 5 (dans l'exemple),",
- " et faux sinon. La condition de sortie de la ligne peut être vraie,",
- " même si la condition d'entrée est fausse, cela dépend uniquement de la",
- " valeur de la variable du compteur. Vous pouvez avoir un compteur ou",
- " un décompteur avec le même nom, qui vont incréménter ou decrémenter",
- " une variable. L'instruction Remise à Zéro permet de resetter un",
- " compteur (remettre à zéro), il est possible de modifier par des",
- " opérations les variables des compteurs décompteurs.",
- "",
- "",
- "> COMPTEUR CYCLIQUE Cnom",
- " --{CTC 0:7}--",
- "",
- " Un compteur cyclique fonctionne comme un compteur normal",
- " CTU, exception faite, lorsque le compteur arrive à sa",
- " limite supérieure, la variable du compteur revient à 0. dans",
- " l'exemple la valeur du compteur évolue de la façon suivante :",
- " 0,1,2,4,5,6,7,0,1,2,3,4,5,6,7,0,1,3,4,5,etc. Ceci est très pratique",
- " en conbinaison avec des intructions conditionnelles sur la variable",
- " Cnom. On peut utiliser ceci comme un séquenceur, l'horloge du compteur",
- " CTC est validée par la condition d'entrée associée à une instruction",
- " de front montant.",
- " Cette instruction doit être complétement à droite dans une séquence.",
- " ",
- "",
- "> REGISTRE A DECALAGE {SHIFT REG }",
- " -{ reg0..3 }-",
- "",
- " Un registre à décalage est associé avec un jeu de variables. Le",
- " registre à décalage de l'exemple donné est associé avec les",
- " variables`reg0', `reg1', `reg2', and `reg3'. L'entrée du registre à",
- " décalage est `reg0'. A chaque front montant de la condition d'entrée",
- " de la ligne, le registre à décalage va décaler d'une position à",
- " droite. Ce qui donne `reg3 := reg2', `reg2 := reg1'. et `reg1 :=",
- " reg0'.`reg0' est à gauche sans changement. Un registre à décalage",
- " de plusieurs éléments peut consommer beaucoup de place en mémoire.",
- " Cette instruction doit être complétement à droite dans une séquence.",
- "",
- "",
- "> TABLEAU INDEXE {dest := }",
- " -{ LUT[i] }-",
- "",
- " Un tableau indexé et un groupe ordonné de n valeurs Quand la condition",
- " d'entrée est vraie, la variable entière `dest' est mise à la valeur",
- " correspondand à l'index i du tableau. L'index est compris entre 0 et",
- " (n-1). Le comportement de cette instruction est indéfini si l'index",
- " est en dehors du tableau",
- " Cette instruction doit être complétement à droite dans une séquence.",
- "",
- "",
- "> TABLEAU ELEMENTS LINEAIRES {yvar := }",
- " -{ PWL[xvar] }-",
- "",
- " C'est une bonne méthode pour évaluer de façon approximative une",
- " fonction compliquée ou une courbe. Très pratique par exemple pour",
- " appliquer une courbe de calibration pour linéariser tension de sortie",
- " d'un capteur dans une unité convenable.",
- "",
- " Supposez que vous essayez de faire une fonction pour convertir une",
- " variable d'entrée entière, x, en une variable de sortie entière, y,",
- " vous connaissez la fonction en différents points, par exemple vous",
- " connaissez :",
- "",
- " f(0) = 2",
- " f(5) = 10",
- " f(10) = 50",
- " f(100) = 100",
- "",
- " Ceci donne les points",
- "",
- " (x0, y0) = ( 0, 2)",
- " (x1, y1) = ( 5, 10)",
- " (x2, y2) = ( 10, 50)",
- " (x3, y3) = (100, 100)",
- "",
- " liés à cette courbe. Vous pouvez entrer ces 4 points dans un",
- " tableau associé à l'instruction tableau d'éléments linéaires. Cette",
- " instruction regarde la valeur de xvar et fixe la valeur de yvar",
- " correspondante. Par exemple si vous mettez xvar = 10 , l'instruction",
- " validera yvar = 50.",
- "",
- " Si vous mettez une instruction avec une valeur xvar entre deux valeurs",
- " de x du tableau (et par conséquence aussi de yvar). Une moyenne",
- " proportionnelle entre les deux valeurs , précédente et suivante de",
- " xvar et de la valeur liée yvar, est effectuée. Par exemple xvar =",
- " 55 donne en sortie yvar = 75 Les deux points xvar (10.50) et yvar",
- " (50,75) , 55 est la moyenne entre 10 et 100 et 75 est la moyenne",
- " entre 50 et 100, donc (55,75) sont liés ensemble par une ligne de",
- " connection qui connecte ces deux points.",
- "",
- " Ces points doivent être spécifiés dans l'ordre ascendant des",
- " coordonnées x. Il peut être impossible de faire certaines opérations",
- " mathématiques nécessaires pour certains tableaux, utilisant des",
- " entiers 16 bits. Dans ce LDmicro va provoquer une alarme. Ce tableau",
- " va provoquer une erreur :",
- "",
- " (x0, y0) = ( 0, 0)",
- " (x1, y1) = (300, 300)",
- "",
- " Vous pouvez supprimer ces erreurs en diminuant l'écart entre les",
- " points du tableau, par exemple ce tableau est équivalent à celui ci",
- " dessus , mais ne provoque pas d'erreur:",
- "",
- " (x0, y0) = ( 0, 0)",
- " (x1, y1) = (150, 150)",
- " (x2, y2) = (300, 300)",
- "",
- " Il n'est pratiquement jamais nécessaire d'utiliser plus de 5 ou",
- " 6 points. Ajouter des points augmente la taille du code et diminue",
- " sa vitesse d'exécution. Le comportement, si vous passez une valeur",
- " à xvar plus grande que la plus grande valeur du tableau , ou plus",
- " petit que la plus petite valeur, est indéfini.",
- " Cette instruction doit être complétement à droite dans une séquence.",
- "",
- "",
- "> LECTURE CONVERTISSEUR A/D Anom",
- " --{READ ADC}--",
- "",
- " LDmicro peut générer du code pour utiliser les convertisseurs A/D",
- " contenus dans certains microcontroleurs. Si la condition d'entrée",
- " de l'instruction est vraie, alors une acquisition du convertisseur",
- " A/D est éffectuée et stockée dans la variable Anom. Cette variable",
- " peut être par la suite traitée comme les autres variables par les",
- " différentes opérations arithmétiques ou autres. Vous devez affecter",
- " une broche du micro à la variable Anom de la même façon que pour",
- " les entrées et sorties digitales par un double clic dans la list",
- " affichée au bas de l'écran. Si la condition d'entrée de la séquence",
- " est fausse la variable Anom reste inchangée.",
- "",
- " Pour tous les circuits supportés actuellement, 0 volt en entrée",
- " correspond à une lecture ADC de 0, et une valeur égale à VDD (la",
- " tension d'alimentation ) correspond à une lecture ADC de 1023. Si",
- " vous utilisez un circuit AVR, vous devez connecter Aref à VDD.",
- "",
- " Vous pouvez utiliser les opérations arithmétiques pour mettre à ",
- " l'échelle les lectures effectuées dans l'unité qui vous est la plus ",
- " appropriée. Mais souvenez vous que tous les calculs sont faits en ",
- " utilisant les entiers.",
- "",
- " En général, toutes les broches ne sont pas utilisables pour les ",
- " lecture de convertisseur A/D. Le logiciel ne vous permet pas ",
- " d'affecter une broche non A/D pour une entrée convertisseur.",
- " Cette instruction doit être complétement à droite dans une séquence.",
- "",
- "",
- "> FIXER RAPPORT CYCLE PWM duty_cycle",
- " -{PWM 32.8 kHz}-",
- "",
- " LDmicro peut générer du code pour utiliser les périphériques PWM",
- " contenus dans certains microcontroleurs. Si la condition d'entrée",
- " de cette instruction est vraie, le rapport de cycle du périphérique",
- " PWM va être fixé à la valeur de la variable Rapport de cycle PWM.",
- " Le rapport de cycle est un nombre compris entre 0 (toujours au",
- " niveau bas) et 100 (toujours au niveau haut). Si vous connaissez la",
- " manière dont les périphériques fonctionnent vous noterez que LDmicro",
- " met automatiquement à l'échelle la variable du rapport de cycle en",
- " pourcentage de la période d'horloge PWM.",
- "",
- " Vous pouvez spécifier la fréquence de sortie PWM, en Hertz. Le",
- " fréquence que vous spécifiez peut ne pas être exactement accomplie, en",
- " fonction des divisions de la fréquence d'horloge du microcontroleur,",
- " LDmicro va choisir une fréquence approchée. Si l'erreur est trop",
- " importante, il vous avertit.Les vitesses rapides sont au détriment",
- " de la résolution. Cette instruction doit être complétement à droite",
- " dans une séquence.",
- "",
- " Le runtime du language à contacts consomme un timers (du micro) pour",
- " le temps de cycle, ce qui fait que le PWM est uniquement possible",
- " avec des microcontroleurs ayant au moins deux timers utilisables.",
- " PWM utilise CCP2 (pas CCP1) sur les PIC16F et OC2(pas OC1) sur les",
- " Atmel AVR.",
- "",
- "> METTRE PERSISTANT saved_var",
- " --{PERSIST}--",
- "",
- " Quand la condition d'entrée de cette instruction est vraie, la",
- " variable entière spécifiée va être automatiquement sauvegardée en",
- " EEPROM, ce qui fait que cette valeur persiste même après une coupure",
- " de l'alimentation du micro. Il n'y a pas à spécifier ou elle doit",
- " être sauvegardée en EEPROM, ceci est fait automatiquement, jusqu'a",
- " ce quelle change à nouveau. La variable est automatiquement chargée",
- " à partir de l'EEPROM suite à un reset à la mise sous tension.",
- "",
- " Si une variables, mise persistante, change fréquemment, l'EEPROM de",
- " votre micro peut être détruite très rapidement, Le nombre de cycles",
- " d'écriture dans l'EEPROM est limité à environ 100 000 cycles Quand",
- " la condition est fausse, rien n'apparait. Cette instruction doit",
- " être complétement à droite dans une séquence.",
- "",
- "",
- "> RECEPTION UART (SERIE) var",
- " --{UART RECV}--",
- "",
- " LDmicro peut générer du code pour utiliser l'UART, existant dans",
- " certains microcontroleurs. Sur les AVR, avec de multiples UART,",
- " uniquement l'UART1 est utilisable (pas l'UART0). Configurer la",
- " vitesse en utilisant -> Paramètres -> Paramètres MCU. Toutes les",
- " vitesses de liaison ne sont pas utilisables avec tous les quartz de",
- " toutyes les fréquences. Ldmicro vous avertit dans ce cas.",
- "",
- " Si la condition d'entrée de cette instruction est fausse, rien ne se",
- " passe. Si la condition d'entrée est vraie, elle essaie de recevoir",
- " un caractère en provenance de l'UART. Si aucun caractère n'est lu",
- " alors la condition de sortie devient fausse. Si un caractère est",
- " lu la valeur ASCII est stockée dans 'var' et la condition de sortie",
- " est vraie pour un seul cycle API.",
- "",
- "",
- "> EMMISION UART (SERIE) var",
- " --{UART SEND}--",
- "",
- " LDmicro peut générer du code pour utiliser l'UART, existant dans ",
- " certains microcontroleurs. Sur les AVR, avec de multiples UART, ",
- " uniquement l'UART1 est utilisable (pas l'UART0). Configurer la ",
- " vitesse en utilisant -> Paramètres -> Paramètres MCU. Toutes les ",
- " vitesses de liaison ne sont pas utilisables avec tous les quartz ",
- " de toutyes les fréquences. Ldmicro vous avertit dans ce cas.",
- "",
- " Si la condition d'entrée de cette instruction est fausse, rien ne",
- " se passe. Si la condition d'entrée est vraie alors cette instruction",
- " écrit un seul caractère vers l'UART. La valeur ASCII du caractère à",
- " transmettre doit avoir été stocké dans 'var' par avance. La condition",
- " de sortie de la séquence est vraie, si l'UART est occupée (en cours",
- " de transmission d'un caractère), et fausse sinon.",
- "",
- " Rappelez vous que les caractères mettent un certain temps pour être",
- " transmis. Vérifiez la condition de sortie de cette instruction pour",
- " vous assurer que le premier caractère à bien été transmis, avant",
- " d'essayer d'envoyer un second caractère, ou utiliser une temporisation",
- " pour insérer un délai entre caractères; Vous devez uniquement vérifier",
- " que la condition d'entrée est vraie (essayez de transmettre un",
- " caractère) quand la condition de sortie est fausse(UART non occuppée).",
- "",
- " Regardez l'instruction Chaine formattée(juste après) avant d'utiliser",
- " cette instruction, elle est plus simple à utiliser, et dans la",
- " majorité des cas, est capable de faire ce dont on a besoin.",
- "",
- "",
- "> CHAINE FORMATTEE SUR UART var",
- " -{\"Pression: \\3\\r\\n\"}-",
- "",
- " LDmicro peut générer du code pour utiliser l'UART, existant dans ",
- " certains microcontroleurs. Sur les AVR, avec de multiples UART, ",
- " uniquement l'UART1 est utilisable (pas l'UART0). Configurer la ",
- " vitesse en utilisant -> Paramètres -> Paramètres MCU. Toutes les ",
- " vitesses de liaison ne sont pas utilisables avec tous les quartz ",
- " de toutyes les fréquences. Ldmicro vous avertit dans ce cas.",
- "",
- " Quand la condition d'entrée de cette instruction passe de faux à vrai,",
- " elle commence à envoyer une chaine compléte vers le port série. Si",
- " la chaine comporte la séquence spéciale '3', alors cette séquence",
- " va être remplacée par la valeur de 'var', qui est automatiquement",
- " converti en une chaine. La variable va être formattée pour prendre",
- " exactement trois caractères; par exemple si var = 35, la chaine",
- " exacte qui va être \"imprimée\" sera 'Pression: 35\\r\\n' (notez les",
- " espaces supplémentaires). Si au lieu de cela var = 1432 , la sortie",
- " est indéfinie parceque 1432 comporte plus de 3 digits. Dans ce cas",
- " vous devez nécessairement utiliser '\\4' à la place.",
- "",
- " Si la variable peut être négative, alors utilisez '\\-3d' (ou `\\-4d'",
- " etc.) à la place. Ceci oblige LDmicro à imprimer un espace d'entête",
- " pour les nombres positifs et un signe moins d'entête pour les chiffres",
- " négatifs.",
- "",
- " Si de multiples instructions de chaines formattées sont activées au",
- " même moment (ou si une est activée avant de finir la précédente)",
- " ou si ces instructions sont imbriquées avec des instructions TX",
- " (transmission), le comportement est indéfini.",
- "",
- " Il est aussi possible d'utiliser cette instruction pour sortie une",
- " chaine fixe, sans l'intervention d'une variable en valeur entière",
- " dans le texte qui est envoyée sur la ligne série. Dans ce cas,",
- " simplement ne pas inclure de séquence spéciale Escape.",
- "",
- " Utiliser `\\\\' pour l'anti-slash. en addition à une séquence escape ",
- " pour intervenir sue une variables entière, les caractères de ",
- " contrôles suivants sont utilisables :",
- " ",
- " * \\r -- retour en début de ligne",
- " * \\n -- nouvelle ligne",
- " * \\f -- saut de page",
- " * \\b -- retour arrière",
- " * \\xAB -- caractère avec valeur ASCII 0xAB (hex)",
- "",
- " La condition de sortie de cette instruction est vraie quand elle",
- " transmet des données, sinon elle est fausse. Cette instruction",
- " consomme une grande quantité de mémoire, elle doit être utilisée",
- " avec modération. L'implémentation présente n'est pas efficace, mais",
- " une meilleure implémentation demanderait une modification de tout",
- " le reste.",
- "",
- "NOTE CONCERNANT LES MATHS",
- "=========================",
- "",
- "Souvenez vous que LDmicro travaille uniquement en mathématiques entiers",
- "16 bits. Ce qui fait que le résultat final de même que tous les calculs",
- "mêmes intermédiaires seront compris entre -32768 et 32767.",
- "",
- "Par exemple, si vous voulez calculer y = (1/x)*1200,ou x est compris",
- "entre 1 et 20, ce qui donne un résultat entre 1200 et 60,le résultat est",
- "bien à l'intérieur d'un entier 16 bits, il doit donc être théoriquement",
- "possible de faire le calcul. Nous pouvons faire le calcul de deux façons",
- "d'abord faire 1/x et ensuite la multiplication:",
- "",
- " || {DIV temp :=} ||",
- " ||---------{ 1 / x }----------||",
- " || ||",
- " || {MUL y := } ||",
- " ||----------{ temp * 1200}----------||",
- " || ||",
- "",
- "Ou uniquement faire simplement la division en une seule ligne :",
- "",
- " || {DIV y :=} ||",
- " ||-----------{ 1200 / x }-----------||",
- "",
- "Mathématiquement c'est identique, la première donne y = 0 , c'est à dire",
- "une mauvais résultat, si nous prenons par exemple x = 3 , 1/x = 0.333 mais",
- "comme il s'agit d'un entier, la valeur pour Temp est de 0 et 0*1200 = 0 ",
- "donc résultat faux.Dans le deuxième cas, il n'y a pas de résultat ",
- "intermédiaire et le résultat est correct dans tous les cas.",
- "",
- "Si vous trouvez un problème avec vos calculs mathématiques, vérifiez les",
- "résultats intermédiaires, si il n'y a pas de dépassement de capacités par",
- "rapports aux valeurs entières. (par exemple 32767 + 1 = -32768). Quand",
- "cela est possible essayer de choisir des valeurs entre -100 et 100.",
- "",
- "Vous pouvez utiliser un certain facteur de multiplication ou division pour ",
- "mettre à l'echelle les variables lors de calculs par exemple : pour mettre",
- "mettre à l'echelle y = 1.8*x , il est possible de faire y =(9/5)*x ",
- "(9/5 = 1.8) et coder ainsi y = (9*x)/5 en faisant d'abord la multiplication",
- "",
- " || {MUL temp :=} ||",
- " ||---------{ x * 9 }----------||",
- " || ||",
- " || {DIV y :=} ||",
- " ||-----------{ temp / 5 }-----------||",
- "",
- "Ceci fonctionne tant que x < (32767 / 9), or x < 3640. Pour les grandes ",
- "valeurs de x,la variable `temp' va se mettre en dépassement. Ceci est ",
- "similaire vers la limite basse de x.",
- "",
- "",
- "STYLE DE CODIFICATION",
- "=====================",
- "",
- "Il est permis d'avoir plusieurs bobines en parallèle, contrôlées par",
- "une simple ligne comme ci-dessous :",
- "",
- " || Xa Ya ||",
- " 1 ||-------] [--------------( )-------||",
- " || ||",
- " || Xb Yb ||",
- " ||-------] [------+-------( )-------||",
- " || | ||",
- " || | Yc ||",
- " || +-------( )-------||",
- " || ||",
- "",
- "à la place de ceci :",
- "",
- " || Xa Ya ||",
- " 1 ||-------] [--------------( )-------||",
- " || ||",
- " || ||",
- " || ||",
- " || ||",
- " || Xb Yb ||",
- " 2 ||-------] [--------------( )-------||",
- " || ||",
- " || ||",
- " || ||",
- " || ||",
- " || Xb Yc ||",
- " 3 ||-------] [--------------( )-------||",
- " || ||",
- "",
- "Il est permis théoriquement d'écrire un programme avec une séquence très",
- "importante et de ne pas utiliser plusieurs lignes pour la faire. En",
- "pratique c'est une mauvaise idée, à cause de la compléxité que cela",
- "peut engendrer et plus difficile à éditer sans effacer et redessiner un",
- "certain nombre d'éléments de logique.",
- "",
- "Néanmoins, c'est une bonne idée de regrouper différents éléments d'un bloc",
- "logique dans une seule séquence. Le code généré est identique dans les",
- "deux cas, et vous pouvez voir ce que fait la séquence dans le diagramme",
- "à contacts.",
- "",
- " * * *",
- "",
- "En général, il est considéré comme mauvais d'écrire du code dont la",
- "sortie dépend de l'ordre d'exécution. Exemple : ce code n'est pas très",
- "bon lorsque xa et xb sont vrai en même temps :",
- "",
- " || Xa {v := } ||",
- " 1 ||-------] [--------{ 12 MOV}--||",
- " || ||",
- " || Xb {v := } ||",
- " ||-------] [--------{ 23 MOV}--||",
- " || ||",
- " || ||",
- " || ||",
- " || ||",
- " || [v >] Yc ||",
- " 2 ||------[ 15]-------------( )-------||",
- " || ||",
- "",
- "Ci-dessous un exemple pour convertir 4 bits Xb3:0 en un entier :",
- "",
- " || {v := } ||",
- " 3 ||-----------------------------------{ 0 MOV}--||",
- " || ||",
- " || Xb0 {ADD v :=} ||",
- " ||-------] [------------------{ v + 1 }-----------||",
- " || ||",
- " || Xb1 {ADD v :=} ||",
- " ||-------] [------------------{ v + 2 }-----------||",
- " || ||",
- " || Xb2 {ADD v :=} ||",
- " ||-------] [------------------{ v + 4 }-----------||",
- " || ||",
- " || Xb3 {ADD v :=} ||",
- " ||-------] [------------------{ v + 8 }-----------||",
- " || ||",
- "",
- "Si l'instruction MOV est déplacée en dessous des instructions ADD, la",
- "valeur de la variable v, quand elle est lue autrepart dans le programme,",
- "serait toujours 0. La sortie du code dépend alors de l'ordre d'évaluations",
- "des instructions. Ce serait possible de modifier ce code pour éviter cela,",
- "mais le code deviendrait très encombrant.",
- "",
- "DEFAUTS",
- "=======",
- "",
- "LDmicro ne génére pas un code très efficace; il est lent à exécuter et",
- "il est gourmand en Flash et RAM. Un PIC milieu de gamme ou un AVR peut",
- "tout de même faire ce qu'un petit automate peut faire.",
- "",
- "La longueur maximum des noms de variables est très limitée, ceci pour",
- "être intégrée correctement dans le diagramme logique, je ne vois pas de",
- "solution satisfaisante pour solutionner ce problème.",
- "",
- "Si votre programme est trop important, vitesse exécution, mémoire",
- "programme ou contraintes de mémoire de données pour le processeur que vous",
- "avez choisi, il n'indiquera probablement pas d'erreur. Il se blocquera",
- "simplement quelque part.",
- "",
- "Si vous êtes programmeur négligent dans les sauvegardes et les",
- "chargements, il est possible qu'un crash se produise ou exécute un code",
- "arbitraire corrompu ou un mauvais fichier .ld .",
- "",
- "SVP, faire un rapport sur les bogues et les demandes de modifications.",
- "",
- "Thanks to:",
- " * Marcelo Solano, for reporting a UI bug under Win98",
- " * Serge V. Polubarjev, for not only noticing that RA3:0 on the",
- " PIC16F628 didn't work but also telling me how to fix it",
- " * Maxim Ibragimov, for reporting and diagnosing major problems",
- " with the till-then-untested ATmega16 and ATmega162 targets",
- " * Bill Kishonti, for reporting that the simulator crashed when the",
- " ladder logic program divided by zero",
- " * Mohamed Tayae, for reporting that persistent variables were broken",
- " on the PIC16F628",
- " * David Rothwell, for reporting several user interface bugs and a",
- " problem with the \"Export as Text\" function",
- "",
- "Particular thanks to Marcel Vaufleury, for this translation (of both",
- "the manual and the program's user interface) into French.",
- "",
- "",
- "COPYING, AND DISCLAIMER",
- "=======================",
- "",
- "DO NOT USE CODE GENERATED BY LDMICRO IN APPLICATIONS WHERE SOFTWARE",
- "FAILURE COULD RESULT IN DANGER TO HUMAN LIFE OR DAMAGE TO PROPERTY. THE",
- "AUTHOR ASSUMES NO LIABILITY FOR ANY DAMAGES RESULTING FROM THE OPERATION",
- "OF LDMICRO OR CODE GENERATED BY LDMICRO.",
- "",
- "This program is free software: you can redistribute it and/or modify it",
- "under the terms of the GNU General Public License as published by the",
- "Free Software Foundation, either version 3 of the License, or (at your",
- "option) any later version.",
- "",
- "This program is distributed in the hope that it will be useful, but",
- "WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY",
- "or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License",
- "for more details.",
- "",
- "You should have received a copy of the GNU General Public License along",
- "with this program. If not, see <http://www.gnu.org/licenses/>.",
- "",
- "",
- "Jonathan Westhues",
- "",
- "Rijswijk -- Dec 2004",
- "Waterloo ON -- Jun, Jul 2005",
- "Cambridge MA -- Sep, Dec 2005",
- " Feb, Mar 2006",
- "",
- "Email: user jwesthues, at host cq.cx",
- "",
- "",
- NULL
-};
-#endif
-
-#ifdef LDLANG_TR
-char *HelpTextTr[] = {
- "",
- "KULLANIM KÝTAPÇIÐI",
- "==================",
- "LDMicro desteklenen MicroChip PIC16 ve Atmel AVR mikrokontrolcüler için ",
- "gerekli kodu üretir. Bu iþ için kullanýlabilecek deðiþik programlar vardýr.",
- "Örneðin BASIC, C, assembler gibi. Bu programlar kendi dillerinde yazýlmýþ",
- "programlarý iþlemcilerde çalýþabilecek dosyalar haline getirirler.",
- "",
- "PLC'de kullanýlan dillerden biri ladder diyagramýdýr. Aþaðýda LDMicro ile",
- "yazýlmýþ basit bir program görülmektedir.",
- "",
- " || ||",
- " || Xbutton1 Tdon Rchatter Yred ||",
- " 1 ||-------]/[---------[TON 1.000 s]-+-------]/[--------------( )-------||",
- " || | ||",
- " || Xbutton2 Tdof | ||",
- " ||-------]/[---------[TOF 2.000 s]-+ ||",
- " || ||",
- " || ||",
- " || ||",
- " || Rchatter Ton Tnew Rchatter ||",
- " 2 ||-------]/[---------[TON 1.000 s]----[TOF 1.000 s]---------( )-------||",
- " || ||",
- " || ||",
- " || ||",
- " ||------[END]---------------------------------------------------------||",
- " || ||",
- " || ||",
- "",
- "(TON=turn-on gecikme; TOF-turn-off gecikme. --] [-- giriþler, diðer bir ",
- "deyiþle kontaklardýr. --( )-- ise çýkýþlardýr. Bunlar bir rölenin bobini ",
- "gibi davranýrlar. Ladder diyagramý ile ilgili bol miktarda kaynak internet",
- "üzerinde bulunmaktadýr. Burada LDMicro'ya has özelliklerden bahsedeceðiz.",
- "",
- "LDmicro ladder diyagramýný PIC16 veya AVR koduna çevirir. Aþaðýda desteklenen",
- "iþlemcilerin listesi bulunmaktadýr:",
- " * PIC16F877",
- " * PIC16F628",
- " * PIC16F876 (denenmedi)",
- " * PIC16F88 (denenmedi)",
- " * PIC16F819 (denenmedi)",
- " * PIC16F887 (denenmedi)",
- " * PIC16F886 (denenmedi)",
- " * ATmega128",
- " * ATmega64",
- " * ATmega162 (denenmedi)",
- " * ATmega32 (denenmedi)",
- " * ATmega16 (denenmedi)",
- " * ATmega8 (denenmedi)",
- "",
- "Aslýnda daha fazla PIC16 ve AVR iþlemci desteklenebilir. Ancak test ettiklerim",
- "ve desteklediðini düþündüklerimi yazdým. Örneðin PIC16F648 ile PIC16F628 ",
- "arasýnda fazla bir fark bulunmamaktadýr. Eðer bir iþlemcinin desteklenmesini",
- "istiyorsanýz ve bana bildirirseniz ilgilenirim.",
- "",
- "LDMicro ile ladder diyagramýný çizebilir, devrenizi denemek için gerçek zamanlý ",
- "simülasyon yapabilirsiniz. Programýnýzýn çalýþtýðýndan eminseniz programdaki ",
- "giriþ ve çýkýþlara mikrokontrolörün bacaklarýný atarsýnýz. Ýþlemci bacaklarý ",
- "belli olduktan sonra programýnýzý derleyebilirsiniz. Derleme sonucunda oluþan",
- "dosya .hex dosyasýdýr. Bu dosyayý PIC/AVR programlayýcý ile iþlemcinize kaydedersiniz.",
- "PIC/AVR ile uðraþanlar konuya yabancý deðildir.",
- "",
- "",
- "LDMicro ticari PLC programlarý gibi tasarlanmýþtýr. Bazý eksiklikler vardýr. ",
- "Kitapçýðý dikkatlice okumanýzý tavsiye ederim. Kullaným esnasýnda PLC ve ",
- "PIC/AVR hakkýnda temel bilgilere sahip olduðunuz düþünülmüþtür.",
- "",
- "DÝÐER AMAÇLAR",
- "==================",
- "",
- "ANSI C kodunu oluþturmak mümkündür. C derleyicisi olan herhangi bir",
- "iþlemci için bu özellikten faydalanabilirsiniz. Ancak çalýþtýrmak için ",
- "gerekli dosyalarý siz saðlamalýsýnýz. Yani, LDMicro sadece PlcCycle()",
- "isimli fonksiyonu üretir. Her döngüde PlcCycle fonksiyonunu çaðýrmak, ve",
- "PlcCycle() fonksiyonunun çaðýrdýðý dijital giriþi yazma/okuma vs gibi",
- "G/Ç fonksiyonlarý sizin yapmanýz gereken iþlemlerdir.",
- "Oluþturulan kodu incelerseniz faydalý olur.",
- "",
- "KOMUT SATIRI SEÇENEKLERÝ",
- "========================",
- "",
- "Normal þartlarda ldmicro.exe komut satýrýndan seçenek almadan çalýþýr.",
- "LDMicro'ya komut satýrýndan dosya ismi verebilirsiniz. Örneðin;komut",
- "satýrýndan 'ldmicro.exe asd.ld' yazarsanýz bu dosya açýlmaya çalýþýrlýr.",
- "Dosya varsa açýlýr. Yoksa hata mesajý alýrsýnýz. Ýsterseniz .ld uzantýsýný",
- "ldmicro.exe ile iliþkilendirirseniz .ld uzantýlý bir dosyayý çift týklattýðýnýzda",
- "bu dosya otomatik olarak açýlýr. Bkz. Klasör Seçenekleri (Windows).",
- "",
- "`ldmicro.exe /c src.ld dest.hex', þeklinde kullanýlýrsa src.ld derlenir",
- "ve hazýrlanan derleme dest.hex dosyasýna kaydedilir. Ýþlem bitince LDMicro kapanýr.",
- "Oluþabilecek tüm mesajlar konsoldan görünür.",
- "",
- "TEMEL BÝLGÝLER",
- "==============",
- "",
- "LDMicro açýldýðýnda boþ bir program ile baþlar. Varolan bir dosya ile baþlatýrsanýz",
- "bu program açýlýr. LDMicro kendi dosya biçimini kullandýðýndan diðer dosya",
- "biçimlerinden dosyalarý açamazsýnýz.",
- "",
- "Boþ bir dosya ile baþlarsanýz ekranda bir tane boþ satýr görürsünüz. Bu satýra",
- "komutlarý ekleyebilir, satýr sayýsýný artýrabilirsiniz. Satýrlara Rung denilir.",
- "Örneðin; Komutlar->Kontak Ekle diyerek bir kontak ekleyebilirsiniz. Bu kontaða",
- "'Xnew' ismi verilir. 'X' bu kontaðýn iþlemcinin bacaðýna denk geldiðini gösterir.",
- "Bu kontaða derlemeden önce isim vermeli ve mikrokontrolörün bir bacaðý ile",
- "eþleþtirmelisiniz. Eþleþtirme iþlemi içinde önce iþlemciyi seçmelisiniz.",
- "Elemanlarýn ilk harfi o elemanýn ne olduðu ile ilgilidir. Örnekler:",
- "",
- " * Xname -- mikrokontrolördeki bir giriþ bacaðý",
- " * Yname -- mikrokontrolördeki bir çýkýþ bacaðý",
- " * Rname -- `dahili röle': hafýzada bir bit.",
- " * Tname -- zamanlayýcý; turn-on, turn-off yada retentive ",
- " * Cname -- sayýcý, yukarý yada aþaðý sayýcý",
- " * Aname -- A/D çeviriciden okunan bir tamsayý deðer",
- " * name -- genel deðiþken (tamsayý)",
- "",
- "Ýstediðiniz ismi seçebilirsiniz. Seçilen bir isim nerede kullanýlýrsa",
- "kullanýlsýn ayný yere denk gelir. Örnekler; bir satýrda Xasd kullandýðýnýzda",
- "bir baþka satýrda Xasd kullanýrsanýz ayný deðere sahiptirler. ",
- "Bazen bu mecburi olarak kullanýlmaktadýr. Ancak bazý durumlarda hatalý olabilir.",
- "Mesela bir (TON) Turn-On Gecikmeye Tgec ismini verdikten sonra bir (TOF)",
- "Turn_Off gecikme devresine de Tgec ismini verirseniz hata yapmýþ olursunuz.",
- "Dikkat ederseniz yaptýðýnýz bir mantýk hatasýdýr. Her gecikme devresi kendi",
- "hafýzasýna sahip olmalýdýr. Ama Tgec (TON) turn-on gecikme devresini sýfýrlamak",
- "için kullanýlan RES komutunda Tgec ismini kullanmak gerekmektedir.",
- "",
- "Deðiþken isimleri harfleri, sayýlarý, alt çizgileri ihtiva edebilir.",
- "(_). Deðiþken isimleri sayý ile baþlamamalýdýr. Deðiþken isimleri büyük-küçük harf duyarlýdýr.",
- "Örneðin; TGec ve Tgec ayný zamanlayýcýlar deðildir.",
- "",
- "",
- "Genel deðiþkenlerle ilgili komutlar (MOV, ADD, EQU vs) herhangi bir",
- "isimdeki deðiþkenlerle çalýþýr. Bunun anlamý bu komutlar zamanlayýcýlar",
- "ve sayýcýlarla çalýþýr. Zaman zaman bu faydalý olabilir. Örneðin; bir ",
- "zamanlayýcýnýn deðeri ile ilgili bir karþýlaþtýrma yapabilirsiniz.",
- "",
- "Deðiþkenler hr zaman için 16 bit tamsayýdýr. -32768 ile 32767 arasýnda",
- "bir deðere sahip olabilirler. Her zaman için iþaretlidir. (+ ve - deðere",
- "sahip olabilirler) Onluk sayý sisteminde sayý kullanabilirsiniz. Týrnak",
- "arasýna koyarak ('A', 'z' gibi) ASCII karakterler kullanabilirsiniz.",
- "",
- "Ekranýn alt tarafýndaki kýsýmda kullanýlan tüm elemanlarýn bir listesi görünür.",
- "Bu liste program tarafýndan otomatik olarak oluþturulur ve kendiliðinden",
- "güncelleþtirilir. Sadece 'Xname', 'Yname', 'Aname' elemanlarý için",
- "mikrokontrolörün bacak numaralarý belirtilmelidir. Önce Ayarlar->Ýþlemci Seçimi",
- "menüsünden iþlemciyi seçiniz. Daha sonra G/Ç uçlarýný çift týklatarak açýlan",
- "pencereden seçiminizi yapýnýz.",
- "",
- "Komut ekleyerek veya çýkararak programýnýzý deðiþtirebilirsiniz. Programdaki",
- "kursör eleman eklenecek yeri veya hakkýnda iþlem yapýlacak elemaný göstermek",
- "amacýyla yanýp söner. Elemanlar arasýnda <Tab> tuþu ile gezinebilirsiniz. Yada",
- "elemaný fare ile týklatarak iþlem yapýlacak elemaný seçebilirsiniz. Kursör elemanýn",
- "solunda, saðýnda, altýnda ve üstünde olabilir. Solunda ve saðýnda olduðunda",
- "ekleme yaptýðýnýzda eklenen eleman o tarafa eklenir. Üstünde ve altýnda iken",
- "eleman eklerseniz eklenen eleman seçili elemana paralel olarak eklenir.",
- "Bazý iþlemleri yapamazsýnýz. Örneðin bir bobinin saðýna eleman ekleyemezsiniz.",
- "LDMicro buna izin vermeyecektir.",
- "",
- "Program boþ bir satýrla baþlar. Kendiniz alta ve üste satýr ekleyerek dilediðiniz",
- "gibi diyagramýnýzý oluþturabilirsiniz. Yukarýda bahsedildiði gibi alt devreler",
- "oluþturabilirsiniz.",
- "",
- "Programýnýz yazdýðýnýzda simülasyon yapabilir, .hex dosyasýný oluþturabilirsiniz.",
- "",
- "SÝMÜLASYON",
- "==========",
- "",
- "Simülasyon moduna geçmek için Simülasyon->Simülasyon modu menüsünü týklatabilir,",
- "yada <Ctrl+M> tuþ kombinasyonuna basabilirsiniz. Simülasyon modunda program",
- "farklý bir görüntü alýr. Kursör görünmez olur. Enerji alan yerler ve elemanlar",
- "parlak kýrmýzý, enerji almayan yerler ve elemanlar gri görünür. Boþluk tuþuna",
- "basarak bir çevrim ilerleyebilir yada menüden Simülasyon->Gerçek Zamanlý Simülasyonu Baþlat",
- "diyerek (veya <Ctrl+R>) devamlý bir çevrim baþlatabilirsiniz. Ladder diyagramýnýn",
- "çalýþmasýna göre gerçek zamanlý olarak elemanlar ve yollar program tarafýndan deðiþtirilir.",
- "",
- "Giriþ elemanlarýnýn durumunu çift týklatarak deðiþtirebilirsiniz. Mesela, 'Xname'",
- "kontaðýný çift týklatýranýz açýktan kapalýya veya kapalýdan açýða geçiþ yapar.",
- "",
- "DERLEME",
- "=======",
- "",
- "Ladder diyagramýnýn yapýlmasýndaki amaç iþlemciye yüklenecek .hex dosyasýnýn",
- "oluþturulmasýdýr. Buna 'derleme' denir. Derlemeden önce þu aþamalar tamamlanmalýdýr:",
- " 1- Ýþlemci seçilmelidir. Ayarlar->Ýþlemci Seçimi menüsünden yapýlýr.",
- " 2- G/Ç uçlarýnýn mikrokontrolördeki hangi bacaklara baðlanacaðý seçilmelidir.",
- " Elemanýn üzerine çift týklanýr ve çýkan listeden seçim yapýlýr.",
- " 3- Çevrim süresi tanýmlanmalýdýr. Ayarlar->Ýþlemci Ayarlarý menüsünden yapýlýr.",
- " Bu süre iþlemcinin çalýþtýðý frekansa baðlýdýr. Çoðu uygulamalar için 10ms",
- " uygun bir seçimdir. Ayný yerden kristal frekansýný ayarlamayý unutmayýnýz.",
- "",
- "Artýk kodu üretebilirsiniz. Derle->Derle yada Derle->Farklý Derle seçeneklerinden",
- "birini kullanacaksýnýz. Aradaki fark Kaydet ve Farklý Kaydet ile aynýdýr. Sonuçta",
- "Intel IHEX dosyanýz programýnýzda hata yoksa üretilecektir. Programýnýzda hata varsa",
- "uyarý alýrsýnýz.",
- "",
- "Progamlayýcýnýz ile bu dosyayý iþlemcinize yüklemelisiniz. Buradaki en önemli nokta",
- "iþlemcinin konfigürasyon bitlerinin ayarlanmasýdýr. PIC16 iþlemciler için gerekli ",
- "ayar bilgileri hex dosyasýna kaydedildiðinden programlayýcýnýz bu ayarlarý algýlayacaktýr.",
- "Ancak AVR iþlemciler için gerekli ayarlarý siz yapmalýsýnýz.",
- "",
- "KOMUTLAR ve ELEMANLAR",
- "=====================",
- "",
- "> KONTAK, NORMALDE AÇIK Xname Rname Yname",
- " ----] [---- ----] [---- ----] [----",
- "",
- " Normalde açýk bir anahtar gibi davranýr. Komutu kontrol eden sinyal 0 ise ",
- " çýkýþýndaki sinyalde 0 olur. Eðer kontrol eden sinyal 1 olursa çýkýþý da 1",
- " olur ve çýkýþa baðlý bobin aktif olur. Bu kontak iþlemci bacaðýndan alýnan",
- " bir giriþ, çýkýþ bacaðý yada dahili bir röle olabilir.",
- "",
- "",
- "> KONTAK, NORMALDE KAPALI Xname Rname Yname",
- " ----]/[---- ----]/[---- ----]/[----",
- "",
- " Normalde kapalý bir anahtar gibi davranýr. Komutun kontrol eden sinyal 0 ise",
- " çýkýþý 1 olur. Eðer kontrol eden sinyal 1 olursa çýkýþý 0 olur ve çýkýþa",
- " baðlý elemanlar pasif olur. Normalde çýkýþa gerilim verilir, ancak bu kontaðý ",
- " kontrol eden sinyal 1 olursa kontaðýn çýkýþýnda gerilim olmaz. Bu kontak ",
- " iþlemci bacaðýndan alýnan bir giriþ, çýkýþ bacaðý yada dahili bir röle olabilir",
- "",
- "",
- "> BOBÝN, NORMAL Rname Yname",
- " ----( )---- ----( )----",
- "",
- " Elemana giren sinyal 0 ise dahili röle yada çýkýþ bacaðý 0 yapýlýr.",
- " Elemana giren sinyal 1 ise dahili röle yada çýkýþ bacaðý 1 yapýlýr.",
- " Bobine giriþ deðiþkeni atamak mantýksýzdýr. Bu eleman bir satýrda",
- " saðdaki en son eleman olmalýdýr.",
- "",
- "",
- "> BOBÝN, TERSLENMÝÞ Rname Yname",
- " ----(/)---- ----(/)----",
- "",
- " Elemana giren sinyal 0 ise dahili röle yada çýkýþ bacaðý 1 yapýlýr.",
- " Elemana giren sinyal 1 ise dahili röle yada çýkýþ bacaðý 0 yapýlýr.",
- " Bobine giriþ deðiþkeni atamak mantýksýzdýr. Bu eleman bir satýrda",
- " saðdaki en son eleman olmalýdýr. Normal bobinin tersi çalýþýr.",
- " ",
- "",
- "> BOBÝN, SET Rname Yname",
- " ----(S)---- ----(S)----",
- "",
- " Elemana giren sinyal 1 ise dahili röle yada çýkýþ bacaðý 1 yapýlýr.",
- " Diðer durumlarda bu bobinin durumunda bir deðiþiklik olmaz. Bu komut",
- " bobinin durumunu sadece 0'dan 1'e çevirir. Bu nedenle çoðunlukla",
- " BOBÝN-RESET ile beraber çalýþýr. Bu eleman bir satýrda saðdaki en",
- " son eleman olmalýdýr.",
- "",
- "",
- "> BOBÝN, RESET Rname Yname",
- " ----(R)---- ----(R)----",
- "",
- " Elemana giren sinyal 1 ise dahili röle yada çýkýþ bacaðý 0 yapýlýr.",
- " Diðer durumlarda bu bobinin durumunda bir deðiþiklik olmaz. Bu komut",
- " bobinin durumunu sadece 1'dEn 0'a çevirir. Bu nedenle çoðunlukla",
- " BOBÝN-SET ile beraber çalýþýr. Bu eleman bir satýrda saðdaki en",
- " son eleman olmalýdýr.",
- "",
- "",
- "> TURN-ON GECÝKME Tdon ",
- " -[TON 1.000 s]-",
- "",
- " Bir zamanlayýcýdýr. Giriþindeki sinyal 0'dan 1'e geçerse ayarlanan",
- " süre kadar sürede çýkýþ 0 olarak kalýr, süre bitince çýkýþý 1 olur. ",
- " Giriþindeki sinyal 1'den 0'a geçerse çýkýþ hemen 0 olur.",
- " Giriþi 0 olduðu zaman zamanlayýcý sýfýrlanýr. Ayrýca; ayarlanan süre",
- " boyunca giriþ 1 olarak kalmalýdýr.",
- "",
- " Zamanlayýcý 0'dan baþlayarak her çevrim süresinde 1 artarak sayar.",
- " Sayý ayarlanan süreye eþit yada büyükse çýkýþ 1 olur. Zamanlayýcý",
- " deðiþkeni üzerinde iþlem yapmak mümkündür. (Örneðin MOV komutu ile)",
- "",
- "",
- "> TURN-OFF GECÝKME Tdoff ",
- " -[TOF 1.000 s]-",
- "",
- " Bir zamanlayýcýdýr. Giriþindeki sinyal 1'den 0'a geçerse ayarlanan",
- " süre kadar sürede çýkýþ 1 olarak kalýr, süre bitince çýkýþý 0 olur. ",
- " Giriþindeki sinyal 0'dan 1'e geçerse çýkýþ hemen 1 olur.",
- " Giriþi 0'dan 1'e geçtiðinde zamanlayýcý sýfýrlanýr. Ayrýca; ayarlanan",
- " süre boyunca giriþ 0 olarak kalmalýdýr.",
- "",
- " Zamanlayýcý 0'dan baþlayarak her çevrim süresinde 1 artarak sayar.",
- " Sayý ayarlanan süreye eþit yada büyükse çýkýþ 1 olur. Zamanlayýcý",
- " deðiþkeni üzerinde iþlem yapmak mümkündür. (Örneðin MOV komutu ile)",
- "",
- "",
- "> SÜRE SAYAN TURN-ON GECÝKME Trto ",
- " -[RTO 1.000 s]-",
- "",
- " Bu zamanlayýcý giriþindeki sinyalin ne kadar süre ile 1 olduðunu",
- " ölçer. Ayaralanan süre boyunca giriþ 1 ise çýkýþý 1 olur. Aksi halde",
- " çýkýþý 0 olur. Ayarlanan süre devamlý olmasý gerekmez. Örneðin; süre ",
- " 1 saniyeye ayarlanmýþsa ve giriþ önce 0.6 sn 1 olmuþsa, sonra 2.0 sn",
- " boyunca 0 olmuþsa daha sonra 0.4 sn boyunca giriþ tekrar 1 olursa",
- " 0.6 + 0.4 = 1sn olduðundan çýkýþ 1 olur. Çýkýþ 1 olduktan sonra",
- " giriþ 0 olsa dahi çýkýþ 0'a dönmez. Bu nedenle zamanlayýcý RES reset",
- " komutu ile resetlenmelidir.",
- "",
- " Zamanlayýcý 0'dan baþlayarak her çevrim süresinde 1 artarak sayar.",
- " Sayý ayarlanan süreye eþit yada büyükse çýkýþ 1 olur. Zamanlayýcý",
- " deðiþkeni üzerinde iþlem yapmak mümkündür. (Örneðin MOV komutu ile)",
- "",
- "",
- "> RESET (SAYICI SIFIRLAMASI) Trto Citems",
- " ----{RES}---- ----{RES}----",
- "",
- " Bu komut bir zamanlayýcý veya sayýcýyý sýfýrlar. TON ve TOF zamanlayýcý",
- " komutlarý kendiliðinden sýfýrlandýðýndan bu komuta ihtiyaç duymazlar.",
- " RTO zamanlayýcýsý ve CTU/CTD sayýcýlarý kendiliðinden sýfýrlanmadýðýndan",
- " sýfýrlanmalarý için kullanýcý tarafýndan bu komutile sýfýrlanmasý",
- " gerekir. Bu komutun giriþi 1 olduðunda sayýcý/zamanlayýcý sýfýrlanýr.",
- " Bu komut bir satýrýn saðýndaki son komut olmalýdýr.",
- "",
- "",
- "> YÜKSELEN KENAR _",
- " --[OSR_/ ]--",
- "",
- " Bu komutun çýkýþý normalde 0'dýr. Bu komutun çýkýþýnýn 1 olabilmesi",
- " için bir önceki çevrimde giriþinin 0 þimdiki çevrimde giriþinin 1 ",
- " olmasý gerekir. Komutun çýkýþý bir çevrimlik bir pals üretir.",
- " Bu komut bir sinyalin yükselen kenarýnda bir tetikleme gereken",
- " uygulamalarda faydalýdýr.",
- " ",
- "",
- "> DÜÞEN KENAR _",
- " --[OSF \\_]--",
- "",
- " Bu komutun çýkýþý normalde 0'dýr. Bu komutun çýkýþýnýn 1 olabilmesi",
- " için bir önceki çevrimde giriþinin 1 þimdiki çevrimde giriþinin 0 ",
- " olmasý gerekir. Komutun çýkýþý bir çevrimlik bir pals üretir.",
- " Bu komut bir sinyalin düþen kenarýnda bir tetikleme gereken",
- " uygulamalarda faydalýdýr.",
- "",
- "",
- "> KISA DEVRE, AÇIK DEVRE",
- " ----+----+---- ----+ +----",
- "",
- " Kýsa devrenin çýkýþý her zaman giriþinin aynýsýdýr.",
- " Açýk devrenin çýkýþý her zaman 0'dýr. Bildiðimiz açýk/kýsa devrenin",
- " aynýsýdýr. Genellikle hata aramada kullanýlýrlar.",
- "",
- "> ANA KONTROL RÖLESÝ",
- " -{MASTER RLY}-",
- "",
- " Normalde her satýrýn ilk giriþi 1'dir. Birden fazla satýrýn tek bir þart ile ",
- " kontrol edilmesi gerektiðinde paralel baðlantý yapmak gerekir. Bu ise zordur.",
- " Bu iþlemi kolayca yapabilmek için ana kontrol rölesini kullanabiliriz.",
- " Ana kontrol rölesi eklendiðinde kendisinden sonraki satýrlar bu röleye baðlý",
- " hale gelir. Böylece; birden fazla satýr tek bir þart ile kontrolü saðlanýr.",
- " Bir ana kontrol rölesi kendisinden sonra gelen ikinci bir ana kontrol",
- " rölesine kadar devam eder. Diðer bir deyiþle birinci ana kontrol rölesi",
- " baþlangýcý ikincisi ise bitiþi temsil eder. Ana kontrol rölesi kullandýktan",
- " sonra iþlevini bitirmek için ikinci bir ana kontrol rölesi eklemelisiniz.",
- "",
- "> MOVE {destvar := } {Tret := }",
- " -{ 123 MOV}- -{ srcvar MOV}-",
- "",
- " Giriþi 1 olduðunda verilen sabit sayýyý (123 gibi) yada verilen deðiþkenin",
- " içeriðini (srcvar) belirtilen deðiþkene (destvar) atar. Giriþ 0 ise herhangi",
- " bir iþlem olmaz. Bu komut ile zamanlayýcý ve sayýcýlar da dahil olmak üzere",
- " tüm deðiþkenlere deðer atayabilirsiniz. Örneðin Tsay zamanlayýcýsýna MOVE ile",
- " 0 atamak ile RES ile sýfýrlamak ayný sonucu doðurur. Bu komut bir satýrýn",
- " saðýndaki en son komut olmalýdýr.",
- "",
- "> MATEMATÝK ÝÞLEMLER {ADD kay :=} {SUB Ccnt :=}",
- " -{ 'a' + 10 }- -{ Ccnt - 10 }-",
- "",
- "> {MUL dest :=} {DIV dv := }",
- " -{ var * -990 }- -{ dv / -10000}-",
- "",
- " Bu komutun giriþi doðru ise belirtilen hedef deðiþkenine verilen matematik",
- " iþlemin sonucunu kaydeder. Ýþlenen bilgi zamanlayýcý ve sayýcýlar dahil",
- " olmak üzere deðiþkenler yada sabit sayýlar olabilir. Ýþlenen bilgi 16 bit",
- " iþaretli sayýdýr. Her çevrimde iþlemin yeniden yapýldýðý unutulmamalýdýr.",
- " Örneðin artýrma yada eksiltme yapýyorsanýz yükselen yada düþen kenar",
- " kullanmanýz gerekebilir. Bölme (DIV) virgülden sonrasýný keser. Örneðin;",
- " 8 / 3 = 2 olur. Bu komut bir satýrýn saðýndaki en son komut olmalýdýr.",
- "",
- "",
- "> KARÞILAÞTIRMA [var ==] [var >] [1 >=]",
- " -[ var2 ]- -[ 1 ]- -[ Ton]-",
- "",
- "> [var /=] [-4 < ] [1 <=]",
- " -[ var2 ]- -[ vartwo]- -[ Cup]-",
- "",
- " Deðiþik karþýlaþtýrma komutlarý vardýr. Bu komutlarýn giriþi doðru (1)",
- " ve verilen þart da doðru ise çýkýþlarý 1 olur.",
- "",
- "",
- "> SAYICI Cname Cname",
- " --[CTU >=5]-- --[CTD >=5]--",
- "",
- " Sayýcýlar giriþlerinin 0'dan 1'e her geçiþinde yani yükselen kenarýnda",
- " deðerlerini 1 artýrýr (CTU) yada eksiltirler (CTD). Verilen þart doðru ise",
- " çýkýþlarý aktif (1) olur. CTU ve CTD sayýcýlarýna ayný ismi erebilirsiniz.",
- " Böylece ayný sayýcýyý artýrmýþ yada eksiltmiþ olursunuz. RES komutu sayýcýlarý",
- " sýfýrlar. Sayýcýlar ile genel deðiþkenlerle kullandýðýnýz komutlarý kullanabilirsiniz.",
- "",
- "",
- "> DAÝRESEL SAYICI Cname",
- " --{CTC 0:7}--",
- "",
- " Normal yukarý sayýcýdan farký belirtilen limite ulaþýnca sayýcý tekrar 0'dan baþlar",
- " Örneðin sayýcý 0, 1, 2, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 2,.... þeklinde",
- " sayabilir. Yani bir dizi sayýcý olarak düþünülebilir. CTC sayýcýlar giriþlerinin",
- " yükselen kenarýnda deðer deðiþtirirler. Bu komut bir satýrýn saðýndaki",
- " en son komut olmalýdýr.",
- " ",
- "",
- "> SHIFT REGISTER {SHIFT REG }",
- " -{ reg0..3 }-",
- "",
- " Bir dizi deðiþken ile beraber çalýþýr. Ýsim olarak reg verdiðinizi ve aþama ",
- " sayýsýný 3 olarak tanýmladýysanýz reg0, reg1, reg2 deðikenleri ile çalýþýrsýnýz.",
- " Kaydedicinin giriþi reg0 olur. Giriþin her yükselen kenarýnda deðerler kaydedicide",
- " bir saða kayar. Mesela; `reg2 := reg1'. and `reg1 := reg0'. `reg0' deðiþmez.",
- " Geniþ bir kaydedici hafýzada çok yer kaplar.",
- " Bu komut bir satýrýn saðýndaki en son komut olmalýdýr.",
- "",
- "",
- "> DEÐER TABLOSU {dest := }",
- " -{ LUT[i] }-",
- "",
- " Deðer tablosu sýralanmýþ n adet deðer içeren bir tablodur. Giriþi doðru olduðunda",
- " `dest' tamsayý deðiþkeni `i' tamsayý deðiþkenine karþýlýk gelen deðeri alýr. Sýra",
- " 0'dan baþlar. bu nedenle `i' 0 ile (n-1) arasýnda olabilir. `i' bu deðerler ",
- " arasýnda deðilse komutun ne yapacaðý tanýmlý deðildir.",
- " Bu komut bir satýrýn saðýndaki en son komut olmalýdýr.",
- "",
- "",
- "> PIECEWISE LINEAR TABLE {yvar := }",
- " -{ PWL[xvar] }-",
- "",
- " Bir matris tablo olarak düþünülebilir. Bir deðere baðlý olarak deðerin önceden",
- " belirlenen bir baþka deðer ile deðiþtirilmesi içi oluþturulan bir tablodur.",
- " Bu bir eðri oluþturmak, sensörden alýnan deðere göre çýkýþta baþka bir eðri",
- " oluþturmak gibi amaçlar için kullanýlabilir.",
- "",
- " Farzedelimki x tamsayý giriþ deðerini y tamsayý çýkýþ deðerine yaklaþtýrmak ",
- " istiyoruz. Deðerlerin belirli noktalarda olduðunu biliyoruz. Örneðin;",
- "",
- " f(0) = 2",
- " f(5) = 10",
- " f(10) = 50",
- " f(100) = 100",
- "",
- " Bu þu noktalarýn eðride olduðunu gösterir:",
- "",
- " (x0, y0) = ( 0, 2)",
- " (x1, y1) = ( 5, 10)",
- " (x2, y2) = ( 10, 50)",
- " (x3, y3) = (100, 100)",
- "",
- " Dört deðeri parçalý lineer tabloya gireriz. Komut, xvar'ýn deðerine bakarak",
- " yvar'a deðer verir. Örneðin, yukarýdaki örneðe bakarak, xvar = 10 ise",
- " yvar = 50 olur.",
- " ",
- " Tabloya kayýtlý iki deðerin arasýnda bir deðer verirseniz verilen deðer de",
- " alýnmasý gereken iki deðerin arasýnda uygun gelen yerde bir deðer olur.",
- " Mesela; xvar=55 yazarsanýz yvar=75 olur. (Tablodaki deðerler (10,50) ve",
- " (100,100) olduðuna göre). 55, 10 ve 100 deðerlerinin ortasýndadýr. Bu",
- " nedenle 55 ve 75 deðerlerinin ortasý olan 75 deðeri alýnýr.",
- " ",
- " Deðerler x koordinatýnda artan deðerler olarak yazýlmalýdýr. 16 bit tamsayý",
- " kullanan bazý deðerler için arama tablosu üzerinde matematik iþlemler",
- " gerçekleþmeyebilir. Bu durumda LDMicro sizi uyaracaktýr. Örneðin aþaðýdaki",
- " tablo bir hata oluþturacaktýr:",
- "",
- " (x0, y0) = ( 0, 0)",
- " (x1, y1) = (300, 300)",
- "",
- " Bu tip hatalarý noktalar arsýnda ara deðerler oluþturarak giderebilirsiniz.",
- " Örneðin aþaðýdaki tablo yukarýdakinin aynýsý olmasýna raðmen hata ",
- " oluþturmayacaktýr.",
- " ",
- " (x0, y0) = ( 0, 0)",
- " (x1, y1) = (150, 150)",
- " (x2, y2) = (300, 300)",
- "",
- " Genelde 5 yada 6 noktadan daha fazla deðer kullanmak gerekmeyecektir.",
- " Daha fazla nokta demek daha fazla kod ve daha yavaþ çalýþma demektir.",
- " En fazla 10 nokta oluþturabilirsiniz. xvar deðiþkenine x koordinatýnda",
- " tablonun en yüksek deðerinden daha büyük bir deðer girmenin ve en düþük",
- " deðerinden daha küçük bir deðer girmenin sonucu tanýmlý deðildir.",
- " Bu komut bir satýrýn saðýndaki en son komut olmalýdýr.",
- "",
- "> A/D ÇEVÝRÝCÝDEN OKUMA Aname",
- " --{READ ADC}--",
- "",
- " LDmicro A/D çeviriciden deðer okumak için gerekli kodlarý desteklediði",
- " iþlemciler için oluþturabilir. Komutun giriþi 1 olduðunda A/D çeviriciden ",
- " deðer okunur ve okunan deðer `Aname' deðiþkenine aktarýlýr. Bu deðiþken",
- " üzerinde genel deðiþkenlerle kullanýlabilen iþlemler kullanýlabilir.",
- " (büyük, küçük, büyük yada eþit gibi). Bu deðiþkene iþlemcinin bacaklarýndan",
- " uygun biri tanýmlanmalýdýr. Komutun giriþi 0 ise `Aname'deðiþkeninde bir",
- " deðiþiklik olmaz.",
- " ",
- " Þu an desteklenen iþlemciler için; 0 Volt için ADC'den okunan deðer 0, ",
- " Vdd (besleme gerilimi) deðerine eþit gerilim deðeri için ADC'den okunan deðer",
- " 1023 olmaktadýr. AVR kullanýyorsanýz AREF ucunu Vdd besleme gerilimine ",
- " baðlayýnýz.",
- " ",
- " Aritmetik iþlemler ADC deðiþkeni için kullanýlabilir. Ayrýca bacak tanýmlarken",
- " ADC olmayan bacaklarýn tanýmlanmasýný LDMicro engelleyecektir.",
- " Bu komut bir satýrýn saðýndaki en son komut olmalýdýr.",
- "",
- " > PWM PALS GENÝÞLÝÐÝ AYARI duty_cycle",
- " -{PWM 32.8 kHz}-",
- "",
- " LDmicro desteklediði mikrokontrolörler için gerekli PWM kodlarýný üretebilir.",
- " Bu komutun giriþi doðru (1) olduðunda PWM sinyalinin pals geniþliði duty_cycle",
- " deðiþkeninin deðerine ayarlanýr. Bu deðer 0 ile 100 arasýnda deðiþir. Pals",
- " geniþliði yüzde olarak ayarlanýr. Bir periyot 100 birim kabul edilirse bu",
- " geniþliðin yüzde kaçýnýn palsi oluþturacaðý ayarlanýr. 0 periyodun tümü sýfýr",
- " 100 ise periyodun tamamý 1 olsun anlamýna gelir. 10 deðeri palsin %10'u 1 geri",
- " kalan %90'ý sýfýr olsun anlamýna gelir.",
- "",
- " PWM frekansýný ayarlayabilirsiniz. Verilen deðer Hz olarak verilir.",
- " Verdiðiniz frekans kesinlikle ayarlanabilir olmalýdýr. LDMicro verdiðiniz deðeri",
- " olabilecek en yakýn deðerle deðiþtirir. Yüksek hýzlarda doðruluk azalýr.",
- " ",
- " Bu komut bir satýrýn saðýndaki en son komut olmalýdýr.",
- " Periyodun süresinin ölçülebilmesi için iþlemcinin zamanlayýcýlarýnýn bir tanesi",
- " kullanýlýr. Bu nedenle PWM en az iki tane zamanlayýcýsý olan iþlemcilerde kullanýlýr.",
- " PWM PIC16 iþlemcilerde CCP2'yi, AVR'lerde ise OC2'yi kullanýr.",
- "",
- "",
- "> EEPROMDA SAKLA saved_var",
- " --{PERSIST}--",
- "",
- " Bu komut ile belirtilen deðiþkenin EEPROM'da saklanmasý gereken bir deðiþken olduðunu",
- " belirmiþ olursunuz. Komutun giriþi doðru ise belirtilen deðiþkenin içeriði EEPROM'a",
- " kaydedilir. Enerji kesildiðinde kaybolmamasý istenen deðerler için bu komut kullanýlýr.",
- " Deðiþkenin içeriði gerilim geldiðinde tekrar EEPROM'dan yüklenir. Ayrýca;",
- " deðiþkenin içeriði her deðiþtiðinde yeni deðer tekrar EEPROM'a kaydedilir.",
- " Ayrýca bir iþlem yapýlmasý gerekmez.",
- " Bu komut bir satýrýn saðýndaki en son komut olmalýdýr.",
- "",
- "************************",
- "> UART (SERÝ BÝLGÝ) AL var",
- " --{UART RECV}--",
- "",
- " LDmicro belirli iþlemciler için gerekli UART kodlarýný üretebilir. AVR iþlemcilerde",
- " sadece UART1 (UART0) deðil) desteklenmektedir. Ýletiþim hýzý (baudrate) ayarlarýný ",
- " Ayarlar->Ýþlemci Ayarlarý menüsünden yapmalýsýnýz. Hýz kristal frekansýna baðlý olup,",
- " bazý hýzlar desteklenmeyebilir. Bu durumda LDMicro sizi uyaracaktýr. ",
- " ",
- " Bu komutun giriþi yanlýþsa herhangi bir iþlem yapýlmaz. Doðru ise UART'dan 1 karakter",
- " alýnmaya çalýþýlýr. Okuma yapýlamaz ise komutun çýkýþý yanlýþ (0) olur. Karakter",
- " okunursa okunan karakter `var' deðiþkeninde saklanýr ve komutun çýkýþý doðru (1) olur.",
- " Çýkýþýn doðru olmasý sadece bir PLC çevrimi sürer.",
- "",
- "",
- "> UART (SERÝ BÝLGÝ) GÖNDER var",
- " --{UART SEND}--",
- "",
- " LDmicro belirli iþlemciler için gerekli UART kodlarýný üretebilir. AVR iþlemcilerde",
- " sadece UART1 (UART0) deðil) desteklenmektedir. Ýletiþim hýzý (baudrate) ayarlarýný ",
- " Ayarlar->Ýþlemci Ayarlarý menüsünden yapmalýsýnýz. Hýz kristal frekansýna baðlý olup,",
- " bazý hýzlar desteklenmeyebilir. Bu durumda LDMicro sizi uyaracaktýr.",
- " ",
- " Bu komutun giriþi yanlýþsa herhangi bir iþlem yapýlmaz. Doðru ise UART'dan 1 karakter",
- " gönderilir. Gönderilecek karakter gönderme iþleminden önce `var' deðiþkeninde saklý",
- " olmalýdýr. Komutun çýkýþý UART meþgulse (bir karakterin gönderildiði sürece)",
- " doðru (1) olur. Aksi halde yanlýþ olur.",
- " Çýkýþýn doðru olmasý sadece bir PLC çevrimi sürer.",
- " ",
- " Karakterin gönderilmesi belirli bir zaman alýr. Bu nedenle baþka bir karakter",
- " göndermeden önce önceki karakterin gönderildiðini kontrol ediniz veya gönderme",
- " iþlemlerinin arasýna geikme ekleyiniz. Komutun giriþini sadece çýkýþ yanlýþ",
- " (UART meþgul deðilse)ise doðru yapýnýz.",
- "",
- " Bu komut yerine biçimlendirilmiþ kelime komutunu (bir sonraki komut) inceleyiniz.",
- " Biçimlendirilmiþ kelime komutunun kullanýmý daha kolaydýr. Ýstediðiniz iþlemleri",
- " daha rahat gerçekleþtirebilirsiniz.",
- "",
- "",
- "> UART ÜZERÝNDEN BÝÇÝMLENDÝRÝLMÝÞ KELÝME var",
- " -{\"Pressure: \\3\\r\\n\"}-",
- "",
- " LDmicro belirli iþlemciler için gerekli UART kodlarýný üretebilir. AVR iþlemcilerde",
- " sadece UART1 (UART0) deðil) desteklenmektedir. Ýletiþim hýzý (baudrate) ayarlarýný ",
- " Ayarlar->Ýþlemci Ayarlarý menüsünden yapmalýsýnýz. Hýz kristal frekansýna baðlý olup,",
- " bazý hýzlar desteklenmeyebilir. Bu durumda LDMicro sizi uyaracaktýr.",
- "",
- " Bu komutun giriþi yanlýþtan doðruya geçerse (yükselen kenar) ise seri port üzerinden",
- " tüm kelimeyi gönderir. Eðer kelime `\\3' özel kodunu içeriyorsa dizi içeriði ",
- " `var' deðiþkenin içeriði otomatik olarak kelimeye (string) çevrilerek`var'",
- " deðiþkeninin içeriði ile deðiþtirilir. Deðiþkenin uzunluðu 3 karakter olacak þekilde",
- " deðiþtirilir. Mesela; `var' deðiþkeninin içeriði 35 ise kelime 35 rakamýnýn baþýna bir",
- " adet boþul eklenerek `Pressure: 35\\r\\n' haline getirilir. Veya `var'deðiþkeninin",
- " içeriði 1453 ise yapýlacak iþlem belli olmaz. Bu durumda `\\4' kullanmak gerekebilir.",
- "",
- " Deðiþken negatif bir sayý olabilecekse `\\-3d' (veya `\\-4d') gibi uygun bir deðer",
- " kullanmalýsýnýz. Bu durumda LDMicro negatif sayýlarýn önüne eksi iþareti, pozitif sayýlarýn",
- " önüne ise bir boþluk karakteri yerleþtirecektir.",
- "",
- " Ayný anda birkaç iþlem tanýmlanýrsa, yada UART ile ilgili iþlemler birbirine",
- " karýþýk hale getirilirse programýn davranýþý belirli olmayacaktýr. Bu nedenle",
- " dikkatli olmalýsýnýz.",
- "",
- " Kullanýlabilecek özel karakterler (escape kodlarý) þunlardýr:",
- " * \\r -- satýr baþýna geç",
- " * \\n -- yeni satýr",
- " * \\f -- kaðýdý ilerlet (formfeed)",
- " * \\b -- bir karakter geri gel (backspace)",
- " * \\xAB -- ASCII karakter kodu 0xAB (hex)",
- "",
- " Bu komutun çýkýþý bilgi gönderiyorken doðru diðer durumlarda yanlýþ olur.",
- " Bu komut program hafýzasýnda çok yer kaplar.",
- "",
- "",
- "MATEMATÝKSEL ÝÞLEMLER ÝLE ÝLGÝLÝ BÝLGÝ",
- "======================================",
- "",
- "Unutmayýn ki, LDMicro 16-bit tamsayý matematik komutlarýna sahiptir.",
- "Bu iþlemlerde kullanýlan deðerler ve hesaplamanýn sonucu -32768 ile",
- "32767 arasýnda bir tamsayý olabilir.",
- "",
- "Mesela y = (1/x)*1200 formülünü hesaplamaya çalýþalým. x 1 ile 20",
- "arasýnda bir sayýdýr. Bu durumda y 1200 ile 60 arasýnda olur. Bu sayý",
- "16-bit bir tamsayý sýnýrlarý içindedir. Ladder diyagramýmýzý yazalým.",
- "Önce bölelim, sonra çarpma iþlemini yapalým:",
- "",
- " || {DIV temp :=} ||",
- " ||---------{ 1 / x }----------||",
- " || ||",
- " || {MUL y := } ||",
- " ||----------{ temp * 1200}----------||",
- " || ||",
- "",
- "Yada bölmeyi doðrudan yapalým:",
- "",
- " || {DIV y :=} ||",
- " ||-----------{ 1200 / x }-----------||",
- "",
- "Matematiksel olarak iki iþlem aynýd sonucu vermelidir. Ama birinci iþlem",
- "yanlýþ sonuç verecektir. (y=0 olur). Bu hata `temp' deðiþkeninin 1'den",
- "küçük sonuç vermesindendir.Mesela x = 3 iken (1 / x) = 0.333 olur. Ama",
- "0.333 bir tamsayý deðildir. Bu nedenle sonuç 0 olur. Ýkinci adýmda ise",
- "y = temp * 1200 = 0 olur. Ýkinci þekilde ise bölen bir tamsayý olduðundan",
- "sonuç doðru çýkacaktýr.",
- "",
- "Ýþlemlerinizde bir sorun varsa dikkatle kontrol ediniz. Ayrýca sonucun",
- "baþa dönmemesine de dikkat ediniz. Mesela 32767 + 1 = -32768 olur.",
- "32767 sýnýrý aþýlmýþ olacaktýr. ",
- "",
- "Hesaplamalarýnýzda mantýksal deðiþimler yaparak doðru sonuçlar elde edebilirsiniz.",
- "Örneðin; y = 1.8*x ise formülünüzü y = (9/5)*x þeklinde yazýnýz.(1.8 = 9/5)",
- "y = (9*x)/5 þeklindeki bir kod sonucu daha tutarlý hale getirecektir.",
- "performing the multiplication first:",
- "",
- " || {MUL temp :=} ||",
- " ||---------{ x * 9 }----------||",
- " || ||",
- " || {DIV y :=} ||",
- " ||-----------{ temp / 5 }-----------||",
- "",
- "",
- "KODALAMA ÞEKLÝ",
- "==============",
- "",
- "Programýn saðladýðý kolaylýklardan faydalanýn. Mesela:",
- "",
- " || Xa Ya ||",
- " 1 ||-------] [--------------( )-------||",
- " || ||",
- " || Xb Yb ||",
- " ||-------] [------+-------( )-------||",
- " || | ||",
- " || | Yc ||",
- " || +-------( )-------||",
- " || ||",
- "",
- "yazmak aþaðýdakinden daha kolay olacaktýr.",
- "",
- " || Xa Ya ||",
- " 1 ||-------] [--------------( )-------||",
- " || ||",
- " || ||",
- " || ||",
- " || ||",
- " || Xb Yb ||",
- " 2 ||-------] [--------------( )-------||",
- " || ||",
- " || ||",
- " || ||",
- " || ||",
- " || Xb Yc ||",
- " 3 ||-------] [--------------( )-------||",
- " || ||",
- "",
- " * * *",
- "",
- "Yazdýðýnýz kodlarýn sonuçlarýna dikkat ediniz. Aþaðýdaki satýrlarda",
- "mantýksýz bir programlama yapýlmýþtýr. Çünkü hem Xa hemde Xb ayný",
- "anda doðru olabilir.",
- "",
- " || Xa {v := } ||",
- " 1 ||-------] [--------{ 12 MOV}--||",
- " || ||",
- " || Xb {v := } ||",
- " ||-------] [--------{ 23 MOV}--||",
- " || ||",
- " || ||",
- " || ||",
- " || ||",
- " || [v >] Yc ||",
- " 2 ||------[ 15]-------------( )-------||",
- " || ||",
- "",
- "Aþaðýdaki satýrlar yukarda bahsi geçen tarzdadýr. Ancak yapýlan",
- "iþlem 4-bit binary sayý tamsayýya çevrilmektedir.",
- "",
- " || {v := } ||",
- " 3 ||-----------------------------------{ 0 MOV}--||",
- " || ||",
- " || Xb0 {ADD v :=} ||",
- " ||-------] [------------------{ v + 1 }-----------||",
- " || ||",
- " || Xb1 {ADD v :=} ||",
- " ||-------] [------------------{ v + 2 }-----------||",
- " || ||",
- " || Xb2 {ADD v :=} ||",
- " ||-------] [------------------{ v + 4 }-----------||",
- " || ||",
- " || Xb3 {ADD v :=} ||",
- " ||-------] [------------------{ v + 8 }-----------||",
- " || ||",
- "",
- "",
- "HATALAR (BUG)",
- "=============",
- "",
- "LDmicro tarafýndan üretilen kodlar çok verimli kodlar deðildir. Yavaþ çalýþan",
- "ve hafýzada fazla yer kaplayan kodlar olabilirler. Buna raðmen orta büyüklükte",
- "bir PIC veya AVR küçük bir PLC'nin yaptýðý iþi yapar. Bu nedenle diðer sorunlar",
- "yer yer gözardý edlebilir.",
- "",
- "Deðiþken isimleri çok uzun olmamalýdýr. ",
- "",
- "Programýnýz yada kullandýðýnýz hafýza seçtiðiniz iþlemcinin sahip olduðundan",
- "büyükse LDMicro hata vermeyebilir. Dikkat etmezseniz programýnýz hatalý çalýþacaktýr.",
- "",
- "Bulduðunuz hatalarý yazara bildiriniz.",
- "",
- "Teþekkürler:",
- " * Marcelo Solano, Windows 98'deki UI problemini bildirdiði için,",
- " * Serge V. Polubarjev, PIC16F628 iþlemcisi seçildiðinde RA3:0'ýn çalýþmadýðý",
- " ve nasýl düzelteceðimi bildirdiði için,",
- " * Maxim Ibragimov, ATmega16 ve ATmega162 iþlemcileri test ettikleri, problemleri",
- " bulduklarý ve bildirdikleri için,",
- " * Bill Kishonti, sýfýra bölüm hatasý olduðunda simülasyonun çöktüðünü bildirdikleri",
- " için,",
- " * Mohamed Tayae, PIC16F628 iþlemcisinde EEPROM'da saklanmasý gereken deðiþkenlerin",
- " aslýnda saklanmadýðýný bildirdiði için,",
- " * David Rothwell, kullanýcý arayüzündeki birkaç problemi ve \"Metin Dosyasý Olarak Kaydet\"",
- " fonksiyonundaki problemi bildirdiði için.",
- "",
- "",
- "KOPYALAMA VE KULLANIM ÞARTLARI",
- "==============================",
- "",
- "LDMICRO TARAFINDAN ÜRETÝLEN KODU ÝNSAN HAYATI VE ÝNSAN HAYATINI ETKÝLEYEBÝLECEK",
- "PROJELERDE KULLANMAYINIZ. LDMICRO PROGRAMCISI LDMICRO'NUN KENDÝNDEN VE LDMICRO",
- "ÝLE ÜRETÝLEN KODDAN KAYNAKLANAN HÝÇBÝR PROBLEM ÝÇÝN SORUMLULUK KABUL ETMEMEKTEDÝR.",
- "",
- "Bu program ücretsiz bir program olup, dilediðiniz gibi daðýtabilirsiniz,",
- "kaynak kodda deðiþiklik yapabilirsiniz. Programýn kullanýmý Free Software Foundation",
- "tarafýndan yazýlan GNU General Public License (version 3 ve sonrasý)þartlarýna baðlýdýr.",
- "",
- "Program faydalý olmasý ümidiyle daðýtýlmýþtýr. Ancak hiçbir garanti verilmemektedir.",
- "Detaylar için GNU General Public License içeriðine bakýnýz.",
- "",
- "Söz konusu sözleþmenin bir kopyasý bu programla beraber gelmiþ olmasý gerekmektedir.",
- "Gelmediyse <http://www.gnu.org/licenses/> adresinde bulabilirsiniz.",
- "",
- "",
- "Jonathan Westhues",
- "",
- "Rijswijk -- Dec 2004",
- "Waterloo ON -- Jun, Jul 2005",
- "Cambridge MA -- Sep, Dec 2005",
- " Feb, Mar 2006",
- " Feb 2007",
- "",
- "Email: user jwesthues, at host cq.cx",
- "",
- "Türkçe Versiyon : <http://tekelektirik.com/public/ldmicro.rar>",
- NULL
-};
-#endif
-
-#if defined(LDLANG_EN) || defined(LDLANG_ES) || defined(LDLANG_IT) || defined(LDLANG_PT)
-char *HelpText[] = {
- "",
- "INTRODUCTION",
- "============",
- "",
- "LDmicro generates native code for certain Microchip PIC16 and Atmel AVR",
- "microcontrollers. Usually software for these microcontrollers is written",
- "in a programming language like assembler, C, or BASIC. A program in one",
- "of these languages comprises a list of statements. These languages are",
- "powerful and well-suited to the architecture of the processor, which",
- "internally executes a list of instructions.",
- "",
- "PLCs, on the other hand, are often programmed in `ladder logic.' A simple",
- "program might look like this:",
- "",
- " || ||",
- " || Xbutton1 Tdon Rchatter Yred ||",
- " 1 ||-------]/[---------[TON 1.000 s]-+-------]/[--------------( )-------||",
- " || | ||",
- " || Xbutton2 Tdof | ||",
- " ||-------]/[---------[TOF 2.000 s]-+ ||",
- " || ||",
- " || ||",
- " || ||",
- " || Rchatter Ton Tnew Rchatter ||",
- " 2 ||-------]/[---------[TON 1.000 s]----[TOF 1.000 s]---------( )-------||",
- " || ||",
- " || ||",
- " || ||",
- " ||------[END]---------------------------------------------------------||",
- " || ||",
- " || ||",
- "",
- "(TON is a turn-on delay; TOF is a turn-off delay. The --] [-- statements",
- "are inputs, which behave sort of like the contacts on a relay. The",
- "--( )-- statements are outputs, which behave sort of like the coil of a",
- "relay. Many good references for ladder logic are available on the Internet",
- "and elsewhere; details specific to this implementation are given below.)",
- "",
- "A number of differences are apparent:",
- "",
- " * The program is presented in graphical format, not as a textual list",
- " of statements. Many people will initially find this easier to",
- " understand.",
- "",
- " * At the most basic level, programs look like circuit diagrams, with",
- " relay contacts (inputs) and coils (outputs). This is intuitive to",
- " programmers with knowledge of electric circuit theory.",
- "",
- " * The ladder logic compiler takes care of what gets calculated",
- " where. You do not have to write code to determine when the outputs",
- " have to get recalculated based on a change in the inputs or a",
- " timer event, and you do not have to specify the order in which",
- " these calculations must take place; the PLC tools do that for you.",
- "",
- "LDmicro compiles ladder logic to PIC16 or AVR code. The following",
- "processors are supported:",
- " * PIC16F877",
- " * PIC16F628",
- " * PIC16F876 (untested)",
- " * PIC16F88 (untested)",
- " * PIC16F819 (untested)",
- " * PIC16F887 (untested)",
- " * PIC16F886 (untested)",
- " * ATmega128",
- " * ATmega64",
- " * ATmega162 (untested)",
- " * ATmega32 (untested)",
- " * ATmega16 (untested)",
- " * ATmega8 (untested)",
- "",
- "It would be easy to support more AVR or PIC16 chips, but I do not have",
- "any way to test them. If you need one in particular then contact me and",
- "I will see what I can do.",
- "",
- "Using LDmicro, you can draw a ladder diagram for your program. You can",
- "simulate the logic in real time on your PC. Then when you are convinced",
- "that it is correct you can assign pins on the microcontroller to the",
- "program inputs and outputs. Once you have assigned the pins, you can",
- "compile PIC or AVR code for your program. The compiler output is a .hex",
- "file that you can program into your microcontroller using any PIC/AVR",
- "programmer.",
- "",
- "LDmicro is designed to be somewhat similar to most commercial PLC",
- "programming systems. There are some exceptions, and a lot of things",
- "aren't standard in industry anyways. Carefully read the description",
- "of each instruction, even if it looks familiar. This document assumes",
- "basic knowledge of ladder logic and of the structure of PLC software",
- "(the execution cycle: read inputs, compute, write outputs).",
- "",
- "",
- "ADDITIONAL TARGETS",
- "==================",
- "",
- "It is also possible to generate ANSI C code. You could use this with any",
- "processor for which you have a C compiler, but you are responsible for",
- "supplying the runtime. That means that LDmicro just generates source",
- "for a function PlcCycle(). You are responsible for calling PlcCycle",
- "every cycle time, and you are responsible for implementing all the I/O",
- "(read/write digital input, etc.) functions that the PlcCycle() calls. See",
- "the comments in the generated source for more details.",
- "",
- "Finally, LDmicro can generate processor-independent bytecode for a",
- "virtual machine designed to run ladder logic code. I have provided a",
- "sample implementation of the interpreter/VM, written in fairly portable",
- "C. This target will work for just about any platform, as long as you",
- "can supply your own VM. This might be useful for applications where you",
- "wish to use ladder logic as a `scripting language' to customize a larger",
- "program. See the comments in the sample interpreter for details.",
- "",
- "",
- "COMMAND LINE OPTIONS",
- "====================",
- "",
- "ldmicro.exe is typically run with no command line options. That means",
- "that you can just make a shortcut to the program, or save it to your",
- "desktop and double-click the icon when you want to run it, and then you",
- "can do everything from within the GUI.",
- "",
- "If LDmicro is passed a single filename on the command line",
- "(e.g. `ldmicro.exe asd.ld'), then LDmicro will try to open `asd.ld',",
- "if it exists. An error is produced if `asd.ld' does not exist. This",
- "means that you can associate ldmicro.exe with .ld files, so that it runs",
- "automatically when you double-click a .ld file.",
- "",
- "If LDmicro is passed command line arguments in the form",
- "`ldmicro.exe /c src.ld dest.hex', then it tries to compile `src.ld',",
- "and save the output as `dest.hex'. LDmicro exits after compiling,",
- "whether the compile was successful or not. Any messages are printed",
- "to the console. This mode is useful only when running LDmicro from the",
- "command line.",
- "",
- "",
- "BASICS",
- "======",
- "",
- "If you run LDmicro with no arguments then it starts with an empty",
- "program. If you run LDmicro with the name of a ladder program (xxx.ld)",
- "on the command line then it will try to load that program at startup.",
- "LDmicro uses its own internal format for the program; it cannot import",
- "logic from any other tool.",
- "",
- "If you did not load an existing program then you will be given a program",
- "with one empty rung. You could add an instruction to it; for example",
- "you could add a set of contacts (Instruction -> Insert Contacts) named",
- "`Xnew'. `X' means that the contacts will be tied to an input pin on the",
- "microcontroller. You could assign a pin to it later, after choosing a",
- "microcontroller and renaming the contacts. The first letter of a name",
- "indicates what kind of object it is. For example:",
- "",
- " * Xname -- tied to an input pin on the microcontroller",
- " * Yname -- tied to an output pin on the microcontroller",
- " * Rname -- `internal relay': a bit in memory",
- " * Tname -- a timer; turn-on delay, turn-off delay, or retentive",
- " * Cname -- a counter, either count-up or count-down",
- " * Aname -- an integer read from an A/D converter",
- " * name -- a general-purpose (integer) variable",
- "",
- "Choose the rest of the name so that it describes what the object does,",
- "and so that it is unique within the program. The same name always refers",
- "to the same object within the program. For example, it would be an error",
- "to have a turn-on delay (TON) called `Tdelay' and a turn-off delay (TOF)",
- "called `Tdelay' in the same program, since each counter needs its own",
- "memory. On the other hand, it would be correct to have a retentive timer",
- "(RTO) called `Tdelay' and a reset instruction (RES) associated with",
- "`Tdelay', since it that case you want both instructions to work with",
- "the same timer.",
- "",
- "Variable names can consist of letters, numbers, and underscores",
- "(_). A variable name must not start with a number. Variable names are",
- "case-sensitive.",
- "",
- "The general variable instructions (MOV, ADD, EQU, etc.) can work on",
- "variables with any name. This means that they can access timer and",
- "counter accumulators. This may sometimes be useful; for example, you",
- "could check if the count of a timer is in a particular range.",
- "",
- "Variables are always 16 bit integers. This means that they can go",
- "from -32768 to 32767. Variables are always treated as signed. You can",
- "specify literals as normal decimal numbers (0, 1234, -56). You can also",
- "specify ASCII character values ('A', 'z') by putting the character in",
- "single-quotes. You can use an ASCII character code in most places that",
- "you could use a decimal number.",
- "",
- "At the bottom of the screen you will see a list of all the objects in",
- "the program. This list is automatically generated from the program;",
- "there is no need to keep it up to date by hand. Most objects do not",
- "need any configuration. `Xname', `Yname', and `Aname' objects must be",
- "assigned to a pin on the microcontroller, however. First choose which",
- "microcontroller you are using (Settings -> Microcontroller). Then assign",
- "your I/O pins by double-clicking them on the list.",
- "",
- "You can modify the program by inserting or deleting instructions. The",
- "cursor in the program display blinks to indicate the currently selected",
- "instruction and the current insertion point. If it is not blinking then",
- "press <Tab> or click on an instruction. Now you can delete the current",
- "instruction, or you can insert a new instruction to the right or left",
- "(in series with) or above or below (in parallel with) the selected",
- "instruction. Some operations are not allowed. For example, no instructions",
- "are allowed to the right of a coil.",
- "",
- "The program starts with just one rung. You can add more rungs by selecting",
- "Insert Rung Before/After in the Logic menu. You could get the same effect",
- "by placing many complicated subcircuits in parallel within one rung,",
- "but it is more clear to use multiple rungs.",
- "",
- "Once you have written a program, you can test it in simulation, and then",
- "you can compile it to a HEX file for the target microcontroller.",
- "",
- "",
- "SIMULATION",
- "==========",
- "",
- "To enter simulation mode, choose Simulate -> Simulation Mode or press",
- "<Ctrl+M>. The program is shown differently in simulation mode. There is",
- "no longer a cursor. The instructions that are energized show up bright",
- "red; the instructions that are not appear greyed. Press the space bar to",
- "run the PLC one cycle. To cycle continuously in real time, choose",
- "Simulate -> Start Real-Time Simulation, or press <Ctrl+R>. The display of",
- "the program will be updated in real time as the program state changes.",
- "",
- "You can set the state of the inputs to the program by double-clicking",
- "them in the list at the bottom of the screen, or by double-clicking an",
- "`Xname' contacts instruction in the program. If you change the state of",
- "an input pin then that change will not be reflected in how the program",
- "is displayed until the PLC cycles; this will happen automatically if",
- "you are running a real time simulation, or when you press the space bar.",
- "",
- "",
- "COMPILING TO NATIVE CODE",
- "========================",
- "",
- "Ultimately the point is to generate a .hex file that you can program",
- "into your microcontroller. First you must select the part number of the",
- "microcontroller, under the Settings -> Microcontroller menu. Then you",
- "must assign an I/O pin to each `Xname' or `Yname' object. Do this by",
- "double-clicking the object name in the list at the bottom of the screen.",
- "A dialog will pop up where you can choose an unallocated pin from a list.",
- "",
- "Then you must choose the cycle time that you will run with, and you must",
- "tell the compiler what clock speed the micro will be running at. These",
- "are set under the Settings -> MCU Parameters... menu. In general you",
- "should not need to change the cycle time; 10 ms is a good value for most",
- "applications. Type in the frequency of the crystal that you will use",
- "with the microcontroller (or the ceramic resonator, etc.) and click okay.",
- "",
- "Now you can generate code from your program. Choose Compile -> Compile,",
- "or Compile -> Compile As... if you have previously compiled this program",
- "and you want to specify a different output file name. If there are no",
- "errors then LDmicro will generate an Intel IHEX file ready for",
- "programming into your chip.",
- "",
- "Use whatever programming software and hardware you have to load the hex",
- "file into the microcontroller. Remember to set the configuration bits",
- "(fuses)! For PIC16 processors, the configuration bits are included in the",
- "hex file, and most programming software will look there automatically.",
- "For AVR processors you must set the configuration bits by hand.",
- "",
- "",
- "INSTRUCTIONS REFERENCE",
- "======================",
- "",
- "> CONTACT, NORMALLY OPEN Xname Rname Yname",
- " ----] [---- ----] [---- ----] [----",
- "",
- " If the signal going into the instruction is false, then the output",
- " signal is false. If the signal going into the instruction is true,",
- " then the output signal is true if and only if the given input pin,",
- " output pin, or internal relay is true, else it is false. This",
- " instruction can examine the state of an input pin, an output pin,",
- " or an internal relay.",
- "",
- "",
- "> CONTACT, NORMALLY CLOSED Xname Rname Yname",
- " ----]/[---- ----]/[---- ----]/[----",
- "",
- " If the signal going into the instruction is false, then the output",
- " signal is false. If the signal going into the instruction is true,",
- " then the output signal is true if and only if the given input pin,",
- " output pin, or internal relay is false, else it is false. This",
- " instruction can examine the state of an input pin, an output pin,",
- " or an internal relay. This is the opposite of a normally open contact.",
- "",
- "",
- "> COIL, NORMAL Rname Yname",
- " ----( )---- ----( )----",
- "",
- " If the signal going into the instruction is false, then the given",
- " internal relay or output pin is cleared false. If the signal going",
- " into this instruction is true, then the given internal relay or output",
- " pin is set true. It is not meaningful to assign an input variable to a",
- " coil. This instruction must be the rightmost instruction in its rung.",
- "",
- "",
- "> COIL, NEGATED Rname Yname",
- " ----(/)---- ----(/)----",
- "",
- " If the signal going into the instruction is true, then the given",
- " internal relay or output pin is cleared false. If the signal going",
- " into this instruction is false, then the given internal relay or",
- " output pin is set true. It is not meaningful to assign an input",
- " variable to a coil. This is the opposite of a normal coil. This",
- " instruction must be the rightmost instruction in its rung.",
- "",
- "",
- "> COIL, SET-ONLY Rname Yname",
- " ----(S)---- ----(S)----",
- "",
- " If the signal going into the instruction is true, then the given",
- " internal relay or output pin is set true. Otherwise the internal",
- " relay or output pin state is not changed. This instruction can only",
- " change the state of a coil from false to true, so it is typically",
- " used in combination with a reset-only coil. This instruction must",
- " be the rightmost instruction in its rung.",
- "",
- "",
- "> COIL, RESET-ONLY Rname Yname",
- " ----(R)---- ----(R)----",
- "",
- " If the signal going into the instruction is true, then the given",
- " internal relay or output pin is cleared false. Otherwise the",
- " internal relay or output pin state is not changed. This instruction",
- " instruction can only change the state of a coil from true to false,",
- " so it is typically used in combination with a set-only coil. This",
- " instruction must be the rightmost instruction in its rung.",
- "",
- "",
- "> TURN-ON DELAY Tdon ",
- " -[TON 1.000 s]-",
- "",
- " When the signal going into the instruction goes from false to true,",
- " the output signal stays false for 1.000 s before going true. When the",
- " signal going into the instruction goes from true to false, the output",
- " signal goes false immediately. The timer is reset every time the input",
- " goes false; the input must stay true for 1000 consecutive milliseconds",
- " before the output will go true. The delay is configurable.",
- "",
- " The `Tname' variable counts up from zero in units of scan times. The",
- " TON instruction outputs true when the counter variable is greater",
- " than or equal to the given delay. It is possible to manipulate the",
- " counter variable elsewhere, for example with a MOV instruction.",
- "",
- "",
- "> TURN-OFF DELAY Tdoff ",
- " -[TOF 1.000 s]-",
- "",
- " When the signal going into the instruction goes from true to false,",
- " the output signal stays true for 1.000 s before going false. When",
- " the signal going into the instruction goes from false to true,",
- " the output signal goes true immediately. The timer is reset every",
- " time the input goes false; the input must stay false for 1000",
- " consecutive milliseconds before the output will go false. The delay",
- " is configurable.",
- "",
- " The `Tname' variable counts up from zero in units of scan times. The",
- " TON instruction outputs true when the counter variable is greater",
- " than or equal to the given delay. It is possible to manipulate the",
- " counter variable elsewhere, for example with a MOV instruction.",
- "",
- "",
- "> RETENTIVE TIMER Trto ",
- " -[RTO 1.000 s]-",
- "",
- " This instruction keeps track of how long its input has been true. If",
- " its input has been true for at least 1.000 s, then the output is",
- " true. Otherwise the output is false. The input need not have been",
- " true for 1000 consecutive milliseconds; if the input goes true",
- " for 0.6 s, then false for 2.0 s, and then true for 0.4 s, then the",
- " output will go true. After the output goes true it will stay true",
- " even after the input goes false, as long as the input has been true",
- " for longer than 1.000 s. This timer must therefore be reset manually,",
- " using the reset instruction.",
- "",
- " The `Tname' variable counts up from zero in units of scan times. The",
- " TON instruction outputs true when the counter variable is greater",
- " than or equal to the given delay. It is possible to manipulate the",
- " counter variable elsewhere, for example with a MOV instruction.",
- "",
- "",
- "> RESET Trto Citems",
- " ----{RES}---- ----{RES}----",
- "",
- " This instruction resets a timer or a counter. TON and TOF timers are",
- " automatically reset when their input goes false or true, so RES is",
- " not required for these timers. RTO timers and CTU/CTD counters are",
- " not reset automatically, so they must be reset by hand using a RES",
- " instruction. When the input is true, the counter or timer is reset;",
- " when the input is false, no action is taken. This instruction must",
- " be the rightmost instruction in its rung.",
- "",
- "",
- "> ONE-SHOT RISING _",
- " --[OSR_/ ]--",
- "",
- " This instruction normally outputs false. If the instruction's input",
- " is true during this scan and it was false during the previous scan",
- " then the output is true. It therefore generates a pulse one scan",
- " wide on each rising edge of its input signal. This instruction is",
- " useful if you want to trigger events off the rising edge of a signal.",
- "",
- "",
- "> ONE-SHOT FALLING _",
- " --[OSF \\_]--",
- "",
- " This instruction normally outputs false. If the instruction's input",
- " is false during this scan and it was true during the previous scan",
- " then the output is true. It therefore generates a pulse one scan",
- " wide on each falling edge of its input signal. This instruction is",
- " useful if you want to trigger events off the falling edge of a signal.",
- "",
- "",
- "> SHORT CIRCUIT, OPEN CIRCUIT",
- " ----+----+---- ----+ +----",
- "",
- " The output condition of a short-circuit is always equal to its",
- " input condition. The output condition of an open-circuit is always",
- " false. These are mostly useful for debugging.",
- "",
- "",
- "> MASTER CONTROL RELAY",
- " -{MASTER RLY}-",
- "",
- " By default, the rung-in condition of every rung is true. If a master",
- " control relay instruction is executed with a rung-in condition of",
- " false, then the rung-in condition for all following rungs becomes",
- " false. This will continue until the next master control relay",
- " instruction is reached (regardless of the rung-in condition of that",
- " instruction). These instructions must therefore be used in pairs:",
- " one to (maybe conditionally) start the possibly-disabled section,",
- " and one to end it.",
- "",
- "",
- "> MOVE {destvar := } {Tret := }",
- " -{ 123 MOV}- -{ srcvar MOV}-",
- "",
- " When the input to this instruction is true, it sets the given",
- " destination variable equal to the given source variable or",
- " constant. When the input to this instruction is false nothing",
- " happens. You can assign to any variable with the move instruction;",
- " this includes timer and counter state variables, which can be",
- " distinguished by the leading `T' or `C'. For example, an instruction",
- " moving 0 into `Tretentive' is equivalent to a reset (RES) instruction",
- " for that timer. This instruction must be the rightmost instruction",
- " in its rung.",
- "",
- "",
- "> ARITHMETIC OPERATION {ADD kay :=} {SUB Ccnt :=}",
- " -{ 'a' + 10 }- -{ Ccnt - 10 }-",
- "",
- "> {MUL dest :=} {DIV dv := }",
- " -{ var * -990 }- -{ dv / -10000}-",
- "",
- " When the input to this instruction is true, it sets the given",
- " destination variable equal to the given expression. The operands",
- " can be either variables (including timer and counter variables)",
- " or constants. These instructions use 16 bit signed math. Remember",
- " that the result is evaluated every cycle when the input condition",
- " true. If you are incrementing or decrementing a variable (i.e. if",
- " the destination variable is also one of the operands) then you",
- " probably don't want that; typically you would use a one-shot so that",
- " it is evaluated only on the rising or falling edge of the input",
- " condition. Divide truncates; 8 / 3 = 2. This instruction must be",
- " the rightmost instruction in its rung.",
- "",
- "",
- "> COMPARE [var ==] [var >] [1 >=]",
- " -[ var2 ]- -[ 1 ]- -[ Ton]-",
- "",
- "> [var /=] [-4 < ] [1 <=]",
- " -[ var2 ]- -[ vartwo]- -[ Cup]-",
- "",
- " If the input to this instruction is false then the output is false. If",
- " the input is true then the output is true if and only if the given",
- " condition is true. This instruction can be used to compare (equals,",
- " is greater than, is greater than or equal to, does not equal,",
- " is less than, is less than or equal to) a variable to a variable,",
- " or to compare a variable to a 16-bit signed constant.",
- "",
- "",
- "> COUNTER Cname Cname",
- " --[CTU >=5]-- --[CTD >=5]--",
- "",
- " A counter increments (CTU, count up) or decrements (CTD, count",
- " down) the associated count on every rising edge of the rung input",
- " condition (i.e. what the rung input condition goes from false to",
- " true). The output condition from the counter is true if the counter",
- " variable is greater than or equal to 5, and false otherwise. The",
- " rung output condition may be true even if the input condition is",
- " false; it only depends on the counter variable. You can have CTU",
- " and CTD instructions with the same name, in order to increment and",
- " decrement the same counter. The RES instruction can reset a counter,",
- " or you can perform general variable operations on the count variable.",
- "",
- "",
- "> CIRCULAR COUNTER Cname",
- " --{CTC 0:7}--",
- "",
- " A circular counter works like a normal CTU counter, except that",
- " after reaching its upper limit, it resets its counter variable",
- " back to 0. For example, the counter shown above would count 0, 1,",
- " 2, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 2,.... This is useful in",
- " combination with conditional statements on the variable `Cname';",
- " you can use this like a sequencer. CTC counters clock on the rising",
- " edge of the rung input condition condition. This instruction must",
- " be the rightmost instruction in its rung.",
- "",
- "",
- "> SHIFT REGISTER {SHIFT REG }",
- " -{ reg0..3 }-",
- "",
- " A shift register is associated with a set of variables. For example,",
- " this shift register is associated with the variables `reg0', `reg1',",
- " `reg2', and `reg3'. The input to the shift register is `reg0'. On",
- " every rising edge of the rung-in condition, the shift register will",
- " shift right. That means that it assigns `reg3 := reg2', `reg2 :=",
- " reg1'. and `reg1 := reg0'. `reg0' is left unchanged. A large shift",
- " register can easily consume a lot of memory. This instruction must",
- " be the rightmost instruction in its rung.",
- "",
- "",
- "> LOOK-UP TABLE {dest := }",
- " -{ LUT[i] }-",
- "",
- " A look-up table is an ordered set of n values. When the rung-in",
- " condition is true, the integer variable `dest' is set equal to the",
- " entry in the lookup table corresponding to the integer variable",
- " `i'. The index starts from zero, so `i' must be between 0 and",
- " (n-1). The behaviour of this instruction is not defined if the",
- " index is outside this range. This instruction must be the rightmost",
- " instruction in its rung.",
- "",
- "",
- "> PIECEWISE LINEAR TABLE {yvar := }",
- " -{ PWL[xvar] }-",
- "",
- " This is a good way to approximate a complicated function or",
- " curve. It might, for example, be useful if you are trying to apply",
- " a calibration curve to convert a raw output voltage from a sensor",
- " into more convenient units.",
- "",
- " Assume that you are trying to approximate a function that converts",
- " an integer input variable, x, to an integer output variable, y. You",
- " know the function at several points; for example, you might know that",
- "",
- " f(0) = 2",
- " f(5) = 10",
- " f(10) = 50",
- " f(100) = 100",
- "",
- " This means that the points",
- "",
- " (x0, y0) = ( 0, 2)",
- " (x1, y1) = ( 5, 10)",
- " (x2, y2) = ( 10, 50)",
- " (x3, y3) = (100, 100)",
- "",
- " lie on that curve. You can enter those 4 points into a table",
- " associated with the piecewise linear instruction. The piecewise linear",
- " instruction will look at the value of xvar, and set the value of",
- " yvar. It will set yvar in such a way that the piecewise linear curve",
- " will pass through all of the points that you give it; for example,",
- " if you set xvar = 10, then the instruction will set yvar = 50.",
- "",
- " If you give the instruction a value of xvar that lies between two",
- " of the values of x for which you have given it points, then the",
- " instruction will set yvar so that (xvar, yvar) lies on the straight",
- " line connecting those two points in the table. For example, xvar =",
- " 55 gives an output of yvar = 75. (The two points in the table are",
- " (10, 50) and (100, 100). 55 is half-way between 10 and 100, and 75",
- " is half-way between 50 and 100, so (55, 75) lies on the line that",
- " connects those two points.)",
- "",
- " The points must be specified in ascending order by x coordinate. It",
- " may not be possible to perform mathematical operations required for",
- " certain look-up tables using 16-bit integer math; if this is the",
- " case, then LDmicro will warn you. For example, this look up table",
- " will produce an error:",
- "",
- " (x0, y0) = ( 0, 0)",
- " (x1, y1) = (300, 300)",
- "",
- " You can fix these errors by making the distance between points in",
- " the table smaller. For example, this table is equivalent to the one",
- " given above, and it does not produce an error:",
- "",
- " (x0, y0) = ( 0, 0)",
- " (x1, y1) = (150, 150)",
- " (x2, y2) = (300, 300)",
- "",
- " It should hardly ever be necessary to use more than five or six",
- " points. Adding more points makes your code larger and slower to",
- " execute. The behaviour if you pass a value of `xvar' greater than",
- " the greatest x coordinate in the table or less than the smallest x",
- " coordinate in the table is undefined. This instruction must be the",
- " rightmost instruction in its rung.",
- "",
- "",
- "> A/D CONVERTER READ Aname",
- " --{READ ADC}--",
- "",
- " LDmicro can generate code to use the A/D converters built in to",
- " certain microcontrollers. If the input condition to this instruction",
- " is true, then a single sample from the A/D converter is acquired and",
- " stored in the variable `Aname'. This variable can subsequently be",
- " manipulated with general variable operations (less than, greater than,",
- " arithmetic, and so on). Assign a pin to the `Axxx' variable in the",
- " same way that you would assign a pin to a digital input or output,",
- " by double-clicking it in the list at the bottom of the screen. If",
- " the input condition to this rung is false then the variable `Aname'",
- " is left unchanged.",
- "",
- " For all currently-supported devices, 0 volts input corresponds to",
- " an ADC reading of 0, and an input equal to Vdd (the supply voltage)",
- " corresponds to an ADC reading of 1023. If you are using an AVR, then",
- " connect AREF to Vdd. You can use arithmetic operations to scale the",
- " reading to more convenient units afterwards, but remember that you",
- " are using integer math. In general not all pins will be available",
- " for use with the A/D converter. The software will not allow you to",
- " assign non-A/D pins to an analog input. This instruction must be",
- " the rightmost instruction in its rung.",
- "",
- "",
- "> SET PWM DUTY CYCLE duty_cycle",
- " -{PWM 32.8 kHz}-",
- "",
- " LDmicro can generate code to use the PWM peripheral built in to",
- " certain microcontrollers. If the input condition to this instruction",
- " is true, then the duty cycle of the PWM peripheral is set to the",
- " value of the variable duty_cycle. The duty cycle must be a number",
- " between 0 and 100; 0 corresponds to always low, and 100 corresponds to",
- " always high. (If you are familiar with how the PWM peripheral works,",
- " then notice that that means that LDmicro automatically scales the",
- " duty cycle variable from percent to PWM clock periods.)",
- "",
- " You can specify the target PWM frequency, in Hz. The frequency that",
- " you specify might not be exactly achievable, depending on how it",
- " divides into the microcontroller's clock frequency. LDmicro will",
- " choose the closest achievable frequency; if the error is large then",
- " it will warn you. Faster speeds may sacrifice resolution.",
- "",
- " This instruction must be the rightmost instruction in its rung.",
- " The ladder logic runtime consumes one timer to measure the cycle",
- " time. That means that PWM is only available on microcontrollers",
- " with at least two suitable timers. PWM uses pin CCP2 (not CCP1)",
- " on PIC16 chips and OC2 (not OC1A) on AVRs.",
- "",
- "",
- "> MAKE PERSISTENT saved_var",
- " --{PERSIST}--",
- "",
- " When the rung-in condition of this instruction is true, it causes the",
- " specified integer variable to be automatically saved to EEPROM. That",
- " means that its value will persist, even when the micro loses",
- " power. There is no need to explicitly save the variable to EEPROM;",
- " that will happen automatically, whenever the variable changes. The",
- " variable is automatically loaded from EEPROM after power-on reset. If",
- " a variable that changes frequently is made persistent, then the",
- " EEPROM in your micro may wear out very quickly, because it is only",
- " good for a limited (~100 000) number of writes. When the rung-in",
- " condition is false, nothing happens. This instruction must be the",
- " rightmost instruction in its rung.",
- "",
- "",
- "> UART (SERIAL) RECEIVE var",
- " --{UART RECV}--",
- "",
- " LDmicro can generate code to use the UART built in to certain",
- " microcontrollers. On AVRs with multiple UARTs only UART1 (not",
- " UART0) is supported. Configure the baud rate using Settings -> MCU",
- " Parameters. Certain baud rates may not be achievable with certain",
- " crystal frequencies; LDmicro will warn you if this is the case.",
- "",
- " If the input condition to this instruction is false, then nothing",
- " happens. If the input condition is true then this instruction tries",
- " to receive a single character from the UART. If no character is read",
- " then the output condition is false. If a character is read then its",
- " ASCII value is stored in `var', and the output condition is true",
- " for a single PLC cycle.",
- "",
- "",
- "> UART (SERIAL) SEND var",
- " --{UART SEND}--",
- "",
- " LDmicro can generate code to use the UARTs built in to certain",
- " microcontrollers. On AVRS with multiple UARTs only UART1 (not",
- " UART0) is supported. Configure the baud rate using Settings -> MCU",
- " Parameters. Certain baud rates may not be achievable with certain",
- " crystal frequencies; LDmicro will warn you if this is the case.",
- "",
- " If the input condition to this instruction is false, then nothing",
- " happens. If the input condition is true then this instruction writes",
- " a single character to the UART. The ASCII value of the character to",
- " send must previously have been stored in `var'. The output condition",
- " of the rung is true if the UART is busy (currently transmitting a",
- " character), and false otherwise.",
- "",
- " Remember that characters take some time to transmit. Check the output",
- " condition of this instruction to ensure that the first character has",
- " been transmitted before trying to send a second character, or use",
- " a timer to insert a delay between characters. You must only bring",
- " the input condition true (try to send a character) when the output",
- " condition is false (UART is not busy).",
- "",
- " Investigate the formatted string instruction (next) before using this",
- " instruction. The formatted string instruction is much easier to use,",
- " and it is almost certainly capable of doing what you want.",
- "",
- "",
- "> FORMATTED STRING OVER UART var",
- " -{\"Pressure: \\3\\r\\n\"}-",
- "",
- " LDmicro can generate code to use the UARTs built in to certain",
- " microcontrollers. On AVRS with multiple UARTs only UART1 (not",
- " UART0) is supported. Configure the baud rate using Settings -> MCU",
- " Parameters. Certain baud rates may not be achievable with certain",
- " crystal frequencies; LDmicro will warn you if this is the case.",
- "",
- " When the rung-in condition for this instruction goes from false to",
- " true, it starts to send an entire string over the serial port. If",
- " the string contains the special sequence `\\3', then that sequence",
- " will be replaced with the value of `var', which is automatically",
- " converted into a string. The variable will be formatted to take",
- " exactly 3 characters; for example, if `var' is equal to 35, then",
- " the exact string printed will be `Pressure: 35\\r\\n' (note the extra",
- " space). If instead `var' were equal to 1432, then the behaviour would",
- " be undefined, because 1432 has more than three digits. In that case",
- " it would be necessary to use `\\4' instead.",
- "",
- " If the variable might be negative, then use `\\-3d' (or `\\-4d'",
- " etc.) instead. That will cause LDmicro to print a leading space for",
- " positive numbers, and a leading minus sign for negative numbers.",
- "",
- " If multiple formatted string instructions are energized at once",
- " (or if one is energized before another completes), or if these",
- " instructions are intermixed with the UART TX instructions, then the",
- " behaviour is undefined.",
- "",
- " It is also possible to use this instruction to output a fixed string,",
- " without interpolating an integer variable's value into the text that",
- " is sent over serial. In that case simply do not include the special",
- " escape sequence.",
- "",
- " Use `\\\\' for a literal backslash. In addition to the escape sequence",
- " for interpolating an integer variable, the following control",
- " characters are available:",
- " * \\r -- carriage return",
- " * \\n -- newline",
- " * \\f -- formfeed",
- " * \\b -- backspace",
- " * \\xAB -- character with ASCII value 0xAB (hex)",
- "",
- " The rung-out condition of this instruction is true while it is",
- " transmitting data, else false. This instruction consumes a very",
- " large amount of program memory, so it should be used sparingly. The",
- " present implementation is not efficient, but a better one will",
- " require modifications to all the back-ends.",
- "",
- "",
- "A NOTE ON USING MATH",
- "====================",
- "",
- "Remember that LDmicro performs only 16-bit integer math. That means",
- "that the final result of any calculation that you perform must be an",
- "integer between -32768 and 32767. It also mean that the intermediate",
- "results of your calculation must all be within that range.",
- "",
- "For example, let us say that you wanted to calculate y = (1/x)*1200,",
- "where x is between 1 and 20. Then y goes between 1200 and 60, which",
- "fits into a 16-bit integer, so it is at least in theory possible to",
- "perform the calculation. There are two ways that you might code this:",
- "you can perform the reciprocal, and then multiply:",
- "",
- " || {DIV temp :=} ||",
- " ||---------{ 1 / x }----------||",
- " || ||",
- " || {MUL y := } ||",
- " ||----------{ temp * 1200}----------||",
- " || ||",
- "",
- "Or you could just do the division directly, in a single step:",
- "",
- " || {DIV y :=} ||",
- " ||-----------{ 1200 / x }-----------||",
- "",
- "Mathematically, these two are equivalent; but if you try them, then you",
- "will find that the first one gives an incorrect result of y = 0. That",
- "is because the variable `temp' underflows. For example, when x = 3,",
- "(1 / x) = 0.333, but that is not an integer; the division operation",
- "approximates this as temp = 0. Then y = temp * 1200 = 0. In the second",
- "case there is no intermediate result to underflow, so everything works.",
- "",
- "If you are seeing problems with your math, then check intermediate",
- "results for underflow (or overflow, which `wraps around'; for example,",
- "32767 + 1 = -32768). When possible, choose units that put values in",
- "a range of -100 to 100.",
- "",
- "When you need to scale a variable by some factor, do it using a multiply",
- "and a divide. For example, to scale y = 1.8*x, calculate y = (9/5)*x",
- "(which is the same, since 1.8 = 9/5), and code this as y = (9*x)/5,",
- "performing the multiplication first:",
- "",
- " || {MUL temp :=} ||",
- " ||---------{ x * 9 }----------||",
- " || ||",
- " || {DIV y :=} ||",
- " ||-----------{ temp / 5 }-----------||",
- "",
- "This works for all x < (32767 / 9), or x < 3640. For larger values of x,",
- "the variable `temp' would overflow. There is a similar lower limit on x.",
- "",
- "",
- "CODING STYLE",
- "============",
- "",
- "I allow multiple coils in parallel in a single rung. This means that",
- "you can do things like this:",
- "",
- " || Xa Ya ||",
- " 1 ||-------] [--------------( )-------||",
- " || ||",
- " || Xb Yb ||",
- " ||-------] [------+-------( )-------||",
- " || | ||",
- " || | Yc ||",
- " || +-------( )-------||",
- " || ||",
- "",
- "Instead of this:",
- "",
- " || Xa Ya ||",
- " 1 ||-------] [--------------( )-------||",
- " || ||",
- " || ||",
- " || ||",
- " || ||",
- " || Xb Yb ||",
- " 2 ||-------] [--------------( )-------||",
- " || ||",
- " || ||",
- " || ||",
- " || ||",
- " || Xb Yc ||",
- " 3 ||-------] [--------------( )-------||",
- " || ||",
- "",
- "This means that in theory you could write any program as one giant rung,",
- "and there is no need to use multiple rungs at all. In practice that",
- "would be a bad idea, because as rungs become more complex they become",
- "more difficult to edit without deleting and redrawing a lot of logic.",
- "",
- "Still, it is often a good idea to group related logic together as a single",
- "rung. This generates nearly identical code to if you made separate rungs,",
- "but it shows that they are related when you look at them on the ladder",
- "diagram.",
- "",
- " * * *",
- "",
- "In general, it is considered poor form to write code in such a way that",
- "its output depends on the order of the rungs. For example, this code",
- "isn't very good if both Xa and Xb might ever be true:",
- "",
- " || Xa {v := } ||",
- " 1 ||-------] [--------{ 12 MOV}--||",
- " || ||",
- " || Xb {v := } ||",
- " ||-------] [--------{ 23 MOV}--||",
- " || ||",
- " || ||",
- " || ||",
- " || ||",
- " || [v >] Yc ||",
- " 2 ||------[ 15]-------------( )-------||",
- " || ||",
- "",
- "I will break this rule if in doing so I can make a piece of code",
- "significantly more compact, though. For example, here is how I would",
- "convert a 4-bit binary quantity on Xb3:0 into an integer:",
- "",
- " || {v := } ||",
- " 3 ||-----------------------------------{ 0 MOV}--||",
- " || ||",
- " || Xb0 {ADD v :=} ||",
- " ||-------] [------------------{ v + 1 }-----------||",
- " || ||",
- " || Xb1 {ADD v :=} ||",
- " ||-------] [------------------{ v + 2 }-----------||",
- " || ||",
- " || Xb2 {ADD v :=} ||",
- " ||-------] [------------------{ v + 4 }-----------||",
- " || ||",
- " || Xb3 {ADD v :=} ||",
- " ||-------] [------------------{ v + 8 }-----------||",
- " || ||",
- "",
- "If the MOV statement were moved to the bottom of the rung instead of the",
- "top, then the value of v when it is read elsewhere in the program would",
- "be 0. The output of this code therefore depends on the order in which",
- "the instructions are evaluated. Considering how cumbersome it would be",
- "to code this any other way, I accept that.",
- "",
- "",
- "BUGS",
- "====",
- "",
- "LDmicro does not generate very efficient code; it is slow to execute, and",
- "wasteful of flash and RAM. In spite of this, a mid-sized PIC or AVR can",
- "do everything that a small PLC can, so this does not bother me very much.",
- "",
- "The maximum length of variable names is highly limited. This is so that",
- "they fit nicely onto the ladder diagram, so I don't see a good solution",
- "to that.",
- "",
- "If your program is too big for the time, program memory, or data memory",
- "constraints of the device that you have chosen then you probably won't",
- "get an error. It will just screw up somewhere.",
- "",
- "Careless programming in the file load/save routines probably makes it",
- "possible to crash or execute arbitrary code given a corrupt or malicious",
- ".ld file.",
- "",
- "Please report additional bugs or feature requests to the author.",
- "",
- "Thanks to:",
- " * Marcelo Solano, for reporting a UI bug under Win98",
- " * Serge V. Polubarjev, for not only noticing that RA3:0 on the",
- " PIC16F628 didn't work but also telling me how to fix it",
- " * Maxim Ibragimov, for reporting and diagnosing major problems",
- " with the till-then-untested ATmega16 and ATmega162 targets",
- " * Bill Kishonti, for reporting that the simulator crashed when the",
- " ladder logic program divided by zero",
- " * Mohamed Tayae, for reporting that persistent variables were broken",
- " on the PIC16F628",
- " * David Rothwell, for reporting several user interface bugs and a",
- " problem with the \"Export as Text\" function",
- "",
- "",
- "COPYING, AND DISCLAIMER",
- "=======================",
- "",
- "DO NOT USE CODE GENERATED BY LDMICRO IN APPLICATIONS WHERE SOFTWARE",
- "FAILURE COULD RESULT IN DANGER TO HUMAN LIFE OR DAMAGE TO PROPERTY. THE",
- "AUTHOR ASSUMES NO LIABILITY FOR ANY DAMAGES RESULTING FROM THE OPERATION",
- "OF LDMICRO OR CODE GENERATED BY LDMICRO.",
- "",
- "This program is free software: you can redistribute it and/or modify it",
- "under the terms of the GNU General Public License as published by the",
- "Free Software Foundation, either version 3 of the License, or (at your",
- "option) any later version.",
- "",
- "This program is distributed in the hope that it will be useful, but",
- "WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY",
- "or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License",
- "for more details.",
- "",
- "You should have received a copy of the GNU General Public License along",
- "with this program. If not, see <http://www.gnu.org/licenses/>.",
- "",
- "",
- "Jonathan Westhues",
- "",
- "Rijswijk -- Dec 2004",
- "Waterloo ON -- Jun, Jul 2005",
- "Cambridge MA -- Sep, Dec 2005",
- " Feb, Mar 2006",
- " Feb 2007",
- "Seattle WA -- Feb 2009",
- "",
- "Email: user jwesthues, at host cq.cx",
- "",
- "",
- NULL
-};
-#endif
-