IF 'steigende Flanke' THEN 'send Byte'

sablitos

Level-1
Beiträge
30
Reaktionspunkte
1
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
 
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;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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.
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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?
 
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.
 
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;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@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
 
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.
 
@Larry Laffer : du hast recht, solche Programme lassen sich einfach und übersichtlich in Ablaufsprache programmieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... dann mach es doch in der SPS genauso ... eben halt wie von mir beschrieben.
Du kommst nur über diesen Trick (Schrittkette o.ä.) aus der zyklischen Programm-Bearbeitung heraus.
 
Zurück
Oben