Velleman Analog Ausgang steuern

Hallo

Ich bräuchte dringend Hilfe zwecks Programmierung eines Analog-Ausganges meines Velleman-USB-Boards.
Ich möchte, das in einer Zeit von ca. 20 Minuten, einer der Analogausgänge den Wert 0 bis Wert 255 annimmt. Im Prinzip soll es eine Art Dimmer werden. Ich habe aber keinen Plan, wie das zu programmieren ist. Kann mir da jemand ansatzweise helfen? Ich wäre sehr dankbar dafür.

MfG
computerpap

Hallo,

was soll es genau machen, innerhalb der Zeit von 20 Minuten hochzählen ?

Wenn ja, würde ich eine Variable setzen mit der Zeit 0 und würde dann hochzählen lassen.

$Zeit = 200000 // 20 Minuten

for(i=0; i<$Zeit; i++)

und so weiter, passt jetzt nicht , nur so ein Gedanken Anstoss.

Was auch hilfreich ist…http://www.phpbox.de/

Hallo

Danke erstmal für die schnelle Antwort. Ja genau, innerhalb von 20 min soll praktisch hochgezählt bzw. heruntergezählt werden. Allerdings sind meine PHP-Kenntnisse noch sehr bescheiden. Ich hab mir die Doku mal angeschaut und den Befehl „VELLEMANUSB_OutputAnalogChannel…“ ausprobiert. Das hat auch alles gefunzt aber die Umsetzung den Wert zu erhöhen, daran scheiters bei mir! Werde mir mal den Link anschauen, vielleicht hilft er ja einen PHP-Anfänger.

MFG
computerpap

Hier hilft eventuell Code einstellen.

Hier sind so viele Profis unterwegs die mit Sicherheit gerne helfen, nur Hellsehen kann keiner :slight_smile:

Wenn ich wüßte, wie man das Problem angeht, würde ich auch Code einstellen, aber ich habe noch null Ahnung.
Folgende Gedanken habe ich mir gemacht:

VELLEUSB_OutputAnalogChannel(25302, 1, 0);
Wenn 0, dann +1

Ist
VELLEUSB_OutputAnalogChannel(25302, 1, 1);
Wenn 1, dann +1

Ist
VELLEUSB_OutputAnalogChannel(25302, 1, 2);
usw.

Nur wie man das in funktionierenden Code bringt, das weiß ich nicht.

MfG
computerpap

Wenn ich wüßte, wie man das Problem angeht, würde ich auch Code einstellen, aber ich habe noch null Ahnung.
Folgende Gedanken habe ich mir gemacht:

VELLEUSB_OutputAnalogChannel(25302, 1, 0);
Wenn 0, dann +1

Kenne das Board leider nicht.

Ich würde vom Programm und Gedanken erst mal wenn= IF und dann=else ersetzen.

Learning by doing, ist mein Motto. Aber ich denke Hilfe naht.

Google hilft auch viel.

Dann hilft auch die Programmstructur was Du genau machen willst.

Nicht hoch und runter, sondern mit was und wie soll das Ergebniss aussehen.

Ich wurde erst mal bestimmen wieviel Delta im board rein muss biss mann etwas seht/riecht/spurt. (wahrscheinlich logaritmisch)
Dieser Delta dann uber Zeit rausgeschmiert und dann die IPS strategie bestimmen. (script timer, timer-event, …)

Ich nehme mal an : ein sonnen-aufgang.
das hiesse im dunkeln spurt man viel, im klaren nicht so viel mehr.
da wurde V=255^(Zeit/20) ganz gut passen… mit Zeit = heutiger wert - vorheriger wert.
da hiesse:
minuten -> V (analoger ausgang)
1 -> 1
2-> 2
3 -> 2
4 -> 3
5 -> 4

10 -> 16
11 -> 21

15 -> 64
16 -> 84

18 -> 147
19 -> 193
20 -> 255

ScreenHunter_1.gif

Hi,

hier mal mein Vorschlag (auf die Schnelle):


//Script_Dimmen

$instanz = xxxxx; //hier die Instanznummer eintragen
$oldwert = GetValuFloat("Dimmwert");// alten Dimmwert holen
$wertebereich = 255; //kannst hier jederzeit den Wert anpassen ohne im Programmteil rumwühlen zu müssen
$zeitbereich = 20; //dito

//Berechnung Schrittweite pro Zeiteinheit
$schritt = $wertebereich / $zeitbereich; //also 255/20 = 12,75

//Werte setzen
$wertakt = $oldwert + $schritt; 
SetValueFloat = ("Dimmwert",$wertakt);
VELLEUSB_OutputAnalogChannel($instanz, 1, $wertakt);

Das Script könntest du dann z.B. von einem anderen Script aus anstossen welches alle 60 Sekunden den Befehl IPS_RunScript(„Script_Dimmen“) aufruft.

Das Script ist aus der Hüfte und nicht getestet. Es soll lediglich als Denkanstoss dienen :wink:

Gruß
Thomas

Hallo
Ich hab mich mal hingesetzt und nach den Motto von RWN „Learning by doing“ etwas zusammengeschrieben. Bevor Ihr über dieses Script schmunzelt, ich habe kaum Ahnung von PHP.
Also hier meine Zeilen:


$analog = (VELLEUSB_OutputAnalogChannel(25302, 1, 0));
if ($analog == true)
{
(VELLEUSB_OutputAnalogChannel(25302, 1, 5));
 }
 sleep (10);
 if ($analog == true)
{
(VELLEUSB_OutputAnalogChannel(25302, 1, 10));
 }
 sleep (10);
  if ($analog == true)
{
(VELLEUSB_OutputAnalogChannel(25302, 1, 15));
 }
 sleep (10);
  if ($analog == true)
{
(VELLEUSB_OutputAnalogChannel(25302, 1, 20));

usw.

Es funzt auch soweit, aber nach 180 Sekunden bekomme ich die Meldung „Maximum execution time of 180 seconds exeeded“.
Den Vorschlag von MRS-Junky hab ich noch nichtausprobiert, vielleicht ist das ja ein Lösungsansatz. Kann man die maximale Ausführungszeit von Scripts irgendwie erhöhen?

MfG
computerpap

Hallo Computerpap,

sicher kann man die Ausfuehrungszeit von PHP Scripts verlaengern, das macht aber in Deinem Fall nicht wirklich Sinn. Die Sleep Befehle sollten eigentlich tunlichst vermieden werden, wofuer sollen die eigentlich gut sein? Damit wuerdest Du unter Umstaenden spaeter bei weiteren Scripten dann Probleme bekommen.

Gruss Torro

Hallo Torro

Ich takte praktisch in 5er Schritten vor, also von 0 bis 255. Diese „Vortaktung“ soll in 20 Minuten erfolgen. Ich habe also 1200 Sekunden und 50 Schritte was zwischen jeden Schritt eine Pause von 24 Sekunden ergäbe. Ich halte nach jeden Schritt das Script um 24 Sekunden an, somit habe ich nach 20 Minuten den Wert 255 und damit volle 5V am Analogausgang (wenn nach 3Minuten nicht Schluß wäre). Hier im Beispielscript habe ich 10 Sekunden eingetragen.
Der „Sleep-Befehl“ wirkt sich doch nur auf dieses Script aus, ich kann doch andere Scripte trotzdem laufen lassen, oder täusche ich mich da?

Gruß
computerpap

Habe jetzt mal den Vorschlag von MSR_Junky ausprobiert, leider gibts da noch ein Problem.

//Script_Dimmen

$instanz = 25302; //hier die Instanznummer eintragen
$oldwert = GetValueFloat(„Dimmwert“);// alten Dimmwert holen
$wertebereich = 255; //kannst hier jederzeit den Wert anpassen ohne im Programmteil rumwühlen zu müssen
$zeitbereich = 20; //dito

//Berechnung Schrittweite pro Zeiteinheit
$schritt = $wertebereich / $zeitbereich; //also 255/20 = 12,75

//Werte setzen
$wertakt = $oldwert + $schritt;
SetValueFloat („Dimmwert“,$wertakt);
VELLEUSB_OutputAnalogChannel ($instanz, 1, $wertakt);

In der letzten Zeile ist die Variable $wertakt vom Typ Float, erwartet wird aber eine Variable von Typ Integer. Kann man die Variable entsprechend ändern?

Gruß
computerpap

Hallo computerpap,

reichen nicht auch 20 Schritte aus (also groessere Schrittweite)? Dann waere das ganze viel einfacher und effizienter zu implementieren.

Der Sleep Befehl wirkt sich zwar nur auf das Script aus, aber ueblicherweise laufen zu manchen Zeiten nicht nur ein Script, sondern viele. Und da kann es dann doch zu erheblichen Problemen kommen, wenn die Scriptqueue zu voll wird. Meistens ist es dann das Problem, dass Du einen Fehler hast, aber nicht so richtig weisst, wo der herkommt, tatsaechlich ruehrt er aus einer ziemlichen Zeitverzoegerung im Scripting her.

Gruss Torro

Größere Schrittweite dürfte nicht viel nützen, da die ganze Prozedur in 20Min ablaufen soll. Je weniger Schritte um so größer werden dann die „Sleepzeiten“. Bei 20 Schritten, hätte ich eine Sleepzeit von 60 Sekunden.

Gruß
computerpap

Hi,

Kann man die Variable entsprechend ändern?

Klar, gibts glaube ich sogar mehr als einen Befehl für :wink:
Ich nehme z.B. den hier: settype($wertakt,„Integer“)
Musst aber oben dann auch das GetValueFloat entsprechend ändern :wink:

Gruß
Thomas

Hallo,

nee, ich meine natuerlich ohne Sleepzeit. Also beispielsweise jede Minute ein Script aufrufen (geht ueber den Timer bspw.) und dieses liest dann aus einer Variablen den Istwert und die Richtung (runter, rauf) und schreibt den entsprechend geaenderten Wert zurueck. Das sind dann nur mikrosekunden, die fuer das Script benoetigt werden. Einzig die Schrittweite ist dann eben bei 20 Minuten 255/20.

Gruss Torro

So würe ich das auch machen. Ist nach meiner Empfindung wesentlich eleganter.

Hallo
Danke für die Tipps, habe mir schon gedacht, das ich nicht gerade eine elegante Art der Programmierung gewählt habe. Ich werd mal versuchen, ob ich den Vorschlag von MSR_Junky umsetzen kann. Ansonsten werd ich euren Vorschlag mit, mehreren Scripten nacheinander, versuchen umzusetzen. Ich meld mich wieder wenn ich zu Ergebnissen gekommen bin.

MfG
computerpap

Hallo

Das Problem ist Dank eurer super Hilfe gelöst. Ich habe den Vorschlag von
MSR_Junky umgesetzt. Zunächst das Script, welches ich zum starten des eigentlichen „Hauptscriptes“ geschrieben habe:


<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Start_Test-analog.ips.php
Trigger  :Timer Interval 1s
Interval : 
*/
$Dimmstufe = GetValueFloat("Dimmwert");//Dimmwert abfragen
$status = (VELLEUSB_ReadDigitalChannel(25302, 1));//Status Eingang 1 auf true abfragen
if (($status == true) and ($Dimmstufe < 255))//Bedingungen für nächste Zeile
{
IPS_RunScript ("Test_analog"); //Ausführen des Scripts, wenn Bedingungen erfüllt
}
?>

Wenn der Digitaleingang 1 am Vellemanboard true ist und der Dimmwert kleiner 255 ist startet das folgende Script:


<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Analog_Velle.ips.php
Trigger  :  Script "Start_Test-analog"
Interval :
*/
//Script_Dimmen

$instanz = 25302; //hier die Instanznummer eintragen
$oldwert = GetValueFloat("Dimmwert");// alten Dimmwert holen
$wertebereich = 255; //Maximalwert analog Ausgang
$zeitbereich = 1275; //Faktor für Zeitbereich

//Berechnung Schrittweite pro Zeiteinheit
$schritt = $wertebereich / $zeitbereich; //also 255/1275 = 0,20

//Werte setzen
$wertakt = $oldwert + $schritt;
SetValueFloat ("Dimmwert", $wertakt);
settype ($wertakt, "Integer");
VELLEUSB_OutputAnalogChannel ($instanz, 1, $wertakt);
?>

Mit einen Wert von 1275 als Zeitbereich, benötigt der Analog-Ausgang 1 eine Zeit von ca. 21 min bis er von 0-255 „aufgezogen“ hat.

Das Startscript wird jede Sekunde ausgeführt. Hat das eventuell Auswirkungen auf andere Scripts?
Nochmals vielen Dank für eure Hilfe.

MfG
computerpap