Forum: PC-Programmierung Dokumentation Statemachine


von Ma B. (drumstick)


Lesenswert?

Hallo

Ich befasse mich gerade damit, die Doku einer Statemachine zu studieren. 
Folgende Frage ist aufgetauch:

Die Statemachine hat einen Main State:  pwrup, run, stop

Der Machinestate run hat: runcw, runccw, stop

Die states von run sind eigentlich Substates vom Main State?? Und wird 
in einem separaten Zustandsdiagramm dokumentiert?

Und es handelt sich um eine Transduktoren SM? Moore oder Mealy, ich 
hoffe der Codeausschnitt reicht? Immer am Ende der Funktion wird der 
Status übergeben. Das Ganze läuft in einem Task.

Ich vermute es ist eine Mischung!

1
typedef enum  { eSMUImain_pwrup,    // enum State Machine User Interface Main Power Up   
2
                eSMUImain_stop,     // enum State Machine User Interface Main Stop       
3
                eSMUImain_run,      // enum State Machine User Interface Main Run        
4
                eSMUImain_cal       // enum State Machine User Interface Main Calibration
5
              }
6
        tSM_UI_main;
7
8
9
typedef enum  { eSMUIrun_stop,      // enum State Machine User Interface Run Stop                                   
10
                eSMUIrun_runCW,     // enum State Machine User Interface Run Run Clockwise                          
11
                eSMUIrun_runCCW,    // enum State Machine User Interface Run Run counter Clockwise                  
12
                eSMUIrun_runCDtoCW, // enum State Machine User Interface Run Run change Direction Clockwise         
13
                eSMUIrun_runCDtoCCW,// enum State Machine User Interface Run Run change Direction counter Clockwise 
14
              }
15
        tSM_UI_run;
16
17
18
typedef struct{ 
19
                tSM_UI_main main;   // Struct variable main from Type tSM_UI_main
20
                tSM_UI_run  run;    // Struct variable run from Type tSM_UI_run  
21
              }
22
        tSM_functions;              // Struct Identifier
23
24
25
// ---- private prototypes
26
27
tSM_functions SM_UI_exe(tSM_functions ms);
1
tSM_functions ms_main = {eSMUImain_pwrup, 
2
                         eSMUIrun_stop};
3
4
void functions_exe(BOOL pwrup)
5
{
6
  if(pwrup)
7
  {
8
    ms_main.main = eSMUImain_pwrup;
9
  }
10
11
  ms_main = SM_UI_exe(ms_main);
1
tSM_functions SM_UI_exe(tSM_functions ms)
2
{
3
4
  tSM_functions res = ms;
5
  switch(ms.main)
6
  {
7
    case eSMUImain_pwrup: {
8
                            BOOL cal_OK = true; //ToDo// get calibration status
9
10
                            if(cal_OK)
11
                            {
12
                              iMotDist_ppSave = 59685;
13
                              res.main = eSMUImain_run;
14
                            }
15
                            else
16
                            {
17
                              res.main = eSMUImain_cal;
18
                              cal_OK = true;
19
                            }
20
                          }
21
                          break;
22
23
    case eSMUImain_stop:                          // maybe redundant check later
24
                          res = res;
25
                          break;
26
27
    case eSMUImain_run:
28
                                                 
29
                          res = SM_UIrun_exe(ms);
30
                          break;
31
32
    case eSMUImain_cal:
33
34
                          res = SM_UIcal_exe(ms);      
35
36
                          break;
37
    default:   
38
                          res.main = eSMUImain_stop;
39
                          break;
40
41
   }
42
   return(res);
43
}

danke und gruss

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.