Interface in Schleife abfragen (war: Wie soll ich das machen)



  • hallo zusammen,
    hab' da mal so 'ne frage:
    Wie soll ich das machen, ich muss in meiner applikation immer werte von einem Profibus interface empfangen, also hab' ich gedacht ich schmeisse den funktionsaufruf in einen timer und gebe den wert welcher ich zurück kriege an eine globale variable zrück, etwa so:

    void __fastcall TMain_Frm::Timer1Timer(TObject *Sender)
    {
    
    if (Init_Btn->Enabled==false)
    {
      AnsiString test=Profi_p->ReadSlave(SlaveID_ED->Text.ToInt());
      if (test.SubString(5,1)!="0")
        {
        Memo1->Clear();
        Memo1->Lines->Add(test);
        Memo1->Lines->Add(StrToInt(("0x"+((test.SubString(17,5)).Delete(3,1)))) +" ...");
        int x = Tools::HexStringToShort((test.SubString(17,5)).Delete(3,1));
    
        Memo1->Lines->Add(x);
        ReceivedResult_int=x;
        }
    }
    
    }
    

    Den timer rufe ich alle 100ms auf und wenn ich den wqert irgendwo benutzen will, um zu verifizieren das alles richtig ist, steht da einfach immer 0 drinn 😞 :

    for (i=0; i<=100 && ReceivedResult_int!=Sollpos_ED->Text.ToInt(); i++)
         Sleep(100);
    

    Warum ist das so? Welche Alternative habe ich? Danke!

    Edit:
    Bitte aussagekräftige Überschriften wählen. Danke!



  • Tolle Problembeschreibung! 👍

    Das mit der HexToInt Umwandlung hast Du immer noch nicht gecheckt. Schaue mal in dem anderen Thread nach welchen Du deswegen geöffnet hast (StrToInt).

    Was macht eigentlich diese Funktion?

    Profi_p->ReadSlave(...);
    

    Und warum vergleichst Du hier den letzten Teil des Strings auf "0"?

    if (test.SubString(5,1)!="0")
    


  • F98 schrieb:

    Tolle Problembeschreibung! 👍

    Ironie? Falls ja, sag' mir doch, was du nicht verstanden hast.

    F98 schrieb:

    Das mit der HexToInt Umwandlung hast Du immer noch nicht gecheckt. Schaue mal in dem anderen Thread nach welchen Du deswegen geöffnet hast (StrToInt).

    Warum? Du weisst ja nicht was in dieser Funktion steht, die sieht nähmlich so aus:

    int Tools::HexStringToShort (AnsiString Hex_AS)
    {
    /*  int Shorti;
      std::istringstream Str(Hex_AS.c_str());
      Str >> std::hex >> Shorti;
      return Shorti;*/
      if (Hex_AS.SubString(1,2)!="0x")
          Hex_AS="0x"+Hex_AS;   // Wenn "0x" nicht gefunden, wird es eben davor gesetzt
       for (int i=3;i<=Hex_AS.Length();i++)
          if (!('F'>=Hex_AS.UpperCase()[i] && Hex_AS[i]>='0'))
             return -1;   // Wenn eines der Zeichen (nach "0x") ungültig ist, gibt die Funktion -1 zurück.
       return StrToInt(Hex_AS);   // Ansonsten den Int-Wert.
    
    }
    

    Ich weiss, HexStringToShort ist der falsche Name, müsste ToInt sein...

    F98 schrieb:

    Was macht eigentlich diese Funktion?

    Profi_p->ReadSlave(...);
    

    Und warum vergleichst Du hier den letzten Teil des Strings auf "0"?

    if (test.SubString(5,1)!="0")
    

    Die Funktion ReadSlave liest Daten die über den Profibus kommen aus dem Buffer des Profibus-Interfaces aus.

    Wenn an dieser Stelle eine 0 steht, muss ich das Ergebniss, welches zurückkommt nicht verarbeiten weil der Slave noch besäftigt war und kein gültiges Resultat liefern konnte.



  • Mal eine Frage so am Rande: Was schreibst du für ein Programm?

    EDIT: Achtung! 0x kann auch großgeschrieben werden (0X)! Bitte die erste if-Bedingung korrigieren! (Siehe anderer Beitrag).



  • Windoof schrieb:

    Mal eine Frage so am Rande: Was schreibst du für ein Programm?

    EDIT: Achtung! 0x kann auch großgeschrieben werden (0X)! Bitte die erste if-Bedingung korrigieren! (Siehe anderer Beitrag).

    Okay, Danke, if wurde angepasst.
    Ich muss eine Applikation für unsere Kunden schreiben, damit diese mit wenig Aufwand Profibus-Stellenantriebe (und später auch noch CAN-Bus) von uns konfigurieren können.



  • Ahja.



  • Windoof schrieb:

    Ahja.

    Jawoll! 😃

    und wie soll ich mein Problem jetzt lösen? Hat vielleicht dazu jemand eine Idee?



  • Von welchen Datentyp ist Profi_p ?



  • roN schrieb:

    for (i=0; i<=100 && ReceivedResult_int!=Sollpos_ED->Text.ToInt(); i++)
         Sleep(100);
    

    Warum ist das so? Welche Alternative habe ich? Danke!

    Vermutlich kommt der Timer solange Du in der Schleife bist niemals zum Zug?
    Verlagere doch die Überprüfung in den Timer und tue nur dann was, wenn ein gültiger
    Wert drin steht.

    Gruß,

    Alexander



  • Alexander Kempf schrieb:

    Vermutlich kommt der Timer solange Du in der Schleife bist niemals zum Zug?

    Hat der Timer eine so geringe Priorität?

    Die Überprüfung kann ich nicht in den Timer nehmen, da ich mehrere Parameter überprüfen muss und unendlich viele gültige Werte habe...

    Edit:
    Zitate bitte auf das Notwendigste beschränken. Danke!


  • Mod

    Hallo

    wie waere es mit

    void __fastcall TMain_Frm::Timer1Timer(TObject *Sender) 
    { 
    {
    Timer1->Enabled = false;
    .
    . Verarbeitung .....
    .
    .
    Timer1->Enabled = true;
    }
    

    MfG
    Klaus



  • roN schrieb:

    ...unendlich viele...

    Glaube ich nicht 😉
    Oder verwende halt einen zweiten Timer anstatt der for-Schleife.
    Ob das aber elegant ist?
    Oder erzeuge ein Event, sobald ein Wert ankommt.
    Du könntest auch alle Wert brav in einen Puffer reinschreiben und
    dann (z.B. per Timer) ständig den Pufferinhalt überprüfen und ggf.
    wieder leeren.

    Gruß,

    Alexander



  • roN schrieb:

    Warum? Du weisst ja nicht was in dieser Funktion steht, die sieht nähmlich so aus:[...]

    Junge, die Funktion hast Du ganz oben in Deinem Quellcode noch nicht verwendet und parralel zu diesem Thread existiert noch ein zweiter der von Dir eröffnet wurde zum Thema "HexToInt" und daraus habe ich meine Schlußfolgerung abgelitten ;).

    Die Funktion ReadSlave liest Daten die über den Profibus kommen aus dem Buffer des Profibus-Interfaces aus.

    Ist mir Schon klar. Aber ich wollte wissen, was für ein Variablentyp zurückgeliefert wird. INT oder HEX oder was?

    Edit:
    Zitate bitte auf das Notwendigste beschränken. Danke!



  • F98 schrieb:

    ...und daraus habe ich meine Schlußfolgerung abgelitten ;).

    Du tust mir leid.

    @roN: Wieso läuft das nicht im Timer? Bekommst du ne Fehlermeldung?



  • F98 schrieb:

    Ist mir Schon klar. Aber ich wollte wissen, was für ein Variablentyp zurückgeliefert wird. INT oder HEX oder was?

    einen AnsiString der " " Leerzeichen getrennte Bytes enthält, z.B. so: 20 00 01 3E B2 A1 00 usw....im gesamten sind es 12 Bytes wobei das erste kein Byte is, sondern 12 Bit



  • Windoof schrieb:

    @roN: Wieso läuft das nicht im Timer? Bekommst du ne Fehlermeldung?

    Nein, keine Fehlermeldung aber der Timer läuft irgendwie nie ab während der Pause (for-schleife)... 😞

    Edit:
    Zitate bitte auf das Notwendigste beschränken. Danke!


Log in to reply