Lasersteuerung
Lasersteuerung
Hallo Forum,
ich bin noch ein blutiger Anfänger im Umgang mit ProfiLab Expert 4.0, aber ich habe mein Projekt innerhalb den letzten 2 Monaten weitgehend umgesetzt bekommen. Zur kurzen Info Des Projekts:
Ich habe hier 3 Laser, die als Nachheizer fungieren. Jeder Laser besitzt jeweils intern 3 Laserquellen die gebündelt als ein Laserstrahl ausgegeben werden. Alle Internen Laserquellen werden einzeln angesteuert. Alle Laser sollen Synchron die gleiche Wärme erzeugen. Die Ansteuerung erfolgt durch String-Befehle über 3 Com-Ports. Zum Einschalten wird eine Startsequenz mit Strings gesendet, genauso wie beim Beenden. Die Ansteuerung der Laser im Bereich von 0 – 100% wird in Ampere in Strings an die Lasertreiber gesendet. Ich habe die Möglichkeit den Lasertreiber anzusteuern ohne dabei den Laser in Betrieb zu haben. Ich muss in regelmäßigen Abständen die interne Lasertemperatur abrufen um die Kühlung vorerst manuell nach zu regeln. Später soll noch die Kühlung des Lasers durch den Durchlaufkühler (Chiller) automatisiert werden, da er auch mit Strings angesteuert werden kann.
Infos zum PC: Betriebssystem Windows 10 64Bit, CPU: AMD 6x3,4GHz, Arbeitsspeicher: 16GB RAM Die Com-Schnittstellen sind angepasst wie es vom Laserhersteller vorgeschrieben wird. Parameter: Bits/Sec. 115200; Data bits: 8; Parity: none; Stop bits: 1; Flow control: none.
Nun aber zu meinem Problem, sobald das Projekt zusammengebaut betrieben wird bricht teilweise die Frequenz zusammen auf 0Hz, egal ob ich es auf Slow (ca. 500 bis 800Hz) oder Fast (ca. 1000 bis 1200Hz) betreibe. Wenn ich eine Rampe mit 0,01h oder 0,25h fahre merkt man es noch besser. Die Schaltflächen reagieren auch nicht immer direkt. Durch das Zusammenbrechen werden dann die Strings zur Steuerung der Laser auch nicht mehr korrekt zusammengesetzt. Es fehlt dann teilweise der Zahlen-Ansteuerwert für die Stromstärke. Die CPU-Auslastung liegt bei Slow bis maximal 8%, bei Fast bis maximal 10%.
Ich habe das Problem erst wirklich war genommen seitdem ich die Temperaturabfrage über String hinzugefügt habe. Hatte am Anfang das Gefühl, dass der Sting-Puffer mein Nadelöhr wäre, doch denn habe ich schon etwas frisiert. Hatte es auch mal ohne Puffer versucht, aber hab da keine Lösung gefunden, dass die Schnittstelle selber anhand der Trennzeichen den zusammengefassten Strings beim einlesen wieder in einzelne Strings übernimmt. Habe im Anhang auch mal ein 2 Logs eingefügt, wie die Antwort des Lasertreibers aussieht mit und ohne Fehler. Teilweise wird auch kein String zur Ansteuerung der Laser ausgegeben als ob er einfach verschluckt wurde. Der Fehler lässt sich auch mit ausgeschaltetem Lasertreiber Nachvollziehen nur dass man logischerweise keine Antwort bekommt.
Ich wäre dankbar um jede Art von Lösungsansätzen.
ich bin noch ein blutiger Anfänger im Umgang mit ProfiLab Expert 4.0, aber ich habe mein Projekt innerhalb den letzten 2 Monaten weitgehend umgesetzt bekommen. Zur kurzen Info Des Projekts:
Ich habe hier 3 Laser, die als Nachheizer fungieren. Jeder Laser besitzt jeweils intern 3 Laserquellen die gebündelt als ein Laserstrahl ausgegeben werden. Alle Internen Laserquellen werden einzeln angesteuert. Alle Laser sollen Synchron die gleiche Wärme erzeugen. Die Ansteuerung erfolgt durch String-Befehle über 3 Com-Ports. Zum Einschalten wird eine Startsequenz mit Strings gesendet, genauso wie beim Beenden. Die Ansteuerung der Laser im Bereich von 0 – 100% wird in Ampere in Strings an die Lasertreiber gesendet. Ich habe die Möglichkeit den Lasertreiber anzusteuern ohne dabei den Laser in Betrieb zu haben. Ich muss in regelmäßigen Abständen die interne Lasertemperatur abrufen um die Kühlung vorerst manuell nach zu regeln. Später soll noch die Kühlung des Lasers durch den Durchlaufkühler (Chiller) automatisiert werden, da er auch mit Strings angesteuert werden kann.
Infos zum PC: Betriebssystem Windows 10 64Bit, CPU: AMD 6x3,4GHz, Arbeitsspeicher: 16GB RAM Die Com-Schnittstellen sind angepasst wie es vom Laserhersteller vorgeschrieben wird. Parameter: Bits/Sec. 115200; Data bits: 8; Parity: none; Stop bits: 1; Flow control: none.
Nun aber zu meinem Problem, sobald das Projekt zusammengebaut betrieben wird bricht teilweise die Frequenz zusammen auf 0Hz, egal ob ich es auf Slow (ca. 500 bis 800Hz) oder Fast (ca. 1000 bis 1200Hz) betreibe. Wenn ich eine Rampe mit 0,01h oder 0,25h fahre merkt man es noch besser. Die Schaltflächen reagieren auch nicht immer direkt. Durch das Zusammenbrechen werden dann die Strings zur Steuerung der Laser auch nicht mehr korrekt zusammengesetzt. Es fehlt dann teilweise der Zahlen-Ansteuerwert für die Stromstärke. Die CPU-Auslastung liegt bei Slow bis maximal 8%, bei Fast bis maximal 10%.
Ich habe das Problem erst wirklich war genommen seitdem ich die Temperaturabfrage über String hinzugefügt habe. Hatte am Anfang das Gefühl, dass der Sting-Puffer mein Nadelöhr wäre, doch denn habe ich schon etwas frisiert. Hatte es auch mal ohne Puffer versucht, aber hab da keine Lösung gefunden, dass die Schnittstelle selber anhand der Trennzeichen den zusammengefassten Strings beim einlesen wieder in einzelne Strings übernimmt. Habe im Anhang auch mal ein 2 Logs eingefügt, wie die Antwort des Lasertreibers aussieht mit und ohne Fehler. Teilweise wird auch kein String zur Ansteuerung der Laser ausgegeben als ob er einfach verschluckt wurde. Der Fehler lässt sich auch mit ausgeschaltetem Lasertreiber Nachvollziehen nur dass man logischerweise keine Antwort bekommt.
Ich wäre dankbar um jede Art von Lösungsansätzen.
- Dateianhänge
-
- Lasersteuerung 1.0.prj
- (382.58 KiB) 1001-mal heruntergeladen
Re: ProfiLab 4.0 stockt zeitweise bei Übermittlung von Strings
Gesendete Stringfehler.
- Dateianhänge
-
- Rampe mit Stringfehler
- Rampe Fehler.jpg (117.96 KiB) 19270 mal betrachtet
Re: ProfiLab 4.0 stockt zeitweise bei Übermittlung von Strings
String in Ordnung.
- Dateianhänge
-
- Rampe in Ordnung.jpg (124.76 KiB) 19268 mal betrachtet
Re: ProfiLab 4.0 stockt zeitweise bei Übermittlung von Strings
Hi Mat
Ich habs mal Überflogen . Ich würde mal vermuten das du beim String senden und Empfangen
durch das parallele Senden und Empfangen die Probleme hast .
Versuch doch mal die Schnittstellen nacheinander zu senden und genauso den Empfang nacheinander
einzulesen .
Gruß gerhard
Ich habs mal Überflogen . Ich würde mal vermuten das du beim String senden und Empfangen
durch das parallele Senden und Empfangen die Probleme hast .
Versuch doch mal die Schnittstellen nacheinander zu senden und genauso den Empfang nacheinander
einzulesen .
Gruß gerhard
Re: ProfiLab 4.0 stockt zeitweise bei Übermittlung von Strings
Hallo Gerhard,
danke für deine Einschätzung. Habe heute Morgen mal alles abgeändert und durchgespielt, aber daran lag es nicht.
Mir war aufgefallen, dass schon nach dem ich die Simulation gestartet habe die Einbrüche im PL vorkommen ohne dass die eigentliche Schaltung gestartet wurde. Habe danach mal von den eingerahmten Schaltungen eins nach dem anderen entfernt und musste feststellen, dass die netPIO GPIO18 und die netPIO TEMP12 Karten von Abacom das Problem mit dem Stocken im Programm verursachen.
Das Programm läuft jetzt stabil ohne beide Karten im Programm. Habe noch einige Modifikationen in der Schaltung Schieberegler und
Stringausgabe 0-100% vorgenommen.
Werde mich noch mal melden wenn ich eine Lösung für die beiden Karten gefunden habe.
Gruß Michael
danke für deine Einschätzung. Habe heute Morgen mal alles abgeändert und durchgespielt, aber daran lag es nicht.
Mir war aufgefallen, dass schon nach dem ich die Simulation gestartet habe die Einbrüche im PL vorkommen ohne dass die eigentliche Schaltung gestartet wurde. Habe danach mal von den eingerahmten Schaltungen eins nach dem anderen entfernt und musste feststellen, dass die netPIO GPIO18 und die netPIO TEMP12 Karten von Abacom das Problem mit dem Stocken im Programm verursachen.
Das Programm läuft jetzt stabil ohne beide Karten im Programm. Habe noch einige Modifikationen in der Schaltung Schieberegler und
Stringausgabe 0-100% vorgenommen.
Werde mich noch mal melden wenn ich eine Lösung für die beiden Karten gefunden habe.
Gruß Michael
- Dateianhänge
-
- Lasersteuerung 1.1.prj
- (698.47 KiB) 1768-mal heruntergeladen
Re: ProfiLab 4.0 stockt zeitweise bei Übermittlung von Strings
Hallo Forum,
habe die Probleme mittlerweile selbst gelöst und eine Finish-Version entworfen welche nun abgespeckter im Aufbau ist und wo zusätzlich noch eine SMC-Chiller-Ansteuerung (Durchlaufkühler) integriert ist. Die Abacom-Karten Für Temperaturerfassung und Interlock sind auch wieder integriert und der Datenaustausch läuft einwandfrei. Grund war wohl, dass ich bei der ersten Version zu viele Schaltkreise hatte, die das System dann überlasteten, da ProfiLap relativ CPU-lastig läuft.
Viele Grüße
Michael
habe die Probleme mittlerweile selbst gelöst und eine Finish-Version entworfen welche nun abgespeckter im Aufbau ist und wo zusätzlich noch eine SMC-Chiller-Ansteuerung (Durchlaufkühler) integriert ist. Die Abacom-Karten Für Temperaturerfassung und Interlock sind auch wieder integriert und der Datenaustausch läuft einwandfrei. Grund war wohl, dass ich bei der ersten Version zu viele Schaltkreise hatte, die das System dann überlasteten, da ProfiLap relativ CPU-lastig läuft.
Viele Grüße
Michael
- Dateianhänge
-
- Laser 3.0.prj
- (272.35 KiB) 1543-mal heruntergeladen
Re: ProfiLab 4.0 stockt zeitweise bei Übermittlung von Strings
Hallo Forum,
nach gut einem weiteren Jahr testen, traten immer wieder Fehlmesswerte (Abweichung zwischen 200 und 1000°C manchmal auch Minus) innerhalb einer Sekunde auf die mir dann den Interlock auslösten. Habe dann alle Dallas DS18B20 ausgetauscht und durch verkapselte ersetzt, was aber nichts brachte. Nach Rücksprache mit ABBACOM sollte ich die Kabel zu den Dallas DS18B20 mit abgeschirmten Kabeln versehen, was aber auch nichts brachte. Eine Verbesserung trat erst auf, nach dem ich die Wiederstände vom Dallas DS18B20, die Standartmäßig mit 1KOhm bestückt sind, ersetzt habe durch 600 Ohm Wiederstände. Es war jedoch nur eine Verbesserung der Häufigkeit des Auftretens. Der Interlock löste aber trotzdem hin und wieder wegen nicht vorhandener Übertemperatur aus. Nach langem hin und her haben wir uns dann entschieden das LAN-netPIO-Temp12-Modul durch ein Arduino zu ersetzen, welcher die vorhandenen Dallas DS18B20 ausliest. Seit gut 3 Monaten testen gibt es nun keine Fehlmesswerte mehr und die Anlage läuft. Im Anhang findet ihr noch mal eine überarbeitete Version der Lasersteuerung, die auch den Arduino ausliest.
Viele Grüße
Michael
nach gut einem weiteren Jahr testen, traten immer wieder Fehlmesswerte (Abweichung zwischen 200 und 1000°C manchmal auch Minus) innerhalb einer Sekunde auf die mir dann den Interlock auslösten. Habe dann alle Dallas DS18B20 ausgetauscht und durch verkapselte ersetzt, was aber nichts brachte. Nach Rücksprache mit ABBACOM sollte ich die Kabel zu den Dallas DS18B20 mit abgeschirmten Kabeln versehen, was aber auch nichts brachte. Eine Verbesserung trat erst auf, nach dem ich die Wiederstände vom Dallas DS18B20, die Standartmäßig mit 1KOhm bestückt sind, ersetzt habe durch 600 Ohm Wiederstände. Es war jedoch nur eine Verbesserung der Häufigkeit des Auftretens. Der Interlock löste aber trotzdem hin und wieder wegen nicht vorhandener Übertemperatur aus. Nach langem hin und her haben wir uns dann entschieden das LAN-netPIO-Temp12-Modul durch ein Arduino zu ersetzen, welcher die vorhandenen Dallas DS18B20 ausliest. Seit gut 3 Monaten testen gibt es nun keine Fehlmesswerte mehr und die Anlage läuft. Im Anhang findet ihr noch mal eine überarbeitete Version der Lasersteuerung, die auch den Arduino ausliest.
Viele Grüße
Michael
- Dateianhänge
-
- Lasersteuerung 4.1.prj
- (291.5 KiB) 1677-mal heruntergeladen
Re: ProfiLab 4.0 stockt zeitweise bei Übermittlung von Strings
Das klingt genau nach dem was ich suche. Kannst Du evtl die aduino Datei und die PL Datei zum übertragen von Temperaturen von arduino nach PL hochladen?
Lasersteuerung
Hallo Ben_N,
sorry dass ich mich jetzt erst melde, aber das Projekt wird nicht mehr weiter mit PL betrieben. Es wird derzeit erweitert und wir sind auf Willen unserer Geschäftsleitung von PL auf Pyton umgestiegen. Der Teil zum Übertragen von Temperaturen von Arduino nach PL findest du in der letzten Version (Lasersteuerung 4.1) die ich hochgeladen hatte, in dem Feld Arduino / TEMP 8. Nachfolgend habe ich den Sketch für den Arduino als Text
eingefügt, da so wie es aussieht nur PL-Projekte hochgeladen werden können. Die Adressen der Dallas Sensoren müssen logischerweise ausgelesen werden und durch die in meinem Sketch an richtiger Stelle ersetzt werden. Ich hoffe, dass ich helfen konnte und hier nicht gegen die Regeln des Forums verstoße.
Viele Grüße
Michael
______________________________________________________________________________________________________________________________
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// 2D Array für die Sensoradressen
uint8_t sensorAddresses[8][8] = {
{0x28, 0x13, 0xFC, 0x26, 0x0A, 0x00, 0x00, 0x88},
{0x28, 0x3B, 0xAF, 0x12, 0x33, 0x20, 0x01, 0xCD},
{0x28, 0x3D, 0xED, 0xE7, 0x32, 0x20, 0x01, 0x4E},
{0x28, 0xC0, 0x0C, 0x18, 0x33, 0x20, 0x01, 0x21},
{0x28, 0x6A, 0x38, 0x1B, 0x33, 0x20, 0x01, 0xA1},
{0x28, 0x7A, 0xEB, 0x84, 0x33, 0x20, 0x01, 0x91},
{0x28, 0x4B, 0xAB, 0x25, 0x0A, 0x00, 0x00, 0x4B},
{0x28, 0xCE, 0x35, 0xFC, 0x09, 0x00, 0x00, 0x29}
};
float sensorValues[8]; // Array für die Sensorwerte
int inByte = 0; // eingehendes Serial Byte
unsigned long previousMillis = 0; // Zeitstempel der letzten Temperaturabfrage
const long interval = 1000; // Intervall von 1 Sekunde (1000 Millisekunden)
void setup() {
// Seriellen Port bei 9600 bps starten und auf die Verbindung warten:
Serial.begin(9600);
sensors.begin();
sensors.setResolution(9);
while (!Serial) {
; // Warten, bis die serielle Verbindung hergestellt wird (für native USB-Ports)
}
establishContact(); // Sende ein Byte, um Kontakt herzustellen
}
void loop() {
unsigned long currentMillis = millis(); // Aktuelle Zeit in Millisekunden
// Prüfen, ob 1 Sekunde seit der letzten Abfrage vergangen ist
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis; // Zeitstempel aktualisieren
// Sensorwerte auslesen
sensors.requestTemperatures(); // Fordere die Temperaturen aller Sensoren an
for (int i = 0; i < 8; i++) {
sensorValues = sensors.getTempC(sensorAddresses);
}
// Sensorwerte über die serielle Verbindung senden
for (int i = 0; i < 8; i++) {
Serial.print(sensorValues);
if (i < 7) {
Serial.print(","); // Komma nach jedem Wert außer dem letzten
}
}
Serial.println("#"); // Abschlusszeichen
}
// Prüfen, ob ein Byte über die serielle Verbindung verfügbar ist
if (Serial.available() > 0) {
inByte = Serial.read(); // Eingehendes Byte lesen
}
}
void establishContact() {
while (Serial.available() <= 0) {
Serial.println("0,0,0,0,0,0,0,0#"); // Initialisierungszeichen senden
delay(100);
}
}
sorry dass ich mich jetzt erst melde, aber das Projekt wird nicht mehr weiter mit PL betrieben. Es wird derzeit erweitert und wir sind auf Willen unserer Geschäftsleitung von PL auf Pyton umgestiegen. Der Teil zum Übertragen von Temperaturen von Arduino nach PL findest du in der letzten Version (Lasersteuerung 4.1) die ich hochgeladen hatte, in dem Feld Arduino / TEMP 8. Nachfolgend habe ich den Sketch für den Arduino als Text
eingefügt, da so wie es aussieht nur PL-Projekte hochgeladen werden können. Die Adressen der Dallas Sensoren müssen logischerweise ausgelesen werden und durch die in meinem Sketch an richtiger Stelle ersetzt werden. Ich hoffe, dass ich helfen konnte und hier nicht gegen die Regeln des Forums verstoße.
Viele Grüße
Michael
______________________________________________________________________________________________________________________________
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// 2D Array für die Sensoradressen
uint8_t sensorAddresses[8][8] = {
{0x28, 0x13, 0xFC, 0x26, 0x0A, 0x00, 0x00, 0x88},
{0x28, 0x3B, 0xAF, 0x12, 0x33, 0x20, 0x01, 0xCD},
{0x28, 0x3D, 0xED, 0xE7, 0x32, 0x20, 0x01, 0x4E},
{0x28, 0xC0, 0x0C, 0x18, 0x33, 0x20, 0x01, 0x21},
{0x28, 0x6A, 0x38, 0x1B, 0x33, 0x20, 0x01, 0xA1},
{0x28, 0x7A, 0xEB, 0x84, 0x33, 0x20, 0x01, 0x91},
{0x28, 0x4B, 0xAB, 0x25, 0x0A, 0x00, 0x00, 0x4B},
{0x28, 0xCE, 0x35, 0xFC, 0x09, 0x00, 0x00, 0x29}
};
float sensorValues[8]; // Array für die Sensorwerte
int inByte = 0; // eingehendes Serial Byte
unsigned long previousMillis = 0; // Zeitstempel der letzten Temperaturabfrage
const long interval = 1000; // Intervall von 1 Sekunde (1000 Millisekunden)
void setup() {
// Seriellen Port bei 9600 bps starten und auf die Verbindung warten:
Serial.begin(9600);
sensors.begin();
sensors.setResolution(9);
while (!Serial) {
; // Warten, bis die serielle Verbindung hergestellt wird (für native USB-Ports)
}
establishContact(); // Sende ein Byte, um Kontakt herzustellen
}
void loop() {
unsigned long currentMillis = millis(); // Aktuelle Zeit in Millisekunden
// Prüfen, ob 1 Sekunde seit der letzten Abfrage vergangen ist
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis; // Zeitstempel aktualisieren
// Sensorwerte auslesen
sensors.requestTemperatures(); // Fordere die Temperaturen aller Sensoren an
for (int i = 0; i < 8; i++) {
sensorValues = sensors.getTempC(sensorAddresses);
}
// Sensorwerte über die serielle Verbindung senden
for (int i = 0; i < 8; i++) {
Serial.print(sensorValues);
if (i < 7) {
Serial.print(","); // Komma nach jedem Wert außer dem letzten
}
}
Serial.println("#"); // Abschlusszeichen
}
// Prüfen, ob ein Byte über die serielle Verbindung verfügbar ist
if (Serial.available() > 0) {
inByte = Serial.read(); // Eingehendes Byte lesen
}
}
void establishContact() {
while (Serial.available() <= 0) {
Serial.println("0,0,0,0,0,0,0,0#"); // Initialisierungszeichen senden
delay(100);
}
}