alle xml in .awl konvertiert und eingecheckt

This commit is contained in:
2026-07-08 09:44:59 +02:00
parent 1c935599e9
commit 9910240835
473 changed files with 102599 additions and 0 deletions
@@ -0,0 +1,87 @@
=== FC 78: BCD (4stellig)_to_INT [STL] ===
INTERFACE:
Input:
BCD_Wert : Word
Output:
Int_Wert : Int
InOut:
Temp:
BCD_Vergleich : Word
Multiplikator : Int
Constant:
Return:
Ret_Val : Void
--- NW 1: Rückmeldung ---
L 0 // erst mal köschen
T Int_Wert
L 1
T Multiplikator
--- NW 2: BCD-Wert wandeln ---
L BCD_Wert
T BCD_Vergleich
L 16#000F
AW
L Multiplikator
*I
L Int_Wert
+I
T Int_Wert
L Multiplikator
L 16
*I
T Multiplikator
L BCD_Vergleich
SRW 4
T BCD_Vergleich
L 16#000F
AW
L Multiplikator
*I
L Int_Wert
+I
T Int_Wert
L Multiplikator
L 16
*I
T Multiplikator
L BCD_Vergleich
SRW 4
T BCD_Vergleich
L 16#000F
AW
L Multiplikator
*I
L Int_Wert
+I
T Int_Wert
L Multiplikator
L 16
*I
T Multiplikator
L BCD_Vergleich
SRW 4
T BCD_Vergleich
L 16#000F
AW
L Multiplikator
*I
L Int_Wert
+I
T Int_Wert
--- NW 3: Ende ---
BE
@@ -0,0 +1,50 @@
=== FC 99: DBMOV [STL] ===
INTERFACE:
Input:
QuellDB : Int // Quell-DB
QuellDW : Int // Quell-1.DW
ZielDB : Int // Ziel-DB
ZielDW : Int // Ziel-1.DW
Anzahl_DW : Int // Anzahl der zu kopierenden DWs
Output:
RE_VAL : Int // Rückmeldung
InOut:
Temp:
Quelle : Any // Zeiger, wo Rein-Daten sind
Ziel : Any // Zeiger, FIFO-Stelle
Constant:
Return:
Ret_Val : Void
--- NW 1: ---
// Kennung + Datenbytes
L 16#1004 // Kennung 10 + Word=04
T LW0
T LW10 // Any-Kennung, Datentyp
L Anzahl_DW // Datenwords speichern
T LW2
T LW12 // Wiederholungen
// Quelle-Pointer erzeugen:
L QuellDB
T LW4 // DB_Nummer
L QuellDW // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
// Ziel-Pointer erzeugen:
L ZielDB
T LW14 // DB_Nummer
L ZielDW // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD16 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RE_VAL, DSTBLK:=Ziel) // Datenliste-Daten speichern
--- NW 2: Ende ---
BE
@@ -0,0 +1,55 @@
=== FC 1004: DL_Einsprung [STL] ===
INTERFACE:
Input:
Bereich_DL : Int // Nur für Stammdaten =1!
ID : Int
Output:
Dyn.DB : Int
AR_Start : DInt
Error : Bool
InOut:
Temp:
Constant:
Return:
Ret_Val : Void
--- NW 1: Inittialisierung ---
L 0
T "Dyn.DB"
L DINT#0
T AR_Start
SET
S Error
--- NW 2: ID suchen ---
L ID
T "MW200"
CALL FC "DatenOut" (SSDB:=Bereich_DL, SSDW:=0, PARA:=16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196") // Eintrag lesen
L "MB199"
L 2#1111111 // Bit 7 ausblenden
AW
L 0 // Fehler vorhanden?
<>I // Ja
= Error
BEC
--- NW 3: Daten übergeben ---
L "MW224"
T "Dyn.DB" // Dyn.DB
L 0 // sinnvoller Wert ?
<=I // Nein !
S Error
BEC
L "MW226"
ITD
T AR_Start
--- NW 4: Ende ---
BE
@@ -0,0 +1,627 @@
=== FC 91: DatenFindOffsetSort [STL] ===
INTERFACE:
Input:
SSDB : Int // Datenlisten-DB
SSDW : Int // Datenlisten-1.DW
PARA : Word // Aufrufparameter (Auftrag / Anzahl Zusatzdaten)
SEARCHDATEN : Pointer // Such-Daten-Schnittstelle
Output:
RE_VAL : Byte // Rückmeldung
OUTDATEN : Pointer // OutDaten-Schnittstelle
Position : Int // Daten stehen an angegebener Position in Datenbank
InOut:
Temp:
Quelle : Any // Zeiger, wo Rein-Daten sind
Ziel : Any // Zeiger, FIFO-Stelle
Kopf : Byte // Datenliste-Kennnung (DA)
Datensatzlaenge : Byte // Datensatzlänge in Word (01 - F0) F0=128
Listenlaenge : Int // Länge der Datenliste (maximale Anzahl der Datensätze)
Stammdaten : Int // Stammdatenlänge in Word (1 - 9)
Belegt06 : Int // reserviert von Datenliste
Belegt08 : Int // reserviert von Datenliste
Belegt10 : Int // reserviert von Datenliste
Belegt12 : Int // reserviert von Datenliste
AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze
Reserve16 : Int // Reserve
Reserve18 : Int // Reserve
Para1 : Byte // 1.Aufrufparameter
Para2 : Byte // 2.Aufrufparameter
Suchzeiger : Int // Suchzeiger
DBDatenliste : Word // Datenlisten-DB
OffsetDaten_1 : Int // Stammdaten beginnen ab hier
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
Datenlisten_Ende : Word // Ende der Datenliste
AR2_Speicher : DWord // Adress-Register 2 zwischenspeichern
Schleife : Word // Loopzähler
DBSuchDaten : Word // Such-Daten-DB, falls angegeben
SuchDaten_Pointer : DWord // Such-Daten-Pointer: Kennung, Adresse
SuchDaten_Startpunkt : Word // Such-Daten-Startpunkt: Adresse
DBOutDaten : Word // Out-Daten-DB, falls angegeben
OutDaten_Pointer : DWord // Out-Daten-Pointer: Kennung, Adresse
OutDaten_Startpunkt : Word // Out-Daten-Startpunkt: Adresse
IndPointer : DWord // Zeiger für IndDB
Daten_1 : Word // 1.Datenwort der Indaten
Datenblock_inBytes : Word // Datenblocklänge in Bytes
Suchstelle : Word // Bei angegebenen Datensatz suchen
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
Weitersuchen : Bool // Weitersuchen ist aktiv
Offsetsuchen : Bool // Offsetsuchen ist aktiv
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
tRE_VAL : Byte // Rückmeldung
Constant:
Return:
Ret_Val : Void
--- NW 1: Schnittstellen-DB sinnvoll ? ---
TAR2
T AR2_Speicher // AR2 zwischenspeichern
L SSDB
T DBDatenliste
// CALL TEST_DB
// DB_NUMBER :=#DBDatenliste
// RET_VAL :=#SFC_RET_VAL
// DB_LENGTH :=#SFC_DB_LENGTH
// WRITE_PROT :=#SFC_WRITE_PROT
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBDatenliste, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
O SFC_WRITE_PROT // schreibgeschützt
JC Err0 // kein Datenlisten-Bereich
--- NW 2: Quelle-Pointer erzeugen: ---
L 16#1004 // Kennung 10 + Word=04
T LW0 // Any-Kennung, Datentyp
L 16#000A // 10 Dw´s holen
T LW2 // Wiederholungen
L SSDB
T LW4 // DB_Nummer
L SSDW // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 10) // 1.-10.DW Datenliste holen
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
--- NW 3: Zeigerüberprüfung ---
L Kopf // Datenliste-Kopf
L 16#DB // = Sort-Datenlistekennung ?
<>I // Nein !
JC Err0 // kein Datenlistebereich
L 1
L Datensatzlaenge // Datenblocklänge
>I
JC Err0 // kein Datenlistebereich
L 128
>I
JC Err0 // kein Datenlistebereich
L 1
L Listenlaenge // Max.Anzahl von Datenblöcken
>I
JC Err0 // kein Datenlistebereich
L 1
L Stammdaten // Anzahl der Stammdaten
>I
JC Err0 // kein Datenlistebereich
L 9
>I
JC Err0 // kein Datenlistebereich
L Stammdaten // Anzahl der Stammdaten
L Datensatzlaenge // Datenblocklänge
>I
JC Err0 // kein Datenlistebereich
L Listenlaenge // Länge der Datenliste
L Datensatzlaenge // Datenblocklänge
*I
L 2 // DB byteorientiert
*I
+ 20 // Speichern ab 10.DW
L SSDW
+I
T Datenlisten_Ende
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBDatenliste]
L Datenlisten_Ende
L SFC_DB_LENGTH
>I // Datenlisten-DB ist zu kurz!
JC Err0 // kein Datenlisten-Bereich
L DBW [AR1Zeiger]
L 16#DAEE // Datenliste-Endekennung ?
<>I // Nein !
A(
CAC
L 16#DBEE // Sort-Datenliste-Endekennung ?
<>I // Nein !
)
JC Err0 // kein Datenlisten-Bereich
L Datensatzlaenge // Datenblocklänge
L 2
*I
T Datenblock_inBytes // Datenblocklänge in Bytes
--- NW 4: Auftrag kontrollieren ---
SET
R Weitersuchen // Weitersuchen ist aktiv
R Offsetsuchen // Offsetsuchen ist aktiv
L 0 // Vorerst kein Offset
T OffsetDaten_1
L PARA
T LW40 // Aufrufparameter zwischenspeichern
L 16#00 // XX = 00 ?
L Para1
==I // Ja!
JC W401
L 16#E1 // XX = E1 ?
==I // Ja!
JC Err3 // Falscher Aufrufparameter
L 16#F1 // XX = F1 ?
L Para1
<>I // Nein !
JC W400
L Para2
L 16#00
<>I
JC Err3 // Falscher Aufrufparameter
SET
S Weitersuchen
L SSDW
+ 20
T Suchzeiger
JU Nw08 // OutDaten ok ?
W400: L 16#FF // XX = FF ?
<>I // Nein !
JC W403
L Para2
L 16#00
<>I
JC Err3 // Falscher Aufrufparameter
SET
S Weitersuchen
L Suchzeiger // Alter Suchzeiger
L Datenblock_inBytes // Datenblocklänge in bytes
+I // Nächsten Datensatz suchen
T Suchzeiger // Neuer Suchzeiger
L Datenblock_inBytes // Datenblocklänge in bytes
L Listenlaenge // Alle möglichen Einträge
*I // Gesamtlänge
L SSDW // Startpunkt
+I
+ 20 // Offset 1.Daten
L Suchzeiger // Schreibzeiger
>I // Noch nicht am Ende !
JC Nw08 // OutDaten ok ?
JU Err2 // Listenende erreicht
W403: L 16#02 // XX < 02 ?
L Para1
>I // Ja!
JC Err3 // Falscher Aufrufparameter
L 16#80 // XX > 80 ?
>I // Ja!
JC Err3 // Falscher Aufrufparameter
CAC
L Datensatzlaenge // XX > Datensatzlänge
>I // Ja!
JC Err3 // Falscher Aufrufparameter
CAC
+ -1 // Angegebener Offset -1
L 2 // DB byteorientiert
*I
T OffsetDaten_1 // Richtiger Offset der 1.Stammdaten
L 0
T Suchzeiger // Suche ab Anfang
SET
S Offsetsuchen
W401: L 16#00 // =0 ?
L Para2 // 2.Aufrufparameter
==I // Ja !
JC W402
T Stammdaten // Anzahl der Stammdaten
L Datensatzlaenge // Datenblocklänge
>I
JC Err3 // Falscher Aufrufparameter
L 1
L Stammdaten // Anzahl der Stammdaten
>I
JC Err3 // Falscher Aufrufparameter
L 9
>I
JC Err3 // Falscher Aufrufparameter
W402: AN Offsetsuchen
JC Nw05
L Para1 // Offset
+ -1
L Stammdaten
+I // Letzte Stammdaten zu groß ?
L Datensatzlaenge
>I // Ja!
JC Err3 // Falscher Aufrufparameter
--- NW 5: Such-DATEN-Pointer übernehmen: ---
Nw05: L AnzahlEintraege // Anzahl der eingetragenen Datensätze
L 0 // Eintrag vorhanden ?
==I // Nein !
JC Err6 // Datensatz ist nicht vorhanden
L 0
T Suchzeiger // Suchzeiger
L P#
LAR2
L NoneW [AR2,]
T DBSuchDaten // Suchdaten-DB
L NoneD [AR2,] // Kennung, Adresse
T SuchDaten_Pointer
L DBSuchDaten // Suchdaten-DB
L 0 // Angegeben ?
==I // Nein
JC W501
// CALL TEST_DB
// DB_NUMBER :=#DBSuchDaten
// RET_VAL :=#SFC_RET_VAL
// DB_LENGTH :=#SFC_DB_LENGTH
// WRITE_PROT :=#SFC_WRITE_PROT
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBSuchDaten, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
L SFC_RET_VAL
L 2#0000_0000_0000_0000 // Fehler vorhanden ?
<>I // Ja !
JC Err4 // Undefinierte Stammdaten
L NoneD [AR2,] // Kennung, Adresse
L 16#00FF_FFFF // Ohne Kennung
AW
SRW 3 // Ohne Bit
T SuchDaten_Startpunkt
L Datensatzlaenge // Datenblocklänge
L 2 // DB byteorientiert
*I
L SuchDaten_Startpunkt
+I
L SFC_DB_LENGTH
>I // Suchdaten-DB ist zu kurz
JC Err4 // Undefinierte Stammdaten
W501: L SuchDaten_Pointer
LAR2
L DBSuchDaten // Suchdaten-DB
L 0 // Angegeben ?
==I // Nein
JC W502
OPN DB[DBSuchDaten]
W502: L NoneW [AR2,] // Suchdaten überprüfen
T Daten_1 // 1.Suchdaten speichern
L Stammdaten
L500: T Schleife
L DBSuchDaten // Suchdaten-DB
L 0 // Angegeben ?
==I // Nein
JC W503
OPN DB[DBSuchDaten]
W503: L NoneW [AR2,] // Suchdaten überprüfen
L 0 // Etwas angegeben ?
<>I // Ja !
JC Nw07 // Weiter
ADDAR2 P#2.0
L Schleife
LOOP L500
JU Err4 // Undefinierte Stammdaten
--- NW 6: Kontrolle auf gleiche Stammdaten ---
Nw07: L Suchzeiger // Suchzeiger
L 0 // Angegeben ?
==I // Nein !
JC W700 // Suche bei 1.Datensatz beginnen
L Suchzeiger // Suchzeiger
+ -20 // Zeiger 1.Daten
L Datenblock_inBytes // Datenblocklänge in Bytes
/I // Ermittlung der wievielten Daten -1
SRD 16 // Rest ermitteln
L 0 // = 0 ?
<>I // Suchzeiger nicht im Raster !
JC W700 // Suche bei 1.Datensatz beginnen
L 0 // Bei angegebener Stelle suchen
T Suchstelle // Such bei X-ten Datensatz
JU W701
W700: L 1 // Suche bei 1.Datensatz beginnen
T Suchstelle // Such bei X-ten Datensatz
L SSDW
+ 20 // Offset für 1.Daten
T Suchzeiger // Suchzeiger
W701: L Suchzeiger // Suchzeiger
L OffsetDaten_1 // Richtiger Offset der 1.Stammdaten
+I
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L SuchDaten_Pointer
LAR2
L Stammdaten // Anzahl der Stammdaten
L700: T Schleife
L DBSuchDaten // Suchdaten-DB
L 0 // Angegeben ?
==I // Nein
JC W702
OPN DB[DBSuchDaten]
W702: L NoneW [AR2,] // Suchdaten überprüfen mit
OPN DB[DBDatenliste]
L DBW [AR1Zeiger] // Datenliste-Daten lesen
<>I // nicht identisch !
JC W703
L AR1Zeiger
SRD 3
L 2
+D
SLD 3
T AR1Zeiger
ADDAR2 P#2.0
L Schleife
LOOP L700
L 2#0000_0000_1000_0000 // Daten sind vorhanden
T tRE_VAL // Ok-Status
JU Nw08 // Datensatz ist in Liste enthalten
W703: L 0 // Suche bei 1.Datensatz begonnen
L Suchstelle // Such bei X-ten Datensatz
==I // Nein !
JC W700
L Suchstelle // Such bei X-ten Datensatz
+ 1
T Suchstelle // Such bei X-ten Datensatz
L AnzahlEintraege // Anzahl der eingetragenen Datensätze
<=I // Alle Datensätze sind durchsucht
JC W705 // Nein !
JU Err6 // Datensatz ist nicht vorhanden
W705: L Datenblock_inBytes // Datenblocklänge in bytes
L Suchzeiger // Suchzeiger
+I
T Suchzeiger // Suchzeiger
JU W701
--- NW 7: Out-DATEN-Pointer übernehmen: ---
Nw08: L P#
LAR2
L NoneW [AR2,]
T DBOutDaten // Outdaten-DB
L NoneD [AR2,] // Kennung, Adresse
T OutDaten_Pointer
L DBOutDaten // Outdaten-DB
L 0 // Angegeben ?
==I // Nein
JC Nw09
// CALL TEST_DB
// DB_NUMBER :=#DBOutDaten
// RET_VAL :=#SFC_RET_VAL
// DB_LENGTH :=#SFC_DB_LENGTH
// WRITE_PROT :=#SFC_WRITE_PROT
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBOutDaten, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
L SFC_RET_VAL
L 2#0000_0000_0000_0000 // Fehler vorhanden ?
<>I // Ja !
JC Err5 // Undefinierte Outdaten
L NoneD [AR2,] // Kennung, Adresse
L 16#00FF_FFFF // Ohne Kennung
AW
SRW 3 // Ohne Bit
T OutDaten_Startpunkt
L OutDaten_Startpunkt
L SFC_DB_LENGTH
>I // Outdaten-DB ist zu kurz
JC Err5 // Undefinierte Outdaten
--- NW 8: Quelle-Pointer erzeugen: ---
Nw09: L 16#1004 // Kennung 10 + Word=04
T LW0
T LW10 // Any-Kennung, Datentyp
L Datensatzlaenge // Datenwords speichern
T LW2
T LW12 // Wiederholungen
// DATEN-Pointer übernehmen:
L SSDB
T LW4 // DB_Nummer
L Suchzeiger // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
// Ziel-Pointer erzeugen:
// Kennung + Datenbytes s.o.
L DBOutDaten
T LW14 // DB_Nummer
L OutDaten_Pointer
T LD16 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // Datenliste-Daten speichern
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
L SSDW
+ 12 // im 12.DW speichern
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L Suchzeiger // Suchzeiger
OPN DB[DBDatenliste]
T DBW [AR1Zeiger] // Speicherung letzter Zugriff
L Suchzeiger // Suchzeiger
+ -20 // Offeset 1.DS
L Datenblock_inBytes // Datenblocklänge in Bytes
/I
+ 1 // Position errechnen
T Position // Daten stehen an angegebener Position in Datenbank
--- NW 9: Weitersuchen aktiv ? Datensatz vorhanden oder 0 ? ---
AN Weitersuchen
JC Ende
L OutDaten_Pointer
LAR2
L Datensatzlaenge
L110: T Schleife
L DBOutDaten // Outdaten-DB
L 0 // Angegeben ?
==I // Nein
JC W111
OPN DB[DBOutDaten]
W111: L NoneW [AR2,] // Outdaten überprüfen
L 0 // Etwas angegeben ?
<>I // Ja !
JC W112 // Ok
ADDAR2 P#2.0
L Schleife
LOOP L110
L 2#0000_0000_0100_0000 // Daten sind nicht vorhanden
T tRE_VAL // Ok-Status
JU Ende
W112: L 2#0000_0000_1000_0000 // Daten sind vorhanden
T tRE_VAL // Ok-Status
JU Ende
--- NW 10: Fehlerausgabe / RET_VAL ---
Ende: SET // VKE = 1 ohne Fehler !!!
L tRE_VAL // Ok-Status
JU Ok
Err0: L 2#0000_0000_0000_0001 // Kein Datenlistebereich
JU Err
Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler
JU Err
Err2: L 2#0000_0000_0000_0100 // Listenende ist erreicht
JU Err
Err3: L 2#0000_0000_0000_1000 // Falscher Parameter bei Aufruf
JU Err
Err4: L 2#0000_0000_0001_0000 // Undefinierte Suchdaten
JU Err
Err5: L 2#0000_0000_0010_0000 // Undefinierte OUTDaten
JU Err
Err6: L 2#0000_0000_0100_0000 // Datensatz nicht vorhanden
Err: CLR // VKE = 0 bei Fehler !!!
Ok: T tRE_VAL
SAVE // VKE in BIE-Bit speichern
L AR2_Speicher // AR2 zurückspeichern
LAR2
--- NW 11: ---
L tRE_VAL
T RE_VAL
@@ -0,0 +1,552 @@
=== FC 85: DatenIn [STL] ===
INTERFACE:
Input:
SSDB : Int // Datenlisten-DB
SSDW : Int // Datenlisten-1.DW
INDATEN : Pointer // InDaten-Schnittstelle
Output:
RE_VAL : Byte
InOut:
Temp:
Quelle : Any // Zeiger, wo Rein-Daten sind
Ziel : Any // Zeiger, FIFO-Stelle
Kopf : Byte // Datenliste-Kennnung (DA)
Datensatzlaenge : Byte // Datensatzlänge in Word (01 - F0) F0=128
Listenlaenge : Int // Länge der Datenliste (maximale Anzahl der Datensätze)
Stammdaten : Int // Stammdatenlänge in Word (1 - 9)
IndDB : Word // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!)
IndDB_Laenge : Int // Länge des indizierten DB in Einträge (nur bei Stammdaten = 1 erlaubt !!!)
IndDaten_FC : Int // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!)
Schreibzeiger : Int // Speicherung des letzten Zugriffs / Schreibzeiger
Belegt14 : Int // reserviert von Sort-Datenliste
AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!)
Reserve18 : Int // Reserve
DBDatenliste : Word // Datenlisten-DB
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
Datenlisten_Ende : Word // Ende der Datenliste
AR2_Speicher : DWord // Adress-Register 2 zwischenspeichern
Schleife : Word // Loopzähler
DBInDaten : Word // Indaten-DB, falls angegeben
InDaten_Pointer : DWord // In-Daten-Pointer: Kennung, Adresse
InDaten_Startpunkt : Word // In-Daten-Startpunkt: Adresse
IndPointer : DWord // Zeiger für IndDB
Daten_1 : Word // 1.Datenwort der Indaten
Daten_2 : DWord // 1+2.Datenwort der Indaten (falls ind.Suchen mit Stammdaten 2)
LeerZeiger : Word // Zeiger für Leerzelle
Datenblock_inBytes : Word // Datenblocklänge in Bytes
Suchstelle : Word // Bei angegebenen Datensatz suchen
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
Indok : Bool // Indizierung möglich
IndZeiger_ok : Bool // Indizier-Zeiger angegeben
Sortliste : Bool // Sortliste wird durchsucht
tRE_VAL : Byte // Rückmeldung
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
DB_Länge : Int
Wandel_FC : Word // Wandel-FC
Constant:
Return:
Ret_Val : Void
--- NW 1: Schnittstellen-DB sinnvoll ? ---
TAR2
T AR2_Speicher // AR2 zwischenspeichern
L SSDB
T DBDatenliste
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBDatenliste, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge")
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
O SFC_WRITE_PROT
JC Err0 // kein Datenlisten-Bereich
--- NW 2: Quelle-Pointer erzeugen: ---
L 16#1004 // Kennung 10 + Word=04
T LW0 // Any-Kennung, Datentyp
L 16#000A // 10 Dw´s holen
T LW2 // Wiederholungen
L SSDB
T LW4 // DB_Nummer
L SSDW // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 10) // 1.-10.DW Datenliste holen
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
--- NW 3: Zeigerüberprüfung ---
L Kopf // Datenliste-Kopf
L 16#DB // = Sort-Datenlistekennung ?
==I // Ja !
= Sortliste // Sortliste wird durchsucht
JC w030
CAC
L 16#DA // = Datenlistekennung ?
<>I // Nein !
JC Err0 // kein Datenlistebereich
w030: L 1
L Datensatzlaenge // Datenblocklänge
>I
JC Err0 // kein Datenlistebereich
L 128
>I
JC Err0 // kein Datenlistebereich
L 1
L Listenlaenge // Max.Anzahl von Datenblöcken
>I
JC Err0 // kein Datenlistebereich
L 1
L Stammdaten // Anzahl der Stammdaten
>I
JC Err0 // kein Datenlistebereich
L 9
>I
JC Err0 // kein Datenlistebereich
L Stammdaten // Anzahl der Stammdaten
L Datensatzlaenge // Datenblocklänge
>I
JC Err0 // kein Datenlistebereich
L Listenlaenge // Länge der Datenliste
L Datensatzlaenge // Datenblocklänge
*I
L 2 // DB byteorientiert
*I
+ 20 // Speichern ab 10.DW
L SSDW
+I
T Datenlisten_Ende
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBDatenliste]
L Datenlisten_Ende
L "DB_Länge"
>I // Datenlisten-DB ist zu kurz!
JC Err0 // kein Datenlisten-Bereich
L DBW [AR1Zeiger]
L 16#DAEE // Datenliste-Endekennung ?
<>I // Nein !
A(
CAC
L 16#DBEE // Sort-Datenliste-Endekennung ?
<>I // Nein !
)
JC Err0 // kein Datenlisten-Bereich
L Datensatzlaenge // Datenblocklänge
L 2
*I
T Datenblock_inBytes // Datenblocklänge in Bytes
--- NW 4: In-DATEN-Pointer übernehmen: ---
L P#
LAR2
L NoneW [AR2,]
T DBInDaten // Indaten-DB
L DBInDaten // Indaten-DB
L 0 // Angegeben ?
==I // Nein
JC W401
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBInDaten, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge")
L SFC_RET_VAL
L 2#0000_0000_0000_0000 // Fehler vorhanden ?
<>I // Ja !
JC Err4 // Undefinierte Indaten
L NoneD [AR2,] // Kennung, Adresse
L 16#00FF_FFFF // Ohne Kennung
AW
SRW 3 // Ohne Bit
T InDaten_Startpunkt
L Datensatzlaenge // Datenblocklänge
L 2 // DB byteorientiert
*I
L InDaten_Startpunkt
+I
L "DB_Länge"
>I // Indaten-DB ist zu kurz
JC Err4 // Undefinierte Indaten
W401: L NoneD [AR2,] // Kennung, Adresse
T InDaten_Pointer
LAR2
L DBInDaten // Indaten-DB
L 0 // Angegeben ?
==I // Nein
JC W402
OPN DB[DBInDaten]
W402: L NoneW [AR2,] // Indaten überprüfen
T Daten_1 // 1.Indaten speichern
L NoneD [AR2,] // Suchdaten überprüfen
T Daten_2 // 1.Suchdaten speichern
L Stammdaten
L400: T Schleife
L DBInDaten // Indaten-DB
L 0 // Angegeben ?
==I // Nein
JC W403
OPN DB[DBInDaten]
W403: L NoneW [AR2,] // Indaten überprüfen
L 0 // Etwas angegeben ?
<>I // Ja !
JC Nw05 // Weiter
ADDAR2 P#2.0
L Schleife
LOOP L400
JU Err4 // Undefinierte Indaten
--- NW 5: Indiziert speichern ? ---
Nw05: SET
R Indok // Indizierung möglich
R IndZeiger_ok // Indizier-Zeiger angegeben
L IndDB // Indizierter DB
L 0 // Angegeben ?
==I // Nein !
O Sortliste // Sortliste wird durchsucht
JC Nw06
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=IndDB, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge")
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
O SFC_WRITE_PROT
JC Nw06 // kein Indizier-DB vorhanden
L IndDB_Laenge // Länge des Indizierten DB überschritten ?
L 2 // DB byteorientiert
*I
L "DB_Länge"
>I // Indizier-DB ist zu kurz
JC Nw06 // Zeiger ausserhalb Ind.DB
L Stammdaten // Stammdaten
L 3 // zu viele Stammdaten ?
>=I // Ja !
JC Nw06 // ohne Indizierung weiter
L IndDaten_FC // Offset zum Abziehen
T Wandel_FC
L 0 // Parameter vorhanden ?
<=I // Nein
JC NoFC // Bei diesem Schritt weiter
L Daten_1 // Stammdaten (1.DW)
T "MW90" // übergeben
L Daten_2 // Stammdaten (2.DW)
T "MD94" // übergeben
UC DB[Wandel_FC] // Beeinflussung der Weiterfahrt
L "MW92" // Rückwert von FC
JU Ret
NoFC: L Daten_1 // Stammdaten
Ret: T IndPointer // Stelle, wo Zeiger hinterlegt ist
L 0
<I // negativ
JC Nw06 // Zeiger = 0
L IndDB_Laenge // Länge des Indizierten DB überschritten ?
L IndPointer // Stelle, wo Zeiger hinterlegt ist
<=I // Ja !
JC Nw06 // Zeiger ausserhalb Ind.DB
L 2
*I // DB byteorientiert
SLD 3 // Pointer erzeugen
T IndPointer // Pointer, wo Zeiger hinterlegt ist
OPN DB[IndDB] // Indizierter DB
L DBW [IndPointer]
T Schreibzeiger // Schreibzeiger
OPN DB[DBDatenliste] // Datenliste DB
SET
S Indok // Indizierung möglich
S IndZeiger_ok // Indizier-Zeiger angegeben
--- NW 6: Kontrolle auf gleiche Stammdaten ---
Nw06: L 0 // nicht gespeichert
T LeerZeiger // Zeiger Leerzelle
L Schreibzeiger // Schreibzeiger
L 0 // Angegeben ?
==I // Nein !
JC W600 // Suche bei 1.Datensatz beginnen
L Schreibzeiger // Schreibzeiger
+ -20 // Zeiger 1.Daten
L Datenblock_inBytes // Datenblocklänge in Bytes
/I // Ermittlung der wievielten Daten -1
SRD 16 // Rest ermitteln
L 0 // = 0 ?
<>I // Schreibzeiger nicht im Raster !
JC W600 // Suche bei 1.Datensatz beginnen
L 0 // Bei angegebener Stelle suchen
T Suchstelle // Such bei X-ten Datensatz
JU W601
W600: L 1 // Suche bei 1.Datensatz beginnen
T Suchstelle // Such bei X-ten Datensatz
SET
R IndZeiger_ok // Indizier-Zeiger angegeben
L SSDW
+ 20 // Offset für 1.Daten
T Schreibzeiger // Schreibzeiger
W601: L Schreibzeiger // Schreibzeiger
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L InDaten_Pointer
LAR2
L Stammdaten // Anzahl der Stammdaten
L600: T Schleife
L DBInDaten // Indaten-DB
L 0 // Angegeben ?
==I // Nein
JC W602
OPN DB[DBInDaten]
W602: L NoneW [AR2,] // Indaten überprüfen mit
OPN DB[DBDatenliste]
L DBW [AR1Zeiger] // Datenliste-Daten lesen
<>I // nicht identisch !
JC W603
L AR1Zeiger
SRD 3
L DINT#2
+D
SLD 3
T AR1Zeiger
ADDAR2 P#2.0
L Schleife
LOOP L600
L 2#0000_0000_1100_0000 // Daten werden gespeichert + überschrieben
T tRE_VAL // Ok-Status
JU Nw07 // Datensatz ist in Liste enthalten
W603: L 0 // Suche bei 1.Datensatz begonnen
L Suchstelle // Such bei X-ten Datensatz
==I // Nein !
JC W600
L LeerZeiger // Zeiger Leerzelle
L 0 // Gespeichert ?
<>I // Ja !
JC W604
L Schreibzeiger // Schreibzeiger
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L Datensatzlaenge
L601: T Schleife
L DBW [AR1Zeiger] // Daten lesen
L 0 // Leerzelle ?
<>I // Nein !
JC W604
L AR1Zeiger
SRD 3
L DINT#2
+D
SLD 3
T AR1Zeiger
L Schleife
LOOP L601
L Schreibzeiger // Schreibzeiger
T LeerZeiger // Zeiger Leerzelle
W604: L Suchstelle // Such bei X-ten Datensatz
+ 1
T Suchstelle // Such bei X-ten Datensatz
L Listenlaenge // Anzahl aller Daten in Datenliste
<=I // Alle Datensätze sind durchsucht
JC W605 // Nein !
L 0 // Gefunden ?
L LeerZeiger // Zeiger Leerzelle
==I // Nein !
JC Err2 // Datenliste ist voll
T Schreibzeiger // Schreibzeiger
L 2#0000_0000_1000_0000 // Daten werden gespeichert
T tRE_VAL // Ok-Status
JU Nw07
W605: L Datenblock_inBytes // Datenblocklänge in bytes
L Schreibzeiger // Schreibzeiger
+I
T Schreibzeiger // Schreibzeiger
JU W601
--- NW 7: Quelle-Pointer erzeugen: ---
Nw07: L 16#1004 // Kennung 10 + Word=04
T LW0
T LW10 // Any-Kennung, Datentyp
L Datensatzlaenge // Datenwords speichern
T LW2
T LW12 // Wiederholungen
// DATEN-Pointer übernehmen:
L DBInDaten
T LW4 // DB_Nummer
L InDaten_Pointer
T LD6 // Kennung, Adresse
// Ziel-Pointer erzeugen:
// Kennung + Datenbytes s.o.
L SSDB
T LW14 // DB_Nummer
L Schreibzeiger // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD16 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // Datenliste-Daten speichern
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
A Sortliste // Sortliste wird durchsucht
JC Nw8
L SSDW
+ 12
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L Schreibzeiger // Schreibzeiger
OPN DB[DBDatenliste]
T DBW [AR1Zeiger] // Speicherung letzter Zugriff
L tRE_VAL // Ok-Status
L 2#0000_0000_1100_0000 // Daten werden gespeichert + überschrieben ?
==I // Ja !
O Indok // Indizierung möglich ((Dann nicht!)
JC Nw8 // Kein Neueintrag !
L SSDW
+ 16 // Offset Anzahl Einträge
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBDatenliste]
L DBW [AR1Zeiger] // Anzahl der Einträge
+ 1 // Einträge +1
T DBW [AR1Zeiger] // Anzahl der Einträge
--- NW 8: Indizierung ok ? ---
Nw8: AN Indok // Indizierung möglich
O IndZeiger_ok // Indizier-Zeiger angegeben
JC Ende
OPN DB[IndDB] // Indizierter DB
L Schreibzeiger // Schreibzeiger
T DBW [IndPointer]
OPN DB[DBDatenliste] // Datenliste DB
--- NW 9: Fehlerausgabe / RET_VAL ---
Ende: SET // VKE = 1 ohne Fehler !!!
L tRE_VAL // Ok-Status
JU Ok
Err0: L 2#0000_0000_0000_0001 // Kein Datenlistebereich
JU Err
Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler
JU Err
Err2: L 2#0000_0000_0000_0100 // Datenliste ist voll
JU Err
Err4: L 2#0000_0000_0001_0000 // Undefinierte Indaten
Err: CLR // VKE = 0 bei Fehler !!!
Ok: T tRE_VAL
SAVE // VKE in BIE-Bit speichern
L AR2_Speicher // AR2 zurückspeichern
LAR2
--- NW 10: Ausgangsvariablen schreiben ---
L tRE_VAL
T RE_VAL
@@ -0,0 +1,488 @@
=== FC 88: DatenInSort [STL] ===
INTERFACE:
Input:
SSDB : Int // Datenlisten-DB
SSDW : Int // Datenlisten-1.DW
INDATEN : Pointer // InDaten-Schnittstelle
Output:
RE_VAL : Byte // Rückmeldung
InOut:
Temp:
Quelle : Any // Zeiger, wo Rein-Daten sind
Ziel : Any // Zeiger, FIFO-Stelle
Kopf : Byte // Datenliste-Kennnung (DA)
Datensatzlaenge : Byte // Datensatzlänge in Word (01 - F0) F0=128
Listenlaenge : Int // Länge der Datenliste (maximale Anzahl der Datensätze)
Stammdaten : Int // Stammdatenlänge in Word (1 - 9)
Belegt06 : Int // reserviert von Datenliste
Belegt08 : Int // reserviert von Datenliste
Belegt10 : Int // reserviert von Datenliste
Belegt12 : Int // reserviert von Datenliste
AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze
Reserve16 : Int // Reserve
Reserve18 : Int // Reserve
DBDatenliste : Word // Datenlisten-DB
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
Datenlisten_Ende : Word // Ende der Datenliste
AR2_Speicher : DWord // Adress-Register 2 zwischenspeichern
Schleife : Word // Loopzähler
DBInDaten : Word // Indaten-DB, falls angegeben
InDaten_Pointer : DWord // In-Daten-Pointer: Kennung, Adresse
InDaten_Startpunkt : Word // In-Daten-Startpunkt: Adresse
Sort_Daten : DInt // Einzusortierende Daten (DWord)
Datenblock_inBytes : Word // Datenblocklänge in Bytes
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
Lesestelle : Int // An dieser Stelle Datensatz lesen
Min_Lesestelle : Int // Minimal sinnvolle Lesestelle
Max_Lesestelle : Int // Maximal sinnvolle Lesestelle
Savestelle : Int // An dieser Stelle wird In-Datensatz gespeichert
Lese_Daten : DInt // In Tabelle gelesenen Daten
Holstelle : Int // Freiraum schaffen: Stelle zum Daten holen
Bringstelle : Int // Freiraum schaffen: Stelle zum Daten schreiben
Holzeiger : DWord // Freiraum schaffen: Zeiger zum Daten holen
Bringzeiger : DWord // Freiraum schaffen: Zeiger zum Daten schreiben
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
Constant:
Return:
Ret_Val : Void
--- NW 1: Schnittstellen-DB sinnvoll ? ---
TAR2
T AR2_Speicher // AR2 zwischenspeichern
L SSDB
T DBDatenliste
// CALL TEST_DB
// DB_NUMBER :=#DBDatenliste
// RET_VAL :=#SFC_RET_VAL
// DB_LENGTH :=#SFC_DB_LENGTH
// WRITE_PROT :=#SFC_WRITE_PROT
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBDatenliste, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
O SFC_WRITE_PROT
JC Err0 // kein Datenlisten-Bereich
--- NW 2: Quelle-Pointer erzeugen: ---
L 16#1004 // Kennung 10 + Word=04
T LW0 // Any-Kennung, Datentyp
L 16#000A // 10 Dw´s holen
T LW2 // Wiederholungen
L SSDB
T LW4 // DB_Nummer
L SSDW // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 10) // 1.-10.DW Datenliste holen
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
--- NW 3: Zeigerüberprüfung ---
L Kopf // Datenliste-Kopf
L 16#DB // = Datenlistekennung ?
<>I // Nein !
JC Err0 // kein Datenlistebereich
L 1
L Datensatzlaenge // Datenblocklänge
>I
JC Err0 // kein Datenlistebereich
L 128
>I
JC Err0 // kein Datenlistebereich
L 1
L Listenlaenge // Max.Anzahl von Datenblöcken
>I
JC Err0 // kein Datenlistebereich
L 1
L Stammdaten // Anzahl der Stammdaten
>I
JC Err0 // kein Datenlistebereich
L 9
>I
JC Err0 // kein Datenlistebereich
L Stammdaten // Anzahl der Stammdaten
L Datensatzlaenge // Datenblocklänge
>I
JC Err0 // kein Datenlistebereich
L Listenlaenge // Länge der Datenliste
L Datensatzlaenge // Datenblocklänge
*I
L 2 // DB byteorientiert
*I
+ 20 // Speichern ab 10.DW
L SSDW
+I
T Datenlisten_Ende
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBDatenliste]
L Datenlisten_Ende
L SFC_DB_LENGTH
>I // Datenlisten-DB ist zu kurz!
JC Err0 // kein Datenlisten-Bereich
L DBW [AR1Zeiger]
L 16#DBEE // Datenliste-Endekennung ?
<>I // Nein !
JC Err0 // kein Datenlisten-Bereich
L Datensatzlaenge // Datenblocklänge
L 2
*I
T Datenblock_inBytes // Datenblocklänge in Bytes
L AnzahlEintraege // Anzahl der eingetragenen Datensätze
L Listenlaenge // Max.Anzahl von Datenblöcken
>=I // Nein !
JC Err2 // Datenliste ist voll
--- NW 4: Indaten definiert ? ---
// In-DATEN-Pointer übernehmen:
L P#
LAR2
L NoneW [AR2,]
T DBInDaten // Indaten-DB
L DBInDaten // Indaten-DB
L 0 // Angegeben ?
==I // Nein
JC W401
// CALL TEST_DB
// DB_NUMBER :=#DBInDaten
// RET_VAL :=#SFC_RET_VAL
// DB_LENGTH :=#SFC_DB_LENGTH
// WRITE_PROT :=#SFC_WRITE_PROT
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBInDaten, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
L SFC_RET_VAL
L 2#0000_0000_0000_0000 // Fehler vorhanden ?
<>I // Ja !
JC Err4 // Undefinierte Indaten
L NoneD [AR2,] // Kennung, Adresse
L 16#00FF_FFFF // Ohne Kennung
AW
SRW 3 // Ohne Bit
T InDaten_Startpunkt
L Datensatzlaenge // Datenblocklänge
L 2 // DB byteorientiert
*I
L InDaten_Startpunkt
+I
L SFC_DB_LENGTH
>I // Indaten-DB ist zu kurz
JC Err4 // Undefinierte Indaten
W401: L NoneD [AR2,] // Kennung, Adresse
T InDaten_Pointer
LAR2
L DBInDaten // Indaten-DB
L 0 // Angegeben ?
==I // Nein
JC W402
OPN DB[DBInDaten]
W402: L NoneD [AR2,] // Indaten überprüfen
T Sort_Daten // 1.Indaten speichern
L Stammdaten
L400: T Schleife
L DBInDaten // Indaten-DB
L 0 // Angegeben ?
==I // Nein
JC W403
OPN DB[DBInDaten]
W403: L NoneW [AR2,] // Indaten überprüfen
L 0 // Etwas angegeben ?
<>I // Ja !
JC Nw05 // Weiter
ADDAR2 P#2.0
L Schleife
LOOP L400
JU Err4 // Undefinierte Indaten
Nw05: NOP 0
--- NW 5: Minimale + maximale Lesestelle am Anfang ---
L 1
T Min_Lesestelle // Minimal sinnvolle Lesestelle
L AnzahlEintraege // Anzahl der eingetragenen Datensätze
T Max_Lesestelle // Maximal sinnvolle Lesestelle
// Sonderfall: noch kein Eintrag:
L 0 // Eintrag schon vorhanden ?
>I // Ja !
JC en05
L 1 // An 1.Stelle speichern
T Savestelle // Adresse
JU Save
en05: NOP 0
--- NW 6: Aktuelle Lesestelle errechnen ---
New: L Max_Lesestelle // Maximal sinnvolle Lesestelle
+ 1
L Min_Lesestelle // Minimal sinnvolle Lesestelle
-I
L 2
/I
L Min_Lesestelle // Minimal sinnvolle Lesestelle
+I
T Lesestelle // An dieser Stelle Datensatz lesen
--- NW 7: Daten an Lesestelle auslesen ---
L Lesestelle // An dieser Stelle Datensatz lesen
+ -1
L Datenblock_inBytes // Datenblocklänge in Bytes
*I
L SSDW
+I
+ 20 // Offset für 1.Daten
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBDatenliste]
L DBD [AR1Zeiger] // Datenliste-Daten lesen
T Lese_Daten // In Tabelle gelesenen Daten
L 0 // Nichts gespeicher oder negativ ?
<=D // Ja !
JC Err5
--- NW 8: Suche fertig ? ---
L Max_Lesestelle // Maximal sinnvolle Lesestelle
L Min_Lesestelle // Minimal sinnvolle Lesestelle
-I
L 0 // Suche fertig ?
<I // Ja !
JC ok
--- NW 9: Gelesene Daten auswerten ---
L Sort_Daten // Einzusortierende Daten
L Lese_Daten // In Tabelle gelesenen Daten
>D // Sort > Tabelle
JC MinP
L Sort_Daten // Einzusortierende Daten
>D // Tabelle > Sort
JC MaxM
L Lesestelle // An dieser Stelle Datensatz lesen
T Savestelle // An dieser Stelle wird In-Datensatz gespeichert
JC Frei // Freiplatz schaffen
MinP: L Lesestelle // An dieser Stelle Datensatz lesen
+ 1
T Min_Lesestelle // Minimal sinnvolle Lesestelle
L Max_Lesestelle // Maximal sinnvolle Lesestelle
>I // Suche ist fertig
JC ok
JU New
MaxM: L Lesestelle // An dieser Stelle Datensatz lesen
+ -1
T Max_Lesestelle // Maximal sinnvolle Lesestelle
L Min_Lesestelle // Minimal sinnvolle Lesestelle
<I // Suche ist fertig
JC ok
JU New
--- NW 10: Speicherstelle ermitteln ---
ok: L Sort_Daten // Einzusortierende Daten
L Lese_Daten // In Tabelle gelesenen Daten
>D // Sort > Tabelle
JC Plus
L Lesestelle // An dieser Stelle Datensatz lesen
T Savestelle // An dieser Stelle wird In-Datensatz gespeichert
JU Frei // Freiplatz schaffen
Plus: L Lesestelle // An dieser Stelle Datensatz lesen
+ 1
T Savestelle // An dieser Stelle wird In-Datensatz gespeichert
--- NW 11: Freiraum für Speicherung schaffen ---
Frei: L Savestelle // An dieser Stelle wird In-Datensatz gespeichert
T "MW240"
L AnzahlEintraege // Anzahl der eingetragenen Datensätze
>I // Eintrag ans Ende !
JC Save
L AnzahlEintraege // Anzahl der eingetragenen Datensätze
L Datenblock_inBytes // Datenblocklänge in Bytes
*I
L SSDW
+I
+ 20 // Offset für 1.Daten
+ -2 // Letzte Daten letzter Eintrag
T Holstelle // Freiraum schaffen: Stelle zum Daten holen
L Holstelle // Freiraum schaffen: Stelle zum Daten holen
L Datenblock_inBytes // Datenblocklänge in Bytes
+I
T Bringstelle // Freiraum schaffen: Zeiger zum Daten schreiben
L AnzahlEintraege // Anzahl der eingetragenen Datensätze
L Savestelle // An dieser Stelle wird In-Datensatz gespeichert
-I
+ 1
L Datenblock_inBytes // Datenblocklänge in Bytes
*I
L 2 // da DW-Zugriff (2Byte)
/I
L110: T Schleife
L Holstelle // Freiraum schaffen: Stelle zum Daten holen
ITD
SLD 3
T Holzeiger // Freiraum schaffen: Zeiger zum Daten holen
L Bringstelle // Freiraum schaffen: Zeiger zum Daten schreiben
ITD
SLD 3
T Bringzeiger // Freiraum schaffen: Zeiger zum Daten schreiben
OPN DB[DBDatenliste]
L DBW [Holzeiger] // Datenliste-Daten lesen
T DBW [Bringzeiger] // Datenliste-Daten verschieben
L Holstelle
+ -2 // 2 Byte wegen DW-Zugriff
T Holstelle // Freiraum schaffen: Stelle zum Daten holen
L Bringstelle
+ -2 // 2 Byte wegen DW-Zugriff
T Bringstelle // Freiraum schaffen: Zeiger zum Daten schreiben
L Schleife
LOOP L110
--- NW 12: Daten in Datenliste schreiben ---
// Quelle-Pointer erzeugen:
Save: L 16#1004 // Kennung 10 + Word=04
T LW0
T LW10 // Any-Kennung, Datentyp
L Datensatzlaenge // Datenwords speichern
T LW2
T LW12 // Wiederholungen
// DATEN-Pointer übernehmen:
L DBInDaten
T LW4 // DB_Nummer
L InDaten_Pointer
T LD6 // Kennung, Adresse
// Ziel-Pointer erzeugen:
// Kennung + Datenbytes s.o.
L SSDB
T LW14 // DB_Nummer
L Savestelle // Adresse
+ -1
L Datenblock_inBytes // Datenblocklänge in Bytes
*I
L SSDW
+I
+ 20 // Offset für 1.Daten
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD16 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // Datenliste-Daten speichern
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
L SSDW
+ 14 // Anzahl der Einträge
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBDatenliste]
L DBW [AR1Zeiger] // Anzahl der Einträge
+ 1 // Einträge +1
T DBW [AR1Zeiger] // Anzahl der Einträge
--- NW 13: Fehlerausgabe / RET_VAL ---
SET // VKE = 1 ohne Fehler !!!
L 2#0000_0000_1000_0000 // Daten wurden gespeichert
JU Ok_Mig
Err0: L 2#0000_0000_0000_0001 // Kein Datenlistebereich
JU Err
Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler
JU Err
Err2: L 2#0000_0000_0000_0100 // Datenliste ist voll
JU Err
Err4: L 2#0000_0000_0001_0000 // Undefinierte Indaten
JU Err
Err5: L 2#0000_0000_0010_0000 // Gespeicherte Daten <= 0 (Inhalt ungültig)
Err: CLR // VKE = 0 bei Fehler !!!
Ok_Mig: T RE_VAL
SAVE // VKE in BIE-Bit speichern
L AR2_Speicher // AR2 zurückspeichern
LAR2
@@ -0,0 +1,894 @@
=== FC 86: DatenOut [STL] ===
INTERFACE:
Input:
SSDB : Int // Datenlisten-DB
SSDW : Int // Datenlisten-1.DW
PARA : Word // Aufrufparameter (Auftrag / Anzahl Zusatzdaten)
SEARCHDATEN : Pointer // Such-Daten-Schnittstelle
Output:
RE_VAL : Byte // Rückmeldung
OUTDATEN : Pointer // OutDaten-Schnittstelle
Position : Int // Daten stehen an angegebener Position in Datenbank
InOut:
Temp:
Quelle : Any // Zeiger, wo Rein-Daten sind
Ziel : Any // Zeiger, FIFO-Stelle
Kopf : Byte // Datenliste-Kennnung (DA)
Datensatzlaenge : Byte // Datensatzlänge in Word (01 - F0) F0=128
Listenlaenge : Int // Länge der Datenliste (maximale Anzahl der Datensätze)
Stammdaten : Int // Stammdatenlänge in Word (1 - 9)
IndDB : Word // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!)
IndDB_Laenge : Int // Länge des indizierten DB in Einträge (nur bei Stammdaten = 1 erlaubt !!!)
IndDaten_FC : Int // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!)
Suchzeiger : Int // Speicherung des letzten Zugriffs / Suchzeiger
Belegt14 : Int // reserviert von Sort-Datenliste
AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!)
Reserve18 : Int // Reserve
Para1 : Byte // 1.Aufrufparameter
Para2 : Byte // 2.Aufrufparameter
DBDatenliste : Word // Datenlisten-DB
OffsetDaten_1 : Int // Stammdaten beginnen ab hier
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
Datenlisten_Ende : Int // Ende der Datenliste
AR2_Speicher : DWord // Adress-Register 2 zwischenspeichern
Schleife : Word // Loopzähler
DBSuchDaten : Word // Such-Daten-DB, falls angegeben
SuchDaten_Pointer : DWord // Such-Daten-Pointer: Kennung, Adresse
SuchDaten_Startpunkt : Word // Such-Daten-Startpunkt: Adresse
DBOutDaten : Word // Out-Daten-DB, falls angegeben
OutDaten_Pointer : DWord // Out-Daten-Pointer: Kennung, Adresse
OutDaten_Startpunkt : Word // Out-Daten-Startpunkt: Adresse
IndPointer : DWord // Zeiger für IndDB
Daten_1 : Word // 1.Datenwort der Indaten
Daten_2 : DWord // 1+2.Datenwort der Indaten (falls ind.Suchen mit Stammdaten 2)
Datenblock_inBytes : Word // Datenblocklänge in Bytes
Suchstelle : Word // Bei angegebenen Datensatz suchen
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
Indok : Bool // Indizierung möglich
IndZeiger_ok : Bool // Indizier-Zeiger angegeben
Weitersuchen : Bool // Weitersuchen ist aktiv
Offsetsuchen : Bool // Offsetsuchen ist aktiv
Sortliste : Bool // Sortliste wird durchsucht
WandelFC : Bool // Wnadel-FC für ind.Suchen vorhanden
tRE_VAL : Byte // Rückmeldung
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
DB_Länge : Int
NichtCopy : Int // Datenmenge, die nicht vorschoben wird
LoeschPos : Word // Lösch-Position
Wandel_FC : Word // Wandel-FC
Constant:
Return:
Ret_Val : Void
--- NW 1: Schnittstellen-DB sinnvoll ? ---
TAR2
T AR2_Speicher // AR2 zwischenspeichern
L SSDB
T DBDatenliste
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBDatenliste, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge")
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
O SFC_WRITE_PROT // schreibgeschützt
JC Err0 // kein Datenlisten-Bereich
--- NW 2: Quelle-Pointer erzeugen: ---
L 16#1004 // Kennung 10 + Word=04
T LW0 // Any-Kennung, Datentyp
L 16#000A // 10 Dw´s holen
T LW2 // Wiederholungen
L SSDB
T LW4 // DB_Nummer
L SSDW // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 10) // 1.-10.DW Datenliste holen
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
--- NW 3: Zeigerüberprüfung ---
L Kopf // Datenliste-Kopf
L 16#DB // = Sort-Datenlistekennung ?
==I // Ja !
= Sortliste // Sortliste wird durchsucht
JC w030
CAC
L 16#DA // = Datenlistekennung ?
<>I // Nein !
JC Err0 // kein Datenlistebereich
w030: L 1
L Datensatzlaenge // Datenblocklänge
>I
JC Err0 // kein Datenlistebereich
L 128
>I
JC Err0 // kein Datenlistebereich
L 1
L Listenlaenge // Max.Anzahl von Datenblöcken
>I
JC Err0 // kein Datenlistebereich
L 1
L Stammdaten // Anzahl der Stammdaten
>I
JC Err0 // kein Datenlistebereich
L 9
>I
JC Err0 // kein Datenlistebereich
L Stammdaten // Anzahl der Stammdaten
L Datensatzlaenge // Datenblocklänge
>I
JC Err0 // kein Datenlistebereich
L Listenlaenge // Länge der Datenliste
L Datensatzlaenge // Datenblocklänge
*I
L 2 // DB byteorientiert
*I
+ 20 // Speichern ab 10.DW
L SSDW
+I
T Datenlisten_Ende
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBDatenliste]
L Datenlisten_Ende
L "DB_Länge"
>I // Datenlisten-DB ist zu kurz!
JC Err0 // kein Datenlisten-Bereich
L DBW [AR1Zeiger]
L 16#DAEE // Datenliste-Endekennung ?
<>I // Nein !
A(
CAC
L 16#DBEE // Sort-Datenliste-Endekennung ?
<>I // Nein !
)
JC Err0 // kein Datenlisten-Bereich
L Datensatzlaenge // Datenblocklänge
L 2
*I
T Datenblock_inBytes // Datenblocklänge in Bytes
--- NW 4: Auftrag kontrollieren ---
SET
R Indok // Indizierung möglich
R IndZeiger_ok // Indizier-Zeiger angegeben
R Weitersuchen // Weitersuchen ist aktiv
R Offsetsuchen // Offsetsuchen ist aktiv
L 0 // Vorerst kein Offset
T OffsetDaten_1
L PARA
T LW40 // Aufrufparameter zwischenspeichern
L 16#00 // XX = 00 ?
L Para1
==I // Ja!
JC W401
L 16#E1 // XX = E1 ?
==I // Ja!
A Sortliste // Sortliste wird durchsucht
JC Err3 // Falscher Aufrufparameter (austragen nicht erlaubt !)
CAC
L 16#E1 // XX = E1 ?
==I // Ja!
JC W401
L 16#F1 // XX = F1 ?
L Para1
<>I // Nein !
JC W400
L Para2
L 16#00
<>I
O Sortliste // Sortliste wird durchsucht
JC Err3 // Falscher Aufrufparameter
SET
S Weitersuchen
L SSDW
+ 20
T Suchzeiger
JU Nw08 // OutDaten ok ?
W400: L 16#FF // XX = FF ?
<>I // Nein !
JC W403
L Para2
L 16#00
<>I
O Sortliste // Sortliste wird durchsucht
JC Err3 // Falscher Aufrufparameter
SET
S Weitersuchen
L Suchzeiger // Alter Suchzeiger
L Datenblock_inBytes // Datenblocklänge in bytes
+I // Nächsten Datensatz suchen
T Suchzeiger // Neuer Suchzeiger
L Datenblock_inBytes // Datenblocklänge in bytes
L Listenlaenge // Alle möglichen Einträge
*I // Gesamtlänge
L SSDW // Startpunkt
+I
+ 20 // Offset 1.Daten
L Suchzeiger // Schreibzeiger
>I // Noch nicht am Ende !
JC Nw08 // OutDaten ok ?
JU Err2 // Listenende erreicht
W403: L 16#02 // XX < 02 ?
L Para1
>I // Ja!
JC Err3 // Falscher Aufrufparameter
L 16#80 // XX > 80 ?
>I // Ja!
JC Err3 // Falscher Aufrufparameter
CAC
L Datensatzlaenge // XX > Datensatzlänge
>I // Ja!
JC Err3 // Falscher Aufrufparameter
CAC
+ -1 // Angegebener Offset -1
L 2 // DB byteorientiert
*I
T OffsetDaten_1 // Richtiger Offset der 1.Stammdaten
L 0
T Suchzeiger // Suche ab Anfang
SET
S Offsetsuchen
W401: L 16#00 // =0 ?
L Para2 // 2.Aufrufparameter
==I // Ja !
JC W402
T Stammdaten // Anzahl der Stammdaten
L Datensatzlaenge // Datenblocklänge
>I
JC Err3 // Falscher Aufrufparameter
L 1
L Stammdaten // Anzahl der Stammdaten
>I
JC Err3 // Falscher Aufrufparameter
L 9
>I
JC Err3 // Falscher Aufrufparameter
W402: AN Offsetsuchen
JC Nw05
L Para1 // Offset
+ -1
L Stammdaten
+I // Letzte Stammdaten zu groß ?
L Datensatzlaenge
>I // Ja!
JC Err3 // Falscher Aufrufparameter
--- NW 5: Such-DATEN-Pointer übernehmen: ---
Nw05: L 0
T Suchzeiger // Suchzeiger
L P#
LAR2
L NoneW [AR2,]
T DBSuchDaten // Suchdaten-DB
L NoneD [AR2,] // Kennung, Adresse
T SuchDaten_Pointer
L DBSuchDaten // Suchdaten-DB
L 0 // Angegeben ?
==I // Nein
JC W501
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBSuchDaten, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge")
L SFC_RET_VAL
L 2#0000_0000_0000_0000 // Fehler vorhanden ?
<>I // Ja !
JC Err4 // Undefinierte Stammdaten
L NoneD [AR2,] // Kennung, Adresse
L 16#00FF_FFFF // Ohne Kennung
AW
SRW 3 // Ohne Bit
T SuchDaten_Startpunkt
L Datensatzlaenge // Datenblocklänge
L 2 // DB byteorientiert
*I
L SuchDaten_Startpunkt
+I
L "DB_Länge"
>I // Suchdaten-DB ist zu kurz
JC Err4 // Undefinierte Stammdaten
W501: L SuchDaten_Pointer
LAR2
L DBSuchDaten // Suchdaten-DB
L 0 // Angegeben ?
==I // Nein
JC W502
OPN DB[DBSuchDaten]
W502: L NoneW [AR2,] // Suchdaten überprüfen
T Daten_1 // 1.Suchdaten speichern
L NoneD [AR2,] // Suchdaten überprüfen
T Daten_2 // 1.Suchdaten speichern
L Stammdaten
L500: T Schleife
L DBSuchDaten // Suchdaten-DB
L 0 // Angegeben ?
==I // Nein
JC W503
OPN DB[DBSuchDaten]
W503: L NoneW [AR2,] // Suchdaten überprüfen
L 0 // Etwas angegeben ?
<>I // Ja !
JC Nw06 // Weiter
ADDAR2 P#2.0
L Schleife
LOOP L500
JU Err4 // Undefinierte Stammdaten
--- NW 6: Indiziert suchen ? ---
Nw06: L IndDB // Indizierter DB
L 0 // =0 ?
==I // Kein indizierter DB !
O Offsetsuchen
O Sortliste // Sortliste wird durchsucht
JC Nw07
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=IndDB, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge")
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
O SFC_WRITE_PROT
JC Nw07 // kein Indizier-DB vorhanden
L IndDB_Laenge // Länge des Indizierten DB überschritten ?
L DINT#2 // DB byteorientiert
*D
L "DB_Länge"
>I // Indizier-DB ist zu kurz
JC Nw07 // Zeiger ausserhalb Ind.DB
L Stammdaten // Stammdaten
L 3 // zu viele Stammdaten ?
>=I // Ja !
JC Nw07 // ohne Indizierung weiter
L IndDaten_FC // Offset zum Abziehen
T Wandel_FC
L 0 // Parameter vorhanden ?
<=I // Nein
JC NoFC // Bei diesem Schritt weiter
L Daten_1 // Stammdaten (1.DW)
T "MW90" // übergeben
L Daten_2 // Stammdaten (2.DW)
T "MD94" // übergeben
UC DB[Wandel_FC] // Beeinflussung der Weiterfahrt
L "MW92" // Rückwert von FC
JU Ret
NoFC: L Daten_1 // Stammdaten
Ret: T IndPointer // Stelle, wo Zeiger hinterlegt ist
L 0
<I // negativ
JC Nw07 // Zeiger = 0
L IndDB_Laenge // Länge des Indizierten DB überschritten ?
L IndPointer // Stelle, wo Zeiger hinterlegt ist
<=I // Ja !
JC Nw07 // Zeiger ausserhalb Ind.DB
L 2
*I // DB byteorientiert
ITD
SLD 3 // Pointer erzeugen
T IndPointer // Pointer, wo Zeiger hinterlegt ist
OPN DB[IndDB] // Indizierter DB
L DBW [IndPointer]
T Suchzeiger // Suchzeiger
OPN DB[DBDatenliste] // Datenliste DB
SET
S Indok // Indizierung möglich
S IndZeiger_ok // Indizier-Zeiger angegeben
--- NW 7: Kontrolle auf gleiche Stammdaten ---
Nw07: L Suchzeiger // Suchzeiger
L 0 // Angegeben ?
==I // Nein !
JC W700 // Suche bei 1.Datensatz beginnen
L Suchzeiger // Suchzeiger
+ -20 // Zeiger 1.Daten
L Datenblock_inBytes // Datenblocklänge in Bytes
/I // Ermittlung der wievielten Daten -1
SRD 16 // Rest ermitteln
L 0 // = 0 ?
<>I // Suchzeiger nicht im Raster !
JC W700 // Suche bei 1.Datensatz beginnen
L 0 // Bei angegebener Stelle suchen
T Suchstelle // Such bei X-ten Datensatz
JU W701
W700: L 1 // Suche bei 1.Datensatz beginnen
T Suchstelle // Such bei X-ten Datensatz
SET
R IndZeiger_ok // Indizier-Zeiger angegeben
L SSDW
+ 20 // Offset für 1.Daten
T Suchzeiger // Suchzeiger
W701: L Suchzeiger // Suchzeiger
L OffsetDaten_1 // Richtiger Offset der 1.Stammdaten
+I
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L SuchDaten_Pointer
LAR2
L Stammdaten // Anzahl der Stammdaten
L700: T Schleife
L DBSuchDaten // Suchdaten-DB
L 0 // Angegeben ?
==I // Nein
JC W702
OPN DB[DBSuchDaten]
W702: L NoneW [AR2,] // Suchdaten überprüfen mit
OPN DB[DBDatenliste]
L DBW [AR1Zeiger] // Datenliste-Daten lesen
<>I // nicht identisch !
JC W703
L AR1Zeiger
SRD 3
L DINT#2
+D
SLD 3
T AR1Zeiger
ADDAR2 P#2.0
L Schleife
LOOP L700
L 2#0000_0000_1000_0000 // Daten sind vorhanden
T tRE_VAL // Ok-Status
JU Nw08 // Datensatz ist in Liste enthalten
W703: L 0 // Suche bei 1.Datensatz begonnen
L Suchstelle // Such bei X-ten Datensatz
==I // Nein !
JC W700
L Suchstelle // Such bei X-ten Datensatz
+ 1
T Suchstelle // Such bei X-ten Datensatz
L Listenlaenge // Anzahl aller Daten in Datenliste
<=I // Alle Datensätze sind durchsucht
JC W705 // Nein !
JU Err6 // Datensatz ist nicht vorhanden
W705: L Datenblock_inBytes // Datenblocklänge in bytes
L Suchzeiger // Suchzeiger
+I
T Suchzeiger // Suchzeiger
JU W701
--- NW 8: Out-DATEN-Pointer übernehmen: ---
Nw08: L P#
LAR2
L NoneW [AR2,]
T DBOutDaten // Outdaten-DB
L NoneD [AR2,] // Kennung, Adresse
T OutDaten_Pointer
L DBOutDaten // Outdaten-DB
L 0 // Angegeben ?
==I // Nein
JC Nw09
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBOutDaten, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge")
L SFC_RET_VAL
L 2#0000_0000_0000_0000 // Fehler vorhanden ?
<>I // Ja !
JC Err5 // Undefinierte Outdaten
L NoneD [AR2,] // Kennung, Adresse
L 16#00FF_FFFF // Ohne Kennung
AW
SRW 3 // Ohne Bit
T OutDaten_Startpunkt
L OutDaten_Startpunkt
L "DB_Länge"
>I // Outdaten-DB ist zu kurz
JC Err5 // Undefinierte Outdaten
--- NW 9: Quelle-Pointer erzeugen: ---
Nw09: L 16#1004 // Kennung 10 + Word=04
T LW0
T LW10 // Any-Kennung, Datentyp
L Datensatzlaenge // Datenwords speichern
T LW2
T LW12 // Wiederholungen
// DATEN-Pointer übernehmen:
L SSDB
T LW4 // DB_Nummer
L Suchzeiger // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
// Ziel-Pointer erzeugen:
// Kennung + Datenbytes s.o.
L DBOutDaten
T LW14 // DB_Nummer
L OutDaten_Pointer
T LD16 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // Datenliste-Daten speichern
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
A SFC_WRITE_PROT // Datenliste kann nicht beschrieben werden
JC Nw10
L SSDW
+ 12 // Offset letzter Zugriff
ITD
SLD 3 // Pointer erzeugen
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L Suchzeiger // Suchzeiger
OPN DB[DBDatenliste]
T DBW [AR1Zeiger] // Speicherung letzter Zugriff
L Suchstelle // Such bei X-ten Datensatz
T Position // Übergabe nach außen
--- NW 10: Daten aus Datenliste löschen ? (nicht indiziert!) ---
Nw10: L 16#E1 // Daten löschen ?
L Para1 // 1.Aufrufparameter
<>I // Nein !
O SFC_WRITE_PROT // Datenliste kann nicht beschrieben werden
JC Nw11
A Indok // Indizierung möglich
JC X010 // Bei ind.Zugriff nur löschen, nicht verschieben, keine Anzahl!
// Gemeinsame Daten für Pointer erzeugen:
L 16#1004 // Kennung 10 + Word=04
T LW0
T LW10 // Any-Kennung, Datentyp
L Suchzeiger // Stelle, wo gelöscht werden soll
+ -20
L SSDW
-I
L Datenblock_inBytes // Datenblocklänge in bytes
/I
+ 1 // Stelle, die gelöscht werden soll
T LoeschPos // Lösch-Position
L Listenlaenge // Länge der Datenliste (Letzter Eintrag zum Löschen ?)
==I // Ja !
JC Last // Ohne Verschieben letzten Eintrag löschen
L LoeschPos // Lösch-Position
L Datensatzlaenge // Datenblocklänge
*I // Gesamtdatenlänge in Words
T NichtCopy // Datenmenge, die nicht vorschoben wird
L Listenlaenge // Länge der Datenliste
L Datensatzlaenge // Datenblocklänge
*I // Gesamtdatenlänge in Words
L NichtCopy // Datenmenge, die nicht vorschoben wird
-I // abziehen
T LW2
T LW12 // Wiederholungen
L SSDB
T LW4
T LW14 // DB_Nummer
// Quelle-Pointer erzeugen:
L Suchzeiger // Stelle, wo gelöscht werden soll
L Datenblock_inBytes // Datenblocklänge in Bytes
+I
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
// Ziel-Pointer erzeugen:
L Suchzeiger // Stelle, wo gelöscht werden soll
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD16 // Kennung, Adresse
// Daten verschieben:
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // DatenSortliste-Daten verschieben
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
// Letzte Daten löschen:
Last: L Datenlisten_Ende // Ende des Datenbereichs
L Datenblock_inBytes // Datenblocklänge in Bytes
-I // Ab hier löschen !
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L Datensatzlaenge // Datensatzlänge
L080: T Schleife
OPN DB[DBDatenliste]
L 0 // Daten löschen
T DBW [AR1Zeiger]
L AR1Zeiger
SRD 3
L 2 // nächstes DW
+D
SLD 3
T AR1Zeiger
L Schleife
LOOP L080
// Speicherung letzter Zugriff:
L SSDW
+ 12 // Offset letzter Zugriff
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBDatenliste]
L 0 // löschen
T DBW [AR1Zeiger] // Speicherung letzter Zugriff
T Suchzeiger // Suchzeiger
SET
R IndZeiger_ok // Indizier-Zeiger angegeben
// Anzahl Einträge:
L SSDW
+ 16 // Offset Anzahl Einträge
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBDatenliste]
L DBW [AR1Zeiger] // Anzahl der Einträge
+ -1 // -1
T DBW [AR1Zeiger] // Anzahl der Einträge
L 0
>=I
JC w080
T DBW [AR1Zeiger] // Minimum übergeben
w080: JU Nw11
--- NW 11: Daten aus Datenliste löschen ? (indiziert) ---
X010: L 16#E1 // Daten löschen ?
L Para1 // 1.Aufrufparameter
<>I // Nein !
JC Nw11
L Suchzeiger // Suchzeiger
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBDatenliste]
L Datensatzlaenge
LA00: T Schleife
L 0
T DBW [AR1Zeiger]
L AR1Zeiger
SRD 3
L DINT#2
+D
SLD 3
T AR1Zeiger
L Schleife
LOOP LA00
L SSDW
+ 12
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L 0 // Löschen
T Suchzeiger // Suchzeiger
T DBW [AR1Zeiger]
SET
R IndZeiger_ok // Indizier-Zeiger angegeben
--- NW 12: Weitersuchen aktiv ? Datensatz vorhanden oder 0 ? ---
Nw11: AN Weitersuchen
JC Nw12
L OutDaten_Pointer
LAR2
L Datensatzlaenge
L110: T Schleife
L DBOutDaten // Outdaten-DB
L 0 // Angegeben ?
==I // Nein
JC W111
OPN DB[DBOutDaten]
W111: L NoneW [AR2,] // Outdaten überprüfen
L 0 // Etwas angegeben ?
<>I // Ja !
JC W112 // Ok
ADDAR2 P#2.0
L Schleife
LOOP L110
L 2#0000_0000_0100_0000 // Daten sind nicht vorhanden
T tRE_VAL // Ok-Status
JU Ende
W112: L 2#0000_0000_1000_0000 // Daten sind vorhanden
T tRE_VAL // Ok-Status
JU Ende
--- NW 13: Indizierung ok ? ---
Nw12: AN Indok // Indizierung möglich
O IndZeiger_ok // Indizier-Zeiger angegeben
JC Ende
OPN DB[IndDB] // Indizierter DB
L Suchzeiger // Suchzeiger
T DBW [IndPointer]
OPN DB[DBDatenliste] // Datenliste DB
--- NW 14: Fehlerausgabe / RET_VAL ---
Ende: SET // VKE = 1 ohne Fehler !!!
L tRE_VAL // Ok-Status
JU Ok
Err0: L 2#0000_0000_0000_0001 // Kein Datenlistebereich
JU Err
Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler
JU Err
Err2: L 2#0000_0000_0000_0100 // Listenende ist erreicht
JU Err
Err3: L 2#0000_0000_0000_1000 // Falscher Parameter bei Aufruf
JU Err
Err4: L 2#0000_0000_0001_0000 // Undefinierte Suchdaten
JU Err
Err5: L 2#0000_0000_0010_0000 // Undefinierte OUTDaten
JU Err
Err6: L 2#0000_0000_0100_0000 // Datensatz nicht vorhanden
Err: CLR // VKE = 0 bei Fehler !!!
Ok: T tRE_VAL
SAVE // VKE in BIE-Bit speichern
L AR2_Speicher // AR2 zurückspeichern
LAR2
--- NW 15: Ende ---
L tRE_VAL
T RE_VAL
@@ -0,0 +1,532 @@
=== FC 89: DatenOutSort [STL] ===
INTERFACE:
Input:
SSDB : Int // Datenlisten-DB
SSDW : Int // Datenlisten-1.DW
PARA : Word // Aufrufparameter (Auftrag , Offset/Anzahl Daten)
Output:
OUTDATEN : Pointer // OutDaten-Schnittstelle
RE_VAL : Byte // Rückmeldung
InOut:
Temp:
Quelle : Any // Zeiger, wo Rein-Daten sind
Ziel : Any // Zeiger, FIFO-Stelle
Kopf : Byte // Datenliste-Kennnung (DA)
Datensatzlaenge : Byte // Datensatzlänge in Word (01 - F0) F0=128
Listenlaenge : Int // Länge der Datenliste (maximale Anzahl der Datensätze)
Stammdaten : Int // Stammdatenlänge in Word (1 - 9)
Belegt06 : Int // reserviert von Datenliste
Belegt08 : Int // reserviert von Datenliste
Belegt10 : Int // reserviert von Datenliste
Belegt12 : Int // reserviert von Datenliste
AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze
Reserve16 : Int // Reserve
Reserve18 : Int // Reserve
Para1 : Byte // 1.Aufrufparameter
Para2 : Byte // 2.Aufrufparameter
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
LeseStelle : Int // Stelle, wo gelesen werden soll
EraseStelle : Int // Stelle, wo gelöscht werden soll
FirstStelle : Int // Stelle, wo 1. zu bleibende Daten sind
DBDatenliste : Word // Datenlisten-DB
Datenlisten_Ende : Word // Ende der Datenliste
AR2_Speicher : DWord // Adress-Register 2 zwischenspeichern
DBOutDaten : Word // Out-Daten-DB, falls angegeben
OutDaten_Pointer : DWord // Out-Daten-Pointer: Kennung, Adresse
OutDaten_Startpunkt : Word // Out-Daten-Startpunkt: Adresse
Datenblock_inBytes : Word // Datenblocklänge in Bytes
Suchstelle : Word // Bei angegebenen Datensatz suchen
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
NichtCopy : Int // Datenmenge, die nicht vorschoben wird
Schleife : Word // Loopzähler
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
Constant:
Return:
Ret_Val : Void
--- NW 1: Schnittstellen-DB sinnvoll ? ---
TAR2
T AR2_Speicher // AR2 zwischenspeichern
L SSDB
T DBDatenliste
// CALL TEST_DB
// DB_NUMBER :=#DBDatenliste
// RET_VAL :=#SFC_RET_VAL
// DB_LENGTH :=#SFC_DB_LENGTH
// WRITE_PROT :=#SFC_WRITE_PROT
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBDatenliste, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
O SFC_WRITE_PROT // schreibgeschützt
JC Err0 // kein Datenlisten-Bereich
--- NW 2: Quelle-Pointer erzeugen: ---
L 16#1004 // Kennung 10 + Word=04
T LW0 // Any-Kennung, Datentyp
L 16#000A // 10 Dw´s holen
T LW2 // Wiederholungen
L SSDB
T LW4 // DB_Nummer
L SSDW // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 10) // 1.-10.DW Datenliste holen
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
--- NW 3: Zeigerüberprüfung ---
L Kopf // Datenliste-Kopf
L 16#DB // = Datenlistekennung ?
<>I // Nein !
JC Err0 // kein Datenlistebereich
L 1
L Datensatzlaenge // Datenblocklänge
>I
JC Err0 // kein Datenlistebereich
L 128
>I
JC Err0 // kein Datenlistebereich
L 1
L Listenlaenge // Max.Anzahl von Datenblöcken
>I
JC Err0 // kein Datenlistebereich
L 1
L Stammdaten // Anzahl der Stammdaten
>I
JC Err0 // kein Datenlistebereich
L 9
>I
JC Err0 // kein Datenlistebereich
L Stammdaten // Anzahl der Stammdaten
L Datensatzlaenge // Datenblocklänge
>I
JC Err0 // kein Datenlistebereich
L Listenlaenge // Länge der Datenliste
L Datensatzlaenge // Datenblocklänge
*I
L 2 // DB byteorientiert
*I
+ 20 // Speichern ab 10.DW
L SSDW
+I
T Datenlisten_Ende
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBDatenliste]
L Datenlisten_Ende
L SFC_DB_LENGTH
>I // Datenlisten-DB ist zu kurz!
JC Err0 // kein Datenlisten-Bereich
L DBW [AR1Zeiger]
L 16#DBEE // Datenliste-Endekennung ?
<>I // Nein !
JC Err0 // kein Datenlisten-Bereich
L Datensatzlaenge // Datenblocklänge
L 2
*I
T Datenblock_inBytes // Datenblocklänge in Bytes
--- NW 4: Auftrag kontrollieren ---
L PARA
T LW40 // Aufrufparameter zwischenspeichern
L Para2
L 16#00
<=I
JC Err3 // Falscher Aufrufparameter
CAC
L Listenlaenge // Länge der Datenliste (maximale Anzahl der Datensätze)
>I
JC Err3 // Falscher Aufrufparameter
L 16#0A // XX = 0A ? (Datensatz YY lesen)
L Para1
<>I // Nein !
JC W400
// Eintrag lesen:
L Para2 // Datensatz YY
+ -1 // 1.Datensatz ohne Offset
L Datenblock_inBytes // Datenblocklänge in bytes
*I
+ 20
L SSDW
+I
T LeseStelle // Stelle, wo gelesen werden soll
JU Nw06 // OutDaten ok ?
W400: L 16#0E // XX = 0E ? (Datensatz YY löschen)
<>I // Nein !
JC W401
// Datensatz löschen:
L AnzahlEintraege
L 0
==I
JC Err2 // Liste ist leer
L Para2 // Datensatz YY
L AnzahlEintraege // zu löschender Datensatz ist grösser als Einträge ?
>I // Ja !
JC Ende // Keine Aktion
L Para2 // Datensatz YY
+ -1 // 1.Datensatz ohne Offset
L Datenblock_inBytes // Datenblocklänge in bytes
*I
+ 20
L SSDW
+I
T EraseStelle // Stelle, wo gelöscht werden soll
JU Nw08 // Daten löschen
W401: L 16#0D // XX = 0D ? (Datensätze YY löschen, ab 1.DS)
L Para1
<>I // Nein !
JC W402
// Datenblock löschen:
L AnzahlEintraege
L 0
==I
JC Err2 // Liste ist leer
L Para2 // Anzahl Datensätze YY
L Datenblock_inBytes // Datenblocklänge in bytes
*I
+ 20
L SSDW
+I
T FirstStelle // Stelle, wo 1. zu bleibende Daten sind
JU Nw09
BEU
W402: JU Err3 // Falscher Aufrufparameter
--- NW 5: Outdaten ok ? ---
// Out-DATEN-Pointer übernehmen:
Nw06: L P#
LAR2
L NoneW [AR2,]
T DBOutDaten // Outdaten-DB
L NoneD [AR2,] // Kennung, Adresse
T OutDaten_Pointer
L DBOutDaten // Outdaten-DB
L 0 // Angegeben ?
==I // Nein
JC Nw07
// CALL TEST_DB
// DB_NUMBER :=#DBOutDaten
// RET_VAL :=#SFC_RET_VAL
// DB_LENGTH :=#SFC_DB_LENGTH
// WRITE_PROT :=#SFC_WRITE_PROT
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBOutDaten, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
L SFC_RET_VAL
L 2#0000_0000_0000_0000 // Fehler vorhanden ?
<>I // Ja !
JC Err5 // Undefinierte Outdaten
L NoneD [AR2,] // Kennung, Adresse
L 16#00FF_FFFF // Ohne Kennung
AW
SRW 3 // Ohne Bit
T OutDaten_Startpunkt
L OutDaten_Startpunkt
L SFC_DB_LENGTH
>I // Outdaten-DB ist zu kurz
JC Err5 // Undefinierte Outdaten
--- NW 6: Daten aus Datenliste lesen (in OUTDaten übergeben) ---
// Quelle-Pointer erzeugen:
Nw07: L 16#1004 // Kennung 10 + Word=04
T LW0
T LW10 // Any-Kennung, Datentyp
L Datensatzlaenge // Datenwords speichern
T LW2
T LW12 // Wiederholungen
// DATEN-Pointer übernehmen:
L SSDB
T LW4 // DB_Nummer
L LeseStelle // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
// Ziel-Pointer erzeugen:
// Kennung + Datenbytes s.o.
L DBOutDaten
T LW14 // DB_Nummer
L OutDaten_Pointer
T LD16 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // DatenSortliste-Daten speichern
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
JU Ende
--- NW 7: Daten aus Datenliste löschen ? ---
// Gemeinsame Daten für Pointer erzeugen:
Nw08: L 16#1004 // Kennung 10 + Word=04
T LW0
T LW10 // Any-Kennung, Datentyp
L Datensatzlaenge // Datensatzlänge
L Para2 // Datensatz YY
*I
T NichtCopy // Datenmenge, die nicht vorschoben wird
L Listenlaenge // Länge der Datenliste
L Datensatzlaenge // Datenblocklänge
*I // Gesamtdatenlänge in Words
L NichtCopy // Datenmenge, die nicht vorschoben wird
-I // abziehen
T LW2
T LW12 // Wiederholungen
L SSDB
T LW4
T LW14 // DB_Nummer
// Quelle-Pointer erzeugen:
L EraseStelle // Stelle, wo gelöscht werden soll
L Datenblock_inBytes // Datenblocklänge in Bytes
+I
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
// Ziel-Pointer erzeugen:
L EraseStelle // Stelle, wo gelöscht werden soll
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD16 // Kennung, Adresse
// Daten verschieben:
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // DatenSortliste-Daten verschieben
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
// Letzte Daten löschen:
L Datenlisten_Ende // Ende des Datenbereichs
L Datenblock_inBytes // Datenblocklänge in Bytes
-I // Ab hier löschen !
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L Datensatzlaenge // Datensatzlänge
L080: T Schleife
OPN DB[DBDatenliste]
L 0 // Daten löschen
T DBW [AR1Zeiger]
L AR1Zeiger
SRD 3
L 2
+D
SLD 3
T AR1Zeiger
L Schleife
LOOP L080
L AnzahlEintraege // Anzahl der eingetragenen Datensätze
+ -1
T AnzahlEintraege
L 0
>=I
JC w080
T AnzahlEintraege // Minimum übergeben
w080: L SSDW
+ 14 // Anzahl der Einträge
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBDatenliste]
L AnzahlEintraege // Anzahl der eingetragenen Datensätze
T DBW [AR1Zeiger] // Anzahl der Einträge
JU Ende
--- NW 8: Datensätze aus Datenliste löschen ? ---
// Gemeinsame Daten für Pointer erzeugen:
Nw09: L 16#1004 // Kennung 10 + Word=04
T LW0
T LW10 // Any-Kennung, Datentyp
L Datensatzlaenge // Datensatzlänge
L Para2 // Anzahl Datensätze YY
*I
T NichtCopy // Datenmenge, die nicht vorschoben wird
L Listenlaenge // Länge der Datenliste
L Datensatzlaenge // Datenblocklänge
*I // Gesamtdatenlänge in Words
L NichtCopy // Datenmenge, die nicht vorschoben wird
-I // abziehen
T LW2
T LW12 // Wiederholungen
L SSDB
T LW4
T LW14 // DB_Nummer
// Quelle-Pointer erzeugen:
L FirstStelle // Stelle, wo 1. zu bleibende Daten sind
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
// Ziel-Pointer erzeugen:
L SSDW
+ 20 // 1.DS
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD16 // Kennung, Adresse
// Daten verschieben:
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // DatenSortliste-Daten verschieben
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
// Letzte Daten löschen:
L Datenlisten_Ende // Ende des Datenbereichs
L NichtCopy // Datenmenge, die nicht vorschoben wird
-I
L NichtCopy // 2 mal, da Angabe in Word (Angabe in Byte benötigt!)
-I // Ab hier löschen !
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L NichtCopy // Datenmenge, die nicht vorschoben wird
L090: T Schleife
OPN DB[DBDatenliste]
L 0 // Daten löschen
T DBW [AR1Zeiger]
L AR1Zeiger
SRD 3
L 2
+D
SLD 3
T AR1Zeiger
L Schleife
LOOP L090
L AnzahlEintraege // Anzahl der eingetragenen Datensätze
L Para2 // Anzahl Datensätze YY
-I
T AnzahlEintraege
L 0
>=I
JC w090
T AnzahlEintraege // Minimum übergeben
w090: L SSDW
+ 14 // Anzahl der Einträge
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBDatenliste]
L AnzahlEintraege // Anzahl der eingetragenen Datensätze
T DBW [AR1Zeiger] // Anzahl der Einträge
JU Ende
--- NW 9: Fehlerausgabe / RET_VAL ---
Ende: SET // VKE = 1 ohne Fehler !!!
L 2#0000_0000_0000_0000 // Ok-Status
JU Ok
Err0: L 2#0000_0000_0000_0001 // Kein Datenlistebereich
JU Err
Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler
JU Err
Err2: L 2#0000_0000_0000_0100 // Sortliste ist leer
JU Err
Err3: L 2#0000_0000_0000_1000 // Falscher Parameter bei Aufruf
JU Err
Err5: L 2#0000_0000_0010_0000 // Undefinierte OUTDaten
Err: CLR // VKE = 0 bei Fehler !!!
Ok: T RE_VAL
SAVE // VKE in BIE-Bit speichern
L AR2_Speicher // AR2 zurückspeichern
LAR2
@@ -0,0 +1,234 @@
=== FC 87: DatenReset [STL] ===
INTERFACE:
Input:
SSDB : Int // Datenlisten-DB
SSDW : Int // Datenlisten-1.DW
Output:
RE_VAL : Byte // Rückmeldung
InOut:
Temp:
Quelle : Any // Zeiger, wo Rein-Daten sind
Ziel : Any // Zeiger, FIFO-Stelle
Kopf : Byte // Datenliste-Kennnung (DA)
Datensatzlaenge : Byte // Datensatzlänge in Word (01 - F0) F0=128
Listenlaenge : Int // Länge der Datenliste (maximale Anzahl der Datensätze)
Stammdaten : Int // Stammdatenlänge in Word (1 - 9)
IndDB : Word // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!)
IndDB_Laenge : Int // Länge des indizierten DB in Einträge (nur bei Stammdaten = 1 erlaubt !!!)
IndDaten_FC : Int // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!)
Suchzeiger : Int // Speicherung des letzten Zugriffs / Suchzeiger
Belegt14 : Int // reserviert von Sort-Datenliste
Reserve16 : Int // Reserve
Reserve18 : Int // Reserve
DBDatenliste : Word // Datenlisten-DB
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
Datenlisten_Ende : Word // Ende der Datenliste
Schleife : Word // Loopzähler
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
DB_Länge : Int
Constant:
Return:
Ret_Val : Void
--- NW 1: Schnittstellen-DB sinnvoll ? ---
L SSDB
T DBDatenliste
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBDatenliste, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge")
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
O SFC_WRITE_PROT
JC Err0 // kein Datenlisten-Bereich
--- NW 2: Quelle-Pointer erzeugen: ---
L 16#1004 // Kennung 10 + Word=04
T LW0 // Any-Kennung, Datentyp
L 16#000A // 10 Dw´s holen
T LW2 // Wiederholungen
L SSDB
T LW4 // DB_Nummer
L SSDW // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 10) // 1.-10.DW Datenliste holen
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
--- NW 3: Zeigerüberprüfung ---
L Kopf // Datenliste-Kopf
L 16#DA // = Datenlistekennung ?
<>I // Nein !
JC Err0 // kein Datenlistebereich
L 1
L Datensatzlaenge // Datenblocklänge
>I
JC Err0 // kein Datenlistebereich
L 128
>I
JC Err0 // kein Datenlistebereich
L 1
L Listenlaenge // Max.Anzahl von Datenblöcken
>I
JC Err0 // kein Datenlistebereich
L 1
L Stammdaten // Anzahl der Stammdaten
>I
JC Err0 // kein Datenlistebereich
L 9
>I
JC Err0 // kein Datenlistebereich
L Stammdaten // Anzahl der Stammdaten
L Datensatzlaenge // Datenblocklänge
>I
JC Err0 // kein Datenlistebereich
L Listenlaenge // Länge der Datenliste
L Datensatzlaenge // Datenblocklänge
*I
L 2 // DB byteorientiert
*I
+ 20 // Speichern ab 10.DW
L SSDW
+I
T Datenlisten_Ende
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBDatenliste]
L Datenlisten_Ende
L "DB_Länge"
>I // Datenlisten-DB ist zu kurz!
JC Err0 // kein Datenlisten-Bereich
L DBW [AR1Zeiger]
L 16#DAEE // Datenliste-Endekennung ?
<>I // Nein !
JC Err0 // kein Datenlisten-Bereich
--- NW 4: Indizierung löschen ? ---
L IndDB // Indizierter DB
L 0 // =0 ?
==I // Kein indizierter DB !
JC Nw05
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=IndDB, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge")
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
O SFC_WRITE_PROT
JC Nw05 // kein Indizier-DB vorhanden
L 0
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[IndDB]
L "DB_Länge" // In Bytes angegeben
L400: T Schleife
L 0
T DBB [AR1Zeiger] // Inhalte löschen
L AR1Zeiger
SRD 3
L DINT#1
+D
SLD 3
T AR1Zeiger
L Schleife
LOOP L400
--- NW 5: Datenliste löschen ---
Nw05: L SSDW
+ 12 // 12.Dw
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBDatenliste]
L 0
T DBW [AR1Zeiger] // Letzte Speicherung löschen
L SSDW
+ 16 // 16.Dw
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBDatenliste]
L 0
T DBW [AR1Zeiger] // Anzahl Einträge löschen
L SSDW
+ 20 // Daten ab 20.Dw
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L Datensatzlaenge
L Listenlaenge
*I
L500: T Schleife
OPN DB[DBDatenliste]
L 0
T DBW [AR1Zeiger] // Inhalte löschen
L AR1Zeiger
SRD 3
L DINT#2
+D
SLD 3
T AR1Zeiger
L Schleife
LOOP L500
--- NW 6: Fehlerausgabe / RET_VAL ---
SET // VKE = 1 ohne Fehler !!!
JU Ok
Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich
JU Err
Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler
Err: CLR // VKE = 0 bei Fehler !!!
Ok: T RE_VAL
SAVE // VKE in BIE-Bit speichern
@@ -0,0 +1,183 @@
=== FC 90: DatenResetSort [STL] ===
INTERFACE:
Input:
SSDB : Int // Datenlisten-DB
SSDW : Int // Datenlisten-1.DW
Output:
RE_VAL : Byte // Rückmeldung
InOut:
Temp:
Quelle : Any // Zeiger, wo Rein-Daten sind
Ziel : Any // Zeiger, FIFO-Stelle
Kopf : Byte // Datenliste-Kennnung (DA)
Datensatzlaenge : Byte // Datensatzlänge in Word (01 - F0) F0=128
Listenlaenge : Int // Länge der Datenliste (maximale Anzahl der Datensätze)
Stammdaten : Int // Stammdatenlänge in Word (1 - 9)
Belegt06 : Int // reserviert von Datenliste
Belegt08 : Int // reserviert von Datenliste
Belegt10 : Int // reserviert von Datenliste
Belegt12 : Int // reserviert von Datenliste
AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze
Reserve16 : Int // Reserve
Reserve18 : Int // Reserve
Suchzeiger : Int // Speicherung des letzten Zugriffs / Suchzeiger
DBDatenliste : Word // Datenlisten-DB
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
Datenlisten_Ende : Word // Ende der Datenliste
Schleife : Word // Loopzähler
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
Constant:
Return:
Ret_Val : Void
--- NW 1: Schnittstellen-DB sinnvoll ? ---
L SSDB
T DBDatenliste
// CALL TEST_DB
// DB_NUMBER :=#DBDatenliste
// RET_VAL :=#SFC_RET_VAL
// DB_LENGTH :=#SFC_DB_LENGTH
// WRITE_PROT :=#SFC_WRITE_PROT
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBDatenliste, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
O SFC_WRITE_PROT
JC Err0 // kein Datenlisten-Bereich
--- NW 2: Quelle-Pointer erzeugen: ---
L 16#1004 // Kennung 10 + Word=04
T LW0 // Any-Kennung, Datentyp
L 16#000A // 10 Dw´s holen
T LW2 // Wiederholungen
L SSDB
T LW4 // DB_Nummer
L SSDW // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 10) // 1.-10.DW Datenliste holen
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
--- NW 3: Zeigerüberprüfung ---
L Kopf // Datenliste-Kopf
L 16#DB // = DatenSortlistekennung ?
<>I // Nein !
JC Err0 // kein Datenlistebereich
L 1
L Datensatzlaenge // Datenblocklänge
>I
JC Err0 // kein Datenlistebereich
L 128
>I
JC Err0 // kein Datenlistebereich
L 1
L Listenlaenge // Max.Anzahl von Datenblöcken
>I
JC Err0 // kein Datenlistebereich
L 1
L Stammdaten // Anzahl der Stammdaten
>I
JC Err0 // kein Datenlistebereich
L 9
>I
JC Err0 // kein Datenlistebereich
L Stammdaten // Anzahl der Stammdaten
L Datensatzlaenge // Datenblocklänge
>I
JC Err0 // kein Datenlistebereich
L Listenlaenge // Länge der Datenliste
L Datensatzlaenge // Datenblocklänge
*I
L 2 // DB byteorientiert
*I
+ 20 // Speichern ab 10.DW
L SSDW
+I
T Datenlisten_Ende
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBDatenliste]
L Datenlisten_Ende
L SFC_DB_LENGTH
>I // Datenlisten-DB ist zu kurz!
JC Err0 // kein Datenlisten-Bereich
L DBW [AR1Zeiger]
L 16#DBEE // DatenSortliste-Endekennung ?
<>I // Nein !
JC Err0 // kein Datenlisten-Bereich
--- NW 4: Datenliste löschen ---
L SSDW
+ 14 // 14.Dw
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBDatenliste]
L 0
T DBW [AR1Zeiger] // Anzahl Einträge löschen
L SSDW
+ 20 // 20.Dw
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L Datensatzlaenge
L Listenlaenge
*I
L500: T Schleife
L 0 // Daten löschen
T DBW [AR1Zeiger]
L AR1Zeiger
SRD 3
L 2
+D
SLD 3
T AR1Zeiger
L Schleife
LOOP L500
--- NW 5: Fehlerausgabe / RET_VAL ---
SET // VKE = 1 ohne Fehler !!!
JU Ok
Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich
JU Err
Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler
Err: CLR // VKE = 0 bei Fehler !!!
Ok: T RE_VAL
SAVE // VKE in BIE-Bit speichern
@@ -0,0 +1,65 @@
=== FC 125: Err_vorhanden [STL] ===
INTERFACE:
Input:
Check_DB : Int
Anfangs_DW : DInt
Ende_DW : DInt
Output:
Stoerung : Bool // Störung vorhanden
ErrDW : DInt
ErrBits : Int
InOut:
Temp:
Anzeige_DB : Int
Zeiger : DInt // Startwert mit Offset 0
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
Constant:
Return:
Ret_Val : Void
--- NW 1: Check-DB von "Abfangs_DW" bis "Ende_DW" checken ---
SET // GST
R Stoerung
L DINT#-1 // Sonst Störung in DBD0 nicht erkennbar
T ErrDW
L 0
T ErrBits
L Check_DB
T Anzeige_DB
L Anfangs_DW // Mit diesem DW beginnen
T Zeiger // Zeiger
Loop: L Zeiger // Zeiger
SLD 3
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[Anzeige_DB]
L DBW [AR1Zeiger] // Störungsbits
T ErrBits
L 0 // aktiv ?
<>I // Ja !
JC Err
L Zeiger // Startwert mit Offset 0
L 2
+D
T Zeiger // Zeiger
L Ende_DW // Letztes DW überschritten?
<=D // Nein !
JC Loop
BEU
Err: SET
S Stoerung
L Zeiger // Zeiger
T ErrDW
--- NW 2: Ende ---
BE
@@ -0,0 +1,327 @@
=== FC 84: FIFOChange [STL] ===
INTERFACE:
Input:
SSDB : Int // Schnittstellen-DB
SSDW : Int // Schnittstellen-1.DW
CH_POS : Int // Position des Eintrags, der zu ändernden Daten
CHANGEDATEN : Pointer // Wechsel-Daten-Schnittstelle
Output:
RE_VAL : Byte // Rückmeldung
InOut:
Temp:
Quelle : Any // Zeiger, wo Rein-Daten sind
Ziel : Any // Zeiger, FIFO-Stelle
Kopf : Byte // Fifo-Kennung (FF)
Datensatzlaenge : Byte // Datensatzlänge in Word (1 - 128)
FifoLaenge : Int // Länge des Fifo (maximale Anzahl der Datensätze)
Bringzeiger : Int // Zeiger, wohin nächster Eintrag gespeichert wird
Holzeiger : Int // Zeiger, woher nächste Daten geholt werden
Anzahl : Int // Anzahl der Datensätze (eingetragene)
Status : Word // Status des Fifo
Err : Byte // Fehlerbits
MinHolzeiger : Int // Minimum Holzeiger
MaxHolzeiger : Int // Maximum Holzeiger
DBFifo : Word // FIFO-DB
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
Fifo_Ende : Word // Ende des Fifo
AlleDaten : Word // Anzahl der bytes für alle Daten
Offset : Word // Offset zu überschreibender Datensatz
NixSave : Bool // Status nicht speichern
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
AR1Start : DInt // Startwert mit Offset 0
Constant:
Return:
Ret_Val : Void
--- NW 1: Schnittstellen-DB sinnvoll ? ---
L SSDB
T DBFifo
// CALL TEST_DB
// DB_NUMBER :=#DBFifo
// RET_VAL :=#SFC_RET_VAL
// DB_LENGTH :=#SFC_DB_LENGTH
// WRITE_PROT :=#SFC_WRITE_PROT
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBFifo, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
O SFC_WRITE_PROT
= NixSave // Status nicht speichern
JC Err0 // kein Fifobereich
--- NW 2: Quelle-Pointer erzeugen: ---
L 16#1004 // Kennung 10 + Word=04
T LW0 // Any-Kennung, Datentyp
L 16#0006 // 6 Dw´s holen
T LW2 // Wiederholungen
L SSDB
T LW4 // DB_Nummer
L SSDW // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 6) // 1.-6.DW FIFO holen
L Status
L 2#0000_0000_1110_0000
AW
T Err
JP Err // Kapitalfehler vorhanden
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
--- NW 3: Zeigerüberprüfung ---
L Kopf // Fifo-Kopf
L 16#FF // = Fifokennung ?
<>I // Nein !
= NixSave // Status nicht speichern
JC Err0 // kein Fifobereich
L 1
L Datensatzlaenge // Datenblocklänge
>I
JC Err0 // kein Fifobereich
L 128
>I
JC Err0 // kein Fifobereich
L 1
L FifoLaenge // Max.Anzahl von Datenblöcken
>I
JC Err0 // kein Fifobereich
L SSDW
+ 40 // Speichern ab 20.DW
T MinHolzeiger // Minimum Bringzeiger
L FifoLaenge // Länge FIFO (in Word)
+ -1
L Datensatzlaenge // Datenblocklänge
*I
L 2 // DB byteorientiert
*I
+ 40 // Speichern ab 20.DW
L SSDW
+I
T MaxHolzeiger // Maximum Bringzeiger
L Datensatzlaenge // Datenblocklänge
L 2 // DB byteorientiert
*I
L MaxHolzeiger // Maximum Holzeiger
+I // Zeiger Endekennung
T Fifo_Ende
ITD
T AR1Start // Startwert mit Offset 0
SLD 3
T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBFifo]
L Fifo_Ende
L SFC_DB_LENGTH
>I // Fifo-DB ist zu kurz!
JC Err0 // kein Fifo-Bereich
L DBW [AR1Zeiger]
L 16#FFEE // Fifo-Endekennung ?
<>I // Nein !
JC Err0 // kein Fifobereich
L MinHolzeiger // Minimum Holzeiger
L Holzeiger // Holzeiger
<=I // Ok ?
JC W300 // Ja!
L 0 // Grundstellung ?
<>I // Nein !
JC Err6 // Holzeiger ist ausserhalb
L Holzeiger // Holzeiger Grundstellung ?
<>I // Nein !
JC Err6 // Holzeiger ist ausserhalb
L Anzahl // Anzahl Datensätze
L 0 // Grundstellung ?
<>I // Nein !
JC Err6 // Holzeiger ist ausserhalb
L MinHolzeiger // Minimum Holzeiger
T Bringzeiger // Bringzeiger
T Holzeiger // Holzeiger
W300: L MaxHolzeiger // Maximum Holzeiger
<=I // Ok ?
JC W301 // Ja!
JU Err6 // Holzeiger ist ausserhalb
W301: L Bringzeiger // Bringzeiger
L Holzeiger // Holzeiger
==I // Identisch !
A(
L FifoLaenge
L Anzahl // Anzahl der gespeicherten Datensätze
<>I // Fifo noch nicht voll !
)
A(
L 0
<>I // Datensätze aber noch vorhanden !
)
JC Err7 // Versatz Bring-/Holzeiger
L Bringzeiger // Bringzeiger
L Holzeiger // Holzeiger
<>I // Ungleich !
A(
L FifoLaenge
L Anzahl // Anzahl der gespeicherten Datensätze
==I // Aber Fifo ist voll !
O(
L 0
==I // Aber keine Datensätze vorhanden !
)
)
JC Err7 // Versatz Bring-/Holzeiger
L Anzahl // Anzahl der gespeicherten Datensätze
L 0
==I // Keine Datensätze vorhanden !
JC Err2 // Fifo ist leer
--- NW 4: Offset bilden ---
L 0
L CH_POS
>=I
JC Err3 // falscher Parameter bei Aufruf
L FifoLaenge // Max.Anzahl von Datenblöcken
>I
JC Err3 // falscher Parameter bei Aufruf
L Anzahl // Anzahl der Datensätze
L CH_POS
<I
JC Err4 // Fifo ist leer
+ -1 // 1.Teil = Holzeiger !
L Datensatzlaenge // Datenblocklänge
*I
L 2 // DB byteorientiert
*I
L Holzeiger // Holzeiger
+I
W400: T Offset // Schreibzeiger
L MaxHolzeiger // Maximum Holzeiger
<=I
JC Nw05
L FifoLaenge // Max.Anzahl von Datenblöcken
L Datensatzlaenge // Datenblocklänge
*I
L 2 // DB byteorientiert
*I
T AlleDaten // Bytes für alle Datensätze
L Offset // Schreibzeiger
L AlleDaten
-I
JU W400
--- NW 5: Quelle-Pointer erzeugen: ---
Nw05: L 16#1004 // Kennung 10 + Word=04
T LW0
T LW10 // Any-Kennung, Datentyp
L Datensatzlaenge // Datenbytes speichern
T LW2
T LW12 // Wiederholungen
// DATEN-Pointer übernehmen:
L P#
LAR1
L NoneW [AR1,]
T LW4 // DB_Nummer
L NoneD [AR1,]
T LD6 // Kennung, Adresse
// Ziel-Pointer erzeugen:
// Kennung + Datenbytes s.o.
L SSDB
T LW14 // DB_Nummer
L Offset // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD16 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // FIFO-Daten speichern
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
--- NW 6: Fehlerausgabe / RET_VAL ---
SET // VKE = 1 ohne Fehler !!!
JU Ok
Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich
T Err
JU Err
Err1: S L32.1 // SFC20-Aufruf mit Fehler
JU Err
Err2: S L32.2 // Fifo ist voll
JU Err
Err3: S L32.3 // Falscher Parameter
JU Err
Err4: S L32.4 // Position nicht belegt
JU Err
Err6: S L32.6 // Holzeiger außerhalb
JU Err
Err7: S L32.7 // Versatz Bring-/Holzeiger
Err: CLR // VKE = 0 bei Fehler !!!
Ok: L Err
T RE_VAL
L Status
OW
T Status
SAVE // VKE in BIE-Bit speichern
--- NW 7: Fifokopfdaten speichern ---
A L32.0 // Falscher Parameter
A NixSave // Status nicht speichern
BEC
L SSDW
+ 10 // Status
ITD
T AR1Start // Startwert mit Offset 0
SLD 3
T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBFifo]
L Err
T DBW [AR1Zeiger]
@@ -0,0 +1,376 @@
=== FC 83: FIFOSearch [STL] ===
INTERFACE:
Input:
SSDB : Int // Schnittstellen-DB
SSDW : Int // Schnittstellen-1.DW
SEARCHDATEN : Pointer // SuchDaten-Schnittstelle
Laenge : Int // Anzahl der DWs zum Vergleichen im Datensatz
Output:
RE_POS : Int // Position des Eintrags, der gesuchten Daten
RE_VAL : Byte // Rückmeldungen
InOut:
Temp:
Quelle : Any // Zeiger, wo Rein-Daten sind
Ziel : Any // Zeiger, FIFO-Stelle
Kopf : Byte // Fifo-Kennung (FF)
Datensatzlaenge : Byte // Datensatzlänge in Word (1 - 128)
FifoLaenge : Int // Länge des Fifo (maximale Anzahl der Datensätze)
Bringzeiger : Int // Zeiger, wohin nächster Eintrag gespeichert wird
Holzeiger : Int // Zeiger, woher nächste Daten geholt werden
Anzahl : Int // Anzahl der Datensätze (eingetragene)
Status : Word // Status des Fifo
Err : Byte // Fehlerbits
MinHolzeiger : Int // Minimum Holzeiger
MaxHolzeiger : Int // Maximum Holzeiger
DBFifo : Word // FIFO-DB
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
Fifo_Ende : Word // Ende des Fifo
AR2_Speicher : DWord // Adress-Register 2 zwischenspeichern
DBSuchdaten : Word // Solldaten-DB, falls angegeben
SuchDaten_Startpunkt : Word // SuchDaten-Startpunkt: Adresse
SuchZeiger : Word // Suchzeiger
Schleife : Word // Loopzähler
NixSave : Bool // Status nicht speichern
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
AR1Start : DInt // Startwert mit Offset 0
sRE_POS : Int // Position des Eintrags, der gesuchten Daten
Constant:
Return:
Ret_Val : Void
--- NW 1: Schnittstellen-DB sinnvoll ? ---
TAR2
T AR2_Speicher // AR2 zwischenspeichern
L SSDB
T DBFifo
// CALL TEST_DB
// DB_NUMBER :=#DBFifo
// RET_VAL :=#SFC_RET_VAL
// DB_LENGTH :=#SFC_DB_LENGTH
// WRITE_PROT :=#SFC_WRITE_PROT
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBFifo, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
= NixSave // Status nicht speichern
O SFC_WRITE_PROT
JC Err0 // kein Fifobereich
--- NW 2: Quelle-Pointer erzeugen: ---
L 16#1004 // Kennung 10 + Word=04
T sRE_POS // Any-Kennung, Datentyp
L 16#0006 // 6 Dw´s holen
T LW2 // Wiederholungen
L SSDB
T LW4 // DB_Nummer
L SSDW // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 6) // 1.-6.DW FIFO holen
L Status
L 2#0000_0000_1110_0000
AW
T Err
JP Err // Kapitalfehler vorhanden
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
--- NW 3: Zeigerüberprüfung ---
L Kopf // Fifo-Kopf
L 16#FF // = Fifokennung ?
<>I // Nein !
= NixSave // Status nicht speichern
JC Err0 // kein Fifobereich
L 1
L Datensatzlaenge // Datenblocklänge
>I
JC Err0 // kein Fifobereich
L 128
>I
JC Err0 // kein Fifobereich
L 1
L FifoLaenge // Max.Anzahl von Datenblöcken
>I
JC Err0 // kein Fifobereich
L SSDW
+ 40 // Speichern ab 20.DW
T MinHolzeiger // Minimum Holzeiger
L FifoLaenge // Länge FIFO (in Word)
+ -1
L Datensatzlaenge // Datenblocklänge
*I
L 2 // DB byteorientiert
*I
+ 40 // Speichern ab 20.DW
L SSDW
+I
T MaxHolzeiger // Maximum Holzeiger
L Datensatzlaenge // Datenblocklänge
L 2 // DB byteorientiert
*I
L MaxHolzeiger // Maximum Holzeiger
+I // Zeiger Endekennung
T Fifo_Ende
ITD
T AR1Start // Startwert mit Offset 0
SLD 3
T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBFifo]
L Fifo_Ende
L SFC_DB_LENGTH
>I // Fifo-DB ist zu kurz!
JC Err0 // kein Fifo-Bereich
L DBW [AR1Zeiger]
L 16#FFEE // Fifo-Endekennung ?
<>I // Nein !
JC Err0 // kein Fifobereich
L MinHolzeiger // Minimum Holzeiger
L Holzeiger // Holzeiger
<=I // Ok ?
JC W300 // Ja!
L 0 // Grundstellung ?
<>I // Nein !
JC Err6 // Holzeiger ist ausserhalb
L Bringzeiger // Bringzeiger Grundstellung ?
<>I // Nein !
JC Err6 // Holzeiger ist ausserhalb
L Anzahl // Anzahl Datensätze
L 0 // Grundstellung ?
<>I // Nein !
JC Err6 // Holzeiger ist ausserhalb
L MinHolzeiger // Minimum Holzeiger
T Bringzeiger // Bringzeiger
T Holzeiger // Holzeiger
JU Err2 // Fifo ist leer
W300: L MaxHolzeiger // Maximum Holzeiger
<=I // Ok ?
JC W301 // Ja!
JU Err6 // Holzeiger ist ausserhalb
W301: L Bringzeiger // Bringzeiger
L Holzeiger // Holzeiger
==I // Identisch !
A(
L FifoLaenge
L Anzahl // Anzahl der gespeicherten Datensätze
<>I // Fifo noch nicht voll !
)
A(
L 0
<>I // Datensätze aber noch vorhanden !
)
JC Err7 // Versatz Bring-/Holzeiger
L Bringzeiger // Bringzeiger
L Holzeiger // Holzeiger
<>I // Ungleich !
A(
L FifoLaenge
L Anzahl // Anzahl der gespeicherten Datensätze
==I // Aber Fifo ist voll !
O(
L 0
==I // Aber keine Datensätze vorhanden !
)
)
JC Err7 // Versatz Bring-/Holzeiger
L Anzahl // Anzahl der gespeicherten Datensätze
L 0
==I // Keine Datensätze vorhanden !
JC Err2 // Fifo ist leer
--- NW 4: Fifodaten suchen ---
L 1
T sRE_POS // RET-POS
L Holzeiger // Holzeiger
T SuchZeiger // Suchzeiger
W400: ITD
T AR1Start // Startwert mit Offset 0
SLD 3
T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
// DATEN-Pointer übernehmen:
L P#
LAR2
L NoneW [AR2,]
T DBSuchdaten // Solldaten-DB
L DBSuchdaten // Solldaten-DB
L 0 // Angegeben ?
==I // Nein
JC W401
// CALL TEST_DB
// DB_NUMBER :=#DBSuchdaten
// RET_VAL :=#SFC_RET_VAL
// DB_LENGTH :=#SFC_DB_LENGTH
// WRITE_PROT :=#SFC_WRITE_PROT
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBSuchdaten, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
L SFC_RET_VAL
L 2#0000_0000_0000_0000 // Fehler vorhanden ?
<>I // Ja !
JC Err1 // SFC20-Aufruf mit Fehler
L NoneD [AR2,] // Kennung, Adresse
L 16#00FF_FFFF // Ohne Kennung
AW
SRW 3 // Ohne Bit
T SuchDaten_Startpunkt
L Datensatzlaenge // Datenblocklänge
L 2 // DB byteorientiert
*I
L SuchDaten_Startpunkt
+I
L SFC_DB_LENGTH
>I // Indaten-DB ist zu kurz
JC Err1 // SFC20-Aufruf mit Fehler
W401: L NoneD [AR2,] // Kennung, Adresse
LAR2
L Laenge // Anzahl der DWs zum Vergleichen im Datensatz
L400: T Schleife
L DBSuchdaten // Solldaten-DB
L 0 // Angegeben ?
==I // Nein
JC W402
OPN DB[DBSuchdaten]
W402: L NoneW [AR2,] // Mit Solldaten überprüfen
OPN DB[DBFifo]
L DBW [AR1Zeiger] // Fifo-Daten lesen
<>I // nicht identisch !
JC W403
L AR1Start // Startwert mit Offset 0
+ DINT#2
T AR1Start // Startwert mit nächstem Offset
SLD 3
T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
ADDAR2 P#2.0
L Schleife
LOOP L400
JU Ende // Datensatz ist in Fifo enthalten
W403: L sRE_POS // RET-POS
+ 1
T sRE_POS // RET-POS
L Anzahl // Anzahl der Daten im Fifo
>I // Alle Datensätze sind durchsucht
JC Err2
L Datensatzlaenge // Datenblocklänge
L 2 // DB byteorientiert
*I
L SuchZeiger // Suchzeiger
+I
T SuchZeiger // Suchzeiger
L MaxHolzeiger // Maximum Holzeiger
<=I // Ende erreicht? Nein!
JC W404
L MinHolzeiger // Minimum Holzeiger
T SuchZeiger
W404: L SuchZeiger // Suchzeiger
JU W400
--- NW 5: Fehlerausgabe / RET_VAL ---
Ende: SET // VKE = 1 ohne Fehler !!!
JU Ok
Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich
T Err
JU Err
Err1: S L32.1 // SFC20-Aufruf mit Fehler
JU Err
Err2: S L32.2 // Fifo ist leer
JU Err
Err6: S L32.6 // Holzeiger außerhalb
JU Err
Err7: S L32.7 // Versatz Bring-/Holzeiger
Err: L 0
T sRE_POS // RET-POS = 0
CLR // VKE = 0 bei Fehler !!!
Ok: L Err
T RE_VAL
L Status
OW
T Status
SAVE // VKE in BIE-Bit speichern
--- NW 6: Fifokopfdaten speichern ---
L AR2_Speicher // AR2 zurückspeichern
LAR2
A L32.0 // Falscher Parameter
A NixSave // Status nicht speichern
BEC
L SSDW
+ 10 // Status
ITD
T AR1Start // Startwert mit Offset 0
SLD 3
T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBFifo]
L Err
T DBW [AR1Zeiger]
--- NW 7: ---
L sRE_POS
T RE_POS
@@ -0,0 +1,500 @@
=== FC 80: FifoIn [STL] ===
INTERFACE:
Input:
SSDB : Int // Schnittstellen-DB
SSDW : Int // Schnittstellen-1.DW
PARA : Word // Aufrufparameter (Auftrag / Anzahl Zusatzdaten)
INDATEN : Pointer // InDaten-Schnittstelle
Output:
RE_VAL : Byte // Rückmeldung
InOut:
Temp:
Quelle : Any // Zeiger, wo Rein-Daten sind
Ziel : Any // Zeiger, FIFO-Stelle
Kopf : Byte // Fifo-Kennung (FF)
Datensatzlaenge : Byte // Datensatzlänge in Word (1 - 128)
FifoLaenge : Int // Länge des Fifo (maximale Anzahl der Datensätze)
Bringzeiger : Int // Zeiger, wohin nächster Eintrag gespeichert wird
Holzeiger : Int // Zeiger, woher nächste Daten geholt werden
Anzahl : Int // Anzahl der Datensätze (eingetragene)
Status : Word // Status des Fifo
Err : Byte // Fehlerbits
Para1 : Byte // 1.Aufrufparameter
Para2 : Byte // 2.Aufrufparameter
Para21 : Byte // 2.Aufrufparameter 1.Stelle
Para22 : Byte // 2.Aufrufparameter 2.Stelle
MinBringzeiger : Int // Minimum Bringzeiger
MaxBringzeiger : Int // Maximum Bringzeiger
DBFifo : Word // FIFO-DB
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
Fifo_Ende : Word // Ende des Fifo
Schleife : Word // Loopzähler
Offset : Byte // Offset 1. zu speicherndes Zusatzwort
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
NixSave : Bool // Status nicht speichern
BieSpeicher : Bool // Bie-Bit zwischenspeichern
Constant:
Return:
Ret_Val : Void
--- NW 1: Schnittstellen-DB sinnvoll ? ---
L SSDB
T DBFifo
// CALL TEST_DB
// DB_NUMBER :=#DBFifo
// RET_VAL :=#SFC_RET_VAL
// DB_LENGTH :=#SFC_DB_LENGTH
// WRITE_PROT :=#SFC_WRITE_PROT
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBFifo, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
O SFC_WRITE_PROT
= NixSave // Status nicht speichern
JC Err0 // kein Fifobereich
--- NW 2: Quelle-Pointer erzeugen: ---
L 16#1004 // Kennung 10 + Word=04
T LW0 // Any-Kennung, Datentyp
L 16#0006 // 6 Dw´s holen
T LW2 // Wiederholungen
L SSDB
T LW4 // DB_Nummer
L SSDW // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 6) // 1.-6.DW FIFO holen
L Status
L 2#0000_0000_1110_0000
AW
T Err
JP Err // Kapitalfehler vorhanden
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
--- NW 3: Zeigerüberprüfung ---
L Kopf // Fifo-Kopf
L 16#FF // = Fifokennung ?
<>I // Nein !
= NixSave // Status nicht speichern
JC Err0 // kein Fifobereich
L 1
L Datensatzlaenge // Datenblocklänge
>I
JC Err0 // kein Fifobereich
L 128
>I
JC Err0 // kein Fifobereich
L 1
L FifoLaenge // Max.Anzahl von Datenblöcken
>I
JC Err0 // kein Fifobereich
L SSDW
+ 40 // Speichern ab 20.DW
T MinBringzeiger // Minimum Bringzeiger
L FifoLaenge // Länge FIFO (in Word)
+ -1
L Datensatzlaenge // Datenblocklänge
*I
L 2 // DB byteorientiert
*I
+ 40 // Speichern ab 20.DW
L SSDW
+I
T MaxBringzeiger // Maximum Bringzeiger
L Datensatzlaenge // Datenblocklänge
L 2 // DB byteorientiert
*I
L MaxBringzeiger // Maximum Bringzeiger
+I // Zeiger Endekennung
T Fifo_Ende
SLW 3 // Pointer erzeugen
LAR1
OPN DB[DBFifo]
L Fifo_Ende
L SFC_DB_LENGTH
>I // Fifo-DB ist zu kurz!
JC Err0 // kein Fifo-Bereich
L DBW [AR1,]
L 16#FFEE // Fifo-Endekennung ?
<>I // Nein !
JC Err0 // kein Fifobereich
L MinBringzeiger // Minimum Bringzeiger
L Bringzeiger // Bringzeiger
<=I // Ok ?
JC W300 // Ja!
L 0 // Grundstellung ?
<>I // Nein !
JC Err5 // Bringzeiger ist ausserhalb
L Holzeiger // Holzeiger Grundstellung ?
<>I // Nein !
JC Err5 // Bringzeiger ist ausserhalb
L Anzahl // Anzahl Datensätze
L 0 // Grundstellung ?
<>I // Nein !
JC Err5 // Bringzeiger ist ausserhalb
L MinBringzeiger // Minimum Bringzeiger
T Bringzeiger // Bringzeiger
T Holzeiger // Holzeiger
W300: L MaxBringzeiger // Maximum Bringzeiger
<=I // Ok ?
JC W301 // Ja!
JU Err5 // Bringzeiger ist ausserhalb
W301: L Bringzeiger // Bringzeiger
L Holzeiger // Holzeiger
==I // Identisch !
A(
L FifoLaenge
L Anzahl // Anzahl der gespeicherten Datensätze
<>I // Fifo noch nicht voll !
)
A(
L 0
<>I // Datensätze aber noch vorhanden !
)
JC Err7 // Versatz Bring-/Holzeiger
L Bringzeiger // Bringzeiger
L Holzeiger // Holzeiger
<>I // Ungleich !
A(
L FifoLaenge
L Anzahl // Anzahl der gespeicherten Datensätze
==I // Aber Fifo ist voll !
O(
L 0
==I // Aber keine Datensätze vorhanden !
)
)
JC Err7 // Versatz Bring-/Holzeiger
--- NW 4: Nur Zusatzdaten / als 1.Datensatz speichern ? ---
L PARA
T LW33 // Aufrufparameter zwischenspeichern
L 16#02 // Nur Zusatzdaten speichern ?
L Para1 // 1.Aufrufparameter
<>I // Nein !
JC W400
L Para2 // 2.Aufrufparameter
L 16#00 // =0 ?
==I // Ja !
JC Err3 // Falscher Aufrufparameter
JU Nw06 // Zusatzdaten speichern
W400: L 16#01 // Als 1.Datensatz speichern ?
<>I // Nein !
JC Nw05
L MinBringzeiger // Minimum Bringzeiger
T Bringzeiger // Bringzeiger
T Holzeiger // Holzeiger
L 0
T Anzahl // Anzahl Datensätze
JU Nw06 // Zusatz-Daten speichern?
--- NW 5: Hat Fifo Platz / Datenbereich leer ? ---
Nw05: L Anzahl // Anzahl der gespeicherten Datensätze
L FifoLaenge // Max. Anzahl von Datenblöcken
<I
JC W500
==I // Identisch !
JC Err2 // Fifo ist voll
JU Err7 // Versatz Bring-/Holzeiger
W500: L Bringzeiger // Bringzeiger
SLW 3 // Pointer erzeugen
LAR1
OPN DB[DBFifo]
L Datensatzlaenge
L500: T Schleife
L DBW [AR1,]
L 0
<>I
JC Err4 // Speicherzelle ist belegt
ADDAR1 P#2.0
L Schleife
LOOP L500
--- NW 6: Zusatzdaten schreiben ---
Nw06: L 16#00 // =0 ?
L Para2 // 2.Aufrufparameter
==I // Ja !
JC Nw07
L 16#00F0
AW
SRW 4
T Para21 // 1.Stelle isolieren
L Para2 // 2.Aufrufparameter
L 16#000F
AW
T Para22 // 2.Stelle isolieren
L Para21
L Para22
>I // 1.Stelle > 2.Stelle !
JC Err3 // Falscher Aufrufparameter
L 16#04
>I // 2.Stelle > 4 !
JC Err3 // Falscher Aufrufparameter
L Para21
L 16#00
==I // 1.Stelle = 0 !
JC Err3 // Falscher Aufrufparameter
// Quelle-Pointer erzeugen:
L 16#1004 // Kennung 10 + Word=04
T LW0 // Any-Kennung, Datentyp
T LW10 // Any-Kennung, Datentyp
L Para22 // bis
L Para21 // von
-I
+ 1
T LW2 // Wiederholungen
T LW12 // Wiederholungen
L 0
T LW4 // DB_Nummer
L Para21 // Beginn ab X.Zusatzwort
+ -1
L 2 // byteorientiert
*I
T Offset // Offset 1. zu speicherndes Zusatzwort
L 16#00F0 // Adresse (ab MW240)
L Offset // falls nicht ab 1.Zusatzwort
+I
SLD 3
L 16#8300_0000 // Kennung: Merker
OD
T LD6 // Kennung, Adresse
// Ziel-Pointer erzeugen:
// Kennung + Datenbytes s.o.
L SSDB
T LW14 // DB_Nummer
L SSDW
+ 12 // ab 6.Dw speichern
L Offset // falls nicht ab 1.Zusatzwort
+I
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD16 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // Zusatz-Daten speichern
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
--- NW 7: Fifodaten schreiben ---
Nw07: L 16#FF // Testsendung ?
L Para1 // 1.Aufrufparameter
==I // Ja !
JC Nw08 // Zeiger testweise verändern
L 16#02 // Nur Zusatzdaten speichern ?
==I // Ja !
JC Ende // Fertig !
// Quelle-Pointer erzeugen:
L 16#1004 // Kennung 10 + Word=04
T LW0
T LW10 // Any-Kennung, Datentyp
L Datensatzlaenge // Datenbytes speichern
T LW2
T LW12 // Wiederholungen
// DATEN-Pointer übernehmen:
L P#
LAR1
L NoneW [AR1,]
T LW4 // DB_Nummer
L NoneD [AR1,]
T LD6 // Kennung, Adresse
// Ziel-Pointer erzeugen:
// Kennung + Datenbytes s.o.
L SSDB
T LW14 // DB_Nummer
L Bringzeiger // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD16 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // FIFO-Daten speichern
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
--- NW 8: Bringzeiger, Anzahl erhöhen ---
Nw08: L Datensatzlaenge // Datenblocklänge
L 2 // 1 word = 2 bytes
*I
L Bringzeiger // Bringzeiger
+I
T Bringzeiger // Bringzeiger
L MaxBringzeiger // Maximum Bringzeiger
<=I // Erreicht ?
JC W800 // Nein !
L MinBringzeiger // Minimum Bringzeiger
T Bringzeiger // Bringzeiger
W800: L Anzahl // Anzahl der gespeicherten Datensätze
+ 1
T Anzahl // Anzahl der gespeicherten Datensätze
--- NW 9: Versatz Bring-/Holzeiger ---
L Bringzeiger // Bringzeiger
L Holzeiger // Holzeiger
==I // Identisch !
A(
L FifoLaenge
L Anzahl // Anzahl der gespeicherten Datensätze
<>I // Fifo noch nicht voll !
)
JC Err7 // Versatz Bring-/Holzeiger
L Bringzeiger // Bringzeiger
L Holzeiger // Holzeiger
<>I // Ungleich !
A(
L FifoLaenge
L Anzahl // Anzahl der gespeicherten Datensätze
==I // Aber Fifo ist voll !
)
JC Err7 // Versatz Bring-/Holzeiger
--- NW 10: Fehlerausgabe / RET_VAL ---
Ende: SET // VKE = 1 ohne Fehler !!!
JU Ok
Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich
T Err
JU Err
Err1: S L32.1 // SFC20-Aufruf mit Fehler
JU Err
Err2: S L32.2 // Fifo ist voll
JU Err
Err3: S L32.3 // Falscher Parameter
JU Err
Err4: S L32.4 // Speicherzelle ist belegt
JU Err
Err5: S L32.5 // Bringzeiger außerhalb
JU Err
Err7: S L32.7 // Versatz Bring-/Holzeiger
Err: CLR // VKE = 0 bei Fehler !!!
Ok: L Err
T RE_VAL
L Status
OW
T Status
SAVE // VKE in BIE-Bit speichern
A ?SW?
= BieSpeicher
--- NW 11: Fifokopfdaten speichern ---
A L32.0 // Falscher Parameter
A NixSave // Status nicht speichern
BEC
L Anzahl // Anzahl der Datensätze (eingetragene)
+ -1 // da vorher zum Test erhöht wurde
T "MW254" // Übergabe an FC+1 (für FIFO-FÖBE)
L 16#FF // Testsendung ?
L Para1 // 1.Aufrufparameter
==I // Ja !
BEC // Weil Zeiger testweise geändert!
// Ziel-Pointer erzeugen:
L 16#1004 // Kennung 10 + Word=04
T LW10 // Any-Kennung, Datentyp
L 16#0004 // 4Dw´s speichern
T LW12 // Wiederholungen
L SSDB
T LW14 // DB_Nummer
L SSDW // Adresse
L 4
+I
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD16 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=P#L24.0 WORD 4, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // Ab Bringzeiger sichern!
A BieSpeicher
SAVE // VKE in BIE-Bit speichern
L FifoLaenge // Länge des Fifo (maximale Anzahl der Datensätze)
T "MW248" // Übergabe an FC+1 (für Durchlaufspeicher)
L Bringzeiger // Zeiger, wohin nächster Eintrag gespeichert wird
T "MW250" // Übergabe an FC+1 (für Durchlaufspeicher)
L Holzeiger // Zeiger, woher nächste Daten geholt werden
T "MW252" // Übergabe an FC+1 (für Durchlaufspeicher)
L Anzahl // Anzahl der Datensätze (eingetragene)
T "MW254" // Übergabe an FC+1 (für Durchlaufspeicher)
@@ -0,0 +1,502 @@
=== FC 81: FifoOut [STL] ===
INTERFACE:
Input:
SSDB : Int // Schnittstellen-DB
SSDW : Int // Schnittstellen-1.DW
PARA : Word // Aufrufparameter (Auftrag / Anzahl Zusatzdaten)
Output:
OUTDATEN : Pointer // OutDaten-Schnittstelle
RE_VAL : Byte // Rückmeldung
InOut:
Temp:
Quelle : Any // Zeiger, wo Rein-Daten sind
Ziel : Any // Zeiger, FIFO-Stelle
Kopf : Byte // Fifo-Kennung (FF)
Datensatzlaenge : Byte // Datensatzlänge in Word (1 - 128)
FifoLaenge : Int // Länge des Fifo (maximale Anzahl der Datensätze)
Bringzeiger : Int // Zeiger, wohin nächster Eintrag gespeichert wird
Holzeiger : Int // Zeiger, woher nächste Daten geholt werden
Anzahl : Int // Anzahl der Datensätze (eingetragene)
Status : Word // Status des Fifo
Err : Byte // Fehlerbits
Para1 : Byte // 1.Aufrufparameter
Para2 : Byte // 2.Aufrufparameter
Para21 : Byte // 2.Aufrufparameter 1.Stelle
Para22 : Byte // 2.Aufrufparameter 2.Stelle
MinHolzeiger : Int // Minimum Holzeiger
MaxHolzeiger : Int // Maximum Holzeiger
DBFifo : Word // FIFO-DB
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
Fifo_Ende : Word // Ende des Fifo
Schleife : Word // Loopzähler
Offset : Byte // Offset 1. zu lesendes Zusatzwort
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
NixSave : Bool // Status nicht speichern
BieSpeicher : Bool // Bie-Bit zwischenspeichern
Lesezeiger : Int // Lesezeiger
Diff : Int // Differenz
Constant:
Return:
Ret_Val : Void
--- NW 1: Schnittstellen-DB sinnvoll ? ---
L SSDB
T DBFifo
// CALL TEST_DB
// DB_NUMBER :=#DBFifo
// RET_VAL :=#SFC_RET_VAL
// DB_LENGTH :=#SFC_DB_LENGTH
// WRITE_PROT :=#SFC_WRITE_PROT
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBFifo, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
O SFC_WRITE_PROT
= NixSave // Status nicht speichern
JC Err0 // kein Fifobereich
--- NW 2: Quelle-Pointer erzeugen: ---
L 16#1004 // Kennung 10 + Word=04
T LW0 // Any-Kennung, Datentyp
L 16#0006 // 6 Dw´s holen
T LW2 // Wiederholungen
L SSDB
T LW4 // DB_Nummer
L SSDW // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 6) // 1.-6.DW FIFO holen
L Status
L 2#0000_0000_1110_0000
AW
T Err
JP Err // Kapitalfehler vorhanden
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
--- NW 3: Zeigerüberprüfung ---
L Kopf // Fifo-Kopf
L 16#FF // = Fifokennung ?
<>I // Nein !
= NixSave // Status nicht speichern
JC Err0 // kein Fifobereich
L 1
L Datensatzlaenge // Datenblocklänge
>I
JC Err0 // kein Fifobereich
L 128
>I
JC Err0 // kein Fifobereich
L 1
L FifoLaenge // Max.Anzahl von Datenblöcken
>I
JC Err0 // kein Fifobereich
L SSDW
+ 40 // Speichern ab 20.DW
T MinHolzeiger // Minimum Holzeiger
L FifoLaenge // Länge FIFO (in Word)
+ -1
L Datensatzlaenge // Datenblocklänge
*I
L 2 // DB byteorientiert
*I
+ 40 // Speichern ab 20.DW
L SSDW
+I
T MaxHolzeiger // Maximum Holzeiger
L Datensatzlaenge // Datenblocklänge
L 2 // DB byteorientiert
*I
L MaxHolzeiger // Maximum Holzeiger
+I // Zeiger Endekennung
T Fifo_Ende
SLW 3 // Pointer erzeugen
LAR1
OPN DB[DBFifo]
L Fifo_Ende
L SFC_DB_LENGTH
>I // Fifo-DB ist zu kurz!
JC Err0 // kein Fifo-Bereich
L DBW [AR1,]
L 16#FFEE // Fifo-Endekennung ?
<>I // Nein !
JC Err0 // kein Fifobereich
L MinHolzeiger // Minimum Holzeiger
L Holzeiger // Holzeiger
<=I // Ok ?
JC W300 // Ja!
L 0 // Grundstellung ?
<>I // Nein !
JC Err6 // Holzeiger ist ausserhalb
L Bringzeiger // Bringzeiger Grundstellung ?
<>I // Nein !
JC Err6 // Holzeiger ist ausserhalb
L Anzahl // Anzahl Datensätze
L 0 // Grundstellung ?
<>I // Nein !
JC Err6 // Holzeiger ist ausserhalb
L MinHolzeiger // Minimum Holzeiger
T Bringzeiger // Bringzeiger
T Holzeiger // Holzeiger
JU Zus // Zusatzdaten lesen ?
W300: L MaxHolzeiger // Maximum Holzeiger
<=I // Ok ?
JC W301 // Ja!
JU Err6 // Holzeiger ist ausserhalb
W301: L Bringzeiger // Bringzeiger
L Holzeiger // Holzeiger
==I // Identisch !
A(
L FifoLaenge
L Anzahl // Anzahl der gespeicherten Datensätze
<>I // Fifo noch nicht voll !
)
A(
L 0
<>I // Datensätze aber noch vorhanden !
)
JC Err7 // Versatz Bring-/Holzeiger
L Bringzeiger // Bringzeiger
L Holzeiger // Holzeiger
<>I // Ungleich !
A(
L FifoLaenge
L Anzahl // Anzahl der gespeicherten Datensätze
==I // Aber Fifo ist voll !
O(
L 0
==I // Aber keine Datensätze vorhanden !
)
)
JC Err7 // Versatz Bring-/Holzeiger
--- NW 4: Zusatzdaten lesen ? ---
Zus: L PARA
T LW33 // Aufrufparameter zwischenspeichern
L 16#E2 // Nur Zusatzdaten lesen ?
L Para1 // 1.Aufrufparameter
==I // Ja !
A(
L Para2 // 2.Aufrufparameter
L 16#00 // =0 ?
==I // Ja !
)
JC Err3 // Falscher Aufrufparameter
L 16#00 // =0 ?
L Para2 // 2.Aufrufparameter
==I // Ja !
JC Nw05 // Keine Zusatzdaten lesen
L 16#00F0
AW
SRW 4
T Para21 // 1.Stelle isolieren
L Para2 // 2.Aufrufparameter
L 16#000F
AW
T Para22 // 2.Stelle isolieren
L Para21
L Para22
>I // 1.Stelle > 2.Stelle !
JC Err3 // Falscher Aufrufparameter
L 16#04
>I // 2.Stelle > 4 !
JC Err3 // Falscher Aufrufparameter
L Para21
L 16#00
==I // 1.Stelle = 0 !
JC Err3 // Falscher Aufrufparameter
// Quelle-Pointer erzeugen:
L 16#1004 // Kennung 10 + Word=04
T LW0 // Any-Kennung, Datentyp
T LW10 // Any-Kennung, Datentyp
L Para22 // bis
L Para21 // von
-I
+ 1
T LW2 // Wiederholungen
T LW12 // Wiederholungen
L Para21 // Beginn ab X.Zusatzwort
+ -1
L 2 // byteorientiert
*I
T Offset // Offset 1. zu speicherndes Zusatzwort
L SSDB
T LW4 // DB_Nummer
L SSDW
+ 12 // ab 6.Dw lesen
L Offset // falls nicht ab 1.Zusatzwort
+I
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
// Ziel-Pointer erzeugen:
// Kennung + Datenbytes s.o.
L 0
T LW14 // DB_Nummer
L 16#00F0 // Adresse (MW240)
L Offset // falls nicht ab 1.Zusatzwort
+I
SLD 3
L 16#8300_0000 // Kennung: Merker
OD
T LD16 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // Zusatz-Daten speichern
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
--- NW 5: Fifodaten lesen ---
Nw05: L Para1 // 1.Aufrufparameter
L 16#E2 // Nur Zusatzdaten lesen ?
==I // Ja !
JC Ende // Fertig !
L Anzahl // Anzahl der gespeicherten Datensätze
L 0
==I // Keine Datensätze vorhanden !
JC Err2 // Fifo ist leer
// Quelle-Pointer erzeugen:
L 16#1004 // Kennung 10 + Word=04
T LW0
T LW10 // Any-Kennung, Datentyp
L Datensatzlaenge // Datenbytes speichern
T LW2
T LW12 // Wiederholungen
L SSDB
T LW4 // DB_Nummer
L Holzeiger // Adresse (erstmal !, falls Para 2=0)
T Lesezeiger // Lesezeiger
L Para1 // 1.Aufrufparameter
L 16#00 // =0 ?
==I
O(
CAC
L 16#E1 // Datensatz löschen ?
==I // Ja !
)
JC w050
CAC // X-te Stelle lesen
+ -1 // -1, da 1.ohne Offeset
L Datensatzlaenge // Datenblocklänge
*I
L 2 // DB byteorientiert
*I
L Holzeiger // Adresse
+I
T Lesezeiger // Lesezeiger
L MaxHolzeiger // Maximum Holzeiger
<=I // Ist nicht über Maximum !
JC w050
L FifoLaenge // Länge FIFO (in Word)
L Datensatzlaenge // Datenblocklänge
*I
L 2 // DB byteorientiert
*I
T Diff
L Lesezeiger // Differenz subtrahieren:
L Diff
-I
T Lesezeiger // Lesezeiger
w050: L Lesezeiger // Lesezeiger
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
// Ziel-Pointer erzeugen:
// Kennung + Datenbytes s.o.
// DATEN-Pointer übernehmen:
L P#
LAR1
L NoneW [AR1,]
T LW14 // DB_Nummer
L NoneD [AR1,]
T LD16 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // FIFO-Daten speichern
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
--- NW 6: Daten aus Fifo austragen ? ---
L 16#E1 // Daten löschen ?
L Para1 // 1.Aufrufparameter
<>I // Nein !
JC Ende // Fertig !
L Holzeiger // Holzeiger
SLW 3 // Pointer erzeugen
LAR1
OPN DB[DBFifo]
L Datensatzlaenge
L600: T Schleife
L 0
T DBW [AR1,]
ADDAR1 P#2.0
L Schleife
LOOP L600
--- NW 7: Holzeiger, Anzahl erniedrigen ---
L Datensatzlaenge // Datenblocklänge
L 2 // 1 word = 2 bytes
*I
L Holzeiger // Holzeiger
+I
T Holzeiger // Holzeiger
L MaxHolzeiger // Maximum Holzeiger
<=I // Erreicht ?
JC W700 // Nein !
L MinHolzeiger // Minimum Holzeiger
T Holzeiger // Holzeiger
W700: L Anzahl // Anzahl der gespeicherten Datensätze
+ -1
T Anzahl // Anzahl der gespeicherten Datensätze
--- NW 8: Versatz Bring-/Holzeiger ---
L Bringzeiger // Bringzeiger
L Holzeiger // Holzeiger
==I // Identisch !
A(
L Anzahl // Anzahl der gespeicherten Datensätze
L 0
<>I // Datensätze aber noch vorhanden !
)
JC Err7 // Versatz Bring-/Holzeiger
L Bringzeiger // Bringzeiger
L Holzeiger // Holzeiger
<>I // Ungleich !
A(
L Anzahl // Anzahl der gespeicherten Datensätze
L 0
==I // Aber keine Datensätze vorhanden !
)
JC Err7 // Versatz Bring-/Holzeiger
--- NW 9: Fehlerausgabe / RET_VAL ---
Ende: SET // VKE = 1 ohne Fehler !!!
JU Ok
Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich
T Err
JU Err
Err1: S L32.1 // SFC20-Aufruf mit Fehler
JU Err
Err2: S L32.2 // Fifo ist leer
JU Err
Err3: S L32.3 // Falscher Parameter
JU Err
Err6: S L32.6 // Holzeiger außerhalb
JU Err
Err7: S L32.7 // Versatz Bring-/Holzeiger
Err: CLR // VKE = 0 bei Fehler !!!
Ok: L Err
T RE_VAL
L Status
OW
T Status
SAVE // VKE in BIE-Bit speichern
A ?SW?
= BieSpeicher
--- NW 10: Fifokopfdaten speichern ---
A L32.0 // Falscher Parameter
A NixSave // Status nicht speichern
BEC
// Ziel-Pointer erzeugen:
L 16#1004 // Kennung 10 + Word=04
T LW10 // Any-Kennung, Datentyp
L 16#0004 // 4Dw´s speichern
T LW12 // Wiederholungen
L SSDB
T LW14 // DB_Nummer
L SSDW // Adresse
L 4
+I
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD16 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=P#L24.0 WORD 4, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // Ab Bringzeiger sichern!
A BieSpeicher
SAVE // VKE in BIE-Bit speichern
@@ -0,0 +1,204 @@
=== FC 82: FifoReset [STL] ===
INTERFACE:
Input:
SSDB : Int // Schnittstellen-DB
SSDW : Int // Schnittstellen-1.DW
PARA : Word // Aufrufparameter (Durchlaufspeicher?)
Output:
RE_VAL : Byte // Rückmeldung
InOut:
Temp:
Quelle : Any // Zeiger, wo Rein-Daten sind
Kopf : Byte // Fifo-Kennung (FF)
Datensatzlaenge : Byte // Datensatzlänge in Word (1 - 128)
FifoLaenge : Int // Länge des Fifo (maximale Anzahl der Datensätze)
Bringzeiger : Int // Zeiger, wohin nächster Eintrag gespeichert wird
Holzeiger : Int // Zeiger, woher nächste Daten geholt werden
Anzahl : Int // Anzahl der Datensätze (eingetragene)
Status : Word // Status des Fifo
DBFifo : Word // FIFO-DB
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
Fifo_Ende : Word // Ende des Fifo
Schleife : Word // Loopzähler
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
Constant:
Return:
Ret_Val : Void
--- NW 1: Schnittstellen-DB sinnvoll ? ---
L SSDB
T DBFifo
// CALL TEST_DB
// DB_NUMBER :=#DBFifo
// RET_VAL :=#SFC_RET_VAL
// DB_LENGTH :=#SFC_DB_LENGTH
// WRITE_PROT :=#SFC_WRITE_PROT
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBFifo, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
O SFC_WRITE_PROT
JC Err0 // kein Fifobereich
--- NW 2: Quelle-Pointer erzeugen: ---
L 16#1004 // Kennung 10 + Word=04
T LW0 // Any-Kennung, Datentyp
L 16#0006 // 6 Dw´s holen
T LW2 // Wiederholungen
L SSDB
T LW4 // DB_Nummer
L SSDW // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L10.0 WORD 6) // 1.-6.DW FIFO holen
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
--- NW 3: Zeigerüberprüfung ---
L Kopf // Fifo-Kopf
L 16#FF // = Fifokennung ?
<>I // Nein !
JC Err0 // kein Fifobereich
L 1
L Datensatzlaenge // Datenblocklänge
>I
JC Err0 // kein Fifobereich
L 128
>I
JC Err0 // kein Fifobereich
L 1
L FifoLaenge // Max.Anzahl von Datenblöcken
>I
JC Err0 // kein Fifobereich
L FifoLaenge // Länge FIFO (in Word)
L Datensatzlaenge // Datenblocklänge
*I
L 2 // DB byteorientiert
*I
+ 40 // Speichern ab 20.DW
L SSDW
+I
T Fifo_Ende
SLW 3 // Pointer erzeugen
LAR1
OPN DB[DBFifo]
L Fifo_Ende
L SFC_DB_LENGTH
>I // Fifo-DB ist zu kurz!
JC Err0 // kein Fifo-Bereich
L DBW [AR1,]
L 16#FFEE // Fifo-Endekennung ?
<>I // Nein !
JC Err0 // kein Fifobereich
--- NW 4: Fifo-Daten löschen ---
L SSDW
+ 4 // Ab 2.Dw
SLW 3 // Pointer erzeugen
LAR1
OPN DB[DBFifo]
L Datensatzlaenge
L FifoLaenge
*I
+ 18 // 18 Datenwörter (wortorientiert)
L400: T Schleife
L 0
T DBW [AR1,]
ADDAR1 P#2.0
L Schleife
LOOP L400
--- NW 5: Durchlaufspeicher ? ---
L PARA // Aufrufparameter
SRW 4
L 16#000D // Durchlaufspeicher ?
<>I // Nein !
JC N006
L SSDW
+ 4 // Speichern ab 4.DW
SLW 3 // Pointer erzeugen
LAR1
OPN DB[DBFifo]
L SSDW
+ 40 // 1.Speicherzelle
T DBW [AR1,] // Bringzeiger
T DBW [AR1,] // Holzeiger
L FifoLaenge // Fifo ist voll
T DBW [AR1,] // Anzahl
L PARA // Aufrufparameter
L 16#00D1 // Durchlaufspeicher mit FFFF füllen
<>I // Nein !
JC N006
L FifoLaenge // Fifo ist voll
T DBW [AR1,] // 1.Zusatz-Dw (Anzahl der Daten)
L 2#0000_0000_0000_0011 // Daten vorhanden/kommen raus
T DBW [AR1,] // 4.Zusatz-Dw (Status)
L SSDW
+ 40 // Ab 20.Dw
SLW 3 // Pointer erzeugen
LAR1
OPN DB[DBFifo]
L Datensatzlaenge
L FifoLaenge
*I
L500: T Schleife
L 16#FFFF
T DBW [AR1,]
ADDAR1 P#2.0
L Schleife
LOOP L500
--- NW 6: Fehlerausgabe / RET_VAL ---
N006: SET // VKE = 1 ohne Fehler !!!
L 2#0000_0000_0000_0000
JU Ok
Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich
JU Err
Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler
Err: CLR // VKE = 0 bei Fehler !!!
Ok: T RE_VAL
SAVE // VKE in BIE-Bit speichern
@@ -0,0 +1,52 @@
=== FC 79: INT_to_BCD (4stellig) [STL] ===
INTERFACE:
Input:
Int_Wert : Int
Output:
BCD_Wert : Word
InOut:
Temp:
Rest : Int
Ergebnis : Int
Constant:
Return:
Ret_Val : Void
--- NW 1: Rückmeldung ---
L 0 // erst mal köschen
T BCD_Wert
--- NW 2: Int-Wert ok ? ---
L Int_Wert
L 0
<I
BEC
CAC
L 9999
>I
BEC
--- NW 3: INT-Wert wandeln ---
L Int_Wert
L 10 // Damit die linken 3 Stellen
/I
T LD0 // temporär speichen (s.o.)
L Ergebnis // linken 3 Stellen
ITB // wandeln
SLW 4 // Wieder nach links schieben
T BCD_Wert // zwischen speichern
L Rest // rechte Stelle
ITB // wandeln
L BCD_Wert // Zwischenergebis
OW // rechte Stelle dazu
T BCD_Wert // BDC-Ergebnis
--- NW 4: Ende ---
BE
@@ -0,0 +1,496 @@
=== FB 95: MAntrieb_PowerSave [STL] ===
INTERFACE:
Input:
Automatik : Bool // Automatikbetrieb ist aktiv
Handbetrieb : Bool // Handbetrieb ist aktiv
BereichErr : Bool := 1 // Bereichsstörung -> Antrieb stoppen
Q : Bool // Eingang Motorschutz ok
Ptc : Bool // Eingang Motortemperatur ok
Fu : Bool // Eingang Frequenzumrichter ok
QKontroll : Bool // Jetzt Q-Ok-Meldung von Frequenzumrichter (nach Netz EIN) kontrollieren
FuKontroll : Bool // Jetzt Fu-Ok-Meldung von Frequenzumrichter (nach Netz EIN) kontrollieren
ErrQuit : Bool // Motorschutzstörung quittieren
Kontroll_B : Bool // Kontroll-Sensor für Bewegung
T_Nachlauf : Int := 60 // Nachlaufzeit (*1s)
Output:
Antriebrueck : Bool // Rückwärts-Ausgang des Antriebs
Antriebvor : Bool // Vorwärts-Ausgang des Antriebs
Jog1 : Bool // Frequenz 1/3 aktivieren
Jog2 : Bool // Frequenz 2/3 aktivieren
Analog : Int // Ausgangswort für Analogwandler
InOut:
QErr : Bool // Motorschutzstörung
PtcErr : Bool // Temperaturstörung
FuErr : Bool // Frequenzumrichter ist gestört
Err_Antrieb_verklemmt : Bool // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
Static:
sJog1 : Bool // Frequenz 1/3 aktivieren
sJog2 : Bool // Frequenz 2/3 aktivieren
sAntriebrueck : Bool // Rückwärts-Ausgang des Antriebs
sAntriebvor : Bool // Vorwärts-Ausgang des Antriebs
Stat : "UAntrieb_PowerSave" // Status des Antriebs
Temp:
Antriebaktiv : Bool // Antrieb ist aktiv
Neustart : Bool // Antrieb wurde erneut gestartet
Frequenz : Real // Frequenz für FC106
Constant:
--- NW 1: Zeitwert laden ---
AN Automatik
ON Stat.A_start
JC Nw02
L T_Nachlauf // Zeitwert laden
T Stat.T_Zelle
--- NW 2: Zeitwert löschen ---
Nw02: AN Automatik
O Stat.A_vor
O Stat.A_rueck
O BereichErr
O QErr
O FuErr
JCN Nw03
L 0 // Zeitwert löschen
// // T #Stat.T_Zelle
--- NW 3: Motorschutzstörung / Temperaturüberwachung ---
Nw03: A ErrQuit
R QErr
AN Q
A QKontroll
S QErr
A ErrQuit
R PtcErr
AN Ptc
S PtcErr
--- NW 4: Frequenzumrichterstörung ---
AN Stat.Frequenz
AN Stat.Analog
JC en05
A ErrQuit
ON FuKontroll
R FuErr
AN Fu
A FuKontroll
S FuErr
en05: NOP 0
--- NW 5: Undefinierte Zustände / Befehle (alle Antriebe) ---
A Automatik // Automatik + Hand aktiv
A Handbetrieb
O
AN Automatik // keine Betriebsart
AN Handbetrieb
O
A Stat.A_vor // Vorwärts + Rückwärts aktiv
A Stat.A_rueck
O
A Stat.H_vor
A Stat.H_rueck
O
A BereichErr // Bereichsstörung
A Automatik // Automatik aktiv
O
AN Stat.Normal // Antrieb nicht eindeutig
AN Stat.Frequenz
AN Stat.Analog
O
A Stat.Normal
A(
O Stat.Frequenz
O Stat.Analog
)
O
A Stat.Frequenz
A Stat.Analog
O QErr // Motorschutzstörung
O
A Automatik // Automatik aktiv
A PtcErr // Temperaturstörung
JCN en06
Stop: SET
R sAntriebvor
R sAntriebrueck
R Stat.T_Ausfertig
R sJog1
R sJog2
L 0.0 // Zeitwert/Frequenz löschen
// // T #Stat.T_Zelle
T Frequenz // Frequenz für FC106
JU RET
en06: NOP 0
--- NW 6: Undefinierte Zustände / Befehle (Fu-Zusatz) ---
A Stat.Frequenz
A(
AN Stat.F1 // Keine Frequenz angegeben
AN Stat.F2
AN Stat.F3
O
A Stat.F1 // Mehrere Frequenzen angegeben
A(
O Stat.F2
O Stat.F3
)
O
A Stat.F2 // Mehrere Frequenzen angegeben
A Stat.F3
O FuErr // Frequenzumrichterstörung
ON FuKontroll // Frequenzumrichter ist eingeschaltet
)
JC Stop
--- NW 7: Undefinierte Zustände / Befehle (Analog-Zusatz) ---
A Stat.Analog
A(
L Stat.F // Keine Frequenz angegeben
L 0.0
==R
AN Stat.F1 // Keine Frequenz angegeben
AN Stat.F2
AN Stat.F3
O FuErr // Frequenzumrichterstörung
ON FuKontroll // Frequenzumrichter ist eingeschaltet
)
JC Stop
--- NW 8: Antrieb vorwärts starten ---
A(
A Automatik // Automatik ist aktiv
AN Stat.A_rueck
A(
L Stat.T_Zelle
L 0 // Nachlaufzeit vorhanden ?
<>I // Ja !
AN Stat.A_PS // PowerSave-Mode: Bei Ausschaltverzögerung anhalten
O Stat.A_vor // Einschalten
)
O
A Handbetrieb // Handbetrieb aktiv
A Stat.H_vor // Handtaste vorwärts
)
AN Stat.Stop_vor // Stoppen
A Q // Motorschutz ok
AN QErr // Motorschutzstörung noch aktiv
= sAntriebvor
R Stat.T_Ausfertig
--- NW 9: Antrieb rückwärts starten ---
A(
A Automatik // Automatik ist aktiv
A Stat.A_rueck // Einschalten
O
A Handbetrieb // Handbetrieb aktiv
A Stat.H_rueck // Handtaste rückwärts
)
AN Stat.Stop_rueck // Stoppen
A Q // Motorschutz ok
AN QErr // Motorschutzstörung noch aktiv
AN sAntriebvor
= sAntriebrueck
R Stat.T_Ausfertig
--- NW 10: Frequenz übergeben (Fu-Zusatz) ---
AN Stat.Frequenz
AN Stat.Analog
JC en11
A sAntriebvor
AN sAntriebrueck
O
AN sAntriebvor
A sAntriebrueck
= Antriebaktiv
A Antriebaktiv
A(
O Stat.F1
O Stat.F3
)
= sJog1
A Antriebaktiv
A(
O Stat.F2
O Stat.F3
)
= sJog2
AN sJog1 // Keine Geschwindigtkeit aktiv
AN sJog2
AN Stat.Analog // falls analoge Übergabe erfolgt
R sAntriebvor
R sAntriebrueck
en11: NOP 0
--- NW 11: Frequenz übergeben (Analog-Zusatz) ---
AN Stat.Analog
JC en12
A sAntriebvor
AN sAntriebrueck
O
AN sAntriebvor
A sAntriebrueck
= Antriebaktiv
L 0.0 // Falls Stop erwünscht
AN Antriebaktiv
JC w090
L Stat.F
w090: T Frequenz // Frequenz für FC106
L 3000.0 // Maximal 3000 U/min ?
<=R // Ja !
JC w091
T Frequenz // Frequenz für FC106
w091: L Frequenz
L 0.0 // Keine Geschwindigtkeit aktiv ?
==R // Ja !
AN sJog1 // Aber schon Jog-Geschwindigtkeit aktiv
AN sJog2
R sAntriebvor
R sAntriebrueck
en12: NOP 0
--- NW 12: Steuersignale zurücksetzen ---
RET: A Stat.A_vor // Übergabe an OP
= Stat.OP_A_vor
A Stat.A_start
= Stat.OP_A_start
A Stat.A_PS
= Stat.OP_A_PS
A Stat.Stop_vor
= Stat.OP_Stop_vor
A Stat.Stop_rueck
= Stat.OP_Stop_rueck
L Stat.F
T Stat.OP_F
A Stat.F1
= Stat.OP_F1
A Stat.F2
= Stat.OP_F2
A Stat.F3
= Stat.OP_F3
L 0.0
T Stat.F
SET
R Stat.F1
R Stat.F2
R Stat.F3
R Stat.Stop_vor
R Stat.Stop_rueck
R Stat.Stop_intern
R Stat.A_vor
R Stat.A_rueck
R Stat.A_start
R Stat.A_PS
R Stat.H_vor
R Stat.H_rueck
--- NW 13: Nachlaufzeit läuft ---
AN "1s-Impuls" // 1s-Impuls
ON sAntriebvor // Antrieb steht
JC Nw14
L Stat.T_Zelle
L 0 // Zeit steht ?
==I // Ja !
JC Nw14
L Stat.T_Zelle
+ -1
T Stat.T_Zelle
L 0 // Zeit gerade abgelaufen ?
<=I // Ja !
S Stat.T_Ausfertig
JCN Nw14
T Stat.T_Zelle
--- NW 14: Analog-Signal wandeln ---
Nw14: AN Stat.Analog
JC en14
CALL SYS "UNSCALE" (IN:=Frequenz, HI_LIM:=200.0, LO_LIM:=0.0, BIPOLAR:=FALSE, RET_VAL:=Stat.RET_VAL_FC106, OUT:=Analog)
L Stat.RET_VAL_FC106
L 0 // Fehler vorhanden ?
<>I // Ja !
R sAntriebvor // Antrieb stoppen
R sAntriebrueck
en14: NOP 0
--- NW 15: Ausgänge an OP übergeben ---
A sAntriebvor
AN Stat.OP_Out_Mvor // beim letzten Zyklus war Motor nicht eingeschaltet
O
A sAntriebrueck
AN Stat.OP_Out_Mrueck // beim letzten Zyklus war Motor nicht eingeschaltet
= Neustart // Antrieb wurde erneut gestartet
A sAntriebvor
= Stat.OP_Out_Mvor
A sAntriebrueck
= Stat.OP_Out_Mrueck
--- NW 16: Verklemm-Kontrolle ---
AN Stat.Kontroll_B_verbaut // Parameter 4: Kontroll-Sensor für Bewegung ist eingebaut
R Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
JC en16
A ErrQuit
A Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
JC w161
A Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
R sAntriebvor // Antrieb anhalten
R sAntriebrueck
JC en16
AN Kontroll_B // Sensor ist nicht aktiv
JC w160
// Also Sensor aktiv:
L 0 // Inaktiv-Zeit nullen
T Stat.Raster_B_inaktiv
AN sAntriebvor // Antrieb steht
AN sAntriebrueck
ON "100ms-Impuls" // 0,1s-Impuls
JC en16
L Stat.Raster_B_aktiv
L "MW2" // Anzahl der 100ms-Takte
+I
T Stat.Raster_B_aktiv
L 20 // 2s erreicht ?
>=I // Ja !
S Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
JU en16
// Sensor inaktiv:
w160: L 0 // Aktiv-Zeit nullen
T Stat.Raster_B_aktiv
AN sAntriebvor // Antrieb steht
AN sAntriebrueck
ON "100ms-Impuls" // 0,1s-Impuls
JC en16
L Stat.Raster_B_inaktiv
L "MW2" // Anzahl der 100ms-Takte
+I
T Stat.Raster_B_inaktiv
L 20 // 2s erreicht ?
>=I // Ja !
S Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
JU en16
w161: L 0
T Stat.Raster_B_aktiv // Aktiv-Zeit nullen
T Stat.Raster_B_inaktiv // Inaktiv-Zeit nullen
SET
R Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
en16: NOP 0
--- NW 17: Anzahl der Einschaltungen speichern ---
AN Neustart // Antrieb wurde erneut gestartet
JC en17
L Stat.Statistik.Einschaltungen
+ DINT#1 // Anzahl der Einschaltungen +1
T Stat.Statistik.Einschaltungen
en17: NOP 0
--- NW 18: Ausgangsvariablen schreiben ---
A sAntriebvor
= Antriebvor
A sAntriebrueck
= Antriebrueck
A sJog1
= Jog1
A sJog2
= Jog2
--- NW 19: Gesamt-Laufzeit aufaddieren ---
AN sAntriebvor // Antrieb steht
AN sAntriebrueck
ON "1s-Impuls" // 1s-Impuls
BEC
L Stat.Statistik.Laufzeit_s
+ 1 // Laufzeit des Antriebs in Sekunden+1
T Stat.Statistik.Laufzeit_s
L 60 // Eine Minte erreicht ?
<I // Nein !
BEC
L 0
T Stat.Statistik.Laufzeit_s
L Stat.Statistik.Laufzeit_m
+ 1 // Laufzeit des Antriebs in Minuten+1
T Stat.Statistik.Laufzeit_m
L 60 // Eine Stunde erreicht ?
<I // Nein !
BEC
L 0
T Stat.Statistik.Laufzeit_m
L Stat.Statistik.Laufzeit_h
+ 1 // Laufzeit des Antriebs in Stunden+1
T Stat.Statistik.Laufzeit_h
--- NW 20: Ende ---
BE
@@ -0,0 +1,496 @@
=== FB 93: MAntrieb_all [STL] ===
INTERFACE:
Input:
Automatik : Bool // Automatikbetrieb ist aktiv
Handbetrieb : Bool // Handbetrieb ist aktiv
BereichErr : Bool := 1 // Bereichsstörung -> Antrieb stoppen
Q : Bool // Eingang Motorschutz ok
Ptc : Bool // Eingang Motortemperatur ok
Fu : Bool // Eingang Frequenzumrichter ok
QKontroll : Bool // Jetzt Q-Ok-Meldung von Frequenzumrichter (nach Netz EIN) kontrollieren
FuKontroll : Bool // Jetzt Fu-Ok-Meldung von Frequenzumrichter (nach Netz EIN) kontrollieren
ErrQuit : Bool // Motorschutzstörung quittieren
Kontroll_B : Bool // Kontroll-Sensor für Bewegung
Output:
Antriebrueck : Bool // Rückwärts-Ausgang des Antriebs
Antriebvor : Bool // Vorwärts-Ausgang des Antriebs
Jog1 : Bool // Frequenz 1/3 aktivieren
Jog2 : Bool // Frequenz 2/3 aktivieren
Analog : Int // Ausgangswort für Analogwandler
InOut:
QErr : Bool // Motorschutzstörung
PtcErr : Bool // Temperaturstörung
FuErr : Bool // Frequenzumrichter ist gestört
Err_Antrieb_verklemmt : Bool // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
hStOk : Bool // Anzeige Start n. Störung aktivieren
Static:
sJog1 : Bool // Frequenz 1/3 aktivieren
sJog2 : Bool // Frequenz 2/3 aktivieren
sAntriebrueck : Bool // Rückwärts-Ausgang des Antriebs
sAntriebvor : Bool // Vorwärts-Ausgang des Antriebs
Stat : "UAntrieb_all" // Status des Antriebs
Temp:
Antriebaktiv : Bool // Antrieb ist aktiv
Neustart : Bool // Antrieb wurde erneut gestartet
Frequenz : Real // Frequenz für FC106
Constant:
--- NW 1: Zeitwert laden ---
AN Automatik
ON Stat.A_start
JC Nw02
L Stat.T_Nachlauf // Zeitwert laden
T Stat.T_Zelle
--- NW 2: Zeitwert löschen ---
Nw02: AN Automatik
O Stat.A_vor
O Stat.A_rueck
O BereichErr
O QErr
O FuErr
JCN Nw03
L 0 // Zeitwert löschen
// // T #Stat.T_Zelle
--- NW 3: Motorschutzstörung / Temperaturüberwachung ---
Nw03: A ErrQuit
R QErr
AN Q
A QKontroll
S QErr
A ErrQuit
R PtcErr
AN Ptc
S PtcErr
// Störung ist quittierbar:
A Q
A QErr
O
A Ptc
A PtcErr
S hStOk
--- NW 4: Frequenzumrichterstörung ---
AN Stat.Frequenz
AN Stat.Analog
JC en05
A ErrQuit
ON FuKontroll
R FuErr
AN Fu
A FuKontroll
S FuErr
en05: NOP 0
--- NW 5: Undefinierte Zustände / Befehle (alle Antriebe) ---
A Automatik // Automatik + Hand aktiv
A Handbetrieb
O
AN Automatik // keine Betriebsart
AN Handbetrieb
O
A Stat.A_vor // Vorwärts + Rückwärts aktiv
A Stat.A_rueck
O
A Stat.H_vor
A Stat.H_rueck
O
A BereichErr // Bereichsstörung
A Automatik // Automatik aktiv
O
AN Stat.Normal // Antrieb nicht eindeutig
AN Stat.Frequenz
AN Stat.Analog
O
A Stat.Normal
A(
O Stat.Frequenz
O Stat.Analog
)
O
A Stat.Frequenz
A Stat.Analog
O QErr // Motorschutzstörung
O
A Automatik // Automatik aktiv
A PtcErr // Temperaturstörung
JCN en06
Stop: SET
R sAntriebvor
R sAntriebrueck
R Stat.T_Ausfertig
R sJog1
R sJog2
L 0.0 // Zeitwert/Frequenz löschen
// // T #Stat.T_Zelle
T Frequenz // Frequenz für FC106
JU RET
en06: NOP 0
--- NW 6: Undefinierte Zustände / Befehle (Fu-Zusatz) ---
A Stat.Frequenz
A(
AN Stat.F1 // Keine Frequenz angegeben
AN Stat.F2
AN Stat.F3
O
A Stat.F1 // Mehrere Frequenzen angegeben
A(
O Stat.F2
O Stat.F3
)
O
A Stat.F2 // Mehrere Frequenzen angegeben
A Stat.F3
O FuErr // Frequenzumrichterstörung
ON FuKontroll // Frequenzumrichter ist eingeschaltet
)
JC Stop
--- NW 7: Undefinierte Zustände / Befehle (Analog-Zusatz) ---
A Stat.Analog
A(
L Stat.F // Keine Frequenz angegeben
L 0.0
==R
AN Stat.F1 // Keine Frequenz angegeben
AN Stat.F2
AN Stat.F3
O FuErr // Frequenzumrichterstörung
ON FuKontroll // Frequenzumrichter ist eingeschaltet
)
JC Stop
--- NW 8: Antrieb vorwärts starten ---
A(
A Automatik // Automatik ist aktiv
AN Stat.A_rueck
A(
L Stat.T_Zelle
L 0 // Nachlaufzeit vorhanden ?
<>I // Ja !
O Stat.A_start
O Stat.A_vor // Einschalten
)
O
A Handbetrieb // Handbetrieb aktiv
A Stat.H_vor // Handtaste vorwärts
)
AN Stat.Stop_vor // Stoppen
A Q // Motorschutz ok
AN QErr // Motorschutzstörung noch aktiv
= sAntriebvor
R Stat.T_Ausfertig
--- NW 9: Antrieb rückwärts starten ---
A(
A Automatik // Automatik ist aktiv
A Stat.A_rueck // Einschalten
O
A Handbetrieb // Handbetrieb aktiv
A Stat.H_rueck // Handtaste rückwärts
)
AN Stat.Stop_rueck // Stoppen
A Q // Motorschutz ok
AN QErr // Motorschutzstörung noch aktiv
AN sAntriebvor
= sAntriebrueck
R Stat.T_Ausfertig
--- NW 10: Frequenz übergeben (Fu-Zusatz) ---
AN Stat.Frequenz
AN Stat.Analog
JC en11
A sAntriebvor
AN sAntriebrueck
O
AN sAntriebvor
A sAntriebrueck
= Antriebaktiv
A Antriebaktiv
A(
O Stat.F1
O Stat.F3
)
= sJog1
A Antriebaktiv
A(
O Stat.F2
O Stat.F3
)
= sJog2
AN sJog1 // Keine Geschwindigtkeit aktiv
AN sJog2
AN Stat.Analog // falls analoge Übergabe erfolgt
R sAntriebvor
R sAntriebrueck
en11: NOP 0
--- NW 11: Frequenz übergeben (Analog-Zusatz) ---
AN Stat.Analog
JC en12
A sAntriebvor
AN sAntriebrueck
O
AN sAntriebvor
A sAntriebrueck
= Antriebaktiv
L 0.0 // Falls Stop erwünscht
AN Antriebaktiv
JC w090
L Stat.F
w090: T Frequenz // Frequenz für FC106
L 3000.0 // Maximal 3000 U/min ?
<=R // Ja !
JC w091
T Frequenz // Frequenz für FC106
w091: L Frequenz
L 0.0 // Keine Geschwindigtkeit aktiv ?
==R // Ja !
AN sJog1 // Aber schon Jog-Geschwindigtkeit aktiv
AN sJog2
R sAntriebvor
R sAntriebrueck
en12: NOP 0
--- NW 12: Steuersignale zurücksetzen ---
RET: A Stat.Stop_vor // Übergabe an OP
= Stat.OP_Stop_vor
A Stat.Stop_rueck
= Stat.OP_Stop_rueck
L Stat.F
T Stat.OP_F
A Stat.F1
= Stat.OP_F1
A Stat.F2
= Stat.OP_F2
A Stat.F3
= Stat.OP_F3
L 0.0
T Stat.F
SET
R Stat.F1
R Stat.F2
R Stat.F3
R Stat.Stop_vor
R Stat.Stop_rueck
R Stat.Stop_intern
R Stat.A_vor
R Stat.A_rueck
R Stat.A_start
R Stat.H_vor
R Stat.H_rueck
--- NW 13: Nachlaufzeit läuft ---
AN "100ms-Impuls" // 0,1s-Impuls
ON sAntriebvor // Antrieb steht
JC Nw14
L Stat.T_Zelle
L 0 // Zeit steht ?
==I // Ja !
JC Nw14
L Stat.T_Zelle
L "MW2" // minus 0,1-Takte
-I
T Stat.T_Zelle
L 0.0 // Zeit gerade abgelaufen ?
<=I // Ja !
S Stat.T_Ausfertig
JCN Nw14
T Stat.T_Zelle
--- NW 14: Analog-Signal wandeln ---
Nw14: AN Stat.Analog
JC en14
CALL SYS "UNSCALE" (IN:=Frequenz, HI_LIM:=200.0, LO_LIM:=0.0, BIPOLAR:=FALSE, RET_VAL:=Stat.RET_VAL_FC106, OUT:=Analog)
L Stat.RET_VAL_FC106
L 0 // Fehler vorhanden ?
<>I // Ja !
R sAntriebvor // Antrieb stoppen
R sAntriebrueck
en14: NOP 0
--- NW 15: Ausgänge an OP übergeben ---
A sAntriebvor
AN Stat.OP_Out_Mvor // beim letzten Zyklus war Motor nicht eingeschaltet
O
A sAntriebrueck
AN Stat.OP_Out_Mrueck // beim letzten Zyklus war Motor nicht eingeschaltet
= Neustart // Antrieb wurde erneut gestartet
A sAntriebvor
= Stat.OP_Out_Mvor
A sAntriebrueck
= Stat.OP_Out_Mrueck
--- NW 16: Verklemm-Kontrolle ---
AN Stat.Kontroll_B_verbaut // Parameter 4: Kontroll-Sensor für Bewegung ist eingebaut
R Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
JC en16
A ErrQuit
A Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
JC w161
A Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
R sAntriebvor // Antrieb anhalten
R sAntriebrueck
JC en16
AN Kontroll_B // Sensor ist nicht aktiv
JC w160
// Also Sensor aktiv:
L 0 // Inaktiv-Zeit nullen
T Stat.Raster_B_inaktiv
AN sAntriebvor // Antrieb steht
AN sAntriebrueck
ON "100ms-Impuls" // 0,1s-Impuls
JC en16
L Stat.Raster_B_aktiv
L "MW2" // Anzahl der 100ms-Takte
+I
T Stat.Raster_B_aktiv
L 20 // 2s erreicht ?
>=I // Ja !
S Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
JU en16
// Sensor inaktiv:
w160: L 0 // Aktiv-Zeit nullen
T Stat.Raster_B_aktiv
AN sAntriebvor // Antrieb steht
AN sAntriebrueck
ON "100ms-Impuls" // 0,1s-Impuls
JC en16
L Stat.Raster_B_inaktiv
L "MW2" // Anzahl der 100ms-Takte
+I
T Stat.Raster_B_inaktiv
L 20 // 2s erreicht ?
>=I // Ja !
S Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
JU en16
w161: L 0
T Stat.Raster_B_aktiv // Aktiv-Zeit nullen
T Stat.Raster_B_inaktiv // Inaktiv-Zeit nullen
SET
R Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
en16: NOP 0
--- NW 17: Anzahl der Einschaltungen speichern ---
AN Neustart // Antrieb wurde erneut gestartet
JC en17
L Stat.Statistik.Einschaltungen
+ DINT#1 // Anzahl der Einschaltungen +1
T Stat.Statistik.Einschaltungen
en17: NOP 0
--- NW 18: Ausgangsvariablen schreiben ---
A sAntriebvor
= Antriebvor
A sAntriebrueck
= Antriebrueck
A sJog1
= Jog1
A sJog2
= Jog2
--- NW 19: Gesamt-Laufzeit aufaddieren ---
AN sAntriebvor // Antrieb steht
AN sAntriebrueck
ON "1s-Impuls" // 1s-Impuls
BEC
L Stat.Statistik.Laufzeit_s
+ 1 // Laufzeit des Antriebs in Sekunden+1
T Stat.Statistik.Laufzeit_s
L 60 // Eine Minte erreicht ?
<I // Nein !
BEC
L 0
T Stat.Statistik.Laufzeit_s
L Stat.Statistik.Laufzeit_m
+ 1 // Laufzeit des Antriebs in Minuten+1
T Stat.Statistik.Laufzeit_m
L 60 // Eine Stunde erreicht ?
<I // Nein !
BEC
L 0
T Stat.Statistik.Laufzeit_m
L Stat.Statistik.Laufzeit_h
+ 1 // Laufzeit des Antriebs in Stunden+1
T Stat.Statistik.Laufzeit_h
--- NW 20: Ende ---
BE
@@ -0,0 +1,565 @@
=== FB 181: MAusfahrFreigabe [STL] ===
INTERFACE:
Input:
Antrieb_aktiv : Bool
Kommt_1 : Bool // BM fährt aus Strecke ausgefahren
Kommt_2 : Bool // BM fährt aus Strecke ausgefahren
Kommt_3 : Bool // BM fährt aus Strecke ausgefahren
Kommt_4 : Bool // BM fährt aus Strecke ausgefahren
Kommt_5 : Bool // BM fährt aus Strecke ausgefahren
Kommt_6 : Bool // BM fährt aus Strecke ausgefahren
Kommt_7 : Bool // BM fährt aus Strecke ausgefahren
Kommt_8 : Bool // BM fährt aus Strecke ausgefahren
Kommt_9 : Bool // BM fährt aus Strecke ausgefahren
Kommt_10 : Bool // BM fährt aus Strecke ausgefahren
Kommt_11 : Bool // BM fährt aus Strecke ausgefahren
Kommt_12 : Bool // BM fährt aus Strecke ausgefahren
Kommt_13 : Bool // BM fährt aus Strecke ausgefahren
Kommt_14 : Bool // BM fährt aus Strecke ausgefahren
Kommt_15 : Bool // BM fährt aus Strecke ausgefahren
Kommt_16 : Bool // BM fährt aus Strecke ausgefahren
Kommt_17 : Bool // BM fährt aus Strecke ausgefahren
Kommt_18 : Bool // BM fährt aus Strecke ausgefahren
Kommt_19 : Bool // BM fährt aus Strecke ausgefahren
Kommt_20 : Bool // BM fährt aus Strecke ausgefahren
Kommt_21 : Bool // BM fährt aus Strecke ausgefahren
Kommt_22 : Bool // BM fährt aus Strecke ausgefahren
Kommt_23 : Bool // BM fährt aus Strecke ausgefahren
Kommt_24 : Bool // BM fährt aus Strecke ausgefahren
Kommt_25 : Bool // BM fährt aus Strecke ausgefahren
Vorbei_1 : Bool // BM ist an Sensor vorbeigefahren
Vorbei_2 : Bool // BM ist an Sensor vorbeigefahren
Vorbei_3 : Bool // BM ist an Sensor vorbeigefahren
Vorbei_4 : Bool // BM ist an Sensor vorbeigefahren
Vorbei_5 : Bool // BM ist an Sensor vorbeigefahren
Nur_1 : Bool // Nachtriggern nur bei Vorbei_1
Output:
InOut:
Static:
Para : Struct
Sicherheit : Int := 60 // Sicherheitszeit dazu[100ms]
Abstand_Lines : Int := 20 // Abstand zwischen 2 Linien [100ms]
Position_Vorbei_1 : Int // Vorbei-Sensor in Höhe Linie X
Position_Vorbei_2 : Int // Vorbei-Sensor in Höhe Linie X
Position_Vorbei_3 : Int // Vorbei-Sensor in Höhe Linie X
Position_Vorbei_4 : Int // Vorbei-Sensor in Höhe Linie X
Position_Vorbei_5 : Int // Vorbei-Sensor in Höhe Linie X
Dyn : Struct
RestZeit : Int // BM noch unterwegs [s]
Aktiv_Line : Int // Aktive Linie
Last_Line : Int // Letzte aktive Linie
Nachtrigger_Freigabe : Int // Nachtriggern der Freigabe der ausfahrenden Linie
Out : Struct
Line_1_Ok : Bool
Line_2_Ok : Bool
Line_3_Ok : Bool
Line_4_Ok : Bool
Line_5_Ok : Bool
Line_6_Ok : Bool
Line_7_Ok : Bool
Line_8_Ok : Bool
Line_9_Ok : Bool
Line_10_Ok : Bool
Line_11_Ok : Bool
Line_12_Ok : Bool
Line_13_Ok : Bool
Line_14_Ok : Bool
Line_15_Ok : Bool
Line_16_Ok : Bool
Line_17_Ok : Bool
Line_18_Ok : Bool
Line_19_Ok : Bool
Line_20_Ok : Bool
Line_21_Ok : Bool
Line_22_Ok : Bool
Line_23_Ok : Bool
Line_24_Ok : Bool
Line_25_Ok : Bool
Temp:
Constant:
--- NW 1: Erst mal ---
SET
R Out.Line_1_Ok
R Out.Line_2_Ok
R Out.Line_3_Ok
R Out.Line_4_Ok
R Out.Line_5_Ok
R Out.Line_6_Ok
R Out.Line_7_Ok
R Out.Line_8_Ok
R Out.Line_9_Ok
R Out.Line_10_Ok
R Out.Line_11_Ok
R Out.Line_12_Ok
R Out.Line_13_Ok
R Out.Line_14_Ok
R Out.Line_15_Ok
R Out.Line_16_Ok
R Out.Line_17_Ok
R Out.Line_18_Ok
R Out.Line_19_Ok
R Out.Line_20_Ok
R Out.Line_21_Ok
R Out.Line_22_Ok
R Out.Line_23_Ok
R Out.Line_24_Ok
R Out.Line_25_Ok
--- NW 2: Vorbei.Sensoren auswerten ---
AN Vorbei_1
JC V002
L Para.Position_Vorbei_1
L Para.Abstand_Lines
*I
L Para.Sicherheit
+I // Neue RestZeit ermitteln
L Dyn.RestZeit // Neuer Wert kleiner?
<I // Ja !
JC V002 // Ohne Speicherung weiter
CAC // Neuen Wert übernehmen
T Dyn.RestZeit // Wert speichern
V002: AN Vorbei_2
O Nur_1 // Nachtriggern nur bei Vorbei_1
JC V003
L Para.Position_Vorbei_2
L Para.Abstand_Lines
*I
L Para.Sicherheit
+I // Neue RestZeit ermitteln
L Dyn.RestZeit // Neuer Wert kleiner?
<I // Ja !
JC V003 // Ohne Speicherung weiter
CAC // Neuen Wert übernehmen
T Dyn.RestZeit // Wert speichern
V003: AN Vorbei_3
O Nur_1 // Nachtriggern nur bei Vorbei_1
JC V004
L Para.Position_Vorbei_3
L Para.Abstand_Lines
*I
L Para.Sicherheit
+I // Neue RestZeit ermitteln
L Dyn.RestZeit // Neuer Wert kleiner?
<I // Ja !
JC V004 // Ohne Speicherung weiter
CAC // Neuen Wert übernehmen
T Dyn.RestZeit // Wert speichern
V004: AN Vorbei_4
O Nur_1 // Nachtriggern nur bei Vorbei_1
JC V005
L Para.Position_Vorbei_4
L Para.Abstand_Lines
*I
L Para.Sicherheit
+I // Neue RestZeit ermitteln
L Dyn.RestZeit // Neuer Wert kleiner?
<I // Ja !
JC V005 // Ohne Speicherung weiter
CAC // Neuen Wert übernehmen
T Dyn.RestZeit // Wert speichern
V005: AN Vorbei_5
O Nur_1 // Nachtriggern nur bei Vorbei_1
JC V00E
L Para.Position_Vorbei_5
L Para.Abstand_Lines
*I
L Para.Sicherheit
+I // Neue RestZeit ermitteln
L Dyn.RestZeit // Neuer Wert kleiner?
<I // Ja !
JC V00E // Ohne Speicherung weiter
CAC // Neuen Wert übernehmen
T Dyn.RestZeit // Wert speichern
V00E: NOP 0
--- NW 3: Aus-/vorbeifahrendes BM -> Aktivzeit speichern ---
L 25
A Kommt_25
JC Save
L 24
A Kommt_24
JC Save
L 23
A Kommt_23
JC Save
L 22
A Kommt_22
JC Save
L 21
A Kommt_21
JC Save
L 20
A Kommt_20
JC Save
L 19
A Kommt_19
JC Save
L 18
A Kommt_18
JC Save
L 17
A Kommt_17
JC Save
L 16
A Kommt_16
JC Save
L 15
A Kommt_15
JC Save
L 14
A Kommt_14
JC Save
L 13
A Kommt_13
JC Save
L 12
A Kommt_12
JC Save
L 11
A Kommt_11
JC Save
L 10
A Kommt_10
JC Save
L 9
A Kommt_9
JC Save
L 8
A Kommt_8
JC Save
L 7
A Kommt_7
JC Save
L 6
A Kommt_6
JC Save
L 5
A Kommt_5
JC Save
L 4
A Kommt_4
JC Save
L 3
A Kommt_3
JC Save
L 2
A Kommt_2
JC Save
L 1
A Kommt_1
JC Save
JU Zeit
Save: T Dyn.Aktiv_Line // Aktive Linie speichern
L Para.Abstand_Lines
*I
L Para.Sicherheit
+I // RestZeit ermitteln
L Dyn.RestZeit // Neuer Wert größer?
>=I // Ja !
JC Ok
// Ausgefahrene Stelle ist kleiner:
L 0 // Löschen
T Dyn.Aktiv_Line // Aktive Linie
T Dyn.Nachtrigger_Freigabe // Nachtriggern der Freigabe der ausfahrenden Linie
BEU
Ok: CAC // Neuen Wert übernehmen
T Dyn.RestZeit // Wert speichern
// Freigabe aus aktiver Linie verlängern aktivieren:
L Para.Sicherheit
L Para.Abstand_Lines
+I
L 10
/I
L 2 // /Nach 2 Sekunden
T Dyn.Nachtrigger_Freigabe // Nachtriggern der Freigabe der ausfahrenden Linie
--- NW 4: Aktiv-/Nachtrigger-Zeit verändern ---
Zeit: AN Antrieb_aktiv // Antrieb aktiv
ON "1s-Impuls" // 1s-Impuls
JC Chk
// BM ist unterwegs:
L Dyn.RestZeit
+ -10 // 10*100ms = 1s
T Dyn.RestZeit
L 0 // Minimum erreicht?
>I // Nein !
JC Trig
T Dyn.RestZeit // Minimum übergeben
// Freigabe nachtriggern:
Trig: L Dyn.Nachtrigger_Freigabe // Nachtriggern der Freigabe der ausfahrenden Linie
+ -1
T Dyn.Nachtrigger_Freigabe // Nachtriggern der Freigabe der ausfahrenden Linie
L 0 // Minimum erreicht?
>I // Nein !
JC Chk
T Dyn.Nachtrigger_Freigabe // Minimum übergeben
T Dyn.Aktiv_Line
T Dyn.Last_Line
--- NW 5: Nachtriggern der Freigabe der ausfahrenden Linie ---
Chk: L Dyn.Aktiv_Line // Aktive Linie
L Dyn.Last_Line
<>I // Unterschiedlich !
JC More
CAC
JL ENDE_Mig
JU ENDE_Mig // Bei 0
JU Li01 // Linie 1 war aktiv
JU Li02
JU Li03
JU Li04
JU Li05
JU Li06
JU Li07
JU Li08
JU Li09
JU Li10
JU Li11
JU Li12
JU Li13
JU Li14
JU Li15
JU Li16
JU Li17
JU Li18
JU Li19
JU Li20
JU Li21
JU Li22
JU Li23
JU Li24
JU Li25 // Linie 25 war aktiv
ENDE_Mig: JU More
Li01: SET
S Out.Line_1_Ok
BEU
Li02: SET
S Out.Line_2_Ok
BEU
Li03: SET
S Out.Line_3_Ok
BEU
Li04: SET
S Out.Line_4_Ok
BEU
Li05: SET
S Out.Line_5_Ok
BEU
Li06: SET
S Out.Line_6_Ok
BEU
Li07: SET
S Out.Line_7_Ok
BEU
Li08: SET
S Out.Line_8_Ok
BEU
Li09: SET
S Out.Line_9_Ok
BEU
Li10: SET
S Out.Line_10_Ok
BEU
Li11: SET
S Out.Line_11_Ok
BEU
Li12: SET
S Out.Line_12_Ok
BEU
Li13: SET
S Out.Line_13_Ok
BEU
Li14: SET
S Out.Line_14_Ok
BEU
Li15: SET
S Out.Line_15_Ok
BEU
Li16: SET
S Out.Line_16_Ok
BEU
Li17: SET
S Out.Line_17_Ok
BEU
Li18: SET
S Out.Line_18_Ok
BEU
Li19: SET
S Out.Line_19_Ok
BEU
Li20: SET
S Out.Line_20_Ok
BEU
Li21: SET
S Out.Line_21_Ok
BEU
Li22: SET
S Out.Line_22_Ok
BEU
Li23: SET
S Out.Line_23_Ok
BEU
Li24: SET
S Out.Line_24_Ok
BEU
Li25: SET
S Out.Line_25_Ok
BEU
More: NOP 0
--- NW 6: Freigaben an Pufferstrecken aufgrund der fahrenden BM ---
L Dyn.RestZeit
L 10
/I
JL Ende
JU Ok01 // Restzeit in 0 Sekunden
JU Ok01 // Restzeit in 1 Sekunden
JU Ok02 // Restzeit in 2 Sekunden
JU Ok02 // Restzeit in 3 Sekunden
JU Ok03 // Restzeit in 4 Sekunden
JU Ok03 // Restzeit in 5 Sekunden
JU Ok04 // Restzeit in 6 Sekunden
JU Ok04 // Restzeit in 7 Sekunden
JU Ok05 // Restzeit in 8 Sekunden
JU Ok05 // Restzeit in 9 Sekunden
JU Ok06 // Restzeit in 10 Sekunden
JU Ok06 // Restzeit in 11 Sekunden
JU Ok07 // Restzeit in 12 Sekunden
JU Ok07 // Restzeit in 13 Sekunden
JU Ok08 // Restzeit in 14 Sekunden
JU Ok08 // Restzeit in 15 Sekunden
JU Ok09 // Restzeit in 16 Sekunden
JU Ok09 // Restzeit in 17 Sekunden
JU Ok10 // Restzeit in 18 Sekunden
JU Ok10 // Restzeit in 19 Sekunden
JU Ok11 // Restzeit in 20 Sekunden
JU Ok11 // Restzeit in 21 Sekunden
JU Ok12 // Restzeit in 22 Sekunden
JU Ok12 // Restzeit in 23 Sekunden
JU Ok13 // Restzeit in 24 Sekunden
JU Ok13 // Restzeit in 25 Sekunden
JU Ok14 // Restzeit in 26 Sekunden
JU Ok14 // Restzeit in 27 Sekunden
JU Ok15 // Restzeit in 28 Sekunden
JU Ok15 // Restzeit in 29 Sekunden
JU Ok16 // Restzeit in 30 Sekunden
JU Ok16 // Restzeit in 31 Sekunden
JU Ok17 // Restzeit in 32 Sekunden
JU Ok17 // Restzeit in 33 Sekunden
JU Ok18 // Restzeit in 34 Sekunden
JU Ok18 // Restzeit in 35 Sekunden
JU Ok19 // Restzeit in 36 Sekunden
JU Ok19 // Restzeit in 33 Sekunden
JU Ok20 // Restzeit in 38 Sekunden
JU Ok20 // Restzeit in 39 Sekunden
JU Ok21 // Restzeit in 40 Sekunden
JU Ok21 // Restzeit in 41 Sekunden
JU Ok22 // Restzeit in 42 Sekunden
JU Ok22 // Restzeit in 43 Sekunden
JU Ok23 // Restzeit in 44 Sekunden
JU Ok23 // Restzeit in 45 Sekunden
JU Ok24 // Restzeit in 46 Sekunden
JU Ok24 // Restzeit in 43 Sekunden
JU Ok25 // Restzeit in 48 Sekunden
JU Ok25 // Restzeit in 49 Sekunden
Ende: JU En04
Ok01: SET
S Out.Line_1_Ok
Ok02: SET
S Out.Line_2_Ok
Ok03: SET
S Out.Line_3_Ok
Ok04: SET
S Out.Line_4_Ok
Ok05: SET
S Out.Line_5_Ok
Ok06: SET
S Out.Line_6_Ok
Ok07: SET
S Out.Line_7_Ok
Ok08: SET
S Out.Line_8_Ok
Ok09: SET
S Out.Line_9_Ok
Ok10: SET
S Out.Line_10_Ok
Ok11: SET
S Out.Line_11_Ok
Ok12: SET
S Out.Line_12_Ok
Ok13: SET
S Out.Line_13_Ok
Ok14: SET
S Out.Line_14_Ok
Ok15: SET
S Out.Line_15_Ok
Ok16: SET
S Out.Line_16_Ok
Ok17: SET
S Out.Line_17_Ok
Ok18: SET
S Out.Line_18_Ok
Ok19: SET
S Out.Line_19_Ok
Ok20: SET
S Out.Line_20_Ok
Ok21: SET
S Out.Line_21_Ok
Ok22: SET
S Out.Line_22_Ok
Ok23: SET
S Out.Line_23_Ok
Ok24: SET
S Out.Line_24_Ok
Ok25: SET
S Out.Line_25_Ok
En04: NOP 0
--- NW 7: Letzten aktiven Puffer speichern ---
L Dyn.Aktiv_Line // Aktive Linie
T Dyn.Last_Line // speichern
--- NW 8: Ende ---
BE
@@ -0,0 +1,82 @@
=== FB 182: MAusfahrFreigabe_neu [STL] ===
INTERFACE:
Input:
Impuls : Bool // Zähl-Impuls
Vorbei_1 : Bool // BM ist an Sensor vorbeigefahren
Vorbei_2 : Bool // BM ist an Sensor vorbeigefahren
Vorbei_3 : Bool // BM ist an Sensor vorbeigefahren
Vorbei_4 : Bool // BM ist an Sensor vorbeigefahren
Vorbei_5 : Bool // BM ist an Sensor vorbeigefahren
Inks_Vorbei_1 : Int // Rest-Inks für diese Position
Inks_Vorbei_2 : Int // Rest-Inks für diese Position
Inks_Vorbei_3 : Int // Rest-Inks für diese Position
Inks_Vorbei_4 : Int // Rest-Inks für diese Position
Inks_Vorbei_5 : Int // Rest-Inks für diese Position
Output:
InOut:
Antrieb_ein : Bool // Antrieb einschalten
Static:
Dyn : Struct
Rest_Inks : Int := 1 // BM noch unterwegs [Inks]
Temp:
tAktiv : Int
Constant:
--- NW 1: Vorbei-Sensoren auswerten ---
L Inks_Vorbei_5
A Vorbei_5
JC Chek
L Inks_Vorbei_4
A Vorbei_4
JC Chek
L Inks_Vorbei_3
A Vorbei_3
JC Chek
L Inks_Vorbei_2
A Vorbei_2
JC Chek
L Inks_Vorbei_1
A Vorbei_1
JC Chek
JU En02
Chek: L Dyn.Rest_Inks // Neuer Wert kleiner?
<I // Ja !
JC En02 // Ohne Speicherung weiter
CAC // Neuen Wert übernehmen
T Dyn.Rest_Inks // Wert speichern
En02: NOP 0
--- NW 2: Rest-Inks verändern ---
AN Impuls // Von MImpulsGeber
JC En04
// BT ist unterwegs:
L Dyn.Rest_Inks
+ -1
T Dyn.Rest_Inks
L 0 // Minimum erreicht?
>I // Nein !
JC En04
L 1
T Dyn.Rest_Inks // Minimum übergeben
En04: NOP 0
--- NW 3: Antrieb einschalten ---
L Dyn.Rest_Inks
L 1 // vorhanden ?
>I // Ja !
S Antrieb_ein
--- NW 4: Ende ---
BE
@@ -0,0 +1,153 @@
=== FB 94: MBlinken [STL] ===
INTERFACE:
Input:
Impulsdauer : Bool // Impulsdauer
Error_1 : Bool
Error_2 : Bool
Error_3 : Bool
Error_4 : Bool
Error_5 : Bool
Error_6 : Bool
Error_7 : Bool
Error_8 : Bool
Error_9 : Bool
Error_10 : Bool
Output:
hAnzeige : Bool // Anzeige
InOut:
Static:
Flanke_Ausschalttakt : Bool
Kein_Blinken : Bool
Ausschalttakte : Int // Betriebsbereit ist ausgeschaltet
Temp:
Constant:
--- NW 1: Anzeige bei Error 1-10 1-10 mal blinken lassen ---
// Anzeige ausschalten:
AN Error_1
AN Error_2
AN Error_3
AN Error_4
AN Error_5
AN Error_6
AN Error_7
AN Error_8
AN Error_9
AN Error_10
R hAnzeige
R Flanke_Ausschalttakt
R Kein_Blinken
JC NoAn
// Anzeige aktivieren
A Impulsdauer
AN Kein_Blinken
= hAnzeige
A Impulsdauer
Fall Flanke_Ausschalttakt
JCN mHu
L Ausschalttakte
+ 1
T Ausschalttakte
mHu: L Ausschalttakte
L 2
>=I
A Kein_Blinken
R Kein_Blinken
JC NoAn
A Kein_Blinken
JC En01
CAC
L 1
>=I
A Error_1
S Kein_Blinken
JC NoAn
CAC
L 2
>=I
A Error_2
S Kein_Blinken
JC NoAn
CAC
L 3
>=I
A Error_3
S Kein_Blinken
JC NoAn
CAC
L 4
>=I
A Error_4
S Kein_Blinken
JC NoAn
CAC
L 5
>=I
A Error_5
S Kein_Blinken
JC NoAn
CAC
L 6
>=I
A Error_6
S Kein_Blinken
JC NoAn
CAC
L 7
>=I
A Error_7
S Kein_Blinken
JC NoAn
CAC
L 8
>=I
A Error_8
S Kein_Blinken
JC NoAn
CAC
L 9
>=I
A Error_9
S Kein_Blinken
JC NoAn
CAC
L 10
>=I
A Error_10
S Kein_Blinken
JC NoAn
CAC
L 10
>I
S Kein_Blinken
JC NoAn
JU En01
NoAn: L 0
T Ausschalttakte
En01: NOP 0
--- NW 2: Ende ---
BE
@@ -0,0 +1,208 @@
=== FB 1278: MHMEntnahmepuffer [STL] ===
INTERFACE:
Input:
EntnahmePuffer_Nr : Int // Aufruf für Leer-Puffer
B_LeerpufferEinfahrt : Bool // Sensor Trolley fährt in Leerpuffer
Output:
Error : Word // Störungen übergeben
InOut:
hStOk : Bool // Anzeige Start n. Störung aktivieren
Static:
Res16 : Array[1..4] of Int // Reserve
SAVE : Struct
Weichen_DB : Int // Weichen-FIFO-DB
Weichen_DW : Int // Weichen-FIFO-DW
Para : Struct // Parameter
Entnahmepuffer_DL_DB : Int // Einsprung Leerpuffer-Datenliste-DB
Entnahmepuffer_DL_DW : Int // Einsprung Leerpuffer-Datenliste-DW
Res1 : Array[1..2] of Int // Reserve
Status2 : Struct
Abruf_ist_möglich : Bool // Abruf ist möglich
Kein_Stop_mehr : Bool
Eintrag_DL_Leerliste_erfolgt : Bool // Eintrag in DLLPPuffer_leer (DB500) erfolgt
Eintrag_DL_Reinliste_erfolgt : Bool // Eintrag in DLLPPuffer_Einfahren (DB501) erfolgt
Eintrag_Abrufliste_erfolgt : Bool // Eintrag in DLLPPuffer_Ausfahren (DB502) erfolgt
Puffer : "UDLHMEntnahmePuffer" // Statische Leerpufferdaten (aus DL)
Dyn : Struct // Dynamische Daten
Status : Struct
Puffer_OUT_leer : Bool // Puffer ist leer
Puffer_OUT_hat Platz : Bool // Puffer hat noch Kapazität
Undef.Trolley_in_Schleuse_OUT : Bool // Undefinierter Trolley in Schleuse unten erkannt
Trolley_fährt_in_Schleuse_OUT : Bool // Trolley fährt in Schleuse (unten)
Trolley_wartet_Auftrag : Bool // Trolley wartet auf Auftrag (unten)
Trolley_wartet_Bereich+1 : Bool // Trolley wartet auf Bereich +1 (unten)
Trolley_fährt_aus_OUT : Bool // Trolley fährt aus (unten)
MindestZeit_ok_OUT : Bool // Schleuse ist MindestZeit geöffnet
Trolley_draussen_Out : Bool // Trolley ist ausgefahren
Trolley_OUT_nicht_in_Schleuse : Bool // Trolley fährt nicht in Schleuse
Leer_Check_OUT : Bool // Leerpuffer wird auf leer gecheckt
Alles_ausfahren : Bool // Alle Trolleys ausfahren
Leerpuffer_initialisieren : Bool // Leerpuffer initialisieren
Error_aktiv : Bool // Störung vorhanden
Reset_aktiv_OUT : Bool // Reset aktiv
TrolleyID_Einfahrt : DInt // Trolley-Nr ist eingefahren
Rueckmld : Struct
RET_VAL_BLKMOV_EntnahmePuffer : Int // Rückmeldung nach BLKMOV-Aufruf
RET_VAL_DL_EntnahmePuffer : Byte // Rückmeldung nach DatenOut-Aufruf
RET_VAL_DL_Res_OUT : Byte // Rückmeldung nach DatenOut-Aufruf
RET_VAL_DL_EntnahmePufferTrolley_IN : Byte // Rückmeldung nach DatenIN-Aufruf
RET_VAL_DL_EntnahmePufferTrolley_OUT : Byte // Rückmeldung nach DatenOut-Aufruf
Error : "UErrHMEntnahmePuffer"
Stau_Zeit : Int // Sensor B_Einfahrt ist belegt [1s]
Stop_Ursache : Word // Stop-Stelle: Nw + Position
Res500 : Array[1..206] of Int
Temp:
Quelle : Any // Zeiger, wo Rein-Daten sind
Ziel : Any // Zeiger, FIFO-Stelle
Ueb_akt : Bool // Überwachungszeit aktivieren
Weiter : Bool // Weiterschaltbedingung ist erfüllt
Warte_neu : Bool // Wartezeit neu triggern
Warte_stop : Bool // Wartezeit stoppen
Inks_Ok : Bool // Starten aufgrund der Inks erlaubt
Puffer_ist_leer : Bool // Leerpuffer zeitlang ohne Sensor
Abruf_Trolley_vorne : Bool // Abruf-Trolley ist in Schleuse
Oberen_Puffer_Freigeben : Bool
GesamtAnzahl : Int
SSDW : Int
Schleife : Word // Loopzähler
Trolley : Int
Position : Int
Constant:
--- NW 1: Parameter-Übergabe ---
L EntnahmePuffer_Nr
L 275 // Einsprung Puffer-DL
T Para.Entnahmepuffer_DL_DB // vor Aufruf übergeben!
L 0
T Para.Entnahmepuffer_DL_DW
--- NW 2: Statische Entnahmepuffer-Parameter holen ---
L Puffer.EntnahmePuffer_Nr // Nummer des EntnahmePuffers
L EntnahmePuffer_Nr // Aufruf-Parameter
==I // Identisch ?
R Dyn.Error.Entnahmepuffer_DL // EntnahmePufferdatenbank fehlerhaft
R Dyn.Error.Undef_Entnahmepuffer // undefiniertes EntnahmePuffer
JC en06 // Ja !
T "MW200" // Search-Daten
CALL FC "DatenOut" (SSDB:=Para.Entnahmepuffer_DL_DB, SSDW:=Para.Entnahmepuffer_DL_DW, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:=Dyn.Rueckmld.RET_VAL_DL_EntnahmePuffer, OUTDATEN:=P#M220.0, Position:="MW196")
JBI G_Ok
A "M199.0"
JCN w060
SET
= Dyn.Error.Entnahmepuffer_DL // EntnahmePufferdatenbank fehlerhaft
L 16#A061
T Dyn.Stop_Ursache
BEU
w060: SET
S Dyn.Error.Undef_Entnahmepuffer // undefinierter EntnahmePuffer
L 16#0062
T Dyn.Stop_Ursache
BEU
// Kennung + Datenbytes
G_Ok: SET
R Dyn.Error.Entnahmepuffer_DL // Gefälledatenbank fehlerhaft
R Dyn.Error.Undef_Entnahmepuffer // undefinierte Gefällestrecke
L 16#1004 // Kennung 10 + Word=04
T LW0 // Any-Kennung, Datentyp
L 20 // Datenwords speichern
T LW2 // Wiederholungen
// Quelle-Pointer erzeugen:
L 0 // Bei Merker = 0 !
T LW4 // DB_Nummer
L 220 // Adresse
SLD 3
L 16#8300_0000 // Kennung: Merker
OD
T LD6 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=Dyn.Rueckmld.RET_VAL_BLKMOV_EntnahmePuffer, DSTBLK:=Puffer) // Datenliste-Daten speichern | #Ziel
L 16#0063
T Dyn.Stop_Ursache
L Dyn.Rueckmld.RET_VAL_BLKMOV_EntnahmePuffer // Rückmeldung
L 0 // Fehler vorhanden ?
<>I // Ja !
= Dyn.Error.Err_BLKMov // Error bei Block kopieren
BEC
L Puffer.Puffer_Typ // Puffertyp = 1278 (EntnahmePuffer)
L 1278 // Dieser Aufruf-FB ?
==I // Ja !
JC w061
SET
S Dyn.Error.Undef_Entnahmepuffer // undefinierter EntnahmePuffer
L 0 // EntnahmePuffer ungültig !
T Puffer.EntnahmePuffer_Nr // Nummer des EntnahmePuffers
L 16#0064
T Dyn.Stop_Ursache
BEU
// Defaultwerte übergeben:
w061: NOP 0
BEU
en06: NOP 0
--- NW 3: Einfahrenden Trolley verarbeiten ---
L Dyn.TrolleyID_Einfahrt
T "MD220"
L DINT#0
==I
JC NoNewT
// Neue Position an Gesamt-Trolley-DL übergeben:
CALL FC "Trolley_DL_Neue_Pos" (Gesamt_Trolley_DL:=Puffer.Gesamt_Trolley_DL, TrolleyID:=Dyn.TrolleyID_Einfahrt, Position:=Puffer.Puffer_Position, ShopGroup:=Dint#0, Err:="M199.0")
NoNewT: NOP 0
--- NW 4: Error: Stau Bereich-Eingang ---
// Sensor bei Bereichs-Einfahrt bleibt belegt?:
AN B_LeerpufferEinfahrt // Sensor Trolley fährt in Bereich (kein Stau !)
R Dyn.Error.Err_Stau_Einfahrt // Stau bei Einfahrt
JC X090 // StauZeit neu aufziehen
AN "1s-Impuls"
O Dyn.Error.Err_Stau_Einfahrt // Zeit bereits abgelaufen
JC Xn09
L Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s]
+ +1
T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s]
L 25 // Stau-Zeit erreicht ?
>=I // Ja !
S Dyn.Error.Err_Stau_Einfahrt // Stau bei Einfahrt (Quittierung oder Sensor=0, wegen Bürstenantrieb
JCN Xn09
X090: L 0 // Zeiten löschen
T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s]
Xn09: NOP 0
--- NW 5: Ende ---
BE
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,873 @@
=== FB 1280: MHMOmniWeiche_Plus [STL] ===
INTERFACE:
Input:
Weichen_Nr : Int // Aufruf für Weiche
ErrQuit : Bool // Ablaufstörung quittieren
Fahren_Ok : Bool // Fahren Ok
B_Ziel_gerade : Bool // Ziel-Sensor gerade
B_Ziel_abzweig : Bool // Ziel-Sensor abzweig
Antrieb_Weiche_aktiv : Bool // Weichen-Antrieb aktiv
Antrieb_Gerade_aktiv : Bool // Gerade-Antrieb aktiv
Antrieb_Abzweig_aktiv : Bool // Abzweig-Antrieb aktiv
Weiche_ist_AST : Bool // Weiche ist auf Arbeitsstellung
Output:
Y_Weiche_gerade : Bool // Weiche auf Gerade schalten
Y_Weiche_abzweig : Bool // Weiche auf Abzweig schalten
Error : Word // Störungen übergeben
InOut:
Antrieb_Weiche_vor : Bool // Weichenantrieb einschalten
Antrieb_Weiche_stop : Bool // Weichenantrieb stoppen
Antrieb_Weiche_gerade_vor : Bool // Weichenantrieb gerade einschalten
Antrieb_Weiche_gerade_stop : Bool // Weichenantrieb gerade stoppen
Antrieb_Weiche_abzweig_vor : Bool // Weichenantrieb abzweig einschalten
Antrieb_Weiche_abzweig_stop : Bool // Weichenantrieb abzweig stoppen
hStOk : Bool // Anzeige Start n. Störung aktivieren
Static:
SAVE : Struct
Schleusen_DB : Int // Schleuse-1-DB
Schleuse-1_DW : Int // Schleuse-1-DW
Res : Array[1..3] of Int // Reserve
Para : Struct // Parameter
Weichen_DL_DB : Int // Einsprung Weichen-Datenliste-DB
Weichen_DL_DW : Int // Einsprung Weichen-Datenliste-DW
Schleusen_DL_DB : Int // Einsprung Schleuse-Datenliste-DB
Schleusen_DL_DW : Int // Einsprung Schleuse-Datenliste-DW
Res1 : Array[1..1] of Int // Reserve
Weiche : "UDLHMOmniWeiche_2fach_Plus" // Fahrbereichs Daten
Dyn : Struct // Dynamische Daten fürs Einfahren
Status : Struct // Status
Weiche_frei : Bool // Rückmeldung: Weiche ist wieder frei
Kein_StartOk : Bool // Input StartOk <>1
Weiche_abzweigen : Bool // Weiche auf Abzweig schalten
Weiche_geradeaus : Bool // Weiche auf Gerade schalten
MindestZeit_ok : Bool // Mindestzeit für Weichendurchfahrt erreicht?
Ziel_erreicht : Bool // Ziel erreicht
Frei06 : Bool
Weiche_aktiv : Bool // Weiche ist aktiv
Auto_akt : Bool
Hand_akt : Bool
Bereich_ok : Bool
MindestZeit_nachtriggern : Bool // Mindestzeit nachtriggern (von Schleuse -1)
Warten_auf_Mindestzeit : Bool // Mindestzeit noch nicht abgelaufen
Res15 : Bool
Error_aktiv : Bool // Störung vorhanden
Reset_aktiv : Bool := TRUE // Reset aktiv
TrolleyID : DInt // Trolley-Nr (Eintrag Schleuse, Austrag Weiche)
Weichen_Ziel : Word // Weichen-Ziel (Eintrag Schleuse, Austrag Weiche)
Schleuse -1 : Int // Schleuse, woher Ziel kam
Zwischen_Ziel : Word // Zwischen-Ziel
HMI : Struct
TrolleyID_Weiche : DInt // Trolley-Nr im Weichenbereich (IN:PLC, OUT:PLC)
WeichenZiel : DInt // Ziel im Weichenbereich (IN:PLC, OUT:PLC)
Weiche_resetten : Bool // Weiche resetten (IN:HMI, Out:PLC)
Rueckmld : Struct
RET_VAL_BLKMOV_Weiche : Int // Rückmeldung nach BLKMOV-Aufruf
RET_VAL_DL_Weichen : Byte // Rückmeldung nach DatenOut-Aufruf
RET_VAL_DL_Schleusen : Byte // Rückmeldung nach DatenOut-Aufruf
Error : "UErrOmniWeiche_2fach"
FahrKontrolle : Struct
Para_Mindestzeit : Int // BM erst nach dieser Zeit im Ziel
Para_Überwachungszeit : Int // BM nach dieser Zeit in Weiche verklemmt
Akt_Mindestzeitzeit : Int // BM erst nach dieser Zeit im Ziel
Akt_Überwachungszeit : Int // BM nach dieser Zeit in Weiche verklemmt
Leer_Zeit : Int // Lager ist frei [1s]
Schalttakte : DInt // Anzahl der getätigten Umschaltungen
Frei200 : Array[1..44] of Int
Temp:
Quelle : Any // Zeiger, wo Rein-Daten sind
Ziel : Any // Zeiger, FIFO-Stelle
Parameter : Word // Parameter
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
AR1Start : DInt // Startwert mit Offset 0
Bereich+1ID : Int
Bereich+1_DB : Int
Keine_Einfahrt : Bool // Keine Einfahrt angemeldet
Err_Bereich+1 : Bool
Weichen_Trolleys : Bool // Weichen-Trolleys vorhanden
ZielSensor_aktiv : Bool
Abzweig_Ziel : Bool
Gerade_Ziel : Bool
Antriebe_ein : Bool
Constant:
--- NW 1: Parameter-Übergabe ---
L Weichen_Nr // Aufruf-Parameter (für Baustein beobachten)
L 279 // Einsprung Weichen-DL
T Para.Weichen_DL_DB // vor Aufruf übergeben!
L 0
T Para.Weichen_DL_DW
L 274 // Einsprung Schleuse-DL
T Para.Schleusen_DL_DB // vor Aufruf übergeben!
L 0
T Para.Schleusen_DL_DW
SET
R ZielSensor_aktiv // Temp
R Weichen_Trolleys
R Antriebe_ein
R Abzweig_Ziel
R Gerade_Ziel
--- NW 2: Gesamt: Out-Bits zum Zurücksetzen ---
L Weichen_Nr
SET
// R #Y_Weiche_gerade //Wegen Reset
// R #Y_Weiche_abzweig //Wegen Reset
SET // Erst mal
R Dyn.Status.Weiche_frei
S Dyn.Status.Weiche_aktiv
--- NW 3: HMI-Zeug ---
// Von HMI:
A Dyn.HMI.Weiche_resetten
R Dyn.HMI.Weiche_resetten // von HMI
S Dyn.Status.Reset_aktiv
JCN HMI1
L 0
T Dyn.Leer_Zeit // da kein Sk
T Dyn.FahrKontrolle.Akt_Mindestzeitzeit
T Dyn.FahrKontrolle."Akt_Überwachungszeit"
SET
R Dyn.Error."Übzeit_Gerade"
R Dyn.Error."Übzeit_Abzweig"
// An HMI:
HMI1: L Dyn.TrolleyID
T Dyn.HMI.TrolleyID_Weiche
L Dyn.Weichen_Ziel
T Dyn.HMI.WeichenZiel
--- NW 4: Störungen nach Außen übergeben ---
L 0
T "MB200"
A Dyn.Error.Weichen_DL // Weichen-Datenliste fehlerhaft
= "M200.0"
A Dyn.Error.Undef_Weiche // undefinierte Weiche
= "M200.1"
A Dyn.Error.BLKMov // Fehler bei Block kopieren
= "M200.2"
A Dyn.Error."Undef_Bereich+1"
= "M200.3"
A Dyn.Error.Frei04
= "M200.4"
A Dyn.Error.Frei05
= "M200.5"
A Dyn.Error.Ziel_undefiniert
= "M200.6"
A Dyn.Error.Err_Schleusen_DL
= "M200.7"
A Dyn.Error."Err_Undef_Schleuse-1"
= "M201.0"
A Dyn.Error."Übzeit_Gerade" // BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen)
= "M201.1"
A Dyn.Error."Übzeit_Abzweig" // BM bei Ausfahrt in Weiche verklemmt (-> Antrieb stoppen)
= "M201.2"
A Dyn.Error.Gerade_Sensor_aktiv
= "M201.3"
A Dyn.Error.Abzweig_Sensor_aktiv
= "M201.4"
A Dyn.Error.Gerade_Bereich_belegt
= "M201.5"
A Dyn.Error.Abzweig_Bereich_belegt
= "M201.6"
A Dyn.Status.Reset_aktiv
= Dyn.Error.Reset_aktiv
= "M201.7"
L "MW200"
T Error // Schnittstelle nach Außen
// Störung vorhanden:
L 0
<>I // Ja !
= Dyn.Status.Error_aktiv
// Anzeige Start n. Störung aktivieren:
A Dyn.Error."Übzeit_Gerade" // BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen)
O Dyn.Error."Übzeit_Abzweig" // BM bei Ausfahrt in Weiche verklemmt (-> Antrieb stoppen)
S hStOk
--- NW 5: Statische Weichen-Parameter holen ---
L Weiche.Weichen_Nr // Nummer der Weiche
L Weichen_Nr // Aufruf-Parameter
==I // Identisch ?
R Dyn.Error.Weichen_DL // Weichendatenbank fehlerhaft
R Dyn.Error.Undef_Weiche // undefinierte Weiche
JC en06_Mig // Ja !
T "MW200" // Search-Daten
CALL FC "DatenOut" (SSDB:=Para.Weichen_DL_DB, SSDW:=Para.Weichen_DL_DW, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196")
L "MB199"
T Dyn.Rueckmld.RET_VAL_DL_Weichen // Rückmeldung bei Datenbank-Zugriff (Gefälle-DL)
JBI G_Ok
A "M199.0"
= Dyn.Error.Weichen_DL // Weichendatenbank fehlerhaft
BEC
SET
S Dyn.Error.Undef_Weiche // undefinierte Weiche
BEU
// Kennung + Datenbytes
G_Ok: SET
R Dyn.Error.Weichen_DL // Weichendatenbank fehlerhaft
R Dyn.Error.Undef_Weiche // undefinierte Weiche
L 16#1004 // Kennung 10 + Word=04
T LW0 // Any-Kennung, Datentyp
L 40 // Datenwords speichern
T LW2 // Wiederholungen
// Quelle-Pointer erzeugen:
L 0 // Bei Merker = 0 !
T LW4 // DB_Nummer
L 220 // Adresse
SLD 3
L 16#8300_0000 // Kennung: Merker
OD
T LD6 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=Dyn.Rueckmld.RET_VAL_BLKMOV_Weiche, DSTBLK:=Weiche) // Datenliste-Daten speichern | #Ziel
L Dyn.Rueckmld.RET_VAL_BLKMOV_Weiche // Rückmeldung
L 0 // Fehler vorhanden ?
<>I // Ja !
= Dyn.Error.BLKMov // Error bei Block kopieren
BEC
L Weiche.Weichen_Typ // Weichentyp = 1280 (HM-Weiche 2fach_Plus)
L 1280 // Dieser Aufruf-FB ?
==I // Ja !
JC en06_Mig
SET
S Dyn.Error.Undef_Weiche // undefinierte Weiche
L 0 // Weiche ungültig !
T Weiche.Weichen_Nr // Nummer der Weiche
BEU
en06_Mig: NOP 0
--- NW 6:
---
AN Dyn.Status.Reset_aktiv
JC En06
SET
S Antrieb_Weiche_vor
S Antrieb_Weiche_gerade_vor // Antrieb gerade einschalten
S Antrieb_Weiche_abzweig_vor // Antrieb abzweig einschalten
AN Antrieb_Weiche_aktiv
ON "1s-Impuls"
JC En06
L Dyn.Leer_Zeit // Zeit für LeerCheck [1s]
+ +1
T Dyn.Leer_Zeit // Zeit für LeerCheck [1s]
L Weiche.Wartezeit_bis_Weiche_leer // Leer-Zeit erreicht ?
<I // Nein !
JC En06
// Dyn.Daten löschen:
SET
R Dyn.Status.Reset_aktiv
R Dyn.Status.Weiche_abzweigen
R Dyn.Status.Weiche_geradeaus
L DINT#0
T Dyn.TrolleyID
L 0
T Dyn.Weichen_Ziel
T Dyn.Zwischen_Ziel
T Dyn."Schleuse -1"
T Dyn.Leer_Zeit
T Dyn.FahrKontrolle.Akt_Mindestzeitzeit
T Dyn.FahrKontrolle."Akt_Überwachungszeit"
T SAVE.Schleusen_DB
T SAVE."Schleuse-1_DW"
// Rückmeldungen löschen:
L 0
T Dyn.Rueckmld.RET_VAL_DL_Weichen
T Dyn.Rueckmld.RET_VAL_BLKMOV_Weiche
T Dyn.Rueckmld.RET_VAL_DL_Schleusen
// Störungen löschen:
SET
R Dyn.Error.Weichen_DL
R Dyn.Error.Undef_Weiche
R Dyn.Error.BLKMov
R Dyn.Error."Undef_Bereich+1"
R Dyn.Error.Frei04
R Dyn.Error.Frei05
R Dyn.Error.Ziel_undefiniert
R Dyn.Error.Err_Schleusen_DL
R Dyn.Error."Err_Undef_Schleuse-1"
R Dyn.Error."Übzeit_Gerade"
R Dyn.Error."Übzeit_Abzweig"
R Dyn.Error.Gerade_Sensor_aktiv
R Dyn.Error.Abzweig_Sensor_aktiv
R Dyn.Error.Gerade_Bereich_belegt
R Dyn.Error.Abzweig_Bereich_belegt
R Dyn.Status.Warten_auf_Mindestzeit
R Dyn.Error.Reset_aktiv // Reset ist aktiv
L 0 // Damit statische Werte neu aus Datenbank geholt werden !
T Weiche.Weichen_Nr // Nummer der Weiche
BEU
En06: NOP 0
--- NW 7: Einsprung Schleuse -1 ermitteln ---
L Dyn."Schleuse -1" // Nr. der Schleuse -1 [In/OUT von Schleuse -1 / Reset]
T "MW200" // Search-Daten
L 0 // angegeben ?
==I // Nein !
= Keine_Einfahrt
JC En08
L SAVE.Schleusen_DB // Weichen-FIFO-DB
L 0 // Einsprung-Zeiger bekannt ?
>I // Ja !
R Dyn.Error.Err_Schleusen_DL // Schleusen-Datenliste fehlerhaft
R Dyn.Error."Err_Undef_Schleuse-1" // undefinierte Schleuse-1
JC En08
CALL FC "DatenOut" (SSDB:=Para.Schleusen_DL_DB, SSDW:=Para.Schleusen_DL_DW, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196")
L "MB199"
T Dyn.Rueckmld.RET_VAL_DL_Schleusen // Rückmeldung bei Datenbank-Zugriff (Weichen-DL)
JBI W_Ok
A "M199.0"
= Dyn.Error.Err_Schleusen_DL // Schleusen-Datenliste fehlerhaft
BEC
SET
S Dyn.Error."Err_Undef_Schleuse-1" // undefinierte Schleuse-1
BEU
W_Ok: L "MW224" // Rein-FIFO-DB
T SAVE.Schleusen_DB // Weichen-FIFO-DB
L 0 // sinnvoller Wert ?
<=I // Nein !
S Dyn.Error."Err_Undef_Schleuse-1" // undefinierte Schleuse-1
BEC
L "MW226" // Schleuse -1
T SAVE."Schleuse-1_DW"
En08: NOP 0
--- NW 8:
---
// Antrieb zusätzlich starten:
A ErrQuit // Überwachungszeit abgelaufen quittieren
S Antrieb_Weiche_vor // Weichenantrieb starten
S Antrieb_Weiche_gerade_vor // Antrieb gerade einschalten
S Antrieb_Weiche_abzweig_vor // Antrieb abzweig einschalten
AN ErrQuit
AN Keine_Einfahrt
JC En08_Mig
// Störungen löschen:
SET
R Dyn.Error.Ziel_undefiniert
R Dyn.Error.Err_Schleusen_DL
R Dyn.Error."Err_Undef_Schleuse-1"
R Dyn.Error."Übzeit_Gerade"
R Dyn.Error."Übzeit_Abzweig"
R Dyn.Error.Gerade_Sensor_aktiv
R Dyn.Error.Abzweig_Sensor_aktiv
R Dyn.Error.Gerade_Bereich_belegt
R Dyn.Error.Abzweig_Bereich_belegt
// Kann nur über Reset zurückgesetzt werden:
// / R #Dyn.Error.Weichen_DL
// / R #Dyn.Error.Undef_Weiche
// / R #Dyn.Error.BLKMov
// / R #Dyn.Error."Undef_Bereich+1"
// / R #Dyn.Error.Frei04
// / R #Dyn.Error.Frei05
// / R #Dyn.Error.Reset_aktiv//Reset ist aktiv
En08_Mig: NOP 0
--- NW 9: Einfahrt angemeldet/reserviert ? ---
A Keine_Einfahrt // Also keine Schleuse -1 aktiv
AN Dyn.Status.Warten_auf_Mindestzeit
O Dyn.Error.Err_Schleusen_DL // Schleusen-Datenliste fehlerhaft
O Dyn.Error."Err_Undef_Schleuse-1" // undefinierte Schleuse-1
JCN Schalt // Negierter Sprung!
// Einsprung löschen:
L 0
T SAVE.Schleusen_DB
T SAVE."Schleuse-1_DW"
// Weichendaten löschen:
L DINT#0
T Dyn.TrolleyID
L 0
T Dyn.Weichen_Ziel
T Dyn.Zwischen_Ziel
T Dyn.FahrKontrolle.Akt_Mindestzeitzeit
T Dyn.FahrKontrolle."Akt_Überwachungszeit"
SET
R Dyn.Status.Kein_StartOk
R Dyn.Status.MindestZeit_ok
R Dyn.Status.Ziel_erreicht
R Dyn.Status.Weiche_geradeaus
R Dyn.Status.Weiche_abzweigen
JU Ret // Weichen-Checkerei überspringen
--- NW 10: Weiche aufgrund vom Weichen-Ziel checken ---
// Ziel-Check für Kontrolle:
Schalt: L Dyn.Weichen_Ziel
L Weiche.Abzweig.Ziel // Abzweig-Ziel?
==I // Ja!
= Abzweig_Ziel
CAC
L Weiche.Gerade.Ziel // Gerade-Ziel?
==I // Ja!
= Gerade_Ziel
// Sind noch Teile im Weichenbereich?:
L SAVE."Schleuse-1_DW"
ITD
T AR1Start // Startwert mit Offset 0
L AR1Start // Startwert mit Offset 0
+ DINT#162
SLD 3
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[SAVE.Schleusen_DB] // FABE+ -DB öffnen
L DBW [AR1Zeiger] // Raus-Trolleys von Schleuse-1 (DBW162)
L 0 // Teile vorhanden?
>I // JA !
= Weichen_Trolleys
// Evtl. Weiche umschalten:
A Weichen_Trolleys // Trolleys im Weichenbereich!
A(
O Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten
O Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten
)
JC en10
A Dyn.Status.MindestZeit_ok
R Dyn.Status.Warten_auf_Mindestzeit
A Dyn.Status.Warten_auf_Mindestzeit
JC en10
A Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten
O Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten
O Dyn.Status.Warten_auf_Mindestzeit
R Dyn.Error.Ziel_undefiniert
R Dyn.Error.Gerade_Sensor_aktiv
R Dyn.Error.Abzweig_Sensor_aktiv
R Dyn.Error.Gerade_Bereich_belegt
R Dyn.Error.Abzweig_Bereich_belegt
JC en10
AN Fahren_Ok
= Dyn.Status.Kein_StartOk
JC Ret
// Ziel-Check zum Schalten:
L Dyn.Weichen_Ziel
L 0
==I
S Dyn.Error.Ziel_undefiniert
JC New
CAC
L Weiche.Abzweig.Ziel // Abzweig-Ziel?
==I // Ja!
JC Abzweigen
CAC
L Weiche.Gerade.Ziel // Gerade-Ziel?
==I // Ja!
JC Gerade
SET
S Dyn.Error.Ziel_undefiniert
JU New
Gerade: NOP 0
// Gerade-Fahrt gewünscht**************************************************
// Ziel-Sensor-Check:
A B_Ziel_gerade
= Dyn.Error.Gerade_Sensor_aktiv
A Dyn.Error.Gerade_Sensor_aktiv // Muss erst quittiert werden!
JC New
// Trolley geradeaus fahren:
SET
S Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten
R Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten
S Dyn.Status.Warten_auf_Mindestzeit
// Zeiten speichern:
L Weiche.Gerade.Mindestzeit // Nach dieser Zeit kann Trolley erst aus Weiche sein
T Dyn.FahrKontrolle.Para_Mindestzeit
L Weiche.Gerade."Überwachungszeit" // Nach dieser Zeit muss Trolley Zielbereich erreicht haben
T Dyn.FahrKontrolle."Para_Überwachungszeit"
JU en10
Abzweigen: NOP 0
// Abzweig-Fahrt gewünscht**************************************************
// Ziel-Sensor-Check:
A B_Ziel_abzweig
= Dyn.Error.Abzweig_Sensor_aktiv
A Dyn.Error.Abzweig_Sensor_aktiv // Muss erst quittiert werden!
JC New
// Trolly abzweigen fahren:
SET
S Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten
R Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten
S Dyn.Status.Warten_auf_Mindestzeit
// Zeiten speichern:
L Weiche.Abzweig.Mindestzeit // Nach dieser Zeit kann Trolley erst aus Weiche sein
T Dyn.FahrKontrolle.Para_Mindestzeit
L Weiche.Abzweig."Überwachungszeit" // Nach dieser Zeit muss Trolley Zielbereich erreicht haben
T Dyn.FahrKontrolle."Para_Überwachungszeit"
JU en10
New: AN ErrQuit
JC en10
L 0 // Reservierung löschen
T Dyn."Schleuse -1"
en10: NOP 0
--- NW 11: Mindestzeit / Überwachungszeit ---
A Gerade_Ziel
A(
ON Y_Weiche_gerade
ON Antrieb_Gerade_aktiv
)
O
A Abzweig_Ziel
A(
ON Y_Weiche_abzweig
ON Antrieb_Abzweig_aktiv
)
JC W011
// Mindestzeit neu triggern: (von Schleuse -1)
A Dyn.Status.MindestZeit_nachtriggern
R Dyn.Status.MindestZeit_nachtriggern
S Dyn.Status.Warten_auf_Mindestzeit
JCN X011 // Negierter Sprung
W011: L 0
T Dyn.FahrKontrolle.Akt_Mindestzeitzeit
JU y011
// Zeiten aufaddieren:
X011: AN "1s-Impuls" // 1s-Impuls
ON Antrieb_Weiche_aktiv
JC X08E
L Dyn.FahrKontrolle.Akt_Mindestzeitzeit
+ 1
T Dyn.FahrKontrolle.Akt_Mindestzeitzeit
y011: L Dyn.FahrKontrolle.Akt_Mindestzeitzeit
L Dyn.FahrKontrolle.Para_Mindestzeit
>=I
= Dyn.Status.MindestZeit_ok
JCN X080
T Dyn.FahrKontrolle.Akt_Mindestzeitzeit
X080: A Dyn.Error."Übzeit_Gerade"
O Dyn.Error."Übzeit_Abzweig"
ON "1s-Impuls" // 1s-Impuls
ON Antrieb_Weiche_aktiv
JC X08E
L Dyn.FahrKontrolle."Akt_Überwachungszeit"
+ 1
T Dyn.FahrKontrolle."Akt_Überwachungszeit"
L Dyn.FahrKontrolle."Para_Überwachungszeit"
<I // Max.Zeit erreicht ?
JC X08E // Nein
// Überwachungszeit ist abgelaufen:
A Dyn.Status.Weiche_geradeaus
S Dyn.Error."Übzeit_Gerade"
A Dyn.Status.Weiche_abzweigen
S Dyn.Error."Übzeit_Abzweig"
L 0 // Zeiten neu initialisieren
T Dyn.FahrKontrolle."Akt_Überwachungszeit"
X08E: NOP 0
--- NW 12: Ziel ist erreicht ---
A Dyn.Status.Weiche_geradeaus
A B_Ziel_gerade
S ZielSensor_aktiv
R Dyn.Error."Übzeit_Gerade"
A Dyn.Status.Weiche_abzweigen
A B_Ziel_abzweig
S ZielSensor_aktiv
R Dyn.Error."Übzeit_Abzweig"
JC Ziel_AOk
JU X09E
Ziel_AOk: A Dyn.Status.Ziel_erreicht // Einmaliger Durchlauf
JC X09E
SET
S Dyn.Status.Ziel_erreicht
L Dyn.Schalttakte
+ DINT#1 // Auf Abzweig umgeschaltet +1
T Dyn.Schalttakte
X09E: A ZielSensor_aktiv
O Dyn.Status.Reset_aktiv
JCN En12 // Negierter Sprung
L 0 // Zeiten neu initialisieren
T Dyn.FahrKontrolle."Akt_Überwachungszeit"
SET
R Dyn.Error."Übzeit_Gerade"
R Dyn.Error."Übzeit_Abzweig"
En12: NOP 0
--- NW 13: RET: Weiche schalten ---
Ret: A Dyn.Status.Reset_aktiv
O Weichen_Trolleys
JC En13
A Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten
R Dyn.Status.Weiche_abzweigen // Gerade hätte Vorrang
S Y_Weiche_gerade // nicht mit =, damit Weichenstellung erst bei Änderung schaltet!
R Y_Weiche_abzweig
A Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten
S Y_Weiche_abzweig
R Y_Weiche_gerade // nicht mit =, damit Weichenstellung erst bei Änderung schaltet!
En13: NOP 0
--- NW 14: Antriebe ansteuern / stoppen ? ---
A Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten
O Dyn.Status.Weiche_abzweigen // Gerade hätte Vorrang
ON Keine_Einfahrt // Also ist Schleuse -1 aktiv
O Weichen_Trolleys
= Antriebe_ein
A Antriebe_ein
O Dyn.Status.Reset_aktiv
S Antrieb_Weiche_vor // Weichenantrieb starten
A Antriebe_ein
A Dyn.Status.Weiche_geradeaus
O Dyn.Status.Reset_aktiv
S Antrieb_Weiche_gerade_vor // Antrieb gerade einschalten
A Antriebe_ein
A Dyn.Status.Weiche_abzweigen
O Dyn.Status.Reset_aktiv
S Antrieb_Weiche_abzweig_vor // Antrieb abzweig einschalten
// Antriebe stoppen
AN Dyn.Status.Reset_aktiv
A(
AN Keine_Einfahrt // Also ist Schleuse -1 aktiv
A(
AN Fahren_Ok
O
A Dyn.Status.Weiche_abzweigen
A(
ON Weiche_ist_AST
ON Antrieb_Abzweig_aktiv
)
O
A Dyn.Status.Weiche_geradeaus
A(
O Weiche_ist_AST
ON Antrieb_Gerade_aktiv
)
)
ON Dyn.Status.Auto_akt // SystemVoraussetzungen fehlen
O Dyn.Status.Hand_akt
ON Dyn.Status.Bereich_ok
)
S Antrieb_Weiche_stop // Alle Antriebe stoppen
SET // //
R Antrieb_Weiche_stop // Alle Antriebe stoppen////
--- NW 15: Weiche ist frei ---
L SAVE.Schleusen_DB // Alte Speicherung ?
L SAVE."Schleuse-1_DW"
OW
L Dyn.Weichen_Ziel
OW
L 0
==I
A Keine_Einfahrt // Keine Einfahrt aktiv
AN Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten
AN Dyn.Status.Weiche_abzweigen // Gerade hätte Vorrang
AN Dyn.Status.Warten_auf_Mindestzeit
AN Dyn.Status.Reset_aktiv
= Dyn.Status.Weiche_frei
R Dyn.Status.MindestZeit_nachtriggern
NEG
= Dyn.Status.Weiche_aktiv // Zum Abfragen, damit evtl. Förderer nicht ausgeschaltet wird
--- NW 16: Schleuse -1 aktiv / vorhanden ? ---
A Keine_Einfahrt
O Dyn.Error.Err_Schleusen_DL // Schleusen-Datenliste fehlerhaft
O Dyn.Error."Err_Undef_Schleuse-1" // undefinierte Schleuse-1
BEC
L SAVE.Schleusen_DB // Schleusen-DB
L 0 // Einsprung-Zeiger bekannt ?
<=I // Nein !
BEC
// Anmeldung an diese Weiche von Schleuse -1 noch aktiv?:
L SAVE."Schleuse-1_DW"
ITD
T AR1Start // Startwert mit Offset 0
L AR1Start // Startwert mit Offset 0
+ DINT#16
SLD 3
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[SAVE.Schleusen_DB] // FABE+ -DB öffnen
L DBW [AR1Zeiger] // Anmeldung von dieser Schleuse (DBW16)
L Weichen_Nr
==I // Ja !
O Dyn.Status.Warten_auf_Mindestzeit
JC Mldg
L 0 // Reservierung löschen
T Dyn."Schleuse -1"
BEU
--- NW 17: Meldung an Schleuse -1: Weiche hat geschaltet ---
Mldg: L AR1Start // Startwert mit Offset 0
+ DINT#71
SLD 3
L 4 // Damit DBX71.4
OD
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[SAVE.Schleusen_DB] // FABE+ -DB öffnen
A(
A Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten
A Gerade_Ziel
A Y_Weiche_gerade
A Antrieb_Gerade_aktiv
O
A Dyn.Status.Weiche_abzweigen // Gerade hätte Vorrang
A Abzweig_Ziel
A Y_Weiche_abzweig
A Antrieb_Abzweig_aktiv
)
A Fahren_Ok
A Antrieb_Weiche_aktiv // Antrieb aktiv
AN Dyn.Status.Reset_aktiv
= DBX [AR1Zeiger] // Weiche hat geschaltet ? (DBX71.4)
--- NW 18: Meldung an Schleuse -1: Aktuell aktives Ziel ---
// Rückmeldung an Schleuse -1 (Weichenziel):
L AR1Start // Startwert mit Offset 0
+ DINT#166
SLD 3
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[SAVE.Schleusen_DB] // FABE+ -DB öffnen
L Dyn.Weichen_Ziel
T DBW [AR1Zeiger] // Zurückgemeldetes WeichenZiel (DBW166)
--- NW 19: Meldung an Schleuse -1: Trolley hat Ziel erreicht ---
L AR1Start // Startwert mit Offset 0
+ DINT#71
SLD 3
L 5 // Damit DBX71.5
OD
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[SAVE.Schleusen_DB] // FABE+ -DB öffnen
A ZielSensor_aktiv
O Dyn.Status.Reset_aktiv
= DBX [AR1Zeiger] // Trolley ausserhalb Weiche (DBX71.5)
--- NW 20: Ende ---
BE
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,91 @@
=== FB 183: MHMÜbergang_ohne_Schleuse [STL] ===
INTERFACE:
Input:
ErrQuit : Bool
B_Anfang : Bool
B_Am_Übergang : Bool
B_Stau_Antrieb_plus : Bool
Antrieb_aktiv : Bool
Antrieb_plus_aktiv : Bool
Output:
InOut:
Antrieb_vor : Bool
Antrieb_start : Bool
Antrieb_stop : Bool
Antrieb_plus_vor : Bool
Antrieb_plus_start : Bool
Static:
Am_Übergang : "MSensoren"
Stau_Antrieb_plus : "MSensoren"
Temp:
Antrieb : Bool
Antrieb_gestoppt : Bool
Constant:
--- NW 1: Antrieb ansteuern ---
SET
R Antrieb_gestoppt // Falls bei Aufruf nicht gestoppt wird!
// Antrieb starten:
A ErrQuit
O B_Anfang
S Antrieb_start
S Antrieb_vor
// Trolley am Übergang:
AN "Am_Übergang".Stat.B_Akt
JC Nix
// Antrieb stoppen:
A Stau_Antrieb_plus.Stat.B_Akt
S Antrieb_stop // Trolley stoppen
S Antrieb_gestoppt // Falls bei Aufruf nicht gestoppt wird!
JC Nix
AN Stau_Antrieb_plus.Stat.B_Akt
S Antrieb_plus_vor // Antrieb plus einschalten
SET
S Antrieb_plus_start // Antrieb plus zeitlang starten
AN Antrieb_plus_aktiv
S Antrieb_stop // Trolley stoppen
S Antrieb_gestoppt // Falls bei Aufruf nicht gestoppt wird!
JC Nix
// Antrieb einschalten:
SET
S Antrieb_vor // Trolley weiterfahren
Nix: NOP 0
--- NW 2: Antrieb plus zusätzlich ansteuern ---
// Antrieb plus starten:
A B_Stau_Antrieb_plus // Sensor
O ErrQuit
S Antrieb_plus_start // Antrieb plus zeitlang starten
// Antrieb plus einschalten:
A B_Stau_Antrieb_plus
AN Stau_Antrieb_plus.Stat.B_Akt
CLR // Nicht mehr!
S Antrieb_plus_vor // Antrieb plus einschalten
--- NW 3: Trolley ist am Übergang ---
A Antrieb_aktiv
A Antrieb_plus_aktiv
AN Antrieb_gestoppt // Falls bei Aufruf nicht gestoppt wird!
= Antrieb
CALL FB "None" , (ESensor:="B_Am_Übergang", T_Ein:=1, T_Aus:=50, tein_aktiv:=1, taus_aktiv:=Antrieb)
--- NW 4: Stau im Förderer plus ---
CALL FB "None" , (ESensor:=B_Stau_Antrieb_plus, T_Ein:=100, T_Aus:=50, tein_aktiv:=1, taus_aktiv:=1)
--- NW 5: Ende ---
BE
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,122 @@
=== FB 100: MImpulsGeber [STL] ===
INTERFACE:
Input:
Ink_DB : Int // DB-Nr des Inkremental-Gebers (Zählerbaugruppe) Neu-Sync-Zähler
B_Zaehlen : Bool // Sensor zum Zählen
Antrieb_aktiv : Bool // Antrieb ist aktiv
Quit : Bool
Zeit_Signal_zu_lang : Time := T#350ms
Zeit_Kein_Signal : Time := T#500ms
Output:
Signal : Bool // Falls kein InkDB
InOut:
Err_Kein_Signal : Bool // Kein_Signal bei laufenden Antrieb
Err_Signal_zu_lang : Bool // Signal bei laufenden Antrieb zu lang
Static:
Sensor_entprellen : Bool
Timer_1 : TON_TIME
Timer_2 : TON_TIME
Timer_3 : TON_TIME
Temp:
Constant:
--- NW 1: Initialisierung ---
SET
R Signal
--- NW 2: Störungen ---
// Störung quittieren:
A Quit
R Err_Signal_zu_lang
R Err_Kein_Signal
// Signal zu lang:
A B_Zaehlen // Sensor zum Zählen
A Antrieb_aktiv // Antrieb ist aktiv
AN Quit
= "M200.0"
CALL SYS "TON" (IN:="M200.0", PT:=Zeit_Signal_zu_lang, Q:=?, ET:=?)
A Timer_2.Q
S Err_Signal_zu_lang
// Kein Signal:
AN B_Zaehlen // Sensor zum Zählen
A Antrieb_aktiv // Antrieb ist aktiv
AN Quit
= "M200.0"
CALL SYS "TON" (IN:="M200.0", PT:=Zeit_Kein_Signal, Q:=?, ET:=?)
A Timer_3.Q
S Err_Kein_Signal
--- NW 3: Zählen über Sensor ---
AN B_Zaehlen // Sensor zum Zählen
A Sensor_entprellen // Sperre Auswertung schon erfolgt
A Antrieb_aktiv // Antrieb ist aktiv
= "M200.0"
CALL SYS "TON" (IN:="M200.0", PT:=t#50ms, Q:=?, ET:=?)
A Timer_1.Q
R Sensor_entprellen // Sperre Auswertung schon erfolgt
AN B_Zaehlen // Sensor zum Zählen
O Sensor_entprellen
BEC
SET
S Sensor_entprellen // Sperre Auswertung schon erfolgt
S Signal // Für Signal-Auswertung ohne InkDB
--- NW 4: Übergabe an Inkrement-Baustein / max.Wert erreicht? ---
L Ink_DB
T "MW200"
L 0 // Sinnvolle Angabe?
<=I // Nein!
BEC // Also nur Signal-Auswertung !
OPN DB["MW200"] // Zähler-DB öffnen
L DBD80
+ DINT#1 // Aktueller Zählerwert +1
T DBD80
L DBD80 // Aktueller Zählerwert
L DBD76 // Max. Wert erreicht ?
<=D // Nein !
R DBX74.5 // Ohne Flag-Lauf wurde beendet
R DBX74.4 // Flag-Lauf wurde beendet
BEC
-D // Restwert als Startwert nehmen !
T DBD80 // Keine Inkrementalgeber verbaut, sondern nur Sensor
AN DBX74.3 // Umschaltung Zähl-Lauf ohne-mit-ohne Flag
= DBX74.5 // Ohne Flag-Lauf wurde beendet
A DBX74.3 // Umschaltung Zähl-Lauf ohne-mit-ohne Flag
= DBX74.4 // Flag-Lauf wurde beendet
AN DBX74.3 // Umschaltung Zähl-Lauf ohne-mit-ohne Flag
= DBX74.3
// Zähler auf 000 setzen ?:
AN DBX74.6 // Zähler Zero-Load
BEC
SET
R DBX74.6
L 0
T DBD80 // Zählerwert zum Setzen
--- NW 5: Ende ---
BE
@@ -0,0 +1,87 @@
=== FB 91: MSensoren [STL] ===
INTERFACE:
Input:
ESensor : Bool // Eingang des zu überwachenden Sensors
T_Ein : Int := 1 // Einschaltzeitverzögerung (*100ms)
T_Aus : Int := 5 // Ausschaltzeitverzögerung (*100ms)
tein_aktiv : Bool := TRUE // Einschaltzeit aktivieren
taus_aktiv : Bool := TRUE // Ausschaltzeit aktivieren
Output:
InOut:
Static:
Stat : "USensor_Ein_Aus" // Status des Endschalters
Temp:
Constant:
--- NW 1: Zeitwert löschen ---
A ESensor
A Stat.B_Akt
O
AN ESensor
AN Stat.B_Akt
JCN Nw02
tdel: L 0 // Zeitwert löschen
T Stat.T_Zelle
BEU
--- NW 2: Einschaltzeit abgelaufen ? ---
Nw02: L Stat.T_Ein_Akt // Gewollter Zeitwert
L 9999 // angegeben ?
<>I // Ja !
JC w020
L T_Ein // Sollwert übergeben
T Stat.T_Ein_Akt // Gewollter Zeitwert
w020: A Stat.B_Akt
JC Nw03
L Stat.T_Zelle // Aktueller Zeitwert
L Stat.T_Ein_Akt // Gewollter Zeitwert erreicht ?
>=I
S Stat.B_Akt // Sensor ist nach Einschaltzeit aktiv
JC tdel // Zeit löschen
JU Nw04
--- NW 3: Ausschaltzeit abgelaufen ? ---
Nw03: L Stat.T_Aus_Akt // Gewollter Zeitwert
L 9999 // angegeben ?
<>I // Ja !
JC w030
L T_Aus // Sollwert übergeben
T Stat.T_Aus_Akt // Gewollter Zeitwert
w030: AN Stat.B_Akt
JC Nw04
L Stat.T_Zelle // Aktueller Zeitwert
L Stat.T_Aus_Akt // Gewollter Zeitwert erreicht ?
>=I
R Stat.B_Akt // Sensor ist nach Ausschaltzeit nicht mehr aktiv
JC tdel // Zeit löschen
--- NW 4: Zeit läuft ---
Nw04: AN "100ms-Impuls" // nur als Impuls
O
AN Stat.B_Akt // Einschaltzeit läuft
AN tein_aktiv // aber Zeit einfrieren
O
A Stat.B_Akt // Ausschaltzeit läuft
AN taus_aktiv // aber Zeit einfrieren
BEC
L Stat.T_Zelle
L "MW2"
+I
T Stat.T_Zelle
--- NW 5: Ende ---
BE
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,574 @@
=== FB 180: MSorter_Uebergabe [STL] ===
INTERFACE:
Input:
Uebergabe_Nr : Int // Aufruf für Übergabe
KorrekturFaktor : Real // Korrektur-Faktor wegen Kettenlängung
ErrQuit : Bool // Ablaufstörung quittieren
Antrieb_aktiv : Bool // Kreisel-Antrieb aktiv
Output:
Error : Word // Störungen übergeben
InOut:
Antrieb_start : Bool // Kreiselantrieb starten
Antrieb_stoppen : Bool // Kreiselantrieb stoppen
hStOk : Bool // Anzeige Start n. Störung aktivieren
Static:
SAVE : Struct
Last_Sort_ID : Int
Res : Array[1..3] of Int // Reserve
Para : Struct // Parameter
Uebergabe_DL_DB : Int // Einsprung Weichen-Datenliste-DB
Uebergabe_DL_DW : Int // Einsprung Weichen-Datenliste-DW
Res1 : Array[1..3] of Int // Reserve
Uebergabe : "UDLUebergabe" // Fahrbereichs Daten
Dyn : Struct // Dynamische Daten fürs Einfahren
Status : Struct // Status
BT_Daten_vorhanden : Bool // Daten für Travel-FIFO vorhanden
Reset : Bool := TRUE // Reset Einfahrseite starten
Rueckmld : Struct
RET_VAL_BLKMOV_Uebergabe : Int // Rückmeldung nach BLKMOV-Aufruf
RET_VAL_DL_Weichen : Byte // Rückmeldung nach DatenOut-Aufruf
RET_VAL_Sortliste_Out : Byte // Rückmeldung nach Sortdaten-Out-Aufruf
RET_VAL_TravelFIFO_In : Byte // Rückmeldung nach Travel-FIFO-In-Aufruf
RET_VAL_SendFIFO : Byte // Rückmeldung nach SendPC_FIFO-Aufruf
Error : "UErrUebergabe"
Ink_Wert : DInt // Aktueller Inkrementalwert
Max_Wert : DInt // Maximal erlaubter Zählwert
Lauf_Flag : Bool // Zähl-Lauf mit Flag ist aktiv
Flag_Lauf_fertig : Bool // Flag-Lauf wurde beendet
Ohne_Lauf_fertig : Bool // Ohne Flag-Lauf wurde beendet
Hauptstrang_Flag : Bool // Flag zum Weiche schalten (vom Hauptstrang)
FIFO_Flag : Bool // Flag zum Weiche schalten (von Rein-FIFO)
Save_Flag : Bool // Flag zum Daten in Sortliste speichern
Last_Flag : Bool // Flag des letzten durchfahrenden Teils
Hauptstrang_Ink : DInt // Inkremente zum Weiche schalten (vom Hauptstrang)
Hauptstrang_Sortliste : Int // Sortliste aus welcher Hauptstrangdaten sind
Hauptstrang_Search_Ink : DInt // Inkremente zum Daten auslesen (Start-Ink)
Hauptstrang_Pos : Int // Aktuelle Position der Daten in Datenliste
Last_Ink : DInt // Inkremente des letzten durchfahrenden Teils
Last_IDX : DInt := -1 // IDX des letzten durchfahrenden Teils
Last_Ziel : Int := -1 // Ziel des letzten durchfahrenden Teils
Save_Ink : DInt // Inkremente zum Daten in Sortliste speichern
Res1 : Array[1..6] of Int // Reserve
Daten : "UBT_Daten"
Temp:
Quelle : Any // Zeiger, wo Rein-Daten sind
Ziel : Any // Zeiger, FIFO-Stelle
Del : Bool // Nur Sortdaten löschen
FC86_Para : Word // Parameter-Übergabe
Hauptstrang_Ink : DInt // Inkremente zum Weiche schalten (vom Hauptstrang)
Parameter : Word // Parameter
Freigabe : Int
DatenDB : Int // DB öffnen
Constant:
--- NW 1: Parameter-Übergabe ---
L Uebergabe_Nr // Aufruf-Parameter (für Baustein beobachten)
L "MW178" // Einsprung Übergabe-DL
T Para.Uebergabe_DL_DB
L 0
T Para.Uebergabe_DL_DW
--- NW 2: Gesamt: Out-Bits zum Zurücksetzen ---
SET
--- NW 3:
---
AN Dyn.Status.Reset
JC En06
// Dyn.Daten löschen:
SET
R Dyn.Status.Reset
R Dyn.Hauptstrang_Flag
R Dyn.FIFO_Flag
R Dyn.Save_Flag
R Dyn.Last_Flag
L 0
T Dyn.Hauptstrang_Ink
T Dyn.Hauptstrang_Search_Ink
T Dyn.Last_Ink
T Dyn.Save_Ink
L 0
T Dyn.Hauptstrang_Sortliste
T Dyn.Last_IDX
T Dyn.Last_Ziel
// Rückmeldungen löschen:
L 0
T Dyn.Rueckmld.RET_VAL_TravelFIFO_In
// Störungen löschen:
SET
R Dyn.Error.Uebergabe_DL
R Dyn.Error.Undef_Uebergabe
R Dyn.Error.BLKMov
R Dyn.Error.Haupstrang_DL
R Dyn.Error.Keine_HSDaten
R Dyn.Error.Travel_FIFO_ERR
R Dyn.Error.Travel_FIFO_voll
R Dyn.Error.Frei07
R Dyn.Error.Frei10
R Dyn.Error.Frei11
R Dyn.Error.Frei12
R Dyn.Error.Frei13
R Dyn.Error.Frei14
R Dyn.Error.Send_FIFO_fehlerhaft
R Dyn.Error.Send_FIFO_voll
R Dyn.Error.Reset_aktiv // Reset ist aktiv
L 0 // Damit statische Werte neu aus Datenbank geholt werden !
T Uebergabe.Uebergabe_Nr // Nummer der Übergabe
BEU
En06: NOP 0
--- NW 4: Störungen nach Außen übergeben ---
L 0
T "MW200"
A Dyn.Error.Uebergabe_DL // Weichen-Datenliste fehlerhaft
= "M200.0"
A Dyn.Error.Undef_Uebergabe // undefinierte Weiche
= "M200.1"
A Dyn.Error.BLKMov // Fehler bei Block kopieren
= "M200.2"
A Dyn.Error.Haupstrang_DL // Haupstrang-Datenliste fehlerhaft
= "M200.3"
A Dyn.Error.Keine_HSDaten // Keine Hauptstrang-Daten mehr vorhanden
= "M200.4"
A Dyn.Error.Travel_FIFO_ERR // Rein-FIFO fehlerhaft
= "M200.5"
A Dyn.Error.Travel_FIFO_voll // Keine Rein-Daten mehr vorhanden
= "M200.6"
A Dyn.Error.Frei07
= "M200.7"
A Dyn.Error.Frei10
= "M201.0"
A Dyn.Error.Frei11
= "M201.1"
A Dyn.Error.Frei12
= "M201.2"
A Dyn.Error.Frei13
= "M201.3"
A Dyn.Error.Frei14
= "M201.4"
A Dyn.Error.Send_FIFO_fehlerhaft
= "M201.5"
A Dyn.Error.Send_FIFO_voll
= "M201.5"
CLR // Reset ist aktiv (gibts nicht!)
= Dyn.Error.Reset_aktiv
= "M201.7"
L "MW200"
T Error // Schnittstelle nach Außen
// Antrieb stoppen:
A(
O Dyn.Error.Travel_FIFO_ERR // Daten-Übergabe fand nicht statt -> Antrieb stoppen)
O Dyn.Error.Travel_FIFO_voll // Daten-Übergabe fand nicht statt -> Antrieb stoppen)
)
AN ErrQuit
S Antrieb_stoppen // Kreiselantrieb stoppen
// Anzeige Start n. Störung aktivieren:
A Dyn.Error.Travel_FIFO_ERR // Daten-Übergabe fand nicht statt -> Antrieb stoppen)
O Dyn.Error.Travel_FIFO_voll // Daten-Übergabe fand nicht statt -> Antrieb stoppen)
S hStOk
--- NW 5: Statische Übergabe-Parameter holen ---
L Uebergabe.Uebergabe_Nr // Nummer der Übergabe
L Uebergabe_Nr // Aufruf-Parameter
==I // Identisch ?
R Dyn.Error.Uebergabe_DL // Weichendatenbank fehlerhaft
R Dyn.Error.Undef_Uebergabe // undefinierte Weiche
JC en06_Mig // Ja !
T "MW200" // Search-Daten
CALL FC "DatenOut" (SSDB:=Para.Uebergabe_DL_DB, SSDW:=Para.Uebergabe_DL_DW, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196")
L "MB199"
T Dyn.Rueckmld.RET_VAL_DL_Weichen // Rückmeldung bei Datenbank-Zugriff (Gefälle-DL)
JBI G_Ok
A "M199.0"
= Dyn.Error.Uebergabe_DL // Weichendatenbank fehlerhaft
BEC
SET
S Dyn.Error.Undef_Uebergabe // undefinierte Weiche
BEU
// Kennung + Datenbytes
G_Ok: SET
R Dyn.Error.Uebergabe_DL // Weichendatenbank fehlerhaft
R Dyn.Error.Undef_Uebergabe // undefinierte Weiche
L 16#1004 // Kennung 10 + Word=04
T LW0 // Any-Kennung, Datentyp
L 40 // Datenwords speichern
T LW2 // Wiederholungen
// Quelle-Pointer erzeugen:
L 0 // Bei Merker = 0 !
T LW4 // DB_Nummer
L 220 // Adresse
SLD 3
L 16#8300_0000 // Kennung: Merker
OD
T LD6 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=Dyn.Rueckmld.RET_VAL_BLKMOV_Uebergabe, DSTBLK:=Uebergabe) // Datenliste-Daten speichern | #Ziel
L Dyn.Rueckmld.RET_VAL_BLKMOV_Uebergabe // Rückmeldung
L 0 // Fehler vorhanden ?
<>I // Ja !
= Dyn.Error.BLKMov // Error bei Block kopieren
BEC
L Uebergabe.Uebergabe_Typ // Übergabentyp = 180 (Übergabe)
L 180 // Dieser Aufruf-FB ?
==I // Ja !
JC en06_Mig
SET
S Dyn.Error.Undef_Uebergabe // undefinierte Weiche
L 0 // Übergabe ungültig !
T Uebergabe.Uebergabe_Nr // Nummer der Übergabe
BEU
en06_Mig: NOP 0
--- NW 6: Daten des Inkremental-Gebers holen / Zeit-Inkremente ---
L Uebergabe.Ink_DB // DB-Nr des Inkremental-Geber
L 0 // angegeben ?
<=I // Nein !
JC w040
CAC
T "MW200"
OPN DB["MW200"] // Zähler-DB öffnen
L DBD80
T Dyn.Ink_Wert
L DBD76
T Dyn.Max_Wert
A DBX74.3
= Dyn.Lauf_Flag
A DBX74.4
= Dyn.Flag_Lauf_fertig
A DBX74.5
= Dyn.Ohne_Lauf_fertig
JU en04
// Zeit-Inkremente erzeugen:
w040: AN Antrieb_aktiv
JC w041
L "MW4" // 10ms-Takte
ITD
L Dyn.Ink_Wert
+D // Aktueller Zählerwert +100ms-Takte
T Dyn.Ink_Wert
w041: L 10000 // Festwert: 10000 (100s)
T Dyn.Max_Wert
L Dyn.Ink_Wert // Aktueller Zählerwert
L Dyn.Max_Wert // Max. Wert erreicht ?
<=D // Nein !
R Dyn.Ohne_Lauf_fertig // Ohne Flag-Lauf wurde beendet
R Dyn.Flag_Lauf_fertig // Flag-Lauf wurde beendet
JC en04
-D // Restwert als Startwert nehmen !
T Dyn.Ink_Wert
AN Dyn.Lauf_Flag // Umschaltung Zähl-Lauf ohne-mit-ohne Flag
= Dyn.Ohne_Lauf_fertig // Ohne Flag-Lauf wurde beendet
A Dyn.Lauf_Flag // Umschaltung Zähl-Lauf ohne-mit-ohne Flag
= Dyn.Flag_Lauf_fertig // Flag-Lauf wurde beendet
AN Dyn.Lauf_Flag // Umschaltung Zähl-Lauf ohne-mit-ohne Flag
= Dyn.Lauf_Flag
en04: NOP 0
--- NW 7:
---
AN ErrQuit
// / CLR ///09.09.18, da Störung ohnehin nicht behebbar
JC En07 // /Am 21.12.18 aufgrund vom Kundenwunsch wieder wie früher
SET
R Dyn.Status.Reset
// Störungen löschen:
SET
R Dyn.Error.Keine_HSDaten
R Dyn.Error.Travel_FIFO_ERR
R Dyn.Error.Travel_FIFO_voll
En07: NOP 0
--- NW 8: Übergabepunkt aufgrund von Hauptstrangdaten suchen ---
L Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang)
L 0 // schon bekannt ?
>D // Ja !
JC Nw09
L Uebergabe.Hauptstrang_DL_DB // Sortlisten-DB für diese Weiche (Hauptstrang)
L 0 // Sinnvolle Angabe ?
<=I // Nein !
O(
L Uebergabe.Hauptstrang_DL_DW // Sortlisten-DW für diese Weiche (Hauptstrang)
L 0 // Sinnvolle Angabe ?
<I // Nein !
)
JC w076
// Nach neuen Daten suchen:
AN "Weiche_NewData" // Im Weichenbereich nach neuen Daten suchen
JC w076
L Dyn.Ink_Wert // Aktueller Inkrementalwert
L Uebergabe.Off_Ink // Inkremente zum Weiche schalten
>D // Gleiches Flag/Flag wie Inkgeber zum Suchen
JC w071
// Anders Flag/Liste wie Inkgeber zum Suchen:
L Uebergabe.Hauptstrang_DL_DB
A Dyn.Lauf_Flag // Inkgeber schon mit Lauf-Flag
JC w070
+ 1
w070: T Dyn.Hauptstrang_Sortliste // Sortliste aus welcher Hauptstrangdaten sind
JU w073
// Gleiches Flag/Liste wie Inkgeber zum Suchen:
w071: L Uebergabe.Hauptstrang_DL_DB
AN Dyn.Lauf_Flag // Inkgebeer ohne Lauf-Flag
JC w072
+ 1
w072: T Dyn.Hauptstrang_Sortliste // Sortliste aus welcher Hauptstrangdaten sind
// Hauptstrang Sortliste nach Position -1 durchsuchen:
w073: CALL FC "DatenFindOffsetSort" (SSDB:=Dyn.Hauptstrang_Sortliste, SSDW:=Uebergabe.Hauptstrang_DL_DW, PARA:=WORD#16#0B01, SEARCHDATEN:=Uebergabe.Position_minus, RE_VAL:="MB199", OUTDATEN:=Daten, Position:="MW196") // nach 11.DW (letzte Position) suchen
L "MB199"
T Dyn.Rueckmld.RET_VAL_Sortliste_Out
A "M199.7" // Datensatz ist vorhanden
R Dyn.Error.Haupstrang_DL // Sortliste fehlerhaft
JC w074
A "M199.6" // Datensatz ist nicht vorhanden
R Dyn.Error.Haupstrang_DL // Sortliste fehlerhaft
JC Xn08 // Warten, da noch keine Daten vorhanden
SET
S Dyn.Error.Haupstrang_DL // Sortliste fehlerhaft
w076: L 0 // Keine Daten auf Hauptstrang vorhanden
T Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang)
JU Xn08
// Search-Ink speichern:
w074: L Daten.Start_Ink // Stamm-Daten speichern
T Dyn.Hauptstrang_Search_Ink // Inkremente zum Daten auslesen (Start-Ink)
// Hauptstrang-Schaltdaten errechnen/speichern:
// Kettenlängungs-Korrektur:
L KorrekturFaktor // Korrektur-Faktor wegen Kettenlängung
L 0.95 // sinnvoller Wert ? (maximal 5% Abweichung erlaubt)
>=R // Ja !
A(
CAC
L 1.05
<=R
)
JC w075
L 1.0 // dann ohne Korrektur !
T KorrekturFaktor // Korrektur-Faktor wegen Kettenlängung
// Schaltdaten errechnen:
w075: A Daten.Start_Flag // Lauf-Flag bei Start-Inkremente
= Dyn.Hauptstrang_Flag // Flag zum Weiche schalten (vom Hauptstrang)
L Uebergabe.Off_Ink // Inkremente zum Weiche schalten
DTR
L KorrekturFaktor // Korrektur-Faktor wegen Kettenlängung
*R
RND
L Daten.Start_Ink // Daten aus Sortliste dazuaddieren
+D
T Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang)
L Dyn.Max_Wert // Maximal erlaubter Zählwert
>D
JCN Xn08
-D // Restwert übernehmen
T Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang)
AN Daten.Start_Flag // Lauf-Flag bei Start-Inkremente (invertieren)
= Dyn.Hauptstrang_Flag // Flag zum Weiche schalten (vom Hauptstrang)
--- NW 9: Hauptstrangdaten auslesen ---
Nw09: L Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang)
L 0 // angegeben ?
==D // Nein !
JC Xn08
<D // Negativ !
JC w08E
A Dyn.Hauptstrang_Flag // Flag zum Weiche schalten (vom Hauptstrang)
A Dyn.Flag_Lauf_fertig // Flag-Lauf wurde beendet
O
AN Dyn.Hauptstrang_Flag // Flag zum Weiche schalten (vom Hauptstrang)
A Dyn.Ohne_Lauf_fertig // Flag-Lauf wurde beendet
JC w080 // beim Ende des Lauf sind Inkremente uninteressant
A Dyn.Hauptstrang_Flag // Flag zum Weiche schalten (vom Hauptstrang)
A Dyn.Lauf_Flag // Zähl-Lauf mit Flag ist aktiv
O
AN Dyn.Hauptstrang_Flag // Flag zum Weiche schalten (vom Hauptstrang)
AN Dyn.Lauf_Flag // Zähl-Lauf mit Flag ist aktiv
JCN Xn08
// Daten speichern:
w080: L Dyn.Ink_Wert // Aktuelle Inkrementalwert
L Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang)
<D
JC Xn08
// Fahrendes Teil auslesen:
CALL FC "DatenOut" (SSDB:=Dyn.Hauptstrang_Sortliste, SSDW:=Uebergabe.Hauptstrang_DL_DW, PARA:=WORD#16#0000, SEARCHDATEN:=Dyn.Hauptstrang_Search_Ink, RE_VAL:="MB199", OUTDATEN:=Daten, Position:=Dyn.Hauptstrang_Pos) // Inkremente zum Daten auslesen (Start-Ink) | Aktuelle Position der Daten in Datenliste
L "MB199"
T Dyn.Rueckmld.RET_VAL_Sortliste_Out
A "M199.7" // Datensatz ist vorhanden
S Dyn.Status.BT_Daten_vorhanden // Daten für Travel-FIFO vorhanden
JC w081
L Uebergabe.Hauptstrang_DL_DB
T DatenDB
OPN DB[DatenDB]
SET
S Dyn.Error.Keine_HSDaten // Keine Hauptstrang-Daten mehr vorhanden
JU Xn08
// Fahrendes Teil speichern: (für Übergabe an Travel-FIFO)
w081: L Daten.Sort_Info.Teil_IDX // BM-IDX (wird bei Auslagerung gemeldet)
T Dyn.Last_IDX // IDX des letzten durchfahrenden Teils
L Daten.Sort_Info.Teil_Ziel
T Dyn.Last_Ziel
L Daten.Sort_Info.Sort_ID
T SAVE.Last_Sort_ID
// Daten aus Sortliste löschen
L Dyn.Hauptstrang_Pos // Aktuelle Position der Daten in Datenliste
L 16#0E00 // 0EYY: DS YY löschen
OW
T FC86_Para
CALL FC "DatenOutSort" (SSDB:=Dyn.Hauptstrang_Sortliste, SSDW:=Uebergabe.Hauptstrang_DL_DW, PARA:=FC86_Para, OUTDATEN:=Daten, RE_VAL:="MB199") // DS YY löschen
--- NW 10: Daten sofort an Travel-FIFO+1 übergeben ---
// Daten an Travel-FIFO plus übergeben?:
Xn08: A Dyn.Status.BT_Daten_vorhanden // Daten für Travel-FIFO vorhanden
JCN en08
// Daten für Eintrag vorbereiten:
L Dyn.Ink_Wert // Aktueller Inkrementalwert
T Dyn.Last_Ink // Inkremente des letzten durchfahrenden Teils
T "MD210" // Start-Ink (für Rückkontrolle)
L 0
T "MW214"
A Dyn.Lauf_Flag // Zähl-Lauf mit Flag ist aktiv
= Dyn.Last_Flag // Flag des letzten durchfahrenden Teils
= "M214.0"
L Dyn.Last_IDX // IDX des letzten durchfahrenden Teils
T "MD216"
L Dyn.Last_Ziel
T "MW220"
L SAVE.Last_Sort_ID
T "MW222"
L 0 // Restliche Daten löschen
T "MW224"
T "MW226"
T "MW228"
T "MW230"
// /FIFO resetten, damit Daten geschrieben werden können!:
CALL FC "FifoReset" (SSDB:=Uebergabe.Travel_FIFO_DB_plus, SSDW:=Uebergabe.Travel_FIFO_DW_plus, PARA:=WORD#16#0000, RE_VAL:="MB199") // / | normaler FIFO
CALL FC "FifoIn" (SSDB:=Uebergabe.Travel_FIFO_DB_plus, SSDW:=Uebergabe.Travel_FIFO_DW_plus, PARA:=WORD#16#0000, INDATEN:=P#M210.0, RE_VAL:="MB199") // Daten speichern
L "MB199"
T Dyn.Rueckmld.RET_VAL_TravelFIFO_In
JBI w8Ok
A "M199.2"
S Dyn.Error.Travel_FIFO_voll // Daten-Übergabe fand nicht statt -> Antrieb stoppen)
JC en08
SET
S Dyn.Error.Travel_FIFO_ERR // Daten-Übergabe fand nicht statt -> Antrieb stoppen)
JU en08
w8Ok: SET
R Dyn.Status.BT_Daten_vorhanden // Daten für Travel-FIFO vorhanden
w08E: L 0
T Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang)
en08: NOP 0
--- NW 11: Antrieb einschalten ---
L Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang)
L 0 // schon bekannt ?
>D // Ja !
S Antrieb_start // Kreiselantrieb starten
--- NW 12: Ende ---
BE
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,203 @@
=== FB 92: MZylinder [STL] ===
INTERFACE:
Input:
Automatik : Bool // Automatikbetrieb ist aktiv
Handbetrieb : Bool // Handbetrieb ist aktiv
T_Ast : Int := 5 // Zeit bis AST erreicht ist (*100ms)
T_Gst : Int := 5 // Zeit bis GST erreicht ist (*100ms)
Output:
ZylAst : Bool // Vorwärts-Ausgang des Antriebs
ZylGst : Bool // Rückwärts-Ausgang des Antriebs
InOut:
Static:
Stat : "UZylinder"
Temp:
Constant:
--- NW 1: Zeitwert löschen ---
A ZylAst // Zylinder fährt nach AST
A(
O Stat.B_AST // Hat Endstellung erreicht
ON Stat.Old_Ast // Fuhr letzten Zyklus anders
)
O
AN ZylAst // Zylinder fährt nach GST
A(
O Stat.B_GST // Hat Endstellung erreicht
O Stat.Old_Ast // Fuhr letzten Zyklus anders
)
JCN Nw02
tdel: L 0 // Zeitwert löschen
T Stat.T_Zelle
A ZylAst // Zylinder fährt nach AST
= Stat.Old_Ast // Fuhr letzten Zyklus nach AST
JU Nw05
--- NW 2: AST-Erreichtzeit abgelaufen ? ---
Nw02: L Stat.T_AST_Akt // Gewollter Zeitwert
L 9999 // angegeben ?
<>I // Ja !
JC w020
L T_Ast // Sollwert übergeben
T Stat.T_AST_Akt // Gewollter Zeitwert
w020: A ZylAst // Zylinder fährt nach AST ?
JCN en02
SET
R Stat.B_GST
L Stat.T_Zelle // Aktueller Zeitwert
L Stat.T_AST_Akt // Gewollter Zeitwert erreicht ?
>=I
S Stat.B_AST // Zylinder hat AST erreicht
JC tdel // Zeit nullen
JU Nw03
en02: AN Stat.Typ5_3 // Zylinder hält seine Stellung !
R Stat.B_AST
--- NW 3: GST-Erreichtzeit abgelaufen ? ---
Nw03: L Stat.T_GST_Akt // Gewollter Zeitwert
L 9999 // angegeben ?
<>I // Ja !
JC w030
L T_Gst // Sollwert übergeben
T Stat.T_GST_Akt // Gewollter Zeitwert
w030: A( // Zylinder fährt nach GST ?
O Stat.Typ5_2 // Zylinder mit 2-facher Ansteuerung
O Stat.Typ5_3
)
A ZylGst
O
A Stat.Typ3_2 // Zylinder mit 1-facher Ansteuerung
AN ZylAst
JCN en03
SET
R Stat.B_AST
L Stat.T_Zelle // Aktueller Zeitwert
L Stat.T_GST_Akt // Gewollter Zeitwert erreicht ?
>=I
S Stat.B_GST // Zylinder hat GST erreicht
JC tdel // Zeit nullen
JU Nw04
en03: AN Stat.Typ5_3 // Zylinder hält seine Stellung !
R Stat.B_GST
--- NW 4: Zeit läuft ---
Nw04: A( // Zylinder fährt nach GST ?
O Stat.Typ5_2 // Zylinder mit 2-facher Ansteuerung
O Stat.Typ5_3
)
AN ZylGst // Zylinder wird nicht angesteuert
AN ZylAst
ON "100ms-Impuls" // nur als Impuls
JC Nw05
L Stat.T_Zelle
L "MW2" // 100ms-Takte
+I
T Stat.T_Zelle
--- NW 5: Undefinierte Zustände / Befehle ---
Nw05: A Automatik // Automatik + Hand aktiv
A Handbetrieb
O
AN Automatik // keine Betriebsart
AN Handbetrieb
O
A Stat.Ast // Arbeitsstellung- + Grundstellungfahren aktiv
A Stat.Gst
O
AN Stat.Typ3_2 // Undefinierter Ventil-Typ
AN Stat.Typ5_2
AN Stat.Typ5_3
O
A Stat.Typ3_2
A(
O Stat.Typ5_2
O Stat.Typ5_3
)
O
A Stat.Typ5_2
A Stat.Typ5_3
JCN en06 // Zylinderstellung bleibt eingefroren
A Stat.Typ5_3 // Zylinder hält seine Stellung !
R Stat.Ast // Bewegungsbits löschen
R Stat.Gst
BEU
en06: NOP 0
--- NW 6: Zylinder auf Arbeitstellung fahren ---
A Stat.Ast
= ZylAst
--- NW 7: Zylinder auf Grundstellung fahren ---
A(
O Stat.Typ5_2
O Stat.Typ5_3
)
A Stat.Gst
= ZylGst
--- NW 8: Daten, die zurückgesetzt werden ---
A Stat.Typ5_3 // Zylinder hält seine Stellung !
R Stat.Ast // Bewegungsbits löschen
R Stat.Gst
A Stat.Typ3_2
R Stat.Gst // Es gibt kein GST fahren !
--- NW 9: Ausgänge übergeben an OP übergeben ---
A ZylGst
= Stat.OP_Out_GST
A ZylAst
= Stat.OP_Out_AST
--- NW 10: Statistik ---
A ZylAst
Rise Stat.FP_AST
JCN AST2
L Stat.Statistik.AST_Schaltungen
L DINT#1
+D
T Stat.Statistik.AST_Schaltungen
AST2: A ZylGst
A Stat.Typ5_3
Rise Stat.FP_AST2
JCN StatEnde
L Stat.Statistik.AST2_Schaltungen
L DINT#1
+D
T Stat.Statistik.AST2_Schaltungen
StatEnde: NOP 0
--- NW 11: Ende ---
BE
@@ -0,0 +1,62 @@
=== FC 121: Save_CARR_Gesendet [STL] ===
INTERFACE:
Input:
Kennung_1 : Char
Kennung_2 : Char
Kennung_3 : Char
Kennung_4 : Char
FIFO_DB : Int // FIFO-Ringspeicher
Teil_IDX : Int // BT/MT-IDX (wird bei Auslagerung gemeldet)
Teil_Ziel : Int // BT/MT bei diesem Abwurf-Ziel ausfahren/entladen
Sort_ID : Int // Sortier-Info (Sort-ID, mit welcher Fahrt gestartet wurde)
Output:
InOut:
Temp:
Constant:
Return:
Ret_Val : Void
--- NW 1: Kennung CARR ? ---
L Kennung_1
L 'C'
<>I // Nein !
BEC
L Kennung_2
L 'A'
<>I // Nein !
BEC
L Kennung_3
L 'R'
<>I // Nein !
BEC
L Kennung_4
L 'R'
<>I // Nein !
BEC
--- NW 2: Daten aufbereiten ---
L Teil_IDX
T "MW220"
L Teil_Ziel
T "MW222"
L Sort_ID
T "MW224"
--- NW 3: Daten speichern ---
CALL FC "FifoOut" (SSDB:=FIFO_DB, SSDW:=0, PARA:=WORD#16#E100, OUTDATEN:=P#M200.0, RE_VAL:="MB199") // da Ringspeicher nächster Eintrag lesen + austragen
CALL FC "FifoIn" (SSDB:=FIFO_DB, SSDW:=0, PARA:=WORD#16#0000, INDATEN:=P#M220.0, RE_VAL:="MB199")
L "MB199"
--- NW 4: Ende ---
BE
@@ -0,0 +1,32 @@
=== FC 122: Save_Ziel [STL] ===
INTERFACE:
Input:
FIFO_DB : Int // FIFO-Ringspeicher
Teil_IDX : Int // BT/MT-IDX (wird bei Auslagerung gemeldet)
Teil_Ziel : Int // BT/MT bei diesem Abwurf-Ziel ausfahren/entladen
Output:
InOut:
Temp:
Constant:
Return:
Ret_Val : Void
--- NW 1: Daten aufbereiten ---
L Teil_IDX
T "MW220"
L Teil_Ziel
T "MW222"
--- NW 2: Daten speichern ---
CALL FC "FifoOut" (SSDB:=FIFO_DB, SSDW:=0, PARA:=WORD#16#E100, OUTDATEN:=P#M200.0, RE_VAL:="MB199") // da Ringspeicher nächster Eintrag lesen + austragen
CALL FC "FifoIn" (SSDB:=FIFO_DB, SSDW:=0, PARA:=WORD#16#0000, INDATEN:=P#M220.0, RE_VAL:="MB199")
L "MB199"
--- NW 3: Ende ---
BE
@@ -0,0 +1,34 @@
=== FC 1028: Set_Input [STL] ===
INTERFACE:
Input:
Enable : Bool // Baustein aktivieren
Status : Bool // Angegebenen Ausgang auf diesen Status steuern
InByte : DInt // Eingangsbyte zum Steuern
InBit : Int // Eingangsbit zum Steuern
Output:
InOut:
Temp:
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
Constant:
Return:
Ret_Val : Void
--- NW 1: Baustein aktiviert ? ---
AN Enable
BEC
--- NW 2: Eingang stuern ---
L InByte // Ausgangsbyte zum Steuern
SLD 3
L InBit // Ausgangsbit zum Steuern
OW
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
A Status
= IX [AR1Zeiger] // Eingang steuern
--- NW 3: Ende ---
BE
@@ -0,0 +1,34 @@
=== FC 127: Set_Output [STL] ===
INTERFACE:
Input:
Enable : Bool // Baustein aktivieren
Status : Bool // Angegebenen Ausgang auf diesen Status steuern
OutByte : DInt // Ausgangsbyte zum Steuern
OutBit : Int // Ausgangsbit zum Steuern
Output:
InOut:
Temp:
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
Constant:
Return:
Ret_Val : Void
--- NW 1: Baustein aktiviert ? ---
AN Enable
BEC
--- NW 2: Ausgang steuern ---
L OutByte // Ausgangsbyte zum Steuern
SLD 3
L OutBit // Ausgangsbit zum Steuern
OW
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
A Status
= QX [AR1Zeiger] // Ausgang steuern
--- NW 3: Ende ---
BE