Laden...

Forenbeiträge von Mammut Ingesamt 13 Beiträge

28.01.2014 - 11:17 Uhr

Ja ist mir klar. Die 0.1ms laufen auch auf dem Microcontroller. Der Speicher den ich fülle ist auch Thread und Interupt sicher. Falls es zum Überschreiben von Daten kommt, die noch nicht versendet wurden, bekomme ich eine Meldung und der Microcontroller hört auf zu senden.

Der Computer (Windows und .Net) bekommt alle 70ms ein Paket, dass er entgegennimmt und speichert. Dafür braucht er ca. 2ms. Wenn der PC für mehr als 3 Sekunden hängt, dann knallt es. Das ist mir auch bewusst. Ich habe leider keine anderen Mittel zur Verfügung.

Letzte Lösung, wenn diese nicht stabil läuft, wäre eine SD-Karte im Microcontroller einzubauen und darauf die Daten zu speichern. Und dann die Daten von der SD-Karte nach und nach an den Computer zu versenden. Dann kann ich auch mit den Collections arbeiten. Auf die SD-Karte mag ich aber noch gerne verzichten.

Gruß
Mammut

28.01.2014 - 10:03 Uhr

Danke für deine Antwort!!

Ich habe den Netzwerkverkehr mitgeschnitten. Das Ergebnis ist ernüchternd... Meine Dropbox funkt mir dazwischen -.- Wenn ich die Dropbox ausschalte läuft es.

1: Das Paket wird versendet

2: Dann kommt 5x folgendes Paket:
318 17.179918000 192.168.0.101 255.255.255.255 DB-LSP-DISC 175 Dropbox LAN sync Discovery Protocol

3: Dann kommt er der Ack vom versendeten Paket.

Das Ack ist nun so spät dran, dass der Versender denkt, dass das Paket nicht angekommen wäre. Zwischen Senden und Ack liegen ca 60-70ms.

Jetzt fehlt noch ein Fall:
Was passiert, wenn ein Paket wirklich falsch ankommt und erneut geschickt werden muss? Ich konnte meinen Sendespeicher im Microcontroller bis auf 10 Nachrichten buffern. Danach ist der Speicher im Microcontroller voll. Ich hoffe, dass das reicht, sonst muss ich wirklich umsteigen X(

Gruß
Mammut

EDIT:
Ich verwende keine blockierenden Collections. Die Collections sind mir zu langsam. Sie haben leider nur einen Timeout von 1ms. Ich arbeite mit einem Interupt der in 0,1ms getaktet ist. Falls nun ein Fehler in der Collection auftritt und der Timeout abläuft, wurde die Collection schon wieder 10x aufgerufen und dann sitze ich im "Deadlock".

Ich möchte nicht, dass das Programm dann blockiert, da man dann keine gescheite Fehlermeldung erhält und darauf nicht reagieren kann.

Das einzige was blockierend bzw. wartend ist, ist das senden.

25.01.2014 - 19:19 Uhr

Hi,

es ist ein unerwarteter Fehler aufgetreten. Die Kommmunikation bricht nach einer unbestimmten Zeit immer wieder ab. Mal nach 2 Minuten mal nach 10 Minuten. Die Zeitmessung sagt, dass das Empfangen von einer Nachricht etwa 1200ms braucht. Danach kommt ein weiteres Paket an und dann sendet der Microcontroller nicht mehr weiter.

Ich vermute, das der Puffer voll ist und des dadurch zu diesem Fehler kommt. Gibt es eine Möglichkeit den Puffer der Netzwerkkarte auszulesen? Oder hat doch der GC seine Finger im Spiel? Wenn ja, gibt es eine Möglichkeit den auszustellen?

Gruß
Mammut

13.01.2014 - 18:00 Uhr

Danke für den Tipp 🙂

Hauptsache die Anwendung kommt hinter her und es entsteht kein großer Datenstau, dass die Anwendung abstürzt.

Habe gerade getestet, wie sich das Programm verhält, wenn es 2 Sekunden hängt.

Ergebnis: Stabil! Der GC kann ruhig kommen 😁 Ich denke aber nicht, dass er GC sich anschaltet wird, da ich keinen neuen Speicher deklariere bzw. reserviere (wenn ich Daten empfange) und die Priorität vom GC ist so minimal, dass er wohl in seinen Startlöchern wartet.

Wie groß ist eigentlich der Puffer vom TCP? Habe dazu noch keine Informationen gefunden.

Gruß
Mammut

13.01.2014 - 16:11 Uhr

Ich habe erfreuliche Nachrichten.

Das Problem war der Rechenfehler in den Nutzdaten. Ich habe die 0x600 durch 0x5B4 ausgetauscht.

Taktung zum Senden liegt jetzt bei 73ms.
Dauer um das Paket zu Empfangen und in eine Datei zu schreiben: 0,2 - 1 ms.

Danke für eure Hilfe!! 👍 🙂

13.01.2014 - 15:22 Uhr

Danke für deine Antwort.

Mein Server läuft auf einem MBED (Microcontroller). Schade, dass Ethernet keine Echtzeit unterstützt.

Ich kenne den Profibus noch nicht. Werde mir den gleich mal anschauen. Dank für den Tip 😃

13.01.2014 - 14:30 Uhr

Danke für deine Antwort 😃

Wie hoch ist die Wahrscheinlichkeit, dass alle Pakete mit UDP bei einer direkten Verbindung mit einem Cross-Over-Kabel korrekt ankommen? Es ist für mich schon sehr wichtig, dass alle Datenpakete korrekt ankommen.

Ich werde gleich den Socket auf UDP umschreiben. Bin auf die Zeitmessung gespannt.

Gruß
Mammut

Edit:
Lese gerade, dass UDP nicht meinen Anforderungen entspricht, da die Pakete auch in einer unterschiedlichen Reihenfolge ankommen können. Die Reihenfolge ist sehr wichtig!

Weiterer Nachtrag:
Ethernet-Paket
MTU: 1500Bytes
Nutzdaten: 1500Bytes - 20Bytes TCP Header - 20 Bytes IP Header = 1460 Bytes

Quelle: http://www.elektronik-kompendium.de/sites/net/0812211.htm

Vielleicht kommt es dadurch zu den unterschiedlichen Messzeiten?!

Gruß
Mammut

13.01.2014 - 13:13 Uhr

Hi,

Vorhaben
Ich möchte gerne so schnell wie möglich Daten über TCP Empfangen.

Ausgang
Server sendet ein TCP-Paket, dass 0x600 Bytes => 1536 Bytes groß ist. (maximale Nutzgröße eines TCP-Paketes)

Zum Empfangen nutze ich folgenden Code:


TcpClient tcpclnt = new TcpClient();
tcpclnt.Connect(_ip, _port);
Stream _stream = tcpclnt.GetStream();

int _bufSize = 0x600;
byte _buf = new byte[_bufSize];
int _isClosed;

Stopwatch watch = new Stopwatch();

while(true)
{
  watch.Start();

  _isClosed = _stream.Read(_buf, 0, _bufSize);            
  if (_isClosed == 0) break; //Verbindungsabbruch

  watch.Stop();

  Console.WriteLine(watch.ElapsedMilliseconds + " ms");
  watch.Reset();
}

Problem
Die Zeitmessung besagt, dass der Empfang der Pakete zwischen 5ms und 150ms dauert.

Ich möchte nun gerne, dass die Pakete maximal 50ms brauchen, um Empfangen zu werden, weil der Server in einem 77ms Takt die Pakete sendet.

Wie bekomme ich es hin, dass maximal 50ms benötigt werden, um ein Paket zu empfangen?
Wieso kommt es zu so einer starken Schwankung?

Ich hoffe ihr könnt mir weiterhelfen 😃

Gruß
Mammut

08.12.2013 - 00:07 Uhr

Hallo Zusammen!

Vorhaben
Ich möchte gerne eine View öffnen und dann einen entsprechenden Kunde in einer ComboBox automatisch ausgewählt haben.

Problem
Der Kunde wird nicht ausgewählt. Die ComboBox ist leer.

Mein Code

ViewModel:


//Im Konstruktor
using (var context = new DatabaseEntities()) {
                ListKunden = new List<Kunden>(context.Kunden.ToList<Kunden>());
                SelectedKunde = context.Kunden.First(x => x.Id == Termin.Kunden_ID);
}

//Felder
public List<Kunden> ListKunden { get; set; }
public Kunden SelectedKunde { get; set; }

View:


<ComboBox Grid.Row="1" Grid.Column="1" MinWidth="100" 
                  ItemsSource="{Binding ListKunden}" 
                  SelectedItem="{Binding SelectedKunde}">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Vorname}" />
                        <TextBlock Text=" " />
                        <TextBlock Text="{Binding Nachname}" />
                    </StackPanel>
                </DataTemplate>
            </ComboBox.ItemTemplate>

        </ComboBox>

Ich hoffe ihr könnt mir weiterhelfen 😃

Gruß
Mammut

25.11.2013 - 21:06 Uhr

Ja habe ich.

Dann habe ich mehrere usings, in denen Calendar angeboten wird.
System.Window.Controls.Calendar und Microsoft.Window.Controls.Calendar.

Gruß
Mammut

21.11.2013 - 01:36 Uhr

Selbst bei den Samples treten Fehler auf. Ich kam eben auf die Idee den Kalender im Sample-Folder zu erstellen. Aber dies geht leider auch nicht. Ich bin langsam echt am verzweifeln... so schwer kann das doch nicht sein!!! X(

20.11.2013 - 23:49 Uhr

Vielen Dank für deine Antwort!!

Ich habe nun den Inhalt von der Generic.xaml Datei in meine MainWindow.xaml kopiert, wie du es gesagt hast. Nun bekomme ich leider 58 Fehler 🙁 Irgendwas stimmt da noch nicht. 🤔

20.11.2013 - 10:59 Uhr

Hallo zusammen,

ich bin neu hier im Forum und mache meine ersten Versuche mit C#. Ich habe bereits gute Erfahrungen mit Java.

Zu meinem Problem:
Ich möchte gerne eine WPF-Applikation schreiben und einen Calendar einbinden. Dazu habe ich folgendes Tutorial gefunden, an dem ich mich langhangeln wollte.

Styling the WPF Calendar to Resemble Outlook's Month View Calendar

Nun habe ich aber Probleme, alle Komponenten in mein Projekt einzubinden, so dass keine Kompilierungsfehler auftreten.
**
Folgendes habe ich gemacht:**
WPF Toolkit runtergeladen und installiert: http://wpf.codeplex.com/releases/view/40535
Im Projekt auf Verweise die zwei dlls hinzugefügt (absoluter Pfad, kann man den nicht realtiv machen und im aktuellen Projekt einbinden?)

Danach habe ich die Generic.xaml aus dem Source-Code in mein Projekt kopiert. Wo bzw. wie verweise ich auf die Datei?

Dann habe ich noch folgendes im MainWindow.xaml eingefügt: "xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit"

und im MainWindow.xaml.cs: using Microsoft.Windows.Controls;

**Das fehlt auch noch: **

Copy the default styles for Calendar, CalendarItem and CalendarDayButton controls in the window's resources.

Aber was ist damit gemeint?

Ich hoffe ihr könnt mir weiter helfen un ich bin euch sehr dankbar 😃 Google habe ich bereits benutzt und nichts gefunden 😦

Wenn das kleine Calendar-Projekt lauffähig ist, würde ich es hier in das Forum stellen.

Viele Grüße
Mammut