Serielle Schnittstellen verlieren COM-Port-Nr. bei Compilat

Antworten
Tobias
Beiträge: 17
Registriert: Mittwoch 22. Oktober 2008, 12:57

Serielle Schnittstellen verlieren COM-Port-Nr. bei Compilat

Beitrag von Tobias » Dienstag 30. Dezember 2014, 22:43

Hallo Abacom, hallo Gemeinde,

ich habe ein Problem, welches sich mittlerweile leider zu einem großen für mich mausert:

Ich habe ein Programm erstellt, welches über die serielle Schnittstelle mit einem Messgerät (Eigenbau) kommuniziert. Im Einsatz habe ich 38 COM-Bausteine (String Senden und String Empfangen), welche auf insgesamt 2 Schnittstellen zugreifen. 36 Bausteine auf COM 1, 2 Bausteine auf COM 2.
Im Simulationsmodus habe ich keine Probleme, alles läuft wunderbar.

Die compilierte Version jedoch zeigt folgenden Fehler:
Größtenteils läuft die Software normal, manchmal jedoch (3x am Tag bis 1x die Woche) werden manche oder alle Schnittstellenbausteine in der "Hardware.ini" auf Nr. "0" gesetzt. Die Software läuft bei Kunden weltweit, d.h. auf englischen und deutschen Windows 7 und XP. Bei fast allen Kunden tritt das Problem immer wieder auf, womit ein bestimmter PC absolut auszuschließen ist (die Kunden haben auch untereinander nichts miteinander zu tun (wg. bestimmter PC-Config innerhalb einer Firma z.B.)).

Das blöde ist auch den Kunden zu erklären, welche Bausteine sie im Hardware-Menü immer wieder auf welche COM-Nr. setzten müssen, da hier nunmal 38 Stk. sind und diese für den Kunden verwirrende Namen haben (1.$CS1 usw.). Oder habe ich übersehen, wie man für die Bausteine eine sinnvolle Namensvergabe machen kann um zumindest eine Zugehörigkeit untereinander zu erkennen?

Aus meiner Not habe ich schon geraten ein Backup der "Hardware.ini" anzulegen und dieses immer zurück zu kopieren.

Hat irgendwer eine Idee, woran das liegen könnte?
Wann wird in die Harware.ini geschrieben, immer nur beim Schließen des Programms oder auch zwischendurch?
Würde das Beenden über SIM-STOP evtl. ein definierteres Beenden der Software bedeuten, sodass evtl. keine Kommunikation mehr beim Schließen stattfindet, oder simuliert das im Grunde auch nur ALT-F4?

Ich habe keine Idee, brauche aber dringend eine Lösung. So langsam verlieren meine Kunden die Geduld.

Viele Grüße,
Tobias.

hrathke
Beiträge: 157
Registriert: Montag 12. Dezember 2011, 21:10

Re: Serielle Schnittstellen verlieren COM-Port-Nr. bei Compilat

Beitrag von hrathke » Mittwoch 31. Dezember 2014, 16:54

Hallo Tobias,

vllt. hab ich es nicht richtig verstanden, aber Du hast nur 2 realle COM Schnittstellen, aber 38! COM Bausteine? Warum denn das? Eigentlich benötigst Du für jeweils eine Schnittstelle auch nur 1 x String Senden & Empfangen.

Gruß
HR

IKT
Beiträge: 553
Registriert: Mittwoch 4. November 2009, 18:32

Re: Serielle Schnittstellen verlieren COM-Port-Nr. bei Compilat

Beitrag von IKT » Donnerstag 1. Januar 2015, 13:07

Hallo Tobias,

zuerst: schliesse mich der Frage vom HR an (warum diese vielen COM-Bausteine?).
Wann wird in die Harware.ini geschrieben, immer nur beim Schließen des Programms oder auch zwischendurch? -- meines Wissens: nur beim Beenden.
Würde das Beenden über SIM-STOP evtl. ein definierteres Beenden der Software bedeuten, sodass evtl. keine Kommunikation mehr beim Schließen stattfindet, oder simuliert das im Grunde auch nur ALT-F4? -- löst genau die gleiche Aktion aus (uMsg = WM_CLOSE, Windows message)
Microsoft Windows Referenz (engl.): http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Microsoft Beispiel: http://msdn.microsoft.com/en-us/library ... roying_win
Dies betrifft die Prozedur (MainWindowProc) des Hauptfensters der kompilerten Applikation.

Die Lösung ist alles andere als einfach da:
- eine eigens programmierte "Program beenden" Routine vorhanden sein MUSS (auch wenn diese nur eine bestimmte Zeit wartet um danach das Prog. zu schliessen)
- idealerweise eine Abfangroutine besteht, welche Alt+F4 unterbindet (z.B. eine DLL)
Dies ist getestet, keine Theorie (in eigener kommerzieller SW) und funktioniert ...

Danach kann BEENDEN nur noch (Achtung: Ausnahme ESC Taste!) per selber definiertem Taster/Schalter/Schaltuhr etc. und oben angesprochenen, eigenen Routine aufgerufen werden. Damit ist das Verhalten beim Beenden des Programms in der Hand des Programmierers.
Das Ende dieser Routine ist dann der Aufruf von "SimStop"-Baustein (evtl. 2x).

Vereinfacht ausgedrückt:
manuelles Unterbrechen eines definierten Vorgangs ... dies ermöglicht das "dazwischen schieben" von selber definierten Regeln vor dem eigentlichen Beenden.
++++++
Gruss/regards IKT

Tobias
Beiträge: 17
Registriert: Mittwoch 22. Oktober 2008, 12:57

Re: Serielle Schnittstellen verlieren COM-Port-Nr. bei Compilat

Beitrag von Tobias » Sonntag 4. Januar 2015, 21:52

Hallo HR und IKT,

vielen Dank für Eure antworten; und entschuldigt meine verspätete...

Das mit der Anzahl von COM-Bausteinen habt ihr richtig verstanden. Der Grund dafür ist folgender:

Über einen TX-Baustein werden im Sekundentakt Daten vom Messgerät angefordert und von einem RX-Baustein die Antworten empfangen (Request/Responce-Verfahren, allerdings noch nicht mit dem neuen Request/Responce-Baustein).
Zusätzlich kann man das Gerät noch über die RS232 steuern, z.B. Messwert nullen, Messung starten oder stoppen usw. Je nach Art für die Steueraufgabe werden verschiedene Header genutzt (Klassifizierung der Aufgaben). Hier habe ich der Einfachheit halber die Möglichkeit genutzt und die Prefix- und Suffix-Funktion der COM-Bausteine genutzt. So hat jede Funktion zum Senden ihren eigenen COM-Baustein bekommen, was auch prinzipiell super funktioniert. Ich wollte mir so das Multiplexen von den ganzen Strings auf einen COM-Baustein ersparen.

Sieht ABACOM darin ein Problem oder ist das Grundsätzlich so ok?

Das das Problem beim Beenden und Speichern der Hardware.ini liegt war ja nur eine Idee. Ob es daran liegt weiß ich nicht. Ich dachte nur, dass es ja logischerweise nur passieren kann, wenn die Hardware.ini vom Programm verändert wird.

MfG Tobias

IKT
Beiträge: 553
Registriert: Mittwoch 4. November 2009, 18:32

Re: Serielle Schnittstellen verlieren COM-Port-Nr. bei Compilat

Beitrag von IKT » Montag 5. Januar 2015, 11:01

Hallo Tobias,
... für die Bausteine eine sinnvolle Namensvergabe machen kann um ...
Dies ist ganz einfach:
die vorgegebenen Namen (Bauteil/Eingenschaften) einfach mit "eigener" Bezeichnung überschreiben.
Die vorgegebenen Namen bleiben dahinter, in Klammern erhalten (an dieser Stelle nicht sichtbar!), z.B.:
$CS1 --> COMn send stop --> COMn send stop ($CS1) ... für n die "richtige" COM-Nr. einsetzen!
Zus. bei "zur Laufzeit einstellbar" den Haken setzen (jetzt kann die Bauteil-Eigenschaft "zur Laufzeit" geändert werden). Siehe unten ...

Überprüfung:
in Frontplatte Config., bei Config. Application den Haken setzen (Icon "roter Schraubendreher" wird sichtbar).
Diesen danach anklicken (bei laufendem Prog. sind nur die "konfigurierbaren" Bauteile sichtbar). Diese können mittels Doppel-Klick geöffnet und angepasst werden (in dieser Zeit bleibt das Prog. "stehen", bis mit "OK" wieder geschlossen wird).

Zum Thema "multiplexen":
Dies ist nun mal der professionelle Weg, an eine solche Problemstellung "heranzugehen". Damit kann dann "alles" über eine einzige COM-Schnittstelle "gehandhabt" werden. (Allerdings MUSS dafür zuerst ein sinnvolles Protokoll vorhanden sein [erstellt werden].)


Beenden Funktion:
Kommunikation zuerst beenden, resp. sicherstellen, dass nichts mehr "geht". Danach erst das Prog.-Ende aufrufen (dies sollte Deine Probleme mit der .ini erledigen). Details in meinem ersten Post ...
++++++
Gruss/regards IKT

Tobias
Beiträge: 17
Registriert: Mittwoch 22. Oktober 2008, 12:57

Re: Serielle Schnittstellen verlieren COM-Port-Nr. bei Compilat

Beitrag von Tobias » Dienstag 6. Januar 2015, 10:38

Hallo IKT,

ich werde mal prüfen ob ein Umbau auf multiplexen machbar ist (vom Aufwand her). Vielleicht ist es Profilab zu viel soviele COM-Bausteine in die Hardware.ini zu schreiben bzw. zu aktualisieren und es schleicht sich dort ein Fehler ein.

Du schreibst, dass es ganz einfach ist die Bezeichnung zu ändern. Entweder stehe ich total auf dem Schlauch oder ich übersehe es ganz einfach. Aber bei den COM-Bausteinen sehe ich nirgends im Eigenschaften-Dialog die Möglichkeit eine eigene Bezeichnung zu vergeben. Hast Du einen Screenshot für mich?

MfG, Tobias

IKT
Beiträge: 553
Registriert: Mittwoch 4. November 2009, 18:32

Re: Serielle Schnittstellen verlieren COM-Port-Nr. bei Compilat

Beitrag von IKT » Mittwoch 7. Januar 2015, 10:50

Hallo Tobias,
Tobias hat geschrieben:Bei den COM-Bausteinen sehe ich nirgends im Eigenschaften-Dialog die Möglichkeit eine eigene Bezeichnung zu vergeben.
da hast Du recht, geht nicht (bei den RS-Bauteilen). Diese scheinen diesbezüglich von anderen Bauteilen unterschiedlich zu sein.

In Deiner Anwendung ist möglicherweise das Teil - COM send sequence (sende Sequenz) von Intresse, da damit bis zu 256 verschiedene Sequenzen an das externe Gerät gesendet werden können. (Diese werden einmalig, intern definiert.)

ACHTUNG: nicht benutzte Eingänge (des Bauteils) MÜSSEN auf GND (0 Volt) verdrahtet werden!
Z.B.: 8 Sequenzen im Einsatz (die ersten 3 Eingänge, binär), dann die verbleibenden 5 auf GND verdrahten.
Dies wird vielfach vergessen/übersehen, hat aber verheerende Folgen (was angesteuert werden soll, wird NICHT wirklich angesteuert! Da: Eingänge unverdrahtet, IMMER auf "HOCH" = 5 Volt sind).
++++++
Gruss/regards IKT

Antworten

Zurück zu „Thema RS232“