alle xml in .awl konvertiert und eingecheckt
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
=== FC 78: BCD (4stellig)_to_INT [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
BCD_Wert : Word
|
||||
Output:
|
||||
Int_Wert : Int
|
||||
InOut:
|
||||
Temp:
|
||||
BCD_Vergleich : Word
|
||||
Multiplikator : Int
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
|
||||
--- NW 1: Rückmeldung ---
|
||||
L 0 // erst mal köschen
|
||||
T Int_Wert
|
||||
|
||||
L 1
|
||||
T Multiplikator
|
||||
|
||||
--- NW 2: BCD-Wert wandeln ---
|
||||
L BCD_Wert
|
||||
T BCD_Vergleich
|
||||
L 16#000F
|
||||
AW
|
||||
L Multiplikator
|
||||
*I
|
||||
L Int_Wert
|
||||
+I
|
||||
T Int_Wert
|
||||
|
||||
L Multiplikator
|
||||
L 16
|
||||
*I
|
||||
T Multiplikator
|
||||
|
||||
L BCD_Vergleich
|
||||
SRW 4
|
||||
T BCD_Vergleich
|
||||
|
||||
L 16#000F
|
||||
AW
|
||||
L Multiplikator
|
||||
*I
|
||||
L Int_Wert
|
||||
+I
|
||||
T Int_Wert
|
||||
|
||||
L Multiplikator
|
||||
L 16
|
||||
*I
|
||||
T Multiplikator
|
||||
|
||||
L BCD_Vergleich
|
||||
SRW 4
|
||||
T BCD_Vergleich
|
||||
|
||||
L 16#000F
|
||||
AW
|
||||
L Multiplikator
|
||||
*I
|
||||
L Int_Wert
|
||||
+I
|
||||
T Int_Wert
|
||||
|
||||
L Multiplikator
|
||||
L 16
|
||||
*I
|
||||
T Multiplikator
|
||||
|
||||
L BCD_Vergleich
|
||||
SRW 4
|
||||
T BCD_Vergleich
|
||||
|
||||
L 16#000F
|
||||
AW
|
||||
L Multiplikator
|
||||
*I
|
||||
L Int_Wert
|
||||
+I
|
||||
T Int_Wert
|
||||
|
||||
|
||||
--- NW 3: Ende ---
|
||||
BE
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
=== FC 99: DBMOV [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
QuellDB : Int // Quell-DB
|
||||
QuellDW : Int // Quell-1.DW
|
||||
ZielDB : Int // Ziel-DB
|
||||
ZielDW : Int // Ziel-1.DW
|
||||
Anzahl_DW : Int // Anzahl der zu kopierenden DWs
|
||||
Output:
|
||||
RE_VAL : Int // Rückmeldung
|
||||
InOut:
|
||||
Temp:
|
||||
Quelle : Any // Zeiger, wo Rein-Daten sind
|
||||
Ziel : Any // Zeiger, FIFO-Stelle
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
|
||||
--- NW 1: ---
|
||||
// Kennung + Datenbytes
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0
|
||||
T LW10 // Any-Kennung, Datentyp
|
||||
L Anzahl_DW // Datenwords speichern
|
||||
T LW2
|
||||
T LW12 // Wiederholungen
|
||||
|
||||
// Quelle-Pointer erzeugen:
|
||||
L QuellDB
|
||||
T LW4 // DB_Nummer
|
||||
L QuellDW // Adresse
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
// Ziel-Pointer erzeugen:
|
||||
L ZielDB
|
||||
T LW14 // DB_Nummer
|
||||
L ZielDW // Adresse
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD16 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RE_VAL, DSTBLK:=Ziel) // Datenliste-Daten speichern
|
||||
|
||||
|
||||
--- NW 2: Ende ---
|
||||
BE
|
||||
@@ -0,0 +1,55 @@
|
||||
=== FC 1004: DL_Einsprung [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
Bereich_DL : Int // Nur für Stammdaten =1!
|
||||
ID : Int
|
||||
Output:
|
||||
Dyn.DB : Int
|
||||
AR_Start : DInt
|
||||
Error : Bool
|
||||
InOut:
|
||||
Temp:
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
|
||||
--- NW 1: Inittialisierung ---
|
||||
L 0
|
||||
T "Dyn.DB"
|
||||
L DINT#0
|
||||
T AR_Start
|
||||
SET
|
||||
S Error
|
||||
|
||||
|
||||
--- NW 2: ID suchen ---
|
||||
L ID
|
||||
T "MW200"
|
||||
|
||||
CALL FC "DatenOut" (SSDB:=Bereich_DL, SSDW:=0, PARA:=16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196") // Eintrag lesen
|
||||
|
||||
L "MB199"
|
||||
L 2#1111111 // Bit 7 ausblenden
|
||||
AW
|
||||
L 0 // Fehler vorhanden?
|
||||
<>I // Ja
|
||||
= Error
|
||||
BEC
|
||||
|
||||
|
||||
--- NW 3: Daten übergeben ---
|
||||
L "MW224"
|
||||
T "Dyn.DB" // Dyn.DB
|
||||
L 0 // sinnvoller Wert ?
|
||||
<=I // Nein !
|
||||
S Error
|
||||
BEC
|
||||
|
||||
L "MW226"
|
||||
ITD
|
||||
T AR_Start
|
||||
|
||||
|
||||
--- NW 4: Ende ---
|
||||
BE
|
||||
|
||||
@@ -0,0 +1,627 @@
|
||||
=== FC 91: DatenFindOffsetSort [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
SSDB : Int // Datenlisten-DB
|
||||
SSDW : Int // Datenlisten-1.DW
|
||||
PARA : Word // Aufrufparameter (Auftrag / Anzahl Zusatzdaten)
|
||||
SEARCHDATEN : Pointer // Such-Daten-Schnittstelle
|
||||
Output:
|
||||
RE_VAL : Byte // Rückmeldung
|
||||
OUTDATEN : Pointer // OutDaten-Schnittstelle
|
||||
Position : Int // Daten stehen an angegebener Position in Datenbank
|
||||
InOut:
|
||||
Temp:
|
||||
Quelle : Any // Zeiger, wo Rein-Daten sind
|
||||
Ziel : Any // Zeiger, FIFO-Stelle
|
||||
Kopf : Byte // Datenliste-Kennnung (DA)
|
||||
Datensatzlaenge : Byte // Datensatzlänge in Word (01 - F0) F0=128
|
||||
Listenlaenge : Int // Länge der Datenliste (maximale Anzahl der Datensätze)
|
||||
Stammdaten : Int // Stammdatenlänge in Word (1 - 9)
|
||||
Belegt06 : Int // reserviert von Datenliste
|
||||
Belegt08 : Int // reserviert von Datenliste
|
||||
Belegt10 : Int // reserviert von Datenliste
|
||||
Belegt12 : Int // reserviert von Datenliste
|
||||
AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze
|
||||
Reserve16 : Int // Reserve
|
||||
Reserve18 : Int // Reserve
|
||||
Para1 : Byte // 1.Aufrufparameter
|
||||
Para2 : Byte // 2.Aufrufparameter
|
||||
Suchzeiger : Int // Suchzeiger
|
||||
DBDatenliste : Word // Datenlisten-DB
|
||||
OffsetDaten_1 : Int // Stammdaten beginnen ab hier
|
||||
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
|
||||
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
|
||||
Datenlisten_Ende : Word // Ende der Datenliste
|
||||
AR2_Speicher : DWord // Adress-Register 2 zwischenspeichern
|
||||
Schleife : Word // Loopzähler
|
||||
DBSuchDaten : Word // Such-Daten-DB, falls angegeben
|
||||
SuchDaten_Pointer : DWord // Such-Daten-Pointer: Kennung, Adresse
|
||||
SuchDaten_Startpunkt : Word // Such-Daten-Startpunkt: Adresse
|
||||
DBOutDaten : Word // Out-Daten-DB, falls angegeben
|
||||
OutDaten_Pointer : DWord // Out-Daten-Pointer: Kennung, Adresse
|
||||
OutDaten_Startpunkt : Word // Out-Daten-Startpunkt: Adresse
|
||||
IndPointer : DWord // Zeiger für IndDB
|
||||
Daten_1 : Word // 1.Datenwort der Indaten
|
||||
Datenblock_inBytes : Word // Datenblocklänge in Bytes
|
||||
Suchstelle : Word // Bei angegebenen Datensatz suchen
|
||||
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
|
||||
Weitersuchen : Bool // Weitersuchen ist aktiv
|
||||
Offsetsuchen : Bool // Offsetsuchen ist aktiv
|
||||
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
tRE_VAL : Byte // Rückmeldung
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
|
||||
--- NW 1: Schnittstellen-DB sinnvoll ? ---
|
||||
TAR2
|
||||
T AR2_Speicher // AR2 zwischenspeichern
|
||||
|
||||
L SSDB
|
||||
T DBDatenliste
|
||||
|
||||
// CALL TEST_DB
|
||||
// DB_NUMBER :=#DBDatenliste
|
||||
// RET_VAL :=#SFC_RET_VAL
|
||||
// DB_LENGTH :=#SFC_DB_LENGTH
|
||||
// WRITE_PROT :=#SFC_WRITE_PROT
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBDatenliste, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
O SFC_WRITE_PROT // schreibgeschützt
|
||||
JC Err0 // kein Datenlisten-Bereich
|
||||
|
||||
|
||||
--- NW 2: Quelle-Pointer erzeugen: ---
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0 // Any-Kennung, Datentyp
|
||||
L 16#000A // 10 Dw´s holen
|
||||
T LW2 // Wiederholungen
|
||||
L SSDB
|
||||
T LW4 // DB_Nummer
|
||||
L SSDW // Adresse
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 10) // 1.-10.DW Datenliste holen
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
|
||||
|
||||
--- NW 3: Zeigerüberprüfung ---
|
||||
L Kopf // Datenliste-Kopf
|
||||
L 16#DB // = Sort-Datenlistekennung ?
|
||||
<>I // Nein !
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 1
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 128
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 1
|
||||
L Listenlaenge // Max.Anzahl von Datenblöcken
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 1
|
||||
L Stammdaten // Anzahl der Stammdaten
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 9
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L Stammdaten // Anzahl der Stammdaten
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L Listenlaenge // Länge der Datenliste
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
*I
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
+ 20 // Speichern ab 10.DW
|
||||
L SSDW
|
||||
+I
|
||||
T Datenlisten_Ende
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
|
||||
L Datenlisten_Ende
|
||||
L SFC_DB_LENGTH
|
||||
>I // Datenlisten-DB ist zu kurz!
|
||||
JC Err0 // kein Datenlisten-Bereich
|
||||
|
||||
L DBW [AR1Zeiger]
|
||||
L 16#DAEE // Datenliste-Endekennung ?
|
||||
<>I // Nein !
|
||||
A(
|
||||
CAC
|
||||
L 16#DBEE // Sort-Datenliste-Endekennung ?
|
||||
<>I // Nein !
|
||||
)
|
||||
JC Err0 // kein Datenlisten-Bereich
|
||||
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
L 2
|
||||
*I
|
||||
T Datenblock_inBytes // Datenblocklänge in Bytes
|
||||
|
||||
|
||||
--- NW 4: Auftrag kontrollieren ---
|
||||
SET
|
||||
R Weitersuchen // Weitersuchen ist aktiv
|
||||
R Offsetsuchen // Offsetsuchen ist aktiv
|
||||
L 0 // Vorerst kein Offset
|
||||
T OffsetDaten_1
|
||||
|
||||
L PARA
|
||||
T LW40 // Aufrufparameter zwischenspeichern
|
||||
|
||||
L 16#00 // XX = 00 ?
|
||||
L Para1
|
||||
==I // Ja!
|
||||
JC W401
|
||||
|
||||
L 16#E1 // XX = E1 ?
|
||||
==I // Ja!
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
L 16#F1 // XX = F1 ?
|
||||
L Para1
|
||||
<>I // Nein !
|
||||
JC W400
|
||||
|
||||
L Para2
|
||||
L 16#00
|
||||
<>I
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
SET
|
||||
S Weitersuchen
|
||||
|
||||
L SSDW
|
||||
+ 20
|
||||
T Suchzeiger
|
||||
|
||||
JU Nw08 // OutDaten ok ?
|
||||
|
||||
W400: L 16#FF // XX = FF ?
|
||||
<>I // Nein !
|
||||
JC W403
|
||||
|
||||
L Para2
|
||||
L 16#00
|
||||
<>I
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
SET
|
||||
S Weitersuchen
|
||||
|
||||
L Suchzeiger // Alter Suchzeiger
|
||||
L Datenblock_inBytes // Datenblocklänge in bytes
|
||||
+I // Nächsten Datensatz suchen
|
||||
T Suchzeiger // Neuer Suchzeiger
|
||||
|
||||
L Datenblock_inBytes // Datenblocklänge in bytes
|
||||
L Listenlaenge // Alle möglichen Einträge
|
||||
*I // Gesamtlänge
|
||||
L SSDW // Startpunkt
|
||||
+I
|
||||
+ 20 // Offset 1.Daten
|
||||
L Suchzeiger // Schreibzeiger
|
||||
>I // Noch nicht am Ende !
|
||||
JC Nw08 // OutDaten ok ?
|
||||
|
||||
JU Err2 // Listenende erreicht
|
||||
|
||||
W403: L 16#02 // XX < 02 ?
|
||||
L Para1
|
||||
>I // Ja!
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
L 16#80 // XX > 80 ?
|
||||
>I // Ja!
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
CAC
|
||||
L Datensatzlaenge // XX > Datensatzlänge
|
||||
>I // Ja!
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
CAC
|
||||
+ -1 // Angegebener Offset -1
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
T OffsetDaten_1 // Richtiger Offset der 1.Stammdaten
|
||||
|
||||
L 0
|
||||
T Suchzeiger // Suche ab Anfang
|
||||
|
||||
SET
|
||||
S Offsetsuchen
|
||||
|
||||
W401: L 16#00 // =0 ?
|
||||
L Para2 // 2.Aufrufparameter
|
||||
==I // Ja !
|
||||
JC W402
|
||||
|
||||
T Stammdaten // Anzahl der Stammdaten
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
>I
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
L 1
|
||||
L Stammdaten // Anzahl der Stammdaten
|
||||
>I
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
L 9
|
||||
>I
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
W402: AN Offsetsuchen
|
||||
JC Nw05
|
||||
|
||||
L Para1 // Offset
|
||||
+ -1
|
||||
L Stammdaten
|
||||
+I // Letzte Stammdaten zu groß ?
|
||||
L Datensatzlaenge
|
||||
>I // Ja!
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
|
||||
--- NW 5: Such-DATEN-Pointer übernehmen: ---
|
||||
Nw05: L AnzahlEintraege // Anzahl der eingetragenen Datensätze
|
||||
L 0 // Eintrag vorhanden ?
|
||||
==I // Nein !
|
||||
JC Err6 // Datensatz ist nicht vorhanden
|
||||
|
||||
L 0
|
||||
T Suchzeiger // Suchzeiger
|
||||
|
||||
L P#
|
||||
LAR2
|
||||
|
||||
L NoneW [AR2,]
|
||||
T DBSuchDaten // Suchdaten-DB
|
||||
L NoneD [AR2,] // Kennung, Adresse
|
||||
T SuchDaten_Pointer
|
||||
|
||||
L DBSuchDaten // Suchdaten-DB
|
||||
L 0 // Angegeben ?
|
||||
==I // Nein
|
||||
JC W501
|
||||
|
||||
// CALL TEST_DB
|
||||
// DB_NUMBER :=#DBSuchDaten
|
||||
// RET_VAL :=#SFC_RET_VAL
|
||||
// DB_LENGTH :=#SFC_DB_LENGTH
|
||||
// WRITE_PROT :=#SFC_WRITE_PROT
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBSuchDaten, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000 // Fehler vorhanden ?
|
||||
<>I // Ja !
|
||||
JC Err4 // Undefinierte Stammdaten
|
||||
|
||||
L NoneD [AR2,] // Kennung, Adresse
|
||||
L 16#00FF_FFFF // Ohne Kennung
|
||||
AW
|
||||
SRW 3 // Ohne Bit
|
||||
T SuchDaten_Startpunkt
|
||||
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
L SuchDaten_Startpunkt
|
||||
+I
|
||||
L SFC_DB_LENGTH
|
||||
>I // Suchdaten-DB ist zu kurz
|
||||
JC Err4 // Undefinierte Stammdaten
|
||||
|
||||
W501: L SuchDaten_Pointer
|
||||
LAR2
|
||||
|
||||
L DBSuchDaten // Suchdaten-DB
|
||||
L 0 // Angegeben ?
|
||||
==I // Nein
|
||||
JC W502
|
||||
|
||||
OPN DB[DBSuchDaten]
|
||||
|
||||
W502: L NoneW [AR2,] // Suchdaten überprüfen
|
||||
T Daten_1 // 1.Suchdaten speichern
|
||||
|
||||
L Stammdaten
|
||||
L500: T Schleife
|
||||
|
||||
L DBSuchDaten // Suchdaten-DB
|
||||
L 0 // Angegeben ?
|
||||
==I // Nein
|
||||
JC W503
|
||||
|
||||
OPN DB[DBSuchDaten]
|
||||
|
||||
W503: L NoneW [AR2,] // Suchdaten überprüfen
|
||||
L 0 // Etwas angegeben ?
|
||||
<>I // Ja !
|
||||
JC Nw07 // Weiter
|
||||
|
||||
ADDAR2 P#2.0
|
||||
|
||||
L Schleife
|
||||
LOOP L500
|
||||
|
||||
JU Err4 // Undefinierte Stammdaten
|
||||
|
||||
|
||||
--- NW 6: Kontrolle auf gleiche Stammdaten ---
|
||||
Nw07: L Suchzeiger // Suchzeiger
|
||||
L 0 // Angegeben ?
|
||||
==I // Nein !
|
||||
JC W700 // Suche bei 1.Datensatz beginnen
|
||||
|
||||
L Suchzeiger // Suchzeiger
|
||||
+ -20 // Zeiger 1.Daten
|
||||
L Datenblock_inBytes // Datenblocklänge in Bytes
|
||||
/I // Ermittlung der wievielten Daten -1
|
||||
SRD 16 // Rest ermitteln
|
||||
L 0 // = 0 ?
|
||||
<>I // Suchzeiger nicht im Raster !
|
||||
JC W700 // Suche bei 1.Datensatz beginnen
|
||||
|
||||
L 0 // Bei angegebener Stelle suchen
|
||||
T Suchstelle // Such bei X-ten Datensatz
|
||||
|
||||
JU W701
|
||||
|
||||
W700: L 1 // Suche bei 1.Datensatz beginnen
|
||||
T Suchstelle // Such bei X-ten Datensatz
|
||||
L SSDW
|
||||
+ 20 // Offset für 1.Daten
|
||||
T Suchzeiger // Suchzeiger
|
||||
|
||||
W701: L Suchzeiger // Suchzeiger
|
||||
L OffsetDaten_1 // Richtiger Offset der 1.Stammdaten
|
||||
+I
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
L SuchDaten_Pointer
|
||||
LAR2
|
||||
|
||||
L Stammdaten // Anzahl der Stammdaten
|
||||
L700: T Schleife
|
||||
|
||||
L DBSuchDaten // Suchdaten-DB
|
||||
L 0 // Angegeben ?
|
||||
==I // Nein
|
||||
JC W702
|
||||
|
||||
OPN DB[DBSuchDaten]
|
||||
|
||||
W702: L NoneW [AR2,] // Suchdaten überprüfen mit
|
||||
OPN DB[DBDatenliste]
|
||||
L DBW [AR1Zeiger] // Datenliste-Daten lesen
|
||||
<>I // nicht identisch !
|
||||
JC W703
|
||||
|
||||
L AR1Zeiger
|
||||
SRD 3
|
||||
L 2
|
||||
+D
|
||||
SLD 3
|
||||
T AR1Zeiger
|
||||
|
||||
ADDAR2 P#2.0
|
||||
|
||||
L Schleife
|
||||
LOOP L700
|
||||
|
||||
L 2#0000_0000_1000_0000 // Daten sind vorhanden
|
||||
T tRE_VAL // Ok-Status
|
||||
|
||||
JU Nw08 // Datensatz ist in Liste enthalten
|
||||
|
||||
W703: L 0 // Suche bei 1.Datensatz begonnen
|
||||
L Suchstelle // Such bei X-ten Datensatz
|
||||
==I // Nein !
|
||||
JC W700
|
||||
|
||||
L Suchstelle // Such bei X-ten Datensatz
|
||||
+ 1
|
||||
T Suchstelle // Such bei X-ten Datensatz
|
||||
L AnzahlEintraege // Anzahl der eingetragenen Datensätze
|
||||
<=I // Alle Datensätze sind durchsucht
|
||||
JC W705 // Nein !
|
||||
|
||||
JU Err6 // Datensatz ist nicht vorhanden
|
||||
|
||||
W705: L Datenblock_inBytes // Datenblocklänge in bytes
|
||||
L Suchzeiger // Suchzeiger
|
||||
+I
|
||||
T Suchzeiger // Suchzeiger
|
||||
JU W701
|
||||
|
||||
|
||||
--- NW 7: Out-DATEN-Pointer übernehmen: ---
|
||||
Nw08: L P#
|
||||
LAR2
|
||||
|
||||
L NoneW [AR2,]
|
||||
T DBOutDaten // Outdaten-DB
|
||||
L NoneD [AR2,] // Kennung, Adresse
|
||||
T OutDaten_Pointer
|
||||
|
||||
L DBOutDaten // Outdaten-DB
|
||||
L 0 // Angegeben ?
|
||||
==I // Nein
|
||||
JC Nw09
|
||||
|
||||
// CALL TEST_DB
|
||||
// DB_NUMBER :=#DBOutDaten
|
||||
// RET_VAL :=#SFC_RET_VAL
|
||||
// DB_LENGTH :=#SFC_DB_LENGTH
|
||||
// WRITE_PROT :=#SFC_WRITE_PROT
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBOutDaten, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000 // Fehler vorhanden ?
|
||||
<>I // Ja !
|
||||
JC Err5 // Undefinierte Outdaten
|
||||
|
||||
L NoneD [AR2,] // Kennung, Adresse
|
||||
L 16#00FF_FFFF // Ohne Kennung
|
||||
AW
|
||||
SRW 3 // Ohne Bit
|
||||
T OutDaten_Startpunkt
|
||||
|
||||
L OutDaten_Startpunkt
|
||||
L SFC_DB_LENGTH
|
||||
>I // Outdaten-DB ist zu kurz
|
||||
JC Err5 // Undefinierte Outdaten
|
||||
|
||||
|
||||
--- NW 8: Quelle-Pointer erzeugen: ---
|
||||
Nw09: L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0
|
||||
T LW10 // Any-Kennung, Datentyp
|
||||
L Datensatzlaenge // Datenwords speichern
|
||||
T LW2
|
||||
T LW12 // Wiederholungen
|
||||
|
||||
// DATEN-Pointer übernehmen:
|
||||
L SSDB
|
||||
T LW4 // DB_Nummer
|
||||
L Suchzeiger // Adresse
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
// Ziel-Pointer erzeugen:
|
||||
// Kennung + Datenbytes s.o.
|
||||
|
||||
L DBOutDaten
|
||||
T LW14 // DB_Nummer
|
||||
L OutDaten_Pointer
|
||||
T LD16 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // Datenliste-Daten speichern
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
|
||||
L SSDW
|
||||
+ 12 // im 12.DW speichern
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
L Suchzeiger // Suchzeiger
|
||||
OPN DB[DBDatenliste]
|
||||
T DBW [AR1Zeiger] // Speicherung letzter Zugriff
|
||||
|
||||
L Suchzeiger // Suchzeiger
|
||||
+ -20 // Offeset 1.DS
|
||||
L Datenblock_inBytes // Datenblocklänge in Bytes
|
||||
/I
|
||||
+ 1 // Position errechnen
|
||||
T Position // Daten stehen an angegebener Position in Datenbank
|
||||
|
||||
|
||||
--- NW 9: Weitersuchen aktiv ? Datensatz vorhanden oder 0 ? ---
|
||||
AN Weitersuchen
|
||||
JC Ende
|
||||
|
||||
L OutDaten_Pointer
|
||||
LAR2
|
||||
|
||||
L Datensatzlaenge
|
||||
L110: T Schleife
|
||||
|
||||
L DBOutDaten // Outdaten-DB
|
||||
L 0 // Angegeben ?
|
||||
==I // Nein
|
||||
JC W111
|
||||
|
||||
OPN DB[DBOutDaten]
|
||||
|
||||
W111: L NoneW [AR2,] // Outdaten überprüfen
|
||||
L 0 // Etwas angegeben ?
|
||||
<>I // Ja !
|
||||
JC W112 // Ok
|
||||
|
||||
ADDAR2 P#2.0
|
||||
|
||||
L Schleife
|
||||
LOOP L110
|
||||
|
||||
L 2#0000_0000_0100_0000 // Daten sind nicht vorhanden
|
||||
T tRE_VAL // Ok-Status
|
||||
JU Ende
|
||||
|
||||
W112: L 2#0000_0000_1000_0000 // Daten sind vorhanden
|
||||
T tRE_VAL // Ok-Status
|
||||
JU Ende
|
||||
|
||||
|
||||
--- NW 10: Fehlerausgabe / RET_VAL ---
|
||||
Ende: SET // VKE = 1 ohne Fehler !!!
|
||||
L tRE_VAL // Ok-Status
|
||||
JU Ok
|
||||
Err0: L 2#0000_0000_0000_0001 // Kein Datenlistebereich
|
||||
JU Err
|
||||
Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler
|
||||
JU Err
|
||||
Err2: L 2#0000_0000_0000_0100 // Listenende ist erreicht
|
||||
JU Err
|
||||
Err3: L 2#0000_0000_0000_1000 // Falscher Parameter bei Aufruf
|
||||
JU Err
|
||||
Err4: L 2#0000_0000_0001_0000 // Undefinierte Suchdaten
|
||||
JU Err
|
||||
Err5: L 2#0000_0000_0010_0000 // Undefinierte OUTDaten
|
||||
JU Err
|
||||
Err6: L 2#0000_0000_0100_0000 // Datensatz nicht vorhanden
|
||||
|
||||
Err: CLR // VKE = 0 bei Fehler !!!
|
||||
|
||||
Ok: T tRE_VAL
|
||||
SAVE // VKE in BIE-Bit speichern
|
||||
|
||||
L AR2_Speicher // AR2 zurückspeichern
|
||||
LAR2
|
||||
|
||||
|
||||
--- NW 11: ---
|
||||
L tRE_VAL
|
||||
T RE_VAL
|
||||
|
||||
|
||||
@@ -0,0 +1,552 @@
|
||||
=== FC 85: DatenIn [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
SSDB : Int // Datenlisten-DB
|
||||
SSDW : Int // Datenlisten-1.DW
|
||||
INDATEN : Pointer // InDaten-Schnittstelle
|
||||
Output:
|
||||
RE_VAL : Byte
|
||||
InOut:
|
||||
Temp:
|
||||
Quelle : Any // Zeiger, wo Rein-Daten sind
|
||||
Ziel : Any // Zeiger, FIFO-Stelle
|
||||
Kopf : Byte // Datenliste-Kennnung (DA)
|
||||
Datensatzlaenge : Byte // Datensatzlänge in Word (01 - F0) F0=128
|
||||
Listenlaenge : Int // Länge der Datenliste (maximale Anzahl der Datensätze)
|
||||
Stammdaten : Int // Stammdatenlänge in Word (1 - 9)
|
||||
IndDB : Word // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!)
|
||||
IndDB_Laenge : Int // Länge des indizierten DB in Einträge (nur bei Stammdaten = 1 erlaubt !!!)
|
||||
IndDaten_FC : Int // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!)
|
||||
Schreibzeiger : Int // Speicherung des letzten Zugriffs / Schreibzeiger
|
||||
Belegt14 : Int // reserviert von Sort-Datenliste
|
||||
AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!)
|
||||
Reserve18 : Int // Reserve
|
||||
DBDatenliste : Word // Datenlisten-DB
|
||||
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
|
||||
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
|
||||
Datenlisten_Ende : Word // Ende der Datenliste
|
||||
AR2_Speicher : DWord // Adress-Register 2 zwischenspeichern
|
||||
Schleife : Word // Loopzähler
|
||||
DBInDaten : Word // Indaten-DB, falls angegeben
|
||||
InDaten_Pointer : DWord // In-Daten-Pointer: Kennung, Adresse
|
||||
InDaten_Startpunkt : Word // In-Daten-Startpunkt: Adresse
|
||||
IndPointer : DWord // Zeiger für IndDB
|
||||
Daten_1 : Word // 1.Datenwort der Indaten
|
||||
Daten_2 : DWord // 1+2.Datenwort der Indaten (falls ind.Suchen mit Stammdaten 2)
|
||||
LeerZeiger : Word // Zeiger für Leerzelle
|
||||
Datenblock_inBytes : Word // Datenblocklänge in Bytes
|
||||
Suchstelle : Word // Bei angegebenen Datensatz suchen
|
||||
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
|
||||
Indok : Bool // Indizierung möglich
|
||||
IndZeiger_ok : Bool // Indizier-Zeiger angegeben
|
||||
Sortliste : Bool // Sortliste wird durchsucht
|
||||
tRE_VAL : Byte // Rückmeldung
|
||||
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
DB_Länge : Int
|
||||
Wandel_FC : Word // Wandel-FC
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
|
||||
--- NW 1: Schnittstellen-DB sinnvoll ? ---
|
||||
TAR2
|
||||
T AR2_Speicher // AR2 zwischenspeichern
|
||||
|
||||
L SSDB
|
||||
T DBDatenliste
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBDatenliste, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
|
||||
CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge")
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
O SFC_WRITE_PROT
|
||||
JC Err0 // kein Datenlisten-Bereich
|
||||
|
||||
|
||||
--- NW 2: Quelle-Pointer erzeugen: ---
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0 // Any-Kennung, Datentyp
|
||||
L 16#000A // 10 Dw´s holen
|
||||
T LW2 // Wiederholungen
|
||||
L SSDB
|
||||
T LW4 // DB_Nummer
|
||||
L SSDW // Adresse
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 10) // 1.-10.DW Datenliste holen
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
|
||||
|
||||
--- NW 3: Zeigerüberprüfung ---
|
||||
L Kopf // Datenliste-Kopf
|
||||
L 16#DB // = Sort-Datenlistekennung ?
|
||||
==I // Ja !
|
||||
= Sortliste // Sortliste wird durchsucht
|
||||
JC w030
|
||||
|
||||
CAC
|
||||
L 16#DA // = Datenlistekennung ?
|
||||
<>I // Nein !
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
w030: L 1
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 128
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 1
|
||||
L Listenlaenge // Max.Anzahl von Datenblöcken
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 1
|
||||
L Stammdaten // Anzahl der Stammdaten
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 9
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L Stammdaten // Anzahl der Stammdaten
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L Listenlaenge // Länge der Datenliste
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
*I
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
+ 20 // Speichern ab 10.DW
|
||||
L SSDW
|
||||
+I
|
||||
T Datenlisten_Ende
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
|
||||
L Datenlisten_Ende
|
||||
L "DB_Länge"
|
||||
>I // Datenlisten-DB ist zu kurz!
|
||||
JC Err0 // kein Datenlisten-Bereich
|
||||
|
||||
L DBW [AR1Zeiger]
|
||||
L 16#DAEE // Datenliste-Endekennung ?
|
||||
<>I // Nein !
|
||||
A(
|
||||
CAC
|
||||
L 16#DBEE // Sort-Datenliste-Endekennung ?
|
||||
<>I // Nein !
|
||||
)
|
||||
JC Err0 // kein Datenlisten-Bereich
|
||||
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
L 2
|
||||
*I
|
||||
T Datenblock_inBytes // Datenblocklänge in Bytes
|
||||
|
||||
|
||||
--- NW 4: In-DATEN-Pointer übernehmen: ---
|
||||
L P#
|
||||
LAR2
|
||||
|
||||
L NoneW [AR2,]
|
||||
T DBInDaten // Indaten-DB
|
||||
|
||||
L DBInDaten // Indaten-DB
|
||||
L 0 // Angegeben ?
|
||||
==I // Nein
|
||||
JC W401
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBInDaten, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
|
||||
CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge")
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000 // Fehler vorhanden ?
|
||||
<>I // Ja !
|
||||
JC Err4 // Undefinierte Indaten
|
||||
|
||||
L NoneD [AR2,] // Kennung, Adresse
|
||||
L 16#00FF_FFFF // Ohne Kennung
|
||||
AW
|
||||
SRW 3 // Ohne Bit
|
||||
T InDaten_Startpunkt
|
||||
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
L InDaten_Startpunkt
|
||||
+I
|
||||
L "DB_Länge"
|
||||
>I // Indaten-DB ist zu kurz
|
||||
JC Err4 // Undefinierte Indaten
|
||||
|
||||
W401: L NoneD [AR2,] // Kennung, Adresse
|
||||
T InDaten_Pointer
|
||||
LAR2
|
||||
|
||||
L DBInDaten // Indaten-DB
|
||||
L 0 // Angegeben ?
|
||||
==I // Nein
|
||||
JC W402
|
||||
|
||||
OPN DB[DBInDaten]
|
||||
|
||||
W402: L NoneW [AR2,] // Indaten überprüfen
|
||||
T Daten_1 // 1.Indaten speichern
|
||||
L NoneD [AR2,] // Suchdaten überprüfen
|
||||
T Daten_2 // 1.Suchdaten speichern
|
||||
|
||||
L Stammdaten
|
||||
L400: T Schleife
|
||||
|
||||
L DBInDaten // Indaten-DB
|
||||
L 0 // Angegeben ?
|
||||
==I // Nein
|
||||
JC W403
|
||||
|
||||
OPN DB[DBInDaten]
|
||||
|
||||
W403: L NoneW [AR2,] // Indaten überprüfen
|
||||
L 0 // Etwas angegeben ?
|
||||
<>I // Ja !
|
||||
JC Nw05 // Weiter
|
||||
|
||||
ADDAR2 P#2.0
|
||||
|
||||
L Schleife
|
||||
LOOP L400
|
||||
|
||||
JU Err4 // Undefinierte Indaten
|
||||
|
||||
|
||||
--- NW 5: Indiziert speichern ? ---
|
||||
Nw05: SET
|
||||
R Indok // Indizierung möglich
|
||||
R IndZeiger_ok // Indizier-Zeiger angegeben
|
||||
|
||||
L IndDB // Indizierter DB
|
||||
L 0 // Angegeben ?
|
||||
==I // Nein !
|
||||
O Sortliste // Sortliste wird durchsucht
|
||||
JC Nw06
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=IndDB, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
|
||||
CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge")
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
O SFC_WRITE_PROT
|
||||
JC Nw06 // kein Indizier-DB vorhanden
|
||||
|
||||
|
||||
L IndDB_Laenge // Länge des Indizierten DB überschritten ?
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
L "DB_Länge"
|
||||
>I // Indizier-DB ist zu kurz
|
||||
JC Nw06 // Zeiger ausserhalb Ind.DB
|
||||
|
||||
L Stammdaten // Stammdaten
|
||||
L 3 // zu viele Stammdaten ?
|
||||
>=I // Ja !
|
||||
JC Nw06 // ohne Indizierung weiter
|
||||
|
||||
L IndDaten_FC // Offset zum Abziehen
|
||||
T Wandel_FC
|
||||
L 0 // Parameter vorhanden ?
|
||||
<=I // Nein
|
||||
JC NoFC // Bei diesem Schritt weiter
|
||||
|
||||
L Daten_1 // Stammdaten (1.DW)
|
||||
T "MW90" // übergeben
|
||||
L Daten_2 // Stammdaten (2.DW)
|
||||
T "MD94" // übergeben
|
||||
|
||||
UC DB[Wandel_FC] // Beeinflussung der Weiterfahrt
|
||||
|
||||
L "MW92" // Rückwert von FC
|
||||
|
||||
JU Ret
|
||||
|
||||
NoFC: L Daten_1 // Stammdaten
|
||||
Ret: T IndPointer // Stelle, wo Zeiger hinterlegt ist
|
||||
L 0
|
||||
<I // negativ
|
||||
JC Nw06 // Zeiger = 0
|
||||
|
||||
L IndDB_Laenge // Länge des Indizierten DB überschritten ?
|
||||
L IndPointer // Stelle, wo Zeiger hinterlegt ist
|
||||
<=I // Ja !
|
||||
JC Nw06 // Zeiger ausserhalb Ind.DB
|
||||
|
||||
L 2
|
||||
*I // DB byteorientiert
|
||||
SLD 3 // Pointer erzeugen
|
||||
T IndPointer // Pointer, wo Zeiger hinterlegt ist
|
||||
|
||||
OPN DB[IndDB] // Indizierter DB
|
||||
L DBW [IndPointer]
|
||||
T Schreibzeiger // Schreibzeiger
|
||||
|
||||
OPN DB[DBDatenliste] // Datenliste DB
|
||||
|
||||
SET
|
||||
S Indok // Indizierung möglich
|
||||
S IndZeiger_ok // Indizier-Zeiger angegeben
|
||||
|
||||
|
||||
--- NW 6: Kontrolle auf gleiche Stammdaten ---
|
||||
Nw06: L 0 // nicht gespeichert
|
||||
T LeerZeiger // Zeiger Leerzelle
|
||||
|
||||
L Schreibzeiger // Schreibzeiger
|
||||
L 0 // Angegeben ?
|
||||
==I // Nein !
|
||||
JC W600 // Suche bei 1.Datensatz beginnen
|
||||
|
||||
L Schreibzeiger // Schreibzeiger
|
||||
+ -20 // Zeiger 1.Daten
|
||||
L Datenblock_inBytes // Datenblocklänge in Bytes
|
||||
/I // Ermittlung der wievielten Daten -1
|
||||
SRD 16 // Rest ermitteln
|
||||
L 0 // = 0 ?
|
||||
<>I // Schreibzeiger nicht im Raster !
|
||||
JC W600 // Suche bei 1.Datensatz beginnen
|
||||
|
||||
L 0 // Bei angegebener Stelle suchen
|
||||
T Suchstelle // Such bei X-ten Datensatz
|
||||
|
||||
JU W601
|
||||
|
||||
W600: L 1 // Suche bei 1.Datensatz beginnen
|
||||
T Suchstelle // Such bei X-ten Datensatz
|
||||
SET
|
||||
R IndZeiger_ok // Indizier-Zeiger angegeben
|
||||
L SSDW
|
||||
+ 20 // Offset für 1.Daten
|
||||
T Schreibzeiger // Schreibzeiger
|
||||
|
||||
W601: L Schreibzeiger // Schreibzeiger
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
L InDaten_Pointer
|
||||
LAR2
|
||||
|
||||
L Stammdaten // Anzahl der Stammdaten
|
||||
L600: T Schleife
|
||||
|
||||
L DBInDaten // Indaten-DB
|
||||
L 0 // Angegeben ?
|
||||
==I // Nein
|
||||
JC W602
|
||||
|
||||
OPN DB[DBInDaten]
|
||||
|
||||
W602: L NoneW [AR2,] // Indaten überprüfen mit
|
||||
OPN DB[DBDatenliste]
|
||||
L DBW [AR1Zeiger] // Datenliste-Daten lesen
|
||||
<>I // nicht identisch !
|
||||
JC W603
|
||||
|
||||
L AR1Zeiger
|
||||
SRD 3
|
||||
L DINT#2
|
||||
+D
|
||||
SLD 3
|
||||
T AR1Zeiger
|
||||
|
||||
ADDAR2 P#2.0
|
||||
|
||||
L Schleife
|
||||
LOOP L600
|
||||
|
||||
L 2#0000_0000_1100_0000 // Daten werden gespeichert + überschrieben
|
||||
T tRE_VAL // Ok-Status
|
||||
|
||||
JU Nw07 // Datensatz ist in Liste enthalten
|
||||
|
||||
W603: L 0 // Suche bei 1.Datensatz begonnen
|
||||
L Suchstelle // Such bei X-ten Datensatz
|
||||
==I // Nein !
|
||||
JC W600
|
||||
|
||||
L LeerZeiger // Zeiger Leerzelle
|
||||
L 0 // Gespeichert ?
|
||||
<>I // Ja !
|
||||
JC W604
|
||||
|
||||
L Schreibzeiger // Schreibzeiger
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
L Datensatzlaenge
|
||||
L601: T Schleife
|
||||
L DBW [AR1Zeiger] // Daten lesen
|
||||
L 0 // Leerzelle ?
|
||||
<>I // Nein !
|
||||
JC W604
|
||||
|
||||
L AR1Zeiger
|
||||
SRD 3
|
||||
L DINT#2
|
||||
+D
|
||||
SLD 3
|
||||
T AR1Zeiger
|
||||
|
||||
L Schleife
|
||||
LOOP L601
|
||||
|
||||
L Schreibzeiger // Schreibzeiger
|
||||
T LeerZeiger // Zeiger Leerzelle
|
||||
|
||||
W604: L Suchstelle // Such bei X-ten Datensatz
|
||||
+ 1
|
||||
T Suchstelle // Such bei X-ten Datensatz
|
||||
L Listenlaenge // Anzahl aller Daten in Datenliste
|
||||
<=I // Alle Datensätze sind durchsucht
|
||||
JC W605 // Nein !
|
||||
|
||||
L 0 // Gefunden ?
|
||||
L LeerZeiger // Zeiger Leerzelle
|
||||
==I // Nein !
|
||||
JC Err2 // Datenliste ist voll
|
||||
|
||||
T Schreibzeiger // Schreibzeiger
|
||||
L 2#0000_0000_1000_0000 // Daten werden gespeichert
|
||||
T tRE_VAL // Ok-Status
|
||||
|
||||
JU Nw07
|
||||
|
||||
W605: L Datenblock_inBytes // Datenblocklänge in bytes
|
||||
L Schreibzeiger // Schreibzeiger
|
||||
+I
|
||||
T Schreibzeiger // Schreibzeiger
|
||||
JU W601
|
||||
|
||||
|
||||
--- NW 7: Quelle-Pointer erzeugen: ---
|
||||
Nw07: L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0
|
||||
T LW10 // Any-Kennung, Datentyp
|
||||
L Datensatzlaenge // Datenwords speichern
|
||||
T LW2
|
||||
T LW12 // Wiederholungen
|
||||
|
||||
// DATEN-Pointer übernehmen:
|
||||
L DBInDaten
|
||||
T LW4 // DB_Nummer
|
||||
L InDaten_Pointer
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
// Ziel-Pointer erzeugen:
|
||||
// Kennung + Datenbytes s.o.
|
||||
|
||||
L SSDB
|
||||
T LW14 // DB_Nummer
|
||||
L Schreibzeiger // Adresse
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD16 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // Datenliste-Daten speichern
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
|
||||
A Sortliste // Sortliste wird durchsucht
|
||||
JC Nw8
|
||||
|
||||
L SSDW
|
||||
+ 12
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
L Schreibzeiger // Schreibzeiger
|
||||
OPN DB[DBDatenliste]
|
||||
T DBW [AR1Zeiger] // Speicherung letzter Zugriff
|
||||
|
||||
L tRE_VAL // Ok-Status
|
||||
L 2#0000_0000_1100_0000 // Daten werden gespeichert + überschrieben ?
|
||||
==I // Ja !
|
||||
O Indok // Indizierung möglich ((Dann nicht!)
|
||||
JC Nw8 // Kein Neueintrag !
|
||||
|
||||
L SSDW
|
||||
+ 16 // Offset Anzahl Einträge
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
L DBW [AR1Zeiger] // Anzahl der Einträge
|
||||
+ 1 // Einträge +1
|
||||
T DBW [AR1Zeiger] // Anzahl der Einträge
|
||||
|
||||
|
||||
--- NW 8: Indizierung ok ? ---
|
||||
Nw8: AN Indok // Indizierung möglich
|
||||
O IndZeiger_ok // Indizier-Zeiger angegeben
|
||||
JC Ende
|
||||
|
||||
OPN DB[IndDB] // Indizierter DB
|
||||
|
||||
L Schreibzeiger // Schreibzeiger
|
||||
T DBW [IndPointer]
|
||||
|
||||
OPN DB[DBDatenliste] // Datenliste DB
|
||||
|
||||
|
||||
--- NW 9: Fehlerausgabe / RET_VAL ---
|
||||
Ende: SET // VKE = 1 ohne Fehler !!!
|
||||
L tRE_VAL // Ok-Status
|
||||
JU Ok
|
||||
Err0: L 2#0000_0000_0000_0001 // Kein Datenlistebereich
|
||||
JU Err
|
||||
Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler
|
||||
JU Err
|
||||
Err2: L 2#0000_0000_0000_0100 // Datenliste ist voll
|
||||
JU Err
|
||||
Err4: L 2#0000_0000_0001_0000 // Undefinierte Indaten
|
||||
|
||||
Err: CLR // VKE = 0 bei Fehler !!!
|
||||
|
||||
Ok: T tRE_VAL
|
||||
SAVE // VKE in BIE-Bit speichern
|
||||
|
||||
L AR2_Speicher // AR2 zurückspeichern
|
||||
LAR2
|
||||
|
||||
|
||||
--- NW 10: Ausgangsvariablen schreiben ---
|
||||
L tRE_VAL
|
||||
T RE_VAL
|
||||
|
||||
|
||||
@@ -0,0 +1,488 @@
|
||||
=== FC 88: DatenInSort [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
SSDB : Int // Datenlisten-DB
|
||||
SSDW : Int // Datenlisten-1.DW
|
||||
INDATEN : Pointer // InDaten-Schnittstelle
|
||||
Output:
|
||||
RE_VAL : Byte // Rückmeldung
|
||||
InOut:
|
||||
Temp:
|
||||
Quelle : Any // Zeiger, wo Rein-Daten sind
|
||||
Ziel : Any // Zeiger, FIFO-Stelle
|
||||
Kopf : Byte // Datenliste-Kennnung (DA)
|
||||
Datensatzlaenge : Byte // Datensatzlänge in Word (01 - F0) F0=128
|
||||
Listenlaenge : Int // Länge der Datenliste (maximale Anzahl der Datensätze)
|
||||
Stammdaten : Int // Stammdatenlänge in Word (1 - 9)
|
||||
Belegt06 : Int // reserviert von Datenliste
|
||||
Belegt08 : Int // reserviert von Datenliste
|
||||
Belegt10 : Int // reserviert von Datenliste
|
||||
Belegt12 : Int // reserviert von Datenliste
|
||||
AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze
|
||||
Reserve16 : Int // Reserve
|
||||
Reserve18 : Int // Reserve
|
||||
DBDatenliste : Word // Datenlisten-DB
|
||||
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
|
||||
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
|
||||
Datenlisten_Ende : Word // Ende der Datenliste
|
||||
AR2_Speicher : DWord // Adress-Register 2 zwischenspeichern
|
||||
Schleife : Word // Loopzähler
|
||||
DBInDaten : Word // Indaten-DB, falls angegeben
|
||||
InDaten_Pointer : DWord // In-Daten-Pointer: Kennung, Adresse
|
||||
InDaten_Startpunkt : Word // In-Daten-Startpunkt: Adresse
|
||||
Sort_Daten : DInt // Einzusortierende Daten (DWord)
|
||||
Datenblock_inBytes : Word // Datenblocklänge in Bytes
|
||||
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
|
||||
Lesestelle : Int // An dieser Stelle Datensatz lesen
|
||||
Min_Lesestelle : Int // Minimal sinnvolle Lesestelle
|
||||
Max_Lesestelle : Int // Maximal sinnvolle Lesestelle
|
||||
Savestelle : Int // An dieser Stelle wird In-Datensatz gespeichert
|
||||
Lese_Daten : DInt // In Tabelle gelesenen Daten
|
||||
Holstelle : Int // Freiraum schaffen: Stelle zum Daten holen
|
||||
Bringstelle : Int // Freiraum schaffen: Stelle zum Daten schreiben
|
||||
Holzeiger : DWord // Freiraum schaffen: Zeiger zum Daten holen
|
||||
Bringzeiger : DWord // Freiraum schaffen: Zeiger zum Daten schreiben
|
||||
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
|
||||
--- NW 1: Schnittstellen-DB sinnvoll ? ---
|
||||
TAR2
|
||||
T AR2_Speicher // AR2 zwischenspeichern
|
||||
|
||||
L SSDB
|
||||
T DBDatenliste
|
||||
|
||||
// CALL TEST_DB
|
||||
// DB_NUMBER :=#DBDatenliste
|
||||
// RET_VAL :=#SFC_RET_VAL
|
||||
// DB_LENGTH :=#SFC_DB_LENGTH
|
||||
// WRITE_PROT :=#SFC_WRITE_PROT
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBDatenliste, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
O SFC_WRITE_PROT
|
||||
JC Err0 // kein Datenlisten-Bereich
|
||||
|
||||
|
||||
--- NW 2: Quelle-Pointer erzeugen: ---
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0 // Any-Kennung, Datentyp
|
||||
L 16#000A // 10 Dw´s holen
|
||||
T LW2 // Wiederholungen
|
||||
L SSDB
|
||||
T LW4 // DB_Nummer
|
||||
L SSDW // Adresse
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 10) // 1.-10.DW Datenliste holen
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
|
||||
|
||||
--- NW 3: Zeigerüberprüfung ---
|
||||
L Kopf // Datenliste-Kopf
|
||||
L 16#DB // = Datenlistekennung ?
|
||||
<>I // Nein !
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 1
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 128
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 1
|
||||
L Listenlaenge // Max.Anzahl von Datenblöcken
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 1
|
||||
L Stammdaten // Anzahl der Stammdaten
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 9
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L Stammdaten // Anzahl der Stammdaten
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L Listenlaenge // Länge der Datenliste
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
*I
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
+ 20 // Speichern ab 10.DW
|
||||
L SSDW
|
||||
+I
|
||||
T Datenlisten_Ende
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
|
||||
L Datenlisten_Ende
|
||||
L SFC_DB_LENGTH
|
||||
>I // Datenlisten-DB ist zu kurz!
|
||||
JC Err0 // kein Datenlisten-Bereich
|
||||
|
||||
L DBW [AR1Zeiger]
|
||||
L 16#DBEE // Datenliste-Endekennung ?
|
||||
<>I // Nein !
|
||||
JC Err0 // kein Datenlisten-Bereich
|
||||
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
L 2
|
||||
*I
|
||||
T Datenblock_inBytes // Datenblocklänge in Bytes
|
||||
|
||||
L AnzahlEintraege // Anzahl der eingetragenen Datensätze
|
||||
L Listenlaenge // Max.Anzahl von Datenblöcken
|
||||
>=I // Nein !
|
||||
JC Err2 // Datenliste ist voll
|
||||
|
||||
|
||||
--- NW 4: Indaten definiert ? ---
|
||||
|
||||
// In-DATEN-Pointer übernehmen:
|
||||
L P#
|
||||
LAR2
|
||||
|
||||
L NoneW [AR2,]
|
||||
T DBInDaten // Indaten-DB
|
||||
|
||||
L DBInDaten // Indaten-DB
|
||||
L 0 // Angegeben ?
|
||||
==I // Nein
|
||||
JC W401
|
||||
|
||||
// CALL TEST_DB
|
||||
// DB_NUMBER :=#DBInDaten
|
||||
// RET_VAL :=#SFC_RET_VAL
|
||||
// DB_LENGTH :=#SFC_DB_LENGTH
|
||||
// WRITE_PROT :=#SFC_WRITE_PROT
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBInDaten, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000 // Fehler vorhanden ?
|
||||
<>I // Ja !
|
||||
JC Err4 // Undefinierte Indaten
|
||||
|
||||
L NoneD [AR2,] // Kennung, Adresse
|
||||
L 16#00FF_FFFF // Ohne Kennung
|
||||
AW
|
||||
SRW 3 // Ohne Bit
|
||||
T InDaten_Startpunkt
|
||||
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
L InDaten_Startpunkt
|
||||
+I
|
||||
L SFC_DB_LENGTH
|
||||
>I // Indaten-DB ist zu kurz
|
||||
JC Err4 // Undefinierte Indaten
|
||||
|
||||
W401: L NoneD [AR2,] // Kennung, Adresse
|
||||
T InDaten_Pointer
|
||||
LAR2
|
||||
|
||||
L DBInDaten // Indaten-DB
|
||||
L 0 // Angegeben ?
|
||||
==I // Nein
|
||||
JC W402
|
||||
|
||||
OPN DB[DBInDaten]
|
||||
|
||||
W402: L NoneD [AR2,] // Indaten überprüfen
|
||||
T Sort_Daten // 1.Indaten speichern
|
||||
|
||||
L Stammdaten
|
||||
L400: T Schleife
|
||||
|
||||
L DBInDaten // Indaten-DB
|
||||
L 0 // Angegeben ?
|
||||
==I // Nein
|
||||
JC W403
|
||||
|
||||
OPN DB[DBInDaten]
|
||||
|
||||
W403: L NoneW [AR2,] // Indaten überprüfen
|
||||
L 0 // Etwas angegeben ?
|
||||
<>I // Ja !
|
||||
JC Nw05 // Weiter
|
||||
|
||||
ADDAR2 P#2.0
|
||||
|
||||
L Schleife
|
||||
LOOP L400
|
||||
|
||||
JU Err4 // Undefinierte Indaten
|
||||
|
||||
Nw05: NOP 0
|
||||
|
||||
|
||||
--- NW 5: Minimale + maximale Lesestelle am Anfang ---
|
||||
L 1
|
||||
T Min_Lesestelle // Minimal sinnvolle Lesestelle
|
||||
|
||||
L AnzahlEintraege // Anzahl der eingetragenen Datensätze
|
||||
T Max_Lesestelle // Maximal sinnvolle Lesestelle
|
||||
|
||||
// Sonderfall: noch kein Eintrag:
|
||||
L 0 // Eintrag schon vorhanden ?
|
||||
>I // Ja !
|
||||
JC en05
|
||||
|
||||
L 1 // An 1.Stelle speichern
|
||||
T Savestelle // Adresse
|
||||
|
||||
JU Save
|
||||
|
||||
en05: NOP 0
|
||||
|
||||
|
||||
--- NW 6: Aktuelle Lesestelle errechnen ---
|
||||
New: L Max_Lesestelle // Maximal sinnvolle Lesestelle
|
||||
+ 1
|
||||
L Min_Lesestelle // Minimal sinnvolle Lesestelle
|
||||
-I
|
||||
L 2
|
||||
/I
|
||||
L Min_Lesestelle // Minimal sinnvolle Lesestelle
|
||||
+I
|
||||
T Lesestelle // An dieser Stelle Datensatz lesen
|
||||
|
||||
|
||||
--- NW 7: Daten an Lesestelle auslesen ---
|
||||
L Lesestelle // An dieser Stelle Datensatz lesen
|
||||
+ -1
|
||||
L Datenblock_inBytes // Datenblocklänge in Bytes
|
||||
*I
|
||||
L SSDW
|
||||
+I
|
||||
+ 20 // Offset für 1.Daten
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
L DBD [AR1Zeiger] // Datenliste-Daten lesen
|
||||
T Lese_Daten // In Tabelle gelesenen Daten
|
||||
L 0 // Nichts gespeicher oder negativ ?
|
||||
<=D // Ja !
|
||||
JC Err5
|
||||
|
||||
|
||||
--- NW 8: Suche fertig ? ---
|
||||
L Max_Lesestelle // Maximal sinnvolle Lesestelle
|
||||
L Min_Lesestelle // Minimal sinnvolle Lesestelle
|
||||
-I
|
||||
L 0 // Suche fertig ?
|
||||
<I // Ja !
|
||||
JC ok
|
||||
|
||||
|
||||
--- NW 9: Gelesene Daten auswerten ---
|
||||
L Sort_Daten // Einzusortierende Daten
|
||||
L Lese_Daten // In Tabelle gelesenen Daten
|
||||
>D // Sort > Tabelle
|
||||
JC MinP
|
||||
|
||||
L Sort_Daten // Einzusortierende Daten
|
||||
>D // Tabelle > Sort
|
||||
JC MaxM
|
||||
|
||||
L Lesestelle // An dieser Stelle Datensatz lesen
|
||||
T Savestelle // An dieser Stelle wird In-Datensatz gespeichert
|
||||
|
||||
JC Frei // Freiplatz schaffen
|
||||
|
||||
MinP: L Lesestelle // An dieser Stelle Datensatz lesen
|
||||
+ 1
|
||||
T Min_Lesestelle // Minimal sinnvolle Lesestelle
|
||||
|
||||
L Max_Lesestelle // Maximal sinnvolle Lesestelle
|
||||
>I // Suche ist fertig
|
||||
JC ok
|
||||
|
||||
JU New
|
||||
|
||||
MaxM: L Lesestelle // An dieser Stelle Datensatz lesen
|
||||
+ -1
|
||||
T Max_Lesestelle // Maximal sinnvolle Lesestelle
|
||||
|
||||
L Min_Lesestelle // Minimal sinnvolle Lesestelle
|
||||
<I // Suche ist fertig
|
||||
JC ok
|
||||
|
||||
JU New
|
||||
|
||||
|
||||
--- NW 10: Speicherstelle ermitteln ---
|
||||
ok: L Sort_Daten // Einzusortierende Daten
|
||||
L Lese_Daten // In Tabelle gelesenen Daten
|
||||
>D // Sort > Tabelle
|
||||
JC Plus
|
||||
|
||||
L Lesestelle // An dieser Stelle Datensatz lesen
|
||||
T Savestelle // An dieser Stelle wird In-Datensatz gespeichert
|
||||
|
||||
JU Frei // Freiplatz schaffen
|
||||
|
||||
Plus: L Lesestelle // An dieser Stelle Datensatz lesen
|
||||
+ 1
|
||||
T Savestelle // An dieser Stelle wird In-Datensatz gespeichert
|
||||
|
||||
|
||||
--- NW 11: Freiraum für Speicherung schaffen ---
|
||||
Frei: L Savestelle // An dieser Stelle wird In-Datensatz gespeichert
|
||||
T "MW240"
|
||||
L AnzahlEintraege // Anzahl der eingetragenen Datensätze
|
||||
>I // Eintrag ans Ende !
|
||||
JC Save
|
||||
|
||||
L AnzahlEintraege // Anzahl der eingetragenen Datensätze
|
||||
L Datenblock_inBytes // Datenblocklänge in Bytes
|
||||
*I
|
||||
L SSDW
|
||||
+I
|
||||
+ 20 // Offset für 1.Daten
|
||||
+ -2 // Letzte Daten letzter Eintrag
|
||||
T Holstelle // Freiraum schaffen: Stelle zum Daten holen
|
||||
|
||||
L Holstelle // Freiraum schaffen: Stelle zum Daten holen
|
||||
L Datenblock_inBytes // Datenblocklänge in Bytes
|
||||
+I
|
||||
T Bringstelle // Freiraum schaffen: Zeiger zum Daten schreiben
|
||||
|
||||
L AnzahlEintraege // Anzahl der eingetragenen Datensätze
|
||||
L Savestelle // An dieser Stelle wird In-Datensatz gespeichert
|
||||
-I
|
||||
+ 1
|
||||
L Datenblock_inBytes // Datenblocklänge in Bytes
|
||||
*I
|
||||
L 2 // da DW-Zugriff (2Byte)
|
||||
/I
|
||||
L110: T Schleife
|
||||
|
||||
L Holstelle // Freiraum schaffen: Stelle zum Daten holen
|
||||
ITD
|
||||
SLD 3
|
||||
T Holzeiger // Freiraum schaffen: Zeiger zum Daten holen
|
||||
L Bringstelle // Freiraum schaffen: Zeiger zum Daten schreiben
|
||||
ITD
|
||||
SLD 3
|
||||
T Bringzeiger // Freiraum schaffen: Zeiger zum Daten schreiben
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
|
||||
L DBW [Holzeiger] // Datenliste-Daten lesen
|
||||
T DBW [Bringzeiger] // Datenliste-Daten verschieben
|
||||
|
||||
L Holstelle
|
||||
+ -2 // 2 Byte wegen DW-Zugriff
|
||||
T Holstelle // Freiraum schaffen: Stelle zum Daten holen
|
||||
|
||||
L Bringstelle
|
||||
+ -2 // 2 Byte wegen DW-Zugriff
|
||||
T Bringstelle // Freiraum schaffen: Zeiger zum Daten schreiben
|
||||
|
||||
L Schleife
|
||||
LOOP L110
|
||||
|
||||
|
||||
--- NW 12: Daten in Datenliste schreiben ---
|
||||
// Quelle-Pointer erzeugen:
|
||||
|
||||
Save: L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0
|
||||
T LW10 // Any-Kennung, Datentyp
|
||||
L Datensatzlaenge // Datenwords speichern
|
||||
T LW2
|
||||
T LW12 // Wiederholungen
|
||||
|
||||
// DATEN-Pointer übernehmen:
|
||||
L DBInDaten
|
||||
T LW4 // DB_Nummer
|
||||
L InDaten_Pointer
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
// Ziel-Pointer erzeugen:
|
||||
// Kennung + Datenbytes s.o.
|
||||
|
||||
L SSDB
|
||||
T LW14 // DB_Nummer
|
||||
L Savestelle // Adresse
|
||||
+ -1
|
||||
L Datenblock_inBytes // Datenblocklänge in Bytes
|
||||
*I
|
||||
L SSDW
|
||||
+I
|
||||
+ 20 // Offset für 1.Daten
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD16 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // Datenliste-Daten speichern
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
|
||||
L SSDW
|
||||
+ 14 // Anzahl der Einträge
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
L DBW [AR1Zeiger] // Anzahl der Einträge
|
||||
+ 1 // Einträge +1
|
||||
T DBW [AR1Zeiger] // Anzahl der Einträge
|
||||
|
||||
|
||||
--- NW 13: Fehlerausgabe / RET_VAL ---
|
||||
SET // VKE = 1 ohne Fehler !!!
|
||||
L 2#0000_0000_1000_0000 // Daten wurden gespeichert
|
||||
JU Ok_Mig
|
||||
Err0: L 2#0000_0000_0000_0001 // Kein Datenlistebereich
|
||||
JU Err
|
||||
Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler
|
||||
JU Err
|
||||
Err2: L 2#0000_0000_0000_0100 // Datenliste ist voll
|
||||
JU Err
|
||||
Err4: L 2#0000_0000_0001_0000 // Undefinierte Indaten
|
||||
JU Err
|
||||
Err5: L 2#0000_0000_0010_0000 // Gespeicherte Daten <= 0 (Inhalt ungültig)
|
||||
|
||||
Err: CLR // VKE = 0 bei Fehler !!!
|
||||
|
||||
Ok_Mig: T RE_VAL
|
||||
SAVE // VKE in BIE-Bit speichern
|
||||
|
||||
L AR2_Speicher // AR2 zurückspeichern
|
||||
LAR2
|
||||
|
||||
@@ -0,0 +1,894 @@
|
||||
=== FC 86: DatenOut [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
SSDB : Int // Datenlisten-DB
|
||||
SSDW : Int // Datenlisten-1.DW
|
||||
PARA : Word // Aufrufparameter (Auftrag / Anzahl Zusatzdaten)
|
||||
SEARCHDATEN : Pointer // Such-Daten-Schnittstelle
|
||||
Output:
|
||||
RE_VAL : Byte // Rückmeldung
|
||||
OUTDATEN : Pointer // OutDaten-Schnittstelle
|
||||
Position : Int // Daten stehen an angegebener Position in Datenbank
|
||||
InOut:
|
||||
Temp:
|
||||
Quelle : Any // Zeiger, wo Rein-Daten sind
|
||||
Ziel : Any // Zeiger, FIFO-Stelle
|
||||
Kopf : Byte // Datenliste-Kennnung (DA)
|
||||
Datensatzlaenge : Byte // Datensatzlänge in Word (01 - F0) F0=128
|
||||
Listenlaenge : Int // Länge der Datenliste (maximale Anzahl der Datensätze)
|
||||
Stammdaten : Int // Stammdatenlänge in Word (1 - 9)
|
||||
IndDB : Word // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!)
|
||||
IndDB_Laenge : Int // Länge des indizierten DB in Einträge (nur bei Stammdaten = 1 erlaubt !!!)
|
||||
IndDaten_FC : Int // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!)
|
||||
Suchzeiger : Int // Speicherung des letzten Zugriffs / Suchzeiger
|
||||
Belegt14 : Int // reserviert von Sort-Datenliste
|
||||
AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!)
|
||||
Reserve18 : Int // Reserve
|
||||
Para1 : Byte // 1.Aufrufparameter
|
||||
Para2 : Byte // 2.Aufrufparameter
|
||||
DBDatenliste : Word // Datenlisten-DB
|
||||
OffsetDaten_1 : Int // Stammdaten beginnen ab hier
|
||||
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
|
||||
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
|
||||
Datenlisten_Ende : Int // Ende der Datenliste
|
||||
AR2_Speicher : DWord // Adress-Register 2 zwischenspeichern
|
||||
Schleife : Word // Loopzähler
|
||||
DBSuchDaten : Word // Such-Daten-DB, falls angegeben
|
||||
SuchDaten_Pointer : DWord // Such-Daten-Pointer: Kennung, Adresse
|
||||
SuchDaten_Startpunkt : Word // Such-Daten-Startpunkt: Adresse
|
||||
DBOutDaten : Word // Out-Daten-DB, falls angegeben
|
||||
OutDaten_Pointer : DWord // Out-Daten-Pointer: Kennung, Adresse
|
||||
OutDaten_Startpunkt : Word // Out-Daten-Startpunkt: Adresse
|
||||
IndPointer : DWord // Zeiger für IndDB
|
||||
Daten_1 : Word // 1.Datenwort der Indaten
|
||||
Daten_2 : DWord // 1+2.Datenwort der Indaten (falls ind.Suchen mit Stammdaten 2)
|
||||
Datenblock_inBytes : Word // Datenblocklänge in Bytes
|
||||
Suchstelle : Word // Bei angegebenen Datensatz suchen
|
||||
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
|
||||
Indok : Bool // Indizierung möglich
|
||||
IndZeiger_ok : Bool // Indizier-Zeiger angegeben
|
||||
Weitersuchen : Bool // Weitersuchen ist aktiv
|
||||
Offsetsuchen : Bool // Offsetsuchen ist aktiv
|
||||
Sortliste : Bool // Sortliste wird durchsucht
|
||||
WandelFC : Bool // Wnadel-FC für ind.Suchen vorhanden
|
||||
tRE_VAL : Byte // Rückmeldung
|
||||
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
DB_Länge : Int
|
||||
NichtCopy : Int // Datenmenge, die nicht vorschoben wird
|
||||
LoeschPos : Word // Lösch-Position
|
||||
Wandel_FC : Word // Wandel-FC
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
|
||||
--- NW 1: Schnittstellen-DB sinnvoll ? ---
|
||||
TAR2
|
||||
T AR2_Speicher // AR2 zwischenspeichern
|
||||
|
||||
L SSDB
|
||||
T DBDatenliste
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBDatenliste, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
|
||||
CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge")
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
O SFC_WRITE_PROT // schreibgeschützt
|
||||
JC Err0 // kein Datenlisten-Bereich
|
||||
|
||||
|
||||
--- NW 2: Quelle-Pointer erzeugen: ---
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0 // Any-Kennung, Datentyp
|
||||
L 16#000A // 10 Dw´s holen
|
||||
T LW2 // Wiederholungen
|
||||
L SSDB
|
||||
T LW4 // DB_Nummer
|
||||
L SSDW // Adresse
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 10) // 1.-10.DW Datenliste holen
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
|
||||
|
||||
--- NW 3: Zeigerüberprüfung ---
|
||||
L Kopf // Datenliste-Kopf
|
||||
L 16#DB // = Sort-Datenlistekennung ?
|
||||
==I // Ja !
|
||||
= Sortliste // Sortliste wird durchsucht
|
||||
JC w030
|
||||
|
||||
CAC
|
||||
L 16#DA // = Datenlistekennung ?
|
||||
<>I // Nein !
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
w030: L 1
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 128
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 1
|
||||
L Listenlaenge // Max.Anzahl von Datenblöcken
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 1
|
||||
L Stammdaten // Anzahl der Stammdaten
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 9
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L Stammdaten // Anzahl der Stammdaten
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L Listenlaenge // Länge der Datenliste
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
*I
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
+ 20 // Speichern ab 10.DW
|
||||
L SSDW
|
||||
+I
|
||||
T Datenlisten_Ende
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
|
||||
L Datenlisten_Ende
|
||||
L "DB_Länge"
|
||||
>I // Datenlisten-DB ist zu kurz!
|
||||
JC Err0 // kein Datenlisten-Bereich
|
||||
|
||||
L DBW [AR1Zeiger]
|
||||
L 16#DAEE // Datenliste-Endekennung ?
|
||||
<>I // Nein !
|
||||
A(
|
||||
CAC
|
||||
L 16#DBEE // Sort-Datenliste-Endekennung ?
|
||||
<>I // Nein !
|
||||
)
|
||||
JC Err0 // kein Datenlisten-Bereich
|
||||
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
L 2
|
||||
*I
|
||||
T Datenblock_inBytes // Datenblocklänge in Bytes
|
||||
|
||||
|
||||
--- NW 4: Auftrag kontrollieren ---
|
||||
SET
|
||||
R Indok // Indizierung möglich
|
||||
R IndZeiger_ok // Indizier-Zeiger angegeben
|
||||
R Weitersuchen // Weitersuchen ist aktiv
|
||||
R Offsetsuchen // Offsetsuchen ist aktiv
|
||||
L 0 // Vorerst kein Offset
|
||||
T OffsetDaten_1
|
||||
|
||||
L PARA
|
||||
T LW40 // Aufrufparameter zwischenspeichern
|
||||
|
||||
L 16#00 // XX = 00 ?
|
||||
L Para1
|
||||
==I // Ja!
|
||||
JC W401
|
||||
|
||||
L 16#E1 // XX = E1 ?
|
||||
==I // Ja!
|
||||
A Sortliste // Sortliste wird durchsucht
|
||||
JC Err3 // Falscher Aufrufparameter (austragen nicht erlaubt !)
|
||||
|
||||
CAC
|
||||
L 16#E1 // XX = E1 ?
|
||||
==I // Ja!
|
||||
JC W401
|
||||
|
||||
L 16#F1 // XX = F1 ?
|
||||
L Para1
|
||||
<>I // Nein !
|
||||
JC W400
|
||||
|
||||
L Para2
|
||||
L 16#00
|
||||
<>I
|
||||
O Sortliste // Sortliste wird durchsucht
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
SET
|
||||
S Weitersuchen
|
||||
|
||||
L SSDW
|
||||
+ 20
|
||||
T Suchzeiger
|
||||
|
||||
JU Nw08 // OutDaten ok ?
|
||||
|
||||
W400: L 16#FF // XX = FF ?
|
||||
<>I // Nein !
|
||||
JC W403
|
||||
|
||||
L Para2
|
||||
L 16#00
|
||||
<>I
|
||||
O Sortliste // Sortliste wird durchsucht
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
SET
|
||||
S Weitersuchen
|
||||
|
||||
L Suchzeiger // Alter Suchzeiger
|
||||
L Datenblock_inBytes // Datenblocklänge in bytes
|
||||
+I // Nächsten Datensatz suchen
|
||||
T Suchzeiger // Neuer Suchzeiger
|
||||
|
||||
L Datenblock_inBytes // Datenblocklänge in bytes
|
||||
L Listenlaenge // Alle möglichen Einträge
|
||||
*I // Gesamtlänge
|
||||
L SSDW // Startpunkt
|
||||
+I
|
||||
+ 20 // Offset 1.Daten
|
||||
L Suchzeiger // Schreibzeiger
|
||||
>I // Noch nicht am Ende !
|
||||
JC Nw08 // OutDaten ok ?
|
||||
|
||||
JU Err2 // Listenende erreicht
|
||||
|
||||
W403: L 16#02 // XX < 02 ?
|
||||
L Para1
|
||||
>I // Ja!
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
L 16#80 // XX > 80 ?
|
||||
>I // Ja!
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
CAC
|
||||
L Datensatzlaenge // XX > Datensatzlänge
|
||||
>I // Ja!
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
CAC
|
||||
+ -1 // Angegebener Offset -1
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
T OffsetDaten_1 // Richtiger Offset der 1.Stammdaten
|
||||
|
||||
L 0
|
||||
T Suchzeiger // Suche ab Anfang
|
||||
|
||||
SET
|
||||
S Offsetsuchen
|
||||
|
||||
W401: L 16#00 // =0 ?
|
||||
L Para2 // 2.Aufrufparameter
|
||||
==I // Ja !
|
||||
JC W402
|
||||
|
||||
T Stammdaten // Anzahl der Stammdaten
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
>I
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
L 1
|
||||
L Stammdaten // Anzahl der Stammdaten
|
||||
>I
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
L 9
|
||||
>I
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
W402: AN Offsetsuchen
|
||||
JC Nw05
|
||||
|
||||
L Para1 // Offset
|
||||
+ -1
|
||||
L Stammdaten
|
||||
+I // Letzte Stammdaten zu groß ?
|
||||
L Datensatzlaenge
|
||||
>I // Ja!
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
|
||||
--- NW 5: Such-DATEN-Pointer übernehmen: ---
|
||||
Nw05: L 0
|
||||
T Suchzeiger // Suchzeiger
|
||||
|
||||
L P#
|
||||
LAR2
|
||||
|
||||
L NoneW [AR2,]
|
||||
T DBSuchDaten // Suchdaten-DB
|
||||
L NoneD [AR2,] // Kennung, Adresse
|
||||
T SuchDaten_Pointer
|
||||
|
||||
L DBSuchDaten // Suchdaten-DB
|
||||
L 0 // Angegeben ?
|
||||
==I // Nein
|
||||
JC W501
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBSuchDaten, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
|
||||
CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge")
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000 // Fehler vorhanden ?
|
||||
<>I // Ja !
|
||||
JC Err4 // Undefinierte Stammdaten
|
||||
|
||||
L NoneD [AR2,] // Kennung, Adresse
|
||||
L 16#00FF_FFFF // Ohne Kennung
|
||||
AW
|
||||
SRW 3 // Ohne Bit
|
||||
T SuchDaten_Startpunkt
|
||||
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
L SuchDaten_Startpunkt
|
||||
+I
|
||||
L "DB_Länge"
|
||||
>I // Suchdaten-DB ist zu kurz
|
||||
JC Err4 // Undefinierte Stammdaten
|
||||
|
||||
W501: L SuchDaten_Pointer
|
||||
LAR2
|
||||
|
||||
L DBSuchDaten // Suchdaten-DB
|
||||
L 0 // Angegeben ?
|
||||
==I // Nein
|
||||
JC W502
|
||||
|
||||
OPN DB[DBSuchDaten]
|
||||
|
||||
W502: L NoneW [AR2,] // Suchdaten überprüfen
|
||||
T Daten_1 // 1.Suchdaten speichern
|
||||
L NoneD [AR2,] // Suchdaten überprüfen
|
||||
T Daten_2 // 1.Suchdaten speichern
|
||||
|
||||
L Stammdaten
|
||||
L500: T Schleife
|
||||
|
||||
L DBSuchDaten // Suchdaten-DB
|
||||
L 0 // Angegeben ?
|
||||
==I // Nein
|
||||
JC W503
|
||||
|
||||
OPN DB[DBSuchDaten]
|
||||
|
||||
W503: L NoneW [AR2,] // Suchdaten überprüfen
|
||||
L 0 // Etwas angegeben ?
|
||||
<>I // Ja !
|
||||
JC Nw06 // Weiter
|
||||
|
||||
ADDAR2 P#2.0
|
||||
|
||||
L Schleife
|
||||
LOOP L500
|
||||
|
||||
JU Err4 // Undefinierte Stammdaten
|
||||
|
||||
|
||||
--- NW 6: Indiziert suchen ? ---
|
||||
Nw06: L IndDB // Indizierter DB
|
||||
L 0 // =0 ?
|
||||
==I // Kein indizierter DB !
|
||||
O Offsetsuchen
|
||||
O Sortliste // Sortliste wird durchsucht
|
||||
JC Nw07
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=IndDB, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
|
||||
CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge")
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
O SFC_WRITE_PROT
|
||||
JC Nw07 // kein Indizier-DB vorhanden
|
||||
|
||||
L IndDB_Laenge // Länge des Indizierten DB überschritten ?
|
||||
L DINT#2 // DB byteorientiert
|
||||
*D
|
||||
L "DB_Länge"
|
||||
>I // Indizier-DB ist zu kurz
|
||||
JC Nw07 // Zeiger ausserhalb Ind.DB
|
||||
|
||||
L Stammdaten // Stammdaten
|
||||
L 3 // zu viele Stammdaten ?
|
||||
>=I // Ja !
|
||||
JC Nw07 // ohne Indizierung weiter
|
||||
|
||||
L IndDaten_FC // Offset zum Abziehen
|
||||
T Wandel_FC
|
||||
L 0 // Parameter vorhanden ?
|
||||
<=I // Nein
|
||||
JC NoFC // Bei diesem Schritt weiter
|
||||
|
||||
L Daten_1 // Stammdaten (1.DW)
|
||||
T "MW90" // übergeben
|
||||
L Daten_2 // Stammdaten (2.DW)
|
||||
T "MD94" // übergeben
|
||||
|
||||
UC DB[Wandel_FC] // Beeinflussung der Weiterfahrt
|
||||
|
||||
L "MW92" // Rückwert von FC
|
||||
|
||||
JU Ret
|
||||
|
||||
NoFC: L Daten_1 // Stammdaten
|
||||
Ret: T IndPointer // Stelle, wo Zeiger hinterlegt ist
|
||||
L 0
|
||||
<I // negativ
|
||||
JC Nw07 // Zeiger = 0
|
||||
|
||||
L IndDB_Laenge // Länge des Indizierten DB überschritten ?
|
||||
L IndPointer // Stelle, wo Zeiger hinterlegt ist
|
||||
<=I // Ja !
|
||||
JC Nw07 // Zeiger ausserhalb Ind.DB
|
||||
|
||||
L 2
|
||||
*I // DB byteorientiert
|
||||
ITD
|
||||
SLD 3 // Pointer erzeugen
|
||||
T IndPointer // Pointer, wo Zeiger hinterlegt ist
|
||||
|
||||
OPN DB[IndDB] // Indizierter DB
|
||||
L DBW [IndPointer]
|
||||
T Suchzeiger // Suchzeiger
|
||||
|
||||
OPN DB[DBDatenliste] // Datenliste DB
|
||||
|
||||
SET
|
||||
S Indok // Indizierung möglich
|
||||
S IndZeiger_ok // Indizier-Zeiger angegeben
|
||||
|
||||
|
||||
--- NW 7: Kontrolle auf gleiche Stammdaten ---
|
||||
Nw07: L Suchzeiger // Suchzeiger
|
||||
L 0 // Angegeben ?
|
||||
==I // Nein !
|
||||
JC W700 // Suche bei 1.Datensatz beginnen
|
||||
|
||||
L Suchzeiger // Suchzeiger
|
||||
+ -20 // Zeiger 1.Daten
|
||||
L Datenblock_inBytes // Datenblocklänge in Bytes
|
||||
/I // Ermittlung der wievielten Daten -1
|
||||
SRD 16 // Rest ermitteln
|
||||
L 0 // = 0 ?
|
||||
<>I // Suchzeiger nicht im Raster !
|
||||
JC W700 // Suche bei 1.Datensatz beginnen
|
||||
|
||||
L 0 // Bei angegebener Stelle suchen
|
||||
T Suchstelle // Such bei X-ten Datensatz
|
||||
|
||||
JU W701
|
||||
|
||||
W700: L 1 // Suche bei 1.Datensatz beginnen
|
||||
T Suchstelle // Such bei X-ten Datensatz
|
||||
SET
|
||||
R IndZeiger_ok // Indizier-Zeiger angegeben
|
||||
L SSDW
|
||||
+ 20 // Offset für 1.Daten
|
||||
T Suchzeiger // Suchzeiger
|
||||
|
||||
W701: L Suchzeiger // Suchzeiger
|
||||
L OffsetDaten_1 // Richtiger Offset der 1.Stammdaten
|
||||
+I
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
L SuchDaten_Pointer
|
||||
LAR2
|
||||
|
||||
L Stammdaten // Anzahl der Stammdaten
|
||||
L700: T Schleife
|
||||
|
||||
L DBSuchDaten // Suchdaten-DB
|
||||
L 0 // Angegeben ?
|
||||
==I // Nein
|
||||
JC W702
|
||||
|
||||
OPN DB[DBSuchDaten]
|
||||
|
||||
W702: L NoneW [AR2,] // Suchdaten überprüfen mit
|
||||
OPN DB[DBDatenliste]
|
||||
L DBW [AR1Zeiger] // Datenliste-Daten lesen
|
||||
<>I // nicht identisch !
|
||||
JC W703
|
||||
|
||||
L AR1Zeiger
|
||||
SRD 3
|
||||
L DINT#2
|
||||
+D
|
||||
SLD 3
|
||||
T AR1Zeiger
|
||||
|
||||
ADDAR2 P#2.0
|
||||
|
||||
L Schleife
|
||||
LOOP L700
|
||||
|
||||
L 2#0000_0000_1000_0000 // Daten sind vorhanden
|
||||
T tRE_VAL // Ok-Status
|
||||
|
||||
JU Nw08 // Datensatz ist in Liste enthalten
|
||||
|
||||
W703: L 0 // Suche bei 1.Datensatz begonnen
|
||||
L Suchstelle // Such bei X-ten Datensatz
|
||||
==I // Nein !
|
||||
JC W700
|
||||
|
||||
L Suchstelle // Such bei X-ten Datensatz
|
||||
+ 1
|
||||
T Suchstelle // Such bei X-ten Datensatz
|
||||
L Listenlaenge // Anzahl aller Daten in Datenliste
|
||||
<=I // Alle Datensätze sind durchsucht
|
||||
JC W705 // Nein !
|
||||
|
||||
JU Err6 // Datensatz ist nicht vorhanden
|
||||
|
||||
W705: L Datenblock_inBytes // Datenblocklänge in bytes
|
||||
L Suchzeiger // Suchzeiger
|
||||
+I
|
||||
T Suchzeiger // Suchzeiger
|
||||
JU W701
|
||||
|
||||
|
||||
--- NW 8: Out-DATEN-Pointer übernehmen: ---
|
||||
Nw08: L P#
|
||||
LAR2
|
||||
|
||||
L NoneW [AR2,]
|
||||
T DBOutDaten // Outdaten-DB
|
||||
L NoneD [AR2,] // Kennung, Adresse
|
||||
T OutDaten_Pointer
|
||||
|
||||
L DBOutDaten // Outdaten-DB
|
||||
L 0 // Angegeben ?
|
||||
==I // Nein
|
||||
JC Nw09
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBOutDaten, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
|
||||
CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge")
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000 // Fehler vorhanden ?
|
||||
<>I // Ja !
|
||||
JC Err5 // Undefinierte Outdaten
|
||||
|
||||
L NoneD [AR2,] // Kennung, Adresse
|
||||
L 16#00FF_FFFF // Ohne Kennung
|
||||
AW
|
||||
SRW 3 // Ohne Bit
|
||||
T OutDaten_Startpunkt
|
||||
|
||||
L OutDaten_Startpunkt
|
||||
L "DB_Länge"
|
||||
>I // Outdaten-DB ist zu kurz
|
||||
JC Err5 // Undefinierte Outdaten
|
||||
|
||||
|
||||
--- NW 9: Quelle-Pointer erzeugen: ---
|
||||
Nw09: L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0
|
||||
T LW10 // Any-Kennung, Datentyp
|
||||
L Datensatzlaenge // Datenwords speichern
|
||||
T LW2
|
||||
T LW12 // Wiederholungen
|
||||
|
||||
// DATEN-Pointer übernehmen:
|
||||
L SSDB
|
||||
T LW4 // DB_Nummer
|
||||
L Suchzeiger // Adresse
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
// Ziel-Pointer erzeugen:
|
||||
// Kennung + Datenbytes s.o.
|
||||
|
||||
L DBOutDaten
|
||||
T LW14 // DB_Nummer
|
||||
L OutDaten_Pointer
|
||||
T LD16 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // Datenliste-Daten speichern
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
|
||||
A SFC_WRITE_PROT // Datenliste kann nicht beschrieben werden
|
||||
JC Nw10
|
||||
|
||||
L SSDW
|
||||
+ 12 // Offset letzter Zugriff
|
||||
ITD
|
||||
SLD 3 // Pointer erzeugen
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
L Suchzeiger // Suchzeiger
|
||||
OPN DB[DBDatenliste]
|
||||
T DBW [AR1Zeiger] // Speicherung letzter Zugriff
|
||||
|
||||
L Suchstelle // Such bei X-ten Datensatz
|
||||
T Position // Übergabe nach außen
|
||||
|
||||
|
||||
--- NW 10: Daten aus Datenliste löschen ? (nicht indiziert!) ---
|
||||
Nw10: L 16#E1 // Daten löschen ?
|
||||
L Para1 // 1.Aufrufparameter
|
||||
<>I // Nein !
|
||||
O SFC_WRITE_PROT // Datenliste kann nicht beschrieben werden
|
||||
JC Nw11
|
||||
|
||||
A Indok // Indizierung möglich
|
||||
JC X010 // Bei ind.Zugriff nur löschen, nicht verschieben, keine Anzahl!
|
||||
|
||||
// Gemeinsame Daten für Pointer erzeugen:
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0
|
||||
T LW10 // Any-Kennung, Datentyp
|
||||
|
||||
L Suchzeiger // Stelle, wo gelöscht werden soll
|
||||
+ -20
|
||||
L SSDW
|
||||
-I
|
||||
L Datenblock_inBytes // Datenblocklänge in bytes
|
||||
/I
|
||||
+ 1 // Stelle, die gelöscht werden soll
|
||||
T LoeschPos // Lösch-Position
|
||||
L Listenlaenge // Länge der Datenliste (Letzter Eintrag zum Löschen ?)
|
||||
==I // Ja !
|
||||
JC Last // Ohne Verschieben letzten Eintrag löschen
|
||||
|
||||
L LoeschPos // Lösch-Position
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
*I // Gesamtdatenlänge in Words
|
||||
T NichtCopy // Datenmenge, die nicht vorschoben wird
|
||||
|
||||
L Listenlaenge // Länge der Datenliste
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
*I // Gesamtdatenlänge in Words
|
||||
L NichtCopy // Datenmenge, die nicht vorschoben wird
|
||||
-I // abziehen
|
||||
T LW2
|
||||
T LW12 // Wiederholungen
|
||||
|
||||
L SSDB
|
||||
T LW4
|
||||
T LW14 // DB_Nummer
|
||||
|
||||
// Quelle-Pointer erzeugen:
|
||||
L Suchzeiger // Stelle, wo gelöscht werden soll
|
||||
L Datenblock_inBytes // Datenblocklänge in Bytes
|
||||
+I
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
// Ziel-Pointer erzeugen:
|
||||
L Suchzeiger // Stelle, wo gelöscht werden soll
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD16 // Kennung, Adresse
|
||||
|
||||
// Daten verschieben:
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // DatenSortliste-Daten verschieben
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
|
||||
// Letzte Daten löschen:
|
||||
Last: L Datenlisten_Ende // Ende des Datenbereichs
|
||||
L Datenblock_inBytes // Datenblocklänge in Bytes
|
||||
-I // Ab hier löschen !
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
L Datensatzlaenge // Datensatzlänge
|
||||
L080: T Schleife
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
|
||||
L 0 // Daten löschen
|
||||
T DBW [AR1Zeiger]
|
||||
|
||||
L AR1Zeiger
|
||||
SRD 3
|
||||
L 2 // nächstes DW
|
||||
+D
|
||||
SLD 3
|
||||
T AR1Zeiger
|
||||
|
||||
L Schleife
|
||||
LOOP L080
|
||||
|
||||
// Speicherung letzter Zugriff:
|
||||
L SSDW
|
||||
+ 12 // Offset letzter Zugriff
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
L 0 // löschen
|
||||
T DBW [AR1Zeiger] // Speicherung letzter Zugriff
|
||||
T Suchzeiger // Suchzeiger
|
||||
|
||||
SET
|
||||
R IndZeiger_ok // Indizier-Zeiger angegeben
|
||||
|
||||
// Anzahl Einträge:
|
||||
L SSDW
|
||||
+ 16 // Offset Anzahl Einträge
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
L DBW [AR1Zeiger] // Anzahl der Einträge
|
||||
+ -1 // -1
|
||||
T DBW [AR1Zeiger] // Anzahl der Einträge
|
||||
|
||||
L 0
|
||||
>=I
|
||||
JC w080
|
||||
|
||||
T DBW [AR1Zeiger] // Minimum übergeben
|
||||
|
||||
w080: JU Nw11
|
||||
|
||||
|
||||
--- NW 11: Daten aus Datenliste löschen ? (indiziert) ---
|
||||
X010: L 16#E1 // Daten löschen ?
|
||||
L Para1 // 1.Aufrufparameter
|
||||
<>I // Nein !
|
||||
JC Nw11
|
||||
|
||||
L Suchzeiger // Suchzeiger
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
|
||||
L Datensatzlaenge
|
||||
LA00: T Schleife
|
||||
|
||||
L 0
|
||||
T DBW [AR1Zeiger]
|
||||
|
||||
L AR1Zeiger
|
||||
SRD 3
|
||||
L DINT#2
|
||||
+D
|
||||
SLD 3
|
||||
T AR1Zeiger
|
||||
|
||||
L Schleife
|
||||
LOOP LA00
|
||||
|
||||
L SSDW
|
||||
+ 12
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
L 0 // Löschen
|
||||
T Suchzeiger // Suchzeiger
|
||||
T DBW [AR1Zeiger]
|
||||
|
||||
SET
|
||||
R IndZeiger_ok // Indizier-Zeiger angegeben
|
||||
|
||||
|
||||
--- NW 12: Weitersuchen aktiv ? Datensatz vorhanden oder 0 ? ---
|
||||
Nw11: AN Weitersuchen
|
||||
JC Nw12
|
||||
|
||||
L OutDaten_Pointer
|
||||
LAR2
|
||||
|
||||
L Datensatzlaenge
|
||||
L110: T Schleife
|
||||
|
||||
L DBOutDaten // Outdaten-DB
|
||||
L 0 // Angegeben ?
|
||||
==I // Nein
|
||||
JC W111
|
||||
|
||||
OPN DB[DBOutDaten]
|
||||
|
||||
W111: L NoneW [AR2,] // Outdaten überprüfen
|
||||
L 0 // Etwas angegeben ?
|
||||
<>I // Ja !
|
||||
JC W112 // Ok
|
||||
|
||||
ADDAR2 P#2.0
|
||||
|
||||
L Schleife
|
||||
LOOP L110
|
||||
|
||||
L 2#0000_0000_0100_0000 // Daten sind nicht vorhanden
|
||||
T tRE_VAL // Ok-Status
|
||||
JU Ende
|
||||
|
||||
W112: L 2#0000_0000_1000_0000 // Daten sind vorhanden
|
||||
T tRE_VAL // Ok-Status
|
||||
JU Ende
|
||||
|
||||
|
||||
--- NW 13: Indizierung ok ? ---
|
||||
Nw12: AN Indok // Indizierung möglich
|
||||
O IndZeiger_ok // Indizier-Zeiger angegeben
|
||||
JC Ende
|
||||
|
||||
OPN DB[IndDB] // Indizierter DB
|
||||
|
||||
L Suchzeiger // Suchzeiger
|
||||
T DBW [IndPointer]
|
||||
|
||||
OPN DB[DBDatenliste] // Datenliste DB
|
||||
|
||||
|
||||
--- NW 14: Fehlerausgabe / RET_VAL ---
|
||||
Ende: SET // VKE = 1 ohne Fehler !!!
|
||||
L tRE_VAL // Ok-Status
|
||||
JU Ok
|
||||
Err0: L 2#0000_0000_0000_0001 // Kein Datenlistebereich
|
||||
JU Err
|
||||
Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler
|
||||
JU Err
|
||||
Err2: L 2#0000_0000_0000_0100 // Listenende ist erreicht
|
||||
JU Err
|
||||
Err3: L 2#0000_0000_0000_1000 // Falscher Parameter bei Aufruf
|
||||
JU Err
|
||||
Err4: L 2#0000_0000_0001_0000 // Undefinierte Suchdaten
|
||||
JU Err
|
||||
Err5: L 2#0000_0000_0010_0000 // Undefinierte OUTDaten
|
||||
JU Err
|
||||
Err6: L 2#0000_0000_0100_0000 // Datensatz nicht vorhanden
|
||||
|
||||
Err: CLR // VKE = 0 bei Fehler !!!
|
||||
|
||||
Ok: T tRE_VAL
|
||||
SAVE // VKE in BIE-Bit speichern
|
||||
|
||||
L AR2_Speicher // AR2 zurückspeichern
|
||||
LAR2
|
||||
|
||||
|
||||
--- NW 15: Ende ---
|
||||
L tRE_VAL
|
||||
T RE_VAL
|
||||
@@ -0,0 +1,532 @@
|
||||
=== FC 89: DatenOutSort [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
SSDB : Int // Datenlisten-DB
|
||||
SSDW : Int // Datenlisten-1.DW
|
||||
PARA : Word // Aufrufparameter (Auftrag , Offset/Anzahl Daten)
|
||||
Output:
|
||||
OUTDATEN : Pointer // OutDaten-Schnittstelle
|
||||
RE_VAL : Byte // Rückmeldung
|
||||
InOut:
|
||||
Temp:
|
||||
Quelle : Any // Zeiger, wo Rein-Daten sind
|
||||
Ziel : Any // Zeiger, FIFO-Stelle
|
||||
Kopf : Byte // Datenliste-Kennnung (DA)
|
||||
Datensatzlaenge : Byte // Datensatzlänge in Word (01 - F0) F0=128
|
||||
Listenlaenge : Int // Länge der Datenliste (maximale Anzahl der Datensätze)
|
||||
Stammdaten : Int // Stammdatenlänge in Word (1 - 9)
|
||||
Belegt06 : Int // reserviert von Datenliste
|
||||
Belegt08 : Int // reserviert von Datenliste
|
||||
Belegt10 : Int // reserviert von Datenliste
|
||||
Belegt12 : Int // reserviert von Datenliste
|
||||
AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze
|
||||
Reserve16 : Int // Reserve
|
||||
Reserve18 : Int // Reserve
|
||||
Para1 : Byte // 1.Aufrufparameter
|
||||
Para2 : Byte // 2.Aufrufparameter
|
||||
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
|
||||
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
|
||||
LeseStelle : Int // Stelle, wo gelesen werden soll
|
||||
EraseStelle : Int // Stelle, wo gelöscht werden soll
|
||||
FirstStelle : Int // Stelle, wo 1. zu bleibende Daten sind
|
||||
DBDatenliste : Word // Datenlisten-DB
|
||||
Datenlisten_Ende : Word // Ende der Datenliste
|
||||
AR2_Speicher : DWord // Adress-Register 2 zwischenspeichern
|
||||
DBOutDaten : Word // Out-Daten-DB, falls angegeben
|
||||
OutDaten_Pointer : DWord // Out-Daten-Pointer: Kennung, Adresse
|
||||
OutDaten_Startpunkt : Word // Out-Daten-Startpunkt: Adresse
|
||||
Datenblock_inBytes : Word // Datenblocklänge in Bytes
|
||||
Suchstelle : Word // Bei angegebenen Datensatz suchen
|
||||
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
|
||||
NichtCopy : Int // Datenmenge, die nicht vorschoben wird
|
||||
Schleife : Word // Loopzähler
|
||||
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
|
||||
--- NW 1: Schnittstellen-DB sinnvoll ? ---
|
||||
TAR2
|
||||
T AR2_Speicher // AR2 zwischenspeichern
|
||||
|
||||
L SSDB
|
||||
T DBDatenliste
|
||||
|
||||
// CALL TEST_DB
|
||||
// DB_NUMBER :=#DBDatenliste
|
||||
// RET_VAL :=#SFC_RET_VAL
|
||||
// DB_LENGTH :=#SFC_DB_LENGTH
|
||||
// WRITE_PROT :=#SFC_WRITE_PROT
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBDatenliste, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
O SFC_WRITE_PROT // schreibgeschützt
|
||||
JC Err0 // kein Datenlisten-Bereich
|
||||
|
||||
|
||||
--- NW 2: Quelle-Pointer erzeugen: ---
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0 // Any-Kennung, Datentyp
|
||||
L 16#000A // 10 Dw´s holen
|
||||
T LW2 // Wiederholungen
|
||||
L SSDB
|
||||
T LW4 // DB_Nummer
|
||||
L SSDW // Adresse
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 10) // 1.-10.DW Datenliste holen
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
|
||||
|
||||
--- NW 3: Zeigerüberprüfung ---
|
||||
L Kopf // Datenliste-Kopf
|
||||
L 16#DB // = Datenlistekennung ?
|
||||
<>I // Nein !
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 1
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 128
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 1
|
||||
L Listenlaenge // Max.Anzahl von Datenblöcken
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 1
|
||||
L Stammdaten // Anzahl der Stammdaten
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 9
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L Stammdaten // Anzahl der Stammdaten
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L Listenlaenge // Länge der Datenliste
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
*I
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
+ 20 // Speichern ab 10.DW
|
||||
L SSDW
|
||||
+I
|
||||
T Datenlisten_Ende
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
|
||||
L Datenlisten_Ende
|
||||
L SFC_DB_LENGTH
|
||||
>I // Datenlisten-DB ist zu kurz!
|
||||
JC Err0 // kein Datenlisten-Bereich
|
||||
|
||||
L DBW [AR1Zeiger]
|
||||
L 16#DBEE // Datenliste-Endekennung ?
|
||||
<>I // Nein !
|
||||
JC Err0 // kein Datenlisten-Bereich
|
||||
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
L 2
|
||||
*I
|
||||
T Datenblock_inBytes // Datenblocklänge in Bytes
|
||||
|
||||
|
||||
--- NW 4: Auftrag kontrollieren ---
|
||||
L PARA
|
||||
T LW40 // Aufrufparameter zwischenspeichern
|
||||
|
||||
L Para2
|
||||
L 16#00
|
||||
<=I
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
CAC
|
||||
L Listenlaenge // Länge der Datenliste (maximale Anzahl der Datensätze)
|
||||
>I
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
L 16#0A // XX = 0A ? (Datensatz YY lesen)
|
||||
L Para1
|
||||
<>I // Nein !
|
||||
JC W400
|
||||
|
||||
// Eintrag lesen:
|
||||
L Para2 // Datensatz YY
|
||||
+ -1 // 1.Datensatz ohne Offset
|
||||
L Datenblock_inBytes // Datenblocklänge in bytes
|
||||
*I
|
||||
+ 20
|
||||
L SSDW
|
||||
+I
|
||||
T LeseStelle // Stelle, wo gelesen werden soll
|
||||
|
||||
JU Nw06 // OutDaten ok ?
|
||||
|
||||
W400: L 16#0E // XX = 0E ? (Datensatz YY löschen)
|
||||
<>I // Nein !
|
||||
JC W401
|
||||
|
||||
// Datensatz löschen:
|
||||
L AnzahlEintraege
|
||||
L 0
|
||||
==I
|
||||
JC Err2 // Liste ist leer
|
||||
|
||||
L Para2 // Datensatz YY
|
||||
L AnzahlEintraege // zu löschender Datensatz ist grösser als Einträge ?
|
||||
>I // Ja !
|
||||
JC Ende // Keine Aktion
|
||||
|
||||
L Para2 // Datensatz YY
|
||||
+ -1 // 1.Datensatz ohne Offset
|
||||
L Datenblock_inBytes // Datenblocklänge in bytes
|
||||
*I
|
||||
+ 20
|
||||
L SSDW
|
||||
+I
|
||||
T EraseStelle // Stelle, wo gelöscht werden soll
|
||||
|
||||
JU Nw08 // Daten löschen
|
||||
|
||||
W401: L 16#0D // XX = 0D ? (Datensätze YY löschen, ab 1.DS)
|
||||
L Para1
|
||||
<>I // Nein !
|
||||
JC W402
|
||||
|
||||
// Datenblock löschen:
|
||||
L AnzahlEintraege
|
||||
L 0
|
||||
==I
|
||||
JC Err2 // Liste ist leer
|
||||
|
||||
L Para2 // Anzahl Datensätze YY
|
||||
L Datenblock_inBytes // Datenblocklänge in bytes
|
||||
*I
|
||||
+ 20
|
||||
L SSDW
|
||||
+I
|
||||
T FirstStelle // Stelle, wo 1. zu bleibende Daten sind
|
||||
|
||||
JU Nw09
|
||||
|
||||
BEU
|
||||
|
||||
W402: JU Err3 // Falscher Aufrufparameter
|
||||
|
||||
|
||||
--- NW 5: Outdaten ok ? ---
|
||||
|
||||
// Out-DATEN-Pointer übernehmen:
|
||||
Nw06: L P#
|
||||
LAR2
|
||||
|
||||
L NoneW [AR2,]
|
||||
T DBOutDaten // Outdaten-DB
|
||||
L NoneD [AR2,] // Kennung, Adresse
|
||||
T OutDaten_Pointer
|
||||
|
||||
L DBOutDaten // Outdaten-DB
|
||||
L 0 // Angegeben ?
|
||||
==I // Nein
|
||||
JC Nw07
|
||||
|
||||
// CALL TEST_DB
|
||||
// DB_NUMBER :=#DBOutDaten
|
||||
// RET_VAL :=#SFC_RET_VAL
|
||||
// DB_LENGTH :=#SFC_DB_LENGTH
|
||||
// WRITE_PROT :=#SFC_WRITE_PROT
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBOutDaten, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000 // Fehler vorhanden ?
|
||||
<>I // Ja !
|
||||
JC Err5 // Undefinierte Outdaten
|
||||
|
||||
L NoneD [AR2,] // Kennung, Adresse
|
||||
L 16#00FF_FFFF // Ohne Kennung
|
||||
AW
|
||||
SRW 3 // Ohne Bit
|
||||
T OutDaten_Startpunkt
|
||||
|
||||
L OutDaten_Startpunkt
|
||||
L SFC_DB_LENGTH
|
||||
>I // Outdaten-DB ist zu kurz
|
||||
JC Err5 // Undefinierte Outdaten
|
||||
|
||||
|
||||
--- NW 6: Daten aus Datenliste lesen (in OUTDaten übergeben) ---
|
||||
// Quelle-Pointer erzeugen:
|
||||
Nw07: L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0
|
||||
T LW10 // Any-Kennung, Datentyp
|
||||
L Datensatzlaenge // Datenwords speichern
|
||||
T LW2
|
||||
T LW12 // Wiederholungen
|
||||
|
||||
// DATEN-Pointer übernehmen:
|
||||
L SSDB
|
||||
T LW4 // DB_Nummer
|
||||
L LeseStelle // Adresse
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
// Ziel-Pointer erzeugen:
|
||||
// Kennung + Datenbytes s.o.
|
||||
|
||||
L DBOutDaten
|
||||
T LW14 // DB_Nummer
|
||||
L OutDaten_Pointer
|
||||
T LD16 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // DatenSortliste-Daten speichern
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
|
||||
JU Ende
|
||||
|
||||
|
||||
--- NW 7: Daten aus Datenliste löschen ? ---
|
||||
// Gemeinsame Daten für Pointer erzeugen:
|
||||
Nw08: L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0
|
||||
T LW10 // Any-Kennung, Datentyp
|
||||
|
||||
L Datensatzlaenge // Datensatzlänge
|
||||
L Para2 // Datensatz YY
|
||||
*I
|
||||
T NichtCopy // Datenmenge, die nicht vorschoben wird
|
||||
|
||||
L Listenlaenge // Länge der Datenliste
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
*I // Gesamtdatenlänge in Words
|
||||
L NichtCopy // Datenmenge, die nicht vorschoben wird
|
||||
-I // abziehen
|
||||
T LW2
|
||||
T LW12 // Wiederholungen
|
||||
|
||||
L SSDB
|
||||
T LW4
|
||||
T LW14 // DB_Nummer
|
||||
|
||||
// Quelle-Pointer erzeugen:
|
||||
L EraseStelle // Stelle, wo gelöscht werden soll
|
||||
L Datenblock_inBytes // Datenblocklänge in Bytes
|
||||
+I
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
// Ziel-Pointer erzeugen:
|
||||
L EraseStelle // Stelle, wo gelöscht werden soll
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD16 // Kennung, Adresse
|
||||
|
||||
// Daten verschieben:
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // DatenSortliste-Daten verschieben
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
|
||||
// Letzte Daten löschen:
|
||||
L Datenlisten_Ende // Ende des Datenbereichs
|
||||
L Datenblock_inBytes // Datenblocklänge in Bytes
|
||||
-I // Ab hier löschen !
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
L Datensatzlaenge // Datensatzlänge
|
||||
L080: T Schleife
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
|
||||
L 0 // Daten löschen
|
||||
T DBW [AR1Zeiger]
|
||||
|
||||
L AR1Zeiger
|
||||
SRD 3
|
||||
L 2
|
||||
+D
|
||||
SLD 3
|
||||
T AR1Zeiger
|
||||
|
||||
L Schleife
|
||||
LOOP L080
|
||||
|
||||
L AnzahlEintraege // Anzahl der eingetragenen Datensätze
|
||||
+ -1
|
||||
T AnzahlEintraege
|
||||
|
||||
L 0
|
||||
>=I
|
||||
JC w080
|
||||
|
||||
T AnzahlEintraege // Minimum übergeben
|
||||
|
||||
w080: L SSDW
|
||||
+ 14 // Anzahl der Einträge
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
L AnzahlEintraege // Anzahl der eingetragenen Datensätze
|
||||
T DBW [AR1Zeiger] // Anzahl der Einträge
|
||||
|
||||
JU Ende
|
||||
|
||||
|
||||
--- NW 8: Datensätze aus Datenliste löschen ? ---
|
||||
// Gemeinsame Daten für Pointer erzeugen:
|
||||
Nw09: L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0
|
||||
T LW10 // Any-Kennung, Datentyp
|
||||
|
||||
L Datensatzlaenge // Datensatzlänge
|
||||
L Para2 // Anzahl Datensätze YY
|
||||
*I
|
||||
T NichtCopy // Datenmenge, die nicht vorschoben wird
|
||||
|
||||
L Listenlaenge // Länge der Datenliste
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
*I // Gesamtdatenlänge in Words
|
||||
L NichtCopy // Datenmenge, die nicht vorschoben wird
|
||||
-I // abziehen
|
||||
T LW2
|
||||
T LW12 // Wiederholungen
|
||||
|
||||
L SSDB
|
||||
T LW4
|
||||
T LW14 // DB_Nummer
|
||||
|
||||
// Quelle-Pointer erzeugen:
|
||||
L FirstStelle // Stelle, wo 1. zu bleibende Daten sind
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
// Ziel-Pointer erzeugen:
|
||||
L SSDW
|
||||
+ 20 // 1.DS
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD16 // Kennung, Adresse
|
||||
|
||||
// Daten verschieben:
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // DatenSortliste-Daten verschieben
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
|
||||
// Letzte Daten löschen:
|
||||
L Datenlisten_Ende // Ende des Datenbereichs
|
||||
L NichtCopy // Datenmenge, die nicht vorschoben wird
|
||||
-I
|
||||
L NichtCopy // 2 mal, da Angabe in Word (Angabe in Byte benötigt!)
|
||||
-I // Ab hier löschen !
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
L NichtCopy // Datenmenge, die nicht vorschoben wird
|
||||
L090: T Schleife
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
|
||||
L 0 // Daten löschen
|
||||
T DBW [AR1Zeiger]
|
||||
|
||||
L AR1Zeiger
|
||||
SRD 3
|
||||
L 2
|
||||
+D
|
||||
SLD 3
|
||||
T AR1Zeiger
|
||||
|
||||
L Schleife
|
||||
LOOP L090
|
||||
|
||||
L AnzahlEintraege // Anzahl der eingetragenen Datensätze
|
||||
L Para2 // Anzahl Datensätze YY
|
||||
-I
|
||||
T AnzahlEintraege
|
||||
|
||||
L 0
|
||||
>=I
|
||||
JC w090
|
||||
|
||||
T AnzahlEintraege // Minimum übergeben
|
||||
|
||||
w090: L SSDW
|
||||
+ 14 // Anzahl der Einträge
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
L AnzahlEintraege // Anzahl der eingetragenen Datensätze
|
||||
T DBW [AR1Zeiger] // Anzahl der Einträge
|
||||
|
||||
JU Ende
|
||||
|
||||
|
||||
--- NW 9: Fehlerausgabe / RET_VAL ---
|
||||
Ende: SET // VKE = 1 ohne Fehler !!!
|
||||
L 2#0000_0000_0000_0000 // Ok-Status
|
||||
JU Ok
|
||||
Err0: L 2#0000_0000_0000_0001 // Kein Datenlistebereich
|
||||
JU Err
|
||||
Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler
|
||||
JU Err
|
||||
Err2: L 2#0000_0000_0000_0100 // Sortliste ist leer
|
||||
JU Err
|
||||
Err3: L 2#0000_0000_0000_1000 // Falscher Parameter bei Aufruf
|
||||
JU Err
|
||||
Err5: L 2#0000_0000_0010_0000 // Undefinierte OUTDaten
|
||||
|
||||
Err: CLR // VKE = 0 bei Fehler !!!
|
||||
|
||||
Ok: T RE_VAL
|
||||
SAVE // VKE in BIE-Bit speichern
|
||||
|
||||
L AR2_Speicher // AR2 zurückspeichern
|
||||
LAR2
|
||||
|
||||
@@ -0,0 +1,234 @@
|
||||
=== FC 87: DatenReset [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
SSDB : Int // Datenlisten-DB
|
||||
SSDW : Int // Datenlisten-1.DW
|
||||
Output:
|
||||
RE_VAL : Byte // Rückmeldung
|
||||
InOut:
|
||||
Temp:
|
||||
Quelle : Any // Zeiger, wo Rein-Daten sind
|
||||
Ziel : Any // Zeiger, FIFO-Stelle
|
||||
Kopf : Byte // Datenliste-Kennnung (DA)
|
||||
Datensatzlaenge : Byte // Datensatzlänge in Word (01 - F0) F0=128
|
||||
Listenlaenge : Int // Länge der Datenliste (maximale Anzahl der Datensätze)
|
||||
Stammdaten : Int // Stammdatenlänge in Word (1 - 9)
|
||||
IndDB : Word // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!)
|
||||
IndDB_Laenge : Int // Länge des indizierten DB in Einträge (nur bei Stammdaten = 1 erlaubt !!!)
|
||||
IndDaten_FC : Int // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!)
|
||||
Suchzeiger : Int // Speicherung des letzten Zugriffs / Suchzeiger
|
||||
Belegt14 : Int // reserviert von Sort-Datenliste
|
||||
Reserve16 : Int // Reserve
|
||||
Reserve18 : Int // Reserve
|
||||
DBDatenliste : Word // Datenlisten-DB
|
||||
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
|
||||
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
|
||||
Datenlisten_Ende : Word // Ende der Datenliste
|
||||
Schleife : Word // Loopzähler
|
||||
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
|
||||
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
DB_Länge : Int
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
|
||||
--- NW 1: Schnittstellen-DB sinnvoll ? ---
|
||||
L SSDB
|
||||
T DBDatenliste
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBDatenliste, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
|
||||
CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge")
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
O SFC_WRITE_PROT
|
||||
JC Err0 // kein Datenlisten-Bereich
|
||||
|
||||
|
||||
--- NW 2: Quelle-Pointer erzeugen: ---
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0 // Any-Kennung, Datentyp
|
||||
L 16#000A // 10 Dw´s holen
|
||||
T LW2 // Wiederholungen
|
||||
L SSDB
|
||||
T LW4 // DB_Nummer
|
||||
L SSDW // Adresse
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 10) // 1.-10.DW Datenliste holen
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
|
||||
|
||||
--- NW 3: Zeigerüberprüfung ---
|
||||
L Kopf // Datenliste-Kopf
|
||||
L 16#DA // = Datenlistekennung ?
|
||||
<>I // Nein !
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 1
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 128
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 1
|
||||
L Listenlaenge // Max.Anzahl von Datenblöcken
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 1
|
||||
L Stammdaten // Anzahl der Stammdaten
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 9
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L Stammdaten // Anzahl der Stammdaten
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L Listenlaenge // Länge der Datenliste
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
*I
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
+ 20 // Speichern ab 10.DW
|
||||
L SSDW
|
||||
+I
|
||||
T Datenlisten_Ende
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
|
||||
L Datenlisten_Ende
|
||||
L "DB_Länge"
|
||||
>I // Datenlisten-DB ist zu kurz!
|
||||
JC Err0 // kein Datenlisten-Bereich
|
||||
|
||||
L DBW [AR1Zeiger]
|
||||
L 16#DAEE // Datenliste-Endekennung ?
|
||||
<>I // Nein !
|
||||
JC Err0 // kein Datenlisten-Bereich
|
||||
|
||||
|
||||
--- NW 4: Indizierung löschen ? ---
|
||||
L IndDB // Indizierter DB
|
||||
L 0 // =0 ?
|
||||
==I // Kein indizierter DB !
|
||||
JC Nw05
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=IndDB, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
|
||||
CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge")
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
O SFC_WRITE_PROT
|
||||
JC Nw05 // kein Indizier-DB vorhanden
|
||||
|
||||
L 0
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[IndDB]
|
||||
|
||||
L "DB_Länge" // In Bytes angegeben
|
||||
L400: T Schleife
|
||||
|
||||
L 0
|
||||
T DBB [AR1Zeiger] // Inhalte löschen
|
||||
|
||||
L AR1Zeiger
|
||||
SRD 3
|
||||
L DINT#1
|
||||
+D
|
||||
SLD 3
|
||||
T AR1Zeiger
|
||||
|
||||
L Schleife
|
||||
LOOP L400
|
||||
|
||||
|
||||
|
||||
--- NW 5: Datenliste löschen ---
|
||||
Nw05: L SSDW
|
||||
+ 12 // 12.Dw
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
|
||||
L 0
|
||||
T DBW [AR1Zeiger] // Letzte Speicherung löschen
|
||||
|
||||
L SSDW
|
||||
+ 16 // 16.Dw
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
|
||||
L 0
|
||||
T DBW [AR1Zeiger] // Anzahl Einträge löschen
|
||||
|
||||
L SSDW
|
||||
+ 20 // Daten ab 20.Dw
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
L Datensatzlaenge
|
||||
L Listenlaenge
|
||||
*I
|
||||
L500: T Schleife
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
|
||||
L 0
|
||||
T DBW [AR1Zeiger] // Inhalte löschen
|
||||
|
||||
L AR1Zeiger
|
||||
SRD 3
|
||||
L DINT#2
|
||||
+D
|
||||
SLD 3
|
||||
T AR1Zeiger
|
||||
|
||||
L Schleife
|
||||
LOOP L500
|
||||
|
||||
|
||||
|
||||
--- NW 6: Fehlerausgabe / RET_VAL ---
|
||||
SET // VKE = 1 ohne Fehler !!!
|
||||
JU Ok
|
||||
Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich
|
||||
JU Err
|
||||
Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler
|
||||
|
||||
Err: CLR // VKE = 0 bei Fehler !!!
|
||||
Ok: T RE_VAL
|
||||
|
||||
SAVE // VKE in BIE-Bit speichern
|
||||
|
||||
@@ -0,0 +1,183 @@
|
||||
=== FC 90: DatenResetSort [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
SSDB : Int // Datenlisten-DB
|
||||
SSDW : Int // Datenlisten-1.DW
|
||||
Output:
|
||||
RE_VAL : Byte // Rückmeldung
|
||||
InOut:
|
||||
Temp:
|
||||
Quelle : Any // Zeiger, wo Rein-Daten sind
|
||||
Ziel : Any // Zeiger, FIFO-Stelle
|
||||
Kopf : Byte // Datenliste-Kennnung (DA)
|
||||
Datensatzlaenge : Byte // Datensatzlänge in Word (01 - F0) F0=128
|
||||
Listenlaenge : Int // Länge der Datenliste (maximale Anzahl der Datensätze)
|
||||
Stammdaten : Int // Stammdatenlänge in Word (1 - 9)
|
||||
Belegt06 : Int // reserviert von Datenliste
|
||||
Belegt08 : Int // reserviert von Datenliste
|
||||
Belegt10 : Int // reserviert von Datenliste
|
||||
Belegt12 : Int // reserviert von Datenliste
|
||||
AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze
|
||||
Reserve16 : Int // Reserve
|
||||
Reserve18 : Int // Reserve
|
||||
Suchzeiger : Int // Speicherung des letzten Zugriffs / Suchzeiger
|
||||
DBDatenliste : Word // Datenlisten-DB
|
||||
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
|
||||
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
|
||||
Datenlisten_Ende : Word // Ende der Datenliste
|
||||
Schleife : Word // Loopzähler
|
||||
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
|
||||
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
|
||||
--- NW 1: Schnittstellen-DB sinnvoll ? ---
|
||||
L SSDB
|
||||
T DBDatenliste
|
||||
|
||||
// CALL TEST_DB
|
||||
// DB_NUMBER :=#DBDatenliste
|
||||
// RET_VAL :=#SFC_RET_VAL
|
||||
// DB_LENGTH :=#SFC_DB_LENGTH
|
||||
// WRITE_PROT :=#SFC_WRITE_PROT
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBDatenliste, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
O SFC_WRITE_PROT
|
||||
JC Err0 // kein Datenlisten-Bereich
|
||||
|
||||
|
||||
--- NW 2: Quelle-Pointer erzeugen: ---
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0 // Any-Kennung, Datentyp
|
||||
L 16#000A // 10 Dw´s holen
|
||||
T LW2 // Wiederholungen
|
||||
L SSDB
|
||||
T LW4 // DB_Nummer
|
||||
L SSDW // Adresse
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 10) // 1.-10.DW Datenliste holen
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
|
||||
|
||||
--- NW 3: Zeigerüberprüfung ---
|
||||
L Kopf // Datenliste-Kopf
|
||||
L 16#DB // = DatenSortlistekennung ?
|
||||
<>I // Nein !
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 1
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 128
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 1
|
||||
L Listenlaenge // Max.Anzahl von Datenblöcken
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 1
|
||||
L Stammdaten // Anzahl der Stammdaten
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L 9
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L Stammdaten // Anzahl der Stammdaten
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
>I
|
||||
JC Err0 // kein Datenlistebereich
|
||||
|
||||
L Listenlaenge // Länge der Datenliste
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
*I
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
+ 20 // Speichern ab 10.DW
|
||||
L SSDW
|
||||
+I
|
||||
T Datenlisten_Ende
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
|
||||
L Datenlisten_Ende
|
||||
L SFC_DB_LENGTH
|
||||
>I // Datenlisten-DB ist zu kurz!
|
||||
JC Err0 // kein Datenlisten-Bereich
|
||||
|
||||
L DBW [AR1Zeiger]
|
||||
L 16#DBEE // DatenSortliste-Endekennung ?
|
||||
<>I // Nein !
|
||||
JC Err0 // kein Datenlisten-Bereich
|
||||
|
||||
|
||||
--- NW 4: Datenliste löschen ---
|
||||
L SSDW
|
||||
+ 14 // 14.Dw
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[DBDatenliste]
|
||||
|
||||
L 0
|
||||
T DBW [AR1Zeiger] // Anzahl Einträge löschen
|
||||
|
||||
L SSDW
|
||||
+ 20 // 20.Dw
|
||||
ITD
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
L Datensatzlaenge
|
||||
L Listenlaenge
|
||||
*I
|
||||
L500: T Schleife
|
||||
|
||||
L 0 // Daten löschen
|
||||
T DBW [AR1Zeiger]
|
||||
|
||||
L AR1Zeiger
|
||||
SRD 3
|
||||
L 2
|
||||
+D
|
||||
SLD 3
|
||||
T AR1Zeiger
|
||||
|
||||
L Schleife
|
||||
LOOP L500
|
||||
|
||||
|
||||
--- NW 5: Fehlerausgabe / RET_VAL ---
|
||||
SET // VKE = 1 ohne Fehler !!!
|
||||
JU Ok
|
||||
Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich
|
||||
JU Err
|
||||
Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler
|
||||
|
||||
Err: CLR // VKE = 0 bei Fehler !!!
|
||||
Ok: T RE_VAL
|
||||
|
||||
SAVE // VKE in BIE-Bit speichern
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
=== FC 125: Err_vorhanden [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
Check_DB : Int
|
||||
Anfangs_DW : DInt
|
||||
Ende_DW : DInt
|
||||
Output:
|
||||
Stoerung : Bool // Störung vorhanden
|
||||
ErrDW : DInt
|
||||
ErrBits : Int
|
||||
InOut:
|
||||
Temp:
|
||||
Anzeige_DB : Int
|
||||
Zeiger : DInt // Startwert mit Offset 0
|
||||
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
|
||||
--- NW 1: Check-DB von "Abfangs_DW" bis "Ende_DW" checken ---
|
||||
SET // GST
|
||||
R Stoerung
|
||||
L DINT#-1 // Sonst Störung in DBD0 nicht erkennbar
|
||||
T ErrDW
|
||||
L 0
|
||||
T ErrBits
|
||||
|
||||
L Check_DB
|
||||
T Anzeige_DB
|
||||
|
||||
L Anfangs_DW // Mit diesem DW beginnen
|
||||
T Zeiger // Zeiger
|
||||
|
||||
Loop: L Zeiger // Zeiger
|
||||
SLD 3
|
||||
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[Anzeige_DB]
|
||||
|
||||
L DBW [AR1Zeiger] // Störungsbits
|
||||
T ErrBits
|
||||
L 0 // aktiv ?
|
||||
<>I // Ja !
|
||||
JC Err
|
||||
|
||||
L Zeiger // Startwert mit Offset 0
|
||||
L 2
|
||||
+D
|
||||
T Zeiger // Zeiger
|
||||
L Ende_DW // Letztes DW überschritten?
|
||||
<=D // Nein !
|
||||
JC Loop
|
||||
|
||||
BEU
|
||||
|
||||
Err: SET
|
||||
S Stoerung
|
||||
|
||||
L Zeiger // Zeiger
|
||||
T ErrDW
|
||||
|
||||
|
||||
--- NW 2: Ende ---
|
||||
BE
|
||||
|
||||
@@ -0,0 +1,327 @@
|
||||
=== FC 84: FIFOChange [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
SSDB : Int // Schnittstellen-DB
|
||||
SSDW : Int // Schnittstellen-1.DW
|
||||
CH_POS : Int // Position des Eintrags, der zu ändernden Daten
|
||||
CHANGEDATEN : Pointer // Wechsel-Daten-Schnittstelle
|
||||
Output:
|
||||
RE_VAL : Byte // Rückmeldung
|
||||
InOut:
|
||||
Temp:
|
||||
Quelle : Any // Zeiger, wo Rein-Daten sind
|
||||
Ziel : Any // Zeiger, FIFO-Stelle
|
||||
Kopf : Byte // Fifo-Kennung (FF)
|
||||
Datensatzlaenge : Byte // Datensatzlänge in Word (1 - 128)
|
||||
FifoLaenge : Int // Länge des Fifo (maximale Anzahl der Datensätze)
|
||||
Bringzeiger : Int // Zeiger, wohin nächster Eintrag gespeichert wird
|
||||
Holzeiger : Int // Zeiger, woher nächste Daten geholt werden
|
||||
Anzahl : Int // Anzahl der Datensätze (eingetragene)
|
||||
Status : Word // Status des Fifo
|
||||
Err : Byte // Fehlerbits
|
||||
MinHolzeiger : Int // Minimum Holzeiger
|
||||
MaxHolzeiger : Int // Maximum Holzeiger
|
||||
DBFifo : Word // FIFO-DB
|
||||
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
|
||||
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
|
||||
Fifo_Ende : Word // Ende des Fifo
|
||||
AlleDaten : Word // Anzahl der bytes für alle Daten
|
||||
Offset : Word // Offset zu überschreibender Datensatz
|
||||
NixSave : Bool // Status nicht speichern
|
||||
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
|
||||
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
AR1Start : DInt // Startwert mit Offset 0
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
|
||||
--- NW 1: Schnittstellen-DB sinnvoll ? ---
|
||||
L SSDB
|
||||
T DBFifo
|
||||
|
||||
// CALL TEST_DB
|
||||
// DB_NUMBER :=#DBFifo
|
||||
// RET_VAL :=#SFC_RET_VAL
|
||||
// DB_LENGTH :=#SFC_DB_LENGTH
|
||||
// WRITE_PROT :=#SFC_WRITE_PROT
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBFifo, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
O SFC_WRITE_PROT
|
||||
= NixSave // Status nicht speichern
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
|
||||
--- NW 2: Quelle-Pointer erzeugen: ---
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0 // Any-Kennung, Datentyp
|
||||
L 16#0006 // 6 Dw´s holen
|
||||
T LW2 // Wiederholungen
|
||||
L SSDB
|
||||
T LW4 // DB_Nummer
|
||||
L SSDW // Adresse
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 6) // 1.-6.DW FIFO holen
|
||||
|
||||
L Status
|
||||
L 2#0000_0000_1110_0000
|
||||
AW
|
||||
T Err
|
||||
JP Err // Kapitalfehler vorhanden
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
|
||||
|
||||
--- NW 3: Zeigerüberprüfung ---
|
||||
L Kopf // Fifo-Kopf
|
||||
L 16#FF // = Fifokennung ?
|
||||
<>I // Nein !
|
||||
= NixSave // Status nicht speichern
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L 1
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
>I
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L 128
|
||||
>I
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L 1
|
||||
L FifoLaenge // Max.Anzahl von Datenblöcken
|
||||
>I
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L SSDW
|
||||
+ 40 // Speichern ab 20.DW
|
||||
T MinHolzeiger // Minimum Bringzeiger
|
||||
|
||||
L FifoLaenge // Länge FIFO (in Word)
|
||||
+ -1
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
*I
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
+ 40 // Speichern ab 20.DW
|
||||
L SSDW
|
||||
+I
|
||||
T MaxHolzeiger // Maximum Bringzeiger
|
||||
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
L MaxHolzeiger // Maximum Holzeiger
|
||||
+I // Zeiger Endekennung
|
||||
T Fifo_Ende
|
||||
ITD
|
||||
T AR1Start // Startwert mit Offset 0
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[DBFifo]
|
||||
|
||||
L Fifo_Ende
|
||||
L SFC_DB_LENGTH
|
||||
>I // Fifo-DB ist zu kurz!
|
||||
JC Err0 // kein Fifo-Bereich
|
||||
|
||||
L DBW [AR1Zeiger]
|
||||
L 16#FFEE // Fifo-Endekennung ?
|
||||
<>I // Nein !
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L MinHolzeiger // Minimum Holzeiger
|
||||
L Holzeiger // Holzeiger
|
||||
<=I // Ok ?
|
||||
JC W300 // Ja!
|
||||
|
||||
L 0 // Grundstellung ?
|
||||
<>I // Nein !
|
||||
JC Err6 // Holzeiger ist ausserhalb
|
||||
|
||||
L Holzeiger // Holzeiger Grundstellung ?
|
||||
<>I // Nein !
|
||||
JC Err6 // Holzeiger ist ausserhalb
|
||||
|
||||
L Anzahl // Anzahl Datensätze
|
||||
L 0 // Grundstellung ?
|
||||
<>I // Nein !
|
||||
JC Err6 // Holzeiger ist ausserhalb
|
||||
|
||||
L MinHolzeiger // Minimum Holzeiger
|
||||
T Bringzeiger // Bringzeiger
|
||||
T Holzeiger // Holzeiger
|
||||
|
||||
W300: L MaxHolzeiger // Maximum Holzeiger
|
||||
<=I // Ok ?
|
||||
JC W301 // Ja!
|
||||
JU Err6 // Holzeiger ist ausserhalb
|
||||
|
||||
|
||||
W301: L Bringzeiger // Bringzeiger
|
||||
L Holzeiger // Holzeiger
|
||||
==I // Identisch !
|
||||
A(
|
||||
L FifoLaenge
|
||||
L Anzahl // Anzahl der gespeicherten Datensätze
|
||||
<>I // Fifo noch nicht voll !
|
||||
)
|
||||
A(
|
||||
L 0
|
||||
<>I // Datensätze aber noch vorhanden !
|
||||
)
|
||||
JC Err7 // Versatz Bring-/Holzeiger
|
||||
|
||||
L Bringzeiger // Bringzeiger
|
||||
L Holzeiger // Holzeiger
|
||||
<>I // Ungleich !
|
||||
A(
|
||||
L FifoLaenge
|
||||
L Anzahl // Anzahl der gespeicherten Datensätze
|
||||
==I // Aber Fifo ist voll !
|
||||
O(
|
||||
L 0
|
||||
==I // Aber keine Datensätze vorhanden !
|
||||
)
|
||||
)
|
||||
JC Err7 // Versatz Bring-/Holzeiger
|
||||
|
||||
L Anzahl // Anzahl der gespeicherten Datensätze
|
||||
L 0
|
||||
==I // Keine Datensätze vorhanden !
|
||||
JC Err2 // Fifo ist leer
|
||||
|
||||
|
||||
--- NW 4: Offset bilden ---
|
||||
L 0
|
||||
L CH_POS
|
||||
>=I
|
||||
JC Err3 // falscher Parameter bei Aufruf
|
||||
|
||||
L FifoLaenge // Max.Anzahl von Datenblöcken
|
||||
>I
|
||||
JC Err3 // falscher Parameter bei Aufruf
|
||||
|
||||
L Anzahl // Anzahl der Datensätze
|
||||
L CH_POS
|
||||
<I
|
||||
JC Err4 // Fifo ist leer
|
||||
|
||||
+ -1 // 1.Teil = Holzeiger !
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
*I
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
L Holzeiger // Holzeiger
|
||||
+I
|
||||
W400: T Offset // Schreibzeiger
|
||||
L MaxHolzeiger // Maximum Holzeiger
|
||||
<=I
|
||||
JC Nw05
|
||||
|
||||
L FifoLaenge // Max.Anzahl von Datenblöcken
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
*I
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
T AlleDaten // Bytes für alle Datensätze
|
||||
|
||||
L Offset // Schreibzeiger
|
||||
L AlleDaten
|
||||
-I
|
||||
JU W400
|
||||
|
||||
|
||||
--- NW 5: Quelle-Pointer erzeugen: ---
|
||||
Nw05: L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0
|
||||
T LW10 // Any-Kennung, Datentyp
|
||||
L Datensatzlaenge // Datenbytes speichern
|
||||
T LW2
|
||||
T LW12 // Wiederholungen
|
||||
|
||||
// DATEN-Pointer übernehmen:
|
||||
L P#
|
||||
LAR1
|
||||
|
||||
L NoneW [AR1,]
|
||||
T LW4 // DB_Nummer
|
||||
L NoneD [AR1,]
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
// Ziel-Pointer erzeugen:
|
||||
// Kennung + Datenbytes s.o.
|
||||
|
||||
L SSDB
|
||||
T LW14 // DB_Nummer
|
||||
L Offset // Adresse
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD16 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // FIFO-Daten speichern
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
|
||||
|
||||
--- NW 6: Fehlerausgabe / RET_VAL ---
|
||||
SET // VKE = 1 ohne Fehler !!!
|
||||
JU Ok
|
||||
Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich
|
||||
T Err
|
||||
JU Err
|
||||
Err1: S L32.1 // SFC20-Aufruf mit Fehler
|
||||
JU Err
|
||||
Err2: S L32.2 // Fifo ist voll
|
||||
JU Err
|
||||
Err3: S L32.3 // Falscher Parameter
|
||||
JU Err
|
||||
Err4: S L32.4 // Position nicht belegt
|
||||
JU Err
|
||||
Err6: S L32.6 // Holzeiger außerhalb
|
||||
JU Err
|
||||
Err7: S L32.7 // Versatz Bring-/Holzeiger
|
||||
|
||||
Err: CLR // VKE = 0 bei Fehler !!!
|
||||
Ok: L Err
|
||||
T RE_VAL
|
||||
L Status
|
||||
OW
|
||||
T Status
|
||||
|
||||
SAVE // VKE in BIE-Bit speichern
|
||||
|
||||
|
||||
--- NW 7: Fifokopfdaten speichern ---
|
||||
A L32.0 // Falscher Parameter
|
||||
A NixSave // Status nicht speichern
|
||||
BEC
|
||||
|
||||
L SSDW
|
||||
+ 10 // Status
|
||||
ITD
|
||||
T AR1Start // Startwert mit Offset 0
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[DBFifo]
|
||||
|
||||
L Err
|
||||
T DBW [AR1Zeiger]
|
||||
|
||||
@@ -0,0 +1,376 @@
|
||||
=== FC 83: FIFOSearch [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
SSDB : Int // Schnittstellen-DB
|
||||
SSDW : Int // Schnittstellen-1.DW
|
||||
SEARCHDATEN : Pointer // SuchDaten-Schnittstelle
|
||||
Laenge : Int // Anzahl der DWs zum Vergleichen im Datensatz
|
||||
Output:
|
||||
RE_POS : Int // Position des Eintrags, der gesuchten Daten
|
||||
RE_VAL : Byte // Rückmeldungen
|
||||
InOut:
|
||||
Temp:
|
||||
Quelle : Any // Zeiger, wo Rein-Daten sind
|
||||
Ziel : Any // Zeiger, FIFO-Stelle
|
||||
Kopf : Byte // Fifo-Kennung (FF)
|
||||
Datensatzlaenge : Byte // Datensatzlänge in Word (1 - 128)
|
||||
FifoLaenge : Int // Länge des Fifo (maximale Anzahl der Datensätze)
|
||||
Bringzeiger : Int // Zeiger, wohin nächster Eintrag gespeichert wird
|
||||
Holzeiger : Int // Zeiger, woher nächste Daten geholt werden
|
||||
Anzahl : Int // Anzahl der Datensätze (eingetragene)
|
||||
Status : Word // Status des Fifo
|
||||
Err : Byte // Fehlerbits
|
||||
MinHolzeiger : Int // Minimum Holzeiger
|
||||
MaxHolzeiger : Int // Maximum Holzeiger
|
||||
DBFifo : Word // FIFO-DB
|
||||
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
|
||||
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
|
||||
Fifo_Ende : Word // Ende des Fifo
|
||||
AR2_Speicher : DWord // Adress-Register 2 zwischenspeichern
|
||||
DBSuchdaten : Word // Solldaten-DB, falls angegeben
|
||||
SuchDaten_Startpunkt : Word // SuchDaten-Startpunkt: Adresse
|
||||
SuchZeiger : Word // Suchzeiger
|
||||
Schleife : Word // Loopzähler
|
||||
NixSave : Bool // Status nicht speichern
|
||||
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
|
||||
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
AR1Start : DInt // Startwert mit Offset 0
|
||||
sRE_POS : Int // Position des Eintrags, der gesuchten Daten
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
|
||||
--- NW 1: Schnittstellen-DB sinnvoll ? ---
|
||||
TAR2
|
||||
T AR2_Speicher // AR2 zwischenspeichern
|
||||
|
||||
L SSDB
|
||||
T DBFifo
|
||||
|
||||
// CALL TEST_DB
|
||||
// DB_NUMBER :=#DBFifo
|
||||
// RET_VAL :=#SFC_RET_VAL
|
||||
// DB_LENGTH :=#SFC_DB_LENGTH
|
||||
// WRITE_PROT :=#SFC_WRITE_PROT
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBFifo, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
= NixSave // Status nicht speichern
|
||||
O SFC_WRITE_PROT
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
|
||||
--- NW 2: Quelle-Pointer erzeugen: ---
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T sRE_POS // Any-Kennung, Datentyp
|
||||
L 16#0006 // 6 Dw´s holen
|
||||
T LW2 // Wiederholungen
|
||||
L SSDB
|
||||
T LW4 // DB_Nummer
|
||||
L SSDW // Adresse
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 6) // 1.-6.DW FIFO holen
|
||||
|
||||
L Status
|
||||
L 2#0000_0000_1110_0000
|
||||
AW
|
||||
T Err
|
||||
JP Err // Kapitalfehler vorhanden
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
|
||||
|
||||
--- NW 3: Zeigerüberprüfung ---
|
||||
L Kopf // Fifo-Kopf
|
||||
L 16#FF // = Fifokennung ?
|
||||
<>I // Nein !
|
||||
= NixSave // Status nicht speichern
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L 1
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
>I
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L 128
|
||||
>I
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L 1
|
||||
L FifoLaenge // Max.Anzahl von Datenblöcken
|
||||
>I
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L SSDW
|
||||
+ 40 // Speichern ab 20.DW
|
||||
T MinHolzeiger // Minimum Holzeiger
|
||||
|
||||
L FifoLaenge // Länge FIFO (in Word)
|
||||
+ -1
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
*I
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
+ 40 // Speichern ab 20.DW
|
||||
L SSDW
|
||||
+I
|
||||
T MaxHolzeiger // Maximum Holzeiger
|
||||
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
L MaxHolzeiger // Maximum Holzeiger
|
||||
+I // Zeiger Endekennung
|
||||
T Fifo_Ende
|
||||
ITD
|
||||
T AR1Start // Startwert mit Offset 0
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[DBFifo]
|
||||
|
||||
L Fifo_Ende
|
||||
L SFC_DB_LENGTH
|
||||
>I // Fifo-DB ist zu kurz!
|
||||
JC Err0 // kein Fifo-Bereich
|
||||
|
||||
L DBW [AR1Zeiger]
|
||||
L 16#FFEE // Fifo-Endekennung ?
|
||||
<>I // Nein !
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L MinHolzeiger // Minimum Holzeiger
|
||||
L Holzeiger // Holzeiger
|
||||
<=I // Ok ?
|
||||
JC W300 // Ja!
|
||||
|
||||
L 0 // Grundstellung ?
|
||||
<>I // Nein !
|
||||
JC Err6 // Holzeiger ist ausserhalb
|
||||
|
||||
L Bringzeiger // Bringzeiger Grundstellung ?
|
||||
<>I // Nein !
|
||||
JC Err6 // Holzeiger ist ausserhalb
|
||||
|
||||
L Anzahl // Anzahl Datensätze
|
||||
L 0 // Grundstellung ?
|
||||
<>I // Nein !
|
||||
JC Err6 // Holzeiger ist ausserhalb
|
||||
|
||||
L MinHolzeiger // Minimum Holzeiger
|
||||
T Bringzeiger // Bringzeiger
|
||||
T Holzeiger // Holzeiger
|
||||
|
||||
JU Err2 // Fifo ist leer
|
||||
|
||||
W300: L MaxHolzeiger // Maximum Holzeiger
|
||||
<=I // Ok ?
|
||||
JC W301 // Ja!
|
||||
JU Err6 // Holzeiger ist ausserhalb
|
||||
|
||||
|
||||
W301: L Bringzeiger // Bringzeiger
|
||||
L Holzeiger // Holzeiger
|
||||
==I // Identisch !
|
||||
A(
|
||||
L FifoLaenge
|
||||
L Anzahl // Anzahl der gespeicherten Datensätze
|
||||
<>I // Fifo noch nicht voll !
|
||||
)
|
||||
A(
|
||||
L 0
|
||||
<>I // Datensätze aber noch vorhanden !
|
||||
)
|
||||
JC Err7 // Versatz Bring-/Holzeiger
|
||||
|
||||
L Bringzeiger // Bringzeiger
|
||||
L Holzeiger // Holzeiger
|
||||
<>I // Ungleich !
|
||||
A(
|
||||
L FifoLaenge
|
||||
L Anzahl // Anzahl der gespeicherten Datensätze
|
||||
==I // Aber Fifo ist voll !
|
||||
O(
|
||||
L 0
|
||||
==I // Aber keine Datensätze vorhanden !
|
||||
)
|
||||
)
|
||||
JC Err7 // Versatz Bring-/Holzeiger
|
||||
|
||||
L Anzahl // Anzahl der gespeicherten Datensätze
|
||||
L 0
|
||||
==I // Keine Datensätze vorhanden !
|
||||
JC Err2 // Fifo ist leer
|
||||
|
||||
|
||||
--- NW 4: Fifodaten suchen ---
|
||||
L 1
|
||||
T sRE_POS // RET-POS
|
||||
|
||||
L Holzeiger // Holzeiger
|
||||
T SuchZeiger // Suchzeiger
|
||||
W400: ITD
|
||||
T AR1Start // Startwert mit Offset 0
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
// DATEN-Pointer übernehmen:
|
||||
L P#
|
||||
LAR2
|
||||
|
||||
L NoneW [AR2,]
|
||||
T DBSuchdaten // Solldaten-DB
|
||||
|
||||
L DBSuchdaten // Solldaten-DB
|
||||
L 0 // Angegeben ?
|
||||
==I // Nein
|
||||
JC W401
|
||||
|
||||
// CALL TEST_DB
|
||||
// DB_NUMBER :=#DBSuchdaten
|
||||
// RET_VAL :=#SFC_RET_VAL
|
||||
// DB_LENGTH :=#SFC_DB_LENGTH
|
||||
// WRITE_PROT :=#SFC_WRITE_PROT
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBSuchdaten, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000 // Fehler vorhanden ?
|
||||
<>I // Ja !
|
||||
JC Err1 // SFC20-Aufruf mit Fehler
|
||||
|
||||
L NoneD [AR2,] // Kennung, Adresse
|
||||
L 16#00FF_FFFF // Ohne Kennung
|
||||
AW
|
||||
SRW 3 // Ohne Bit
|
||||
T SuchDaten_Startpunkt
|
||||
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
L SuchDaten_Startpunkt
|
||||
+I
|
||||
L SFC_DB_LENGTH
|
||||
>I // Indaten-DB ist zu kurz
|
||||
JC Err1 // SFC20-Aufruf mit Fehler
|
||||
|
||||
W401: L NoneD [AR2,] // Kennung, Adresse
|
||||
LAR2
|
||||
|
||||
L Laenge // Anzahl der DWs zum Vergleichen im Datensatz
|
||||
L400: T Schleife
|
||||
|
||||
L DBSuchdaten // Solldaten-DB
|
||||
L 0 // Angegeben ?
|
||||
==I // Nein
|
||||
JC W402
|
||||
|
||||
OPN DB[DBSuchdaten]
|
||||
|
||||
W402: L NoneW [AR2,] // Mit Solldaten überprüfen
|
||||
OPN DB[DBFifo]
|
||||
L DBW [AR1Zeiger] // Fifo-Daten lesen
|
||||
<>I // nicht identisch !
|
||||
JC W403
|
||||
|
||||
L AR1Start // Startwert mit Offset 0
|
||||
+ DINT#2
|
||||
T AR1Start // Startwert mit nächstem Offset
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
ADDAR2 P#2.0
|
||||
|
||||
L Schleife
|
||||
LOOP L400
|
||||
|
||||
JU Ende // Datensatz ist in Fifo enthalten
|
||||
|
||||
W403: L sRE_POS // RET-POS
|
||||
+ 1
|
||||
T sRE_POS // RET-POS
|
||||
L Anzahl // Anzahl der Daten im Fifo
|
||||
>I // Alle Datensätze sind durchsucht
|
||||
JC Err2
|
||||
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
L SuchZeiger // Suchzeiger
|
||||
+I
|
||||
T SuchZeiger // Suchzeiger
|
||||
L MaxHolzeiger // Maximum Holzeiger
|
||||
<=I // Ende erreicht? Nein!
|
||||
JC W404
|
||||
|
||||
L MinHolzeiger // Minimum Holzeiger
|
||||
T SuchZeiger
|
||||
|
||||
W404: L SuchZeiger // Suchzeiger
|
||||
JU W400
|
||||
|
||||
|
||||
--- NW 5: Fehlerausgabe / RET_VAL ---
|
||||
Ende: SET // VKE = 1 ohne Fehler !!!
|
||||
JU Ok
|
||||
Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich
|
||||
T Err
|
||||
JU Err
|
||||
Err1: S L32.1 // SFC20-Aufruf mit Fehler
|
||||
JU Err
|
||||
Err2: S L32.2 // Fifo ist leer
|
||||
JU Err
|
||||
Err6: S L32.6 // Holzeiger außerhalb
|
||||
JU Err
|
||||
Err7: S L32.7 // Versatz Bring-/Holzeiger
|
||||
|
||||
Err: L 0
|
||||
T sRE_POS // RET-POS = 0
|
||||
|
||||
CLR // VKE = 0 bei Fehler !!!
|
||||
|
||||
Ok: L Err
|
||||
T RE_VAL
|
||||
L Status
|
||||
OW
|
||||
T Status
|
||||
|
||||
SAVE // VKE in BIE-Bit speichern
|
||||
|
||||
|
||||
--- NW 6: Fifokopfdaten speichern ---
|
||||
L AR2_Speicher // AR2 zurückspeichern
|
||||
LAR2
|
||||
|
||||
A L32.0 // Falscher Parameter
|
||||
A NixSave // Status nicht speichern
|
||||
BEC
|
||||
|
||||
L SSDW
|
||||
+ 10 // Status
|
||||
ITD
|
||||
T AR1Start // Startwert mit Offset 0
|
||||
SLD 3
|
||||
T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[DBFifo]
|
||||
|
||||
L Err
|
||||
T DBW [AR1Zeiger]
|
||||
|
||||
|
||||
--- NW 7: ---
|
||||
L sRE_POS
|
||||
T RE_POS
|
||||
@@ -0,0 +1,500 @@
|
||||
=== FC 80: FifoIn [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
SSDB : Int // Schnittstellen-DB
|
||||
SSDW : Int // Schnittstellen-1.DW
|
||||
PARA : Word // Aufrufparameter (Auftrag / Anzahl Zusatzdaten)
|
||||
INDATEN : Pointer // InDaten-Schnittstelle
|
||||
Output:
|
||||
RE_VAL : Byte // Rückmeldung
|
||||
InOut:
|
||||
Temp:
|
||||
Quelle : Any // Zeiger, wo Rein-Daten sind
|
||||
Ziel : Any // Zeiger, FIFO-Stelle
|
||||
Kopf : Byte // Fifo-Kennung (FF)
|
||||
Datensatzlaenge : Byte // Datensatzlänge in Word (1 - 128)
|
||||
FifoLaenge : Int // Länge des Fifo (maximale Anzahl der Datensätze)
|
||||
Bringzeiger : Int // Zeiger, wohin nächster Eintrag gespeichert wird
|
||||
Holzeiger : Int // Zeiger, woher nächste Daten geholt werden
|
||||
Anzahl : Int // Anzahl der Datensätze (eingetragene)
|
||||
Status : Word // Status des Fifo
|
||||
Err : Byte // Fehlerbits
|
||||
Para1 : Byte // 1.Aufrufparameter
|
||||
Para2 : Byte // 2.Aufrufparameter
|
||||
Para21 : Byte // 2.Aufrufparameter 1.Stelle
|
||||
Para22 : Byte // 2.Aufrufparameter 2.Stelle
|
||||
MinBringzeiger : Int // Minimum Bringzeiger
|
||||
MaxBringzeiger : Int // Maximum Bringzeiger
|
||||
DBFifo : Word // FIFO-DB
|
||||
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
|
||||
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
|
||||
Fifo_Ende : Word // Ende des Fifo
|
||||
Schleife : Word // Loopzähler
|
||||
Offset : Byte // Offset 1. zu speicherndes Zusatzwort
|
||||
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
|
||||
NixSave : Bool // Status nicht speichern
|
||||
BieSpeicher : Bool // Bie-Bit zwischenspeichern
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
|
||||
--- NW 1: Schnittstellen-DB sinnvoll ? ---
|
||||
L SSDB
|
||||
T DBFifo
|
||||
|
||||
// CALL TEST_DB
|
||||
// DB_NUMBER :=#DBFifo
|
||||
// RET_VAL :=#SFC_RET_VAL
|
||||
// DB_LENGTH :=#SFC_DB_LENGTH
|
||||
// WRITE_PROT :=#SFC_WRITE_PROT
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBFifo, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
O SFC_WRITE_PROT
|
||||
= NixSave // Status nicht speichern
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
|
||||
--- NW 2: Quelle-Pointer erzeugen: ---
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0 // Any-Kennung, Datentyp
|
||||
L 16#0006 // 6 Dw´s holen
|
||||
T LW2 // Wiederholungen
|
||||
L SSDB
|
||||
T LW4 // DB_Nummer
|
||||
L SSDW // Adresse
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 6) // 1.-6.DW FIFO holen
|
||||
|
||||
L Status
|
||||
L 2#0000_0000_1110_0000
|
||||
AW
|
||||
T Err
|
||||
JP Err // Kapitalfehler vorhanden
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
|
||||
|
||||
--- NW 3: Zeigerüberprüfung ---
|
||||
L Kopf // Fifo-Kopf
|
||||
L 16#FF // = Fifokennung ?
|
||||
<>I // Nein !
|
||||
= NixSave // Status nicht speichern
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L 1
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
>I
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L 128
|
||||
>I
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L 1
|
||||
L FifoLaenge // Max.Anzahl von Datenblöcken
|
||||
>I
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L SSDW
|
||||
+ 40 // Speichern ab 20.DW
|
||||
T MinBringzeiger // Minimum Bringzeiger
|
||||
|
||||
L FifoLaenge // Länge FIFO (in Word)
|
||||
+ -1
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
*I
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
+ 40 // Speichern ab 20.DW
|
||||
L SSDW
|
||||
+I
|
||||
T MaxBringzeiger // Maximum Bringzeiger
|
||||
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
L MaxBringzeiger // Maximum Bringzeiger
|
||||
+I // Zeiger Endekennung
|
||||
T Fifo_Ende
|
||||
SLW 3 // Pointer erzeugen
|
||||
LAR1
|
||||
|
||||
OPN DB[DBFifo]
|
||||
|
||||
L Fifo_Ende
|
||||
L SFC_DB_LENGTH
|
||||
>I // Fifo-DB ist zu kurz!
|
||||
JC Err0 // kein Fifo-Bereich
|
||||
|
||||
L DBW [AR1,]
|
||||
L 16#FFEE // Fifo-Endekennung ?
|
||||
<>I // Nein !
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L MinBringzeiger // Minimum Bringzeiger
|
||||
L Bringzeiger // Bringzeiger
|
||||
<=I // Ok ?
|
||||
JC W300 // Ja!
|
||||
|
||||
L 0 // Grundstellung ?
|
||||
<>I // Nein !
|
||||
JC Err5 // Bringzeiger ist ausserhalb
|
||||
|
||||
L Holzeiger // Holzeiger Grundstellung ?
|
||||
<>I // Nein !
|
||||
JC Err5 // Bringzeiger ist ausserhalb
|
||||
|
||||
L Anzahl // Anzahl Datensätze
|
||||
L 0 // Grundstellung ?
|
||||
<>I // Nein !
|
||||
JC Err5 // Bringzeiger ist ausserhalb
|
||||
|
||||
L MinBringzeiger // Minimum Bringzeiger
|
||||
T Bringzeiger // Bringzeiger
|
||||
T Holzeiger // Holzeiger
|
||||
|
||||
W300: L MaxBringzeiger // Maximum Bringzeiger
|
||||
<=I // Ok ?
|
||||
JC W301 // Ja!
|
||||
JU Err5 // Bringzeiger ist ausserhalb
|
||||
|
||||
|
||||
W301: L Bringzeiger // Bringzeiger
|
||||
L Holzeiger // Holzeiger
|
||||
==I // Identisch !
|
||||
A(
|
||||
L FifoLaenge
|
||||
L Anzahl // Anzahl der gespeicherten Datensätze
|
||||
<>I // Fifo noch nicht voll !
|
||||
)
|
||||
A(
|
||||
L 0
|
||||
<>I // Datensätze aber noch vorhanden !
|
||||
)
|
||||
JC Err7 // Versatz Bring-/Holzeiger
|
||||
|
||||
L Bringzeiger // Bringzeiger
|
||||
L Holzeiger // Holzeiger
|
||||
<>I // Ungleich !
|
||||
A(
|
||||
L FifoLaenge
|
||||
L Anzahl // Anzahl der gespeicherten Datensätze
|
||||
==I // Aber Fifo ist voll !
|
||||
O(
|
||||
L 0
|
||||
==I // Aber keine Datensätze vorhanden !
|
||||
)
|
||||
)
|
||||
JC Err7 // Versatz Bring-/Holzeiger
|
||||
|
||||
|
||||
--- NW 4: Nur Zusatzdaten / als 1.Datensatz speichern ? ---
|
||||
L PARA
|
||||
T LW33 // Aufrufparameter zwischenspeichern
|
||||
|
||||
L 16#02 // Nur Zusatzdaten speichern ?
|
||||
L Para1 // 1.Aufrufparameter
|
||||
<>I // Nein !
|
||||
JC W400
|
||||
|
||||
L Para2 // 2.Aufrufparameter
|
||||
L 16#00 // =0 ?
|
||||
==I // Ja !
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
JU Nw06 // Zusatzdaten speichern
|
||||
|
||||
W400: L 16#01 // Als 1.Datensatz speichern ?
|
||||
<>I // Nein !
|
||||
JC Nw05
|
||||
|
||||
L MinBringzeiger // Minimum Bringzeiger
|
||||
T Bringzeiger // Bringzeiger
|
||||
T Holzeiger // Holzeiger
|
||||
L 0
|
||||
T Anzahl // Anzahl Datensätze
|
||||
|
||||
JU Nw06 // Zusatz-Daten speichern?
|
||||
|
||||
|
||||
--- NW 5: Hat Fifo Platz / Datenbereich leer ? ---
|
||||
Nw05: L Anzahl // Anzahl der gespeicherten Datensätze
|
||||
L FifoLaenge // Max. Anzahl von Datenblöcken
|
||||
<I
|
||||
JC W500
|
||||
|
||||
==I // Identisch !
|
||||
JC Err2 // Fifo ist voll
|
||||
|
||||
JU Err7 // Versatz Bring-/Holzeiger
|
||||
|
||||
W500: L Bringzeiger // Bringzeiger
|
||||
SLW 3 // Pointer erzeugen
|
||||
LAR1
|
||||
|
||||
OPN DB[DBFifo]
|
||||
|
||||
L Datensatzlaenge
|
||||
L500: T Schleife
|
||||
|
||||
L DBW [AR1,]
|
||||
L 0
|
||||
<>I
|
||||
JC Err4 // Speicherzelle ist belegt
|
||||
|
||||
ADDAR1 P#2.0
|
||||
|
||||
L Schleife
|
||||
LOOP L500
|
||||
|
||||
|
||||
--- NW 6: Zusatzdaten schreiben ---
|
||||
Nw06: L 16#00 // =0 ?
|
||||
L Para2 // 2.Aufrufparameter
|
||||
==I // Ja !
|
||||
JC Nw07
|
||||
|
||||
L 16#00F0
|
||||
AW
|
||||
SRW 4
|
||||
T Para21 // 1.Stelle isolieren
|
||||
|
||||
L Para2 // 2.Aufrufparameter
|
||||
L 16#000F
|
||||
AW
|
||||
T Para22 // 2.Stelle isolieren
|
||||
|
||||
L Para21
|
||||
L Para22
|
||||
>I // 1.Stelle > 2.Stelle !
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
L 16#04
|
||||
>I // 2.Stelle > 4 !
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
L Para21
|
||||
L 16#00
|
||||
==I // 1.Stelle = 0 !
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
// Quelle-Pointer erzeugen:
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0 // Any-Kennung, Datentyp
|
||||
T LW10 // Any-Kennung, Datentyp
|
||||
L Para22 // bis
|
||||
L Para21 // von
|
||||
-I
|
||||
+ 1
|
||||
T LW2 // Wiederholungen
|
||||
T LW12 // Wiederholungen
|
||||
L 0
|
||||
T LW4 // DB_Nummer
|
||||
|
||||
L Para21 // Beginn ab X.Zusatzwort
|
||||
+ -1
|
||||
L 2 // byteorientiert
|
||||
*I
|
||||
T Offset // Offset 1. zu speicherndes Zusatzwort
|
||||
|
||||
L 16#00F0 // Adresse (ab MW240)
|
||||
L Offset // falls nicht ab 1.Zusatzwort
|
||||
+I
|
||||
SLD 3
|
||||
L 16#8300_0000 // Kennung: Merker
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
// Ziel-Pointer erzeugen:
|
||||
// Kennung + Datenbytes s.o.
|
||||
L SSDB
|
||||
T LW14 // DB_Nummer
|
||||
L SSDW
|
||||
+ 12 // ab 6.Dw speichern
|
||||
L Offset // falls nicht ab 1.Zusatzwort
|
||||
+I
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD16 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // Zusatz-Daten speichern
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
|
||||
|
||||
--- NW 7: Fifodaten schreiben ---
|
||||
Nw07: L 16#FF // Testsendung ?
|
||||
L Para1 // 1.Aufrufparameter
|
||||
==I // Ja !
|
||||
JC Nw08 // Zeiger testweise verändern
|
||||
|
||||
L 16#02 // Nur Zusatzdaten speichern ?
|
||||
==I // Ja !
|
||||
JC Ende // Fertig !
|
||||
|
||||
// Quelle-Pointer erzeugen:
|
||||
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0
|
||||
T LW10 // Any-Kennung, Datentyp
|
||||
L Datensatzlaenge // Datenbytes speichern
|
||||
T LW2
|
||||
T LW12 // Wiederholungen
|
||||
|
||||
// DATEN-Pointer übernehmen:
|
||||
L P#
|
||||
LAR1
|
||||
|
||||
L NoneW [AR1,]
|
||||
T LW4 // DB_Nummer
|
||||
L NoneD [AR1,]
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
// Ziel-Pointer erzeugen:
|
||||
// Kennung + Datenbytes s.o.
|
||||
|
||||
L SSDB
|
||||
T LW14 // DB_Nummer
|
||||
L Bringzeiger // Adresse
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD16 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // FIFO-Daten speichern
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
|
||||
|
||||
--- NW 8: Bringzeiger, Anzahl erhöhen ---
|
||||
Nw08: L Datensatzlaenge // Datenblocklänge
|
||||
L 2 // 1 word = 2 bytes
|
||||
*I
|
||||
L Bringzeiger // Bringzeiger
|
||||
+I
|
||||
T Bringzeiger // Bringzeiger
|
||||
L MaxBringzeiger // Maximum Bringzeiger
|
||||
<=I // Erreicht ?
|
||||
JC W800 // Nein !
|
||||
|
||||
L MinBringzeiger // Minimum Bringzeiger
|
||||
T Bringzeiger // Bringzeiger
|
||||
|
||||
W800: L Anzahl // Anzahl der gespeicherten Datensätze
|
||||
+ 1
|
||||
T Anzahl // Anzahl der gespeicherten Datensätze
|
||||
|
||||
|
||||
--- NW 9: Versatz Bring-/Holzeiger ---
|
||||
L Bringzeiger // Bringzeiger
|
||||
L Holzeiger // Holzeiger
|
||||
==I // Identisch !
|
||||
A(
|
||||
L FifoLaenge
|
||||
L Anzahl // Anzahl der gespeicherten Datensätze
|
||||
<>I // Fifo noch nicht voll !
|
||||
)
|
||||
JC Err7 // Versatz Bring-/Holzeiger
|
||||
|
||||
L Bringzeiger // Bringzeiger
|
||||
L Holzeiger // Holzeiger
|
||||
<>I // Ungleich !
|
||||
A(
|
||||
L FifoLaenge
|
||||
L Anzahl // Anzahl der gespeicherten Datensätze
|
||||
==I // Aber Fifo ist voll !
|
||||
)
|
||||
JC Err7 // Versatz Bring-/Holzeiger
|
||||
|
||||
|
||||
--- NW 10: Fehlerausgabe / RET_VAL ---
|
||||
Ende: SET // VKE = 1 ohne Fehler !!!
|
||||
JU Ok
|
||||
Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich
|
||||
T Err
|
||||
JU Err
|
||||
Err1: S L32.1 // SFC20-Aufruf mit Fehler
|
||||
JU Err
|
||||
Err2: S L32.2 // Fifo ist voll
|
||||
JU Err
|
||||
Err3: S L32.3 // Falscher Parameter
|
||||
JU Err
|
||||
Err4: S L32.4 // Speicherzelle ist belegt
|
||||
JU Err
|
||||
Err5: S L32.5 // Bringzeiger außerhalb
|
||||
JU Err
|
||||
Err7: S L32.7 // Versatz Bring-/Holzeiger
|
||||
|
||||
Err: CLR // VKE = 0 bei Fehler !!!
|
||||
Ok: L Err
|
||||
T RE_VAL
|
||||
L Status
|
||||
OW
|
||||
T Status
|
||||
|
||||
SAVE // VKE in BIE-Bit speichern
|
||||
A ?SW?
|
||||
= BieSpeicher
|
||||
|
||||
--- NW 11: Fifokopfdaten speichern ---
|
||||
A L32.0 // Falscher Parameter
|
||||
A NixSave // Status nicht speichern
|
||||
BEC
|
||||
|
||||
L Anzahl // Anzahl der Datensätze (eingetragene)
|
||||
+ -1 // da vorher zum Test erhöht wurde
|
||||
T "MW254" // Übergabe an FC+1 (für FIFO-FÖBE)
|
||||
|
||||
L 16#FF // Testsendung ?
|
||||
L Para1 // 1.Aufrufparameter
|
||||
==I // Ja !
|
||||
BEC // Weil Zeiger testweise geändert!
|
||||
|
||||
// Ziel-Pointer erzeugen:
|
||||
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T LW10 // Any-Kennung, Datentyp
|
||||
L 16#0004 // 4Dw´s speichern
|
||||
T LW12 // Wiederholungen
|
||||
L SSDB
|
||||
T LW14 // DB_Nummer
|
||||
L SSDW // Adresse
|
||||
L 4
|
||||
+I
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD16 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=P#L24.0 WORD 4, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // Ab Bringzeiger sichern!
|
||||
|
||||
A BieSpeicher
|
||||
SAVE // VKE in BIE-Bit speichern
|
||||
|
||||
L FifoLaenge // Länge des Fifo (maximale Anzahl der Datensätze)
|
||||
T "MW248" // Übergabe an FC+1 (für Durchlaufspeicher)
|
||||
L Bringzeiger // Zeiger, wohin nächster Eintrag gespeichert wird
|
||||
T "MW250" // Übergabe an FC+1 (für Durchlaufspeicher)
|
||||
L Holzeiger // Zeiger, woher nächste Daten geholt werden
|
||||
T "MW252" // Übergabe an FC+1 (für Durchlaufspeicher)
|
||||
L Anzahl // Anzahl der Datensätze (eingetragene)
|
||||
T "MW254" // Übergabe an FC+1 (für Durchlaufspeicher)
|
||||
|
||||
@@ -0,0 +1,502 @@
|
||||
=== FC 81: FifoOut [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
SSDB : Int // Schnittstellen-DB
|
||||
SSDW : Int // Schnittstellen-1.DW
|
||||
PARA : Word // Aufrufparameter (Auftrag / Anzahl Zusatzdaten)
|
||||
Output:
|
||||
OUTDATEN : Pointer // OutDaten-Schnittstelle
|
||||
RE_VAL : Byte // Rückmeldung
|
||||
InOut:
|
||||
Temp:
|
||||
Quelle : Any // Zeiger, wo Rein-Daten sind
|
||||
Ziel : Any // Zeiger, FIFO-Stelle
|
||||
Kopf : Byte // Fifo-Kennung (FF)
|
||||
Datensatzlaenge : Byte // Datensatzlänge in Word (1 - 128)
|
||||
FifoLaenge : Int // Länge des Fifo (maximale Anzahl der Datensätze)
|
||||
Bringzeiger : Int // Zeiger, wohin nächster Eintrag gespeichert wird
|
||||
Holzeiger : Int // Zeiger, woher nächste Daten geholt werden
|
||||
Anzahl : Int // Anzahl der Datensätze (eingetragene)
|
||||
Status : Word // Status des Fifo
|
||||
Err : Byte // Fehlerbits
|
||||
Para1 : Byte // 1.Aufrufparameter
|
||||
Para2 : Byte // 2.Aufrufparameter
|
||||
Para21 : Byte // 2.Aufrufparameter 1.Stelle
|
||||
Para22 : Byte // 2.Aufrufparameter 2.Stelle
|
||||
MinHolzeiger : Int // Minimum Holzeiger
|
||||
MaxHolzeiger : Int // Maximum Holzeiger
|
||||
DBFifo : Word // FIFO-DB
|
||||
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
|
||||
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
|
||||
Fifo_Ende : Word // Ende des Fifo
|
||||
Schleife : Word // Loopzähler
|
||||
Offset : Byte // Offset 1. zu lesendes Zusatzwort
|
||||
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
|
||||
NixSave : Bool // Status nicht speichern
|
||||
BieSpeicher : Bool // Bie-Bit zwischenspeichern
|
||||
Lesezeiger : Int // Lesezeiger
|
||||
Diff : Int // Differenz
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
|
||||
--- NW 1: Schnittstellen-DB sinnvoll ? ---
|
||||
L SSDB
|
||||
T DBFifo
|
||||
|
||||
// CALL TEST_DB
|
||||
// DB_NUMBER :=#DBFifo
|
||||
// RET_VAL :=#SFC_RET_VAL
|
||||
// DB_LENGTH :=#SFC_DB_LENGTH
|
||||
// WRITE_PROT :=#SFC_WRITE_PROT
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBFifo, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
O SFC_WRITE_PROT
|
||||
= NixSave // Status nicht speichern
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
|
||||
--- NW 2: Quelle-Pointer erzeugen: ---
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0 // Any-Kennung, Datentyp
|
||||
L 16#0006 // 6 Dw´s holen
|
||||
T LW2 // Wiederholungen
|
||||
L SSDB
|
||||
T LW4 // DB_Nummer
|
||||
L SSDW // Adresse
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 6) // 1.-6.DW FIFO holen
|
||||
|
||||
L Status
|
||||
L 2#0000_0000_1110_0000
|
||||
AW
|
||||
T Err
|
||||
JP Err // Kapitalfehler vorhanden
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
|
||||
|
||||
--- NW 3: Zeigerüberprüfung ---
|
||||
L Kopf // Fifo-Kopf
|
||||
L 16#FF // = Fifokennung ?
|
||||
<>I // Nein !
|
||||
= NixSave // Status nicht speichern
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L 1
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
>I
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L 128
|
||||
>I
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L 1
|
||||
L FifoLaenge // Max.Anzahl von Datenblöcken
|
||||
>I
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L SSDW
|
||||
+ 40 // Speichern ab 20.DW
|
||||
T MinHolzeiger // Minimum Holzeiger
|
||||
|
||||
L FifoLaenge // Länge FIFO (in Word)
|
||||
+ -1
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
*I
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
+ 40 // Speichern ab 20.DW
|
||||
L SSDW
|
||||
+I
|
||||
T MaxHolzeiger // Maximum Holzeiger
|
||||
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
L MaxHolzeiger // Maximum Holzeiger
|
||||
+I // Zeiger Endekennung
|
||||
T Fifo_Ende
|
||||
SLW 3 // Pointer erzeugen
|
||||
LAR1
|
||||
|
||||
OPN DB[DBFifo]
|
||||
|
||||
L Fifo_Ende
|
||||
L SFC_DB_LENGTH
|
||||
>I // Fifo-DB ist zu kurz!
|
||||
JC Err0 // kein Fifo-Bereich
|
||||
|
||||
L DBW [AR1,]
|
||||
L 16#FFEE // Fifo-Endekennung ?
|
||||
<>I // Nein !
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L MinHolzeiger // Minimum Holzeiger
|
||||
L Holzeiger // Holzeiger
|
||||
<=I // Ok ?
|
||||
JC W300 // Ja!
|
||||
|
||||
L 0 // Grundstellung ?
|
||||
<>I // Nein !
|
||||
JC Err6 // Holzeiger ist ausserhalb
|
||||
|
||||
L Bringzeiger // Bringzeiger Grundstellung ?
|
||||
<>I // Nein !
|
||||
JC Err6 // Holzeiger ist ausserhalb
|
||||
|
||||
L Anzahl // Anzahl Datensätze
|
||||
L 0 // Grundstellung ?
|
||||
<>I // Nein !
|
||||
JC Err6 // Holzeiger ist ausserhalb
|
||||
|
||||
L MinHolzeiger // Minimum Holzeiger
|
||||
T Bringzeiger // Bringzeiger
|
||||
T Holzeiger // Holzeiger
|
||||
|
||||
JU Zus // Zusatzdaten lesen ?
|
||||
|
||||
W300: L MaxHolzeiger // Maximum Holzeiger
|
||||
<=I // Ok ?
|
||||
JC W301 // Ja!
|
||||
JU Err6 // Holzeiger ist ausserhalb
|
||||
|
||||
|
||||
W301: L Bringzeiger // Bringzeiger
|
||||
L Holzeiger // Holzeiger
|
||||
==I // Identisch !
|
||||
A(
|
||||
L FifoLaenge
|
||||
L Anzahl // Anzahl der gespeicherten Datensätze
|
||||
<>I // Fifo noch nicht voll !
|
||||
)
|
||||
A(
|
||||
L 0
|
||||
<>I // Datensätze aber noch vorhanden !
|
||||
)
|
||||
JC Err7 // Versatz Bring-/Holzeiger
|
||||
|
||||
L Bringzeiger // Bringzeiger
|
||||
L Holzeiger // Holzeiger
|
||||
<>I // Ungleich !
|
||||
A(
|
||||
L FifoLaenge
|
||||
L Anzahl // Anzahl der gespeicherten Datensätze
|
||||
==I // Aber Fifo ist voll !
|
||||
O(
|
||||
L 0
|
||||
==I // Aber keine Datensätze vorhanden !
|
||||
)
|
||||
)
|
||||
JC Err7 // Versatz Bring-/Holzeiger
|
||||
|
||||
|
||||
--- NW 4: Zusatzdaten lesen ? ---
|
||||
Zus: L PARA
|
||||
T LW33 // Aufrufparameter zwischenspeichern
|
||||
|
||||
L 16#E2 // Nur Zusatzdaten lesen ?
|
||||
L Para1 // 1.Aufrufparameter
|
||||
==I // Ja !
|
||||
A(
|
||||
L Para2 // 2.Aufrufparameter
|
||||
L 16#00 // =0 ?
|
||||
==I // Ja !
|
||||
)
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
L 16#00 // =0 ?
|
||||
L Para2 // 2.Aufrufparameter
|
||||
==I // Ja !
|
||||
JC Nw05 // Keine Zusatzdaten lesen
|
||||
|
||||
L 16#00F0
|
||||
AW
|
||||
SRW 4
|
||||
T Para21 // 1.Stelle isolieren
|
||||
|
||||
L Para2 // 2.Aufrufparameter
|
||||
L 16#000F
|
||||
AW
|
||||
T Para22 // 2.Stelle isolieren
|
||||
|
||||
L Para21
|
||||
L Para22
|
||||
>I // 1.Stelle > 2.Stelle !
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
L 16#04
|
||||
>I // 2.Stelle > 4 !
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
L Para21
|
||||
L 16#00
|
||||
==I // 1.Stelle = 0 !
|
||||
JC Err3 // Falscher Aufrufparameter
|
||||
|
||||
// Quelle-Pointer erzeugen:
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0 // Any-Kennung, Datentyp
|
||||
T LW10 // Any-Kennung, Datentyp
|
||||
L Para22 // bis
|
||||
L Para21 // von
|
||||
-I
|
||||
+ 1
|
||||
T LW2 // Wiederholungen
|
||||
T LW12 // Wiederholungen
|
||||
|
||||
L Para21 // Beginn ab X.Zusatzwort
|
||||
+ -1
|
||||
L 2 // byteorientiert
|
||||
*I
|
||||
T Offset // Offset 1. zu speicherndes Zusatzwort
|
||||
|
||||
L SSDB
|
||||
T LW4 // DB_Nummer
|
||||
L SSDW
|
||||
+ 12 // ab 6.Dw lesen
|
||||
L Offset // falls nicht ab 1.Zusatzwort
|
||||
+I
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
// Ziel-Pointer erzeugen:
|
||||
// Kennung + Datenbytes s.o.
|
||||
|
||||
L 0
|
||||
T LW14 // DB_Nummer
|
||||
|
||||
L 16#00F0 // Adresse (MW240)
|
||||
L Offset // falls nicht ab 1.Zusatzwort
|
||||
+I
|
||||
SLD 3
|
||||
L 16#8300_0000 // Kennung: Merker
|
||||
OD
|
||||
T LD16 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // Zusatz-Daten speichern
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
|
||||
|
||||
--- NW 5: Fifodaten lesen ---
|
||||
Nw05: L Para1 // 1.Aufrufparameter
|
||||
L 16#E2 // Nur Zusatzdaten lesen ?
|
||||
==I // Ja !
|
||||
JC Ende // Fertig !
|
||||
|
||||
L Anzahl // Anzahl der gespeicherten Datensätze
|
||||
L 0
|
||||
==I // Keine Datensätze vorhanden !
|
||||
JC Err2 // Fifo ist leer
|
||||
|
||||
// Quelle-Pointer erzeugen:
|
||||
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0
|
||||
T LW10 // Any-Kennung, Datentyp
|
||||
L Datensatzlaenge // Datenbytes speichern
|
||||
T LW2
|
||||
T LW12 // Wiederholungen
|
||||
|
||||
L SSDB
|
||||
T LW4 // DB_Nummer
|
||||
|
||||
L Holzeiger // Adresse (erstmal !, falls Para 2=0)
|
||||
T Lesezeiger // Lesezeiger
|
||||
L Para1 // 1.Aufrufparameter
|
||||
L 16#00 // =0 ?
|
||||
==I
|
||||
O(
|
||||
CAC
|
||||
L 16#E1 // Datensatz löschen ?
|
||||
==I // Ja !
|
||||
)
|
||||
JC w050
|
||||
|
||||
CAC // X-te Stelle lesen
|
||||
+ -1 // -1, da 1.ohne Offeset
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
*I
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
L Holzeiger // Adresse
|
||||
+I
|
||||
T Lesezeiger // Lesezeiger
|
||||
L MaxHolzeiger // Maximum Holzeiger
|
||||
<=I // Ist nicht über Maximum !
|
||||
JC w050
|
||||
|
||||
L FifoLaenge // Länge FIFO (in Word)
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
*I
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
T Diff
|
||||
|
||||
L Lesezeiger // Differenz subtrahieren:
|
||||
L Diff
|
||||
-I
|
||||
T Lesezeiger // Lesezeiger
|
||||
|
||||
w050: L Lesezeiger // Lesezeiger
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
// Ziel-Pointer erzeugen:
|
||||
// Kennung + Datenbytes s.o.
|
||||
|
||||
// DATEN-Pointer übernehmen:
|
||||
L P#
|
||||
LAR1
|
||||
|
||||
L NoneW [AR1,]
|
||||
T LW14 // DB_Nummer
|
||||
L NoneD [AR1,]
|
||||
T LD16 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // FIFO-Daten speichern
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
|
||||
|
||||
--- NW 6: Daten aus Fifo austragen ? ---
|
||||
L 16#E1 // Daten löschen ?
|
||||
L Para1 // 1.Aufrufparameter
|
||||
<>I // Nein !
|
||||
JC Ende // Fertig !
|
||||
|
||||
L Holzeiger // Holzeiger
|
||||
SLW 3 // Pointer erzeugen
|
||||
LAR1
|
||||
|
||||
OPN DB[DBFifo]
|
||||
|
||||
L Datensatzlaenge
|
||||
L600: T Schleife
|
||||
|
||||
L 0
|
||||
T DBW [AR1,]
|
||||
|
||||
ADDAR1 P#2.0
|
||||
|
||||
L Schleife
|
||||
LOOP L600
|
||||
|
||||
|
||||
--- NW 7: Holzeiger, Anzahl erniedrigen ---
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
L 2 // 1 word = 2 bytes
|
||||
*I
|
||||
L Holzeiger // Holzeiger
|
||||
+I
|
||||
T Holzeiger // Holzeiger
|
||||
L MaxHolzeiger // Maximum Holzeiger
|
||||
<=I // Erreicht ?
|
||||
JC W700 // Nein !
|
||||
|
||||
L MinHolzeiger // Minimum Holzeiger
|
||||
T Holzeiger // Holzeiger
|
||||
|
||||
W700: L Anzahl // Anzahl der gespeicherten Datensätze
|
||||
+ -1
|
||||
T Anzahl // Anzahl der gespeicherten Datensätze
|
||||
|
||||
|
||||
--- NW 8: Versatz Bring-/Holzeiger ---
|
||||
L Bringzeiger // Bringzeiger
|
||||
L Holzeiger // Holzeiger
|
||||
==I // Identisch !
|
||||
A(
|
||||
L Anzahl // Anzahl der gespeicherten Datensätze
|
||||
L 0
|
||||
<>I // Datensätze aber noch vorhanden !
|
||||
)
|
||||
JC Err7 // Versatz Bring-/Holzeiger
|
||||
|
||||
L Bringzeiger // Bringzeiger
|
||||
L Holzeiger // Holzeiger
|
||||
<>I // Ungleich !
|
||||
A(
|
||||
L Anzahl // Anzahl der gespeicherten Datensätze
|
||||
L 0
|
||||
==I // Aber keine Datensätze vorhanden !
|
||||
)
|
||||
JC Err7 // Versatz Bring-/Holzeiger
|
||||
|
||||
|
||||
--- NW 9: Fehlerausgabe / RET_VAL ---
|
||||
Ende: SET // VKE = 1 ohne Fehler !!!
|
||||
JU Ok
|
||||
Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich
|
||||
T Err
|
||||
JU Err
|
||||
Err1: S L32.1 // SFC20-Aufruf mit Fehler
|
||||
JU Err
|
||||
Err2: S L32.2 // Fifo ist leer
|
||||
JU Err
|
||||
Err3: S L32.3 // Falscher Parameter
|
||||
JU Err
|
||||
Err6: S L32.6 // Holzeiger außerhalb
|
||||
JU Err
|
||||
Err7: S L32.7 // Versatz Bring-/Holzeiger
|
||||
|
||||
Err: CLR // VKE = 0 bei Fehler !!!
|
||||
Ok: L Err
|
||||
T RE_VAL
|
||||
L Status
|
||||
OW
|
||||
T Status
|
||||
|
||||
SAVE // VKE in BIE-Bit speichern
|
||||
A ?SW?
|
||||
= BieSpeicher
|
||||
|
||||
--- NW 10: Fifokopfdaten speichern ---
|
||||
A L32.0 // Falscher Parameter
|
||||
A NixSave // Status nicht speichern
|
||||
BEC
|
||||
|
||||
// Ziel-Pointer erzeugen:
|
||||
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T LW10 // Any-Kennung, Datentyp
|
||||
L 16#0004 // 4Dw´s speichern
|
||||
T LW12 // Wiederholungen
|
||||
L SSDB
|
||||
T LW14 // DB_Nummer
|
||||
L SSDW // Adresse
|
||||
L 4
|
||||
+I
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD16 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=P#L24.0 WORD 4, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // Ab Bringzeiger sichern!
|
||||
|
||||
A BieSpeicher
|
||||
SAVE // VKE in BIE-Bit speichern
|
||||
|
||||
@@ -0,0 +1,204 @@
|
||||
=== FC 82: FifoReset [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
SSDB : Int // Schnittstellen-DB
|
||||
SSDW : Int // Schnittstellen-1.DW
|
||||
PARA : Word // Aufrufparameter (Durchlaufspeicher?)
|
||||
Output:
|
||||
RE_VAL : Byte // Rückmeldung
|
||||
InOut:
|
||||
Temp:
|
||||
Quelle : Any // Zeiger, wo Rein-Daten sind
|
||||
Kopf : Byte // Fifo-Kennung (FF)
|
||||
Datensatzlaenge : Byte // Datensatzlänge in Word (1 - 128)
|
||||
FifoLaenge : Int // Länge des Fifo (maximale Anzahl der Datensätze)
|
||||
Bringzeiger : Int // Zeiger, wohin nächster Eintrag gespeichert wird
|
||||
Holzeiger : Int // Zeiger, woher nächste Daten geholt werden
|
||||
Anzahl : Int // Anzahl der Datensätze (eingetragene)
|
||||
Status : Word // Status des Fifo
|
||||
DBFifo : Word // FIFO-DB
|
||||
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
|
||||
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
|
||||
Fifo_Ende : Word // Ende des Fifo
|
||||
Schleife : Word // Loopzähler
|
||||
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
|
||||
--- NW 1: Schnittstellen-DB sinnvoll ? ---
|
||||
L SSDB
|
||||
T DBFifo
|
||||
|
||||
// CALL TEST_DB
|
||||
// DB_NUMBER :=#DBFifo
|
||||
// RET_VAL :=#SFC_RET_VAL
|
||||
// DB_LENGTH :=#SFC_DB_LENGTH
|
||||
// WRITE_PROT :=#SFC_WRITE_PROT
|
||||
|
||||
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBFifo, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
O SFC_WRITE_PROT
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
|
||||
--- NW 2: Quelle-Pointer erzeugen: ---
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0 // Any-Kennung, Datentyp
|
||||
L 16#0006 // 6 Dw´s holen
|
||||
T LW2 // Wiederholungen
|
||||
L SSDB
|
||||
T LW4 // DB_Nummer
|
||||
L SSDW // Adresse
|
||||
SLD 3
|
||||
L 16#8400_0000 // Kennung: Daten
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L10.0 WORD 6) // 1.-6.DW FIFO holen
|
||||
|
||||
L SFC_RET_VAL
|
||||
L 2#0000_0000_0000_0000
|
||||
<>I
|
||||
JC Err1
|
||||
|
||||
|
||||
--- NW 3: Zeigerüberprüfung ---
|
||||
L Kopf // Fifo-Kopf
|
||||
L 16#FF // = Fifokennung ?
|
||||
<>I // Nein !
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L 1
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
>I
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L 128
|
||||
>I
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L 1
|
||||
L FifoLaenge // Max.Anzahl von Datenblöcken
|
||||
>I
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
L FifoLaenge // Länge FIFO (in Word)
|
||||
L Datensatzlaenge // Datenblocklänge
|
||||
*I
|
||||
L 2 // DB byteorientiert
|
||||
*I
|
||||
+ 40 // Speichern ab 20.DW
|
||||
L SSDW
|
||||
+I
|
||||
T Fifo_Ende
|
||||
SLW 3 // Pointer erzeugen
|
||||
LAR1
|
||||
|
||||
OPN DB[DBFifo]
|
||||
|
||||
L Fifo_Ende
|
||||
L SFC_DB_LENGTH
|
||||
>I // Fifo-DB ist zu kurz!
|
||||
JC Err0 // kein Fifo-Bereich
|
||||
|
||||
L DBW [AR1,]
|
||||
L 16#FFEE // Fifo-Endekennung ?
|
||||
<>I // Nein !
|
||||
JC Err0 // kein Fifobereich
|
||||
|
||||
|
||||
--- NW 4: Fifo-Daten löschen ---
|
||||
L SSDW
|
||||
+ 4 // Ab 2.Dw
|
||||
SLW 3 // Pointer erzeugen
|
||||
LAR1
|
||||
|
||||
OPN DB[DBFifo]
|
||||
|
||||
L Datensatzlaenge
|
||||
L FifoLaenge
|
||||
*I
|
||||
+ 18 // 18 Datenwörter (wortorientiert)
|
||||
L400: T Schleife
|
||||
|
||||
L 0
|
||||
T DBW [AR1,]
|
||||
|
||||
ADDAR1 P#2.0
|
||||
|
||||
L Schleife
|
||||
LOOP L400
|
||||
|
||||
|
||||
|
||||
--- NW 5: Durchlaufspeicher ? ---
|
||||
L PARA // Aufrufparameter
|
||||
SRW 4
|
||||
L 16#000D // Durchlaufspeicher ?
|
||||
<>I // Nein !
|
||||
JC N006
|
||||
|
||||
L SSDW
|
||||
+ 4 // Speichern ab 4.DW
|
||||
SLW 3 // Pointer erzeugen
|
||||
LAR1
|
||||
|
||||
OPN DB[DBFifo]
|
||||
|
||||
L SSDW
|
||||
+ 40 // 1.Speicherzelle
|
||||
T DBW [AR1,] // Bringzeiger
|
||||
T DBW [AR1,] // Holzeiger
|
||||
|
||||
L FifoLaenge // Fifo ist voll
|
||||
T DBW [AR1,] // Anzahl
|
||||
|
||||
L PARA // Aufrufparameter
|
||||
L 16#00D1 // Durchlaufspeicher mit FFFF füllen
|
||||
<>I // Nein !
|
||||
JC N006
|
||||
|
||||
L FifoLaenge // Fifo ist voll
|
||||
T DBW [AR1,] // 1.Zusatz-Dw (Anzahl der Daten)
|
||||
|
||||
L 2#0000_0000_0000_0011 // Daten vorhanden/kommen raus
|
||||
T DBW [AR1,] // 4.Zusatz-Dw (Status)
|
||||
|
||||
L SSDW
|
||||
+ 40 // Ab 20.Dw
|
||||
SLW 3 // Pointer erzeugen
|
||||
LAR1
|
||||
|
||||
OPN DB[DBFifo]
|
||||
|
||||
L Datensatzlaenge
|
||||
L FifoLaenge
|
||||
*I
|
||||
L500: T Schleife
|
||||
|
||||
L 16#FFFF
|
||||
T DBW [AR1,]
|
||||
|
||||
ADDAR1 P#2.0
|
||||
|
||||
L Schleife
|
||||
LOOP L500
|
||||
|
||||
|
||||
--- NW 6: Fehlerausgabe / RET_VAL ---
|
||||
N006: SET // VKE = 1 ohne Fehler !!!
|
||||
L 2#0000_0000_0000_0000
|
||||
JU Ok
|
||||
Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich
|
||||
JU Err
|
||||
Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler
|
||||
|
||||
Err: CLR // VKE = 0 bei Fehler !!!
|
||||
Ok: T RE_VAL
|
||||
|
||||
SAVE // VKE in BIE-Bit speichern
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
=== FC 79: INT_to_BCD (4stellig) [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
Int_Wert : Int
|
||||
Output:
|
||||
BCD_Wert : Word
|
||||
InOut:
|
||||
Temp:
|
||||
Rest : Int
|
||||
Ergebnis : Int
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
|
||||
--- NW 1: Rückmeldung ---
|
||||
L 0 // erst mal köschen
|
||||
T BCD_Wert
|
||||
|
||||
|
||||
--- NW 2: Int-Wert ok ? ---
|
||||
L Int_Wert
|
||||
L 0
|
||||
<I
|
||||
BEC
|
||||
|
||||
CAC
|
||||
L 9999
|
||||
>I
|
||||
BEC
|
||||
|
||||
|
||||
--- NW 3: INT-Wert wandeln ---
|
||||
L Int_Wert
|
||||
L 10 // Damit die linken 3 Stellen
|
||||
/I
|
||||
T LD0 // temporär speichen (s.o.)
|
||||
|
||||
L Ergebnis // linken 3 Stellen
|
||||
ITB // wandeln
|
||||
SLW 4 // Wieder nach links schieben
|
||||
T BCD_Wert // zwischen speichern
|
||||
|
||||
L Rest // rechte Stelle
|
||||
ITB // wandeln
|
||||
L BCD_Wert // Zwischenergebis
|
||||
OW // rechte Stelle dazu
|
||||
T BCD_Wert // BDC-Ergebnis
|
||||
|
||||
|
||||
--- NW 4: Ende ---
|
||||
BE
|
||||
|
||||
@@ -0,0 +1,496 @@
|
||||
=== FB 95: MAntrieb_PowerSave [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
Automatik : Bool // Automatikbetrieb ist aktiv
|
||||
Handbetrieb : Bool // Handbetrieb ist aktiv
|
||||
BereichErr : Bool := 1 // Bereichsstörung -> Antrieb stoppen
|
||||
Q : Bool // Eingang Motorschutz ok
|
||||
Ptc : Bool // Eingang Motortemperatur ok
|
||||
Fu : Bool // Eingang Frequenzumrichter ok
|
||||
QKontroll : Bool // Jetzt Q-Ok-Meldung von Frequenzumrichter (nach Netz EIN) kontrollieren
|
||||
FuKontroll : Bool // Jetzt Fu-Ok-Meldung von Frequenzumrichter (nach Netz EIN) kontrollieren
|
||||
ErrQuit : Bool // Motorschutzstörung quittieren
|
||||
Kontroll_B : Bool // Kontroll-Sensor für Bewegung
|
||||
T_Nachlauf : Int := 60 // Nachlaufzeit (*1s)
|
||||
Output:
|
||||
Antriebrueck : Bool // Rückwärts-Ausgang des Antriebs
|
||||
Antriebvor : Bool // Vorwärts-Ausgang des Antriebs
|
||||
Jog1 : Bool // Frequenz 1/3 aktivieren
|
||||
Jog2 : Bool // Frequenz 2/3 aktivieren
|
||||
Analog : Int // Ausgangswort für Analogwandler
|
||||
InOut:
|
||||
QErr : Bool // Motorschutzstörung
|
||||
PtcErr : Bool // Temperaturstörung
|
||||
FuErr : Bool // Frequenzumrichter ist gestört
|
||||
Err_Antrieb_verklemmt : Bool // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
|
||||
Static:
|
||||
sJog1 : Bool // Frequenz 1/3 aktivieren
|
||||
sJog2 : Bool // Frequenz 2/3 aktivieren
|
||||
sAntriebrueck : Bool // Rückwärts-Ausgang des Antriebs
|
||||
sAntriebvor : Bool // Vorwärts-Ausgang des Antriebs
|
||||
Stat : "UAntrieb_PowerSave" // Status des Antriebs
|
||||
Temp:
|
||||
Antriebaktiv : Bool // Antrieb ist aktiv
|
||||
Neustart : Bool // Antrieb wurde erneut gestartet
|
||||
Frequenz : Real // Frequenz für FC106
|
||||
Constant:
|
||||
|
||||
--- NW 1: Zeitwert laden ---
|
||||
AN Automatik
|
||||
ON Stat.A_start
|
||||
JC Nw02
|
||||
|
||||
L T_Nachlauf // Zeitwert laden
|
||||
T Stat.T_Zelle
|
||||
|
||||
|
||||
--- NW 2: Zeitwert löschen ---
|
||||
Nw02: AN Automatik
|
||||
O Stat.A_vor
|
||||
O Stat.A_rueck
|
||||
O BereichErr
|
||||
O QErr
|
||||
O FuErr
|
||||
JCN Nw03
|
||||
|
||||
L 0 // Zeitwert löschen
|
||||
// // T #Stat.T_Zelle
|
||||
|
||||
|
||||
--- NW 3: Motorschutzstörung / Temperaturüberwachung ---
|
||||
Nw03: A ErrQuit
|
||||
R QErr
|
||||
AN Q
|
||||
A QKontroll
|
||||
S QErr
|
||||
|
||||
A ErrQuit
|
||||
R PtcErr
|
||||
AN Ptc
|
||||
S PtcErr
|
||||
|
||||
|
||||
--- NW 4: Frequenzumrichterstörung ---
|
||||
AN Stat.Frequenz
|
||||
AN Stat.Analog
|
||||
JC en05
|
||||
|
||||
A ErrQuit
|
||||
ON FuKontroll
|
||||
R FuErr
|
||||
AN Fu
|
||||
A FuKontroll
|
||||
S FuErr
|
||||
|
||||
en05: NOP 0
|
||||
|
||||
--- NW 5: Undefinierte Zustände / Befehle (alle Antriebe) ---
|
||||
A Automatik // Automatik + Hand aktiv
|
||||
A Handbetrieb
|
||||
O
|
||||
AN Automatik // keine Betriebsart
|
||||
AN Handbetrieb
|
||||
O
|
||||
A Stat.A_vor // Vorwärts + Rückwärts aktiv
|
||||
A Stat.A_rueck
|
||||
O
|
||||
A Stat.H_vor
|
||||
A Stat.H_rueck
|
||||
O
|
||||
A BereichErr // Bereichsstörung
|
||||
A Automatik // Automatik aktiv
|
||||
O
|
||||
AN Stat.Normal // Antrieb nicht eindeutig
|
||||
AN Stat.Frequenz
|
||||
AN Stat.Analog
|
||||
O
|
||||
A Stat.Normal
|
||||
A(
|
||||
O Stat.Frequenz
|
||||
O Stat.Analog
|
||||
)
|
||||
O
|
||||
A Stat.Frequenz
|
||||
A Stat.Analog
|
||||
O QErr // Motorschutzstörung
|
||||
O
|
||||
A Automatik // Automatik aktiv
|
||||
A PtcErr // Temperaturstörung
|
||||
JCN en06
|
||||
|
||||
Stop: SET
|
||||
R sAntriebvor
|
||||
R sAntriebrueck
|
||||
R Stat.T_Ausfertig
|
||||
R sJog1
|
||||
R sJog2
|
||||
|
||||
L 0.0 // Zeitwert/Frequenz löschen
|
||||
// // T #Stat.T_Zelle
|
||||
T Frequenz // Frequenz für FC106
|
||||
|
||||
JU RET
|
||||
|
||||
en06: NOP 0
|
||||
|
||||
--- NW 6: Undefinierte Zustände / Befehle (Fu-Zusatz) ---
|
||||
A Stat.Frequenz
|
||||
A(
|
||||
AN Stat.F1 // Keine Frequenz angegeben
|
||||
AN Stat.F2
|
||||
AN Stat.F3
|
||||
O
|
||||
A Stat.F1 // Mehrere Frequenzen angegeben
|
||||
A(
|
||||
O Stat.F2
|
||||
O Stat.F3
|
||||
)
|
||||
O
|
||||
A Stat.F2 // Mehrere Frequenzen angegeben
|
||||
A Stat.F3
|
||||
O FuErr // Frequenzumrichterstörung
|
||||
ON FuKontroll // Frequenzumrichter ist eingeschaltet
|
||||
)
|
||||
JC Stop
|
||||
|
||||
--- NW 7: Undefinierte Zustände / Befehle (Analog-Zusatz) ---
|
||||
A Stat.Analog
|
||||
A(
|
||||
L Stat.F // Keine Frequenz angegeben
|
||||
L 0.0
|
||||
==R
|
||||
AN Stat.F1 // Keine Frequenz angegeben
|
||||
AN Stat.F2
|
||||
AN Stat.F3
|
||||
O FuErr // Frequenzumrichterstörung
|
||||
ON FuKontroll // Frequenzumrichter ist eingeschaltet
|
||||
)
|
||||
JC Stop
|
||||
|
||||
|
||||
--- NW 8: Antrieb vorwärts starten ---
|
||||
A(
|
||||
A Automatik // Automatik ist aktiv
|
||||
AN Stat.A_rueck
|
||||
A(
|
||||
L Stat.T_Zelle
|
||||
L 0 // Nachlaufzeit vorhanden ?
|
||||
<>I // Ja !
|
||||
AN Stat.A_PS // PowerSave-Mode: Bei Ausschaltverzögerung anhalten
|
||||
O Stat.A_vor // Einschalten
|
||||
)
|
||||
O
|
||||
A Handbetrieb // Handbetrieb aktiv
|
||||
A Stat.H_vor // Handtaste vorwärts
|
||||
)
|
||||
AN Stat.Stop_vor // Stoppen
|
||||
A Q // Motorschutz ok
|
||||
AN QErr // Motorschutzstörung noch aktiv
|
||||
= sAntriebvor
|
||||
R Stat.T_Ausfertig
|
||||
|
||||
--- NW 9: Antrieb rückwärts starten ---
|
||||
A(
|
||||
A Automatik // Automatik ist aktiv
|
||||
A Stat.A_rueck // Einschalten
|
||||
O
|
||||
A Handbetrieb // Handbetrieb aktiv
|
||||
A Stat.H_rueck // Handtaste rückwärts
|
||||
)
|
||||
AN Stat.Stop_rueck // Stoppen
|
||||
A Q // Motorschutz ok
|
||||
AN QErr // Motorschutzstörung noch aktiv
|
||||
AN sAntriebvor
|
||||
= sAntriebrueck
|
||||
R Stat.T_Ausfertig
|
||||
|
||||
--- NW 10: Frequenz übergeben (Fu-Zusatz) ---
|
||||
AN Stat.Frequenz
|
||||
AN Stat.Analog
|
||||
JC en11
|
||||
|
||||
A sAntriebvor
|
||||
AN sAntriebrueck
|
||||
O
|
||||
AN sAntriebvor
|
||||
A sAntriebrueck
|
||||
= Antriebaktiv
|
||||
|
||||
A Antriebaktiv
|
||||
A(
|
||||
O Stat.F1
|
||||
O Stat.F3
|
||||
)
|
||||
= sJog1
|
||||
|
||||
A Antriebaktiv
|
||||
A(
|
||||
O Stat.F2
|
||||
O Stat.F3
|
||||
)
|
||||
= sJog2
|
||||
|
||||
AN sJog1 // Keine Geschwindigtkeit aktiv
|
||||
AN sJog2
|
||||
AN Stat.Analog // falls analoge Übergabe erfolgt
|
||||
R sAntriebvor
|
||||
R sAntriebrueck
|
||||
|
||||
en11: NOP 0
|
||||
|
||||
--- NW 11: Frequenz übergeben (Analog-Zusatz) ---
|
||||
AN Stat.Analog
|
||||
JC en12
|
||||
|
||||
A sAntriebvor
|
||||
AN sAntriebrueck
|
||||
O
|
||||
AN sAntriebvor
|
||||
A sAntriebrueck
|
||||
= Antriebaktiv
|
||||
|
||||
L 0.0 // Falls Stop erwünscht
|
||||
|
||||
AN Antriebaktiv
|
||||
JC w090
|
||||
|
||||
L Stat.F
|
||||
w090: T Frequenz // Frequenz für FC106
|
||||
|
||||
L 3000.0 // Maximal 3000 U/min ?
|
||||
<=R // Ja !
|
||||
JC w091
|
||||
|
||||
T Frequenz // Frequenz für FC106
|
||||
|
||||
w091: L Frequenz
|
||||
L 0.0 // Keine Geschwindigtkeit aktiv ?
|
||||
==R // Ja !
|
||||
AN sJog1 // Aber schon Jog-Geschwindigtkeit aktiv
|
||||
AN sJog2
|
||||
R sAntriebvor
|
||||
R sAntriebrueck
|
||||
|
||||
en12: NOP 0
|
||||
|
||||
--- NW 12: Steuersignale zurücksetzen ---
|
||||
RET: A Stat.A_vor // Übergabe an OP
|
||||
= Stat.OP_A_vor
|
||||
|
||||
A Stat.A_start
|
||||
= Stat.OP_A_start
|
||||
|
||||
A Stat.A_PS
|
||||
= Stat.OP_A_PS
|
||||
|
||||
A Stat.Stop_vor
|
||||
= Stat.OP_Stop_vor
|
||||
|
||||
A Stat.Stop_rueck
|
||||
= Stat.OP_Stop_rueck
|
||||
|
||||
L Stat.F
|
||||
T Stat.OP_F
|
||||
|
||||
A Stat.F1
|
||||
= Stat.OP_F1
|
||||
|
||||
A Stat.F2
|
||||
= Stat.OP_F2
|
||||
|
||||
A Stat.F3
|
||||
= Stat.OP_F3
|
||||
|
||||
L 0.0
|
||||
T Stat.F
|
||||
|
||||
SET
|
||||
R Stat.F1
|
||||
R Stat.F2
|
||||
R Stat.F3
|
||||
R Stat.Stop_vor
|
||||
R Stat.Stop_rueck
|
||||
R Stat.Stop_intern
|
||||
R Stat.A_vor
|
||||
R Stat.A_rueck
|
||||
R Stat.A_start
|
||||
R Stat.A_PS
|
||||
R Stat.H_vor
|
||||
R Stat.H_rueck
|
||||
|
||||
|
||||
--- NW 13: Nachlaufzeit läuft ---
|
||||
AN "1s-Impuls" // 1s-Impuls
|
||||
ON sAntriebvor // Antrieb steht
|
||||
JC Nw14
|
||||
|
||||
L Stat.T_Zelle
|
||||
L 0 // Zeit steht ?
|
||||
==I // Ja !
|
||||
JC Nw14
|
||||
|
||||
L Stat.T_Zelle
|
||||
+ -1
|
||||
T Stat.T_Zelle
|
||||
|
||||
L 0 // Zeit gerade abgelaufen ?
|
||||
<=I // Ja !
|
||||
S Stat.T_Ausfertig
|
||||
JCN Nw14
|
||||
|
||||
T Stat.T_Zelle
|
||||
|
||||
|
||||
--- NW 14: Analog-Signal wandeln ---
|
||||
Nw14: AN Stat.Analog
|
||||
JC en14
|
||||
|
||||
CALL SYS "UNSCALE" (IN:=Frequenz, HI_LIM:=200.0, LO_LIM:=0.0, BIPOLAR:=FALSE, RET_VAL:=Stat.RET_VAL_FC106, OUT:=Analog)
|
||||
|
||||
L Stat.RET_VAL_FC106
|
||||
L 0 // Fehler vorhanden ?
|
||||
<>I // Ja !
|
||||
R sAntriebvor // Antrieb stoppen
|
||||
R sAntriebrueck
|
||||
|
||||
en14: NOP 0
|
||||
|
||||
|
||||
--- NW 15: Ausgänge an OP übergeben ---
|
||||
A sAntriebvor
|
||||
AN Stat.OP_Out_Mvor // beim letzten Zyklus war Motor nicht eingeschaltet
|
||||
O
|
||||
A sAntriebrueck
|
||||
AN Stat.OP_Out_Mrueck // beim letzten Zyklus war Motor nicht eingeschaltet
|
||||
= Neustart // Antrieb wurde erneut gestartet
|
||||
|
||||
A sAntriebvor
|
||||
= Stat.OP_Out_Mvor
|
||||
|
||||
A sAntriebrueck
|
||||
= Stat.OP_Out_Mrueck
|
||||
|
||||
|
||||
--- NW 16: Verklemm-Kontrolle ---
|
||||
AN Stat.Kontroll_B_verbaut // Parameter 4: Kontroll-Sensor für Bewegung ist eingebaut
|
||||
R Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
|
||||
JC en16
|
||||
|
||||
A ErrQuit
|
||||
A Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
|
||||
JC w161
|
||||
|
||||
|
||||
A Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
|
||||
R sAntriebvor // Antrieb anhalten
|
||||
R sAntriebrueck
|
||||
JC en16
|
||||
|
||||
AN Kontroll_B // Sensor ist nicht aktiv
|
||||
JC w160
|
||||
|
||||
// Also Sensor aktiv:
|
||||
L 0 // Inaktiv-Zeit nullen
|
||||
T Stat.Raster_B_inaktiv
|
||||
|
||||
AN sAntriebvor // Antrieb steht
|
||||
AN sAntriebrueck
|
||||
ON "100ms-Impuls" // 0,1s-Impuls
|
||||
JC en16
|
||||
|
||||
L Stat.Raster_B_aktiv
|
||||
L "MW2" // Anzahl der 100ms-Takte
|
||||
+I
|
||||
T Stat.Raster_B_aktiv
|
||||
L 20 // 2s erreicht ?
|
||||
>=I // Ja !
|
||||
S Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
|
||||
|
||||
JU en16
|
||||
|
||||
// Sensor inaktiv:
|
||||
w160: L 0 // Aktiv-Zeit nullen
|
||||
T Stat.Raster_B_aktiv
|
||||
|
||||
AN sAntriebvor // Antrieb steht
|
||||
AN sAntriebrueck
|
||||
ON "100ms-Impuls" // 0,1s-Impuls
|
||||
JC en16
|
||||
|
||||
L Stat.Raster_B_inaktiv
|
||||
L "MW2" // Anzahl der 100ms-Takte
|
||||
+I
|
||||
T Stat.Raster_B_inaktiv
|
||||
L 20 // 2s erreicht ?
|
||||
>=I // Ja !
|
||||
S Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
|
||||
|
||||
JU en16
|
||||
|
||||
w161: L 0
|
||||
T Stat.Raster_B_aktiv // Aktiv-Zeit nullen
|
||||
T Stat.Raster_B_inaktiv // Inaktiv-Zeit nullen
|
||||
|
||||
SET
|
||||
R Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
|
||||
|
||||
en16: NOP 0
|
||||
|
||||
|
||||
--- NW 17: Anzahl der Einschaltungen speichern ---
|
||||
AN Neustart // Antrieb wurde erneut gestartet
|
||||
JC en17
|
||||
|
||||
L Stat.Statistik.Einschaltungen
|
||||
+ DINT#1 // Anzahl der Einschaltungen +1
|
||||
T Stat.Statistik.Einschaltungen
|
||||
|
||||
en17: NOP 0
|
||||
|
||||
|
||||
--- NW 18: Ausgangsvariablen schreiben ---
|
||||
A sAntriebvor
|
||||
= Antriebvor
|
||||
|
||||
A sAntriebrueck
|
||||
= Antriebrueck
|
||||
|
||||
A sJog1
|
||||
= Jog1
|
||||
|
||||
A sJog2
|
||||
= Jog2
|
||||
|
||||
|
||||
--- NW 19: Gesamt-Laufzeit aufaddieren ---
|
||||
AN sAntriebvor // Antrieb steht
|
||||
AN sAntriebrueck
|
||||
ON "1s-Impuls" // 1s-Impuls
|
||||
BEC
|
||||
|
||||
L Stat.Statistik.Laufzeit_s
|
||||
+ 1 // Laufzeit des Antriebs in Sekunden+1
|
||||
T Stat.Statistik.Laufzeit_s
|
||||
L 60 // Eine Minte erreicht ?
|
||||
<I // Nein !
|
||||
BEC
|
||||
|
||||
L 0
|
||||
T Stat.Statistik.Laufzeit_s
|
||||
L Stat.Statistik.Laufzeit_m
|
||||
+ 1 // Laufzeit des Antriebs in Minuten+1
|
||||
T Stat.Statistik.Laufzeit_m
|
||||
L 60 // Eine Stunde erreicht ?
|
||||
<I // Nein !
|
||||
BEC
|
||||
|
||||
L 0
|
||||
T Stat.Statistik.Laufzeit_m
|
||||
L Stat.Statistik.Laufzeit_h
|
||||
+ 1 // Laufzeit des Antriebs in Stunden+1
|
||||
T Stat.Statistik.Laufzeit_h
|
||||
|
||||
|
||||
--- NW 20: Ende ---
|
||||
BE
|
||||
|
||||
@@ -0,0 +1,496 @@
|
||||
=== FB 93: MAntrieb_all [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
Automatik : Bool // Automatikbetrieb ist aktiv
|
||||
Handbetrieb : Bool // Handbetrieb ist aktiv
|
||||
BereichErr : Bool := 1 // Bereichsstörung -> Antrieb stoppen
|
||||
Q : Bool // Eingang Motorschutz ok
|
||||
Ptc : Bool // Eingang Motortemperatur ok
|
||||
Fu : Bool // Eingang Frequenzumrichter ok
|
||||
QKontroll : Bool // Jetzt Q-Ok-Meldung von Frequenzumrichter (nach Netz EIN) kontrollieren
|
||||
FuKontroll : Bool // Jetzt Fu-Ok-Meldung von Frequenzumrichter (nach Netz EIN) kontrollieren
|
||||
ErrQuit : Bool // Motorschutzstörung quittieren
|
||||
Kontroll_B : Bool // Kontroll-Sensor für Bewegung
|
||||
Output:
|
||||
Antriebrueck : Bool // Rückwärts-Ausgang des Antriebs
|
||||
Antriebvor : Bool // Vorwärts-Ausgang des Antriebs
|
||||
Jog1 : Bool // Frequenz 1/3 aktivieren
|
||||
Jog2 : Bool // Frequenz 2/3 aktivieren
|
||||
Analog : Int // Ausgangswort für Analogwandler
|
||||
InOut:
|
||||
QErr : Bool // Motorschutzstörung
|
||||
PtcErr : Bool // Temperaturstörung
|
||||
FuErr : Bool // Frequenzumrichter ist gestört
|
||||
Err_Antrieb_verklemmt : Bool // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
|
||||
hStOk : Bool // Anzeige Start n. Störung aktivieren
|
||||
Static:
|
||||
sJog1 : Bool // Frequenz 1/3 aktivieren
|
||||
sJog2 : Bool // Frequenz 2/3 aktivieren
|
||||
sAntriebrueck : Bool // Rückwärts-Ausgang des Antriebs
|
||||
sAntriebvor : Bool // Vorwärts-Ausgang des Antriebs
|
||||
Stat : "UAntrieb_all" // Status des Antriebs
|
||||
Temp:
|
||||
Antriebaktiv : Bool // Antrieb ist aktiv
|
||||
Neustart : Bool // Antrieb wurde erneut gestartet
|
||||
Frequenz : Real // Frequenz für FC106
|
||||
Constant:
|
||||
|
||||
--- NW 1: Zeitwert laden ---
|
||||
AN Automatik
|
||||
ON Stat.A_start
|
||||
JC Nw02
|
||||
|
||||
L Stat.T_Nachlauf // Zeitwert laden
|
||||
T Stat.T_Zelle
|
||||
|
||||
|
||||
--- NW 2: Zeitwert löschen ---
|
||||
Nw02: AN Automatik
|
||||
O Stat.A_vor
|
||||
O Stat.A_rueck
|
||||
O BereichErr
|
||||
O QErr
|
||||
O FuErr
|
||||
JCN Nw03
|
||||
|
||||
L 0 // Zeitwert löschen
|
||||
// // T #Stat.T_Zelle
|
||||
|
||||
|
||||
--- NW 3: Motorschutzstörung / Temperaturüberwachung ---
|
||||
Nw03: A ErrQuit
|
||||
R QErr
|
||||
AN Q
|
||||
A QKontroll
|
||||
S QErr
|
||||
|
||||
A ErrQuit
|
||||
R PtcErr
|
||||
AN Ptc
|
||||
S PtcErr
|
||||
|
||||
// Störung ist quittierbar:
|
||||
A Q
|
||||
A QErr
|
||||
O
|
||||
A Ptc
|
||||
A PtcErr
|
||||
S hStOk
|
||||
|
||||
|
||||
--- NW 4: Frequenzumrichterstörung ---
|
||||
AN Stat.Frequenz
|
||||
AN Stat.Analog
|
||||
JC en05
|
||||
|
||||
A ErrQuit
|
||||
ON FuKontroll
|
||||
R FuErr
|
||||
AN Fu
|
||||
A FuKontroll
|
||||
S FuErr
|
||||
|
||||
en05: NOP 0
|
||||
|
||||
--- NW 5: Undefinierte Zustände / Befehle (alle Antriebe) ---
|
||||
A Automatik // Automatik + Hand aktiv
|
||||
A Handbetrieb
|
||||
O
|
||||
AN Automatik // keine Betriebsart
|
||||
AN Handbetrieb
|
||||
O
|
||||
A Stat.A_vor // Vorwärts + Rückwärts aktiv
|
||||
A Stat.A_rueck
|
||||
O
|
||||
A Stat.H_vor
|
||||
A Stat.H_rueck
|
||||
O
|
||||
A BereichErr // Bereichsstörung
|
||||
A Automatik // Automatik aktiv
|
||||
O
|
||||
AN Stat.Normal // Antrieb nicht eindeutig
|
||||
AN Stat.Frequenz
|
||||
AN Stat.Analog
|
||||
O
|
||||
A Stat.Normal
|
||||
A(
|
||||
O Stat.Frequenz
|
||||
O Stat.Analog
|
||||
)
|
||||
O
|
||||
A Stat.Frequenz
|
||||
A Stat.Analog
|
||||
O QErr // Motorschutzstörung
|
||||
O
|
||||
A Automatik // Automatik aktiv
|
||||
A PtcErr // Temperaturstörung
|
||||
JCN en06
|
||||
|
||||
Stop: SET
|
||||
R sAntriebvor
|
||||
R sAntriebrueck
|
||||
R Stat.T_Ausfertig
|
||||
R sJog1
|
||||
R sJog2
|
||||
|
||||
L 0.0 // Zeitwert/Frequenz löschen
|
||||
// // T #Stat.T_Zelle
|
||||
T Frequenz // Frequenz für FC106
|
||||
|
||||
JU RET
|
||||
|
||||
en06: NOP 0
|
||||
|
||||
--- NW 6: Undefinierte Zustände / Befehle (Fu-Zusatz) ---
|
||||
A Stat.Frequenz
|
||||
A(
|
||||
AN Stat.F1 // Keine Frequenz angegeben
|
||||
AN Stat.F2
|
||||
AN Stat.F3
|
||||
O
|
||||
A Stat.F1 // Mehrere Frequenzen angegeben
|
||||
A(
|
||||
O Stat.F2
|
||||
O Stat.F3
|
||||
)
|
||||
O
|
||||
A Stat.F2 // Mehrere Frequenzen angegeben
|
||||
A Stat.F3
|
||||
O FuErr // Frequenzumrichterstörung
|
||||
ON FuKontroll // Frequenzumrichter ist eingeschaltet
|
||||
)
|
||||
JC Stop
|
||||
|
||||
--- NW 7: Undefinierte Zustände / Befehle (Analog-Zusatz) ---
|
||||
A Stat.Analog
|
||||
A(
|
||||
L Stat.F // Keine Frequenz angegeben
|
||||
L 0.0
|
||||
==R
|
||||
AN Stat.F1 // Keine Frequenz angegeben
|
||||
AN Stat.F2
|
||||
AN Stat.F3
|
||||
O FuErr // Frequenzumrichterstörung
|
||||
ON FuKontroll // Frequenzumrichter ist eingeschaltet
|
||||
)
|
||||
JC Stop
|
||||
|
||||
|
||||
--- NW 8: Antrieb vorwärts starten ---
|
||||
A(
|
||||
A Automatik // Automatik ist aktiv
|
||||
AN Stat.A_rueck
|
||||
A(
|
||||
L Stat.T_Zelle
|
||||
L 0 // Nachlaufzeit vorhanden ?
|
||||
<>I // Ja !
|
||||
O Stat.A_start
|
||||
O Stat.A_vor // Einschalten
|
||||
)
|
||||
O
|
||||
A Handbetrieb // Handbetrieb aktiv
|
||||
A Stat.H_vor // Handtaste vorwärts
|
||||
)
|
||||
AN Stat.Stop_vor // Stoppen
|
||||
A Q // Motorschutz ok
|
||||
AN QErr // Motorschutzstörung noch aktiv
|
||||
= sAntriebvor
|
||||
R Stat.T_Ausfertig
|
||||
|
||||
--- NW 9: Antrieb rückwärts starten ---
|
||||
A(
|
||||
A Automatik // Automatik ist aktiv
|
||||
A Stat.A_rueck // Einschalten
|
||||
O
|
||||
A Handbetrieb // Handbetrieb aktiv
|
||||
A Stat.H_rueck // Handtaste rückwärts
|
||||
)
|
||||
AN Stat.Stop_rueck // Stoppen
|
||||
A Q // Motorschutz ok
|
||||
AN QErr // Motorschutzstörung noch aktiv
|
||||
AN sAntriebvor
|
||||
= sAntriebrueck
|
||||
R Stat.T_Ausfertig
|
||||
|
||||
--- NW 10: Frequenz übergeben (Fu-Zusatz) ---
|
||||
AN Stat.Frequenz
|
||||
AN Stat.Analog
|
||||
JC en11
|
||||
|
||||
A sAntriebvor
|
||||
AN sAntriebrueck
|
||||
O
|
||||
AN sAntriebvor
|
||||
A sAntriebrueck
|
||||
= Antriebaktiv
|
||||
|
||||
A Antriebaktiv
|
||||
A(
|
||||
O Stat.F1
|
||||
O Stat.F3
|
||||
)
|
||||
= sJog1
|
||||
|
||||
A Antriebaktiv
|
||||
A(
|
||||
O Stat.F2
|
||||
O Stat.F3
|
||||
)
|
||||
= sJog2
|
||||
|
||||
AN sJog1 // Keine Geschwindigtkeit aktiv
|
||||
AN sJog2
|
||||
AN Stat.Analog // falls analoge Übergabe erfolgt
|
||||
R sAntriebvor
|
||||
R sAntriebrueck
|
||||
|
||||
en11: NOP 0
|
||||
|
||||
--- NW 11: Frequenz übergeben (Analog-Zusatz) ---
|
||||
AN Stat.Analog
|
||||
JC en12
|
||||
|
||||
A sAntriebvor
|
||||
AN sAntriebrueck
|
||||
O
|
||||
AN sAntriebvor
|
||||
A sAntriebrueck
|
||||
= Antriebaktiv
|
||||
|
||||
L 0.0 // Falls Stop erwünscht
|
||||
|
||||
AN Antriebaktiv
|
||||
JC w090
|
||||
|
||||
L Stat.F
|
||||
w090: T Frequenz // Frequenz für FC106
|
||||
|
||||
L 3000.0 // Maximal 3000 U/min ?
|
||||
<=R // Ja !
|
||||
JC w091
|
||||
|
||||
T Frequenz // Frequenz für FC106
|
||||
|
||||
w091: L Frequenz
|
||||
L 0.0 // Keine Geschwindigtkeit aktiv ?
|
||||
==R // Ja !
|
||||
AN sJog1 // Aber schon Jog-Geschwindigtkeit aktiv
|
||||
AN sJog2
|
||||
R sAntriebvor
|
||||
R sAntriebrueck
|
||||
|
||||
en12: NOP 0
|
||||
|
||||
--- NW 12: Steuersignale zurücksetzen ---
|
||||
RET: A Stat.Stop_vor // Übergabe an OP
|
||||
= Stat.OP_Stop_vor
|
||||
|
||||
A Stat.Stop_rueck
|
||||
= Stat.OP_Stop_rueck
|
||||
|
||||
L Stat.F
|
||||
T Stat.OP_F
|
||||
|
||||
A Stat.F1
|
||||
= Stat.OP_F1
|
||||
|
||||
A Stat.F2
|
||||
= Stat.OP_F2
|
||||
|
||||
A Stat.F3
|
||||
= Stat.OP_F3
|
||||
|
||||
|
||||
L 0.0
|
||||
T Stat.F
|
||||
|
||||
SET
|
||||
R Stat.F1
|
||||
R Stat.F2
|
||||
R Stat.F3
|
||||
R Stat.Stop_vor
|
||||
R Stat.Stop_rueck
|
||||
R Stat.Stop_intern
|
||||
R Stat.A_vor
|
||||
R Stat.A_rueck
|
||||
R Stat.A_start
|
||||
R Stat.H_vor
|
||||
R Stat.H_rueck
|
||||
|
||||
|
||||
--- NW 13: Nachlaufzeit läuft ---
|
||||
AN "100ms-Impuls" // 0,1s-Impuls
|
||||
ON sAntriebvor // Antrieb steht
|
||||
JC Nw14
|
||||
|
||||
L Stat.T_Zelle
|
||||
L 0 // Zeit steht ?
|
||||
==I // Ja !
|
||||
JC Nw14
|
||||
|
||||
L Stat.T_Zelle
|
||||
L "MW2" // minus 0,1-Takte
|
||||
-I
|
||||
T Stat.T_Zelle
|
||||
|
||||
L 0.0 // Zeit gerade abgelaufen ?
|
||||
<=I // Ja !
|
||||
S Stat.T_Ausfertig
|
||||
JCN Nw14
|
||||
|
||||
T Stat.T_Zelle
|
||||
|
||||
|
||||
--- NW 14: Analog-Signal wandeln ---
|
||||
Nw14: AN Stat.Analog
|
||||
JC en14
|
||||
|
||||
CALL SYS "UNSCALE" (IN:=Frequenz, HI_LIM:=200.0, LO_LIM:=0.0, BIPOLAR:=FALSE, RET_VAL:=Stat.RET_VAL_FC106, OUT:=Analog)
|
||||
|
||||
L Stat.RET_VAL_FC106
|
||||
L 0 // Fehler vorhanden ?
|
||||
<>I // Ja !
|
||||
R sAntriebvor // Antrieb stoppen
|
||||
R sAntriebrueck
|
||||
|
||||
en14: NOP 0
|
||||
|
||||
|
||||
--- NW 15: Ausgänge an OP übergeben ---
|
||||
A sAntriebvor
|
||||
AN Stat.OP_Out_Mvor // beim letzten Zyklus war Motor nicht eingeschaltet
|
||||
O
|
||||
A sAntriebrueck
|
||||
AN Stat.OP_Out_Mrueck // beim letzten Zyklus war Motor nicht eingeschaltet
|
||||
= Neustart // Antrieb wurde erneut gestartet
|
||||
|
||||
A sAntriebvor
|
||||
= Stat.OP_Out_Mvor
|
||||
|
||||
A sAntriebrueck
|
||||
= Stat.OP_Out_Mrueck
|
||||
|
||||
|
||||
--- NW 16: Verklemm-Kontrolle ---
|
||||
AN Stat.Kontroll_B_verbaut // Parameter 4: Kontroll-Sensor für Bewegung ist eingebaut
|
||||
R Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
|
||||
JC en16
|
||||
|
||||
A ErrQuit
|
||||
A Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
|
||||
JC w161
|
||||
|
||||
|
||||
A Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
|
||||
R sAntriebvor // Antrieb anhalten
|
||||
R sAntriebrueck
|
||||
JC en16
|
||||
|
||||
AN Kontroll_B // Sensor ist nicht aktiv
|
||||
JC w160
|
||||
|
||||
// Also Sensor aktiv:
|
||||
L 0 // Inaktiv-Zeit nullen
|
||||
T Stat.Raster_B_inaktiv
|
||||
|
||||
AN sAntriebvor // Antrieb steht
|
||||
AN sAntriebrueck
|
||||
ON "100ms-Impuls" // 0,1s-Impuls
|
||||
JC en16
|
||||
|
||||
L Stat.Raster_B_aktiv
|
||||
L "MW2" // Anzahl der 100ms-Takte
|
||||
+I
|
||||
T Stat.Raster_B_aktiv
|
||||
L 20 // 2s erreicht ?
|
||||
>=I // Ja !
|
||||
S Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
|
||||
|
||||
JU en16
|
||||
|
||||
// Sensor inaktiv:
|
||||
w160: L 0 // Aktiv-Zeit nullen
|
||||
T Stat.Raster_B_aktiv
|
||||
|
||||
AN sAntriebvor // Antrieb steht
|
||||
AN sAntriebrueck
|
||||
ON "100ms-Impuls" // 0,1s-Impuls
|
||||
JC en16
|
||||
|
||||
L Stat.Raster_B_inaktiv
|
||||
L "MW2" // Anzahl der 100ms-Takte
|
||||
+I
|
||||
T Stat.Raster_B_inaktiv
|
||||
L 20 // 2s erreicht ?
|
||||
>=I // Ja !
|
||||
S Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
|
||||
|
||||
JU en16
|
||||
|
||||
w161: L 0
|
||||
T Stat.Raster_B_aktiv // Aktiv-Zeit nullen
|
||||
T Stat.Raster_B_inaktiv // Inaktiv-Zeit nullen
|
||||
|
||||
SET
|
||||
R Err_Antrieb_verklemmt // Antrieb ist verklemmt (kein Kontroll_B oder dauernd aktiv)
|
||||
|
||||
en16: NOP 0
|
||||
|
||||
|
||||
--- NW 17: Anzahl der Einschaltungen speichern ---
|
||||
AN Neustart // Antrieb wurde erneut gestartet
|
||||
JC en17
|
||||
|
||||
L Stat.Statistik.Einschaltungen
|
||||
+ DINT#1 // Anzahl der Einschaltungen +1
|
||||
T Stat.Statistik.Einschaltungen
|
||||
|
||||
en17: NOP 0
|
||||
|
||||
|
||||
--- NW 18: Ausgangsvariablen schreiben ---
|
||||
A sAntriebvor
|
||||
= Antriebvor
|
||||
|
||||
A sAntriebrueck
|
||||
= Antriebrueck
|
||||
|
||||
A sJog1
|
||||
= Jog1
|
||||
|
||||
A sJog2
|
||||
= Jog2
|
||||
|
||||
|
||||
--- NW 19: Gesamt-Laufzeit aufaddieren ---
|
||||
AN sAntriebvor // Antrieb steht
|
||||
AN sAntriebrueck
|
||||
ON "1s-Impuls" // 1s-Impuls
|
||||
BEC
|
||||
|
||||
L Stat.Statistik.Laufzeit_s
|
||||
+ 1 // Laufzeit des Antriebs in Sekunden+1
|
||||
T Stat.Statistik.Laufzeit_s
|
||||
L 60 // Eine Minte erreicht ?
|
||||
<I // Nein !
|
||||
BEC
|
||||
|
||||
L 0
|
||||
T Stat.Statistik.Laufzeit_s
|
||||
L Stat.Statistik.Laufzeit_m
|
||||
+ 1 // Laufzeit des Antriebs in Minuten+1
|
||||
T Stat.Statistik.Laufzeit_m
|
||||
L 60 // Eine Stunde erreicht ?
|
||||
<I // Nein !
|
||||
BEC
|
||||
|
||||
L 0
|
||||
T Stat.Statistik.Laufzeit_m
|
||||
L Stat.Statistik.Laufzeit_h
|
||||
+ 1 // Laufzeit des Antriebs in Stunden+1
|
||||
T Stat.Statistik.Laufzeit_h
|
||||
|
||||
|
||||
--- NW 20: Ende ---
|
||||
BE
|
||||
|
||||
@@ -0,0 +1,565 @@
|
||||
=== FB 181: MAusfahrFreigabe [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
Antrieb_aktiv : Bool
|
||||
Kommt_1 : Bool // BM fährt aus Strecke ausgefahren
|
||||
Kommt_2 : Bool // BM fährt aus Strecke ausgefahren
|
||||
Kommt_3 : Bool // BM fährt aus Strecke ausgefahren
|
||||
Kommt_4 : Bool // BM fährt aus Strecke ausgefahren
|
||||
Kommt_5 : Bool // BM fährt aus Strecke ausgefahren
|
||||
Kommt_6 : Bool // BM fährt aus Strecke ausgefahren
|
||||
Kommt_7 : Bool // BM fährt aus Strecke ausgefahren
|
||||
Kommt_8 : Bool // BM fährt aus Strecke ausgefahren
|
||||
Kommt_9 : Bool // BM fährt aus Strecke ausgefahren
|
||||
Kommt_10 : Bool // BM fährt aus Strecke ausgefahren
|
||||
Kommt_11 : Bool // BM fährt aus Strecke ausgefahren
|
||||
Kommt_12 : Bool // BM fährt aus Strecke ausgefahren
|
||||
Kommt_13 : Bool // BM fährt aus Strecke ausgefahren
|
||||
Kommt_14 : Bool // BM fährt aus Strecke ausgefahren
|
||||
Kommt_15 : Bool // BM fährt aus Strecke ausgefahren
|
||||
Kommt_16 : Bool // BM fährt aus Strecke ausgefahren
|
||||
Kommt_17 : Bool // BM fährt aus Strecke ausgefahren
|
||||
Kommt_18 : Bool // BM fährt aus Strecke ausgefahren
|
||||
Kommt_19 : Bool // BM fährt aus Strecke ausgefahren
|
||||
Kommt_20 : Bool // BM fährt aus Strecke ausgefahren
|
||||
Kommt_21 : Bool // BM fährt aus Strecke ausgefahren
|
||||
Kommt_22 : Bool // BM fährt aus Strecke ausgefahren
|
||||
Kommt_23 : Bool // BM fährt aus Strecke ausgefahren
|
||||
Kommt_24 : Bool // BM fährt aus Strecke ausgefahren
|
||||
Kommt_25 : Bool // BM fährt aus Strecke ausgefahren
|
||||
Vorbei_1 : Bool // BM ist an Sensor vorbeigefahren
|
||||
Vorbei_2 : Bool // BM ist an Sensor vorbeigefahren
|
||||
Vorbei_3 : Bool // BM ist an Sensor vorbeigefahren
|
||||
Vorbei_4 : Bool // BM ist an Sensor vorbeigefahren
|
||||
Vorbei_5 : Bool // BM ist an Sensor vorbeigefahren
|
||||
Nur_1 : Bool // Nachtriggern nur bei Vorbei_1
|
||||
Output:
|
||||
InOut:
|
||||
Static:
|
||||
Para : Struct
|
||||
Sicherheit : Int := 60 // Sicherheitszeit dazu[100ms]
|
||||
Abstand_Lines : Int := 20 // Abstand zwischen 2 Linien [100ms]
|
||||
Position_Vorbei_1 : Int // Vorbei-Sensor in Höhe Linie X
|
||||
Position_Vorbei_2 : Int // Vorbei-Sensor in Höhe Linie X
|
||||
Position_Vorbei_3 : Int // Vorbei-Sensor in Höhe Linie X
|
||||
Position_Vorbei_4 : Int // Vorbei-Sensor in Höhe Linie X
|
||||
Position_Vorbei_5 : Int // Vorbei-Sensor in Höhe Linie X
|
||||
Dyn : Struct
|
||||
RestZeit : Int // BM noch unterwegs [s]
|
||||
Aktiv_Line : Int // Aktive Linie
|
||||
Last_Line : Int // Letzte aktive Linie
|
||||
Nachtrigger_Freigabe : Int // Nachtriggern der Freigabe der ausfahrenden Linie
|
||||
Out : Struct
|
||||
Line_1_Ok : Bool
|
||||
Line_2_Ok : Bool
|
||||
Line_3_Ok : Bool
|
||||
Line_4_Ok : Bool
|
||||
Line_5_Ok : Bool
|
||||
Line_6_Ok : Bool
|
||||
Line_7_Ok : Bool
|
||||
Line_8_Ok : Bool
|
||||
Line_9_Ok : Bool
|
||||
Line_10_Ok : Bool
|
||||
Line_11_Ok : Bool
|
||||
Line_12_Ok : Bool
|
||||
Line_13_Ok : Bool
|
||||
Line_14_Ok : Bool
|
||||
Line_15_Ok : Bool
|
||||
Line_16_Ok : Bool
|
||||
Line_17_Ok : Bool
|
||||
Line_18_Ok : Bool
|
||||
Line_19_Ok : Bool
|
||||
Line_20_Ok : Bool
|
||||
Line_21_Ok : Bool
|
||||
Line_22_Ok : Bool
|
||||
Line_23_Ok : Bool
|
||||
Line_24_Ok : Bool
|
||||
Line_25_Ok : Bool
|
||||
Temp:
|
||||
Constant:
|
||||
|
||||
--- NW 1: Erst mal ---
|
||||
SET
|
||||
R Out.Line_1_Ok
|
||||
R Out.Line_2_Ok
|
||||
R Out.Line_3_Ok
|
||||
R Out.Line_4_Ok
|
||||
R Out.Line_5_Ok
|
||||
R Out.Line_6_Ok
|
||||
R Out.Line_7_Ok
|
||||
R Out.Line_8_Ok
|
||||
R Out.Line_9_Ok
|
||||
R Out.Line_10_Ok
|
||||
R Out.Line_11_Ok
|
||||
R Out.Line_12_Ok
|
||||
R Out.Line_13_Ok
|
||||
R Out.Line_14_Ok
|
||||
R Out.Line_15_Ok
|
||||
R Out.Line_16_Ok
|
||||
R Out.Line_17_Ok
|
||||
R Out.Line_18_Ok
|
||||
R Out.Line_19_Ok
|
||||
R Out.Line_20_Ok
|
||||
R Out.Line_21_Ok
|
||||
R Out.Line_22_Ok
|
||||
R Out.Line_23_Ok
|
||||
R Out.Line_24_Ok
|
||||
R Out.Line_25_Ok
|
||||
|
||||
|
||||
--- NW 2: Vorbei.Sensoren auswerten ---
|
||||
AN Vorbei_1
|
||||
JC V002
|
||||
|
||||
L Para.Position_Vorbei_1
|
||||
L Para.Abstand_Lines
|
||||
*I
|
||||
L Para.Sicherheit
|
||||
+I // Neue RestZeit ermitteln
|
||||
L Dyn.RestZeit // Neuer Wert kleiner?
|
||||
<I // Ja !
|
||||
JC V002 // Ohne Speicherung weiter
|
||||
|
||||
CAC // Neuen Wert übernehmen
|
||||
T Dyn.RestZeit // Wert speichern
|
||||
|
||||
V002: AN Vorbei_2
|
||||
O Nur_1 // Nachtriggern nur bei Vorbei_1
|
||||
JC V003
|
||||
|
||||
L Para.Position_Vorbei_2
|
||||
L Para.Abstand_Lines
|
||||
*I
|
||||
L Para.Sicherheit
|
||||
+I // Neue RestZeit ermitteln
|
||||
L Dyn.RestZeit // Neuer Wert kleiner?
|
||||
<I // Ja !
|
||||
JC V003 // Ohne Speicherung weiter
|
||||
|
||||
CAC // Neuen Wert übernehmen
|
||||
T Dyn.RestZeit // Wert speichern
|
||||
|
||||
V003: AN Vorbei_3
|
||||
O Nur_1 // Nachtriggern nur bei Vorbei_1
|
||||
JC V004
|
||||
|
||||
L Para.Position_Vorbei_3
|
||||
L Para.Abstand_Lines
|
||||
*I
|
||||
L Para.Sicherheit
|
||||
+I // Neue RestZeit ermitteln
|
||||
L Dyn.RestZeit // Neuer Wert kleiner?
|
||||
<I // Ja !
|
||||
JC V004 // Ohne Speicherung weiter
|
||||
|
||||
CAC // Neuen Wert übernehmen
|
||||
T Dyn.RestZeit // Wert speichern
|
||||
|
||||
V004: AN Vorbei_4
|
||||
O Nur_1 // Nachtriggern nur bei Vorbei_1
|
||||
JC V005
|
||||
|
||||
L Para.Position_Vorbei_4
|
||||
L Para.Abstand_Lines
|
||||
*I
|
||||
L Para.Sicherheit
|
||||
+I // Neue RestZeit ermitteln
|
||||
L Dyn.RestZeit // Neuer Wert kleiner?
|
||||
<I // Ja !
|
||||
JC V005 // Ohne Speicherung weiter
|
||||
|
||||
CAC // Neuen Wert übernehmen
|
||||
T Dyn.RestZeit // Wert speichern
|
||||
|
||||
V005: AN Vorbei_5
|
||||
O Nur_1 // Nachtriggern nur bei Vorbei_1
|
||||
JC V00E
|
||||
|
||||
L Para.Position_Vorbei_5
|
||||
L Para.Abstand_Lines
|
||||
*I
|
||||
L Para.Sicherheit
|
||||
+I // Neue RestZeit ermitteln
|
||||
L Dyn.RestZeit // Neuer Wert kleiner?
|
||||
<I // Ja !
|
||||
JC V00E // Ohne Speicherung weiter
|
||||
|
||||
CAC // Neuen Wert übernehmen
|
||||
T Dyn.RestZeit // Wert speichern
|
||||
|
||||
V00E: NOP 0
|
||||
|
||||
|
||||
--- NW 3: Aus-/vorbeifahrendes BM -> Aktivzeit speichern ---
|
||||
L 25
|
||||
A Kommt_25
|
||||
JC Save
|
||||
L 24
|
||||
A Kommt_24
|
||||
JC Save
|
||||
L 23
|
||||
A Kommt_23
|
||||
JC Save
|
||||
L 22
|
||||
A Kommt_22
|
||||
JC Save
|
||||
L 21
|
||||
A Kommt_21
|
||||
JC Save
|
||||
L 20
|
||||
A Kommt_20
|
||||
JC Save
|
||||
L 19
|
||||
A Kommt_19
|
||||
JC Save
|
||||
L 18
|
||||
A Kommt_18
|
||||
JC Save
|
||||
L 17
|
||||
A Kommt_17
|
||||
JC Save
|
||||
L 16
|
||||
A Kommt_16
|
||||
JC Save
|
||||
L 15
|
||||
A Kommt_15
|
||||
JC Save
|
||||
L 14
|
||||
A Kommt_14
|
||||
JC Save
|
||||
L 13
|
||||
A Kommt_13
|
||||
JC Save
|
||||
L 12
|
||||
A Kommt_12
|
||||
JC Save
|
||||
L 11
|
||||
A Kommt_11
|
||||
JC Save
|
||||
L 10
|
||||
A Kommt_10
|
||||
JC Save
|
||||
L 9
|
||||
A Kommt_9
|
||||
JC Save
|
||||
L 8
|
||||
A Kommt_8
|
||||
JC Save
|
||||
L 7
|
||||
A Kommt_7
|
||||
JC Save
|
||||
L 6
|
||||
A Kommt_6
|
||||
JC Save
|
||||
L 5
|
||||
A Kommt_5
|
||||
JC Save
|
||||
L 4
|
||||
A Kommt_4
|
||||
JC Save
|
||||
L 3
|
||||
A Kommt_3
|
||||
JC Save
|
||||
L 2
|
||||
A Kommt_2
|
||||
JC Save
|
||||
L 1
|
||||
A Kommt_1
|
||||
JC Save
|
||||
|
||||
JU Zeit
|
||||
|
||||
Save: T Dyn.Aktiv_Line // Aktive Linie speichern
|
||||
|
||||
L Para.Abstand_Lines
|
||||
*I
|
||||
L Para.Sicherheit
|
||||
+I // RestZeit ermitteln
|
||||
L Dyn.RestZeit // Neuer Wert größer?
|
||||
>=I // Ja !
|
||||
JC Ok
|
||||
|
||||
// Ausgefahrene Stelle ist kleiner:
|
||||
L 0 // Löschen
|
||||
T Dyn.Aktiv_Line // Aktive Linie
|
||||
T Dyn.Nachtrigger_Freigabe // Nachtriggern der Freigabe der ausfahrenden Linie
|
||||
|
||||
BEU
|
||||
|
||||
Ok: CAC // Neuen Wert übernehmen
|
||||
T Dyn.RestZeit // Wert speichern
|
||||
|
||||
// Freigabe aus aktiver Linie verlängern aktivieren:
|
||||
L Para.Sicherheit
|
||||
L Para.Abstand_Lines
|
||||
+I
|
||||
L 10
|
||||
/I
|
||||
L 2 // /Nach 2 Sekunden
|
||||
T Dyn.Nachtrigger_Freigabe // Nachtriggern der Freigabe der ausfahrenden Linie
|
||||
|
||||
|
||||
--- NW 4: Aktiv-/Nachtrigger-Zeit verändern ---
|
||||
Zeit: AN Antrieb_aktiv // Antrieb aktiv
|
||||
ON "1s-Impuls" // 1s-Impuls
|
||||
JC Chk
|
||||
|
||||
// BM ist unterwegs:
|
||||
L Dyn.RestZeit
|
||||
+ -10 // 10*100ms = 1s
|
||||
T Dyn.RestZeit
|
||||
|
||||
L 0 // Minimum erreicht?
|
||||
>I // Nein !
|
||||
JC Trig
|
||||
|
||||
T Dyn.RestZeit // Minimum übergeben
|
||||
|
||||
// Freigabe nachtriggern:
|
||||
Trig: L Dyn.Nachtrigger_Freigabe // Nachtriggern der Freigabe der ausfahrenden Linie
|
||||
+ -1
|
||||
T Dyn.Nachtrigger_Freigabe // Nachtriggern der Freigabe der ausfahrenden Linie
|
||||
|
||||
L 0 // Minimum erreicht?
|
||||
>I // Nein !
|
||||
JC Chk
|
||||
|
||||
T Dyn.Nachtrigger_Freigabe // Minimum übergeben
|
||||
T Dyn.Aktiv_Line
|
||||
T Dyn.Last_Line
|
||||
|
||||
|
||||
--- NW 5: Nachtriggern der Freigabe der ausfahrenden Linie ---
|
||||
Chk: L Dyn.Aktiv_Line // Aktive Linie
|
||||
L Dyn.Last_Line
|
||||
<>I // Unterschiedlich !
|
||||
JC More
|
||||
|
||||
CAC
|
||||
JL ENDE_Mig
|
||||
JU ENDE_Mig // Bei 0
|
||||
JU Li01 // Linie 1 war aktiv
|
||||
JU Li02
|
||||
JU Li03
|
||||
JU Li04
|
||||
JU Li05
|
||||
JU Li06
|
||||
JU Li07
|
||||
JU Li08
|
||||
JU Li09
|
||||
JU Li10
|
||||
JU Li11
|
||||
JU Li12
|
||||
JU Li13
|
||||
JU Li14
|
||||
JU Li15
|
||||
JU Li16
|
||||
JU Li17
|
||||
JU Li18
|
||||
JU Li19
|
||||
JU Li20
|
||||
JU Li21
|
||||
JU Li22
|
||||
JU Li23
|
||||
JU Li24
|
||||
JU Li25 // Linie 25 war aktiv
|
||||
ENDE_Mig: JU More
|
||||
|
||||
Li01: SET
|
||||
S Out.Line_1_Ok
|
||||
BEU
|
||||
Li02: SET
|
||||
S Out.Line_2_Ok
|
||||
BEU
|
||||
Li03: SET
|
||||
S Out.Line_3_Ok
|
||||
BEU
|
||||
Li04: SET
|
||||
S Out.Line_4_Ok
|
||||
BEU
|
||||
Li05: SET
|
||||
S Out.Line_5_Ok
|
||||
BEU
|
||||
Li06: SET
|
||||
S Out.Line_6_Ok
|
||||
BEU
|
||||
Li07: SET
|
||||
S Out.Line_7_Ok
|
||||
BEU
|
||||
Li08: SET
|
||||
S Out.Line_8_Ok
|
||||
BEU
|
||||
Li09: SET
|
||||
S Out.Line_9_Ok
|
||||
BEU
|
||||
Li10: SET
|
||||
S Out.Line_10_Ok
|
||||
BEU
|
||||
Li11: SET
|
||||
S Out.Line_11_Ok
|
||||
BEU
|
||||
Li12: SET
|
||||
S Out.Line_12_Ok
|
||||
BEU
|
||||
Li13: SET
|
||||
S Out.Line_13_Ok
|
||||
BEU
|
||||
Li14: SET
|
||||
S Out.Line_14_Ok
|
||||
BEU
|
||||
Li15: SET
|
||||
S Out.Line_15_Ok
|
||||
BEU
|
||||
Li16: SET
|
||||
S Out.Line_16_Ok
|
||||
BEU
|
||||
Li17: SET
|
||||
S Out.Line_17_Ok
|
||||
BEU
|
||||
Li18: SET
|
||||
S Out.Line_18_Ok
|
||||
BEU
|
||||
Li19: SET
|
||||
S Out.Line_19_Ok
|
||||
BEU
|
||||
Li20: SET
|
||||
S Out.Line_20_Ok
|
||||
BEU
|
||||
Li21: SET
|
||||
S Out.Line_21_Ok
|
||||
BEU
|
||||
Li22: SET
|
||||
S Out.Line_22_Ok
|
||||
BEU
|
||||
Li23: SET
|
||||
S Out.Line_23_Ok
|
||||
BEU
|
||||
Li24: SET
|
||||
S Out.Line_24_Ok
|
||||
BEU
|
||||
Li25: SET
|
||||
S Out.Line_25_Ok
|
||||
BEU
|
||||
|
||||
More: NOP 0
|
||||
|
||||
|
||||
--- NW 6: Freigaben an Pufferstrecken aufgrund der fahrenden BM ---
|
||||
L Dyn.RestZeit
|
||||
L 10
|
||||
/I
|
||||
JL Ende
|
||||
JU Ok01 // Restzeit in 0 Sekunden
|
||||
JU Ok01 // Restzeit in 1 Sekunden
|
||||
JU Ok02 // Restzeit in 2 Sekunden
|
||||
JU Ok02 // Restzeit in 3 Sekunden
|
||||
JU Ok03 // Restzeit in 4 Sekunden
|
||||
JU Ok03 // Restzeit in 5 Sekunden
|
||||
JU Ok04 // Restzeit in 6 Sekunden
|
||||
JU Ok04 // Restzeit in 7 Sekunden
|
||||
JU Ok05 // Restzeit in 8 Sekunden
|
||||
JU Ok05 // Restzeit in 9 Sekunden
|
||||
JU Ok06 // Restzeit in 10 Sekunden
|
||||
JU Ok06 // Restzeit in 11 Sekunden
|
||||
JU Ok07 // Restzeit in 12 Sekunden
|
||||
JU Ok07 // Restzeit in 13 Sekunden
|
||||
JU Ok08 // Restzeit in 14 Sekunden
|
||||
JU Ok08 // Restzeit in 15 Sekunden
|
||||
JU Ok09 // Restzeit in 16 Sekunden
|
||||
JU Ok09 // Restzeit in 17 Sekunden
|
||||
JU Ok10 // Restzeit in 18 Sekunden
|
||||
JU Ok10 // Restzeit in 19 Sekunden
|
||||
JU Ok11 // Restzeit in 20 Sekunden
|
||||
JU Ok11 // Restzeit in 21 Sekunden
|
||||
JU Ok12 // Restzeit in 22 Sekunden
|
||||
JU Ok12 // Restzeit in 23 Sekunden
|
||||
JU Ok13 // Restzeit in 24 Sekunden
|
||||
JU Ok13 // Restzeit in 25 Sekunden
|
||||
JU Ok14 // Restzeit in 26 Sekunden
|
||||
JU Ok14 // Restzeit in 27 Sekunden
|
||||
JU Ok15 // Restzeit in 28 Sekunden
|
||||
JU Ok15 // Restzeit in 29 Sekunden
|
||||
JU Ok16 // Restzeit in 30 Sekunden
|
||||
JU Ok16 // Restzeit in 31 Sekunden
|
||||
JU Ok17 // Restzeit in 32 Sekunden
|
||||
JU Ok17 // Restzeit in 33 Sekunden
|
||||
JU Ok18 // Restzeit in 34 Sekunden
|
||||
JU Ok18 // Restzeit in 35 Sekunden
|
||||
JU Ok19 // Restzeit in 36 Sekunden
|
||||
JU Ok19 // Restzeit in 33 Sekunden
|
||||
JU Ok20 // Restzeit in 38 Sekunden
|
||||
JU Ok20 // Restzeit in 39 Sekunden
|
||||
JU Ok21 // Restzeit in 40 Sekunden
|
||||
JU Ok21 // Restzeit in 41 Sekunden
|
||||
JU Ok22 // Restzeit in 42 Sekunden
|
||||
JU Ok22 // Restzeit in 43 Sekunden
|
||||
JU Ok23 // Restzeit in 44 Sekunden
|
||||
JU Ok23 // Restzeit in 45 Sekunden
|
||||
JU Ok24 // Restzeit in 46 Sekunden
|
||||
JU Ok24 // Restzeit in 43 Sekunden
|
||||
JU Ok25 // Restzeit in 48 Sekunden
|
||||
JU Ok25 // Restzeit in 49 Sekunden
|
||||
Ende: JU En04
|
||||
|
||||
Ok01: SET
|
||||
S Out.Line_1_Ok
|
||||
Ok02: SET
|
||||
S Out.Line_2_Ok
|
||||
Ok03: SET
|
||||
S Out.Line_3_Ok
|
||||
Ok04: SET
|
||||
S Out.Line_4_Ok
|
||||
Ok05: SET
|
||||
S Out.Line_5_Ok
|
||||
Ok06: SET
|
||||
S Out.Line_6_Ok
|
||||
Ok07: SET
|
||||
S Out.Line_7_Ok
|
||||
Ok08: SET
|
||||
S Out.Line_8_Ok
|
||||
Ok09: SET
|
||||
S Out.Line_9_Ok
|
||||
Ok10: SET
|
||||
S Out.Line_10_Ok
|
||||
Ok11: SET
|
||||
S Out.Line_11_Ok
|
||||
Ok12: SET
|
||||
S Out.Line_12_Ok
|
||||
Ok13: SET
|
||||
S Out.Line_13_Ok
|
||||
Ok14: SET
|
||||
S Out.Line_14_Ok
|
||||
Ok15: SET
|
||||
S Out.Line_15_Ok
|
||||
Ok16: SET
|
||||
S Out.Line_16_Ok
|
||||
Ok17: SET
|
||||
S Out.Line_17_Ok
|
||||
Ok18: SET
|
||||
S Out.Line_18_Ok
|
||||
Ok19: SET
|
||||
S Out.Line_19_Ok
|
||||
Ok20: SET
|
||||
S Out.Line_20_Ok
|
||||
Ok21: SET
|
||||
S Out.Line_21_Ok
|
||||
Ok22: SET
|
||||
S Out.Line_22_Ok
|
||||
Ok23: SET
|
||||
S Out.Line_23_Ok
|
||||
Ok24: SET
|
||||
S Out.Line_24_Ok
|
||||
Ok25: SET
|
||||
S Out.Line_25_Ok
|
||||
|
||||
En04: NOP 0
|
||||
|
||||
|
||||
--- NW 7: Letzten aktiven Puffer speichern ---
|
||||
L Dyn.Aktiv_Line // Aktive Linie
|
||||
T Dyn.Last_Line // speichern
|
||||
|
||||
|
||||
--- NW 8: Ende ---
|
||||
BE
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
=== FB 182: MAusfahrFreigabe_neu [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
Impuls : Bool // Zähl-Impuls
|
||||
Vorbei_1 : Bool // BM ist an Sensor vorbeigefahren
|
||||
Vorbei_2 : Bool // BM ist an Sensor vorbeigefahren
|
||||
Vorbei_3 : Bool // BM ist an Sensor vorbeigefahren
|
||||
Vorbei_4 : Bool // BM ist an Sensor vorbeigefahren
|
||||
Vorbei_5 : Bool // BM ist an Sensor vorbeigefahren
|
||||
Inks_Vorbei_1 : Int // Rest-Inks für diese Position
|
||||
Inks_Vorbei_2 : Int // Rest-Inks für diese Position
|
||||
Inks_Vorbei_3 : Int // Rest-Inks für diese Position
|
||||
Inks_Vorbei_4 : Int // Rest-Inks für diese Position
|
||||
Inks_Vorbei_5 : Int // Rest-Inks für diese Position
|
||||
Output:
|
||||
InOut:
|
||||
Antrieb_ein : Bool // Antrieb einschalten
|
||||
Static:
|
||||
Dyn : Struct
|
||||
Rest_Inks : Int := 1 // BM noch unterwegs [Inks]
|
||||
Temp:
|
||||
tAktiv : Int
|
||||
Constant:
|
||||
|
||||
--- NW 1: Vorbei-Sensoren auswerten ---
|
||||
L Inks_Vorbei_5
|
||||
A Vorbei_5
|
||||
JC Chek
|
||||
L Inks_Vorbei_4
|
||||
A Vorbei_4
|
||||
JC Chek
|
||||
L Inks_Vorbei_3
|
||||
A Vorbei_3
|
||||
JC Chek
|
||||
L Inks_Vorbei_2
|
||||
A Vorbei_2
|
||||
JC Chek
|
||||
L Inks_Vorbei_1
|
||||
A Vorbei_1
|
||||
JC Chek
|
||||
|
||||
JU En02
|
||||
|
||||
Chek: L Dyn.Rest_Inks // Neuer Wert kleiner?
|
||||
<I // Ja !
|
||||
JC En02 // Ohne Speicherung weiter
|
||||
|
||||
CAC // Neuen Wert übernehmen
|
||||
T Dyn.Rest_Inks // Wert speichern
|
||||
|
||||
En02: NOP 0
|
||||
|
||||
|
||||
--- NW 2: Rest-Inks verändern ---
|
||||
AN Impuls // Von MImpulsGeber
|
||||
JC En04
|
||||
|
||||
// BT ist unterwegs:
|
||||
L Dyn.Rest_Inks
|
||||
+ -1
|
||||
T Dyn.Rest_Inks
|
||||
|
||||
L 0 // Minimum erreicht?
|
||||
>I // Nein !
|
||||
JC En04
|
||||
|
||||
L 1
|
||||
T Dyn.Rest_Inks // Minimum übergeben
|
||||
|
||||
En04: NOP 0
|
||||
|
||||
|
||||
--- NW 3: Antrieb einschalten ---
|
||||
L Dyn.Rest_Inks
|
||||
L 1 // vorhanden ?
|
||||
>I // Ja !
|
||||
S Antrieb_ein
|
||||
|
||||
|
||||
--- NW 4: Ende ---
|
||||
BE
|
||||
|
||||
@@ -0,0 +1,153 @@
|
||||
=== FB 94: MBlinken [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
Impulsdauer : Bool // Impulsdauer
|
||||
Error_1 : Bool
|
||||
Error_2 : Bool
|
||||
Error_3 : Bool
|
||||
Error_4 : Bool
|
||||
Error_5 : Bool
|
||||
Error_6 : Bool
|
||||
Error_7 : Bool
|
||||
Error_8 : Bool
|
||||
Error_9 : Bool
|
||||
Error_10 : Bool
|
||||
Output:
|
||||
hAnzeige : Bool // Anzeige
|
||||
InOut:
|
||||
Static:
|
||||
Flanke_Ausschalttakt : Bool
|
||||
Kein_Blinken : Bool
|
||||
Ausschalttakte : Int // Betriebsbereit ist ausgeschaltet
|
||||
Temp:
|
||||
Constant:
|
||||
|
||||
--- NW 1: Anzeige bei Error 1-10 1-10 mal blinken lassen ---
|
||||
// Anzeige ausschalten:
|
||||
AN Error_1
|
||||
AN Error_2
|
||||
AN Error_3
|
||||
AN Error_4
|
||||
AN Error_5
|
||||
AN Error_6
|
||||
AN Error_7
|
||||
AN Error_8
|
||||
AN Error_9
|
||||
AN Error_10
|
||||
R hAnzeige
|
||||
R Flanke_Ausschalttakt
|
||||
R Kein_Blinken
|
||||
JC NoAn
|
||||
|
||||
// Anzeige aktivieren
|
||||
A Impulsdauer
|
||||
AN Kein_Blinken
|
||||
= hAnzeige
|
||||
|
||||
A Impulsdauer
|
||||
Fall Flanke_Ausschalttakt
|
||||
JCN mHu
|
||||
|
||||
L Ausschalttakte
|
||||
+ 1
|
||||
T Ausschalttakte
|
||||
|
||||
|
||||
mHu: L Ausschalttakte
|
||||
L 2
|
||||
>=I
|
||||
A Kein_Blinken
|
||||
R Kein_Blinken
|
||||
JC NoAn
|
||||
|
||||
A Kein_Blinken
|
||||
JC En01
|
||||
|
||||
CAC
|
||||
L 1
|
||||
>=I
|
||||
A Error_1
|
||||
S Kein_Blinken
|
||||
JC NoAn
|
||||
|
||||
CAC
|
||||
L 2
|
||||
>=I
|
||||
A Error_2
|
||||
S Kein_Blinken
|
||||
JC NoAn
|
||||
|
||||
CAC
|
||||
L 3
|
||||
>=I
|
||||
A Error_3
|
||||
S Kein_Blinken
|
||||
JC NoAn
|
||||
|
||||
CAC
|
||||
L 4
|
||||
>=I
|
||||
A Error_4
|
||||
S Kein_Blinken
|
||||
JC NoAn
|
||||
|
||||
CAC
|
||||
L 5
|
||||
>=I
|
||||
A Error_5
|
||||
S Kein_Blinken
|
||||
JC NoAn
|
||||
|
||||
CAC
|
||||
L 6
|
||||
>=I
|
||||
A Error_6
|
||||
S Kein_Blinken
|
||||
JC NoAn
|
||||
|
||||
CAC
|
||||
L 7
|
||||
>=I
|
||||
A Error_7
|
||||
S Kein_Blinken
|
||||
JC NoAn
|
||||
|
||||
CAC
|
||||
L 8
|
||||
>=I
|
||||
A Error_8
|
||||
S Kein_Blinken
|
||||
JC NoAn
|
||||
|
||||
CAC
|
||||
L 9
|
||||
>=I
|
||||
A Error_9
|
||||
S Kein_Blinken
|
||||
JC NoAn
|
||||
|
||||
CAC
|
||||
L 10
|
||||
>=I
|
||||
A Error_10
|
||||
S Kein_Blinken
|
||||
JC NoAn
|
||||
|
||||
CAC
|
||||
L 10
|
||||
>I
|
||||
S Kein_Blinken
|
||||
JC NoAn
|
||||
|
||||
JU En01
|
||||
|
||||
NoAn: L 0
|
||||
T Ausschalttakte
|
||||
|
||||
En01: NOP 0
|
||||
|
||||
|
||||
--- NW 2: Ende ---
|
||||
BE
|
||||
|
||||
|
||||
@@ -0,0 +1,208 @@
|
||||
=== FB 1278: MHMEntnahmepuffer [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
EntnahmePuffer_Nr : Int // Aufruf für Leer-Puffer
|
||||
B_LeerpufferEinfahrt : Bool // Sensor Trolley fährt in Leerpuffer
|
||||
Output:
|
||||
Error : Word // Störungen übergeben
|
||||
InOut:
|
||||
hStOk : Bool // Anzeige Start n. Störung aktivieren
|
||||
Static:
|
||||
Res16 : Array[1..4] of Int // Reserve
|
||||
SAVE : Struct
|
||||
Weichen_DB : Int // Weichen-FIFO-DB
|
||||
Weichen_DW : Int // Weichen-FIFO-DW
|
||||
Para : Struct // Parameter
|
||||
Entnahmepuffer_DL_DB : Int // Einsprung Leerpuffer-Datenliste-DB
|
||||
Entnahmepuffer_DL_DW : Int // Einsprung Leerpuffer-Datenliste-DW
|
||||
Res1 : Array[1..2] of Int // Reserve
|
||||
Status2 : Struct
|
||||
Abruf_ist_möglich : Bool // Abruf ist möglich
|
||||
Kein_Stop_mehr : Bool
|
||||
Eintrag_DL_Leerliste_erfolgt : Bool // Eintrag in DLLPPuffer_leer (DB500) erfolgt
|
||||
Eintrag_DL_Reinliste_erfolgt : Bool // Eintrag in DLLPPuffer_Einfahren (DB501) erfolgt
|
||||
Eintrag_Abrufliste_erfolgt : Bool // Eintrag in DLLPPuffer_Ausfahren (DB502) erfolgt
|
||||
Puffer : "UDLHMEntnahmePuffer" // Statische Leerpufferdaten (aus DL)
|
||||
Dyn : Struct // Dynamische Daten
|
||||
Status : Struct
|
||||
Puffer_OUT_leer : Bool // Puffer ist leer
|
||||
Puffer_OUT_hat Platz : Bool // Puffer hat noch Kapazität
|
||||
Undef.Trolley_in_Schleuse_OUT : Bool // Undefinierter Trolley in Schleuse unten erkannt
|
||||
Trolley_fährt_in_Schleuse_OUT : Bool // Trolley fährt in Schleuse (unten)
|
||||
Trolley_wartet_Auftrag : Bool // Trolley wartet auf Auftrag (unten)
|
||||
Trolley_wartet_Bereich+1 : Bool // Trolley wartet auf Bereich +1 (unten)
|
||||
Trolley_fährt_aus_OUT : Bool // Trolley fährt aus (unten)
|
||||
MindestZeit_ok_OUT : Bool // Schleuse ist MindestZeit geöffnet
|
||||
Trolley_draussen_Out : Bool // Trolley ist ausgefahren
|
||||
Trolley_OUT_nicht_in_Schleuse : Bool // Trolley fährt nicht in Schleuse
|
||||
Leer_Check_OUT : Bool // Leerpuffer wird auf leer gecheckt
|
||||
Alles_ausfahren : Bool // Alle Trolleys ausfahren
|
||||
Leerpuffer_initialisieren : Bool // Leerpuffer initialisieren
|
||||
Error_aktiv : Bool // Störung vorhanden
|
||||
Reset_aktiv_OUT : Bool // Reset aktiv
|
||||
TrolleyID_Einfahrt : DInt // Trolley-Nr ist eingefahren
|
||||
Rueckmld : Struct
|
||||
RET_VAL_BLKMOV_EntnahmePuffer : Int // Rückmeldung nach BLKMOV-Aufruf
|
||||
RET_VAL_DL_EntnahmePuffer : Byte // Rückmeldung nach DatenOut-Aufruf
|
||||
RET_VAL_DL_Res_OUT : Byte // Rückmeldung nach DatenOut-Aufruf
|
||||
RET_VAL_DL_EntnahmePufferTrolley_IN : Byte // Rückmeldung nach DatenIN-Aufruf
|
||||
RET_VAL_DL_EntnahmePufferTrolley_OUT : Byte // Rückmeldung nach DatenOut-Aufruf
|
||||
Error : "UErrHMEntnahmePuffer"
|
||||
Stau_Zeit : Int // Sensor B_Einfahrt ist belegt [1s]
|
||||
Stop_Ursache : Word // Stop-Stelle: Nw + Position
|
||||
Res500 : Array[1..206] of Int
|
||||
Temp:
|
||||
Quelle : Any // Zeiger, wo Rein-Daten sind
|
||||
Ziel : Any // Zeiger, FIFO-Stelle
|
||||
Ueb_akt : Bool // Überwachungszeit aktivieren
|
||||
Weiter : Bool // Weiterschaltbedingung ist erfüllt
|
||||
Warte_neu : Bool // Wartezeit neu triggern
|
||||
Warte_stop : Bool // Wartezeit stoppen
|
||||
Inks_Ok : Bool // Starten aufgrund der Inks erlaubt
|
||||
Puffer_ist_leer : Bool // Leerpuffer zeitlang ohne Sensor
|
||||
Abruf_Trolley_vorne : Bool // Abruf-Trolley ist in Schleuse
|
||||
Oberen_Puffer_Freigeben : Bool
|
||||
GesamtAnzahl : Int
|
||||
SSDW : Int
|
||||
Schleife : Word // Loopzähler
|
||||
Trolley : Int
|
||||
Position : Int
|
||||
Constant:
|
||||
|
||||
--- NW 1: Parameter-Übergabe ---
|
||||
L EntnahmePuffer_Nr
|
||||
|
||||
L 275 // Einsprung Puffer-DL
|
||||
T Para.Entnahmepuffer_DL_DB // vor Aufruf übergeben!
|
||||
L 0
|
||||
T Para.Entnahmepuffer_DL_DW
|
||||
|
||||
|
||||
--- NW 2: Statische Entnahmepuffer-Parameter holen ---
|
||||
L Puffer.EntnahmePuffer_Nr // Nummer des EntnahmePuffers
|
||||
L EntnahmePuffer_Nr // Aufruf-Parameter
|
||||
==I // Identisch ?
|
||||
R Dyn.Error.Entnahmepuffer_DL // EntnahmePufferdatenbank fehlerhaft
|
||||
R Dyn.Error.Undef_Entnahmepuffer // undefiniertes EntnahmePuffer
|
||||
JC en06 // Ja !
|
||||
|
||||
T "MW200" // Search-Daten
|
||||
|
||||
CALL FC "DatenOut" (SSDB:=Para.Entnahmepuffer_DL_DB, SSDW:=Para.Entnahmepuffer_DL_DW, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:=Dyn.Rueckmld.RET_VAL_DL_EntnahmePuffer, OUTDATEN:=P#M220.0, Position:="MW196")
|
||||
|
||||
JBI G_Ok
|
||||
|
||||
A "M199.0"
|
||||
JCN w060
|
||||
|
||||
SET
|
||||
= Dyn.Error.Entnahmepuffer_DL // EntnahmePufferdatenbank fehlerhaft
|
||||
|
||||
L 16#A061
|
||||
T Dyn.Stop_Ursache
|
||||
|
||||
BEU
|
||||
|
||||
w060: SET
|
||||
S Dyn.Error.Undef_Entnahmepuffer // undefinierter EntnahmePuffer
|
||||
|
||||
L 16#0062
|
||||
T Dyn.Stop_Ursache
|
||||
|
||||
BEU
|
||||
|
||||
// Kennung + Datenbytes
|
||||
G_Ok: SET
|
||||
R Dyn.Error.Entnahmepuffer_DL // Gefälledatenbank fehlerhaft
|
||||
R Dyn.Error.Undef_Entnahmepuffer // undefinierte Gefällestrecke
|
||||
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0 // Any-Kennung, Datentyp
|
||||
L 20 // Datenwords speichern
|
||||
T LW2 // Wiederholungen
|
||||
|
||||
// Quelle-Pointer erzeugen:
|
||||
L 0 // Bei Merker = 0 !
|
||||
T LW4 // DB_Nummer
|
||||
L 220 // Adresse
|
||||
SLD 3
|
||||
L 16#8300_0000 // Kennung: Merker
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=Dyn.Rueckmld.RET_VAL_BLKMOV_EntnahmePuffer, DSTBLK:=Puffer) // Datenliste-Daten speichern | #Ziel
|
||||
|
||||
L 16#0063
|
||||
T Dyn.Stop_Ursache
|
||||
|
||||
L Dyn.Rueckmld.RET_VAL_BLKMOV_EntnahmePuffer // Rückmeldung
|
||||
L 0 // Fehler vorhanden ?
|
||||
<>I // Ja !
|
||||
= Dyn.Error.Err_BLKMov // Error bei Block kopieren
|
||||
BEC
|
||||
|
||||
L Puffer.Puffer_Typ // Puffertyp = 1278 (EntnahmePuffer)
|
||||
L 1278 // Dieser Aufruf-FB ?
|
||||
==I // Ja !
|
||||
JC w061
|
||||
|
||||
SET
|
||||
S Dyn.Error.Undef_Entnahmepuffer // undefinierter EntnahmePuffer
|
||||
|
||||
L 0 // EntnahmePuffer ungültig !
|
||||
T Puffer.EntnahmePuffer_Nr // Nummer des EntnahmePuffers
|
||||
|
||||
L 16#0064
|
||||
T Dyn.Stop_Ursache
|
||||
|
||||
BEU
|
||||
|
||||
// Defaultwerte übergeben:
|
||||
w061: NOP 0
|
||||
|
||||
BEU
|
||||
|
||||
en06: NOP 0
|
||||
|
||||
|
||||
--- NW 3: Einfahrenden Trolley verarbeiten ---
|
||||
L Dyn.TrolleyID_Einfahrt
|
||||
T "MD220"
|
||||
L DINT#0
|
||||
==I
|
||||
JC NoNewT
|
||||
|
||||
// Neue Position an Gesamt-Trolley-DL übergeben:
|
||||
CALL FC "Trolley_DL_Neue_Pos" (Gesamt_Trolley_DL:=Puffer.Gesamt_Trolley_DL, TrolleyID:=Dyn.TrolleyID_Einfahrt, Position:=Puffer.Puffer_Position, ShopGroup:=Dint#0, Err:="M199.0")
|
||||
|
||||
NoNewT: NOP 0
|
||||
|
||||
|
||||
--- NW 4: Error: Stau Bereich-Eingang ---
|
||||
// Sensor bei Bereichs-Einfahrt bleibt belegt?:
|
||||
AN B_LeerpufferEinfahrt // Sensor Trolley fährt in Bereich (kein Stau !)
|
||||
R Dyn.Error.Err_Stau_Einfahrt // Stau bei Einfahrt
|
||||
JC X090 // StauZeit neu aufziehen
|
||||
|
||||
AN "1s-Impuls"
|
||||
O Dyn.Error.Err_Stau_Einfahrt // Zeit bereits abgelaufen
|
||||
JC Xn09
|
||||
|
||||
L Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s]
|
||||
+ +1
|
||||
T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s]
|
||||
|
||||
L 25 // Stau-Zeit erreicht ?
|
||||
>=I // Ja !
|
||||
S Dyn.Error.Err_Stau_Einfahrt // Stau bei Einfahrt (Quittierung oder Sensor=0, wegen Bürstenantrieb
|
||||
JCN Xn09
|
||||
|
||||
X090: L 0 // Zeiten löschen
|
||||
T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s]
|
||||
|
||||
Xn09: NOP 0
|
||||
|
||||
|
||||
--- NW 5: Ende ---
|
||||
BE
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,873 @@
|
||||
=== FB 1280: MHMOmniWeiche_Plus [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
Weichen_Nr : Int // Aufruf für Weiche
|
||||
ErrQuit : Bool // Ablaufstörung quittieren
|
||||
Fahren_Ok : Bool // Fahren Ok
|
||||
B_Ziel_gerade : Bool // Ziel-Sensor gerade
|
||||
B_Ziel_abzweig : Bool // Ziel-Sensor abzweig
|
||||
Antrieb_Weiche_aktiv : Bool // Weichen-Antrieb aktiv
|
||||
Antrieb_Gerade_aktiv : Bool // Gerade-Antrieb aktiv
|
||||
Antrieb_Abzweig_aktiv : Bool // Abzweig-Antrieb aktiv
|
||||
Weiche_ist_AST : Bool // Weiche ist auf Arbeitsstellung
|
||||
Output:
|
||||
Y_Weiche_gerade : Bool // Weiche auf Gerade schalten
|
||||
Y_Weiche_abzweig : Bool // Weiche auf Abzweig schalten
|
||||
Error : Word // Störungen übergeben
|
||||
InOut:
|
||||
Antrieb_Weiche_vor : Bool // Weichenantrieb einschalten
|
||||
Antrieb_Weiche_stop : Bool // Weichenantrieb stoppen
|
||||
Antrieb_Weiche_gerade_vor : Bool // Weichenantrieb gerade einschalten
|
||||
Antrieb_Weiche_gerade_stop : Bool // Weichenantrieb gerade stoppen
|
||||
Antrieb_Weiche_abzweig_vor : Bool // Weichenantrieb abzweig einschalten
|
||||
Antrieb_Weiche_abzweig_stop : Bool // Weichenantrieb abzweig stoppen
|
||||
hStOk : Bool // Anzeige Start n. Störung aktivieren
|
||||
Static:
|
||||
SAVE : Struct
|
||||
Schleusen_DB : Int // Schleuse-1-DB
|
||||
Schleuse-1_DW : Int // Schleuse-1-DW
|
||||
Res : Array[1..3] of Int // Reserve
|
||||
Para : Struct // Parameter
|
||||
Weichen_DL_DB : Int // Einsprung Weichen-Datenliste-DB
|
||||
Weichen_DL_DW : Int // Einsprung Weichen-Datenliste-DW
|
||||
Schleusen_DL_DB : Int // Einsprung Schleuse-Datenliste-DB
|
||||
Schleusen_DL_DW : Int // Einsprung Schleuse-Datenliste-DW
|
||||
Res1 : Array[1..1] of Int // Reserve
|
||||
Weiche : "UDLHMOmniWeiche_2fach_Plus" // Fahrbereichs Daten
|
||||
Dyn : Struct // Dynamische Daten fürs Einfahren
|
||||
Status : Struct // Status
|
||||
Weiche_frei : Bool // Rückmeldung: Weiche ist wieder frei
|
||||
Kein_StartOk : Bool // Input StartOk <>1
|
||||
Weiche_abzweigen : Bool // Weiche auf Abzweig schalten
|
||||
Weiche_geradeaus : Bool // Weiche auf Gerade schalten
|
||||
MindestZeit_ok : Bool // Mindestzeit für Weichendurchfahrt erreicht?
|
||||
Ziel_erreicht : Bool // Ziel erreicht
|
||||
Frei06 : Bool
|
||||
Weiche_aktiv : Bool // Weiche ist aktiv
|
||||
Auto_akt : Bool
|
||||
Hand_akt : Bool
|
||||
Bereich_ok : Bool
|
||||
MindestZeit_nachtriggern : Bool // Mindestzeit nachtriggern (von Schleuse -1)
|
||||
Warten_auf_Mindestzeit : Bool // Mindestzeit noch nicht abgelaufen
|
||||
Res15 : Bool
|
||||
Error_aktiv : Bool // Störung vorhanden
|
||||
Reset_aktiv : Bool := TRUE // Reset aktiv
|
||||
TrolleyID : DInt // Trolley-Nr (Eintrag Schleuse, Austrag Weiche)
|
||||
Weichen_Ziel : Word // Weichen-Ziel (Eintrag Schleuse, Austrag Weiche)
|
||||
Schleuse -1 : Int // Schleuse, woher Ziel kam
|
||||
Zwischen_Ziel : Word // Zwischen-Ziel
|
||||
HMI : Struct
|
||||
TrolleyID_Weiche : DInt // Trolley-Nr im Weichenbereich (IN:PLC, OUT:PLC)
|
||||
WeichenZiel : DInt // Ziel im Weichenbereich (IN:PLC, OUT:PLC)
|
||||
Weiche_resetten : Bool // Weiche resetten (IN:HMI, Out:PLC)
|
||||
Rueckmld : Struct
|
||||
RET_VAL_BLKMOV_Weiche : Int // Rückmeldung nach BLKMOV-Aufruf
|
||||
RET_VAL_DL_Weichen : Byte // Rückmeldung nach DatenOut-Aufruf
|
||||
RET_VAL_DL_Schleusen : Byte // Rückmeldung nach DatenOut-Aufruf
|
||||
Error : "UErrOmniWeiche_2fach"
|
||||
FahrKontrolle : Struct
|
||||
Para_Mindestzeit : Int // BM erst nach dieser Zeit im Ziel
|
||||
Para_Überwachungszeit : Int // BM nach dieser Zeit in Weiche verklemmt
|
||||
Akt_Mindestzeitzeit : Int // BM erst nach dieser Zeit im Ziel
|
||||
Akt_Überwachungszeit : Int // BM nach dieser Zeit in Weiche verklemmt
|
||||
Leer_Zeit : Int // Lager ist frei [1s]
|
||||
Schalttakte : DInt // Anzahl der getätigten Umschaltungen
|
||||
Frei200 : Array[1..44] of Int
|
||||
Temp:
|
||||
Quelle : Any // Zeiger, wo Rein-Daten sind
|
||||
Ziel : Any // Zeiger, FIFO-Stelle
|
||||
Parameter : Word // Parameter
|
||||
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
AR1Start : DInt // Startwert mit Offset 0
|
||||
Bereich+1ID : Int
|
||||
Bereich+1_DB : Int
|
||||
Keine_Einfahrt : Bool // Keine Einfahrt angemeldet
|
||||
Err_Bereich+1 : Bool
|
||||
Weichen_Trolleys : Bool // Weichen-Trolleys vorhanden
|
||||
ZielSensor_aktiv : Bool
|
||||
Abzweig_Ziel : Bool
|
||||
Gerade_Ziel : Bool
|
||||
Antriebe_ein : Bool
|
||||
Constant:
|
||||
|
||||
--- NW 1: Parameter-Übergabe ---
|
||||
L Weichen_Nr // Aufruf-Parameter (für Baustein beobachten)
|
||||
|
||||
L 279 // Einsprung Weichen-DL
|
||||
T Para.Weichen_DL_DB // vor Aufruf übergeben!
|
||||
L 0
|
||||
T Para.Weichen_DL_DW
|
||||
|
||||
L 274 // Einsprung Schleuse-DL
|
||||
T Para.Schleusen_DL_DB // vor Aufruf übergeben!
|
||||
L 0
|
||||
T Para.Schleusen_DL_DW
|
||||
|
||||
SET
|
||||
R ZielSensor_aktiv // Temp
|
||||
R Weichen_Trolleys
|
||||
R Antriebe_ein
|
||||
R Abzweig_Ziel
|
||||
R Gerade_Ziel
|
||||
|
||||
|
||||
--- NW 2: Gesamt: Out-Bits zum Zurücksetzen ---
|
||||
L Weichen_Nr
|
||||
|
||||
SET
|
||||
// R #Y_Weiche_gerade //Wegen Reset
|
||||
// R #Y_Weiche_abzweig //Wegen Reset
|
||||
|
||||
SET // Erst mal
|
||||
R Dyn.Status.Weiche_frei
|
||||
S Dyn.Status.Weiche_aktiv
|
||||
|
||||
|
||||
--- NW 3: HMI-Zeug ---
|
||||
// Von HMI:
|
||||
A Dyn.HMI.Weiche_resetten
|
||||
R Dyn.HMI.Weiche_resetten // von HMI
|
||||
S Dyn.Status.Reset_aktiv
|
||||
JCN HMI1
|
||||
|
||||
L 0
|
||||
T Dyn.Leer_Zeit // da kein Sk
|
||||
T Dyn.FahrKontrolle.Akt_Mindestzeitzeit
|
||||
T Dyn.FahrKontrolle."Akt_Überwachungszeit"
|
||||
|
||||
SET
|
||||
R Dyn.Error."Übzeit_Gerade"
|
||||
R Dyn.Error."Übzeit_Abzweig"
|
||||
|
||||
// An HMI:
|
||||
HMI1: L Dyn.TrolleyID
|
||||
T Dyn.HMI.TrolleyID_Weiche
|
||||
|
||||
L Dyn.Weichen_Ziel
|
||||
T Dyn.HMI.WeichenZiel
|
||||
|
||||
|
||||
--- NW 4: Störungen nach Außen übergeben ---
|
||||
L 0
|
||||
T "MB200"
|
||||
|
||||
A Dyn.Error.Weichen_DL // Weichen-Datenliste fehlerhaft
|
||||
= "M200.0"
|
||||
A Dyn.Error.Undef_Weiche // undefinierte Weiche
|
||||
= "M200.1"
|
||||
A Dyn.Error.BLKMov // Fehler bei Block kopieren
|
||||
= "M200.2"
|
||||
A Dyn.Error."Undef_Bereich+1"
|
||||
= "M200.3"
|
||||
A Dyn.Error.Frei04
|
||||
= "M200.4"
|
||||
A Dyn.Error.Frei05
|
||||
= "M200.5"
|
||||
A Dyn.Error.Ziel_undefiniert
|
||||
= "M200.6"
|
||||
A Dyn.Error.Err_Schleusen_DL
|
||||
= "M200.7"
|
||||
A Dyn.Error."Err_Undef_Schleuse-1"
|
||||
= "M201.0"
|
||||
A Dyn.Error."Übzeit_Gerade" // BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen)
|
||||
= "M201.1"
|
||||
A Dyn.Error."Übzeit_Abzweig" // BM bei Ausfahrt in Weiche verklemmt (-> Antrieb stoppen)
|
||||
= "M201.2"
|
||||
A Dyn.Error.Gerade_Sensor_aktiv
|
||||
= "M201.3"
|
||||
A Dyn.Error.Abzweig_Sensor_aktiv
|
||||
= "M201.4"
|
||||
A Dyn.Error.Gerade_Bereich_belegt
|
||||
= "M201.5"
|
||||
A Dyn.Error.Abzweig_Bereich_belegt
|
||||
= "M201.6"
|
||||
A Dyn.Status.Reset_aktiv
|
||||
= Dyn.Error.Reset_aktiv
|
||||
= "M201.7"
|
||||
|
||||
L "MW200"
|
||||
T Error // Schnittstelle nach Außen
|
||||
|
||||
// Störung vorhanden:
|
||||
L 0
|
||||
<>I // Ja !
|
||||
= Dyn.Status.Error_aktiv
|
||||
|
||||
// Anzeige Start n. Störung aktivieren:
|
||||
A Dyn.Error."Übzeit_Gerade" // BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen)
|
||||
O Dyn.Error."Übzeit_Abzweig" // BM bei Ausfahrt in Weiche verklemmt (-> Antrieb stoppen)
|
||||
S hStOk
|
||||
|
||||
|
||||
--- NW 5: Statische Weichen-Parameter holen ---
|
||||
L Weiche.Weichen_Nr // Nummer der Weiche
|
||||
L Weichen_Nr // Aufruf-Parameter
|
||||
==I // Identisch ?
|
||||
R Dyn.Error.Weichen_DL // Weichendatenbank fehlerhaft
|
||||
R Dyn.Error.Undef_Weiche // undefinierte Weiche
|
||||
JC en06_Mig // Ja !
|
||||
|
||||
T "MW200" // Search-Daten
|
||||
|
||||
CALL FC "DatenOut" (SSDB:=Para.Weichen_DL_DB, SSDW:=Para.Weichen_DL_DW, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196")
|
||||
|
||||
L "MB199"
|
||||
T Dyn.Rueckmld.RET_VAL_DL_Weichen // Rückmeldung bei Datenbank-Zugriff (Gefälle-DL)
|
||||
|
||||
JBI G_Ok
|
||||
|
||||
A "M199.0"
|
||||
= Dyn.Error.Weichen_DL // Weichendatenbank fehlerhaft
|
||||
BEC
|
||||
|
||||
SET
|
||||
S Dyn.Error.Undef_Weiche // undefinierte Weiche
|
||||
|
||||
BEU
|
||||
|
||||
// Kennung + Datenbytes
|
||||
G_Ok: SET
|
||||
R Dyn.Error.Weichen_DL // Weichendatenbank fehlerhaft
|
||||
R Dyn.Error.Undef_Weiche // undefinierte Weiche
|
||||
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0 // Any-Kennung, Datentyp
|
||||
L 40 // Datenwords speichern
|
||||
T LW2 // Wiederholungen
|
||||
|
||||
// Quelle-Pointer erzeugen:
|
||||
L 0 // Bei Merker = 0 !
|
||||
T LW4 // DB_Nummer
|
||||
L 220 // Adresse
|
||||
SLD 3
|
||||
L 16#8300_0000 // Kennung: Merker
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=Dyn.Rueckmld.RET_VAL_BLKMOV_Weiche, DSTBLK:=Weiche) // Datenliste-Daten speichern | #Ziel
|
||||
|
||||
L Dyn.Rueckmld.RET_VAL_BLKMOV_Weiche // Rückmeldung
|
||||
L 0 // Fehler vorhanden ?
|
||||
<>I // Ja !
|
||||
= Dyn.Error.BLKMov // Error bei Block kopieren
|
||||
BEC
|
||||
|
||||
L Weiche.Weichen_Typ // Weichentyp = 1280 (HM-Weiche 2fach_Plus)
|
||||
L 1280 // Dieser Aufruf-FB ?
|
||||
==I // Ja !
|
||||
JC en06_Mig
|
||||
|
||||
SET
|
||||
S Dyn.Error.Undef_Weiche // undefinierte Weiche
|
||||
|
||||
L 0 // Weiche ungültig !
|
||||
T Weiche.Weichen_Nr // Nummer der Weiche
|
||||
|
||||
BEU
|
||||
|
||||
en06_Mig: NOP 0
|
||||
|
||||
|
||||
--- NW 6:
|
||||
---
|
||||
AN Dyn.Status.Reset_aktiv
|
||||
JC En06
|
||||
|
||||
SET
|
||||
S Antrieb_Weiche_vor
|
||||
S Antrieb_Weiche_gerade_vor // Antrieb gerade einschalten
|
||||
S Antrieb_Weiche_abzweig_vor // Antrieb abzweig einschalten
|
||||
|
||||
AN Antrieb_Weiche_aktiv
|
||||
ON "1s-Impuls"
|
||||
JC En06
|
||||
|
||||
L Dyn.Leer_Zeit // Zeit für LeerCheck [1s]
|
||||
+ +1
|
||||
T Dyn.Leer_Zeit // Zeit für LeerCheck [1s]
|
||||
|
||||
L Weiche.Wartezeit_bis_Weiche_leer // Leer-Zeit erreicht ?
|
||||
<I // Nein !
|
||||
JC En06
|
||||
|
||||
// Dyn.Daten löschen:
|
||||
SET
|
||||
R Dyn.Status.Reset_aktiv
|
||||
R Dyn.Status.Weiche_abzweigen
|
||||
R Dyn.Status.Weiche_geradeaus
|
||||
|
||||
L DINT#0
|
||||
T Dyn.TrolleyID
|
||||
L 0
|
||||
T Dyn.Weichen_Ziel
|
||||
T Dyn.Zwischen_Ziel
|
||||
T Dyn."Schleuse -1"
|
||||
T Dyn.Leer_Zeit
|
||||
T Dyn.FahrKontrolle.Akt_Mindestzeitzeit
|
||||
T Dyn.FahrKontrolle."Akt_Überwachungszeit"
|
||||
T SAVE.Schleusen_DB
|
||||
T SAVE."Schleuse-1_DW"
|
||||
|
||||
// Rückmeldungen löschen:
|
||||
L 0
|
||||
T Dyn.Rueckmld.RET_VAL_DL_Weichen
|
||||
T Dyn.Rueckmld.RET_VAL_BLKMOV_Weiche
|
||||
T Dyn.Rueckmld.RET_VAL_DL_Schleusen
|
||||
|
||||
// Störungen löschen:
|
||||
SET
|
||||
R Dyn.Error.Weichen_DL
|
||||
R Dyn.Error.Undef_Weiche
|
||||
R Dyn.Error.BLKMov
|
||||
R Dyn.Error."Undef_Bereich+1"
|
||||
R Dyn.Error.Frei04
|
||||
R Dyn.Error.Frei05
|
||||
R Dyn.Error.Ziel_undefiniert
|
||||
R Dyn.Error.Err_Schleusen_DL
|
||||
R Dyn.Error."Err_Undef_Schleuse-1"
|
||||
R Dyn.Error."Übzeit_Gerade"
|
||||
R Dyn.Error."Übzeit_Abzweig"
|
||||
R Dyn.Error.Gerade_Sensor_aktiv
|
||||
R Dyn.Error.Abzweig_Sensor_aktiv
|
||||
R Dyn.Error.Gerade_Bereich_belegt
|
||||
R Dyn.Error.Abzweig_Bereich_belegt
|
||||
R Dyn.Status.Warten_auf_Mindestzeit
|
||||
R Dyn.Error.Reset_aktiv // Reset ist aktiv
|
||||
|
||||
L 0 // Damit statische Werte neu aus Datenbank geholt werden !
|
||||
T Weiche.Weichen_Nr // Nummer der Weiche
|
||||
|
||||
BEU
|
||||
|
||||
En06: NOP 0
|
||||
|
||||
|
||||
--- NW 7: Einsprung Schleuse -1 ermitteln ---
|
||||
L Dyn."Schleuse -1" // Nr. der Schleuse -1 [In/OUT von Schleuse -1 / Reset]
|
||||
T "MW200" // Search-Daten
|
||||
L 0 // angegeben ?
|
||||
==I // Nein !
|
||||
= Keine_Einfahrt
|
||||
JC En08
|
||||
|
||||
L SAVE.Schleusen_DB // Weichen-FIFO-DB
|
||||
L 0 // Einsprung-Zeiger bekannt ?
|
||||
>I // Ja !
|
||||
R Dyn.Error.Err_Schleusen_DL // Schleusen-Datenliste fehlerhaft
|
||||
R Dyn.Error."Err_Undef_Schleuse-1" // undefinierte Schleuse-1
|
||||
JC En08
|
||||
|
||||
CALL FC "DatenOut" (SSDB:=Para.Schleusen_DL_DB, SSDW:=Para.Schleusen_DL_DW, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196")
|
||||
|
||||
L "MB199"
|
||||
T Dyn.Rueckmld.RET_VAL_DL_Schleusen // Rückmeldung bei Datenbank-Zugriff (Weichen-DL)
|
||||
|
||||
JBI W_Ok
|
||||
|
||||
A "M199.0"
|
||||
= Dyn.Error.Err_Schleusen_DL // Schleusen-Datenliste fehlerhaft
|
||||
BEC
|
||||
|
||||
SET
|
||||
S Dyn.Error."Err_Undef_Schleuse-1" // undefinierte Schleuse-1
|
||||
|
||||
BEU
|
||||
|
||||
W_Ok: L "MW224" // Rein-FIFO-DB
|
||||
T SAVE.Schleusen_DB // Weichen-FIFO-DB
|
||||
L 0 // sinnvoller Wert ?
|
||||
<=I // Nein !
|
||||
S Dyn.Error."Err_Undef_Schleuse-1" // undefinierte Schleuse-1
|
||||
BEC
|
||||
|
||||
L "MW226" // Schleuse -1
|
||||
T SAVE."Schleuse-1_DW"
|
||||
|
||||
En08: NOP 0
|
||||
|
||||
|
||||
--- NW 8:
|
||||
---
|
||||
// Antrieb zusätzlich starten:
|
||||
A ErrQuit // Überwachungszeit abgelaufen quittieren
|
||||
S Antrieb_Weiche_vor // Weichenantrieb starten
|
||||
S Antrieb_Weiche_gerade_vor // Antrieb gerade einschalten
|
||||
S Antrieb_Weiche_abzweig_vor // Antrieb abzweig einschalten
|
||||
|
||||
AN ErrQuit
|
||||
AN Keine_Einfahrt
|
||||
JC En08_Mig
|
||||
|
||||
// Störungen löschen:
|
||||
SET
|
||||
R Dyn.Error.Ziel_undefiniert
|
||||
R Dyn.Error.Err_Schleusen_DL
|
||||
R Dyn.Error."Err_Undef_Schleuse-1"
|
||||
R Dyn.Error."Übzeit_Gerade"
|
||||
R Dyn.Error."Übzeit_Abzweig"
|
||||
R Dyn.Error.Gerade_Sensor_aktiv
|
||||
R Dyn.Error.Abzweig_Sensor_aktiv
|
||||
R Dyn.Error.Gerade_Bereich_belegt
|
||||
R Dyn.Error.Abzweig_Bereich_belegt
|
||||
|
||||
// Kann nur über Reset zurückgesetzt werden:
|
||||
// / R #Dyn.Error.Weichen_DL
|
||||
// / R #Dyn.Error.Undef_Weiche
|
||||
// / R #Dyn.Error.BLKMov
|
||||
// / R #Dyn.Error."Undef_Bereich+1"
|
||||
// / R #Dyn.Error.Frei04
|
||||
// / R #Dyn.Error.Frei05
|
||||
// / R #Dyn.Error.Reset_aktiv//Reset ist aktiv
|
||||
|
||||
En08_Mig: NOP 0
|
||||
|
||||
|
||||
--- NW 9: Einfahrt angemeldet/reserviert ? ---
|
||||
A Keine_Einfahrt // Also keine Schleuse -1 aktiv
|
||||
AN Dyn.Status.Warten_auf_Mindestzeit
|
||||
O Dyn.Error.Err_Schleusen_DL // Schleusen-Datenliste fehlerhaft
|
||||
O Dyn.Error."Err_Undef_Schleuse-1" // undefinierte Schleuse-1
|
||||
JCN Schalt // Negierter Sprung!
|
||||
|
||||
// Einsprung löschen:
|
||||
L 0
|
||||
T SAVE.Schleusen_DB
|
||||
T SAVE."Schleuse-1_DW"
|
||||
|
||||
// Weichendaten löschen:
|
||||
L DINT#0
|
||||
T Dyn.TrolleyID
|
||||
L 0
|
||||
T Dyn.Weichen_Ziel
|
||||
T Dyn.Zwischen_Ziel
|
||||
T Dyn.FahrKontrolle.Akt_Mindestzeitzeit
|
||||
T Dyn.FahrKontrolle."Akt_Überwachungszeit"
|
||||
|
||||
SET
|
||||
R Dyn.Status.Kein_StartOk
|
||||
R Dyn.Status.MindestZeit_ok
|
||||
R Dyn.Status.Ziel_erreicht
|
||||
R Dyn.Status.Weiche_geradeaus
|
||||
R Dyn.Status.Weiche_abzweigen
|
||||
|
||||
JU Ret // Weichen-Checkerei überspringen
|
||||
|
||||
|
||||
--- NW 10: Weiche aufgrund vom Weichen-Ziel checken ---
|
||||
// Ziel-Check für Kontrolle:
|
||||
Schalt: L Dyn.Weichen_Ziel
|
||||
L Weiche.Abzweig.Ziel // Abzweig-Ziel?
|
||||
==I // Ja!
|
||||
= Abzweig_Ziel
|
||||
|
||||
CAC
|
||||
L Weiche.Gerade.Ziel // Gerade-Ziel?
|
||||
==I // Ja!
|
||||
= Gerade_Ziel
|
||||
|
||||
// Sind noch Teile im Weichenbereich?:
|
||||
L SAVE."Schleuse-1_DW"
|
||||
ITD
|
||||
T AR1Start // Startwert mit Offset 0
|
||||
|
||||
L AR1Start // Startwert mit Offset 0
|
||||
+ DINT#162
|
||||
SLD 3
|
||||
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[SAVE.Schleusen_DB] // FABE+ -DB öffnen
|
||||
|
||||
L DBW [AR1Zeiger] // Raus-Trolleys von Schleuse-1 (DBW162)
|
||||
L 0 // Teile vorhanden?
|
||||
>I // JA !
|
||||
= Weichen_Trolleys
|
||||
|
||||
// Evtl. Weiche umschalten:
|
||||
A Weichen_Trolleys // Trolleys im Weichenbereich!
|
||||
A(
|
||||
O Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten
|
||||
O Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten
|
||||
)
|
||||
JC en10
|
||||
|
||||
A Dyn.Status.MindestZeit_ok
|
||||
R Dyn.Status.Warten_auf_Mindestzeit
|
||||
|
||||
A Dyn.Status.Warten_auf_Mindestzeit
|
||||
JC en10
|
||||
|
||||
A Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten
|
||||
O Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten
|
||||
O Dyn.Status.Warten_auf_Mindestzeit
|
||||
R Dyn.Error.Ziel_undefiniert
|
||||
R Dyn.Error.Gerade_Sensor_aktiv
|
||||
R Dyn.Error.Abzweig_Sensor_aktiv
|
||||
R Dyn.Error.Gerade_Bereich_belegt
|
||||
R Dyn.Error.Abzweig_Bereich_belegt
|
||||
JC en10
|
||||
|
||||
AN Fahren_Ok
|
||||
= Dyn.Status.Kein_StartOk
|
||||
JC Ret
|
||||
|
||||
// Ziel-Check zum Schalten:
|
||||
L Dyn.Weichen_Ziel
|
||||
L 0
|
||||
==I
|
||||
S Dyn.Error.Ziel_undefiniert
|
||||
JC New
|
||||
|
||||
CAC
|
||||
L Weiche.Abzweig.Ziel // Abzweig-Ziel?
|
||||
==I // Ja!
|
||||
JC Abzweigen
|
||||
|
||||
CAC
|
||||
L Weiche.Gerade.Ziel // Gerade-Ziel?
|
||||
==I // Ja!
|
||||
JC Gerade
|
||||
|
||||
SET
|
||||
S Dyn.Error.Ziel_undefiniert
|
||||
|
||||
JU New
|
||||
|
||||
Gerade: NOP 0
|
||||
// Gerade-Fahrt gewünscht**************************************************
|
||||
// Ziel-Sensor-Check:
|
||||
A B_Ziel_gerade
|
||||
= Dyn.Error.Gerade_Sensor_aktiv
|
||||
A Dyn.Error.Gerade_Sensor_aktiv // Muss erst quittiert werden!
|
||||
JC New
|
||||
|
||||
// Trolley geradeaus fahren:
|
||||
SET
|
||||
S Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten
|
||||
R Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten
|
||||
S Dyn.Status.Warten_auf_Mindestzeit
|
||||
|
||||
// Zeiten speichern:
|
||||
L Weiche.Gerade.Mindestzeit // Nach dieser Zeit kann Trolley erst aus Weiche sein
|
||||
T Dyn.FahrKontrolle.Para_Mindestzeit
|
||||
L Weiche.Gerade."Überwachungszeit" // Nach dieser Zeit muss Trolley Zielbereich erreicht haben
|
||||
T Dyn.FahrKontrolle."Para_Überwachungszeit"
|
||||
|
||||
JU en10
|
||||
|
||||
Abzweigen: NOP 0
|
||||
// Abzweig-Fahrt gewünscht**************************************************
|
||||
// Ziel-Sensor-Check:
|
||||
A B_Ziel_abzweig
|
||||
= Dyn.Error.Abzweig_Sensor_aktiv
|
||||
A Dyn.Error.Abzweig_Sensor_aktiv // Muss erst quittiert werden!
|
||||
JC New
|
||||
|
||||
// Trolly abzweigen fahren:
|
||||
SET
|
||||
S Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten
|
||||
R Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten
|
||||
S Dyn.Status.Warten_auf_Mindestzeit
|
||||
|
||||
// Zeiten speichern:
|
||||
L Weiche.Abzweig.Mindestzeit // Nach dieser Zeit kann Trolley erst aus Weiche sein
|
||||
T Dyn.FahrKontrolle.Para_Mindestzeit
|
||||
L Weiche.Abzweig."Überwachungszeit" // Nach dieser Zeit muss Trolley Zielbereich erreicht haben
|
||||
T Dyn.FahrKontrolle."Para_Überwachungszeit"
|
||||
|
||||
JU en10
|
||||
|
||||
New: AN ErrQuit
|
||||
JC en10
|
||||
|
||||
L 0 // Reservierung löschen
|
||||
T Dyn."Schleuse -1"
|
||||
|
||||
en10: NOP 0
|
||||
|
||||
|
||||
--- NW 11: Mindestzeit / Überwachungszeit ---
|
||||
A Gerade_Ziel
|
||||
A(
|
||||
ON Y_Weiche_gerade
|
||||
ON Antrieb_Gerade_aktiv
|
||||
)
|
||||
O
|
||||
A Abzweig_Ziel
|
||||
A(
|
||||
ON Y_Weiche_abzweig
|
||||
ON Antrieb_Abzweig_aktiv
|
||||
)
|
||||
JC W011
|
||||
|
||||
// Mindestzeit neu triggern: (von Schleuse -1)
|
||||
A Dyn.Status.MindestZeit_nachtriggern
|
||||
R Dyn.Status.MindestZeit_nachtriggern
|
||||
S Dyn.Status.Warten_auf_Mindestzeit
|
||||
JCN X011 // Negierter Sprung
|
||||
|
||||
W011: L 0
|
||||
T Dyn.FahrKontrolle.Akt_Mindestzeitzeit
|
||||
|
||||
JU y011
|
||||
|
||||
// Zeiten aufaddieren:
|
||||
X011: AN "1s-Impuls" // 1s-Impuls
|
||||
ON Antrieb_Weiche_aktiv
|
||||
JC X08E
|
||||
|
||||
L Dyn.FahrKontrolle.Akt_Mindestzeitzeit
|
||||
+ 1
|
||||
T Dyn.FahrKontrolle.Akt_Mindestzeitzeit
|
||||
|
||||
y011: L Dyn.FahrKontrolle.Akt_Mindestzeitzeit
|
||||
L Dyn.FahrKontrolle.Para_Mindestzeit
|
||||
>=I
|
||||
= Dyn.Status.MindestZeit_ok
|
||||
JCN X080
|
||||
|
||||
T Dyn.FahrKontrolle.Akt_Mindestzeitzeit
|
||||
|
||||
X080: A Dyn.Error."Übzeit_Gerade"
|
||||
O Dyn.Error."Übzeit_Abzweig"
|
||||
ON "1s-Impuls" // 1s-Impuls
|
||||
ON Antrieb_Weiche_aktiv
|
||||
JC X08E
|
||||
|
||||
L Dyn.FahrKontrolle."Akt_Überwachungszeit"
|
||||
+ 1
|
||||
T Dyn.FahrKontrolle."Akt_Überwachungszeit"
|
||||
|
||||
L Dyn.FahrKontrolle."Para_Überwachungszeit"
|
||||
<I // Max.Zeit erreicht ?
|
||||
JC X08E // Nein
|
||||
|
||||
// Überwachungszeit ist abgelaufen:
|
||||
A Dyn.Status.Weiche_geradeaus
|
||||
S Dyn.Error."Übzeit_Gerade"
|
||||
|
||||
A Dyn.Status.Weiche_abzweigen
|
||||
S Dyn.Error."Übzeit_Abzweig"
|
||||
|
||||
L 0 // Zeiten neu initialisieren
|
||||
T Dyn.FahrKontrolle."Akt_Überwachungszeit"
|
||||
|
||||
X08E: NOP 0
|
||||
|
||||
|
||||
--- NW 12: Ziel ist erreicht ---
|
||||
A Dyn.Status.Weiche_geradeaus
|
||||
A B_Ziel_gerade
|
||||
S ZielSensor_aktiv
|
||||
R Dyn.Error."Übzeit_Gerade"
|
||||
|
||||
A Dyn.Status.Weiche_abzweigen
|
||||
A B_Ziel_abzweig
|
||||
S ZielSensor_aktiv
|
||||
R Dyn.Error."Übzeit_Abzweig"
|
||||
JC Ziel_AOk
|
||||
|
||||
JU X09E
|
||||
|
||||
Ziel_AOk: A Dyn.Status.Ziel_erreicht // Einmaliger Durchlauf
|
||||
JC X09E
|
||||
|
||||
SET
|
||||
S Dyn.Status.Ziel_erreicht
|
||||
|
||||
L Dyn.Schalttakte
|
||||
+ DINT#1 // Auf Abzweig umgeschaltet +1
|
||||
T Dyn.Schalttakte
|
||||
|
||||
X09E: A ZielSensor_aktiv
|
||||
O Dyn.Status.Reset_aktiv
|
||||
JCN En12 // Negierter Sprung
|
||||
|
||||
L 0 // Zeiten neu initialisieren
|
||||
T Dyn.FahrKontrolle."Akt_Überwachungszeit"
|
||||
|
||||
SET
|
||||
R Dyn.Error."Übzeit_Gerade"
|
||||
R Dyn.Error."Übzeit_Abzweig"
|
||||
|
||||
En12: NOP 0
|
||||
|
||||
|
||||
--- NW 13: RET: Weiche schalten ---
|
||||
Ret: A Dyn.Status.Reset_aktiv
|
||||
O Weichen_Trolleys
|
||||
JC En13
|
||||
|
||||
A Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten
|
||||
R Dyn.Status.Weiche_abzweigen // Gerade hätte Vorrang
|
||||
S Y_Weiche_gerade // nicht mit =, damit Weichenstellung erst bei Änderung schaltet!
|
||||
R Y_Weiche_abzweig
|
||||
|
||||
A Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten
|
||||
S Y_Weiche_abzweig
|
||||
R Y_Weiche_gerade // nicht mit =, damit Weichenstellung erst bei Änderung schaltet!
|
||||
|
||||
En13: NOP 0
|
||||
|
||||
|
||||
--- NW 14: Antriebe ansteuern / stoppen ? ---
|
||||
A Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten
|
||||
O Dyn.Status.Weiche_abzweigen // Gerade hätte Vorrang
|
||||
ON Keine_Einfahrt // Also ist Schleuse -1 aktiv
|
||||
O Weichen_Trolleys
|
||||
= Antriebe_ein
|
||||
|
||||
A Antriebe_ein
|
||||
O Dyn.Status.Reset_aktiv
|
||||
S Antrieb_Weiche_vor // Weichenantrieb starten
|
||||
|
||||
A Antriebe_ein
|
||||
A Dyn.Status.Weiche_geradeaus
|
||||
O Dyn.Status.Reset_aktiv
|
||||
S Antrieb_Weiche_gerade_vor // Antrieb gerade einschalten
|
||||
|
||||
A Antriebe_ein
|
||||
A Dyn.Status.Weiche_abzweigen
|
||||
O Dyn.Status.Reset_aktiv
|
||||
S Antrieb_Weiche_abzweig_vor // Antrieb abzweig einschalten
|
||||
|
||||
// Antriebe stoppen
|
||||
AN Dyn.Status.Reset_aktiv
|
||||
A(
|
||||
AN Keine_Einfahrt // Also ist Schleuse -1 aktiv
|
||||
A(
|
||||
AN Fahren_Ok
|
||||
O
|
||||
A Dyn.Status.Weiche_abzweigen
|
||||
A(
|
||||
ON Weiche_ist_AST
|
||||
ON Antrieb_Abzweig_aktiv
|
||||
)
|
||||
O
|
||||
A Dyn.Status.Weiche_geradeaus
|
||||
A(
|
||||
O Weiche_ist_AST
|
||||
ON Antrieb_Gerade_aktiv
|
||||
)
|
||||
)
|
||||
ON Dyn.Status.Auto_akt // SystemVoraussetzungen fehlen
|
||||
O Dyn.Status.Hand_akt
|
||||
ON Dyn.Status.Bereich_ok
|
||||
)
|
||||
S Antrieb_Weiche_stop // Alle Antriebe stoppen
|
||||
|
||||
SET // //
|
||||
R Antrieb_Weiche_stop // Alle Antriebe stoppen////
|
||||
|
||||
|
||||
--- NW 15: Weiche ist frei ---
|
||||
L SAVE.Schleusen_DB // Alte Speicherung ?
|
||||
L SAVE."Schleuse-1_DW"
|
||||
OW
|
||||
L Dyn.Weichen_Ziel
|
||||
OW
|
||||
L 0
|
||||
==I
|
||||
A Keine_Einfahrt // Keine Einfahrt aktiv
|
||||
AN Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten
|
||||
AN Dyn.Status.Weiche_abzweigen // Gerade hätte Vorrang
|
||||
AN Dyn.Status.Warten_auf_Mindestzeit
|
||||
AN Dyn.Status.Reset_aktiv
|
||||
= Dyn.Status.Weiche_frei
|
||||
R Dyn.Status.MindestZeit_nachtriggern
|
||||
NEG
|
||||
= Dyn.Status.Weiche_aktiv // Zum Abfragen, damit evtl. Förderer nicht ausgeschaltet wird
|
||||
|
||||
|
||||
--- NW 16: Schleuse -1 aktiv / vorhanden ? ---
|
||||
A Keine_Einfahrt
|
||||
O Dyn.Error.Err_Schleusen_DL // Schleusen-Datenliste fehlerhaft
|
||||
O Dyn.Error."Err_Undef_Schleuse-1" // undefinierte Schleuse-1
|
||||
BEC
|
||||
|
||||
L SAVE.Schleusen_DB // Schleusen-DB
|
||||
L 0 // Einsprung-Zeiger bekannt ?
|
||||
<=I // Nein !
|
||||
BEC
|
||||
|
||||
// Anmeldung an diese Weiche von Schleuse -1 noch aktiv?:
|
||||
L SAVE."Schleuse-1_DW"
|
||||
ITD
|
||||
T AR1Start // Startwert mit Offset 0
|
||||
|
||||
L AR1Start // Startwert mit Offset 0
|
||||
+ DINT#16
|
||||
SLD 3
|
||||
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[SAVE.Schleusen_DB] // FABE+ -DB öffnen
|
||||
|
||||
L DBW [AR1Zeiger] // Anmeldung von dieser Schleuse (DBW16)
|
||||
L Weichen_Nr
|
||||
==I // Ja !
|
||||
O Dyn.Status.Warten_auf_Mindestzeit
|
||||
JC Mldg
|
||||
|
||||
L 0 // Reservierung löschen
|
||||
T Dyn."Schleuse -1"
|
||||
|
||||
BEU
|
||||
|
||||
|
||||
--- NW 17: Meldung an Schleuse -1: Weiche hat geschaltet ---
|
||||
Mldg: L AR1Start // Startwert mit Offset 0
|
||||
+ DINT#71
|
||||
SLD 3
|
||||
L 4 // Damit DBX71.4
|
||||
OD
|
||||
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[SAVE.Schleusen_DB] // FABE+ -DB öffnen
|
||||
|
||||
A(
|
||||
A Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten
|
||||
A Gerade_Ziel
|
||||
A Y_Weiche_gerade
|
||||
A Antrieb_Gerade_aktiv
|
||||
O
|
||||
A Dyn.Status.Weiche_abzweigen // Gerade hätte Vorrang
|
||||
A Abzweig_Ziel
|
||||
A Y_Weiche_abzweig
|
||||
A Antrieb_Abzweig_aktiv
|
||||
)
|
||||
A Fahren_Ok
|
||||
A Antrieb_Weiche_aktiv // Antrieb aktiv
|
||||
AN Dyn.Status.Reset_aktiv
|
||||
= DBX [AR1Zeiger] // Weiche hat geschaltet ? (DBX71.4)
|
||||
|
||||
|
||||
--- NW 18: Meldung an Schleuse -1: Aktuell aktives Ziel ---
|
||||
// Rückmeldung an Schleuse -1 (Weichenziel):
|
||||
L AR1Start // Startwert mit Offset 0
|
||||
+ DINT#166
|
||||
SLD 3
|
||||
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[SAVE.Schleusen_DB] // FABE+ -DB öffnen
|
||||
|
||||
L Dyn.Weichen_Ziel
|
||||
T DBW [AR1Zeiger] // Zurückgemeldetes WeichenZiel (DBW166)
|
||||
|
||||
|
||||
--- NW 19: Meldung an Schleuse -1: Trolley hat Ziel erreicht ---
|
||||
L AR1Start // Startwert mit Offset 0
|
||||
+ DINT#71
|
||||
SLD 3
|
||||
L 5 // Damit DBX71.5
|
||||
OD
|
||||
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
OPN DB[SAVE.Schleusen_DB] // FABE+ -DB öffnen
|
||||
|
||||
A ZielSensor_aktiv
|
||||
O Dyn.Status.Reset_aktiv
|
||||
= DBX [AR1Zeiger] // Trolley ausserhalb Weiche (DBX71.5)
|
||||
|
||||
|
||||
--- NW 20: Ende ---
|
||||
BE
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,91 @@
|
||||
=== FB 183: MHMÜbergang_ohne_Schleuse [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
ErrQuit : Bool
|
||||
B_Anfang : Bool
|
||||
B_Am_Übergang : Bool
|
||||
B_Stau_Antrieb_plus : Bool
|
||||
Antrieb_aktiv : Bool
|
||||
Antrieb_plus_aktiv : Bool
|
||||
Output:
|
||||
InOut:
|
||||
Antrieb_vor : Bool
|
||||
Antrieb_start : Bool
|
||||
Antrieb_stop : Bool
|
||||
Antrieb_plus_vor : Bool
|
||||
Antrieb_plus_start : Bool
|
||||
Static:
|
||||
Am_Übergang : "MSensoren"
|
||||
Stau_Antrieb_plus : "MSensoren"
|
||||
Temp:
|
||||
Antrieb : Bool
|
||||
Antrieb_gestoppt : Bool
|
||||
Constant:
|
||||
|
||||
--- NW 1: Antrieb ansteuern ---
|
||||
SET
|
||||
R Antrieb_gestoppt // Falls bei Aufruf nicht gestoppt wird!
|
||||
|
||||
// Antrieb starten:
|
||||
A ErrQuit
|
||||
O B_Anfang
|
||||
S Antrieb_start
|
||||
S Antrieb_vor
|
||||
|
||||
// Trolley am Übergang:
|
||||
AN "Am_Übergang".Stat.B_Akt
|
||||
JC Nix
|
||||
|
||||
// Antrieb stoppen:
|
||||
A Stau_Antrieb_plus.Stat.B_Akt
|
||||
S Antrieb_stop // Trolley stoppen
|
||||
S Antrieb_gestoppt // Falls bei Aufruf nicht gestoppt wird!
|
||||
JC Nix
|
||||
|
||||
AN Stau_Antrieb_plus.Stat.B_Akt
|
||||
S Antrieb_plus_vor // Antrieb plus einschalten
|
||||
|
||||
SET
|
||||
S Antrieb_plus_start // Antrieb plus zeitlang starten
|
||||
|
||||
AN Antrieb_plus_aktiv
|
||||
S Antrieb_stop // Trolley stoppen
|
||||
S Antrieb_gestoppt // Falls bei Aufruf nicht gestoppt wird!
|
||||
JC Nix
|
||||
|
||||
// Antrieb einschalten:
|
||||
SET
|
||||
S Antrieb_vor // Trolley weiterfahren
|
||||
|
||||
Nix: NOP 0
|
||||
|
||||
|
||||
--- NW 2: Antrieb plus zusätzlich ansteuern ---
|
||||
// Antrieb plus starten:
|
||||
A B_Stau_Antrieb_plus // Sensor
|
||||
O ErrQuit
|
||||
S Antrieb_plus_start // Antrieb plus zeitlang starten
|
||||
|
||||
// Antrieb plus einschalten:
|
||||
A B_Stau_Antrieb_plus
|
||||
AN Stau_Antrieb_plus.Stat.B_Akt
|
||||
CLR // Nicht mehr!
|
||||
S Antrieb_plus_vor // Antrieb plus einschalten
|
||||
|
||||
|
||||
--- NW 3: Trolley ist am Übergang ---
|
||||
A Antrieb_aktiv
|
||||
A Antrieb_plus_aktiv
|
||||
AN Antrieb_gestoppt // Falls bei Aufruf nicht gestoppt wird!
|
||||
= Antrieb
|
||||
|
||||
CALL FB "None" , (ESensor:="B_Am_Übergang", T_Ein:=1, T_Aus:=50, tein_aktiv:=1, taus_aktiv:=Antrieb)
|
||||
|
||||
|
||||
--- NW 4: Stau im Förderer plus ---
|
||||
CALL FB "None" , (ESensor:=B_Stau_Antrieb_plus, T_Ein:=100, T_Aus:=50, tein_aktiv:=1, taus_aktiv:=1)
|
||||
|
||||
|
||||
--- NW 5: Ende ---
|
||||
BE
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,122 @@
|
||||
=== FB 100: MImpulsGeber [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
Ink_DB : Int // DB-Nr des Inkremental-Gebers (Zählerbaugruppe) Neu-Sync-Zähler
|
||||
B_Zaehlen : Bool // Sensor zum Zählen
|
||||
Antrieb_aktiv : Bool // Antrieb ist aktiv
|
||||
Quit : Bool
|
||||
Zeit_Signal_zu_lang : Time := T#350ms
|
||||
Zeit_Kein_Signal : Time := T#500ms
|
||||
Output:
|
||||
Signal : Bool // Falls kein InkDB
|
||||
InOut:
|
||||
Err_Kein_Signal : Bool // Kein_Signal bei laufenden Antrieb
|
||||
Err_Signal_zu_lang : Bool // Signal bei laufenden Antrieb zu lang
|
||||
Static:
|
||||
Sensor_entprellen : Bool
|
||||
Timer_1 : TON_TIME
|
||||
Timer_2 : TON_TIME
|
||||
Timer_3 : TON_TIME
|
||||
Temp:
|
||||
Constant:
|
||||
|
||||
--- NW 1: Initialisierung ---
|
||||
SET
|
||||
R Signal
|
||||
|
||||
|
||||
--- NW 2: Störungen ---
|
||||
// Störung quittieren:
|
||||
A Quit
|
||||
R Err_Signal_zu_lang
|
||||
R Err_Kein_Signal
|
||||
|
||||
// Signal zu lang:
|
||||
A B_Zaehlen // Sensor zum Zählen
|
||||
A Antrieb_aktiv // Antrieb ist aktiv
|
||||
AN Quit
|
||||
= "M200.0"
|
||||
|
||||
CALL SYS "TON" (IN:="M200.0", PT:=Zeit_Signal_zu_lang, Q:=?, ET:=?)
|
||||
|
||||
A Timer_2.Q
|
||||
S Err_Signal_zu_lang
|
||||
|
||||
// Kein Signal:
|
||||
AN B_Zaehlen // Sensor zum Zählen
|
||||
A Antrieb_aktiv // Antrieb ist aktiv
|
||||
AN Quit
|
||||
= "M200.0"
|
||||
|
||||
CALL SYS "TON" (IN:="M200.0", PT:=Zeit_Kein_Signal, Q:=?, ET:=?)
|
||||
|
||||
A Timer_3.Q
|
||||
S Err_Kein_Signal
|
||||
|
||||
|
||||
--- NW 3: Zählen über Sensor ---
|
||||
AN B_Zaehlen // Sensor zum Zählen
|
||||
A Sensor_entprellen // Sperre Auswertung schon erfolgt
|
||||
A Antrieb_aktiv // Antrieb ist aktiv
|
||||
= "M200.0"
|
||||
|
||||
CALL SYS "TON" (IN:="M200.0", PT:=t#50ms, Q:=?, ET:=?)
|
||||
|
||||
A Timer_1.Q
|
||||
R Sensor_entprellen // Sperre Auswertung schon erfolgt
|
||||
|
||||
AN B_Zaehlen // Sensor zum Zählen
|
||||
O Sensor_entprellen
|
||||
BEC
|
||||
|
||||
SET
|
||||
S Sensor_entprellen // Sperre Auswertung schon erfolgt
|
||||
S Signal // Für Signal-Auswertung ohne InkDB
|
||||
|
||||
|
||||
--- NW 4: Übergabe an Inkrement-Baustein / max.Wert erreicht? ---
|
||||
L Ink_DB
|
||||
T "MW200"
|
||||
|
||||
L 0 // Sinnvolle Angabe?
|
||||
<=I // Nein!
|
||||
BEC // Also nur Signal-Auswertung !
|
||||
|
||||
OPN DB["MW200"] // Zähler-DB öffnen
|
||||
|
||||
L DBD80
|
||||
+ DINT#1 // Aktueller Zählerwert +1
|
||||
T DBD80
|
||||
|
||||
L DBD80 // Aktueller Zählerwert
|
||||
L DBD76 // Max. Wert erreicht ?
|
||||
<=D // Nein !
|
||||
R DBX74.5 // Ohne Flag-Lauf wurde beendet
|
||||
R DBX74.4 // Flag-Lauf wurde beendet
|
||||
BEC
|
||||
|
||||
-D // Restwert als Startwert nehmen !
|
||||
T DBD80 // Keine Inkrementalgeber verbaut, sondern nur Sensor
|
||||
|
||||
AN DBX74.3 // Umschaltung Zähl-Lauf ohne-mit-ohne Flag
|
||||
= DBX74.5 // Ohne Flag-Lauf wurde beendet
|
||||
A DBX74.3 // Umschaltung Zähl-Lauf ohne-mit-ohne Flag
|
||||
= DBX74.4 // Flag-Lauf wurde beendet
|
||||
|
||||
AN DBX74.3 // Umschaltung Zähl-Lauf ohne-mit-ohne Flag
|
||||
= DBX74.3
|
||||
|
||||
// Zähler auf 000 setzen ?:
|
||||
AN DBX74.6 // Zähler Zero-Load
|
||||
BEC
|
||||
|
||||
SET
|
||||
R DBX74.6
|
||||
|
||||
L 0
|
||||
T DBD80 // Zählerwert zum Setzen
|
||||
|
||||
|
||||
--- NW 5: Ende ---
|
||||
BE
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
=== FB 91: MSensoren [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
ESensor : Bool // Eingang des zu überwachenden Sensors
|
||||
T_Ein : Int := 1 // Einschaltzeitverzögerung (*100ms)
|
||||
T_Aus : Int := 5 // Ausschaltzeitverzögerung (*100ms)
|
||||
tein_aktiv : Bool := TRUE // Einschaltzeit aktivieren
|
||||
taus_aktiv : Bool := TRUE // Ausschaltzeit aktivieren
|
||||
Output:
|
||||
InOut:
|
||||
Static:
|
||||
Stat : "USensor_Ein_Aus" // Status des Endschalters
|
||||
Temp:
|
||||
Constant:
|
||||
|
||||
--- NW 1: Zeitwert löschen ---
|
||||
A ESensor
|
||||
A Stat.B_Akt
|
||||
O
|
||||
AN ESensor
|
||||
AN Stat.B_Akt
|
||||
JCN Nw02
|
||||
|
||||
|
||||
tdel: L 0 // Zeitwert löschen
|
||||
T Stat.T_Zelle
|
||||
|
||||
BEU
|
||||
|
||||
--- NW 2: Einschaltzeit abgelaufen ? ---
|
||||
Nw02: L Stat.T_Ein_Akt // Gewollter Zeitwert
|
||||
L 9999 // angegeben ?
|
||||
<>I // Ja !
|
||||
JC w020
|
||||
|
||||
L T_Ein // Sollwert übergeben
|
||||
T Stat.T_Ein_Akt // Gewollter Zeitwert
|
||||
|
||||
w020: A Stat.B_Akt
|
||||
JC Nw03
|
||||
|
||||
L Stat.T_Zelle // Aktueller Zeitwert
|
||||
L Stat.T_Ein_Akt // Gewollter Zeitwert erreicht ?
|
||||
>=I
|
||||
S Stat.B_Akt // Sensor ist nach Einschaltzeit aktiv
|
||||
JC tdel // Zeit löschen
|
||||
|
||||
JU Nw04
|
||||
|
||||
--- NW 3: Ausschaltzeit abgelaufen ? ---
|
||||
Nw03: L Stat.T_Aus_Akt // Gewollter Zeitwert
|
||||
L 9999 // angegeben ?
|
||||
<>I // Ja !
|
||||
JC w030
|
||||
|
||||
L T_Aus // Sollwert übergeben
|
||||
T Stat.T_Aus_Akt // Gewollter Zeitwert
|
||||
|
||||
w030: AN Stat.B_Akt
|
||||
JC Nw04
|
||||
|
||||
L Stat.T_Zelle // Aktueller Zeitwert
|
||||
L Stat.T_Aus_Akt // Gewollter Zeitwert erreicht ?
|
||||
>=I
|
||||
R Stat.B_Akt // Sensor ist nach Ausschaltzeit nicht mehr aktiv
|
||||
JC tdel // Zeit löschen
|
||||
|
||||
|
||||
--- NW 4: Zeit läuft ---
|
||||
Nw04: AN "100ms-Impuls" // nur als Impuls
|
||||
O
|
||||
AN Stat.B_Akt // Einschaltzeit läuft
|
||||
AN tein_aktiv // aber Zeit einfrieren
|
||||
O
|
||||
A Stat.B_Akt // Ausschaltzeit läuft
|
||||
AN taus_aktiv // aber Zeit einfrieren
|
||||
BEC
|
||||
|
||||
L Stat.T_Zelle
|
||||
L "MW2"
|
||||
+I
|
||||
T Stat.T_Zelle
|
||||
|
||||
|
||||
--- NW 5: Ende ---
|
||||
BE
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,574 @@
|
||||
=== FB 180: MSorter_Uebergabe [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
Uebergabe_Nr : Int // Aufruf für Übergabe
|
||||
KorrekturFaktor : Real // Korrektur-Faktor wegen Kettenlängung
|
||||
ErrQuit : Bool // Ablaufstörung quittieren
|
||||
Antrieb_aktiv : Bool // Kreisel-Antrieb aktiv
|
||||
Output:
|
||||
Error : Word // Störungen übergeben
|
||||
InOut:
|
||||
Antrieb_start : Bool // Kreiselantrieb starten
|
||||
Antrieb_stoppen : Bool // Kreiselantrieb stoppen
|
||||
hStOk : Bool // Anzeige Start n. Störung aktivieren
|
||||
Static:
|
||||
SAVE : Struct
|
||||
Last_Sort_ID : Int
|
||||
Res : Array[1..3] of Int // Reserve
|
||||
Para : Struct // Parameter
|
||||
Uebergabe_DL_DB : Int // Einsprung Weichen-Datenliste-DB
|
||||
Uebergabe_DL_DW : Int // Einsprung Weichen-Datenliste-DW
|
||||
Res1 : Array[1..3] of Int // Reserve
|
||||
Uebergabe : "UDLUebergabe" // Fahrbereichs Daten
|
||||
Dyn : Struct // Dynamische Daten fürs Einfahren
|
||||
Status : Struct // Status
|
||||
BT_Daten_vorhanden : Bool // Daten für Travel-FIFO vorhanden
|
||||
Reset : Bool := TRUE // Reset Einfahrseite starten
|
||||
Rueckmld : Struct
|
||||
RET_VAL_BLKMOV_Uebergabe : Int // Rückmeldung nach BLKMOV-Aufruf
|
||||
RET_VAL_DL_Weichen : Byte // Rückmeldung nach DatenOut-Aufruf
|
||||
RET_VAL_Sortliste_Out : Byte // Rückmeldung nach Sortdaten-Out-Aufruf
|
||||
RET_VAL_TravelFIFO_In : Byte // Rückmeldung nach Travel-FIFO-In-Aufruf
|
||||
RET_VAL_SendFIFO : Byte // Rückmeldung nach SendPC_FIFO-Aufruf
|
||||
Error : "UErrUebergabe"
|
||||
Ink_Wert : DInt // Aktueller Inkrementalwert
|
||||
Max_Wert : DInt // Maximal erlaubter Zählwert
|
||||
Lauf_Flag : Bool // Zähl-Lauf mit Flag ist aktiv
|
||||
Flag_Lauf_fertig : Bool // Flag-Lauf wurde beendet
|
||||
Ohne_Lauf_fertig : Bool // Ohne Flag-Lauf wurde beendet
|
||||
Hauptstrang_Flag : Bool // Flag zum Weiche schalten (vom Hauptstrang)
|
||||
FIFO_Flag : Bool // Flag zum Weiche schalten (von Rein-FIFO)
|
||||
Save_Flag : Bool // Flag zum Daten in Sortliste speichern
|
||||
Last_Flag : Bool // Flag des letzten durchfahrenden Teils
|
||||
Hauptstrang_Ink : DInt // Inkremente zum Weiche schalten (vom Hauptstrang)
|
||||
Hauptstrang_Sortliste : Int // Sortliste aus welcher Hauptstrangdaten sind
|
||||
Hauptstrang_Search_Ink : DInt // Inkremente zum Daten auslesen (Start-Ink)
|
||||
Hauptstrang_Pos : Int // Aktuelle Position der Daten in Datenliste
|
||||
Last_Ink : DInt // Inkremente des letzten durchfahrenden Teils
|
||||
Last_IDX : DInt := -1 // IDX des letzten durchfahrenden Teils
|
||||
Last_Ziel : Int := -1 // Ziel des letzten durchfahrenden Teils
|
||||
Save_Ink : DInt // Inkremente zum Daten in Sortliste speichern
|
||||
Res1 : Array[1..6] of Int // Reserve
|
||||
Daten : "UBT_Daten"
|
||||
Temp:
|
||||
Quelle : Any // Zeiger, wo Rein-Daten sind
|
||||
Ziel : Any // Zeiger, FIFO-Stelle
|
||||
Del : Bool // Nur Sortdaten löschen
|
||||
FC86_Para : Word // Parameter-Übergabe
|
||||
Hauptstrang_Ink : DInt // Inkremente zum Weiche schalten (vom Hauptstrang)
|
||||
Parameter : Word // Parameter
|
||||
Freigabe : Int
|
||||
DatenDB : Int // DB öffnen
|
||||
Constant:
|
||||
|
||||
--- NW 1: Parameter-Übergabe ---
|
||||
L Uebergabe_Nr // Aufruf-Parameter (für Baustein beobachten)
|
||||
|
||||
L "MW178" // Einsprung Übergabe-DL
|
||||
T Para.Uebergabe_DL_DB
|
||||
L 0
|
||||
T Para.Uebergabe_DL_DW
|
||||
|
||||
|
||||
--- NW 2: Gesamt: Out-Bits zum Zurücksetzen ---
|
||||
SET
|
||||
|
||||
|
||||
--- NW 3:
|
||||
---
|
||||
AN Dyn.Status.Reset
|
||||
JC En06
|
||||
|
||||
// Dyn.Daten löschen:
|
||||
SET
|
||||
R Dyn.Status.Reset
|
||||
R Dyn.Hauptstrang_Flag
|
||||
R Dyn.FIFO_Flag
|
||||
R Dyn.Save_Flag
|
||||
R Dyn.Last_Flag
|
||||
|
||||
L 0
|
||||
T Dyn.Hauptstrang_Ink
|
||||
T Dyn.Hauptstrang_Search_Ink
|
||||
T Dyn.Last_Ink
|
||||
T Dyn.Save_Ink
|
||||
|
||||
L 0
|
||||
T Dyn.Hauptstrang_Sortliste
|
||||
T Dyn.Last_IDX
|
||||
T Dyn.Last_Ziel
|
||||
|
||||
// Rückmeldungen löschen:
|
||||
L 0
|
||||
T Dyn.Rueckmld.RET_VAL_TravelFIFO_In
|
||||
|
||||
// Störungen löschen:
|
||||
SET
|
||||
R Dyn.Error.Uebergabe_DL
|
||||
R Dyn.Error.Undef_Uebergabe
|
||||
R Dyn.Error.BLKMov
|
||||
R Dyn.Error.Haupstrang_DL
|
||||
R Dyn.Error.Keine_HSDaten
|
||||
R Dyn.Error.Travel_FIFO_ERR
|
||||
R Dyn.Error.Travel_FIFO_voll
|
||||
R Dyn.Error.Frei07
|
||||
R Dyn.Error.Frei10
|
||||
R Dyn.Error.Frei11
|
||||
R Dyn.Error.Frei12
|
||||
R Dyn.Error.Frei13
|
||||
R Dyn.Error.Frei14
|
||||
R Dyn.Error.Send_FIFO_fehlerhaft
|
||||
R Dyn.Error.Send_FIFO_voll
|
||||
R Dyn.Error.Reset_aktiv // Reset ist aktiv
|
||||
|
||||
L 0 // Damit statische Werte neu aus Datenbank geholt werden !
|
||||
T Uebergabe.Uebergabe_Nr // Nummer der Übergabe
|
||||
|
||||
BEU
|
||||
|
||||
En06: NOP 0
|
||||
|
||||
|
||||
--- NW 4: Störungen nach Außen übergeben ---
|
||||
L 0
|
||||
T "MW200"
|
||||
|
||||
A Dyn.Error.Uebergabe_DL // Weichen-Datenliste fehlerhaft
|
||||
= "M200.0"
|
||||
A Dyn.Error.Undef_Uebergabe // undefinierte Weiche
|
||||
= "M200.1"
|
||||
A Dyn.Error.BLKMov // Fehler bei Block kopieren
|
||||
= "M200.2"
|
||||
A Dyn.Error.Haupstrang_DL // Haupstrang-Datenliste fehlerhaft
|
||||
= "M200.3"
|
||||
A Dyn.Error.Keine_HSDaten // Keine Hauptstrang-Daten mehr vorhanden
|
||||
= "M200.4"
|
||||
A Dyn.Error.Travel_FIFO_ERR // Rein-FIFO fehlerhaft
|
||||
= "M200.5"
|
||||
A Dyn.Error.Travel_FIFO_voll // Keine Rein-Daten mehr vorhanden
|
||||
= "M200.6"
|
||||
A Dyn.Error.Frei07
|
||||
= "M200.7"
|
||||
A Dyn.Error.Frei10
|
||||
= "M201.0"
|
||||
A Dyn.Error.Frei11
|
||||
= "M201.1"
|
||||
A Dyn.Error.Frei12
|
||||
= "M201.2"
|
||||
A Dyn.Error.Frei13
|
||||
= "M201.3"
|
||||
A Dyn.Error.Frei14
|
||||
= "M201.4"
|
||||
A Dyn.Error.Send_FIFO_fehlerhaft
|
||||
= "M201.5"
|
||||
A Dyn.Error.Send_FIFO_voll
|
||||
= "M201.5"
|
||||
CLR // Reset ist aktiv (gibts nicht!)
|
||||
= Dyn.Error.Reset_aktiv
|
||||
= "M201.7"
|
||||
|
||||
L "MW200"
|
||||
T Error // Schnittstelle nach Außen
|
||||
|
||||
// Antrieb stoppen:
|
||||
A(
|
||||
O Dyn.Error.Travel_FIFO_ERR // Daten-Übergabe fand nicht statt -> Antrieb stoppen)
|
||||
O Dyn.Error.Travel_FIFO_voll // Daten-Übergabe fand nicht statt -> Antrieb stoppen)
|
||||
)
|
||||
AN ErrQuit
|
||||
S Antrieb_stoppen // Kreiselantrieb stoppen
|
||||
|
||||
// Anzeige Start n. Störung aktivieren:
|
||||
A Dyn.Error.Travel_FIFO_ERR // Daten-Übergabe fand nicht statt -> Antrieb stoppen)
|
||||
O Dyn.Error.Travel_FIFO_voll // Daten-Übergabe fand nicht statt -> Antrieb stoppen)
|
||||
S hStOk
|
||||
|
||||
|
||||
--- NW 5: Statische Übergabe-Parameter holen ---
|
||||
L Uebergabe.Uebergabe_Nr // Nummer der Übergabe
|
||||
L Uebergabe_Nr // Aufruf-Parameter
|
||||
==I // Identisch ?
|
||||
R Dyn.Error.Uebergabe_DL // Weichendatenbank fehlerhaft
|
||||
R Dyn.Error.Undef_Uebergabe // undefinierte Weiche
|
||||
JC en06_Mig // Ja !
|
||||
|
||||
T "MW200" // Search-Daten
|
||||
|
||||
CALL FC "DatenOut" (SSDB:=Para.Uebergabe_DL_DB, SSDW:=Para.Uebergabe_DL_DW, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196")
|
||||
|
||||
L "MB199"
|
||||
T Dyn.Rueckmld.RET_VAL_DL_Weichen // Rückmeldung bei Datenbank-Zugriff (Gefälle-DL)
|
||||
|
||||
JBI G_Ok
|
||||
|
||||
A "M199.0"
|
||||
= Dyn.Error.Uebergabe_DL // Weichendatenbank fehlerhaft
|
||||
BEC
|
||||
|
||||
SET
|
||||
S Dyn.Error.Undef_Uebergabe // undefinierte Weiche
|
||||
|
||||
BEU
|
||||
|
||||
// Kennung + Datenbytes
|
||||
G_Ok: SET
|
||||
R Dyn.Error.Uebergabe_DL // Weichendatenbank fehlerhaft
|
||||
R Dyn.Error.Undef_Uebergabe // undefinierte Weiche
|
||||
|
||||
L 16#1004 // Kennung 10 + Word=04
|
||||
T LW0 // Any-Kennung, Datentyp
|
||||
L 40 // Datenwords speichern
|
||||
T LW2 // Wiederholungen
|
||||
|
||||
// Quelle-Pointer erzeugen:
|
||||
L 0 // Bei Merker = 0 !
|
||||
T LW4 // DB_Nummer
|
||||
L 220 // Adresse
|
||||
SLD 3
|
||||
L 16#8300_0000 // Kennung: Merker
|
||||
OD
|
||||
T LD6 // Kennung, Adresse
|
||||
|
||||
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=Dyn.Rueckmld.RET_VAL_BLKMOV_Uebergabe, DSTBLK:=Uebergabe) // Datenliste-Daten speichern | #Ziel
|
||||
|
||||
L Dyn.Rueckmld.RET_VAL_BLKMOV_Uebergabe // Rückmeldung
|
||||
L 0 // Fehler vorhanden ?
|
||||
<>I // Ja !
|
||||
= Dyn.Error.BLKMov // Error bei Block kopieren
|
||||
BEC
|
||||
|
||||
L Uebergabe.Uebergabe_Typ // Übergabentyp = 180 (Übergabe)
|
||||
L 180 // Dieser Aufruf-FB ?
|
||||
==I // Ja !
|
||||
JC en06_Mig
|
||||
|
||||
SET
|
||||
S Dyn.Error.Undef_Uebergabe // undefinierte Weiche
|
||||
|
||||
L 0 // Übergabe ungültig !
|
||||
T Uebergabe.Uebergabe_Nr // Nummer der Übergabe
|
||||
|
||||
BEU
|
||||
|
||||
en06_Mig: NOP 0
|
||||
|
||||
|
||||
--- NW 6: Daten des Inkremental-Gebers holen / Zeit-Inkremente ---
|
||||
L Uebergabe.Ink_DB // DB-Nr des Inkremental-Geber
|
||||
L 0 // angegeben ?
|
||||
<=I // Nein !
|
||||
JC w040
|
||||
|
||||
CAC
|
||||
T "MW200"
|
||||
OPN DB["MW200"] // Zähler-DB öffnen
|
||||
L DBD80
|
||||
T Dyn.Ink_Wert
|
||||
L DBD76
|
||||
T Dyn.Max_Wert
|
||||
A DBX74.3
|
||||
= Dyn.Lauf_Flag
|
||||
A DBX74.4
|
||||
= Dyn.Flag_Lauf_fertig
|
||||
A DBX74.5
|
||||
= Dyn.Ohne_Lauf_fertig
|
||||
|
||||
JU en04
|
||||
|
||||
// Zeit-Inkremente erzeugen:
|
||||
w040: AN Antrieb_aktiv
|
||||
JC w041
|
||||
|
||||
L "MW4" // 10ms-Takte
|
||||
ITD
|
||||
L Dyn.Ink_Wert
|
||||
+D // Aktueller Zählerwert +100ms-Takte
|
||||
T Dyn.Ink_Wert
|
||||
|
||||
w041: L 10000 // Festwert: 10000 (100s)
|
||||
T Dyn.Max_Wert
|
||||
|
||||
L Dyn.Ink_Wert // Aktueller Zählerwert
|
||||
L Dyn.Max_Wert // Max. Wert erreicht ?
|
||||
<=D // Nein !
|
||||
R Dyn.Ohne_Lauf_fertig // Ohne Flag-Lauf wurde beendet
|
||||
R Dyn.Flag_Lauf_fertig // Flag-Lauf wurde beendet
|
||||
JC en04
|
||||
|
||||
-D // Restwert als Startwert nehmen !
|
||||
T Dyn.Ink_Wert
|
||||
|
||||
AN Dyn.Lauf_Flag // Umschaltung Zähl-Lauf ohne-mit-ohne Flag
|
||||
= Dyn.Ohne_Lauf_fertig // Ohne Flag-Lauf wurde beendet
|
||||
A Dyn.Lauf_Flag // Umschaltung Zähl-Lauf ohne-mit-ohne Flag
|
||||
= Dyn.Flag_Lauf_fertig // Flag-Lauf wurde beendet
|
||||
|
||||
AN Dyn.Lauf_Flag // Umschaltung Zähl-Lauf ohne-mit-ohne Flag
|
||||
= Dyn.Lauf_Flag
|
||||
|
||||
en04: NOP 0
|
||||
|
||||
|
||||
--- NW 7:
|
||||
---
|
||||
AN ErrQuit
|
||||
// / CLR ///09.09.18, da Störung ohnehin nicht behebbar
|
||||
JC En07 // /Am 21.12.18 aufgrund vom Kundenwunsch wieder wie früher
|
||||
|
||||
SET
|
||||
R Dyn.Status.Reset
|
||||
|
||||
// Störungen löschen:
|
||||
SET
|
||||
R Dyn.Error.Keine_HSDaten
|
||||
R Dyn.Error.Travel_FIFO_ERR
|
||||
R Dyn.Error.Travel_FIFO_voll
|
||||
|
||||
En07: NOP 0
|
||||
|
||||
|
||||
--- NW 8: Übergabepunkt aufgrund von Hauptstrangdaten suchen ---
|
||||
L Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang)
|
||||
L 0 // schon bekannt ?
|
||||
>D // Ja !
|
||||
JC Nw09
|
||||
|
||||
L Uebergabe.Hauptstrang_DL_DB // Sortlisten-DB für diese Weiche (Hauptstrang)
|
||||
L 0 // Sinnvolle Angabe ?
|
||||
<=I // Nein !
|
||||
O(
|
||||
L Uebergabe.Hauptstrang_DL_DW // Sortlisten-DW für diese Weiche (Hauptstrang)
|
||||
L 0 // Sinnvolle Angabe ?
|
||||
<I // Nein !
|
||||
)
|
||||
JC w076
|
||||
|
||||
// Nach neuen Daten suchen:
|
||||
AN "Weiche_NewData" // Im Weichenbereich nach neuen Daten suchen
|
||||
JC w076
|
||||
|
||||
L Dyn.Ink_Wert // Aktueller Inkrementalwert
|
||||
L Uebergabe.Off_Ink // Inkremente zum Weiche schalten
|
||||
>D // Gleiches Flag/Flag wie Inkgeber zum Suchen
|
||||
JC w071
|
||||
|
||||
// Anders Flag/Liste wie Inkgeber zum Suchen:
|
||||
L Uebergabe.Hauptstrang_DL_DB
|
||||
|
||||
A Dyn.Lauf_Flag // Inkgeber schon mit Lauf-Flag
|
||||
JC w070
|
||||
|
||||
+ 1
|
||||
|
||||
w070: T Dyn.Hauptstrang_Sortliste // Sortliste aus welcher Hauptstrangdaten sind
|
||||
|
||||
JU w073
|
||||
|
||||
// Gleiches Flag/Liste wie Inkgeber zum Suchen:
|
||||
w071: L Uebergabe.Hauptstrang_DL_DB
|
||||
|
||||
AN Dyn.Lauf_Flag // Inkgebeer ohne Lauf-Flag
|
||||
JC w072
|
||||
|
||||
+ 1
|
||||
|
||||
w072: T Dyn.Hauptstrang_Sortliste // Sortliste aus welcher Hauptstrangdaten sind
|
||||
|
||||
// Hauptstrang Sortliste nach Position -1 durchsuchen:
|
||||
w073: CALL FC "DatenFindOffsetSort" (SSDB:=Dyn.Hauptstrang_Sortliste, SSDW:=Uebergabe.Hauptstrang_DL_DW, PARA:=WORD#16#0B01, SEARCHDATEN:=Uebergabe.Position_minus, RE_VAL:="MB199", OUTDATEN:=Daten, Position:="MW196") // nach 11.DW (letzte Position) suchen
|
||||
|
||||
L "MB199"
|
||||
T Dyn.Rueckmld.RET_VAL_Sortliste_Out
|
||||
|
||||
A "M199.7" // Datensatz ist vorhanden
|
||||
R Dyn.Error.Haupstrang_DL // Sortliste fehlerhaft
|
||||
JC w074
|
||||
|
||||
A "M199.6" // Datensatz ist nicht vorhanden
|
||||
R Dyn.Error.Haupstrang_DL // Sortliste fehlerhaft
|
||||
JC Xn08 // Warten, da noch keine Daten vorhanden
|
||||
|
||||
SET
|
||||
S Dyn.Error.Haupstrang_DL // Sortliste fehlerhaft
|
||||
|
||||
w076: L 0 // Keine Daten auf Hauptstrang vorhanden
|
||||
T Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang)
|
||||
|
||||
JU Xn08
|
||||
|
||||
// Search-Ink speichern:
|
||||
w074: L Daten.Start_Ink // Stamm-Daten speichern
|
||||
T Dyn.Hauptstrang_Search_Ink // Inkremente zum Daten auslesen (Start-Ink)
|
||||
|
||||
// Hauptstrang-Schaltdaten errechnen/speichern:
|
||||
// Kettenlängungs-Korrektur:
|
||||
L KorrekturFaktor // Korrektur-Faktor wegen Kettenlängung
|
||||
L 0.95 // sinnvoller Wert ? (maximal 5% Abweichung erlaubt)
|
||||
>=R // Ja !
|
||||
A(
|
||||
CAC
|
||||
L 1.05
|
||||
<=R
|
||||
)
|
||||
JC w075
|
||||
|
||||
L 1.0 // dann ohne Korrektur !
|
||||
T KorrekturFaktor // Korrektur-Faktor wegen Kettenlängung
|
||||
|
||||
// Schaltdaten errechnen:
|
||||
w075: A Daten.Start_Flag // Lauf-Flag bei Start-Inkremente
|
||||
= Dyn.Hauptstrang_Flag // Flag zum Weiche schalten (vom Hauptstrang)
|
||||
|
||||
L Uebergabe.Off_Ink // Inkremente zum Weiche schalten
|
||||
DTR
|
||||
L KorrekturFaktor // Korrektur-Faktor wegen Kettenlängung
|
||||
*R
|
||||
RND
|
||||
L Daten.Start_Ink // Daten aus Sortliste dazuaddieren
|
||||
+D
|
||||
T Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang)
|
||||
L Dyn.Max_Wert // Maximal erlaubter Zählwert
|
||||
>D
|
||||
JCN Xn08
|
||||
|
||||
-D // Restwert übernehmen
|
||||
T Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang)
|
||||
|
||||
AN Daten.Start_Flag // Lauf-Flag bei Start-Inkremente (invertieren)
|
||||
= Dyn.Hauptstrang_Flag // Flag zum Weiche schalten (vom Hauptstrang)
|
||||
|
||||
|
||||
--- NW 9: Hauptstrangdaten auslesen ---
|
||||
Nw09: L Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang)
|
||||
L 0 // angegeben ?
|
||||
==D // Nein !
|
||||
JC Xn08
|
||||
|
||||
<D // Negativ !
|
||||
JC w08E
|
||||
|
||||
A Dyn.Hauptstrang_Flag // Flag zum Weiche schalten (vom Hauptstrang)
|
||||
A Dyn.Flag_Lauf_fertig // Flag-Lauf wurde beendet
|
||||
O
|
||||
AN Dyn.Hauptstrang_Flag // Flag zum Weiche schalten (vom Hauptstrang)
|
||||
A Dyn.Ohne_Lauf_fertig // Flag-Lauf wurde beendet
|
||||
JC w080 // beim Ende des Lauf sind Inkremente uninteressant
|
||||
|
||||
A Dyn.Hauptstrang_Flag // Flag zum Weiche schalten (vom Hauptstrang)
|
||||
A Dyn.Lauf_Flag // Zähl-Lauf mit Flag ist aktiv
|
||||
O
|
||||
AN Dyn.Hauptstrang_Flag // Flag zum Weiche schalten (vom Hauptstrang)
|
||||
AN Dyn.Lauf_Flag // Zähl-Lauf mit Flag ist aktiv
|
||||
JCN Xn08
|
||||
|
||||
// Daten speichern:
|
||||
w080: L Dyn.Ink_Wert // Aktuelle Inkrementalwert
|
||||
L Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang)
|
||||
<D
|
||||
JC Xn08
|
||||
|
||||
// Fahrendes Teil auslesen:
|
||||
CALL FC "DatenOut" (SSDB:=Dyn.Hauptstrang_Sortliste, SSDW:=Uebergabe.Hauptstrang_DL_DW, PARA:=WORD#16#0000, SEARCHDATEN:=Dyn.Hauptstrang_Search_Ink, RE_VAL:="MB199", OUTDATEN:=Daten, Position:=Dyn.Hauptstrang_Pos) // Inkremente zum Daten auslesen (Start-Ink) | Aktuelle Position der Daten in Datenliste
|
||||
|
||||
L "MB199"
|
||||
T Dyn.Rueckmld.RET_VAL_Sortliste_Out
|
||||
|
||||
A "M199.7" // Datensatz ist vorhanden
|
||||
S Dyn.Status.BT_Daten_vorhanden // Daten für Travel-FIFO vorhanden
|
||||
JC w081
|
||||
|
||||
L Uebergabe.Hauptstrang_DL_DB
|
||||
T DatenDB
|
||||
OPN DB[DatenDB]
|
||||
|
||||
SET
|
||||
S Dyn.Error.Keine_HSDaten // Keine Hauptstrang-Daten mehr vorhanden
|
||||
JU Xn08
|
||||
|
||||
// Fahrendes Teil speichern: (für Übergabe an Travel-FIFO)
|
||||
w081: L Daten.Sort_Info.Teil_IDX // BM-IDX (wird bei Auslagerung gemeldet)
|
||||
T Dyn.Last_IDX // IDX des letzten durchfahrenden Teils
|
||||
L Daten.Sort_Info.Teil_Ziel
|
||||
T Dyn.Last_Ziel
|
||||
L Daten.Sort_Info.Sort_ID
|
||||
T SAVE.Last_Sort_ID
|
||||
|
||||
// Daten aus Sortliste löschen
|
||||
L Dyn.Hauptstrang_Pos // Aktuelle Position der Daten in Datenliste
|
||||
L 16#0E00 // 0EYY: DS YY löschen
|
||||
OW
|
||||
T FC86_Para
|
||||
|
||||
CALL FC "DatenOutSort" (SSDB:=Dyn.Hauptstrang_Sortliste, SSDW:=Uebergabe.Hauptstrang_DL_DW, PARA:=FC86_Para, OUTDATEN:=Daten, RE_VAL:="MB199") // DS YY löschen
|
||||
|
||||
|
||||
--- NW 10: Daten sofort an Travel-FIFO+1 übergeben ---
|
||||
// Daten an Travel-FIFO plus übergeben?:
|
||||
Xn08: A Dyn.Status.BT_Daten_vorhanden // Daten für Travel-FIFO vorhanden
|
||||
JCN en08
|
||||
|
||||
// Daten für Eintrag vorbereiten:
|
||||
L Dyn.Ink_Wert // Aktueller Inkrementalwert
|
||||
T Dyn.Last_Ink // Inkremente des letzten durchfahrenden Teils
|
||||
T "MD210" // Start-Ink (für Rückkontrolle)
|
||||
|
||||
L 0
|
||||
T "MW214"
|
||||
|
||||
A Dyn.Lauf_Flag // Zähl-Lauf mit Flag ist aktiv
|
||||
= Dyn.Last_Flag // Flag des letzten durchfahrenden Teils
|
||||
= "M214.0"
|
||||
|
||||
L Dyn.Last_IDX // IDX des letzten durchfahrenden Teils
|
||||
T "MD216"
|
||||
|
||||
L Dyn.Last_Ziel
|
||||
T "MW220"
|
||||
|
||||
L SAVE.Last_Sort_ID
|
||||
T "MW222"
|
||||
|
||||
L 0 // Restliche Daten löschen
|
||||
T "MW224"
|
||||
T "MW226"
|
||||
T "MW228"
|
||||
T "MW230"
|
||||
|
||||
// /FIFO resetten, damit Daten geschrieben werden können!:
|
||||
CALL FC "FifoReset" (SSDB:=Uebergabe.Travel_FIFO_DB_plus, SSDW:=Uebergabe.Travel_FIFO_DW_plus, PARA:=WORD#16#0000, RE_VAL:="MB199") // / | normaler FIFO
|
||||
|
||||
CALL FC "FifoIn" (SSDB:=Uebergabe.Travel_FIFO_DB_plus, SSDW:=Uebergabe.Travel_FIFO_DW_plus, PARA:=WORD#16#0000, INDATEN:=P#M210.0, RE_VAL:="MB199") // Daten speichern
|
||||
|
||||
L "MB199"
|
||||
T Dyn.Rueckmld.RET_VAL_TravelFIFO_In
|
||||
|
||||
JBI w8Ok
|
||||
|
||||
A "M199.2"
|
||||
S Dyn.Error.Travel_FIFO_voll // Daten-Übergabe fand nicht statt -> Antrieb stoppen)
|
||||
JC en08
|
||||
|
||||
SET
|
||||
S Dyn.Error.Travel_FIFO_ERR // Daten-Übergabe fand nicht statt -> Antrieb stoppen)
|
||||
|
||||
JU en08
|
||||
|
||||
w8Ok: SET
|
||||
R Dyn.Status.BT_Daten_vorhanden // Daten für Travel-FIFO vorhanden
|
||||
|
||||
w08E: L 0
|
||||
T Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang)
|
||||
|
||||
en08: NOP 0
|
||||
|
||||
|
||||
--- NW 11: Antrieb einschalten ---
|
||||
L Dyn.Hauptstrang_Ink // Inkremente zum Weiche schalten (vom Hauptstrang)
|
||||
L 0 // schon bekannt ?
|
||||
>D // Ja !
|
||||
S Antrieb_start // Kreiselantrieb starten
|
||||
|
||||
|
||||
--- NW 12: Ende ---
|
||||
BE
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,203 @@
|
||||
=== FB 92: MZylinder [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
Automatik : Bool // Automatikbetrieb ist aktiv
|
||||
Handbetrieb : Bool // Handbetrieb ist aktiv
|
||||
T_Ast : Int := 5 // Zeit bis AST erreicht ist (*100ms)
|
||||
T_Gst : Int := 5 // Zeit bis GST erreicht ist (*100ms)
|
||||
Output:
|
||||
ZylAst : Bool // Vorwärts-Ausgang des Antriebs
|
||||
ZylGst : Bool // Rückwärts-Ausgang des Antriebs
|
||||
InOut:
|
||||
Static:
|
||||
Stat : "UZylinder"
|
||||
Temp:
|
||||
Constant:
|
||||
|
||||
--- NW 1: Zeitwert löschen ---
|
||||
A ZylAst // Zylinder fährt nach AST
|
||||
A(
|
||||
O Stat.B_AST // Hat Endstellung erreicht
|
||||
ON Stat.Old_Ast // Fuhr letzten Zyklus anders
|
||||
)
|
||||
O
|
||||
AN ZylAst // Zylinder fährt nach GST
|
||||
A(
|
||||
O Stat.B_GST // Hat Endstellung erreicht
|
||||
O Stat.Old_Ast // Fuhr letzten Zyklus anders
|
||||
)
|
||||
JCN Nw02
|
||||
|
||||
tdel: L 0 // Zeitwert löschen
|
||||
T Stat.T_Zelle
|
||||
|
||||
A ZylAst // Zylinder fährt nach AST
|
||||
= Stat.Old_Ast // Fuhr letzten Zyklus nach AST
|
||||
|
||||
JU Nw05
|
||||
|
||||
--- NW 2: AST-Erreichtzeit abgelaufen ? ---
|
||||
Nw02: L Stat.T_AST_Akt // Gewollter Zeitwert
|
||||
L 9999 // angegeben ?
|
||||
<>I // Ja !
|
||||
JC w020
|
||||
|
||||
L T_Ast // Sollwert übergeben
|
||||
T Stat.T_AST_Akt // Gewollter Zeitwert
|
||||
|
||||
w020: A ZylAst // Zylinder fährt nach AST ?
|
||||
JCN en02
|
||||
|
||||
SET
|
||||
R Stat.B_GST
|
||||
|
||||
L Stat.T_Zelle // Aktueller Zeitwert
|
||||
L Stat.T_AST_Akt // Gewollter Zeitwert erreicht ?
|
||||
>=I
|
||||
S Stat.B_AST // Zylinder hat AST erreicht
|
||||
JC tdel // Zeit nullen
|
||||
|
||||
JU Nw03
|
||||
|
||||
en02: AN Stat.Typ5_3 // Zylinder hält seine Stellung !
|
||||
R Stat.B_AST
|
||||
|
||||
|
||||
--- NW 3: GST-Erreichtzeit abgelaufen ? ---
|
||||
Nw03: L Stat.T_GST_Akt // Gewollter Zeitwert
|
||||
L 9999 // angegeben ?
|
||||
<>I // Ja !
|
||||
JC w030
|
||||
|
||||
L T_Gst // Sollwert übergeben
|
||||
T Stat.T_GST_Akt // Gewollter Zeitwert
|
||||
|
||||
w030: A( // Zylinder fährt nach GST ?
|
||||
O Stat.Typ5_2 // Zylinder mit 2-facher Ansteuerung
|
||||
O Stat.Typ5_3
|
||||
)
|
||||
A ZylGst
|
||||
O
|
||||
A Stat.Typ3_2 // Zylinder mit 1-facher Ansteuerung
|
||||
AN ZylAst
|
||||
JCN en03
|
||||
|
||||
SET
|
||||
R Stat.B_AST
|
||||
|
||||
L Stat.T_Zelle // Aktueller Zeitwert
|
||||
L Stat.T_GST_Akt // Gewollter Zeitwert erreicht ?
|
||||
>=I
|
||||
S Stat.B_GST // Zylinder hat GST erreicht
|
||||
JC tdel // Zeit nullen
|
||||
|
||||
JU Nw04
|
||||
|
||||
en03: AN Stat.Typ5_3 // Zylinder hält seine Stellung !
|
||||
R Stat.B_GST
|
||||
|
||||
|
||||
--- NW 4: Zeit läuft ---
|
||||
Nw04: A( // Zylinder fährt nach GST ?
|
||||
O Stat.Typ5_2 // Zylinder mit 2-facher Ansteuerung
|
||||
O Stat.Typ5_3
|
||||
)
|
||||
AN ZylGst // Zylinder wird nicht angesteuert
|
||||
AN ZylAst
|
||||
ON "100ms-Impuls" // nur als Impuls
|
||||
JC Nw05
|
||||
|
||||
L Stat.T_Zelle
|
||||
L "MW2" // 100ms-Takte
|
||||
+I
|
||||
T Stat.T_Zelle
|
||||
|
||||
|
||||
--- NW 5: Undefinierte Zustände / Befehle ---
|
||||
Nw05: A Automatik // Automatik + Hand aktiv
|
||||
A Handbetrieb
|
||||
O
|
||||
AN Automatik // keine Betriebsart
|
||||
AN Handbetrieb
|
||||
O
|
||||
A Stat.Ast // Arbeitsstellung- + Grundstellungfahren aktiv
|
||||
A Stat.Gst
|
||||
O
|
||||
AN Stat.Typ3_2 // Undefinierter Ventil-Typ
|
||||
AN Stat.Typ5_2
|
||||
AN Stat.Typ5_3
|
||||
O
|
||||
A Stat.Typ3_2
|
||||
A(
|
||||
O Stat.Typ5_2
|
||||
O Stat.Typ5_3
|
||||
)
|
||||
O
|
||||
A Stat.Typ5_2
|
||||
A Stat.Typ5_3
|
||||
JCN en06 // Zylinderstellung bleibt eingefroren
|
||||
|
||||
A Stat.Typ5_3 // Zylinder hält seine Stellung !
|
||||
R Stat.Ast // Bewegungsbits löschen
|
||||
R Stat.Gst
|
||||
|
||||
BEU
|
||||
|
||||
en06: NOP 0
|
||||
|
||||
--- NW 6: Zylinder auf Arbeitstellung fahren ---
|
||||
A Stat.Ast
|
||||
= ZylAst
|
||||
|
||||
|
||||
--- NW 7: Zylinder auf Grundstellung fahren ---
|
||||
A(
|
||||
O Stat.Typ5_2
|
||||
O Stat.Typ5_3
|
||||
)
|
||||
A Stat.Gst
|
||||
= ZylGst
|
||||
|
||||
|
||||
--- NW 8: Daten, die zurückgesetzt werden ---
|
||||
A Stat.Typ5_3 // Zylinder hält seine Stellung !
|
||||
R Stat.Ast // Bewegungsbits löschen
|
||||
R Stat.Gst
|
||||
A Stat.Typ3_2
|
||||
R Stat.Gst // Es gibt kein GST fahren !
|
||||
|
||||
|
||||
--- NW 9: Ausgänge übergeben an OP übergeben ---
|
||||
A ZylGst
|
||||
= Stat.OP_Out_GST
|
||||
|
||||
A ZylAst
|
||||
= Stat.OP_Out_AST
|
||||
|
||||
|
||||
--- NW 10: Statistik ---
|
||||
A ZylAst
|
||||
Rise Stat.FP_AST
|
||||
JCN AST2
|
||||
|
||||
L Stat.Statistik.AST_Schaltungen
|
||||
L DINT#1
|
||||
+D
|
||||
T Stat.Statistik.AST_Schaltungen
|
||||
|
||||
AST2: A ZylGst
|
||||
A Stat.Typ5_3
|
||||
Rise Stat.FP_AST2
|
||||
JCN StatEnde
|
||||
|
||||
L Stat.Statistik.AST2_Schaltungen
|
||||
L DINT#1
|
||||
+D
|
||||
T Stat.Statistik.AST2_Schaltungen
|
||||
|
||||
StatEnde: NOP 0
|
||||
|
||||
|
||||
--- NW 11: Ende ---
|
||||
BE
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
=== FC 121: Save_CARR_Gesendet [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
Kennung_1 : Char
|
||||
Kennung_2 : Char
|
||||
Kennung_3 : Char
|
||||
Kennung_4 : Char
|
||||
FIFO_DB : Int // FIFO-Ringspeicher
|
||||
Teil_IDX : Int // BT/MT-IDX (wird bei Auslagerung gemeldet)
|
||||
Teil_Ziel : Int // BT/MT bei diesem Abwurf-Ziel ausfahren/entladen
|
||||
Sort_ID : Int // Sortier-Info (Sort-ID, mit welcher Fahrt gestartet wurde)
|
||||
Output:
|
||||
InOut:
|
||||
Temp:
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
|
||||
--- NW 1: Kennung CARR ? ---
|
||||
L Kennung_1
|
||||
L 'C'
|
||||
<>I // Nein !
|
||||
BEC
|
||||
|
||||
L Kennung_2
|
||||
L 'A'
|
||||
<>I // Nein !
|
||||
BEC
|
||||
|
||||
L Kennung_3
|
||||
L 'R'
|
||||
<>I // Nein !
|
||||
BEC
|
||||
|
||||
L Kennung_4
|
||||
L 'R'
|
||||
<>I // Nein !
|
||||
BEC
|
||||
|
||||
|
||||
--- NW 2: Daten aufbereiten ---
|
||||
L Teil_IDX
|
||||
T "MW220"
|
||||
|
||||
L Teil_Ziel
|
||||
T "MW222"
|
||||
|
||||
L Sort_ID
|
||||
T "MW224"
|
||||
|
||||
|
||||
--- NW 3: Daten speichern ---
|
||||
CALL FC "FifoOut" (SSDB:=FIFO_DB, SSDW:=0, PARA:=WORD#16#E100, OUTDATEN:=P#M200.0, RE_VAL:="MB199") // da Ringspeicher nächster Eintrag lesen + austragen
|
||||
|
||||
CALL FC "FifoIn" (SSDB:=FIFO_DB, SSDW:=0, PARA:=WORD#16#0000, INDATEN:=P#M220.0, RE_VAL:="MB199")
|
||||
|
||||
L "MB199"
|
||||
|
||||
|
||||
--- NW 4: Ende ---
|
||||
BE
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
=== FC 122: Save_Ziel [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
FIFO_DB : Int // FIFO-Ringspeicher
|
||||
Teil_IDX : Int // BT/MT-IDX (wird bei Auslagerung gemeldet)
|
||||
Teil_Ziel : Int // BT/MT bei diesem Abwurf-Ziel ausfahren/entladen
|
||||
Output:
|
||||
InOut:
|
||||
Temp:
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
|
||||
--- NW 1: Daten aufbereiten ---
|
||||
L Teil_IDX
|
||||
T "MW220"
|
||||
|
||||
L Teil_Ziel
|
||||
T "MW222"
|
||||
|
||||
|
||||
--- NW 2: Daten speichern ---
|
||||
CALL FC "FifoOut" (SSDB:=FIFO_DB, SSDW:=0, PARA:=WORD#16#E100, OUTDATEN:=P#M200.0, RE_VAL:="MB199") // da Ringspeicher nächster Eintrag lesen + austragen
|
||||
|
||||
CALL FC "FifoIn" (SSDB:=FIFO_DB, SSDW:=0, PARA:=WORD#16#0000, INDATEN:=P#M220.0, RE_VAL:="MB199")
|
||||
|
||||
L "MB199"
|
||||
|
||||
|
||||
--- NW 3: Ende ---
|
||||
BE
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
=== FC 1028: Set_Input [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
Enable : Bool // Baustein aktivieren
|
||||
Status : Bool // Angegebenen Ausgang auf diesen Status steuern
|
||||
InByte : DInt // Eingangsbyte zum Steuern
|
||||
InBit : Int // Eingangsbit zum Steuern
|
||||
Output:
|
||||
InOut:
|
||||
Temp:
|
||||
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
|
||||
--- NW 1: Baustein aktiviert ? ---
|
||||
AN Enable
|
||||
BEC
|
||||
|
||||
|
||||
--- NW 2: Eingang stuern ---
|
||||
L InByte // Ausgangsbyte zum Steuern
|
||||
SLD 3
|
||||
L InBit // Ausgangsbit zum Steuern
|
||||
OW
|
||||
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
A Status
|
||||
= IX [AR1Zeiger] // Eingang steuern
|
||||
|
||||
|
||||
--- NW 3: Ende ---
|
||||
BE
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
=== FC 127: Set_Output [STL] ===
|
||||
INTERFACE:
|
||||
Input:
|
||||
Enable : Bool // Baustein aktivieren
|
||||
Status : Bool // Angegebenen Ausgang auf diesen Status steuern
|
||||
OutByte : DInt // Ausgangsbyte zum Steuern
|
||||
OutBit : Int // Ausgangsbit zum Steuern
|
||||
Output:
|
||||
InOut:
|
||||
Temp:
|
||||
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
Constant:
|
||||
Return:
|
||||
Ret_Val : Void
|
||||
|
||||
--- NW 1: Baustein aktiviert ? ---
|
||||
AN Enable
|
||||
BEC
|
||||
|
||||
|
||||
--- NW 2: Ausgang steuern ---
|
||||
L OutByte // Ausgangsbyte zum Steuern
|
||||
SLD 3
|
||||
L OutBit // Ausgangsbit zum Steuern
|
||||
OW
|
||||
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
|
||||
|
||||
A Status
|
||||
= QX [AR1Zeiger] // Ausgang steuern
|
||||
|
||||
|
||||
--- NW 3: Ende ---
|
||||
BE
|
||||
|
||||
Reference in New Issue
Block a user