alle xml in .awl konvertiert und eingecheckt
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
=== FC 276: AMR_LeerTrolley_Anforderung [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
LeerTrolleys_benötigt : Int
|
||||
ArbeitsPlatz : Word
|
||||
Output:
|
||||
InOut:
|
||||
Gespeicherte_LeerTrolleys : Int
|
||||
Temp:
|
||||
DLDB : Int
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
|
||||
--- NW 1: Änderung vorhanden? ---
|
||||
L "LeerTrolleys_benötigt" // Diese Anzahl wird benötigt
|
||||
L Gespeicherte_LeerTrolleys // Diese Anzahl ist schon gespeichert
|
||||
==I // Identisch!
|
||||
A(
|
||||
L "LeerTrolleys_benötigt" // Diese Anzahl wird benötigt
|
||||
L 0
|
||||
<>I
|
||||
)
|
||||
BEC // Keine Änderung nötig!
|
||||
|
||||
|
||||
--- NW 2: Alle evtl. gespeicherte Anforderungen löschen ---
|
||||
L 1112 // Mit DL (12 Trolleys benötigt) beginnen
|
||||
T DLDB
|
||||
|
||||
NextDL: L ArbeitsPlatz
|
||||
T "MW220"
|
||||
|
||||
CALL FC "DatenOut" (SSDB:=DLDB, SSDW:=0, PARA:=16#E100, SEARCHDATEN:=P#M220.0, RE_VAL:="MB198", OUTDATEN:=P#M200.0, Position:="MW196") // Daten suchen und austragen
|
||||
|
||||
// Nächst kleiner benötigte Stückzahl:
|
||||
L DLDB
|
||||
+ -1
|
||||
T DLDB
|
||||
|
||||
L 1101 // 1 Trolley benötigt
|
||||
>=I // noch sinnvoll?
|
||||
JC NextDL // Ja!
|
||||
|
||||
L 0 // Keine Speicherung mehr
|
||||
T Gespeicherte_LeerTrolleys // Diese Anzahl ist schon gespeichert
|
||||
|
||||
|
||||
--- NW 3: Benötigte Leertrolleys speichern ---
|
||||
L "LeerTrolleys_benötigt"
|
||||
L 12
|
||||
<=I
|
||||
JC OK
|
||||
|
||||
T "LeerTrolleys_benötigt"
|
||||
|
||||
OK: L "LeerTrolleys_benötigt"
|
||||
L 0
|
||||
==I // Nichts benötigt
|
||||
JC ESave
|
||||
|
||||
CAC
|
||||
+ 1100 // 1101 ->1112
|
||||
T DLDB
|
||||
|
||||
L ArbeitsPlatz
|
||||
T "MW220"
|
||||
|
||||
CALL FC "DatenIn" (SSDB:=DLDB, SSDW:=0, INDATEN:=P#M220.0, RE_VAL:="MB198")
|
||||
|
||||
AN "M198.7" // Eintrag richtig erfolgt
|
||||
JC ESave
|
||||
|
||||
L "LeerTrolleys_benötigt" // Anzahl übergeben
|
||||
T Gespeicherte_LeerTrolleys // Diese Anzahl ist schon gespeichert
|
||||
|
||||
ESave: NOP 0
|
||||
|
||||
|
||||
--- NW 4: Ende ---
|
||||
BE
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
=== FC 1276: AMR_LeerTrolley_Anforderung_Del [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
ArbeitsPlatz : Word
|
||||
Output:
|
||||
InOut:
|
||||
Gespeicherte_LeerTrolleys : Int
|
||||
Temp:
|
||||
DLDB : Int
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
|
||||
--- NW 1: Bisherig gespeicherte Anforderung löschen ---
|
||||
L Gespeicherte_LeerTrolleys // Diese Anzahl ist schon gespeichert
|
||||
L 0
|
||||
==I // Nichts gespeichert
|
||||
BEC
|
||||
|
||||
CAC
|
||||
+ 1100 // 1101 ->1109
|
||||
T DLDB
|
||||
|
||||
L ArbeitsPlatz
|
||||
T "MW220"
|
||||
|
||||
CALL FC "DatenOut" (SSDB:=DLDB, SSDW:=0, PARA:=16#E100, SEARCHDATEN:=P#M220.0, RE_VAL:="MB198", OUTDATEN:=P#M200.0, Position:="MW196") // Daten suchen und austragen
|
||||
|
||||
L 0 // Keine Speicherung mehr
|
||||
T Gespeicherte_LeerTrolleys // Diese Anzahl ist schon gespeichert
|
||||
|
||||
|
||||
--- NW 2: Ende ---
|
||||
BE
|
||||
|
||||
@@ -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,505 @@
|
||||
=== 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
|
||||
// / U( ///
|
||||
// / TAK ///
|
||||
// / L ' ' ///
|
||||
// / <>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,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,135 @@
|
||||
=== FB 181: MAusfahrPrio_ABP [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
BG_Haupt_Schleuse : Bool // Trolley ist in Schleuse auf Hauptstrecke
|
||||
Haupt_Schleuse_geöffnet : Bool // Schleuse hat geöffnet
|
||||
BG_ABP_Schleuse : Bool // Trolley ist in Schleuse von ABP-Einfahrt
|
||||
ABP_Schleuse_geöffnet : Bool // Schleuse hat geöffnet
|
||||
Aktive_ABP : Int
|
||||
Output:
|
||||
InOut:
|
||||
Static:
|
||||
OUT.Haupt_Schleuse_starten : Bool
|
||||
Out.ABP_Schleuse_starten : Bool
|
||||
Dyn : Struct
|
||||
Anzahl_Haupt : Int
|
||||
Wartezeit : Int
|
||||
Temp:
|
||||
Check_ok : Bool
|
||||
Partner : Int
|
||||
Constant:
|
||||
|
||||
--- NW 1: Haupt-Schleuse ist gestartet ---
|
||||
A "Haupt_Schleuse_geöffnet"
|
||||
A "OUT.Haupt_Schleuse_starten"
|
||||
R "OUT.Haupt_Schleuse_starten"
|
||||
JCN En01 // Negierter Sprung
|
||||
|
||||
L Dyn.Anzahl_Haupt
|
||||
+ 1
|
||||
T Dyn.Anzahl_Haupt
|
||||
|
||||
L 8
|
||||
<=I
|
||||
JC En01
|
||||
|
||||
T Dyn.Anzahl_Haupt // Maximum übergeben
|
||||
|
||||
En01: NOP 0
|
||||
|
||||
|
||||
--- NW 2: ABP-Schleuse ist gestartet ---
|
||||
A "ABP_Schleuse_geöffnet"
|
||||
A "Out.ABP_Schleuse_starten"
|
||||
R "Out.ABP_Schleuse_starten"
|
||||
JCN En02 // Negierter Sprung
|
||||
|
||||
L 0
|
||||
T Dyn.Anzahl_Haupt
|
||||
|
||||
En02: NOP 0
|
||||
|
||||
|
||||
--- NW 3: Wartezeit, wenn beide Schleusen geschlossen ---
|
||||
AN "Haupt_Schleuse_geöffnet"
|
||||
AN "ABP_Schleuse_geöffnet"
|
||||
JC Geschlossen
|
||||
|
||||
L 0
|
||||
T Dyn.Wartezeit
|
||||
|
||||
SET
|
||||
R Check_ok
|
||||
|
||||
JU En03
|
||||
|
||||
Geschlossen: AN "1s-Impuls"
|
||||
JC En03
|
||||
|
||||
L Dyn.Wartezeit
|
||||
+ 1
|
||||
T Dyn.Wartezeit
|
||||
|
||||
L 5
|
||||
>=I
|
||||
S Check_ok
|
||||
JCN En03 // Negierter Sprung
|
||||
|
||||
T Dyn.Wartezeit // Zeit einfrieren
|
||||
|
||||
En03: NOP 0
|
||||
|
||||
|
||||
--- NW 4: Check, wer dran ist ---
|
||||
// Trolley nicht mehr in Schleuse:
|
||||
AN BG_Haupt_Schleuse
|
||||
R "OUT.Haupt_Schleuse_starten"
|
||||
|
||||
AN BG_ABP_Schleuse
|
||||
R "Out.ABP_Schleuse_starten"
|
||||
|
||||
// Schon entschieden:
|
||||
A "OUT.Haupt_Schleuse_starten"
|
||||
A BG_Haupt_Schleuse
|
||||
O
|
||||
A "Out.ABP_Schleuse_starten"
|
||||
A BG_ABP_Schleuse
|
||||
O "Haupt_Schleuse_geöffnet"
|
||||
O "ABP_Schleuse_geöffnet"
|
||||
BEC
|
||||
|
||||
// Relevante Partner:
|
||||
L Aktive_ABP
|
||||
+ -1 // sich selbst abziehen
|
||||
T Partner
|
||||
|
||||
L 0
|
||||
<=I // Kein weiterer Partner mehr!
|
||||
A BG_ABP_Schleuse
|
||||
S "Out.ABP_Schleuse_starten"
|
||||
BEC
|
||||
|
||||
// Check, wer dran ist:
|
||||
L Dyn.Anzahl_Haupt // Gefahrene Trolleys
|
||||
L Partner // Andere Partner, die fahren sollten
|
||||
<I // noch nicht erreicht
|
||||
A BG_Haupt_Schleuse
|
||||
S "OUT.Haupt_Schleuse_starten"
|
||||
BEC
|
||||
|
||||
// Wartezeit vorbei?:
|
||||
AN Check_ok
|
||||
BEC
|
||||
|
||||
A BG_ABP_Schleuse
|
||||
S "Out.ABP_Schleuse_starten"
|
||||
BEC
|
||||
|
||||
A BG_Haupt_Schleuse
|
||||
S "OUT.Haupt_Schleuse_starten"
|
||||
|
||||
BEU
|
||||
|
||||
--- NW 5: 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
|
||||
|
||||
|
||||
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
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,913 @@
|
||||
=== FB 1279: MHMOmniWeiche [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 : "UDLOmniWeiche_2fach" // 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
|
||||
Reservierung _noch aktiv : Bool // Reservierung noch aktiv!
|
||||
Weiche_aktiv : Bool // Weiche ist aktiv
|
||||
Auto_akt : Bool
|
||||
Hand_akt : Bool
|
||||
Bereich_ok : Bool
|
||||
MindestZeit_nachtriggern : Bool // Mindestzeit nachtriggern
|
||||
Res14 : Bool
|
||||
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
|
||||
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
|
||||
|
||||
|
||||
--- 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 = 279 (Weiche 2fach)
|
||||
L 279 // 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."Reservierung _noch aktiv"
|
||||
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" // Rein-FIFO-DW
|
||||
T SAVE."Schleuse-1_DW" // Weichen-FIFO-DW
|
||||
|
||||
BEU
|
||||
|
||||
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
|
||||
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_Überwachungszeit"
|
||||
|
||||
SET
|
||||
R Dyn.Status.Kein_StartOk
|
||||
R Dyn.Status.MindestZeit_ok
|
||||
R Dyn.Status.Ziel_erreicht
|
||||
R Dyn.Status."Reservierung _noch aktiv"
|
||||
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
|
||||
|
||||
A Dyn.Status."Reservierung _noch aktiv" // Schleuse -1 muss Reservierung noch löschen!
|
||||
JC Ret // Damit Meldung an Schleuse -1
|
||||
|
||||
A Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten
|
||||
O Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten
|
||||
O Dyn.Status."Reservierung _noch aktiv" // Schleuse -1
|
||||
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!
|
||||
O(
|
||||
L 16#FFFF // Universal-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
|
||||
|
||||
// Bereich-1-Check:
|
||||
AN Weiche.Parameter."Bereich+1_Gerade" // Datenbereich +1?
|
||||
JC GOk
|
||||
|
||||
// Bereich +1 frei ?
|
||||
L Weiche.Gerade."Bereich+1"
|
||||
T "Bereich+1ID"
|
||||
|
||||
CALL FC "DL_Einsprung" (Bereich_DL:=274, ID:="Bereich+1ID", Dyn.DB:="Bereich+1_DB", AR_Start:=AR1Start, Error:="Err_Bereich+1")
|
||||
|
||||
A "Err_Bereich+1"
|
||||
= Dyn.Error."Undef_Bereich+1"
|
||||
JC New
|
||||
|
||||
OPN DB["Bereich+1_DB"] // Bereich+1 -DB öffnen
|
||||
|
||||
L AR1Start // Startwert mit Offset 0
|
||||
+ DINT#86
|
||||
SLD 3
|
||||
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
L DBD [AR1Zeiger] // Trolley-ID (DBD 86)
|
||||
L 0 // Daten vorhanden ?
|
||||
<>I
|
||||
= Dyn.Error.Gerade_Bereich_belegt
|
||||
JC New
|
||||
|
||||
// Trolley geradeaus fahren:
|
||||
GOk: SET
|
||||
S Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten
|
||||
R Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten
|
||||
|
||||
// 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
|
||||
|
||||
// Bereich+1-Check:
|
||||
AN Weiche.Parameter."Bereich+1_Abzweig" // Datenbereich +1?
|
||||
JC AOk
|
||||
|
||||
// Bereich +1 frei ?
|
||||
L Weiche.Abzweig."Bereich+1"
|
||||
T "Bereich+1ID"
|
||||
|
||||
CALL FC "DL_Einsprung" (Bereich_DL:=274, ID:="Bereich+1ID", Dyn.DB:="Bereich+1_DB", AR_Start:=AR1Start, Error:="Err_Bereich+1")
|
||||
|
||||
A "Err_Bereich+1"
|
||||
= Dyn.Error."Undef_Bereich+1"
|
||||
JC New
|
||||
|
||||
OPN DB["Bereich+1_DB"] // Bereich+1 -DB öffnen
|
||||
|
||||
L AR1Start // Startwert mit Offset 0
|
||||
+ DINT#86
|
||||
SLD 3
|
||||
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
L DBD [AR1Zeiger] // Trolley-ID (DBD 86)
|
||||
L 0 // Daten vorhanden ?
|
||||
<>I
|
||||
= Dyn.Error.Abzweig_Bereich_belegt
|
||||
JC New
|
||||
|
||||
// Trolly abzweigen fahren:
|
||||
AOk: SET
|
||||
S Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten
|
||||
R Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten
|
||||
|
||||
// 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:
|
||||
A Dyn.Status.MindestZeit_nachtriggern
|
||||
R Dyn.Status.MindestZeit_nachtriggern
|
||||
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.Status.Ziel_erreicht
|
||||
O 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.Ziel_erreicht // Einmaliger Durchlauf
|
||||
JC X09E
|
||||
|
||||
A Dyn.Status.Weiche_geradeaus
|
||||
A B_Ziel_gerade
|
||||
JC Ziel_GOk
|
||||
|
||||
A Dyn.Status.Weiche_abzweigen
|
||||
A B_Ziel_abzweig
|
||||
JC Ziel_AOk
|
||||
|
||||
JU X09E
|
||||
|
||||
Ziel_GOk: SET
|
||||
S Dyn.Status.Ziel_erreicht
|
||||
R Dyn.Error."Übzeit_Gerade"
|
||||
|
||||
AN Weiche.Parameter."Bereich+1_Gerade" // Keine Daten-Weitergabe
|
||||
JC X09E
|
||||
|
||||
L Weiche.Gerade."Bereich+1" // Bereich für Daten-Übergabe
|
||||
JU Daten
|
||||
|
||||
Ziel_AOk: SET
|
||||
S Dyn.Status.Ziel_erreicht
|
||||
R Dyn.Error."Übzeit_Abzweig"
|
||||
|
||||
L Dyn.Schalttakte
|
||||
+ DINT#1 // Auf Abzweig umgeschaltet +1
|
||||
T Dyn.Schalttakte
|
||||
|
||||
AN Weiche.Parameter."Bereich+1_Abzweig" // Keine Daten-Weitergabe
|
||||
JC X09E
|
||||
|
||||
L Weiche.Abzweig."Bereich+1" // Bereich für Daten-Übergabe
|
||||
|
||||
// Daten an Bereich +1 übergeben:
|
||||
Daten: T "Bereich+1ID"
|
||||
|
||||
CALL FC "DL_Einsprung" (Bereich_DL:=274, ID:="Bereich+1ID", Dyn.DB:="Bereich+1_DB", AR_Start:=AR1Start, Error:="Err_Bereich+1")
|
||||
|
||||
A "Err_Bereich+1"
|
||||
JC X09E
|
||||
|
||||
OPN DB["Bereich+1_DB"] // Bereich+1 -DB öffnen
|
||||
|
||||
L AR1Start // Startwert mit Offset 0
|
||||
+ DINT#86
|
||||
SLD 3
|
||||
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
L Dyn.TrolleyID
|
||||
T DBD [AR1Zeiger] // Trolley-ID (DBD 86)
|
||||
|
||||
L AR1Start // Startwert mit Offset 0
|
||||
+ DINT#152
|
||||
SLD 3
|
||||
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
L Dyn.Zwischen_Ziel
|
||||
T DBW [AR1Zeiger] // Zwischen-Ziel (DBW 152)
|
||||
|
||||
X09E: NOP 0
|
||||
|
||||
|
||||
--- NW 13: RET: Weiche schalten ---
|
||||
Ret: A Dyn.Status.Reset_aktiv
|
||||
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
|
||||
|
||||
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
|
||||
= 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."Reservierung _noch aktiv"
|
||||
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 !
|
||||
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: 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 Dyn.Status.Ziel_erreicht
|
||||
A Dyn.Status.MindestZeit_ok
|
||||
O Dyn.Status.Reset_aktiv
|
||||
= DBX [AR1Zeiger] // Trolley ausserhalb Weiche (DBX71.5)
|
||||
S Dyn.Status."Reservierung _noch aktiv"
|
||||
JCN En18 // Negierter Sprung
|
||||
|
||||
L 0 // Zeiten neu initialisieren
|
||||
T Dyn.FahrKontrolle."Akt_Überwachungszeit"
|
||||
|
||||
En18: NOP 0
|
||||
|
||||
|
||||
--- NW 19: Ende ---
|
||||
BE
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,100 @@
|
||||
=== FB 183: MHMÜbergang_ohne_Schleuse_AMR [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"
|
||||
Stau_B_Anfang : "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 B_Anfang
|
||||
O ErrQuit
|
||||
S Antrieb_start
|
||||
|
||||
A B_Anfang
|
||||
AN Stau_B_Anfang.Stat.B_Akt
|
||||
O ErrQuit
|
||||
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: Stau B_Anfang ---
|
||||
CALL FB "None" , (ESensor:=B_Anfang, T_Ein:=1, T_Aus:=100, tein_aktiv:=Antrieb_aktiv, taus_aktiv:=1)
|
||||
|
||||
|
||||
--- NW 4: 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:=100, tein_aktiv:=1, taus_aktiv:=Antrieb)
|
||||
|
||||
|
||||
--- NW 5: 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 6: Ende ---
|
||||
BE
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,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
|
||||
|
||||
Reference in New Issue
Block a user