Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Stringumwandlung ->Crash ->Hilfe! Kategorie: Programmierung (von Gordon Klimm - 8.02.2005 7:23)
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, CC2-Application-Board, eigenes Board, OSOPT V3.0
Hallo zusammen.

Ich bin kurz vorm Verzweifeln.
Wahrscheinlich sehe ich die Hand vor meinen Augen nicht und
bitte hier um Hilfe.

Ich schreibe momentan ein Programm zur Ansteuerung eines Pyrometers.

Dabei lese ich Strings über SWCOM ein und wandle diese in
eine Tabelle mit Zahlen um.
Bei dieser Aktion schmiert meine CC2 regelmä�ig ab und ich
finde nicht heraus woran es liegen könnte.

Kann mir jemand helfen?

Funktion, in der CC2 abschmiert (Erklärungen unten):

function UpdateTable(byte s[])
{
  // Definition for local variables
   int lI_Counter;
   int lI_Column;
  long lI_tempInt;
  long lL_temp1;
  long lL_temp2;
  long lLong1;

  long lL_x;
  long lL_y;
  long lL_z;

 float lF_dx;
 float lF_dy;
string debugout;

  // Initialization of local variables
  lLong1 = 0;
  lI_Column = 0;
  lL_temp1 = 0;

  // Work
     // Split the Line

/*/DEBUG1:
   hwcom.print2(s);
//ENDDEBUG */


  for lI_Counter=0 ...  <s[31]
  {
  if s[lI_Counter] == 0x2C // colon ","
  {
   if lI_Column == 0
   {
           lL_x = lL_temp1;
        }
   else// if lI_Column == 1
   {
    lL_y = lL_temp1;
   }
   lL_temp1 = 0;
   lI_Column = lI_Column + 1;
/*/DEBUG2:
   debugout = "X";
   str.putlong(debugout,lL_temp1);
   hwcom.print(debugout);
//ENDDEBUG */

   continue;
  }
  else if s[lI_Counter]<0x30 or s[lI_Counter]>0x39
  {
     // we do have a serious problem here !
   continue; //for now
  }
    else
    {
  lL_temp2 = lL_temp1 * ten;

/*/DEBUG3:
  debugout = "";
  str.putlong(debugout,lL_temp1);
  str.put(debugout,"#");
  str.putlong(debugout,lL_temp2);
  hwcom.print(debugout);
  hwcom.ret();
//ENDDEBUG */

  lL_temp1 = s[lI_Counter] - 0x30;
/*/DEBUG4:
  debugout = "";
  str.putlong(debugout,lL_temp1);
  hwcom.print(debugout);
  hwcom.ret();
//ENDDEBUG */

  lL_temp1 = lL_temp1 + lL_temp2;
/*/DEBUG5:
  debugout = "";
  str.putlong(debugout,lL_temp1);
  hwcom.print(debugout);
  hwcom.ret();
//ENDDEBUG */

    }
  }
  lL_z = lL_temp1;
  // cut here (->next theme)

  // we do have three values "lL_x", "lL_y" and "lL_z"

  if ( lL_x | lL_y | lL_z ) == 0
  {
         // "0,0,0" -> First set
  // Decide to rebuild the table
     gI_tabellenindex = 0;
    gI_tabellenindexUsed = 0;
  tabelle[0].L_offsX = 0;
  tabelle[0].L_offsY = 0;
  tabelle[0].L_m = 0;
  //add Current Value
  tabelle[gI_tabellenindex].L_x     = lL_x;
  tabelle[gI_tabellenindex].L_y     = lL_y;
  tabelle[gI_tabellenindex].L_sonst = lL_z;

   // tell the CNC, we cleared our curve
    gI_BitsToCNC = gI_BitsToCNC & !CNC_bCURVE;

  }
  else
  {
  lI_tempInt = gI_tabellenindex;                    //previous
  //update Index and recalc steepness
  gI_tabellenindex = gI_tabellenindex + 1;        //->actual
  // put the results into the desired shape
  //add Current Value
  tabelle[gI_tabellenindex].L_x     = lL_x;
  tabelle[gI_tabellenindex].L_y     = lL_y;
  tabelle[gI_tabellenindex].L_sonst = lL_z;
  tabelle[gI_tabellenindex].L_offsX = tabelle[lI_tempInt].L_x;
  tabelle[gI_tabellenindex].L_offsY = tabelle[lI_tempInt].L_y;
  // we do need "local_dx" and "local_dy", otherwise CC2 doesnot use Float for math :-(
  lF_dx = tabelle[gI_tabellenindex].L_x - tabelle[gI_tabellenindex].L_offsX;
  lF_dy = tabelle[gI_tabellenindex].L_y - tabelle[gI_tabellenindex].L_offsY;
     if (lF_dx == 0) lF_dx = 1; // prevent "DIV BY ZERO"
  tabelle[gI_tabellenindex].L_m = 10000 * lF_dy;
  tabelle[gI_tabellenindex].L_m = tabelle[gI_tabellenindex].L_m / lF_dx;
  }
/*/DEBUG6:
   debugout = "#"; //show me, where we are
   str.putlong(debugout,lL_x);
   hwcom.print(debugout);
   debugout = "*";
   str.putlong(debugout,lL_y);
   hwcom.print(debugout);
   debugout = "@";
   str.putint(debugout,gI_tabellenindex);
   hwcom.print(debugout);
   debugout = "$";
   str.putlong(debugout,tabelle[gI_tabellenindex].L_m);
   hwcom.print(debugout);
   hwcom.ret();
//ENDDEBUG */

   if gI_tabellenindex < 255 lI_tempInt = gI_tabellenindex + 1;
   else lI_tempInt = 255;

  //Define next (LAST) Value
  if (lL_x >= 9999989)    gI_BitsToCNC = gI_BitsToCNC | CNC_bCURVE;

     tabelle[lI_tempInt].L_x     = 9999990;
     tabelle[lI_tempInt].L_y     = 37;
     tabelle[lI_tempInt].L_sonst = 0;

//debug(2);

}


Erklärung:
Ich empfange bis zu 255 Triplets "123,234,3<cr>" über SWCOM.
Diese werden als string gespeichert und nach <cr> an die Funktion gegeben.
Dort sollen aus dem Text drei Zahlen erzeugt werden. (s.o.)
wenn ich die DEBUG-Zeilen aktiviere, sehe ich,
dass die CC2 irgendwann in DEBUG3 den ersten Faktor nicht
mehr kennt und mit Null multipliziert.
Kurz darauf ist alles zu spät und die CC2 läuft Amok.
Ich kann aber nicht ersehen warum das so ist.

Kann mir jemand helfen?

Herzlichen Dank,
Gordon.




    Antwort schreiben


Antworten:

Re: Stringumwandlung ->Crash ->Hilfe! (von André H. - 19.02.2005 10:07)