# Datenverteiler



## paulo78 (27 März 2010)

Hallo,

Ich versuche momentan einen Datenverteiler zu programmieren. Habe schon ein paar Versuche gemacht, aber das gefällt mir alles nicht da es nicht sehr professionel ist was ich bisher da zusammen gestrickt habe.
Vieleicht habt ihr eine gute Lösung.
Ich will paraktisch eine 3 Byte Behlsfolge an die COM Schnittstelle der SPS versenden. Den COM Baustein habe ich in meiner LIB.
Der COM Baustein um die Schnittelle anzusprechen darf im Programm nur einmal aufgerufen werden es hat auch nur ein "IN" Beinchen wo ich nacheinander Werte reinschreiben kann.Sobald der Wert an "IN" versendet wurde gibt der Baustein mir eine OUT wieder (daten versendet).

Deshalb benötige ich sowas wie einen Datenverteiler der jedes mal eine neuen wert an das Beinchen des Bausteines schreibt.
Das erste Byte enthält z.B eine Behlsziffer sagen wir mal ein 2 das zweite Byte enthält eine adresse sagen wir mal eine 10 das dritte Byte enthält einen wert von 0 bis 255. Ich will diese 3 Parameter immer nacheinader and die COM Schnittstelle schicken. Wobei die drei Werte sich natürlich ändern.

Wie würdet Ihr sowas sauber programmieren ?? 

Grüße
Paulo


----------



## Lipperlandstern (27 März 2010)

Ich würd das ganze mit einer Schrittkette lösen.

An den IN deines Bausteins schreibst du eine Variable die du dann in Abhangigkeit deiner Schrittkette mit dem passenden Wert beschreibst. Bekommst du von deinem Baustein die Rückmeldung "Daten versendet" gehts weiter zum nächsten Schritt.


----------



## Panzerknacker (27 März 2010)

Du könntest auch relativ simpel eine Sprungleiste einsetzen und mit jedem OUT-Impuls deines Sende-Bausteins zählst du eine Variable hoch.
An den jeweiligen Sprungmarken transferierst du dann den entsprechenden Wert an den Sende-Baustein.

Gruß
Matthias


----------



## paulo78 (27 März 2010)

Hallo Panzerknacker,

Das hört sich gut an, könntest du das vieleicht ein bischen genauer erläutern.

Gruß


----------



## Panzerknacker (27 März 2010)

Hallo, es könnte in etwa so aussehen:

```
U     "DB_SendBuffer".FC_Out
      FP    "DB_SendBuffer".HM_FP_cnt
      SPBN  cnt
      L     "DB_SendBuffer".cnt
      L     1
      +I    
      T     "DB_SendBuffer".cnt
cnt:  NOP   0

      L     "DB_SendBuffer".cnt         // aktueller Zähler
      SPL   X0
      SPA   X0                          // cnt 0 - Fehler
      SPA   X1                          // cnt 1 - 1. Sende Wert
      SPA   X2                          // cnt 2 - 2. Sende Wert
      SPA   X3                          // cnt 3 - 3. Sende Wert
      SPA   X4                          // cnt 4 - 4. Sende Wert
      SPA   X5                          // cnt 5 - 5. Sende Wert
      SPA   X6                          // cnt 6 - 6. Sende Wert
      SPA   X7                          // cnt 7 - 7. Sende Wert
      SPA   X8                          // cnt 8 - 8. Sende Wert
X0:   NOP   0                           // hier Fehlerauswertung
      SPA   ERR

X1:   L     "DB_SendBuffer".Wert[1]
      SPA   SND
X2:   L     "DB_SendBuffer".Wert[2]
      SPA   SND
X3:   L     "DB_SendBuffer".Wert[3]
      SPA   SND
X4:   L     "DB_SendBuffer".Wert[4]
      SPA   SND
X5:   L     "DB_SendBuffer".Wert[5]
      SPA   SND
X6:   L     "DB_SendBuffer".Wert[6]
      SPA   SND
X7:   L     "DB_SendBuffer".Wert[7]
      SPA   SND
X8:   L     0
      T     "DB_SendBuffer".cnt
      L     "DB_SendBuffer".Wert[8]
      SPA   SND

SND:  T     "DB_SendBuffer".SendWert
      SET   
      R     "DB_SendBuffer".Err

// hier könnte dein FC-Aufruf zum senden stehen - muss aber nicht

      SPA   END

ERR:  NOP   0
      SET   
      S     "DB_SendBuffer".Err
      L     1
      T     "DB_SendBuffer".cnt

END:  NOP   0
```
Alle Angaben ohne Gewähr - ungetestet und ohne großartige Sicherheitsabfragen.

Gruß
Matthias


----------



## PN/DP (27 März 2010)

*Ringpuffer*

Ist das nicht eine typische Aufgabe für einen Ringpuffer?
Wikipedia - Warteschlange & Ringpuffer

Immer, wenn Du was senden willst, wirfst Du die 3 Zeichen sofort in den Ringpuffer hintendran (enter).
Der Sendebaustein überwacht den Ringpuffer, und wenn der nicht leer ist, dann holt er 1 Zeichen raus 
(leave) und versendet es. 
Dazu mußt Du im Ringpuffer einen In-Pointer und einen Out-Pointer verwalten.

Wenn Du allerdings nach jeder gesendeten 3-Zeichen-Folge auf eine Antwort des Empfängers warten
mußt, dann wird es etwas komplizierter.

Gruß
Harald


----------

