Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: IF 'steigende Flanke' THEN 'send Byte'

  1. #1
    Registriert seit
    27.06.2011
    Beiträge
    30
    Danke
    18
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    ich habe ein Funktionsblock zum senden und empfangen von bytes erstellt, der Baustein funktioniert wie folgend:

    array_Receive : ARRAY [0..21] OF BYTE;
    Array_send : ARRAY [0..21] OF BYTE;
    xSend : bool;

    Beim empfangen funktioniert gut, nur beim senden habe ich ein kleines Problem, manuel geht das so :
    (Beispiel : die klemme soll 'a' senden)
    1- Array_send[0] := 61;
    2- nun brauche ich eine steigende flanke von 'xSend', manuel geht und mit viso auch.
    ich will es aber wie folgend funktionieren :

    IF array_Receive[0]= 3 THEN
    Array_send[0]:= 50;
    xSend := TRUE ;
    ELSIF array_Receive[0] = 6 THEN
    Array_send[0]:= 55;
    xSend := TRUE ;
    ELSIF array_Receive[0] = 16 THEN
    Array_send[0]:= 60;
    xSend := TRUE ;
    ELSE
    xSend := FALSE ;
    END_IF


    Das problem ist, dass 'xSend' bleibt immer auf True, das heißt die klemme sendet nur beim ersten mal.
    brauche ich vielleicht eine Funktion die eine steigende Flanke bei jedem Aufruf erzeugt. z.B rising_edge(xSend) ??? oder gibt es eine einfache Lösung ???



    Vielen Dank für euere Hilfe
    Zitieren Zitieren IF 'steigende Flanke' THEN 'send Byte'  

  2. #2
    Registriert seit
    29.03.2004
    Beiträge
    5.735
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    Vielleicht einfach die Auswertung für das erneute Senden in eine Abfrage packen ob xSend noch aktiv ist?
    Code:
    if xSend = FALSE then
      ...
      ... Auswertung und ggf. neues Senden anstoßen
      ...
    Else
      xSend := FALSE;
    End_If;

  3. Folgender Benutzer sagt Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    sablitos (02.08.2011)

  4. #3
    Registriert seit
    27.06.2011
    Beiträge
    30
    Danke
    18
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hallo Thomas, Danke für die schnelle Antwort,

    ich habe auch deinen Hinweis probiert, dann passiert folgendes ( was ich auch erwartet) :

    wenn array_Receive[0] = 3 z.B dann sendet die klemme ständig eine Antwort, weil der variable 'xSend' ständig sein Zustand ändert.

  5. #4
    Registriert seit
    29.03.2004
    Beiträge
    5.735
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    Dann musst du dein Empfangs-Array entsprechend nullen, oder ein zusätzliches Bit auswerten wenn ein neues Empfangstelegramm eingetroffen ist. So ein Bit gibt es normalerweise immer irgendwo.

  6. Folgender Benutzer sagt Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    sablitos (02.08.2011)

  7. #5
    Registriert seit
    27.06.2011
    Beiträge
    30
    Danke
    18
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Genau das habe ich auch gemacht, nicht nur das empfnags-Array sondern auch das Send-Array habe ich bereinigt :

    IF array_Receive[0]= 3 THEN
    clear(Array_send); (*die clear funktion bereinigt das Array*)
    Array_send[0]:= 50;
    xSend := TRUE ;
    clear(array_Receive);
    else
    xSend := false ;
    end_if

    aber das mit dem 'zusätzlichem Bit' habe ich nicht ganz verstanden. wo soll ich das finden wenn ich alles selbst programmiert habe ???
    ich habe keine Library benutzt. Bytes empfangen habe ganz einfach so programmiert :

    CW.1 = SW.1 (* wobei CW und SW control- und status Wort sind*)
    das heißt wann immer die klemme was empfängt soll sie es speichern.

  8. #6
    Registriert seit
    29.03.2004
    Beiträge
    5.735
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    Hm, dazu kenne ich deine Anwendung nicht. So ein Bit "neue Daten empfangen" gibt es ja meistens bei irgendwelche Kommunikationsbausteinen.

    Aber wenn deine Klemme dir kontinuierlich ein Telegramm mit "schick mir 50" (array_Receive[0]= 3) sendet, warum solltest du dann nicht darauf genauso kontinuierlich antworten?

  9. #7
    Registriert seit
    27.06.2011
    Beiträge
    30
    Danke
    18
    Erhielt 1 Danke für 1 Beitrag

    Standard

    nochmal zu deinem hinweis :

    if xSend = FALSE then
    if array_Receive[0]= 3 then
    array_Send[0] := 50;
    xSend := true;
    Else
    xSend := FALSE;
    End_If;

    beim Empfangen von '3' (array_Receive[0]= 3 ) soll die klemme nur einmal antworten und warten auf einem neuen Befehl, deswegen tu ich :
    clear (array_Receive) nach jedem Antwort, also auch wenn der gleiche Befehl
    nochmal kommt soll die klemm auch nur einmal antworten.
    Das tut sie hier in diesem Fall nicht, die klemme sendet kontinuierlich was im Ausgangsbuffer steht. die Lösung für das Problem wäre so :
    1-array_Send := ***
    2-xSend soll für kurze Zeit auf 1 gestzt dann zurückgesetzt auf null.

    ich weiss aber nicht wie ich das realisieren kann.

  10. #8
    Registriert seit
    29.03.2004
    Beiträge
    5.735
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    Dann müsstest du dir den vorigen Wert von array_Receive[0] speichern.

    Mal angenommen array_Receive[0] könnte man als Befehl ansehen:
    Code:
    Befehl_aktuell := array_Receive[0];
    
    if xSend = FALSE then
      if Befehl_aktuell <> Befehl_alt Then (* es ist ein neuer Befehl gekommen *)
     ..
     ..
     End_If
    Else
      xSend := FALSE;
    End_If
    
    Befehl_alt := Befehl_aktuell;

  11. Folgender Benutzer sagt Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    sablitos (02.08.2011)

  12. #9
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.718
    Danke
    398
    Erhielt 2.400 Danke für 2.000 Beiträge

    Standard

    @TE:
    wenn du eine Sequenz erzeugen willst ... warum programmierst du dir dann nicht einen Ablauf - also eine Schrittkette. Diese wird dann nur weitergeschaltet wenn die entsprechende Vor-Bedingung erfüllt ist. So kannst du dann auch die entsprechenden DONE's richtig mit einbeziehen.

    Gruß
    Larry

  13. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    sablitos (02.08.2011)

  14. #10
    Registriert seit
    27.06.2011
    Beiträge
    30
    Danke
    18
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Dankeschön für deine Hilfe, das funktioniert schon, es gibt aber ein kleines Problem, es kann sein das der gleiche Befehl zwei mal hintereinander kommen, in diesem Fall wird die klemme nur beim ersten mal reagieren.

    Danke auf jeden Fall.

Ähnliche Themen

  1. DB Send
    Von xymoro im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 13.04.2011, 20:18
  2. Wie kann man Hi-Byte Low-Byte spiegeln?
    Von Klärmolch im Forum Simatic
    Antworten: 23
    Letzter Beitrag: 11.12.2010, 20:58
  3. steigende/fallende Flanke unter CoDeSys 2.3.9 ???
    Von Jumpinjack im Forum CODESYS und IEC61131
    Antworten: 1
    Letzter Beitrag: 27.08.2010, 09:18
  4. Umwandeln von INT nach Byte u Byte + n
    Von Gerold im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 07.04.2009, 10:07
  5. Antworten: 4
    Letzter Beitrag: 08.07.2008, 08:52

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •