Hauptmenü

Telnet mit Wago 881

Begonnen von a.anhalter, 12. September 2013, 13:11:35

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

a.anhalter

Hallo,

ich möchte mit der Wago Telnet-Befehle an einen Server senden und habe dafür das Beispiel hier im Forum (http://www.oscat.de/community/index.php/topic,1755.msg9314.html#msg9314) genutzt (Telnet_Demo). Ich habe den Funktionsblock übernommen und rufe diesen aus einem ST-Programm auf.

Der Befehl wird auch übermittelt und der Empfangsbuffer füllt sich - aber leider nur einmal. Rufe ich den Funktionsblock ein zweites Mal auf, klappt dies nicht mehr. Woran könnte das liegen?

Der Aufruf sieht so aus, SZ_T1_4 ist ein Taster:

IF (SZ_T1_4=TRUE) THEN
mySEND_TELNET(
TEXT:= '15:bf:08:f8:61:aa play',
PORT:= 9090,
IP4:= 3232235876,
SEND:= TRUE,
READY=> MUSIC_READY,
ERROR=> MUSIC_ERROR,
DONE=> MUSIC_DONE);
END_IF;


Vielen Dank schon mal für die Antworten,
Carsten

peewit

du meinst wenn du den taster ein zweiten mal drückst passiert nichts ?

der baustein reagiert nur auf eine positive flanke bei "SEND"

du solltest prinzipiell ethernetbausteine nicht bedingt aufrufen
da auch vor dem senden und nach dem senden einiges passieren kann !!

also mysendtelnet zyklisch aufrufen
und  mySEND_TELNET.SEND = positive flanke von taster

a.anhalter

Hallo peewit,

Um genau zu sein, habe ich zwei Taster mit jeweils unterschiedlichem Text (einmal Play und einmal Stop). Ich habe SEND_Telnet testweise zweimal instanziiert und rufe jeweils einen wie oben angegeben auf. Das der Baustein eine positive Flanke benötigt, erklärt natürlich die nur einmalige Funktion - danke schon mal für diese Aufklärung.  :D

Ich fürchte allerdings, dass ich es noch nicht komplett kapiert habe. Wenn ich den FB zyklisch aufrufe, sende ich doch in jedem Zyklus den Text - so dachte ich zumindest bisher... Deshalb die IF-Bedingung.
Außerdem benötige ich letztendlich bis zu 20 verschiedene Texte, muss ich dann für jeden Text eine eigene Instanz erstellen, die ich dann jeweils über positive Flanke aufrufe?

Danke schon jetzt für Deine Geduld.   ;)

peewit

der baustein sendet nur wenn er am "SEND" einen signalwechsel von FALSE auf TRUE erkennt (positive flanke)
somit wird nur einmal versendet , also keine angst

1. du rufst den baustein zyklisch auf
2. du schreibst dir einen baustein der je nach ereignis einen anderen text dem mysendtelnet übergibt
3. dann gibst du ein "TRUE" auf send
4. dann wartest du auf READY,DONE,ERROR je nach dem.
5. dann nimmst GIBST DU FALSE AUF SEND
6. jetzt beginnst du wieder von vorne mit dem nächsten text

probiere das doch mal mit Steuern/variable online durch

du solltest nur mit einer instanz arbeiten, da es ansonsten zu problemen kommt, bzw. du unnötig resourcen verschwendest



a.anhalter

Ok. Hab es so gemacht und nun funktioniert es. Sehr gut. Vielen Dank!

Nur eine Frage hab ich noch:

Zitat4. dann wartest du auf READY,DONE,ERROR je nach dem.

Wie warte ich? Derzeit gebe ich direkt nach dem TRUE ein FALSE auf SEND.

peewit

soweit ich mich erinnere sollte es folgend sein

READY = TRUE     Baustein ist bereit für neues senden
DONE = TRUE      letzter SENDE Befehl wurde ohne Fehler beendet
ERROR <> 0        letzter Sende Befehl wurde mit einem Fehler beendet (also wurde nicht ausgeführt !)

somit kannst du erkennen wann du wieder was senden darfst, bzw. ob etwas erfolgreich oder nicht ausgeführt wurde


a.anhalter

Hallo peewit,

danke nochmal für Deine Hilfe!  :)
Ich hab es jetzt hinbekommen, allerdings fehlt mir noch ein wenig das Verständnis für die SPS-typische Programmierung. Die entspricht vom Verarbeitungsablauf ja nicht unbedingt "normalen" Programmiersprachen - da muss ich mich noch reinfuchsen.

Grüße,
Carsten

tomne

Hallo peewit,

besteht die Möglichkeit das oben genannte Demo nochmal online zu stellen?
(Telnet Client Wago SPS)

FG Tomne

peewit

hi

so genau weiss ich auch nicht mehr was es denn genau war, aber ich bin den postings gefolgt und dann bei

http://www.oscat.de/community/index.php/topic,1071.msg6404.html#msg6404

gelandet...

ob es etwas ist was dir hilft ......

ansonsten kannst du die user auch direkt anschreiben ....


tomne

Danke für deine schnelle Antwort, leider bringt mich der Link auch nicht weiter.

FG Tomne

peewit

warum

dort sind zwei bausteine zu finden (Telnet send) die du importieren musst

a.anhalter

#11
Hallo,

ich habe mir mittlerweile einen eigenen Baustein für die Auswertung der Taster gebaut. Hintergrund ist die Ansteuerung von Squeezeboxen mittels Wago.
Meinen Funktionsblock in ST hänge ich hier einmal ran. Achtung: Einige Sachen gehen noch nicht (aus 3 Playlisten auswählen z.B.), aus dem bisher vorhandenen kann man sich aber den Rest einfach zusammenbauen. Play, Stop, Lauter, Leiser oder Mute klappen jedenfalls.

Die Telnet-Funktion ist nicht von mir, weshalb ich nicht weiß, ob ich sie hier öffentlich stellen darf. Eventuell finde ich es auch noch - dann ergänze ich hier den Link. [EDIT] Hier ist der Link zum Telnet-Baustein. http://www.oscat.de/community/index.php/topic,1071.0.html[/EDIT]
Bitte nicht über die Syntax lästern - bin SPS-Anfänger. Bei Fragen - einfach fragen.

Zunächst die Deklaration der Variablen:

FUNCTION_BLOCK FB_Squeezebox
VAR_INPUT
mac: STRING(STRING_LENGTH);
list1: STRING(STRING_LENGTH);
list2: STRING(STRING_LENGTH);
list3: STRING(STRING_LENGTH);
xPlay: BOOL;
xStop: BOOL;
xNextPlayList: BOOL;
xLeiser: BOOL;
xLauter: BOOL;
xSetLeise: BOOL;
xSetLaut: BOOL;
xMute: BOOL;
bPlayStatus: BOOL;
sLeise: STRING;
sLaut: STRING;
sLoudnessStep: STRING;
END_VAR
VAR_OUTPUT
sToTelnet:STRING;
END_VAR
VAR
TP_Out: TP;
fbTelnet: FB_TelnetSend;
Merker_Play: BOOL;
sMessage: STRING;
sendMessage: BOOL;
Merker_List: BYTE;
END_VAR


Nun der eigentliche Code:


sendMessage := FALSE;

IF xPlay AND NOT Merker_Play THEN
sMessage := CONCAT (mac,' play');
sendMessage := TRUE;
ELSIF xPlay AND Merker_Play AND Merker_List = 1 THEN
sMessage := CONCAT (mac, ' playlist play ');
sMessage := CONCAT (sMessage, ' list1');
Merker_List := 2;
sendMessage := TRUE;
ELSIF xPlay AND Merker_Play AND Merker_List = 2 THEN
sMessage := CONCAT (mac, ' playlist play ');
sMessage := CONCAT (sMessage, ' list2');
Merker_List := 3;
sendMessage := TRUE;
ELSIF xPlay AND Merker_Play AND Merker_List = 3 THEN
sMessage := CONCAT (mac, ' playlist play ');
sMessage := CONCAT (sMessage, ' list3');
Merker_List := 1;
sendMessage := TRUE;
END_IF;

IF xStop THEN
sMessage := CONCAT (mac, ' stop');
sendMessage := TRUE;
Merker_Play := FALSE;
END_IF;

IF xLeiser THEN
sMessage := CONCAT (mac, ' mixer volume -');
sMessage := CONCAT (sMessage, sLoudnessStep);
sendMessage := TRUE;
END_IF;

IF xLauter THEN
sMessage := CONCAT (mac, ' mixer volume +');
sMessage := CONCAT (sMessage, sLoudnessStep);
sendMessage := TRUE;
END_IF;

IF xSetLeise THEN
sMessage := CONCAT (mac, ' mixer volume ');
sMessage := CONCAT (sMessage, sLeise);
sendMessage := TRUE;
END_IF;

IF xSetLaut THEN
sMessage := CONCAT (mac, ' mixer volume ');
sMessage := CONCAT (sMessage, sLaut);
sendMessage := TRUE;
END_IF;

IF xMute THEN
sMessage := CONCAT (mac, ' mixer volume 0');
sendMessage := TRUE;
END_IF;

TP_Out(IN := sendMessage, PT := T#20ms);

IF sendMessage THEN
fbTelnet(SendText:=sMessage, SendSend:=TP_Out.Q);
sToTelnet := sMessage;
END_IF;


Viele Grüße,
Anhalter

tomne

Vielen Dank,

es läuft bei mir nun auch  :).

FG Tomne