Ich ging davon aus, dass der Quellpfad inklusive der Datei sein muss.
Das ist erforderlich, wenn nur eine Einzeldatei kopiert werden soll.
Ich ging davon aus, dass der Quellpfad inklusive der Datei sein muss.
Das ist erforderlich, wenn nur eine Einzeldatei kopiert werden soll.
ZitatIch habe viele Versuche unternommen um das Array an deine Funktion zu übergeben.
Das geht nicht. Die Funktion verlangt als Parameter Quellpfad und Zielpfad. Die Dateien aus dem Quellpfad werden dann in der Funktion in ein Array eingelesen und verarbeitet.
Danke, mit der SciTE Version klappt es. 👍
Ich habe hier einen PC, an dem ich nichts installieren kann. Daher probiere ich erstmals AutoIt portabel zu nutzen.
Ich habe eine externe Festplatte mit Portable Apps erstellt. In der Struktur sieht das so aus:
Portabel\
.\Documents\
.\Scripts\
.\au3
.\lua
.\PortableApps
.\AutoIt_v3 **https://www.autoitscript.com/cgi-bin/getfile.pl?autoit3/autoit-v3.zip <-- entpackt
.\AutoIt_v3\SciTE <-- die Lite Version ersetzt durch Kopie von einer installierten Vollversion
.\Start.exe
Da PortableApps nur Ordner im Hauptverzeichnis scannt, wird SciTE.exe nicht gefunden - habe mir also eine SciTEStart.exe geschrieben, die mit im AutoIt Ordner liegt.
Soweit klappt auch das meiste. Ich kann Skripte schreiben und kompilieren. Autovervollständigung jedoch nicht. Das Kürzel wird eingefärbt, aber nach dem Leerzeichen wird nicht vervollständigt.
Auch DebugToConsole schlägt fehl: Lua: error checking global scope for command 'InvokeTool AutoItTools.DebugConsoleWriteAdd'
Das Einbinden von Lua Komponenten schlägt hier irgendwie fehl. Auch meine Lua Skripte z.B. zum Edging, werden geladen, aber es erfolgt keine Reaktion im Editor. ![]()
Hat jemand all das bereits funktionierend portabel umgesetzt?
ConsoleWrite(_Until_10_Param('Bla', 'Blub', 'Blob') & @CRLF)
Func _Until_10_Param($_1, $_2=Null, $_3=Null, $_4=Null, $_5=Null, $_6=Null, $_7=Null, $_8=Null, $_9=Null, $_0=Null) ; min. 1 parameter
Local $aParam[] = [$_1, $_2, $_3, $_4, $_5, $_6, $_7, $_8, $_9, $_0]
Local $aParamStr[] = ['$_1', '$_2', '$_3', '$_4', '$_5', '$_6', '$_7', '$_8', '$_9', '$_0']
Local $sOut = 'Func: _Until_10_Param' & @CRLF & '$_1: ' & $_1 & @CRLF
For $i = 1 To UBound($aParam) -1
If $aParam[$i] = Null Then ExitLoop
$sOut &= $aParamStr[$i] & ': ' & $aParam[$i] & @CRLF
Next
Return $sOut
EndFunc
Alles anzeigen
EDIT:
Manche Funktionen gestaltet man ja auch mit einem Leerstring als Vorbelegung für eine Variable, aber es folgen trotzdem noch besetzte Parameter. Deshalb verwende ich für echte leere Variablen die Vorbelegung: NULL.
Du möchtest den Aufruf parsen? Also als Ergebnis in etwa:
>> Funktion: _EineFunc
>> Param_1: "Bla"
>> Param_2: "Blub"
Soll das in SciTE passieren oder im kompilierten Skript?
Ich wollte eine Methode haben, um das Ergebnis einer Eingabeprüfung durch farbliche Markierung hervorzuheben, bzw. Felder zu markieren in der Reihenfolge, wie sie genutzt werden sollen. Die Zuweisung zu einem Ctrl sollte möglichst einfach sein, aber eine Bindung zu einem Ctrl nicht zwingend. Entschieden habe ich mich für einen Rahmen als Kollektion von 4 Labeln. Der Rahmen verfügt über eine fixe Farbe und eine veränderlich Nachrichtenfarbe. Zwischen den Farben kann gewechselt werden. Gespeichert wird alles in einer Map, die bei der Erstellung zurückgegeben wird.
Ausführliche Details, wie immer, in den Funktionsheadern.
_GuiCtrlFrame_Create Erstellt ein Rahmen-Ctrl in der angegebenen Farbe und Strichstärke.
_GuiCtrlFrame_SetColor Setzt die Nachrichtenfarbe oder wechselt zwischen .color und .colorMsg.
_GuiCtrlFrame_SetThickness Setzt eine neue Strichstärke für einen Rahmen.
_GuiCtrlFrame_Show Zeigt oder versteckt einen Rahmen.
_GuiCtrlFrame_AssignID Weist einen Rahmen einem Ctrl zu oder demselben Ctrl nachdem dieses verschoben wurde
oder löscht den Rahmen.
Die UDF und ein kleines Bsp.-Skript findet ihr im Anhang.
Hmm,
Alina: Ich habe eine DB erstellt, habe ich das richtig gemacht? (konkrete Frage zu einem DB Thema)
Peter so: Ich nehme statt DB Textdateien.
Mich stören deine Einlassungen nicht und du kannst das gern handhaben, wie du möchtest. Es war einfach nur eine Antwort am Thema vorbei.
Hätte Alina nach Möglichkeiten zur Datenorganisation gefragt, wäre ich voll bei dir, dass man ggf. auch andere Lösungen ins Auge fassen kann.
Ansonsten liebe Foristen: Contenance. ![]()
Ich weiß nicht, wie das bei Fronius ist. Allgemein hat man doch aber problemlos im lokalen Netz Zugang zu den Daten.
Mal als Idee: Wie wärs da mit einem eigenen Mini Web-Server (Arduino), da kannst du den Zugang nach eigenem Gusto regeln.
Mal noch als Tipp:
Um nicht zu Überschneidungen im zeitlichen Ablauf der Adlib-Funktion zu kommen habe ich mir angewöhnt, beim Eintritt in die Adlib-Funktion diese zuerst mit AdlibUnregister vor einem erneuten Aufruf während der Abarbeitung zu schützen. Am Ende der Funktion aktiviere ich dann wieder AdlibRegister .
OK, konnte es anders lösen:
Die Anwendungen selbst sind alle an einheitlichen Speicherorten. Die Pfade zu den (möglicherweise individuell angelegten) Datenspeicherorten sind in \AppData\Local\ANWENDUNG\data hinterlegt. Damit kann ich alles problemlos auslesen und auch vereinheitlichen.
Danke für eure Mühe.
Ja, das hatte ich schon so geplant, dass "BugFix" nur mit "@Username" ersetzt wird, wenn "\users\" davor steht. Die Abhängigkeiten von Makros zu bestimmten Pfadkonstellationen muss ich natürlich gegenprüfen.
Ich erstelle eine Auflistung aller in unserer Firma (an allen Standorten) genutzten, messaparaturspezifischen Daten (Kalibrierdaten, Definitionsdateien etc.). Ziel ist, dass alle Apparaturen und Meßgeräte mit ihren Definitions- und Kalibrierdaten auf jedem Meßfahrzeug-PC hinterlegt sind, um im Bedarfsfall ohne Einrichtungsaufwand Apparaturen und Meßgeräte tauschen zu können.
Der Titel ist vielleicht etwas verwirrend. Hier im Detail:
Ich möchte auf verschiedenen Rechnern Pfade, die von Anwendungen genutzt werden (öffnen, speichern, template, etc.) auslesen (FileOpenDialog). Den Pfad möchte ich aber nun allgemeingültig in einer Übersicht mit Makros ablegen. Also aus "C:\users\bugfix" wird "C:\users\@UserName".
Mein Ansatz wäre jetzt:
Oder gibt es eine andere Möglichkeit?
Hi,
bin erst jetzt wieder dazu gekommen. Erst mal Danke für die Tipps.
Ich muss zugeben, ich war etwas faul und hatte mir den Sketch KI'en lassen. ![]()
Die KI mochte es aber nur kompliziert und kann natürlich (ebenso wie Wokwi) nicht mit LOW-Ansteuerung für die Relais umgehen. Ein reiner Austausch von HIGH und LOW bringt da wenig.
Nun habe ich meine Faulheit überwunden und mich mal an eigenen Code gemacht. ![]()
Funktioniert so, wie gewollt:
const int relayPins[] = {2, 3, 4}; // Pin-Nummern für die Relais
const int buttonPin = 5 ; // Taster zum Durchschalten der Relais
const int relayCount = 3; // Anzahl der Relais
const unsigned long onTime = 5000; // Einschaltdauer in Millisekunden, 5 Sekunden im Test
bool relayActive = false; // Irgendein Relais aktiv
int curRelayIndex = -1; // Array-Index des aktiven Relais (0 - 2; -1 wenn keins aktiv)
int prevRelayIndex = -1; // Array-Index des zuletzt aktiven Relais (0 - 2; -1 wenn zuletzt keins aktiv)
unsigned long lastButtonTime = 0; // Zeitpunkt des letzten Buttondrucks
void setup() {
for (int i = 0; i < relayCount; i++) {
pinMode(relayPins[i], OUTPUT); // Pins für Relaisansteuerung definieren
digitalWrite(relayPins[i], HIGH); // Relaispins HIGH setzen = Relais OFF
}
pinMode(buttonPin, INPUT_PULLUP); // Taster mit internem Pull-Up Widerstand
}
void loop() {
if (lastButtonTime != 0) {
if (millis() - lastButtonTime >= onTime) { // Es ist ein Relais aktiv und die Zeit ist abgelaufen
digitalWrite(relayPins[prevRelayIndex], HIGH); // letztes aktives Relais OFF
resetVars(); // alles auf Anfang
}
}
int reading = digitalRead(buttonPin); // Abfrage, ob Button gedrückt
if (reading == 0) { // Taster wurde betätigt
// das erste/nächste Relais wird aktiviert (wenn das aktive das letzte: alle OFF)
setNextRelay(); // Index des nächsten Relais setzen (curRelayIndex)
if (relayActive) { // ist ein Relais aktiv?
digitalWrite(relayPins[prevRelayIndex], HIGH); // aktives Relais OFF
if (curRelayIndex == -1) {
resetVars(); // alles auf Anfang
} else {
activateCurRelay(); // nächstes Relais ON, lastButtonTime u. prevRelayIndex setzen
}
} else { // kein Relais aktiv
activateCurRelay(); // nächstes (erstes) Relais ON, lastButtonTime u. prevRelayIndex setzen
}
}
delay(100);
}
void activateCurRelay() {
/*
* hier zusätzlicher Code während Relaisaktivität, z.B. externe LED
*/
digitalWrite(relayPins[curRelayIndex], LOW);
prevRelayIndex = curRelayIndex;
lastButtonTime = millis();
relayActive = true;
}
void setNextRelay() {
if (!relayActive) { // wenn kein Relais aktiv, nächstes ist Index 0
curRelayIndex = 0;
} else { // wenn ein Relais aktiv
curRelayIndex += 1;
if (curRelayIndex == relayCount) { // wenn letztes Relais bereits aktiv
curRelayIndex = -1;
}
}
}
void resetVars() {
curRelayIndex = -1;
prevRelayIndex = -1;
lastButtonTime = 0;
relayActive = false;
}
Alles anzeigen
Hi,
nach Jahren
will ich nun endlich meine Steuerungen an den Arduino übergeben. Für den Anfang erst mal nur den Lüfter.
Testprozedere:
- Arduino Nano
- Elegoo 4 Kanal 5V Relais Modul
- Taster
Mit dem Taster wird bei jedem Druck das erste/nächste Relais aktiviert. Bei erneutem Tastendruck wird das evtl. bereits aktivierte Relais deaktiviert und das folgende aktiviert. Das aktive Relais bleibt dann für eine fixe Zeit (im Test 1 Minute) aktiv.
Mangels Taster habe ich hierfür die beiden grünen gekreuzten Drähte genommen. Leider tut sich nichts. Gebe ich auf die IN-Kontakte des Relais Moduls direkt GND, zieht das entsprechende Relais.
Wo liegt mein Fehler? Pulldown habe ich 10k genommen, sollte völlig ausreichen.
EDIT: Der Sketch fehlt ja noch:
const int relayPins[] = {2, 3, 4}; // Relais Pins
const int buttonPin = 5 ; // Taster Pin
const int relayCount = 3; // Anzahl der Relais
const unsigned long onTime = 60000; // Einschaltdauer in Millisekunden (1 Minute)
int currentRelay = 0;
unsigned long lastDebounceTime = 0;
int lastButtonState = LOW;
bool relayActive = false;
unsigned long relayStartTime = 0;
void setup() {
for (int i = 0; i < relayCount; i++) {
pinMode(relayPins[i], OUTPUT);
digitalWrite(relayPins[i], LOW); // Relais zu Beginn ausschalten
}
pinMode(buttonPin, INPUT_PULLUP); // Taster mit internem Pull-Up Widerstand
}
void loop() {
int reading = digitalRead(buttonPin);
// Entprellung des Tasters
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > 50) {
if (reading == LOW && lastButtonState == HIGH) { // Nur bei steigender Flanke
// Taster wurde gedrückt
toggleRelay();
}
}
lastButtonState = reading;
// Überprüfen, ob ein Relais aktiv ist und die Einschaltdauer abgelaufen ist
if (relayActive && (millis() - relayStartTime) >= onTime) {
deactivateRelay(currentRelay);
relayActive = false;
}
}
void toggleRelay() {
// Aktuelles Relais deaktivieren
if (relayActive) {
deactivateRelay(currentRelay);
relayActive = false;
}
// Nächstes Relais aktivieren
currentRelay = (currentRelay + 1) % relayCount;
activateRelay(currentRelay);
relayActive = true;
relayStartTime = millis();
}
void activateRelay(int relayIndex) {
digitalWrite(relayPins[relayIndex], HIGH);
// zusätzliche Aktionen ausführen, wenn ein Relais aktiviert wird
}
void deactivateRelay(int relayIndex) {
digitalWrite(relayPins[relayIndex], LOW);
// zusätzliche Aktionen ausführen, wenn ein Relais deaktiviert wird
}
Alles anzeigen
Also erst mal Danke für die Tips.
dann setzte alle anderen Netzwerke außer Starlink als getaktete Netzwerke.
Diese Option ist bei Android nicht vorhanden.
Du kannst auch das WLAN der Fritzbox als Repeater für das Starlink WLAN konfigurieren.
Ich benötige die alte Internetverbindung noch für meine Telefonie. Die DECT Telefone nutzen die DSL Verbindung der Fritz.Box. Ich schaue mich derzeit nach preislich interessanten SIP Anbietern um, dann kann die alte Internetverbindung weg.
Du solltest jedoch in deinen Wifi Einstellungen von der jeweiligen SSID den Haken "automatisch erneut verbinden" raus nehmen
Mein Smartphone hat diese Einstellung nicht. Speichere ich das Kennwort, wird auch automatisch neu verbunden. Alternativ müsste also bei jedem Verbinden das Passwort händisch eingegeben werden.
Warum hatte ich das alte WLAN noch? - Auf die SSID war mein TV Stick registriert. Und ich wollte erst mal testen, ob ich überall im Haus Starlink ordentlich empfangen kann, bevor ich die Registrierung umswitche. Ich habe inzwischen noch einen TPLink gefunden und als Accesspoint für das Erdgeschoß an den Starlink gehängt (Ich hatte bei der Renovierung 2 Patchdosen zwischen Erd- und Obergeschoß verbaut, konnte ich hier gut nutzen). Der nutzt dieselbe SSID, wie der Starlink, sodass ich jetzt auch den TV Stick darauf registrieren konnte.
Es funktioniert jetzt also Alles, wie gewollt. 👍🏻
Bin übrigens erstaunt, was für eine Sendeleistung der TPLink hat. Ist solch Teil für die Reise, 6x6x2 cm. Im Garten, 10 m entfernt, habe ich trotz 40 cm Mauerwerk noch vollen WLAN Empfang. 🤓
Hi,
mein Smartphone priorisiert WLAN nach der Sendeleistung des WLAN. Es wechselt dann automatisch in das mit der besten Sendeleistung, manchmal dann auch zu Mobildaten.
Nur sagt die Sendeleistung nichts über die Qualität des Netzes dahinter aus. Meine Fritz.Box strahlt horizontal und vertikal kräftig aus und steht im ganzen Haus mit Signalqualität "sehr gut" zur Verfügung. Leider hat der Anschluss nur eine räudige DL-Quote von ca. 8 Mbit.
Da hier vielleicht in einem oder 2 Jahren mal Glasfaseranschluss kommt, habe ich mir jetzt Starlink zugelegt. Der zugehörige Router ist recht brauchbar in horizontaler Richtung, vertikal verschlechtert sich das Signal jedoch rapide. Das ist aber überhaupt kein Problem. Denn selbst bei minimaler Sendeleistung (Das WLAN Symbol hat nur einen Bogen) habe ich immer noch einen DL von min. 20 MBit.
Ich würde gern festlegen, dass das Starlink WLAN absoluten Vorrang hat. Aber wenn ich im Smartphone den WLAN Schlüssel speichere, wird auch automatisch mit dem WLAN verbunden, sofern es die "beste" Sendeleistung hat.
Ich werde sowieso noch WLAN-Repeater einsetzen, dann ist das Problem eh gelöst. Interessiert mich aber, ob es auch über irgendwelche Einstellungen ginge.
Du kannst dir auch gerne Anregungen aus unseren Uhrprojekten hier aus dem Forum holen. Könnte 6 - 10 Jahre her sein, da haben wir mal ziemlich viele Uhrenskripte erstellt. (War möglicherweise auch ein Contest, weiß ich nicht mehr genau)
Bemühe mal die Forensuche.
Noch neuer ?
Gemeint ist die Version von AutoIt, nicht von Include Dateien. 😙
Maps sind noch nicht allzu lange in der Standardversion enthalten. Links findest du im Portal.