Ich möchte ein paar SPS-Ausgänge protokollieren/loggen.
Hintergrund:
Kleine Maschine (ein Markierungslaser aus unserem Haus) wird über eine externe SPS und eine Sondersoftware angesteuert.
Teils handelt es sich um "echte" SPS-Signale (von einer Logo, die der Programmierer direkt über die Tasten programmiert hat), teils um Softwaregenerierte Signale aus der Lasersoftware.
Beide Signaltypen werden auch in der Sondersoftware ausgewertet, und dort wird auch zusätzlich noch mit kleineren Zeitschleifen gearbeitet
Der Programmierer der SPS ist nicht mehr greifbar. Der der Sondersoftware nur noch sehr bedingt (in Rente).
Das ganze System stürzt manchmal mehrfach pro Schicht ab, mal läuft es eine Schicht durch.
Seit der Kunde die Festplatte im Steuer-PC des Lasers (Win XP) gegen eine SSD ersetzt hat, haben die Probleme deutlich zugenommen.
Nun werden die Probleme schön im Kreis herumgereicht und zwischen allen "Schwarzer Peter" gespielt. Die komplette Verkabelung ist mehrfach auf kalte Lötstellen, Aderbruch etc geprüft worden.
ICh will also nun die Handvoll Signale mitloggen um zu sehen, ob es evt etwas grenzwertiges gibt, Signale die evt zu schnell für die ein oder andere Seite kommen, oder verzögert.
Generell ist es eine recht langsame Geschichte, üblicherweise liegen zwischen den einzelnen Signalen Zeiten deutlich im mehrere 100ms Bereich (ein Zylinder bekommt ein Signal, fährt, Endschalter meldet Endlage etc).
Also will ich keinen imensen Datenwulst erzeugen, in dem ich permanent abfrage und schreibe.
Meine Idee ist, dass ich die Eingänge des Arduino via Optokopplerkarte an die entsprechenden SPS EinAusgänge hänge. (16 E/A sind mehr als genug).
Nun lese ich zyklisch ein und bilde einen Hex-Wert, der den Zustand abbildet.
Diesen speichere ich in einer Variablen.
Nach dem nächsten Lesen und in Hex-Wert konvertieren, vergleiche ich.
Sollte Wert_alt <> Wert_neu sein, schreibe ich auf die SD.
Dazu eine RTC die mir einen Timestamp liefert, den ich bei jedem Ereignis mitschreibe.
Ich hatte auch an einen billigen USB-Datenlogger gedacht (10-15€ in der Bucht oder Amazon), weil die es schön in einem Zeitdiagramm anzeigen, aber bei diesen billigen Dingern muss die ganze Zeit ein PC mitlaufen, daher die Arduino Idde, dann kann ich die Darten via excel o.Ä. auswerten.
Was haltet ihr von der grundsätzlichen Idee für den Aufbau?
Oder würdet ihr einen gänzlich anderen Weg gehen?
Hallo,
wenn ich XP lese gehe ich mal davon aus das das Ganze mindestens10 Jahre alt ist . Das Programm im Logo kann ja eigentlich nicht so komplex sein das man das nicht neu machen könnte oder/und auf eine neue Hardware übernimmt. Für den Laser wird es auch Ersatz geben.
Klar kannst Du versuchen da was zu loggen, aber was sagt Dir das dann wenn Du einen Fehler mitbekommen hast. "Das ein oder andere Teil hatte einen Ausfall" Spätestens dann stehst Du vor der Aufgabe den Kram komplett zu ersetzten , einzeln wird keinen Sinn machen.
Also gesamte Aufgabenstellung analysieren und neue Lösung ( Hardware suchen)
Grundsätzlich kannst Du das mit einem Arduino so machen wie Du es vorhast, allerdings wenn es sich um ein Industrie Umfeld handelt kann es sein das Du wegen mangelnder EMV mit dem Arduino Probleme bekommst und / oder Misst misst.
Heinz
Da sind RTC und SD-Slot schon onboard.
Der Teensy lässt sich auch mit der Arduino-IDE programmieren.
oder einen ESP32. Der hat WiFi onboard und könnte dann UDP-Daten an einen PC im Netzwerk senden. Oder einen RaspberryPi als "WiFi-gekoppelten Computer nehmen"
Erstmal Danke für die Rückmeldungen. @Rentner
Ich habe gerade nachgeguckt, das System ist von 2018 und hat Windows 7 prof64 und ist standalone, wird also noch ein paar Jahre seinen Dienst tun.
Wir (also die Firma in der ich arbeite) sind ausschließlich der Lieferant des Lasers.
Der Sondermaschinenbauer der das damals gemacht hat, incl SPS-Programm, ist mittlerweile vom Markt verschwunden.
Meine eigenen Fähigkeiten bez. SPS.. Naja, habe aufgehört, da war die S7 noch eine S5, und man ist mit dem dicken PG675 herumgelaufen
Ich versuche, so gut es geht, dem Kunden "auf kleinem Dienstweg", zu helfen, da in naher Zukunft ein weiterer Laser bei uns gekauft werden soll, und die Anlage damals in unserem Namen (Also wir als Generalunternehmer) gefertigt wurde.
Die Sondersoftware wurde von einem mittlerweile Ex-Mitarbeiter geschrieben, der nix vernünftig dokumentiert hat, und von der Version, die beim Kunden läuft, gibt es keinen Quelltext , die werde ich wohl eh komplett neu schreiben dürfen, da die auf dem neuenen Laser auch laufen soll (aber diesmal ohne den externen Krempel, es geht nur um Datenhandling, SQL-Gedöns)
Und wenn wir das Problem nicht zumindest klar definiert bekommen, wird der Laser woanders gekauft, that's life.
Ja, industielles Umfeld stimmt, aber nix schlimmes in der Nähe des Standortes (Kein Lichtbogen- oder HF-Schweißen, keine dicken Motoren.
Es ist eine Montagehalle und in einer Ecke werden die Typenschilder gelasert. @noiasca@StefanL38
Was die bereits vorhandene (meine) Hardware angeht, 3x Nano (clone), 1x Uno rev3, 1x Mega(Clone).
Wobei, wenn ich die E/A's monitore, ich ja keine weiteren benötige, lediglich SMD-breakout.
Machbar ist es.
Über kurz oder lang wirst Du das aber neu giessen müssen.
Da Du im Industrieumfeld handelst, würde ich nicht auf die kleinen Einzelboards setzen.
Insbesondere, da SPS sowieso Thema ist:
Die Teile sind innerlich Arduino-like, äusserlich aber den Anforderungen besser gewachsen.
Hallo
ja PG675 kenne ich auch noch und auch der schwarze Kindersarg davor PGxxx ist mir mit den zwei Laufwerken noch gut in Erinnerung.
Dennoch da Ihr ja anscheinend die Laser baut ist die Schnittstelle ja bekannt. Da soll letztlich was beschriftet werden und die "SPS" dient dazu ein bishen Handlingsautomat zu spielen. Ja 2018 ist nun noch nicht so alt, etwas blöd, da sollte man als Hersteller noch wissen was damals abgegangen ist.
Also wenn Du Dir etwas davon versprichst ein paar Signale zu loggen dann versuch das mal. Generell geht das wie gesagt mit einem Arduino. Allerdings wirst Du auch ein paar Stunden investieren müssen auch. Letztlich kommen da auch schnell ein paar tausend Euro zusammen bis das Ding dann läuft. Eventuell habt Ihr ja noch Irgendwo eine S7 315CPU und je eine E/A Karte rumliegen um damit eine Fangsteuerung zu bauen. Wenn der Fehler auftritt und die Anlage hängt Zustand mit der S7 auswerten und ein paar Lampen legen die zu einer Aussage führen. Mehr als 10 Gründe wird es ja nicht geben. Vermutlich wird man im normalen Ablauf keine Ungereimtheiten feststellen, also nur im Fehlerfall zu einer Aussage kommen können. Die Uhrzeit ist da dann eigentlich egal. Als Ergebnis wird eventuell herauskommen das etwas defekt ist, denn schließlich lief es ja mal.
Heinz
Sooooo,
nach längerer Zeit mal ein kleines Update.
Kleines Board ist fertig, mit 2 LTV487, Nano R3, Dioden zur Absicherung gegen Verpolung, Pull-Ups und Vorwiderstände für den Arduino Nano, je (24V) Eingang eine 2mA Led mit passendem R, RTC und SD-Card, dazu ein paar 100nf C's für die IC's, ein 24V-5V Längsregler (der nicht warm wird) als 5V Versorgung
Läuft so weit stabil, leider habe ich zu spät erfahren, dass die IO'S vom Arduino in Ports zusammengefasst sind, sonst hätte ich zugesehen, dass ich einen kompletten Port belege, nun sind die Eingänge etwas "verteilt".
Einlesen z.Zt mit "DigitalRead", wobei ich die SW wohl umstelle auf direktes Auselesen der Ports.
Was ich noch suche, ist ein möglichst wenig rechenintensiver Weg die 8 Werte als "Byte" zusammenzufassen, und als 0x00 bis oxFF, umgesetzt auf einfachen ASCII-Text, auf die SD zu bringen.
Ich bin mit dem Befehlssatz des Arduino, speziell Strings, noch nicht so firm, gibt es da etwas "elegantes"?
Gruß aus Rade
Michael
eine gemütliche Forschleife und ein einfaches bitshift - oder auch das _BV() makro müsste da eigentlich reichen. Arduino like könntest auch nach bitSet suchen.
Danke für den Input, leider habe ich das Prog. nicht hier.
Generell frage ich z. Zt. jeden Pin einzeln mit DigitalRead ab, speicherer den Status in einer Variblen, die hänge ich alle hintereinander in einen String, Kommata getrennt, und schreibe diesen String in eine Datei, wie gesagt, ging erst mal um den Test der Hardware.
Dann werde ich mich mal mit functions/Bits-and-Bytes beschäftigen.
@TO: nein. Du wolltest es ja in einer byte Variable haben oder?
Dann macht man das ca so
ungeprüft nur so hingeschrieben
const byte pin[]{4,5,6,10,9,8}; // Annahme "durcheinander".
const size_t count = sizeof(pin); // wie viele Pins auch immer... nicht mehr als 8 halt,
byte input; // dorthin solls kommen // ... denn sonst wird ein byte nicht reichen
// dann im Code
input = 0; // zurücksetzen
for (size_t i = 0; i < count; i++)
{
if (digitalRead(pin[i]) == HIGH)
{
bitSet(input, i);
}
}
Serial.print(F("das ist es jetzt:"));
Serial.println(input, BIN);
und wenns wirklich an der Geschwindigkeit des digitalRead liegt (was ich nicht glaube) dann gäbe es auch eine fast Variante davon...
edit:
läuft im Simulator:
const byte pin[] { 4,5,6,10,9,8}; // Annahme "durcheinander".
const size_t count = sizeof(pin); // wie viele Pins auch immer... nicht mehr als 8 halt,
byte input; // dorthin solls kommen // ... denn sonst wird ein byte nicht reichen
void setup()
{
Serial.begin(115200);
for (size_t i = 0; i < count; i++)
pinMode(pin[i], INPUT_PULLUP);
}
void doCheck()
{
input = 0; // zurücksetzen
for (size_t i = 0; i < count; i++)
{
if (digitalRead(pin[i]) == HIGH)
{
bitSet(input, i);
}
}
Serial.print( ("das ist es jetzt:"));
Serial.println(input, BIN);
}
void loop()
{
doCheck();
delay(1000);
}
Auch wenn es jetzt "Offtopic" ist, es kann ja wohl nicht sein dass man als Firma seinen Programmierer rummachen lässt ohne das dieser eine Dokumentation erstellt, Backups anlegt und dies zentral speichert. Das gehört zum Job und wenn er es nicht macht, brauch er einen neuen Job.....
Backup klar, aber Doku nur, wenn es der Kunde explizit bezahlt, was er meist nicht will. Also bekommt er auch keine.
Da gibt es dann nur die Kurzdoku, wo nötig, im Code.
Ich meinte nicht den Kunden sondern die Firma muss eine Dokumentation haben. Ein Programmierer kann immer mal ausfallen oder kündigen und trotzdem muss der Service für die Anlagen funktionieren.