vmmcode.cpp


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
}