Seite 1 von 1

Sicherer Ablauf mti TCP-Daten und grafische Darstellung

Verfasst: 02.03.2013 17:13
von funkheld
Hallo, guten Tag.
Ich habe hier ein Programm um Fahrdaten vom Clienten ZUSI abzufragen.
Nun stelle ich diese auch sofort im gleichen Programm grafisch dar.

Kann das Programm mit den TCP-Event irgendwie überfordert werden ?
Oder wo kann man da noch eine Überwachung reinbauen, damit keine Daten verloren gehen ?

Danke.

Gruss
peter

Code: Alles auswählen

Procedure sprite_neu(Sprite, x, y, xx, yy, w.f, dx, dy, h)
    w = w * (#PI/180)
    r.f = Sqr(Pow(xx,2)+Pow(yy,2))/2
    t.f = ATan(xx/yy)
    w1.f = w       - t : w2.f = w       + t : w3.f = w + #PI - t : w4.f = w + #PI + t
    TransformSprite3D(Sprite, Cos(w1)*r, Sin(w1)*r, Cos(w2)*r, Sin(w2)*r, Cos(w3)*r, Sin(w3)*r, Cos(w4)*r, Sin(w4)*r)
    Start3D()
      DisplaySprite3D(Sprite, x-Cos(w)*dy+Sin(w)*dx, y-Sin(w)*dy-Cos(w)*dx, h)
    Stop3D()
EndProcedure


Global EventID.l,ClientID.l,rData.l,anz_id.l
Global text.s,wert.l,z.l,offs.l,geschw.l, motor.l 

Declare zusi_verbinden()
Declare auswerten()
Declare zeige_daten()

Enumeration
  #Window_0
  #Button_1
  #Button_2
  #String_0
  #String_1
  #String_2
  #zeiger1
  #anzeiger1
  #zeiger2
  #anzeiger2
EndEnumeration

Global *sbuffer = AllocateMemory(256)
Global *rbuffer = AllocateMemory(256)
Global *buffer = AllocateMemory(256)

InitSprite()
InitSprite3D()
InitNetwork()

CreateNetworkServer(1, 1435)

OpenWindow(#Window_0, 10, 10, 420,400, "Tcp-Server-Pult", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Window_0),5,100,400,200,0,0,0)

   StringGadget(#String_0, 10, 10, 120, 20, "")
   StringGadget(#String_1, 5, 60, 80, 30, "")
   StringGadget(#String_2, 100, 60, 80, 30, "")

   CreateSprite(#zeiger1,200,200, #PB_Sprite_Texture)
   CreateSprite3D(#zeiger1, #zeiger1)
   CreateSprite(#anzeiger1, 200,200, #PB_Sprite_Texture)
   CreateSprite3D(#anzeiger1, #anzeiger1)
   
   CreateSprite(#zeiger2,200,200, #PB_Sprite_Texture)
   CreateSprite3D(#zeiger2, #zeiger2)
   CreateSprite(#anzeiger2, 200,200, #PB_Sprite_Texture)
   CreateSprite3D(#anzeiger2, #anzeiger2)
   
   StartDrawing(SpriteOutput(#anzeiger1))
     Box(0,0,200,200,RGB(255,0,255))
     Circle(100,100,90,RGB(180,180,180))
   StopDrawing()
   StartDrawing(SpriteOutput(#zeiger1))
     Box(0,0,200,200,RGB(255,0,255))
     RoundBox(100,100,85,6,3,3,RGB(0,255,0))
   StopDrawing()
     
   StartDrawing(SpriteOutput(#anzeiger2))
     Box(0,0,200,200,RGB(255,0,255))
     Circle(100,100,90,RGB(180,180,180))
   StopDrawing()
   StartDrawing(SpriteOutput(#zeiger2))
     Box(0,0,200,200,RGB(255,0,255))
     RoundBox(100,100,85,6,3,3,RGB(255,0,0))
   StopDrawing()
 
   TransparentSpriteColor(#zeiger1, RGB(255, 0, 255))
   TransparentSpriteColor(#anzeiger1, RGB(255, 0, 255))
   TransparentSpriteColor(#zeiger2, RGB(255, 0, 255))
   TransparentSpriteColor(#anzeiger2, RGB(255, 0, 255))
   
   Sprite3DQuality(#PB_Sprite3D_BilinearFiltering )
   ClearScreen(RGB(140,140,140))
   
   sprite_neu(#anzeiger1,100,100,200,200,0,0,0,255)
   sprite_neu(#zeiger1,100,100,200,200,geschw+45,0,-3,255)
   
   sprite_neu(#anzeiger2,300,100,200,200,0,0,0,255)
   sprite_neu(#zeiger2,300,100,200,200,motor/10,0,-3,255)
   
   
 
Repeat
	EventID = WaitWindowEvent(3)    
	
  Select EventID
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
  EndSelect
	
  Select NetworkServerEvent()
  	Case 1 
  		anz_id=anz_id+1
  		ClientID = EventClient()
  		If anz_id=1
  		  text+Str(ClientID)+Chr(10)
  		  SetGadgetText(#string_0, text)
  		  zusi_verbinden() 
  		EndIf	 		   	
  	Case 2
  	  rdata=ReceiveNetworkData(ClientID, *rbuffer, 255) 	
  	  auswerten()   
  EndSelect
  
  FlipBuffers()
  
Until EventID = #PB_Event_CloseWindow

Procedure zeige_daten()
    sprite_neu(#anzeiger1,100,100,200,200,0,0,0,255)
    sprite_neu(#zeiger1,100,100,200,200,geschw+45,0,-3,255)
    
    sprite_neu(#anzeiger2,300,100,200,200,0,0,0,255)
    sprite_neu(#zeiger2,300,100,200,200,motor/5,0,-3,255)
    
    SetGadgetText(#String_1,Str(geschw))
    SetGadgetText(#String_2,Str(motor))
EndProcedure

Procedure auswerten()    
    For z=6 To rData Step 5
      If z > rData
        Break
      EndIf
      
      wert=PeekB(*rbuffer+z)
    
      If wert=1
        PokeL(*buffer + 0, PeekL(*rbuffer+z+1))
        geschw=Int(PeekF(*buffer))     
      ElseIf wert=9
        PokeL(*buffer + 0, PeekL(*rbuffer+z+1))
        motor=Int(PeekF(*buffer))  
      EndIf  
    Next
    
    zeige_daten()
EndProcedure
  
Procedure zusi_verbinden()
    offs = 0 
    PokeL(*sbuffer + 0, $03) : offs + 4
    PokeA(*sbuffer + 4, $00) : offs + 1
    PokeA(*sbuffer + 5, $02) : offs + 1
    PokeA(*sbuffer + 6, $00) : offs + 1
    SendNetworkData(ClientID, *sbuffer, offs)
    Delay(100)
    offs = 0 
    PokeL(*sbuffer + 0, $06) : offs + 4
    PokeA(*sbuffer + 4, $00) : offs + 1
    PokeA(*sbuffer + 5, $03) : offs + 1
    PokeA(*sbuffer + 6, $00) : offs + 1
    PokeL(*sbuffer + 7, $0A) : offs + 1
    PokeA(*sbuffer + 8, $01) : offs + 1
    PokeA(*sbuffer + 9, $09) : offs + 1
    SendNetworkData(ClientID, *sbuffer, offs)
    Delay(100)  
    offs = 0 
    PokeL(*sbuffer + 0, $04) : offs + 4
    PokeA(*sbuffer + 4, $00) : offs + 1
    PokeA(*sbuffer + 5, $03) : offs + 1
    PokeA(*sbuffer + 6, $00) : offs + 1
    PokeA(*sbuffer + 7, $00) : offs + 1
    SendNetworkData(ClientID, *sbuffer, offs)   
EndProcedure
 


Re: Sicherer Ablauf mti TCP-Daten und grafische Darstellung

Verfasst: 02.03.2013 17:39
von WPö
Moin, Peter!

Habe Deinen Quelltext zwar nicht angesehen, aber das Thema mit sicherem synchronem Datentransfer ist ja schonmal durchgekaut worden. Schau dort einfach nach.

Zum Datenaufkommen: Im schlimmsten Fall hast Du eine voll (= ca. 30%) ausgelastete Gigabit-Verbindung, was ca. 30MB/s sind. Bei einer üblichen MTU von 1500 Bytes ergeben sich 20.000 Pakete pro Sekunde. Die Ereignisschleife ordentlich prorammiert und sonst nicht zu viele Aufgaben zu erledigen, sollten diese von heutigen Maschinen noch abzuarbeiten sein.

Bei FastEthernet sinds nur noch 2000 Pakete/s und bei einer üblichen 6MBaud-Verbindung (100% Last) 400 Pakete/s. Diese Angaben gelten auch nur, wenn die jeweiligen Rückantworten keine Zeit brauchen. Damit kannst Du von vorhergehenden Zahlen nochmal die Hälfte abziehen.

Die 30% Leitungslast kommen deshalb zustande, da üblicherweise billige Kabel, billige Netzwerkkarten, schnell zusammengeschusterte Treiber und Paketkollisionen durch Switches die tatsächliche Auslastbarkeit reduzieren. Selbst mit sündhaft teuren Komponenten kommst Du nie über 60%.

Ich hoffe, ich konnte helfen.

Gruß - WPö

Re: Sicherer Ablauf mti TCP-Daten und grafische Darstellung

Verfasst: 03.03.2013 00:03
von cxAlex
WPö hat geschrieben: Die 30% Leitungslast kommen deshalb zustande, da üblicherweise billige Kabel, billige Netzwerkkarten, schnell zusammengeschusterte Treiber und Paketkollisionen durch Switches die tatsächliche Auslastbarkeit reduzieren. Selbst mit sündhaft teuren Komponenten kommst Du nie über 60%.
Also in dem Punkt muss ich widersprechen, hab erst letzten das gesamte Netzwerk im Haus auf 1 GBit/s Komponenten bzw. 300 MBit/s WLAN umgestellt, alles mit Customer Geräten (50€ Router, 20€ Switches und einige 5/10 Meter flexible! CAT5 Kabel in den Wänden) und erreiche im Upload/Download auf den FTP - Server im Keller doch von sämtlichen Anschlüssen stabil zwischen 90-95 MByte/s.

Gruß, Alex