- Beiträge
- 14.554
- Reaktionspunkte
- 3.348
[COLOR=#ff0000]// die ersten beiden Zeichen vergleichen
L "P_RCV_Data".RCV_String[1]
L "P_RCV_Data".RCV_String[2]
<>I
L s5t#2s[/COLOR]
[COLOR=#ff0000] SE T 100[/COLOR]
[COLOR=#ff0000] U T 100[/COLOR]
[COLOR=#ff0000] SPB INC[/COLOR]
// Alphabet durchzählen
[COLOR=red]INC:[/COLOR] L "P_SEND_Data".SND_ASCII[1]
L 1 // lade nächstes Zeichen
+I
T "P_SEND_Data".SND_ASCII[1]
L 98
>I // Alphabet-Ende erreicht...
SPBN ende
L 97 // ... wieder bei 'a' anfangen
T "P_SEND_Data".SND_ASCII[1]
ende: NOP 0
// die ersten beiden Zeichen vergleichen
[COLOR="Red"]L "P_SEND_Data".SND_ASCII[1][/COLOR]
L "P_RCV_Data".RCV_String[2]
<>I
L S5T#50MS
SE T 5
U T 5
SPB INC
// Alphabet durchzählen
INC: L "P_RCV_Data".RCV_String[1]
T "P_RCV_Data".Antwort_Teilnehmer // Welcher Teilnehmer hat zuletzt geantwortet?
L "P_SEND_Data".SND_ASCII[1]
L 1 // lade nächstes Zeichen
+I
T "P_SEND_Data".SND_ASCII[1]
L 98
>I // Alphabet-Ende erreicht...
SPBN ende
L 97 // ... wieder bei 'a' anfangen
T "P_SEND_Data".SND_ASCII[1]
ende: NOP 0
[COLOR="Red"]// Nun wird ein Bit vom antwortenden Busteilnehmer gespeichert,
// um erkennen zu können, welcher Busteilnehmer ausgefallen ist.
// Es wird ab Byte 530 im DB2 gespeichert, darum wird DBX530.0 nach dezimal umgerechnet:
// Bit 530.0 -> 4240 dezimal.
// Da das Alphabet bei 97dez anfängt, muss man von der 4240 den Wert 97 abziehen,
// damit das erste Bit vom ersten Teilnehmer ab Bit 530.0 gesetzt wird:
// 4240 - 97 = 4143
// Teilnehmer a: 4143 + 97 = Bit 530.0
// Teilnehmer b: 4143 + 98 = Bit 530.1
// usw.
INC: L 4143 // Offset 4143 laden
L "P_RCV_Data".RCV_String[2] // dezimalen Wert von der Busadresse laden
+I // beide Werte addieren
ITD // von INT nach DOUBLE umwandeln
LAR1 // Wert ins Adressregister 1 laden
AUF "P_RCV_Data"
= DBX [AR1,P#0.0] // aus dem Wert einen Pointer generieren
[/COLOR]
// Alphabet durchzählen
L "P_SEND_Data".SND_ASCII[1] // lade letztes gesendete Zeichen
L 1 // lade nächstes Zeichen
+I
T "P_SEND_Data".SND_ASCII[1]
L 98
>I // Alphabet-Ende erreicht...
SPBN ende
L 97 // ... wieder bei 'a' anfangen
T "P_SEND_Data".SND_ASCII[1]
ende: NOP 0
// alle Daten da, Senden wieder anstoßen
SET
= "P_SEND_Data".SND_Anstoss
nop0: NOP 0
Daran habe ich auch gedacht, aber es flackern die Bits von TRUE nach FALSE und umgekehrt.Du könntest alle Bits gemeinsam zurücksetzen, wenn eine "Neue Runde" in der Kommunikation startet.
// SENDEN
CALL "P_SEND_OLD" , "P_SEND_Instanz"
REQ :="P_SEND_Data".SND_Anstoss
R :=
LADDR :=256
DB_NO :=3
DBB_NO:=4
LEN :=1
DONE :="P_SEND_Data".SND_Done
ERROR :="P_SEND_Data".SND_Error
STATUS:=
// EMPFANGEN
CALL "P_RCV_OLD" , "P_RCV_Instanz"
EN_R :=M0.1
R :=
LADDR :=256
DB_NO :=2
DBB_NO:=4
NDR :="P_RCV_Data".RCV_NDR
ERROR :="P_RCV_Data".RCV_Error
LEN :=
STATUS:=
L "P_RCV_Instanz".i_GESAMTLAE
T "P_RCV_Data".aktuelle_Laenge
// Sende-Anstoß blockieren
CLR
= "P_SEND_Data".SND_Anstoss
[COLOR="Red"]// alle Statusbits der Busteilnehmer zurücksetzen
L 0
T DB2.DBD 530[/COLOR]
// nutzbare Länge errechnen
L "P_RCV_Data".aktuelle_Laenge
L 3
-I
T "P_RCV_Data".nutzbare_Laenge
Danke für den Hinweis, hatte das mit dem ITD vor längerer Zeit hier im Forum gelesen. Habs nun rausgenommen und es geht tatsächlich noch immer!Laß das ITD weg, beim Umwandeln in einen Pointer. Hatte ich auch mal, führt bei großen Int zu einem Fehler im späteren Pointer. Man darf nicht ITD wandeln denn das höchste Bit wird u.U. als Minus interpretiert und dann auch bei ITD entsprechend in der Double verschoben. Das Ergebnis ist Datenmüll als Zeiger! Das ganze funktioniert ohne ITD.
Daran habe ich auch gedacht, aber es flackern die Bits von TRUE nach FALSE und umgekehrt.
Vielleicht mache ich es aber auch falsch?!
Code:// SENDEN CALL "P_SEND_OLD" , "P_SEND_Instanz" REQ :="P_SEND_Data".SND_Anstoss R := LADDR :=256 DB_NO :=3 DBB_NO:=4 LEN :=1 DONE :="P_SEND_Data".SND_Done ERROR :="P_SEND_Data".SND_Error STATUS:= // EMPFANGEN CALL "P_RCV_OLD" , "P_RCV_Instanz" EN_R :=M0.1 R := LADDR :=256 DB_NO :=2 DBB_NO:=4 NDR :="P_RCV_Data".RCV_NDR ERROR :="P_RCV_Data".RCV_Error LEN := STATUS:= L "P_RCV_Instanz".i_GESAMTLAE T "P_RCV_Data".aktuelle_Laenge // Sende-Anstoß blockieren CLR = "P_SEND_Data".SND_Anstoss [COLOR="Red"]// alle Statusbits der Busteilnehmer zurücksetzen L 0 T DB2.DBD 530[/COLOR] // nutzbare Länge errechnen L "P_RCV_Data".aktuelle_Laenge L 3 -I T "P_RCV_Data".nutzbare_Laenge
Das sieht so aus, als ob du nun immer 0 reinschreibst. Ich würde das erst machen, bevor ich mit dem 1. Teilnehmer wieder von vorn beginne.
// SENDEN
CALL "P_SEND_OLD" , "P_SEND_Instanz"
REQ :="P_SEND_Data".SND_Anstoss
R :=
LADDR :=256
DB_NO :=3
DBB_NO:=4
LEN :=1
DONE :="P_SEND_Data".SND_Done
ERROR :="P_SEND_Data".SND_Error
STATUS:=
// EMPFANGEN
CALL "P_RCV_OLD" , "P_RCV_Instanz"
EN_R :=M0.1
R :=
LADDR :=256
DB_NO :=2
DBB_NO:=4
NDR :="P_RCV_Data".RCV_NDR
ERROR :="P_RCV_Data".RCV_Error
LEN :=
STATUS:=
L "P_RCV_Instanz".i_GESAMTLAE
T "P_RCV_Data".aktuelle_Laenge
// Sende-Anstoß blockieren
CLR
= "P_SEND_Data".SND_Anstoss
// nutzbare Länge errechnen
L "P_RCV_Data".aktuelle_Laenge
L 3
-I
T "P_RCV_Data".nutzbare_Laenge
// erstes Zeichen auslesen und speichern
L "P_RCV_Data".RCV_String[1]
T "P_RCV_Data".erstes_ASCII_Zeichen[1]
// zweites Zeichen auslesen und speichern
L "P_RCV_Data".RCV_String[2]
T "P_RCV_Data".zweites_ASCII_Zeichen[1]
// die ersten beiden Zeichen vergleichen
L "P_SEND_Data".SND_ASCII[1]
L "P_RCV_Data".RCV_String[2]
<>I
L S5T#50MS
SE T 5
U T 5
SPB INC
// verwertbare ASCII-Daten heraussuchen
CALL "MID"
IN :="P_RCV_Data".RCV_String
L :="P_RCV_Data".nutzbare_Laenge
P :=3
RET_VAL:="P_RCV_Data".ASCII_Daten
// empfangenen ASCII-String nach INT wandeln
CALL "STRNG_I"
S :="P_RCV_Data".ASCII_Daten
RET_VAL:="P_RCV_Data".INT_Daten
U "P_RCV_Data".RCV_NDR
SPBN nop0 // Mache nichts, wenn keine neue Daten empfangen wurden
// Im DB die Speicherstelle generieren
L "P_SEND_Data".SND_ASCII[1]
L 97
-I
L 2
*I
SLW 3
LAR1
L "P_RCV_Data".INT_Daten
T #Werte
AUF "P_INT_Data"
L #Werte
T DBW [AR1,P#0.0]
// Nun wird ein Bit vom antwortenden Busteilnehmer gespeichert,
// um erkennen zu können, welcher Busteilnehmer ausgefallen ist.
// Es wird ab Byte 530 im DB2 gespeichert, darum wird DBX530.0 nach dezimal umgerechnet:
// Bit 530.0 -> 4240 dezimal.
// Da das Alphabet bei 97dez anfängt, muss man von der 4240 den Wert 97 abziehen,
// damit das erste Bit vom ersten Teilnehmer ab Bit 530.0 gesetzt wird:
// 4240 - 97 = 4143
// Teilnehmer a: 4143 + 97 = Bit 530.0
// Teilnehmer b: 4143 + 98 = Bit 530.1
// usw.
INC: L 4143 // Offset 4143 laden
L "P_RCV_Data".RCV_String[2] // dezimalen Wert von der Busadresse laden
+I // beide Werte addieren
LAR1 // Wert ins Adressregister 1 laden
AUF "P_RCV_Data" // den dazugehörigen DB zum Speichern öffnen
S DBX [AR1,P#0.0] // aus dem Wert einen Pointer generieren
// Alphabet durchzählen
L "P_SEND_Data".SND_ASCII[1] // lade letztes gesendete Zeichen
L 1 // lade nächstes Zeichen
+I
T "P_SEND_Data".SND_ASCII[1]
L 98
>I // Alphabet-Ende erreicht...
SPBN ende
L 97 // ... wieder bei 'a' anfangen
T "P_SEND_Data".SND_ASCII[1]
[COLOR="red"]// alle Statusbits der Busteilnehmer zurücksetzen
L 0
T DB2.DBD 530[/COLOR]
ende: NOP 0
// fertig, Senden wieder anstoßen
SET
= "P_SEND_Data".SND_Anstoss
nop0: NOP 0
Bin noch weiter am Probieren, aber evtl. hat jemand (Vielleicht Larry?) einen Lösungsvorschlag?!
Und genau da wollte ich auch anfangen.Du müßtest es wenn dann so ändern, das der Teilnehmer regelmäßig antwortet. Tut er es eine zeitlang nicht (Timeout), so setzt du dann das Bit zurück ...
// SENDEN
CALL "P_SEND_OLD" , "P_SEND_Instanz"
REQ :="P_SEND_Data".SND_Anstoss
R :=
LADDR :=256
DB_NO :=3
DBB_NO:=4
LEN :=1
DONE :="P_SEND_Data".SND_Done
ERROR :="P_SEND_Data".SND_Error
STATUS:=
// EMPFANGEN
CALL "P_RCV_OLD" , "P_RCV_Instanz"
EN_R :=M0.1
R :=
LADDR :=256
DB_NO :=2
DBB_NO:=4
NDR :="P_RCV_Data".RCV_NDR
ERROR :="P_RCV_Data".RCV_Error
LEN :=
STATUS:=
L "P_RCV_Instanz".i_GESAMTLAE
T "P_RCV_Data".aktuelle_Laenge
// Sende-Anstoß blockieren
CLR
= "P_SEND_Data".SND_Anstoss
// nutzbare Länge errechnen
L "P_RCV_Data".aktuelle_Laenge
L 3
-I
T "P_RCV_Data".nutzbare_Laenge
// erstes Zeichen auslesen und speichern
L "P_RCV_Data".RCV_String[1]
T "P_RCV_Data".erstes_ASCII_Zeichen[1]
// zweites Zeichen auslesen und speichern
L "P_RCV_Data".RCV_String[2]
T "P_RCV_Data".zweites_ASCII_Zeichen[1]
// die ersten beiden Zeichen vergleichen
L "P_SEND_Data".SND_ASCII[1]
L "P_RCV_Data".RCV_String[2]
<>I
L S5T#50MS
SE T 5
U T 5
SPB INC
// Nun wird ein Bit vom antwortenden Busteilnehmer gespeichert,
// um erkennen zu können, welcher Busteilnehmer ausgefallen ist.
// Es wird ab Byte 530 im DB2 gespeichert, darum wird DBX530.0 nach dezimal umgerechnet:
// Bit 530.0 -> 4240 dezimal.
// Da das Alphabet bei 97dez anfängt, muss man von der 4240 den Wert 97 abziehen,
// damit das erste Bit vom ersten Teilnehmer ab Bit 530.0 gesetzt wird:
// 4240 - 97 = 4143
// Teilnehmer a: 4143 + 97 = Bit 530.0
// Teilnehmer b: 4143 + 98 = Bit 530.1
// usw.
[COLOR="Red"] L 4143 // Offset 4143 laden
L "P_RCV_Data".RCV_String[2] // dezimalen Wert von der Busadresse laden
+I // beide Werte addieren
LAR1 // Wert ins Adressregister 1 laden
AUF "P_RCV_Data" // den dazugehörigen DB zum Speichern öffnen
S DBX [AR1,P#0.0] // aus dem Wert einen Pointer generieren
[/COLOR]
// verwertbare ASCII-Daten heraussuchen
CALL "MID"
IN :="P_RCV_Data".RCV_String
L :="P_RCV_Data".nutzbare_Laenge
P :=3
RET_VAL:="P_RCV_Data".ASCII_Daten
// empfangenen ASCII-String nach INT wandeln
CALL "STRNG_I"
S :="P_RCV_Data".ASCII_Daten
RET_VAL:="P_RCV_Data".INT_Daten
U "P_RCV_Data".RCV_NDR
SPBN nop0 // Mache nichts, wenn keine neue Daten empfangen wurden
// Im DB die Speicherstelle generieren
L "P_SEND_Data".SND_ASCII[1]
L 97
-I
L 2
*I
SLW 3
LAR1
L "P_RCV_Data".INT_Daten
T #Werte
AUF "P_INT_Data"
L #Werte
T DBW [AR1,P#0.0]
[COLOR="red"]INC: L 4143 // Offset 4143 laden
L "P_SEND_Data".SND_ASCII[1] // dezimalen Wert von der Busadresse laden
+I // beide Werte addieren
LAR1 // Wert ins Adressregister 1 laden
AUF "P_RCV_Data" // den dazugehörigen DB zum Speichern öffnen
R DBX [AR1,P#0.0] // aus dem Wert einen Pointer generieren[/COLOR]
// Alphabet durchzählen
L "P_SEND_Data".SND_ASCII[1] // lade letztes gesendete Zeichen
L 1 // lade nächstes Zeichen
+I
T "P_SEND_Data".SND_ASCII[1]
L 98
>I // Alphabet-Ende erreicht...
SPBN ende
L 97 // ... wieder bei 'a' anfangen
T "P_SEND_Data".SND_ASCII[1]
ende: NOP 0
// fertig, Senden wieder anstoßen
SET
= "P_SEND_Data".SND_Anstoss
nop0: NOP 0
// Im DB die Speicherstelle generieren
L "P_SEND_Data".SND_ASCII[1]
L 97
-I
L 2
*I
SLW 3
LAR1
L "P_RCV_Data".INT_Daten
T #Werte
AUF "P_INT_Data"
L #Werte
T DBW [AR1,P#0.0]
[B][COLOR="Red"] SPA abc[/COLOR][/B]
INC: L 4143 // Offset 4143 laden
L "P_SEND_Data".SND_ASCII[1] // dezimalen Wert von der Busadresse laden
+I // beide Werte addieren
LAR1 // Wert ins Adressregister 1 laden
AUF "P_RCV_Data" // den dazugehörigen DB zum Speichern öffnen
R DBX [AR1,P#0.0] // aus dem Wert einen Pointer generieren
// Alphabet durchzählen
[COLOR="red"][B]abc:[/B][/COLOR] L "P_SEND_Data".SND_ASCII[1] // lade letztes gesendete Zeichen
L 1 // lade nächstes Zeichen
+I
T "P_SEND_Data".SND_ASCII[1]
L 98
>I // Alphabet-Ende erreicht...
SPBN ende
L 97 // ... wieder bei 'a' anfangen
T "P_SEND_Data".SND_ASCII[1]
ende: NOP 0
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?