Hallo,
besten Dank für eure Antworten - doch leider funktioniert es es so nicht.
Programmier ich es so wie ihr das wollt "flackern" die beiden Bits wenn die Schleife durchlaufen wird.
Im Prinzip geht es darum:
Ich möchte einen Funktionsbaustein bauen für die Kommunikation mit einem Balluff-Identsystem (BIS-C), hierfür gibt es zwar einen, doch dieser funktioniert nicht mit F-CPUs wovon ich jedoch eine im Einsatz habe.
Ich poste jetzt mal den ganzen Text für das schreiben auf den Datenträger des BIS-C:
Meinen FC rufe ich zur Zeit im OB1 auf:
Code:
CALL FC 520
Parameter_DB :="DATA_IDENT_01"
Command :=2 // 2=schreiben
Length :=W#16#E //Anzahl der Byte die geschrieben werden soll
Address_MDS :=B#16#0 // ab Adresse 0 auf Datenträger schreiben
DAT_DB_number :="IDENT_01_WT"
DAT_DB_address:=B#16#0 // ab Adresse 0 im Schreibdatenbaustein Daten für das Schreiben auf MDS abholen AuftragStarten:="BIS_Kommunikation"._0._2
Reset_BIS :="BIS_Kommunikation"._0._0
Der FC hat folgenden Inhalt:
Netzwerk1: "14" Byte auf BIS-MDS "Schreiben" Teil 1 von 3
Code:
U #AuftragStarten
AUF #Parameter_DB
UN DBX 32.0 // Bearbeitung.SchreibenBegonnen
SPBN NOSR
AUF #Parameter_DB
//****** beschreiben des ausgangspuffers mit befehlen
L #Command // 2=schreiben
T DBB 17 // Befehlskennung (01Hex= lesen, 02Hex=schreiben) oder Daten
L #Address_MDS
T DBB 18 // Anfangsadresse (Low Byte)
L 0
T DBB 19 // Anfangsadresse (High Byte)
L #Length
T DBB 20 // Anzahl der Byte (Low Byte)
L 0
T DBB 21 // Anzahl der Byte (High Byte)
CLR
= DBX 16.7 // Datenträgertyp: 0=32 Byte Blockgröße
= DBX 31.7
SET
= DBX 16.0 // Signalisiert dem Identifikations-System, dass ein Auftrag vorliegt
= DBX 31.0
//****** antwort des eingangspuffers
U DBX 0.1 // Der Auftrag wurde erkannt und begonnen
U DBX 15.1
U DBX 0.0 // Datenträger im Schreib-/Lesebereich des Schreib-/Lesekopfs
U DBX 15.0
U DBX 0.7 // Das BIS-Identifikations-System befindet sich in betriebsbereitem Zustand.
U DBX 15.7
S DBX 32.0 // Bearbeitung.SchreibenBegonnen
NOSR: NOP 0
Netzwerk2: "14" Byte auf BIS-MDS "Schreiben" Teil 2 von 3
Mein Ausgangspuffer ist 14 Byte groß, deswegen steht hier etwas mit "14", also bitte nicht wundern.
Code:
U #AuftragStarten
AUF #Parameter_DB
U DBX 32.0 // Bearbeitung.SchreibenBegonnen
UN DBX 32.1 // Bearbeitung.SchreibenBeendet
SPBN schr
// DB-Addresse im Sendenbaustein ab der die Daten auf MDS geschrieben werden sollen
L #DAT_DB_address // DB-Addresse im Sendenbaustein ab der die Daten auf MDS geschrieben werden sollen
SLD 3
T #Zeiger
LAR1 #Zeiger
// Hilfzeiger für den Ausgangspuffer im Parameter_DB
L 17 // 17te Byte in Parameter_DB = Startbyte für Sendedaten
SLD 3
T #Hilfszeiger
LAR2 #Hilfszeiger
// Anzahl der vollen Durchläufe für die neue Länge bestimmen
L #Length
L 14
/D
T #AnzahlWiederholungen
// Anzahl des Wiederholungsrestes
L #Length
L 14
MOD
T #AnzahlWiederholungenRest
L #AnzahlWiederholungenRest
L 0
<>D
SPBN w1
L #AnzahlWiederholungen
L 1
+D
T #AnzahlWiederholungen
SPA o1
w1: NOP 0
L 14
T #AnzahlWiederholungenRest
o1: NOP 0
L #AnzahlWiederholungen
NEWI: T #AnzahlWiederholungen
L #AnzahlWiederholungen
L 1
==D
SPBN m1
// Länge der Schreibdaten um 1 verringern
L #AnzahlWiederholungenRest
L 1
-D
T #HilfswertLength
SPA n1
m1: NOP 0
L 13
T #HilfswertLength
n1: NOP 0
CLR
= DBX 32.2
// ab hier Übergabe der Werte an Ausgangspuffer
AUF #DAT_DB_number // DB-Nummer des Bausteins aus dem die Daten auf MDS geschrieben werden
L DBB [AR1,P#0.0] // Lade 1te Byte aus Sende_DB
AUF #Parameter_DB
T DBB [AR2,P#0.0]
L #HilfswertLength
L 0
==D
SPB t1
// L #AnzahlVollerWiederholung
L #HilfswertLength
NEXT: T #AnzahlDurchlaeufe
L #Zeiger
L P#1.0
+D
T #Zeiger
LAR1 #Zeiger
L #Hilfszeiger
L P#1.0
+D
T #Hilfszeiger
LAR2 #Hilfszeiger
AUF #DAT_DB_number
L DBB [AR1,P#0.0]
AUF #Parameter_DB
T DBB [AR2,P#0.0]
L #AnzahlDurchlaeufe
LOOP NEXT
t1: NOP 0
U DBX 16.6 // TI-BIT Zeigt bei Leseauftrags an, dass die Steuerung für weitere Daten bereit ist.
UN DBX 32.2
R DBX 16.6 // TI-BIT Zeigt bei Leseauftrags an, dass die Steuerung für weitere Daten bereit ist.
R DBX 31.6
S DBX 32.2
SPB x1
UN DBX 16.6 // TI-BIT Zeigt bei Leseauftrags an, dass die Steuerung für weitere Daten bereit ist.
UN DBX 32.2
S DBX 16.6 // TI-BIT Zeigt bei Leseauftrags an, dass die Steuerung für weitere Daten bereit ist.
S DBX 31.6
S DBX 32.2
// Bearbeitung.TI_Bit_Invertiert
NOP 0
U DBX 0.1 // AA-BIT Der Auftrag wurde erkannt und begonnen
U DBX 15.1
U DBX 0.2 // AE-BIT Der Auftrag wurde ohne Fehler beendet
U DBX 15.2
U DBX 0.0 // CP-BIT Datenträger im Schreib-/Lesebereich des Schreib-/Lesekopfs
U DBX 15.0
U DBX 0.7 // BB-BIT Das BIS-Identifikations-System befindet sich in betriebsbereitem Zustand.
U DBX 15.7
SPBN z1
S DBX 32.1 // Bearbeitung.SchreibenBeendet
R DBX 32.0 // Bearbeitung.SchreibenBegonnen
SPA schr
z1: NOP 0
U DBX 0.1 // AA-BIT Der Auftrag wurde erkannt und begonnen
U DBX 15.1
UN DBX 0.2 // AE-BIT Der Auftrag wurde ohne Fehler beendet
UN DBX 15.2
U DBX 0.0 // CP-BIT Datenträger im Schreib-/Lesebereich des Schreib-/Lesekopfs
U DBX 15.0
U DBX 0.7 // BB-BIT Das BIS-Identifikations-System befindet sich in betriebsbereitem Zustand.
U DBX 15.7
SPBN schr
L #AnzahlWiederholungenRest
T #Length
L #Zeiger
L P#1.0
+D
T #Zeiger
LAR1 #Zeiger
L #Hilfszeiger
L P#13.0
-D
T #Hilfszeiger
LAR2 #Hilfszeiger
L #AnzahlWiederholungen
LOOP NEWI
schr: NOP 0
Netzwerk3: "14" Byte auf BIS-MDS "Schreiben" Teil 3 von 3
Code:
U #AuftragStarten
AUF #Parameter_DB
U DBX 32.1 // Bearbeitung.SchreibenBeendet
SPBN ende
AUF #Parameter_DB
CLR
= DBX 16.0 // AV-BIT Signalisiert dem Identifikations-System, dass ein Auftrag vorliegt
= DBX 31.0
= DBX 16.6 // TI-BIT Zeigt bei Leseauftrags an, dass die Steuerung für weitere Daten bereit ist.
= DBX 31.6
= DBX 32.2 // Bearbeitung.TI_Bit_Invertiert
= #AuftragStarten
= DBX 32.1 // Bearbeitung.SchreibenBeendet
ende: NOP 0
SPA EXIT
Wenn ich beim Aufruf sage, dass ich 14 Byte (E) an Daten senden möchte funktioniert die ganze Sache, möchte ich nun mehr als 14Byte senden, z.B. 16, dann bleibe ich hängen. Das 15te und 16te Byte werden mir zwar in den Ausgangspuffer gelegt, doch nun müssten sich wieder die Bits DBX 16.6
und DBX 31.6 ändern, damit die Daten gesendet werden.
Ich hoffe einer von Euch kann mir da etwas helfen.