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.
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.
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
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:
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?
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.
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?
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
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?
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.
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.
Klar, gibts glaube ich sogar mehr als einen Befehl für
Ich nehme z.B. den hier: settype($wertakt,„Integer“)
Musst aber oben dann auch das GetValueFloat entsprechend ändern
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.
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.
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: