AG 100U CPU 95 - Datenabfrage über PG während des Programms

asisnet

Member
Beiträge
11
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
In einem Abstand von 10 Sekunden werden aus der AG die Datenbausteine DB2 und DB3 (jeweils 255 DW) ausgelesen (über TTY Konverter als RS232C)

Während des Auslesens werden weiter die Eingänge abgefragt (Aufruf eines FB aus OB1 bis OB6 - sind halt 60 Eingänge) und bei positivem Flankenwechsel Daten vom DB2 nach DB3 kopiert und neue Daten in den DB2 geschrieben.

Was genau passiert nun, wenn die Anfrage zum Senden des Datenbausteins über die PG kommt. Kann es sein, dass ich einen "halb aktualisierten" DB auslesen, oder wird der FB auf jeden Fall erst beendet, bevor der DB gesendet wird?

Gruß,
Stefan
 

Zottel

Well-known member
Beiträge
2.299
Punkte Reaktionen
277
Abfragen über die PG-Schnittstelle sind asynchron. Du kannst also einen teilaktualisierten DB bekommen.
Mögliche Abhilfe:
Im SPS-Programm Daten in einen weiteren DB kopieren, aber nur falls ein bestimmter Merker 0 ist.
Dann diesen Merker setzen.
Im abfragenden Programm zuerst diesen Merker abfragen. Wenn gesetzt, Daten lesen und danach Merker löschen.
 

Zottel

Well-known member
Beiträge
2.299
Punkte Reaktionen
277
Du kopierst ja schon nach DB3. Also wirst Du auch in einen weiteren DB kopieren können.

Aber besser wäre es vielleicht, das weirtere Kopieren zu vermeiden. Dazu verwendest Du abwechselnd den DB3 und
einen weiteren neuen DB(4?). Jetzt brauchst Du zwei Merker, wie ich es vorher beschrieben habe.

Zyklus 1
SPS kopiert nach DB3 und setzt Merker 1.
PC liest Daten aus DB3 und löscht Merker 1
Zyklus 2
SPS kopiert nach DB4 und setzt Merker 2.
PC liest Daten aus DB3 und löscht Merker 2

Die SPS verwendet also den DB, dessen zugehöriger Merker gelöscht ist. (Neues?) Problem: wenn die Daten nicht abgeholt werden, kann die SPS nicht mehr kopieren. Aber das bedeutet, das die Abfrage zu langsam ist und hätte auch bei der bisherigen Lösung zu Datenverlust durch überschreiben des DB3 geführt.

Nach obigem Muster kannst Du auch noch mehr Puffer verwenden.
Das kann dann sinnvoll sein, wenn der reine Transfer schnell genug ist, der PC aber zwischen 2 Abfragen was anderes tut oder Windoofs über das Rendern von true type fonts meditiert.
 
OP
A

asisnet

Member
Beiträge
11
Punkte Reaktionen
0
Das Problem ist, dass ich nur dann 4 DWs von DB2 nach DB3 kopieren, wenn eine pos. Flanke am entsprechenden Eingang vorliegt. Das heisst, bei jedem bestimmten Eingang werden dann die zugeordneten 4 DWs von DB2 nach DB3 kopiert. Abgeholt werden müssen aber immer zwei vollständige DBs. Also fände ich die Lösung mit dem Kopieren des DB2 in DB6 und des DB3 und DB7 unter Beachtung eines "Auslesemerkers" recht gelungen.

Nur,wie kann man eine kompletten DB am schnellsten in einen anderen Kopieren? Schleife oder fest jeden DW ansprechen? Ich bekomme es leider mit der Schleife nicht hin :evil:

Vielleicht hast Du ja einen Tipp für mich? :oops:
 

Zottel

Well-known member
Beiträge
2.299
Punkte Reaktionen
277
Zuviel Werbung?
->Hier kostenlos registrieren
Sonst ist Schleife kürzer und viele L ade/T ransfer-Anweisungen sind länger und schneller, weil kein Schleifenzähler bearbeitet wird.
Ich erinnere mich gerade nicht ob es einen System FB zum Blockkopieren gab. Der könnte schneller sein, weil er sonst unzugängliche Mechanismen der Firm- oder Hardware nutzt.

Das absolut schnellste ist wiederum, den DB NICHT zu kopieren.
Ich denke Du hast einen FBx, der das kopieren von DB2 nach 3 macht und der sieht vielleicht so aus:


UN M1.0 // keine positive Flanke
SPB nix_kopie
A DB 2
L DW 1
A DB3
T DW1

A DB 2
L DW 2
A DB3
T DW2
...
nix_kopie: NOP 0


Wenn Du ihn so umschreibst:

UN M1.0 // keine positive Flanke
SPB nix_kopie
A DB 2
L DW 1
T MW100 // Schmiermerker
L DW 2
T MW102
...
A DB 3
L MW 100
T DW1
L MW 100
T DW2
nix_kopie: NOP 0
gibt es nur noch zwei Stellen, wo A DB x aufgerufen wird

Wenn Du ihn weiter umschreibst:

UN M1.0 // keine positive Flanke
SPB nix_kopie
A DB 2
L DW 1
T MW100 // Schmiermerker
L DW 2
T MW102
...

U M 3.3 // DB3 nicht verfügbar
SPB bloss_nicht_DB3
A DB 3
SPA kann_losgehen

bloss_nicht_DB3: NOP 0
U M 3.4 // DB13 nicht verfügbar
SPB bloss_nicht_DB13
A DB 13
SPA kann_losgehen

SPB bloss_nicht_DB13: NOP 0
BEA // kein Puffer verfügbar, Datenverlust!

kann_losgehen: NOP 0
L MW 100
T DW1
L MW 100
T DW2
nix_kopie: NOP 0

wird DB3 oder DB13 benutzt. Der andere kann in der Zwischenzeit
ausgelesen werden.

Wenn Du aber unbedingt immer nach DB3 schreiben must weil Du ihn noch woanders brauchst, hier eine weitere Variante. DB3 wird nicht mehr abgefragt, statt dessen abwechselnd DB13 und DB23:

UN M1.0 // keine positive Flanke
SPB nix_kopie
A DB 2
L DW 1
T MW100 // Schmiermerker
L DW 2
T MW102

A DB 3
L MW100
T DW1
...
// nun sind Deine Daten im DB3
//
U M 3.3 // DB13 nicht verfügbar
SPB bloss_nicht_DB13
A DB 13
SPA kann_losgehen

bloss_nicht_DB13: NOP 0
U M 3.4 // DB23 nicht verfügbar
SPB bloss_nicht_DB23
A DB 23
SPA kann_losgehen

SPB bloss_nicht_DB23: NOP 0
BEA // kein Puffer verfügbar, Datenverlust!

kann_losgehen: NOP 0
L MW 100
T DW1
L MW 100
T DW2
nix_kopie: NOP 0

jetzt enthält DB13 oder DB23 die aktuelle Kopie von DB3.
 
Oben