Array überprüfen[C-Syntax]

Metman

Grünschnabel
Hi Leute,

ich hab ein Programm das mir jeweils zwei Werte aus einem CAN Signal herausliest, daraus die Differenz bildet und die Steigung berechnet.

Nur wenn ich die Messung starte und das Signal bei, sagen wir 70 liegt, vergleicht er auch dieses Signal mit dem Wert 0 und errechnet dementsprechend die Steigung.

Das soll er nicht tun

Code:
/*@@var:*/
variables {
byte fp_posi[2];
int delta_posi;
int m;
double delta_t = 0.05; //abtastfrequenz 20 Hz

  message 0x0c000003x TSC1_TE = {
  DLC = 8,
  DIR = TX,
  byte(0) = 0x00,
  byte(1) = 0xFF,
  byte(2) = 0xFF,
  byte(3) = 0xFF,
  byte(4) = 0xFF,
  byte(5) = 0xFF,
  byte(6) = 0xFF,
  byte(7) = 0xFF
  };   
   message 0xCF00300x EEC2 = {
  DLC = 8,
  DIR = TX,
  byte(0) = 0xFF,
  byte(1) = 0xFF,
  byte(2) = 0xFF,
  byte(3) = 0xFF,
  byte(4) = 0xFF,
  byte(5) = 0xFF,
  byte(6) = 0xFF,
  byte(7) = 0xFF
  };     
}
/*@@end*/

/*@@msg:test::EEC2 (0xCF00300X):*/
on message EEC2
{
	
	fp_posi[1] = fp_posi[0]; 

    EEC2.byte(0) = this.byte(0);
    EEC2.byte(1) = this.byte(1);
    EEC2.byte(2) = this.byte(2);
    EEC2.byte(3) = this.byte(3);
    EEC2.byte(4) = this.byte(4);
    EEC2.byte(5) = this.byte(5);
    EEC2.byte(6) = this.byte(6);
    EEC2.byte(7) = this.byte(7);

	fp_posi[0] = this.byte(1) * 0.4; // Das is der erste Wert
	
		delta_posi = fp_posi[0]-fp_posi[1]; // Differenz
	
		m = ((delta_posi ) / (delta_t) ); // Steigung
	//	       delta_fp_posi
	// Steigung m = -------------------					 //                         0.05
	if (m > 200)
	{
	   write("Steigung ist gleich %d",m);
	}
	else if (m < -200)
	{
	   write("Steigung ist gleich %d",m);
	}
}
/*@@end*/

/*@@caplFunc:speedcontrol():*///function
void speedcontrol (void)
{
}
/*@@end*/

/*@@msg:test::TSC1_TE (0xC000003X):*/
on message TSC1_TE
{
}
/*@@end*/

/*@@startStart:Start:*/
on start
{

}
/*@@end*/

/*@@end*/

Mir wurde zwar etwas von inkrement oder so gesagt aber ich komm auf keinen grünen Zweig.
Jemand ne Ahnung wie ich die Abfrage am Anfang übergehe (ohne Delay).

GRuß
metman
 
Da das ja offensichtlich nicht wirklich C ist sondern nur innerhalb der Funktionen C-Syntax verwendet wird, könntest Du den Quellcode, den Du gepostet hast vielleicht etwas kommentieren?
Was ist EEC2 und was ist this? Wozu die Kopieraktion am Beginn der Funktion?
Sind die einzelnen Bytes in der Nachricht einzelne Meßwerte im Abstand von 50ms oder ist jede Nachricht ein Meßwert und die Nachrichten konnen in 50ms-Abständen?
Liegt der erste Maeßwert nicht in this.byte(0), wenn this die aktuelle CAN-Botschaft ist?

Vielleicht hilft Dir das ja schon weiter:

Code:
 bool bStart = false;
on message EEC2
{
  ...
  int iIndex = 0;
  if(bStart)
  {
    fp_posi[0] = this.byte(iIndex) * 0.4; // Das is der erste Wert
    iIndex++;
    bStart = false;
  }
    
  while(iIndex < 8)
  {
    fp_posi[1] = this.byte(iIndex);
    delta_posi = fp_posi[0]-fp_posi[1]; // Differenz
        m = ((delta_posi ) / (delta_t) ); // Steigung
    if (m > 200)
    {
      write("Steigung ist gleich %d",m);
    }
      else if (m < -200)
    {
      write("Steigung ist gleich %d",m);
    }
    fp_posi[1] = fp_posi[0];
    iIndex++;
  }
}
 
Hi, sorry das ich erst jetzt schreibe, stressiges Wochenende ;)

Da das ja offensichtlich nicht wirklich C ist sondern nur innerhalb der Funktionen C-Syntax verwendet wird, könntest Du den Quellcode, den Du gepostet hast vielleicht etwas kommentieren?

Was ist EEC2 und was ist this?
EEC2 is die Botschaft Electronic engine controller #2.

EEC2.byte(1) = this.byte(1); is nur ne Deklaration damit ich das EEC2 nicht immer eintippen muss, ginge auch ohne this.

fp_posi[0] = this.byte(1) * 0.4; hier sag ich, das mein erster array wert byte 1 ist (laut SAE Norm is das das Byte für das Fahrpedal) und 0,4 der Faktor ist.

Wozu die Kopieraktion am Beginn der Funktion?
fp_posi[1] = fp_posi[0];
meinst du das? Einfach damit ich immer zwei werte vergleichen kann, sprich den ersten wert bei t=0ms und dann den zweiten wert bei t=50ms usw.
Ich brauch immer zwei Werte damit ich die Steigung (Gradienten) bestimmen kann. das Problem ist ja nur, das er am Anfang der MEssung nicht den ersten sondern den zweiten wert nehmen soll und dann normal weitermachen soll.

Sind die einzelnen Bytes in der Nachricht einzelne Meßwerte im Abstand von 50ms oder ist jede Nachricht ein Meßwert und die Nachrichten konnen in 50ms-Abständen?
Bytes sind Botschaften. Es kann auch vorkommen das in einem Byte mehrere Signale enthalten sein können, die sind dann Bits.
Die Fahrpedalposition is auf Byte 1(alle 8 Bits) und läuft mit 20Hz (50ms). Die Motordrehzahl is glaub ich 2 Bytes groß ;) . Es gibt auch Signale die mit 10ms laufen, je nachdem wie sie in der SAE J1939 genormt sind.

Liegt der erste Maeßwert nicht in this.byte(0), wenn this die aktuelle CAN-Botschaft ist?
nein, siehe oben. Is nur ne Deklaration. Byte(0) ist Status EEC2, ist unwichtig. Mir gehts nur um das Signal im Byte(1).

Also ich werde das morgen mal testen mit deinem Quellcode. Poste es hier dann rein. Wenn du noch etwaige Tipps hast, wäre ich dankbar.

best regards
 
Mir gehts nur um das Signal im Byte(1).
Dann muß der Code etwas anders aussehen:
Code:
  bool bStart = false;
on message EEC2
{
  ...
  if(bStart)
  {
    fp_posi[0] = this.byte(1) * 0.4; // Das is der erste Meßwert, wird nur gespeichert
    bStart = false;
  }
  else
  {
    fp_posi[1] = this.byte(1) * 0.4;  // aktuellen Meßwert in fp_posi[1]
    delta_posi = fp_posi[0]-fp_posi[1]; // Differenz
    m = ((delta_posi ) / (delta_t) ); // Steigung
    if (m > 200)
    {
      write("Steigung ist gleich %d",m);
    }
      else if (m < -200)
    {
      write("Steigung ist gleich %d",m);
    }
    fp_posi[1] = fp_posi[0];  //aktuellen Meßwert in fp_posi[0] für nächsten Durchlauf
  }
}
Beim Start jeder Meßreihe wird bStart auf true gesetzt. Der erste Meßwert wird gesichert und bStart auf false gesetzt. Alle folgenden Meßwerte der Meßreihe werden im else-Zweig behandelt. Sie werden in das 2. Array-Element gespeichert, dann wird die Differenz und die Steigung berechnet, mit der Du dann machen kannst, was immer Du willst. Danach wird der aktuelle Meßwert im 1. Array-Element für den nächsten Durchlauf gesichert.
 
Zurück