1 | //in diesem Beispiel wird der Drehzahl-Modus gewählt, die state machine eingeschaltet, mit einem Eingang freigegeben und die Drehzahl mit dem Analogeingang geregelt
|
2 |
|
3 | //1. Schritt: mappen von häufig verwenden SDOŽs
|
4 |
|
5 | map U16 ControlWord as output 0x6040:00
|
6 | map S08 OperationMode as output 0x6060:00
|
7 | map S16 TargetVelocity as output 0x6042:00
|
8 | map U32 Inputs as input 0x60FD:00
|
9 | map S32 AnalogInput as input 0x3320:01
|
10 | map U16 Controlword as inout 0x6040:00
|
11 | map U16 Statusword as input 0x6041:00
|
12 |
|
13 | map U32 Outputs as inout 0x60FE:01
|
14 | map S08 ModesOfOperation as output 0x6060:00
|
15 | map S08 ModesOfOperationDisplay as input 0x6061:00
|
16 |
|
17 |
|
18 | #include "wrapper.h"
|
19 | #include "nanotec.h"
|
20 | //2. Schritt: Hauptfunktion aufrufen und gewünschte Einstellungen treffen
|
21 |
|
22 | void user()
|
23 | {
|
24 |
|
25 | bool bEnabled = false; // bool Variable mit Name "bEnabled"
|
26 |
|
27 | Out.OperationMode = 2; // setzt den Operationsmodus auf Drehzahlmodus (mit Mapping, Zeile 5-9)
|
28 | //od_write(0x6060,0x00, 2); // setzt ebenfalls den Operationsmodus (ohne Mapping, Zeile 5-9)
|
29 |
|
30 | Out.TargetVelocity = 0; // setzt die Zielgeschwindigkeit auf 0 U/min (Standardeinheit)(mit Mapping, Zeile 5-9)
|
31 | //od_write(0x6042,0x00, 0); // setzt die Zielgeschwindigkeit auf 0 U/min (Standardeinheit)(ohne Mapping, Zeile 5-9)
|
32 |
|
33 | //3. Schritt: State maschine hochfahren, Eingang als "Freigabe" verwenden, Analogeingang auslesen
|
34 |
|
35 | Out.ControlWord = 0x6; // schaltet in den Zustand "enable voltage"
|
36 | do {
|
37 | yield(); // warten auf den nächsten Zyklus (1ms)
|
38 | }
|
39 | while ( (od_read(0x6041, 0x00) & 0xEF) != 0x21); // wartet bis der Zustand ist "enable voltage"
|
40 |
|
41 | // überprüft das Statusword (0x6041) auf die Bitmaske: xxxx xxxx x01x 0001
|
42 |
|
43 |
|
44 |
|
45 | while(true) // Endlosschleife
|
46 | {
|
47 |
|
48 | Out.TargetVelocity = In.AnalogInput;// Zielgeschwindigkeit = Analogwert (0-1023)
|
49 |
|
50 | if((In.Inputs & 0x10000) != 0) // Abfrage ob Eingang 1 nicht low ist
|
51 | {
|
52 | if (bEnabled == false) // und Motor läuft nicht
|
53 | {
|
54 | bEnabled = true; // dann starte Motor mit...
|
55 | Out.ControlWord = 0x7; // schaltet in den Zustand "switched on"
|
56 | do {
|
57 | yield(); // warten auf den nächsten Zyklus (1ms)
|
58 | }
|
59 | while ( (od_read(0x6041, 0x00) & 0xEF) != 0x23); // wartet bis der Zustand ist "switched on"
|
60 | // überprüft das Statusword (0x6041) auf die Bitmaske xxxx xxxx x01x 0011 // warten auf den nächsten Zyklus (1ms)
|
61 | Out.ControlWord = 0xF; // schaltet in den Zustand "enable operation" und startet den velocity mode
|
62 | do {
|
63 | yield(); // warten auf den nächsten Zyklus (1ms)
|
64 | }
|
65 | while ( (od_read(0x6041, 0x00) & 0xEF) != 0x27); // wartet bis der Zustand ist "operation enabled"
|
66 | // überprüft das Statusword (0x6041) auf die Bitmaske: xxxx xxxx x01x 0111 de
|
67 |
|
68 | }
|
69 | }
|
70 | else // wenn Eingang 1 low ist
|
71 | {
|
72 | if (bEnabled == true) // und Motor ist gestartet
|
73 | {
|
74 | bEnabled = false; // dann stoppe den Motor mit...
|
75 | Out.ControlWord = 0x6; // schaltet in den Zustand "enable voltage"
|
76 | do {
|
77 | yield(); // warten auf den nächsten Zyklus (1ms)
|
78 | }
|
79 | while ( (od_read(0x6041, 0x00) & 0xEF) != 0x21); // wartet bis der Zustand ist "enable voltage"
|
80 |
|
81 | // überprüft das Statusword (0x6041) auf die Bitmaske: xxxx xxxx x01x 0001
|
82 |
|
83 |
|
84 | }
|
85 | }
|
86 |
|
87 |
|
88 |
|
89 | yield(); // warten auf den nächsten Zyklus (1ms)
|
90 | }
|
91 |
|
92 | }
|