3878 lines
206 KiB
C++
3878 lines
206 KiB
C++
// 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
|
||
|