Datenbytes "zusammensetzen"

TheBadFrog

Level-1
Beiträge
12
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Gemeinde,

ich habe folgende Aufgabe.
Erstellen eins Handlingbausteins für eine serielle Schnittstelle.
Aufbau ist grob beschriebn so:
S7 greift über Profibus auf einen Profibusteilnehmer auf dem das serielle Modul arbeitet.
E/A Breite 10 Byte
2 Byte Control/Status und 8 Byte Nutzdaten
Scheibe ähnelt der Beckhoff Serial Scheibe (teilweise)

Um die Daten konsistent zu erhalten, habe ich SFC 14 und 15 verwendet.
Die gewählten Sende und Empfangs DB´s habe als UDT deklariert, so kann ich die einzelnen Bytes/Bits direkt,sybolisch ansprechen TA,TR,.... ansprechen.
Leider ist es nun so, dass mir die Scheibe beim Empfangen leider nicht die 8 Bytes Nutzdaten am Stück sendet!
(Ich muss also die Daten aus dem Empfangs DB des SFC holen und umkopieren und zu einem Paket zusammenbauen!)
Sondern meist 1 Byte und dann die Reslichen, bzw. mannachmal auch in 3 Anläufen.
Habe schon einige Ansätze versucht, aber bisher nichts brauchbares.

Ablauf dachte ich mir so

Datenlänge ist vorgegeben auf 10 Byte (bzw.auf max 10Byte variabel) (0-9, wobei die Nutzdaten in Byte 2-9 liegen, Byte 0 enthält Handshake Bits, Byte 1 die Längenangaben der gesendeten bzw. empfangenen Bytes....)

Abfage der empfangen Bytes (Länge) (sind in Byte 1)
Diese entwede in einen anderen DB umkopieren oder in einem Arry über Pointer ablegen
Ist die empfangen Byteanzahl kleiner als 8, muss man von der Scheibe neue Daten anfordern (Handshake)
Diese wieder wegschreiben (mit Pointer in akt. Stelle im Array hochzählen)

Ist die Anzahl des 1. einlesens und des 2. einlesens =8 ok,
sonst nochmals einlesen...........

Allg. Frage an die Praktiker, mein Baustein soll ja dem Anwender der Scheibe die Nutzdatenbyte zur Verfügung stellen, reicht es hier diese in einem Array zu hinterlegen bzw. einem DB (für einen Zyklus der SPS, oder soll bzw. muss ich diese Puffern? z.B. in einem DB 50 Bytes in einem Ringpuffer hinterlegen?
Dann müsste der Anwender aber wieder mein DB auswerten?


Gruß TheBadFrog
 
Auf Daten lesen vom Anwender warten durch "Lesen-Flag".
Busy Flag setzen. (Signal Daten werden gelesen aus Baugruppe)
DB-Lesebuffer löschen.
Daten lesen aus Baugruppe, in DB ablegen und liegen lassen.
Datenkontrolle wurde was gelesen ?
Wenn gelesen Daten OK "Ready-Flag" setzen, Busy-Flag reset.

Anwender liest jetzt die Daten und nimmt dann Lesen-Flag zurück, erledigt. (Daten-Lesen und nicht busy und Ready = Daten lesen für Anwender.)

Neustart wieder mit wechsel 0..1 Lesen-Flag und natürlich nicht Busy-Flag und nicht ready. Flags sollten auch im DB liegen wegen Remanenz.

Nur als Vorschlag, so würde ich das machen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo FKJ,

wie würdest Du die Daten denn dann "archivieren" ?
Wegkopieren in anderen DB z.B. mit Blockmove, es sind dann jedoch die zu archivierendne Bereiche variabel, da die Karte ja nicht die 8 Byte Nutztdaten am Stück ausgibt!
Also erst ein Byte weggkopieren, dann Index erhöhen und die Nächsten Bytes wegkopieren

Oder gleich mit Pointer und Arrays.........

Gruß TheBadFrog
 
Servus

Ich verwende für sowas immer gerne Hi-Graph. Da kannst du schön Byte für Byte zusammenkopieren, verzweigen, warten bei Bedarf.
Da ja immer nur ein "balli" aktiv ist, geht das sehr übersichtlich.

verwendest du hi-graph ? Dann kann ich dir ein demo geben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo FKJ,
nein leider nicht, ich muss es ohne hinkriegen.
Überlege ob SCL gut wäre, wegen den Pointern und den Arrays.......
Habe schon ein Testprogramm mit einer Schrittkette aufgebaut (mit Tippbetrieb) damit ich sehen kann was sich bei jeder Aktion so tut...

Gruß TheBadFrog
 
scl ist ebenfalls sehr gut dafür geeignet, is nur mehr schreibarbeit.
bin mir sicher du machst das ganz geschmeidig.
 
Hallo FkJ,

heut habe ich erfahren muss erstmal in AWL mit Array und Pointern gemacht werden! :-((((((((((


Fange mal mit dem Teil wo ich die Daten vom SFC 14 lese und dann verarbeite........
Wäre einfach, wenn die gesendeten Daten am Stück wären!
So muss ich erst vergleichen wieviele Daten angekommen sind.
Diese ins Array ablegen.
Neue Daten Anfordern (hoffentlich sinds dann auch nur die 8 Byte....)
Dies dann als fertig markieren.......
Anwender kann Sie abholen......oder ich kopiere Sie um?
Wieder Daten holen, wenn Scheibe diese meldet.........
Zusammensetzen........

............

Habe heue mal bei Beckhoff geschaut (HW ist ähnlich) aber nichts....
Weniger Datenbreite, anderer Handshake.......
Hat jemand ein Beispielprogramm?

Gruß TheBadFrog
 
Zurück
Oben