-Menü

Beiträge anzeigen

Dieser Abschnitt erlaubt es Ihnen, alle Beiträge anzusehen, die von diesem Mitglied geschrieben wurden. Beachten Sie, dass Sie nur Beiträge sehen können, die in Teilen des Forums geschrieben wurden, auf die Sie aktuell Zugriff haben.

Beiträge anzeigen-Menü

Beiträge - a.anhalter

#1
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
#2
Codesys 2 / Re: Telnet mit Wago 881
17. September 2013, 11:46:07
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
#3
Codesys 2 / Re: Telnet mit Wago 881
12. September 2013, 20:36:53
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.
#4
Codesys 2 / Re: Telnet mit Wago 881
12. September 2013, 18:42:10
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.   ;)
#5
Codesys 2 / Telnet mit Wago 881
12. September 2013, 13:11:35
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