Laden...

Profil von DFDotNet

myCSharp.de - Member Mitglied seit
D
DFDotNet
myCSharp.de - Member
63
Themen
201
Beiträge
Dabei seit
17.08.2007
Letzte Aktivität
vor 11 Jahren
Erstellt vor 12 Jahren

Hallo,

ich habe zufällig auch mit dem Bereich zu tun.
Geht es dir ausschliesslich um Siemens oder meinst du SPSen allgemein?
Man könnte sicherlich bei fast jeder SPS (z.B. CODESYS) ein entsprechende Benachrictigung bei Änderung eines Eingangssignals o.ä. über ein Kommunikationssystem deiner Wahl (OPC, Modbus, TCP/IP, UDP, ...) senden. Aber ich denke das muss dann zumindest in der SPS-Applikation realisiert werden. Dann musst du dich nur noch für den Übertragunsweg entscheiden und in der C#-Applikaiton auf die Benachrichtigung lauschen.
Oder denkst du da an was anderes?

Erstellt vor 13 Jahren

Hallo,

nachdem ich alles ausprobiert habe aber nichts half, war ich doch gezwungen den Rechner komplett neu aufzusetzen. Jetzt geht es wieder.
Trotzdem wäre es hilfreich zu wissen, woran es gelegen hat. Nur für den Fall, dass das Problem nochmal auftauchen sollte.
Also falls jemand eine Idee hat, oder das gleiche Problem schonmal hatte, gebt hier Bescheid.
Gruß

Erstellt vor 13 Jahren

Hallo,

ich habe seit ca. einer Woche das Problem, dass Visual Studio 2008 nicht mehr kompilieren kann, nachdem ich eine neue Klassendatei in ein bestehendes Projekt eingefügt habe.
Anstatt das Projekt zu kompilieren erscheint ein "Speichern"-Dialog in dem ich die Projektdatei speichern soll. Wähle ich die Projektdatei aus kommt die folgende Fehlermeldung:

Fehlermeldung:
"Fehler beim Speichern der Projektdatei "XYZ.csproj". This project object has been unloaded from the MSBuild engine and is no longer valid."

Auch beim Schliessen der Umgebung kommt diese Meldung und ich kann das Projekt nicht speichern. Bearbeite ich allerdings die Projektdatei mit einem Text-Editor, kann ich die neue Klasse menuell einfügen und dann auch das Projekt wieder in VS2008 öffnen und normal kompilieren. Aber eben nur wieder solange, bis ich in VS eine neue Komponente ins Projekt einfüge.
Bei mehreren Projekten in der Solution tritt der Fehler nur in dem Projekt auf, das ich geändert habe.
Ich nutze Visual Studio 2008 Professional und programmiere in C#, das Betriebssystem in Windows 7, 32Bit.
Es scheint mir so zu sein, dass das Problem auftrtitt seit ich testweise VC#2010 Express installiert habe, sicher bin ich mir aber nicht.

Ich habe schon alles versucht, was mir einfällt.

  • VS2010 deinstalliert und bereinigt
  • VS2008 und alle .NET-Framework-Versionen neu installiert bzw. repariert
  • alles mögliche ergoogelt und ausprobiert (z.B. Zurücksetzen aller VS2008 Einstellungen)

Auch wenn ich neue Projekt erstelle tritt das Problem auf, sobald ich das erste mal eine neue Klassendatei hinzufüge und dann kompilieren will.
Ich hoffe es hat noch jemand eine Idde, die nicht mit Formatieren des Rechners zu tun hat?

MfG

Erstellt vor 13 Jahren

"FlowLayoutPanel"
um die Liste zu erweitern.

In deinem Fall, dass ein Button unter Text vriabler Länge "klebt" würde ich

  • ein FlowLayoutPanel auf Vertical stellen
  • das Label mit dem Text auf AutoSize
  • Label und Button ins FlowLayoutPanel
    ->Fertig.
Erstellt vor 13 Jahren

Hallo Sm|_|,

Ich habe bei einem meiner Projekte ein ganz ähnliches UI für die Kommunikation über serielle Schnittstellen. Ich habe ebenfalls ein UserControl erstellt, was je nach Auswahl in einer ComboBox die Daten des ausgewählten Ports anzeigt, das ist also meiner Meinung nach der richtige Weg um so etwas komfortabel zu lösen.

Um das ganze in ein Usercontrol auszulagern würde ich empfehlen die Controls im Designer aus der Form auszuschneiden und im Designer des usercontrols einzufügen. Leider muss man danach aber die Eventhandler neu erstellen, oder eben die Methoden ebenfalls rüberkopieren und neu zuweisen.

edit:
Ich nutze VS 2005...

hat es einen bestimmten Grund,dass du VS2005 nutzt?
Grade für eine akademische Abschlussarbeit wäre es doch bestimmt besser aktuelle Technik einzusetzen, oder? (nur so am Rande)

Viel Erfolg

Erstellt vor 13 Jahren

Du könntest einfach mit einem Timer nach ein paar sekunden noch einmal versuchen den Port zu öffnen.
Und das notfalls so oft, bis es schließlich klappt.

Erstellt vor 13 Jahren

Hallo,

sorry, dass ich jetzt erst daruf antworte, ich kam erst heute morgen wieder dazu nach der Sache zu schauen. Ich habe das Problem aber schließlich doch noch gefunden und beseitigen können.
Ein anderer Thread war es nicht. Das hätte mich auch gewundert, denn das sollte ja durch das lock-Statement abgefangen sein.

Ich konnte es jetzt soweit zurückverfolgen, dass ich an den Anfang und das Ende von fetchSettings() je einen Breakpoint gesetzt habe.
Beim 1. Aufruf der Methode wurde der Breakpoint am Anfang schon das 2. mal erreicht, bevor der Am Ende das erste mal erreicht wurde.
Da musste also irgendwo der Haken liegen. Ich habe dann herausfinden können, dass durch "irgend"ein event in der Rahmenanwendung das durch das 'fetchen' der settings ausgelöst wird, eine andere Komponente von mir dazu gebracht wird, die Methode GetSettings() nocheinmal aufzurufen. Der 2. Aufruf kam also aus dem selben Thread und geschah (wenn auch indirekt) innerhalb des 1. Aufrufes.
Allerdings nur beim 1. mal, so dass keine endlose Rekrsion entstand. Durch das weiterleiten über mehrere events war der StackTrace aber so unübersichtlich, dass man gar nicht mehr sehen konnte, dass die Aufrufe ineinander geschachtelt waren, man sah nur noch graue DynamicInvoke- und Invoke-statements im StackTrace-Fenster. Jedenfalls konnte ich dadurch, dass ich meinen anderen EventHandler erst zu einem späteren Zeitpunkt registriere, das Problem beheben.

Vielen Dank für eure Tipps, die den Denkanstoß für die Suche in die richtige Richtung gegeben haben!

Erstellt vor 13 Jahren

Hallo herbivore,

das kann dann sein, wenn das Objekt, das von _cache referenziert wird, beim zweiten Aufruf ein anderes ist.

Ist nicht der Fall. Das objekt wird nur einmal erzeugt und zugewiesen:


private Dictionary<ushort, ISettings> _cache = new Dictionary<ushort, ISettings>();

Oder wenn executingMethod außerhalb der Methode vor dem ersten Aufruf auf true gesetzt wird.

Ist nicht der Fall. Die variable habe ich nur zum testen eingeführt und sie wird nirgends sonst außer an den gezeigten Stellen verwendet.

Bau ein Projekt, dass nur den absolut nötigen Code enthält. Ersetze dass Fetch durch eine leere (Warte-)Schleife.

Das werde ich jetzt machen.
Sehr merkwürdig alles...

Erstellt vor 13 Jahren

So, das habe ich jetzt auch mal gemacht. Beim überprüfen des StackTrace ist aber auch nichts weiter herausgekommen, als vorher. Add wird immer nur aus der Mehtode heraus aufgerufen, die ich schon gepostet hatte. Im StackTrace den ich in der Add()-Methode bekomme ist fetchSettings() NICHT enthalten.
Aber was mich stutzig gemacht hat:
Wenn ich in der Methode Add (oder auch außerhalb, also in die Zeile, wo Add aufgerufen wird) einen Brakpoint setze, sehe ich, dass die Zeile fetchSettings(id) darüber grau hinterlegt ist, also offenbar gerade ausgeführt wird. Allerdings ist sie wie gesagt nicht im aktuellen StackTrace enthalten. Also wird sie wohl in einem anderen Thread gerade ausgeführt.

Um das zu überprüfen habe ich mal testweise folgendes Konstrukt eingefügt:



private bool _executingMethod = false;

public ISettings GetSettings(ushort id)
{
  lock (_cache)
  {
     try
     {
       if (_executingMethod)
       {
         throw new Exception("This is not possible !!!"); //diese Stelle wird erreicht!
       }
       _executingMethod = true;
    
       //hier steht wieder der normale Methoden-Inhalt
       //(zur Übersichtlichkeit weggelassen)
       ...

     }
     finally
     {
       _executingMethod = false;
     }
  }
}

Das mag etwas merkwürdig aussehen, aber es zeigt anhand der Stelle mit der Exception dass die Methode 2x parallel ausgeführt wird.
Das kann nach meinem Verständnis nicht sein, wenn mittels lock() synchronisiert wird, oder?