Beruflich Dokumente
Kultur Dokumente
0/V2_70/Li
ElaSim
INHALT
ELASIM ......................................................................................................................... .................................................................... 1
WAS IST ELASIM .............................................................................................................................................................................. 3
Was ist neu in ElaSim V2.70........................................................................................................................................................ 4
Zusammenhang der einzelnen Komponenten............................................................................................................................... 5
Vorbereitete ElaGraph USER Bausteine ..................................................................................................................................... 6
Neue ElaGraph Bausteine erstellen............................................................................................................................................. 7
Projektmanagement (Projekt.exe)............................................................................................................................................... 8
Projektaufbau .............................................................................................................................................................................. 8
Projekte verwalten mit ElaSim .................................................................................................................................................. 10
ElaSim-Teilprogramme.............................................................................................................................................................. 10
Makefile aus der Projektverwaltung.......................................................................................................................................... 11
DIE ERSTEN SCHRITTE ZUM ERSTEN PROJEKT................................................................................................................................. 12
DIE USERWARE .............................................................................................................................................................................. 16
Start der Userware „ob.c“ ........................................................................................................................................................ 16
Aufbau der Userware................................................................................................................................................................. 17
Zyklische Verarbeitung .............................................................................................................................................................. 18
Die Funktion “ob1".....................................................................................................................................................................................19
Ereignisorientierte Verarbeitung.................................................................................................................................................................19
Die Funktion “ob2_x”.................................................................................................................................................................................19
Zeitzyklische Verarbeitung .........................................................................................................................................................................20
Die Funktion “ob13“,“ob14“ ......................................................................................................................................................................20
}...................................................................................................................................................................................................................20
Die Bereiche der Userware .........................................................................................................................................................................21
Verschiedene CAN Protokolle durch die Userware realisieren...................................................................................................................21
Notation der Userware ................................................................................................................................................................................21
Aufteilung Userware in verschiedene Bibliotheksfunktionen .....................................................................................................................22
Näheres zu den Userware Bibliotheken ......................................................................................................................................................27
Beispiele der Programmierung.................................................................................................................................................. 30
Programmbeispiel “Boolsche Verknüpfungen” in “C.................................................................................................................................30
Programmbeispiel “Analogverarbeitung” in “C”........................................................................................................................................31
Programmbeispiel “Mathematische Operationen” in “C”...........................................................................................................................31
Programmbeispiel “Regler parametrisieren” in “C” ...................................................................................................................................31
DIE FIRMWARE ........................................................................................................................................................................... 32
Festlegung der thematischen Adressbereiche............................................................................................................................ 33
Hardware Adressmapping ......................................................................................................................................................... 33
Zykluszeitüberwachung.............................................................................................................................................................. 34
Wichtige Hinweise zur USERWARE auf verschiedener Prozessoren/Compilern...................................................................... 35
Hinweis für CPU515...................................................................................................................................................................................35
Hinweis für CPU167...................................................................................................................................................................................36
Hinweis für CPU960...................................................................................................................................................................................37
USERWARE PROGRAMMBEISPIELE .............................................................................................................................................. 38
Programmaufbau....................................................................................................................................................................... 38
Ablaufprogrammkopf..................................................................................................................................................................................38
Variable deklarieren....................................................................................................................................................................................38
Initialisieren im “ob22()” ............................................................................................................................................................................38
Ablauf in “ob1()” ........................................................................................................................................................................................38
Zählvorgänge und Zeitgeber...................................................................................................................................................... 39
Softwarezähleingang im ob1() ....................................................................................................................................................................39
Softwarezähleingang mittels Interruptroutine .............................................................................................................................................40
Softwarezähleingang mittels FIRMWARE-Routine ...................................................................................................................................41
Softwaretimer abfragen...............................................................................................................................................................................42
Pulsierender Ausgang .................................................................................................................................................................................43
Einschaltverzögerung eines Ausganges ......................................................................................................................................................44
Softwarerampen......................................................................................................................................................................... 45
Rampe eines analogen Ausganges ..............................................................................................................................................................45
VISUALISIERUNG ............................................................................................................................... ............................................. 46
0RGXO
Mit einem beliebigen Texteditor kann ein neues ANSI C-
Programm erstellt werden.
REF 6<66,0/,% 2%(;( 2%(;(
=LHOKDUGZDUH
,1
2 87
HOUHVW
PRIMITIVE BSP;
Das Erstellen dieser Bausteine erfolgt mittels eines INPUT
OUTPUT
SIGNAL
SIGNAL
X
Y
:
:
FLOAT
FLOAT
:
:
0,15
40,15
:
:
LEFT;
RIGHT;
Texteditors. INPUT SIGNAL Yu : FLOAT : 10,30 : DOWN;
INPUT SIGNAL Yo : FLOAT : 25,30 : DOWN;
OUTPUT SIGNAL Qu : BIT : 10, 0 : UP;
Das Generieren der Bausteine erfolgt durch den OUTPUT SIGNAL Qo : BIT : 25, 0 : UP;
mitgelieferten PERL Compiler. STATICSYM;
BEGIN
Dieser kann direkt in die Entwicklungsober-fläche von Width := 40;
Height := 30;
Visual Studio integriert werden. Bar(0:0:40:30);
Line(6, 0:0: 0:30: 30:30: 40:15: 30:0: 0:0);
Line(4, 3:27: 8:27: 22:3: 27:3);
END STATICSYM;
TARGET
BEGIN
{
if (X <= Yu) {
Y = Yu;
Qu = high;
Qo = low;
return;
}
if (X >= Yo) {
Y = Yo;
Qu = low;
Qo = high;
return;
}
Y = X;
Qu = low;
Qo = low;
}
END TARGET;
END BSP;
Projektmanagement (Projekt.exe)
Ein ElaSim-Projekt kann bis zu 64 Module umfassen (CAN-Protokoll 1, 2 und Layer2)
Ein ElaSim-Projekt unterstützt verschiedene Zielprozessoren, wie
Intel 8051 alias CPU8051 in Vorbereitung
Intel 80251 alias CPU80251 in Vorbereitung
SAB 80515 alias CPU515
SAB 80515A alias CPU515A
SAB 80C515C alias CPU515C in Vorbereitung
SAB 80167 alias CPU167
I 80960 alias CPU960
Die entsprechenden Makefiles für die Zielsysteme und die Simulationsumgebung werden von ElaSim automatisch erzeugt.
Die zahlreichen Compiler-Einstellungen für die Zielsysteme werden automatisch von Elasim vorgenommen.
Zu jedem Projekt wird ein Simulationssystem zu den maximal 64 CAN-Modulen erzeugt. Diese Simulationsumgebung
umfaßt ein Visual.exe, welches bis zu 64 CAN-Module mit Bedienerinterface simuliert.
Der Laufzeitkern der einzelnen CAN-Module wird in eigenständigen Programmen
OB00.exe ... OB63.exe nachgebildet.
Projektaufbau
Der Aufbau eines ElaSim-Projektes :
Das Stammverzeichnis ...\Projektname\ kann auf einem beliebigen Pfad eingerichtet werden.
Der Projekt-Pfad und die Dateinamen im Projekt dürfen nicht mehr als 8 Zeichen lang sein,
wenn später der Keil-Compiler verwendet werden soll.
Ab diesem Stammverzeichnis wird für jedes CAN-Modul ein eigenes Unterverzeichnis geführt.
Bsp. : ...\Projekte\Projektname\Geraetename1
...\Projekte\Projektname\Geraetename2
...\Projekte\Projektname\Geraetename3
.......
...\Projekte\Projektname\Geraetename64
In jedem dieser Unterverzeichnisse (Geraetename1 ... Geraetename63 (Dev00 .... Dev63)) werden die entsprechenden
Makefiles für die unterschiedlichen Prozessoren generiert.
Bsp. : ...\Projekte\Projektname\Geraetename1\Elasim\USR_515.MAK
...\Projekte\Projektname\Geraetename1\Elasim\USR_167.MAK
...\Projekte\Projektname\Geraetename1\Elasim\USR_960.MAK
...\Projekte\Projektname\Geraetename1\Elasim\USR_SIM.MAK
0LFURVRIW
9LVXDO &&9;; 9
6LPXODWLRQ
*18 17
;
*18
3URMHNW SURMHNWH[H
D 3URMHNWDXVZDKO
D 6LPXODWLRQVEHGLHQXQJ D 3URJUDPP'RZQORDGLQJ
E 2IIOLQH'HEXJJLQJ E 2QOLQH'HEXJJLQJ
Festplattenlaufwerk\Softwareverzeichnis\Softwarename\Projektzuordnung
z.B.
...\C51V4 => Keil Compiler V4.01
...\MICROV2 => Microtec Compiler V2.0
...\HighTec => GNU 167 Compiler V3.2
...\ElaSoft\EStudio\Default => Die Default-Daten, aus denen neue Projekte erzeugt werden
...\ElaSoft\Projekte => eigene Projekte und mitgelieferte Beispielprogramme
...\ElaSoft\Can_inc => Alle relevanten Include-Dateien
...\ElaSoft\Can_lib\V1_xx => Alle relevanten Librarys in den entsprechenden Unterverzeichnissen
ElaSim-Teilprogramme
Pusr_960.mak
Dieses wird vor jedem Compiliervorgang neu erstellt. Hierin werden alle Programmodule aus der Projektverwaltung
automatisch eingefügt. Das unveränderliche Makefile Musr_960.mak wird darin eingebunden.
Falls Sie via der seriellen RS232 Schnittstelle kontakt mit dem
Zielsystem aufnehmen möchten, wählen Sie „RS232“ aus.
Die Userware
Ob.c:
als kompatible Schnittstelle zu bereits realisierten Projekten.
Uwmodul.c:
diese Datei dient zur generellen Konfiguration, welche
USERWARE-Programmteile zusammen-geführt werden
sollen.
User.c:
Der Source-Code zu den 10 vorbereiteten USERWARE-
Bausteinen für ElaGraph „USR0“ bis „USR9“.
Hinweis:
Alle oben aufgeführte Funktionen müssen in der USERWARE vorhanden sein.
Falls sie diese nicht nutzen, können die Funktionsinhalte leer bleiben.
Die Funktionsdeklarationen dürfen nicht gelöscht werden.
Zyklische Verarbeitung
3URJUDPPDEODXI
Die zyklische Programmverarbeitung ist die meistverwendete Art
Steuerungsprogramme zu erstellen.
Merkervariablen mit nahezu beliebigen Namen können frei nach C-Notation
definiert werden. Die Verknüpfung von Eingangs-und Ausgangsvariablen wird in
einigen Beispielen erläutert.
Nachteile :
Schnelle Signale (kleiner als die Zykluszeit) können nicht verarbeitet werden.
- Die Zykluszeit beträgt bei einer 8-bit CPU typisch 2-100ms.
- Die Zykluszeit beträgt bei einer 16-bit CPU typisch 0,5-20ms.
- Die Zykluszeit beträgt bei einer 32-bit CPU typisch 0,1-10ms. 0DLQWDVN
Ereignisorientierte Verarbeitung
Die ereignisgesteuerte Programmverarbeitung dient zur (UHLJQLVJHVWHXHUWHU 3URJUDPPDEODXI
Bearbeitung von schnellen Hardware-Signalen, die schneller ,QWHUUXSWHLQJDQJ ,QWHUUXSWHLQJDQJ
als die Zykluszeit sind.
(nicht verfügbar bei der 80960-CPU)
REB REB
Zeitzyklische Verarbeitung
=HLWJHVWHXHUWHU 3URJUDPPDEODXI
,QWHUUXSW DOOH PV
• RS_PROT2.C
Elrest Protokol 1.0 und/oder 2.0 für serielle Schnittstelle
• L2_PROT2.C
Layer 2 des Elrest Protokolles.
• L7_PROT2.C
Alle auf Layer 2 basierende höhere Protokollschichten.
• L7_DRV.C
Alle Dienste des Elrest Protokolles-
• DRIVER.C
Verwaltung von Driver.
• DEVICE.C
Verwaltung von Device.
• ZONLINE.C
Applikationsinterface zu Zonline.
SCHEDULE.C
Realtime Scheduler von Zonline.
HASH.C
Hash – Tabelle, zur Verwaltung dynamischer Suchroutinen.
6FKLFKW
'5,9(56&
'RZQ/'F 'RZQ/'F
/B3URWF
/B3URWF /B3URWF
56B:LQF 56F
ZOnline ruft bei Programmstart die Funktion Driver_SetFunctionDLL( ) auf. In dieser Funktion wird eine Struktur mit
Functionpointer zugewiesen. Hiermit wird erreicht, daß die C-Funktionen dem entsprechendem Treibernamen, z.B. RS232
zugeordnet wird.
verwendete Funktionen:
pDriverDllStruct->SlotReceiveData = (void _FUNC_PTR*)L7_Drv_SlotReceiveData;
pDriverDllStruct->SlotTransmitData = (void _FUNC_PTR*)L7_Drv_SlotTransmitData;
pDriverDllStruct->SizeDataList = (void _FUNC_PTR*)L7_Drv_SizeDataList;
pDriverDllStruct->GetSchedulerCycle = (void _FUNC_PTR*)L7_Drv_GetSchedulerCycle;
Eine Anfrage von ZOnline erfolgt indem die Funktion L7_Drv_SlotTransmitData ausgeführt wird. In dieser Funktion werden
alle vorhandenen Dienste abgearbeitet.
Dienste Adressierungsmodus
1. Autoscan
2. ElaSim Firmware Download ADRESSMODE_C_DOWNLOAD
3. ElaSim Userware Download ADRESSMODE_C_DOWNLOAD
4. ElaSim Ressource Download ADRESSMODE_C_DOWNLOAD
5. ElaGraph Attributfile und Download ADRESSMODE_ELAGRAPH_DIRECT
6. CAN ID direct ADRESSMODE_CAN_ID_DIRECT
7. Restart Telegram ADRESSMODE_DIRECT
DATATYPE_ERRORTELEGRAMM
8. Schreiber ADRESSMODE_OFFLINE_SCHREIBER
ADRESSMODE_GESAMT_SCHREIBER
9. Firmware-Variablen ADRESSMODE_DIRECT
10. C-based Variablen ADRESSMODE_USERWARE
ADRESSMODE_C_VARIABLE
ADRESSMODE_ELEGRAPH
Nach Ablauf der cycle time werden die Antworten durch die Funktion L7_Drv_SlotReceiveData ausgewertet.
Die Funktion L7_Drv_SizeDataList gibt an, wie viele DP pro cycle time maximal verschickt werden dürfen.
Die Funktion L7_Drv_GetSchedulerCycle gibt die cycle time an. Die cycle time wird in Abhängigkeit vom Treiber und der
Übertragungsrate ermittelt.
L7_Drv_GetSchedulerCycle= cycle time. Entspricht der kürzesten Zeit in der Telegramme gesendet werden. Polltime ist die
einstellbare Zykluszeit und ist ein vielfaches von cycle time. Bei Öffnen von Tasks (CanHex) mit unterschiedlichen
Zykluszeiten hat der Task mit der kleinsten Zykuszeit die höchste Priorität, d.h. möchte dieser Task in seiner vorgegebenen
Zykluszeit Telegramme versenden, so unterbricht er den Task mit der größen Zykluszeit, wenn diese zur selben Zeit
Telegramme versenden will
Bsp.:
Einstellungen: bei 123kBaud Æ cycle time = 100ms
Task1: Zykluszeit 200ms, 3 DP Æ 15 Telegramme/Sek.
Task2: Zykluszeit 500ms, 8 DP Æ 16 Telegramme/Sek.
Task3: Zykluszeit 5000ms, 20 DP Æ 4 Telegramme/Sek.
Summe: 35 Telegramme/Sek.
Zuerst muß ein Datenpunkt Handle erzeugt werden. Die void _HUGE* ResTypeGetZOnlineDatapoint(USIGN32 nID,
Funktion „ResTypeGetZonlineDatapoint()“ liefert ein char _HUGE* _HUGE* ppszUnit, int _HUGE*
pOnlineDataType, DATABUFFER4 _HUGE* db4VarMin,
Handle auf einen Datenpunkt zurück, sofern die DATABUFFER4 _HUGE* db4VarMax, DATABUFFER4 _HUGE*
Definition dieses Datenpunktes durch nID richtig db4DefaultValue)
angegeben wurde.
[Resource Offset]
Es gilt zu beachten, daß nID einer physikalischen ID
Bitmap=1000000
entspricht. Die Offsets aus der Spalte „ID“ müssen noch
Text=2000000
je nach Themenkreis mit Ihren Resource Offset addiert
DataPoint=3000000
werden.
Mask=4000000
Die Resouce Offset sind in der Device.set im Driver=5000000
Geräteverzeichnis geführt. Device=6000000
Font=7000000
Im gegenwärtigen Stand sind die Offset fest, sodaß diese
System=8000000
mit einer #define Anweisung als Konstante im C-
Programm integriert werden können.
Im C-Source verwendet als :
#define OFFSET_BITMAP 1000000L
#define OFFSET_TEXT 2000000L
#define OFFSET_MASK 4000000L
#define OFFSET_FONT 7000000L
Verzeichnisse zu ElaGraph
Quellen
Die Quellen *.eds werden mit der MFB (Mkae Function Block) Umgebung bearbeitet und stehen unter :
\MFB4063\Biblio\UsrLib
Simulation
Für die Simulation (iRTK32.exe) werden 2 Dateien benötigt. Die <project>.mco ist die graphische Darstellung eines
Bausteines, die <project>.dll stellt den funktionalen Anteil (C-Code) eines Bausteines dar und stehen unter:
\ElaSoft\ElaGraph\Lib
Zielsystem-Include
Um das Zielsystem compilieren zu können, müssen die Bausteine den ElaGraph Laufzeitkernel des Zielsystemes mitgeteilt
werden. Dazu wird die Datei <project>.h als Function-Prototyping und die <project>.mod als Function-Array benötigt und
stehen unter : \ElaSoft\Can_inc\BibGraph
Zielsystem
Um ein Zielsystem zu erzeugen werden in der ElaSim C-Programmierumgebung die aus der *.eds Quelle erzeugten C-
Quellen für das Zielsystem und dessen Compiler übersetzt in in das USERWARE Projekt mit eingebunden. Die von Elrest
erzeugten ElaGraph-Bibliotheken (ModIO1, ModAdv1,...) werden nicht im Quellcode „*.c“, sondern lediglich als
Bibliothek für den jeweiligen Zielsystemcompiler mitgeliefert. Die Verzeichnisse der Elrest Bibliothek werden in
Versionsnummern und nach Prozessor unterschieden :
\ElaSoft\Can_lib\V1_30\960\ModIO1.lib
\ElaSoft\Can_lib\V1_40\167\ModIO1.lib
Kommunikation Comm0105.hlp
s-bausteine zu
Zonline
ModAdapt.eds ModAdapt.mco ModAdapt.h ModAdapt.lib aus ModAdapt.c
Adapter zur ModAdapt.dll ModAdapt.mod
Daten- ModAdapt.hlp
konvertierung
ModAdv1.eds ModAdv1.mco ModAdv1.h ModAdv1.lib aus ModAdv1.c
Erweiterte ModAdv1.dll ModAdv1.mod
Reglerfunktione ModAdv1.hlp
n
ModCAL1.eds ModCAL1.mco ModCAL1.h ModCAL1.lib aus ModCAL1.c
Kalender- ModCAL1.dll ModCAL1.mod
funktionen ModCAL1.hlp
ModIO.eds ModIO.mco Aus Kompatiblitätsgründen
ModIO1.dll
ModIO1.eds ModIO1.mco ModIO1.h ModIO1.lib aus ModIO1.c
Digitale und ModIO1.dll ModIO1.mod
Analoge Ein- ModIO1.hlp
und Ausgänge
ModSFB.eds ModSFB.mco ModSFB.h ModSFB.lib aus ModSFB.c
Alle boolsch, ModSFB.dll ModSFB.mod
mathematische ModSFB.hlp
Funktionen
Para.eds Para.mco
Dient zur Para.hlp
Parametereinga
be
Pult0109.eds Pult0109.mco Aus Kompatiblitätsgründen
ModPult1.eds Modpult1.dll
Pult0110.eds Pult0110.mco Modpult1.h Modpult1.lib aus Modpult1.c
ModPult1.eds Modpult1.dll Modpult1.mod
Pult0110.hlp
Pult0201.eds Pult0201.mco Modpult1.h Modpult1.lib aus Modpult1.c
ModPult1.eds Modpult1.dll Modpult1.mod
Pult0201.hlp
Remote1.eds Remote1.mco Remote1.h Remote1.lib aus Remote1.c
Ansteuerung Remote1.dll Remote1.mod
Remote Remote1.hlp
Terminals
(CAN_P50)
Schreib.eds Schreib.mco Schreib.h Schreib.lib aus Schreib.c
Offline - Schreib.dll Schreib.mod
Schreiber Schreib.hlp
Selbst1.eds Selbst1.mco Selbst1.h Selbst1.lib aus Selbst1.c
Selbstoptimierun Selbst1.dll Selbst1.mod
g Selbst1.hlp
User.eds User.mco User.h User.c
Kundenspezifisc User.dll User.mod
he C-
Funktionen
innerhalb von
ElaSim
Visual.eds Visual.mco
Dient zur Visual.hlp
Anzeige
Beispiel 2 : %HLVSLHO
Beispiel 3 : %HLVSLHO
0B$
Beispiel 4 :
%HLVSLHO
if ( (M0_E1 && M0_E2 ) | | M0_E3 )
0B(
M0_A4_EIN;
else
M0_A4_AUS;
0B( 0B(
0B$
Falls der Meßwert des analogen Einganges von Modul 0, Zone 3 den Wert 200 der physikalischen Maßeinheit z.B. “bar”
überschreitet, wird der Ausgang des Moduls 0 M0_A1 eingeschaltet. In anderen Fall bleibt dieser ausgeschaltet. Mit dem
Funktionsparameter “PARM_TYP_X” wird der skalierte Istwert bestimmt.
Beispiel :
float sin_wert;
sin_wert = sin(30.0F) * 2.0F;
hierfür notwendig :
Die FIRMWARE
((3520 6SHLFKHU
/(',QWHUIDFH
/&' ,QWHUIDFH
7H[WDQ]HLJH
*UDSKLN
3DUDOOHOH 6FKQLWWVWHOOH
'UXFNHU
6HULHOOH 6FKQLWWVWHOOH
)UHPGUHFKQHU
RE
0RGHP
&$1,QWHUIDFH
7DVWDWXU
(FKW]HLWXKU
1
, ,1
,1 ,1
28 7 287
H O UH V W H OUH VW
Hardware Adressmapping
Nutzung der Festspeicher CPU515 CPU167 CPU960
(Flash-Speicher) Bereiche
Hinweis zu CPU515 :
Erkennungs-Zeichenfolge;
Gibt die Versionsnummer der verwendeten Interface-funktionen an.
Bsp.: Die Library „SYS515M.LIB“ erzeugt „ V1.2“
Zykluszeitüberwachung
In der Firmware besteht die Möglichkeit die Programmdurchlaufzeit von ob1() zu kontrollieren.
Im ob22() :
{
can_set(CYCLE_TIMEOUT,1000); /*1000 x 10 ms*/
}
Im ob31() :
{
DISABLE;
while (1);
}
Mit „can_set....“ wird die Zykluszeitüberwachung auf 1000 x 10ms = 10sec aktiviert.
Verweilt das Programm länger als 10s im ob1,zum Beispiel durch eine programmierte while (...) Schleife, springt die
Firmware in den ob31.
Im ob31 werden alle Interrupts gesperrt und mit einem while(1); auf den Hardwarewatchdog gewartet.
Dieser resetet nach 1-2s das Modul.
Bei Modulen wird bei einem Neustart mit der Hex-Schalter Stellung “F”
Hinweis zum Zielssystem
oder bei Pulten in der Service Stellung die komplette Userware gelöscht
werden.
Æ
kleinste sinnvolle Zeit 1000 usec = 1 msec
1 kHz
Hinweis zu ob22 In ob22 muß mindestens ein Funktionsaufruf erfolgen. Sinnvoll ist zum
Beispiel das Lesen der
Modulnummer des betreffenden Moduls. Das erfolgt mit der
Programmzeile:
meine_modul_nr = can_set(CANMODUS_MODULADRESSE,0);
Hinweise zu Linker Fehler Werden aus ob22 und ob1 dieselben Funktionen aufgerufen, produziert
der KEIL-Compiler einen
Linker-Fehler.
Abhilfe: Am Ende von ob22 wird ob1 einmalig aufgerufen.
Hinweis für den KEIL- Compiler Logische BIT- Operationen sollten mit „unsigned char“-Datentypen
(SAB 80515-12-, SAB 80515A-18- erfolgen. Damit kann eine schnellere Abarbeitung erreicht werden.
CPU):
Bei Modulen oder bei Pulten kann die Userware nur via CAN oder
Hinweis zum Zielssystem
RS232 gelöscht werden.
Alle ob1(), ob22().... Funktionen, die aus der Firmware gerufen werden müssen zwingend im der Programmdatei ob.c
stehen.
HINWEIS : Dies war bei CPU515 und CPU960 nicht zwingend notwendig.
_NEAR Funktionen sollten nicht verwendet werden.
Bei Aufruf von Funktionen
memcpy(((USIGN32 _HUGE*)szDataBufferRead) + nActualAreaNo, pDest, sizeof(long));
Dürfen keine Adressoperationen im Argument passieren !
Bei Modulen wird bei einem Neustart mit der Hex-Schalter Stellung “F”
Hinweis zum Zielssystem
oder bei Pulten in der Service Stellung die komplette Userware gelöscht
werden.
USERWARE Programmbeispiele
Programmaufbau
Ablaufprogrammkopf
/*
* OB.C
*
* Version : x.x
*
* Copyright (C) 1990-1999 elrest Automationssysteme GmbH
*/
#include \ElaSoft\can_inc\oh.h
Im Programmkopf sollte die aktuelle Versionsnummer, Änderungsindex, Datum, Programmierer und vieles mehr
eingetragen werden. Die Form der Darstellung ist innerhalb der Kommentarklammern frei wählbar.
Die generelle Includedatei „ob.h“ steht nach der Installation in einem absoluten Verzeichnis, damit sichergestellt wird, daß
alle Programme auf nur diese einzige Datei zugreifen.
Variable deklarieren
short schritt;
short zaehler = 0;
short zaehler_flanke = 0;
Initialisieren im “ob22()”
/*
* Initialisierung
*/
void ob22()
{
schritt = 1;
}
Die Funktion “ob22()” wird einmalig nach dem Programmstart durchlaufen. In dieser Funktion müssen alle
Initialisierungsarbeiten erfolgen. Im obigen Beispiel wurde die Variable “schritt” auf den Wert 1 vorbesetzt. Wie in dem
oberen Beispiel zu ersehen, könnte aber bei der Deklaration einer Variablen dieser auch unmittelbar ein Wert zugewiesen
werden.
Ablauf in “ob1()”
Es wird bei Schritt 1 begonnen, da die Variable so vordefiniert wurde. Es wird unmittelbar in den Folgeschritt 2
gewechselt, nachdem die analogen Ausgänge AA1 und AA2 auf 10.0 Volt gesetzt wurden.
/*
* Ablaufsteuerung
*/
void ob1()
{
if ( schritt == 1 )
{
schritt = 2;
can_write_float(0,0,PARM_TYP_ANALOG _AUS,4000.0);
can_write_float(0,1,PARM_TYP_ANALOG _AUS,4000.0);
}
Softwarezähleingang im ob1()
Der Zähler „zaehler_1“ wird inkrementiert, falls sich die Eingangsflanke des Eingangs M1_E1 von LOW nach HIGH
ändert. Hat der Zähler den Wert 5 erreicht, werden die nächsten Schritte eingeleitet.
ulong zaehler_1 = 0;
short zaehler_flanke = 0;
. . .
if (M1_E1 && zaehler_flanke == 0)
{
zaehler_flanke = 1;
zaehler_1++; /* M1_E1 ein mal ..*/
}
if (!M1_E1 && (zaehler_flanke == 1))
zaehler_flanke = 0;
if (zaehler_1 == 5)
/* M1_E1 zum 5. mal gesetzt. */
{
/* .. die nächsten Schritte */
. . .
Die kürzeste Verarbeitungsgeschwindigkeit eines Flankenwechsels entspricht der doppelten Zykluszeit des ob1().
Die Zykluszeit beträgt bei einer 8-bit CPU typisch 2-100ms.
Die Zykluszeit beträgt bei einer 16-bit CPU typisch 0,5-20ms
Die Zykluszeit beträgt bei einer 32-bit CPU typisch 0,1-10ms.
Wird im Initialisierungsbaustein “ob22" der Interrupt für ”ob2_1" freigeschaltet, so wird mit jedem
LOW->HIGH Flankenwechsel auf dem Eingang E1 ein Interrupt ausgelöst.
Dieser Interrupt ruft die Funktion “ob2_1" auf. In dieser Funktion wird die Variable ”zaehler_1" inkrementiert, diese kann
im Hauptprogramm “ob1" bearbeitet werden.
Bsp.:
void ob22()
{
. . .
can_set(CANMODUS_OB2_1,TRUE);
/* Interrupt auslösen, falls E1 aktiviert wird; default TRUE */
. . .
void ob1()
. . .
if (zaehler_1 == 1)
/* Wenn E1 1 mal aktiviert wurde: ... */
M1_A1_EIN; /* Der digitale Ausgang Nr. 1 soll gesetzt werden. */
else if (zaehler_1 == 3) /* Wenn E1 das 3te mal aktiviert wurde: ... */
M1_A2_EIN; /* Der digitale Ausgang Nr. 2 soll gesetzt werden. */
else if (zaehler_1 == 7) /* Wenn E1 das 7te mal aktiviert wurde: ... */
{
M1_A1_AUS; /* Die digitalen Ausgänge Nr. 1 und Nr. 2 sollen */
M1_A2_AUS; /* zurückgesetzt werden. */
zaehler_1 = 0; /* Der "zaehler_1" wird zurückgesetzt. */
}
. . .
void ob2_1()
{
zaehler_1++;
}
. . .
In der USERWARE ist ein 32-bit Softwarezähler bereits integriert, der wie folgt konfiguriert ist :
Mit der Funktion “can_read_long (modul,0,PARM_TYP_DIG_IMPULSZAEHLEINGANG_LESEN,
&impulszahl);” können die Anzahl Impulse gelesen werden, die an Eingang E1 anliegen (LOW->HIGH Flanke).
Dabei bestimmt ..E3 das Vorzeichen des Zählers, ..E3 = 0V entspricht positiver Zählung und vice versa.
Mit der Funktion “can_read_long(modul,1,PARM_TYP_DIG_IMPULSZAEHLEINGANG_LESEN,
&impulszahl);” können die Anzahl Impulse gelesen werden, die an Eingang E2 anliegen (LOW->HIGH Flanke).
Dabei bestimmt ..E4 das Vorzeichen des Zählers, ..E4 = 0V entspricht positiver Zählung und vice versa.
u_long impulszahl;
. . .
void ob22() /* Dev01 */
. . .
can_set(IMPULS_ZEITBASIS,0);
. . .
void ob1() /* Dev00 */
. . .
/* Lesen der am digitalen Eingang Nr. 2 eingegangen Impulse. */
can_read_long(1,2,PARM_TYP_DIG_IMPULSZAEHLEINGANG_LESEN,&impulszahl.l_data);
. . .
/* Wenn ein Impuls registriert wurde: ... */
if (impulszahl.l_data[3] == 1L)
M1_A3_EIN; /* Der digitale Ausg. Nr. 3 soll gesetzt werden. */
/* Wenn zwei Impulse registriert wurden: ... */
if (impulszahl.l_data[3] == 2L)
M1_A4_EIN; /* Der digitale Ausg. Nr. 4 soll gesetzt werden. */
/* Wenn drei Impulse registriert wurden: ... */
if (impulszahl.l_data[3] >= 3L)
{
M1_A3_AUS; /* Die digitalen Ausg. Nr. 3 und Nr. 4 sollen */
M1_A4_AUS; /* zurückgesetzt werden. */
/* Mit dieser Funktion kann der Zähler manuell genullt werden. */
/* default 0 */
can_write_long(1,1,PARM_TYP_DIG_IMPULSZAEHLEINGANG,0L);
}
. . .
Softwaretimer abfragen
Bsp.:
Es wird im Ablaufschritt 102 der „zaehler_2“ auf die Zeitdauer „schritt_dauer_102“ gesetzt.
Der Timer wird im “ob13()”dekrementiert.
Es folgt der Schritt 103. Im Schritt 103 wird die verbleibende Zeit ausgegeben, bis der „zaehler_2“ zu 0 geworden ist. Ist
dies erreicht, so wird der „zaehler_2“ auf die Zeitdauer „schritt_dauer_103“ gesetzt.
Auf diese Weise springt die Steuerung von „schritt“ 102 zu „schritt“ 103 und wieder zurück.
. . .
void ob1()
. . .
if ((schritt == 102) && (zaehler_2 == 0))
{
zaehler_2 = schritt_dauer_102;
lcd_vdspls(7,0," ");
lcd_vdspls(5,0," Jetzt wird 'schritt' 102 durchgeführt. ");
schritt = 103; /* nächster "schritt" ist "schritt" 102 */
}
sprintf(buffer," Rest-Zeit bis zum 'schritt' %3i: %1i sec.",schritt, zaehler_2/100);
lcd_vdspls(6,0,buffer);
if ((schritt == 103) && (zaehler_2 == 0))
{
zaehler_2 = schritt_dauer_103;
lcd_vdspls(5,0," ");
lcd_vdspls(7,0," Jetzt wird 'schritt' 103 durchgeführt. ");
schritt = 102; /* zurück zu "schritt" 102 */
}
. . .
void ob13()
{
/* Solange 'zaehler_2' ungleich Null ist wird er alle 10 msec */
/* dekrementiert. */
if ( zaehler_2 )
zaehler_2--;
. . .
Pulsierender Ausgang
Bsp.: Der Ausgang A4 soll im Taktverhältnis von 50 % Ein- und 50 % Ausschalten.
. . .
void ob(1)
. . .
/* Am Anfang und wenn "zaehler_3" bis auf Null dekre- */
/* mentiert wurde, wird der digitale Ausgang Nr. 1 gesetzt. */
if (zaehler_3 == 0)
{
zaehler_3 = periodendauer; /* "zaehler_3" wird hochgesetzt. */
M1_A1_EIN;
lcd_vdspls(3,26,"ein");
}
/* Erst wenn die halbe Periodendauer verstrichen ist wird der */
/* digitale Eingang Nr. 1 wieder zurückgesetzt. */
else if (zaehler_3 < periodendauer/2)
{
M1_A1_AUS;
lcd_vdspls(3,26,"aus");
}
. . .
void ob13()
{
if ( zaehler_3 )
zaehler_3--;
. . .
. . .
ushort einschaltverzoegerung = 18000;
. . .
void ob1()
. . .
if (!M1_E1)
{
/* Sobald der digitale Eingang zurückgesetzt wird, wird */
/* auch der der digitale Ausgang Nr. 2 zurückgesetzt. */
M1_A2_AUS;
lcd_vdspls(3,12,"aus");
lcd_vdspls(3,30,"aus");
/* Solange der digitale Eingang nicht gesetzt ist, wird der */
/* "zaehler_4" auf dem Wert "einschaltverzögerung" gehalten. */
zaehler_4 = einschaltverzoegerung;
}
if (M1_E1) /* Der digitale Eingang wurde gesetzt. Ab jetzt wird der */
{ /* "zaehler_4" nicht mehr auf dem Wert */
/* "einschaltverzögerung" gehalten, sondern er wird im */
/* Programmteil "ob13()" dekrementiert. */
lcd_vdspls(3,12,"ein");
if (zaehler_4 == 0) /* "zaehler_4" wird solange dekrementiert, */
{ /* bis er Null erreicht hat. Dann: ... */
M1_A2_EIN; /* Der digitale Ausgang Nr. 2 wird gesetzt. */
lcd_vdspls(3,30,"ein");
}
}
. . .
void ob13()
{
if ( zaehler_4 )
zaehler_4--;
. . .
Der Eingang ..._E1 startet den Kompressor neu, jedoch nur falls der „zaehler_4“ abgelaufen.
Softwarerampen
Rampe eines analogen Ausganges
Für analoge Ausgänge werden oft Rampenfunktionen benötigt. Als Beispiel soll der analoge Ausgang 1 stetig von 0 bis 10
Volt ansteigen.
Wichtig ist, in welchen Zeiteinheiten der Rampenwert inkrementiert werden soll, und wie schnell sich die Rampe erhöhen
soll.
. . .
static short rampen_wert = 0;
. . .
void ob1()
. . .
/* Wird der digitale Eingang M1_A3 gesetzt */
/* wird die analoge Rampe aktiviert. */
if (M1_E3)
{
/* Der "zaehler_2" wird im Programmteil "ob13()" so lange */
/* dekrementiert bis er Null ist. */
if (zaehler_2 == 0)
{
/* Dann wird er auf den Wert 10 hochgesetzt, damit es */
/* 10 * 10 msec = 0,1 sec dauert, bis ein weiteres mal die */
/* Bedingung dieser "if"-Abfrage erfüllt ist. */
zaehler_2 = 10;
/* Der "rampen_wert" wird alle 0,1 sec neu berechnet. */
rampen_wert += 10;
if (rampen_wert > 4000)
rampen_wert = 0;
. . .
}
}
. . .
void ob13()
{
if ( zaehler_2 )
zaehler_2--;
. . .
Visualisierung
Des weiteren ist eine wesentliche Funktionskomponente die Kommunikation. Die Kommunikation im Zielsystem, realisiert
durch Zonline.c wird auf dem PC durch Eonline.exe nachgebildet. Ein offenes Treiberkonzept für Zonline und Eonline
ermöglicht das Einbinden nahezu beliebiger kommunikativer Partner.
Simulation : Zielhardware :
CAN_P200
CAN_M4 CAN_M1
Diese Programme können auf dem PC mittels Interprozesskommunikation untereinander Nachrichten versenden wie dies
auch im Zielsystem über den CAN-Feldbus erfolgt.
Die Programmabläufe verhalten sich in den eigenständigen Tasks OB00 .... OB63 ebenso wie auf den eigenständigen
Modulen M00 .... M63.
Auch der Einschaltvorgang läßt sich durch die Aufteilung auf einzelne exe-Dateien pro virtuellem Modul realistisch
simulieren. Wird ein einzelnes Modul in ein aktives CAN-Netzwerk integriert, kann das in der Simulation mit dem Starten
der Simulation nachgestellt werden.
Tastaturinterface X
LED Anzeigen X
LCD Anzeigen X
Digitale Ein- und Ausgänge X X
Analoge Ein- und Ausgänge X X
CAN-Feldbusschnittstelle X X
Serielle Schnittstelle X X
Parallele Schnittstelle X
Echtzeituhr X
Speichern in Eprom X X
Die Bedienung des Debuggers ist nicht Bestandteil dieses Handbuches. Im Programmierkurs wird ausführlich auf den
Debugger eingegangen.
Öffnen von File > New und Auswahl von Project Workspace (VC4.x) bzw. Projects (VC5.0)
Auswahl des Typs Makefile, Eingabe des Projektnamens für das Makefile
z.B.: Ob01 (Ob0 .... Ob63 ) =
ˆ Gerät Nr. 1 (0 ... 63)
Hinweis : Am Ende des Location-Pfades darf nicht der Name des Makefiles stehen (Ob0.... Ob63)
C:\ELASOFT\.....\ElaSim\Ob01
Bestätigen mit Create, bzw. OK
Ein Meldefenster von Microsoft Developer Studio wird geöffnet
Wechsel auf die zweite Seite des Eingabefensters durch Anwahl von Debug
Bestätigen mit OK
Öffnen von Insert >Files into Projekt (V4.x)
Öffnen von Project >Add To Project->Files (V5.0)
Um das Zusammenspiel mehrerer Module zu simulieren, muß für jedes Modul das Microsoft Developer Studio einmal
geöffnet werden und die Debug-Umgebung eingerichtet werden. Zusätzlich müssen die Tasks bzw. Module in der
Visualisierung der Simulation aktiviert werden. Das muß zuvor über die ElaSim-Projektverwaltung erfolgen.
Auf diese Weise können mehrere Module „eingeschaltet“ werden, in dem die entsprechenden Programme (ob.c) einzeln
von dem zugehörigen Developer Studio aus gestartet werden.
Als ersten Schritt sollten Sie überprüfen, ob die Compiler korrekt eingestellt sind und ob Ihr gewünschter Editor
eingebunden ist. Dafür muß aus dem Menü der Projektverwaltung der Menüpunkt
Optionen > Einstellungen... aufgerufen werden.
Über diesen Menüpunkt gelangen Sie in das Fenster Einstellungen, in dem Sie folgende Einstellungen vornehmen können:
Editor:
Hier wird Pfad und Name der *.exe-Datei des zu verwendeten Editors ausgewählt.
Compiler
Ziel: 80515 (KEIL)
Pfad: Hier wird der Pfad des zu verwendeten Compilers für ein 80515 Zielsystem eingetragen:
z.B. <Laufwerk>:\Installationspfad\c51v4
Version: Versionsnummer des verwendeten Compilers
Ziel: 80167 (GNU)
Pfad: Hier wird der Pfad des zu verwendeten Compilers für ein 80167 Zielsystem eingetragen:
z.B. <Laufwerk>:\Installationspfad\microsys
Version: Versionsnummer des verwendeten Compilers
Ziel: 80960 (Microtec)
Pfad: Hier wird der Pfad des zu verwendeten Compilers für ein 80960 Zielsystem eingetragen:
z.B. <Laufwerk>:\Installationspfad\microv2
Version: Versionsnummer des verwendeten Compilers
Ziel: Simulation (MSDev)
Pfad: Hier wird der Pfad des zu verwendeten Compilers für die Simulation eingetragen:
z.B. <Laufwerk>:\Installationspfad\MSDEV für Visual C/C++ V4.x
z.B. <Laufwerk>:\Installationspfad\DevStudio\VC für Visual C/C++ V5.0
Version: Versionsnummer des verwendeten Compilers (für V4.x und V5.0 ohne Verwendung)
Bestätigen Sie bitte mit OK.
Mit der rechten Maustaste öffnen Sie von der Projekt-Ebene aus (d.h. ein bestehendes Projekt ist markiert) das angezeigte
Menü. Mit Hilfe der Menüpunkte ist es möglich ein bestehendes Projekt zu importieren, das markierte Projekt zu löschen
oder zu ändern und über den Menüpunkt Neues Projekt ein neues Projekt anzulegen.
Ab jetzt erscheint das neue, bisher noch leere, Projekt in der Projekte-Liste.
Die Eigenschaften des Gerätes werden in den folgenden vier Fenstern angegeben.
Anschließend wird das projektierte Gerät im neuen Projekt „prj_neu“ aufgeführt und hat die oben ausgewählten
Eigenschaften.
Für das „Geraet0“ kann ein ElaSim-Programm erstellt werden. Dazu wird, bei markiertem Gerät, die rechte Maustaste
betätigt. Mit dem damit geöffneten Menü kann über den Menüpunkt Neu... ein Neues Objekt eingefügt werden.
Aus der Liste der möglichen Objekte für dieses Gerät
wird das ElaSim-Programm ausgewählt.
Weitere Angaben zum ElaSim-Programm werden über das nächste Fenster Moduleinstellungen vorgenommen. Der
verwendete Prozessor ist bereits korrekt eingetragen, kann aber an dieser Stelle noch geändert werden. LCD-Typ Grafik
kann angegeben werden, ob das Pult ein grafikfähiges Display besitzt. Aus der Liste Firmware muß die im Gerät
verwendete Firmware-Version (<V1.20 oder >=V1.20) ausgewählt werden, da dementsprechend andere *.lib-Dateien
eingebunden werden.
Über den Ordner *.c, *.asm, *.a51-Sourcen können Dateien dieses Formates zusätzlich zu „ob.c“ in das Projekt zum
Compilieren eingebunden werden.
Über den Ordner Bibliotheken können zusätzlich zu der zum Modul und zur Firmware-Version passenden
*.lib-Datei, die automatisch ausgewählt wird, weitere *.lib-Dateien eingebunden werden.
Über den Ordner Target Compiler kann ein vom Standard-Compiler abweichender Compiler angegeben werden.
Die ausgewählten C-Quellen werden anschließend auch im Projekt-Baum mit angezeigt. Über Doppelklicken auf der C-
Quelle wird diese mit dem eingestellten Editor geöffnet und kann bearbeitet werden.
Ist ein Programm erstellt, so kann es für die Simulation mit dem eingestellten Simulations-Compiler eine *.exe-Datei
erzeugt werden, die direkt nach dem Compiliervorgang oder später über den Menüpunkt Simulation starten auf dem PC
zum Laufen gebracht werden kann. Dazu wird bei markiertem Baumeintrag ElaSim-Programm die rechte Maustaste
betätigt und der Menüpunkt Compilieren Simulation ausgewählt Weist das Programm noch Fehler auf, werden diese
angezeigt.
Für das Zielsystem kann mit dem Menüpunkt Compilieren Zielsystem mit dem eingestellten Compiler passend zum
verwendeten Prozessor eine *.hex-Datei erzeugt werden. Diese kann direkt nach dem erfolgreichen Compiliervorgang oder
später mit dem Menüpunkt Download auf das Gerät gespielt werden.
Windows 95:
Überprüfen Sie durch „mem“ auf DOS-Ebene (Verzeichnis Windows), wieviel Speicher Ihren Applikationen
zur Verfügung steht:
Windows NT:
Überprüfen Sie durch „mem /c |more“ auf DOS-Ebene (Verzeichnis WinNT\System32), wieviel Speicher
Ihren Applikationen zur Verfügung steht:
Überprüfen Sie Ihre config.sys und autoexec.bat und bereinigen Sie diese von unnötigen Systemtreibern.
Laden Sie insbesondere DOS in den hohen Speicher:
Entfernen Sie nicht die device=...\display Einstellung oder mode con... Einstellungen, da sonst Ungereimtheiten im
Umgang mit Windows auftreten können.
Erhalten Sie dennoch beim Kompilieren großer Quellen weiterhin die Fehlermeldung, müssen Sie als letzte Konsequenz
Ihre Quellprogramme in mehrere Sourcen aufteilen und in den Programmeinstellungen die zweite Quelle ergänzen.
Anhang ELASIM
Tabelle Parametertypen
Alle Parameter können gelesen werden, falls das MSB (most significant bit) gesetzt ist.
In der unten angeführten Tabelle sind die fett/kursiv dargestellten Parametertypen read-only,
d.h. diese können unabhängig von dem MSB nur gelesen werden.
oder beispielsweise über die Bit-Verknüpfung der Typen (wie in den auf der folgenden Seite beschriebenen Funktionen
„can_read_...“ und „can_write_...“)
PARM_TYP_X_LESEN | 0x80
PARM_TYP_Y_LESEN | 0x80
PARM_TYP_DIG_EIN_LESEN | 0x80
PARM_TYP_DIG_AUS_ZUSTAND_LESEN | 0x80
PARM_TYP_ANALOG_AUS_ZUSTAND_LESEN | 0x80
erfolgen.
Folgende Formate werden unterstützt :
char[4]
Es werden in Folge vier einzelne Byte interpretiert.Diese Darstellung ist Prozessortyp unabhängig!
short[2]
Es werden in Folge zwei einzelne Short-Daten (signed 16-bit) übermittelt. Dabei ist die Darstellung einer Short-Zahl in
Motorola-Notation.
long
Es wird eine Long-Data (signed 32-bit) übermittelt. Dabei ist die Darstellung einer Long-Zahl in Motorola-Notation.
float
Diese Gleitkommazahl entspricht der IEEE-Normung über Float-Variable.
Tabelle Reglertypen
#define REGELTYP_AUS 0 /* Keine Regelung */
#define REGELTYP_PWM 1 /* Reine PWM Ausgabe */
#define REGELTYP_ZPMR 2 /* 2-Punkt m. Rückführung PID-T1 */
#define REGELTYP_DPMR 3 /* 3-Punkt m. Rückführung PID-T1 */
#define REGELTYP_ZPOR 4 /* 2-Punkt o. Rückführung */
#define REGELTYP_DPOR 5 /* 3-Punkt o. Rückführung */
#define REGELTYP_DPS 6 /* 3-Punkt Schrittregler */
#define REGELTYP_SELBST 9 /* Selbstoptimierung */
Tabelle Fühlerarten
#define FUEHLERART_FECO 0 /* Fühlerart FECO */
#define FUEHLERART_NICRNI 1 /* Fühlerart NICRNI */
#define FUEHLERART_PT100 2 /* Fühlerart PT100 */
#define FUEHLERART_PTRHPT 3 /* Fühlerart PTRHPT */
#define FUEHLERART_VOLT 4 /* Fühlerart Spannungseing */
#define FUEHLERART_AUS 5 /* Kein Fühler */
#define FUEHLERART_AMPERE 6 /* Fühlerart Stromeing. */
#define FUEHLERART_RAUMTEMP 7 /* Raumtemperatur */
#define FUEHLERART_OHM 8 /* 0 .. 1 k-Ohm */
#define FUEHLERART_PT1000 9 /* Fühlerart PT1000 */
#define FUEHLERART_12BIT_FECO 20 /* Fühlerart FECO */
#define FUEHLERART_12BIT_NICRNI 21 /* Fühlerart NICRNI */
#define FUEHLERART_12BIT_PT100 22 /* Fühlerart PT100 */
#define FUEHLERART_12BIT_PTRHPT 23 /* Fühlerart PTRHPT */
#define FUEHLERART_12BIT_VOLT 24 /* Fühlerart Spannungseing. */
#define FUEHLERART_12BIT_AMPERE 26 /* Fühlerart Stromeing. */
#define FUEHLERART_12BIT_OHM 27 /* 0 .. 1 k-Ohm */
#define FUEHLERART_12_BIT_PT1000 28 /* Fühlerart PT1000 */
Hinweis: Die erhöhte Auflösung von 12-bit ist nur optional erhältlich, bitte prüfen Sie dies im Vorfeld
void lcd_draw_line (int to_pos_x, int to_pos_y, long color, RECTANGLE _HUGE* pRect);
void lcd_draw_bitmap (int xa1, int ya1, int xa2, int ya2, BOOL opark, long backcolor,
USIGN8 scale, USIGN8 opaque, BITMAP_STRUCT * bmp, RECTANGLE *pRect);
void lcd_draw_circle (int xr, int yr, int r, long color, RECTANGLE _HUGE* pRect);
void lcd_draw_pyramid (int xa1, int ya1, int npixel, BOOL top, BOOL filled, long forecolor,
RECTANGLE _HUGE* pRect);
void lcd_draw_box (int xa1, int ya1, int xa2, int ya2, int d_box, long forecolor,
RECTANGLE _HUGE* pRect );
void feld_ink_vorkomma (short sek1, short ink1,short sek2, short ink2,short sek3,
short ink3)
void feld_ink_nachkomma (short sek1, short ink1,short sek2, short ink2,short sek3,
short ink3)
char can_user_telegram (long send_id, long recv_id, char len, char _HUGE* p_data)
Das Koordinatensystem
Das Koordinatensystem beginnt in der linken
oberen Ecke mit der Koordinaten x=0 und y=0.
Mit der Funktion :
lcd_point (int x,int y, long color);
kann ein einzelnes Pixel auf der angegebenen
Koordinate (97,33) positioniert werden.
Eine Linie
Eine Linie wird mit den Funktionen :
lcd_draw_set_pos (int x1,int y1);
lcd_draw_line(int x2, int y2, long color);
realisiert.
Dabei positioniert die Funktion :
lcd_draw_set_pos (92,33);
den Beginn der Linie.
Die Funktion :
lcd_draw_line(97,33,COLOR_RED);
zeichnet eine Linie in der Farbe ROT bis
einschließlich der Koordinate (97,33).
Ein Rechteck
Die Funktion :
lcd_draw_box(int xa1, int ya1, int xa2, int ya2,
int d_box, long forecolor );
zeichnet ein Rechteck innerhalb der angegebenen
Koordinaten.
Fonts
Ein Font wird in eine Windows95/NT kompatiblen Fixed - Font Format mit der Dateiendung *.FNT gespeichert.
In dieser Font - Datei sind alle Zeichen gesammelt gespeichert. Die Höhe und die Breite eines Fonts kann 1 – 64 Pixel
umfassen.
Fenster
Zur Positionsangabe eines Fensters wird immer das linke obere Pixel des Arbeitsbereichs, das ist der Teil des Fensters in
dem gezeichnet werden kann, verwendet. Dies ist unabhängig davon ob das Fenster einen Rahmen oder eine Titelzeile hat.
Hat ein Fenster einen Rahmen, so wird dieser außerhalb des Arbeitsbereichs gezeichnet. Die Rahmenbreite beträgt bei
einem 2D-Rahmen 1 Pixel und bei einem 3D-Rahmen 2 Pixel. Das Fensters vergrößert sich folglich um die zweifache
Rahmenbreite in der Höhe und in der Breite.
Hat ein Fenster eine Titelzeile so wird diese über dem Arbeitsbereich gezeichnet. Die Höhe der Titelzeile ist dabei die
Höhe des verwendeten Fonts + 1. Das Fenster wird dadurch um die Höhe der Titelzeile höher.
Hinweis: Zur Zeit kann für die Titelzeile nur der Systemfont verwendet werden. Dies hat zur Folge, daß ein
Fenster mit einer Titelzeile nur in dem durch den Systemfont gegebenen Raster positioniert werden
kann.
Das abgebildeten Beispiel zeigt ein Fenster mit 2D-Rahmen und Titelzeile an der Position 91, 40.