Tagessicherung
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,4 +1,5 @@
|
|||||||
|
|
||||||
prj.backup/
|
prj.backup/*
|
||||||
/prj.backup
|
/prj.backup
|
||||||
|
|
||||||
/prj/*.info
|
/prj/*.info
|
||||||
|
|||||||
@@ -1,53 +0,0 @@
|
|||||||
FUNCTION "Any.Create" : Void
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_DataType : Byte; // Code für den Datentyp (16#01=BOOL, 16#02=BYTE, 16#03=CHAR, 16#04=WORD, 16#05=INT, 16#06=DWORD, 16#07=DINT, 16#08=REAL, 16#09=DATE, 16#0A=TOD, 16#0B=TIME, 16#0C=S5TIME, 16#0E=DT, 16#13=STRING)
|
|
||||||
I_DataCount : Int; // Wiederholfaktor
|
|
||||||
I_DB_Number : Int; // Nummer für Datenbaustein
|
|
||||||
I_MemoryArea : Byte; // Speicherbereich (16#81=Input area (I), 16#82=Output area (O), 16#83=Bit memory area (M), 16#84=Shared Data Block (DB), 16#85=Instance Data Block (DI), 16#86=Local data (L stack), 16#87=Previous local data (V))
|
|
||||||
I_Byte : Int; // Zeiger für Byteadresse
|
|
||||||
I_Bit : Int; // Zeiger für Bitadresse
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Any : Any; // Any Out
|
|
||||||
pDataAny AT O_Any : "Any.T_AnyPoint";
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
pData : Any; // Pointer Eingangs Daten
|
|
||||||
flt : Int; // Fehler Blkmov
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
18.02.2021 0.0 St. Maier Neuerstellung
|
|
||||||
16.03.2021 0.0 St. Maier div. Anpassungen
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Mit der Funktion kann ein Any-Pointer zusammen gestellt werden - dieser wird dann am
|
|
||||||
Ausgang O_Any bereitgestllt.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#pDataAny.SyntaxId := 16#10;
|
|
||||||
#pDataAny.DataType := #I_DataType;
|
|
||||||
#pDataAny.DataCount := #I_DataCount;
|
|
||||||
#pDataAny.DB_Number := INT_TO_WORD(#I_DB_Number);
|
|
||||||
#pDataAny.BytePointer := SHL(IN := BYTE_TO_DWORD(#I_MemoryArea), N := 24) OR SHL(IN := WORD_TO_DWORD(INT_TO_WORD(#I_Byte)), N := 3) OR WORD_TO_DWORD(INT_TO_WORD(#I_Bit));
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
FUNCTION "Any.GetEndAdr" : Int
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_Any : Any; // Eingangs-Any
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
pData : Any; // Pointer Eingangs Daten
|
|
||||||
pDataAny AT pData : "Any.T_AnyPoint"; // Pointer Eingangs Daten Detail
|
|
||||||
adrOffSet : Int; // Adress-Offset
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
06.03.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Funktion gibt die End-Adresse eines Any-Pointers zurück.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
// Any initialisieren
|
|
||||||
#pData := #I_Any;
|
|
||||||
|
|
||||||
// Offset bestimmen
|
|
||||||
#adrOffSet := "Any.GetOffset"(#pData);
|
|
||||||
|
|
||||||
CASE CHAR_TO_INT(BYTE_TO_CHAR(#pDataAny.DataType)) OF
|
|
||||||
|
|
||||||
1: // BOOL
|
|
||||||
#"Any.GetEndAdr" := 8 * #pDataAny.DataCount + #adrOffSet - 2; // Boolean
|
|
||||||
|
|
||||||
2, 3: // Byte, Char
|
|
||||||
#"Any.GetEndAdr" := #pDataAny.DataCount + #adrOffSet - 2; // 1 Byte, Adress-Offset addieren und 2 Byte abziehen
|
|
||||||
|
|
||||||
4, 5, 9, 12: // Word, Int, Date, S5Time
|
|
||||||
#"Any.GetEndAdr" := #pDataAny.DataCount * 2 + #adrOffSet - 2; // 2 Byte, mit 2 Byte multiplizieren und Adress-Offset addieren und 2 Byte abziehen
|
|
||||||
|
|
||||||
6..8, 10, 11: // DWord, DInt, Reak, TOD, Time
|
|
||||||
#"Any.GetEndAdr" := #pDataAny.DataCount * 4 + #adrOffSet - 2; // 4 Byte, mit 4 Byte multiplizieren und Adress-Offset addieren und 2 Byte abziehen
|
|
||||||
|
|
||||||
14: // DT
|
|
||||||
#"Any.GetEndAdr" := #pDataAny.DataCount * 8 + #adrOffSet - 2; // 8 Byte, mit 8 Byte multiplizieren und Adress-Offset addieren und 2 Byte abziehen
|
|
||||||
|
|
||||||
ELSE:
|
|
||||||
|
|
||||||
#"Any.GetEndAdr" := 0;
|
|
||||||
|
|
||||||
END_CASE;
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
FUNCTION "Any.GetOffset" : Int
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_Any : Any; // Eingangs-Any
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
pData : Any; // Pointer Eingangs Daten
|
|
||||||
pDataAny AT pData : "Any.T_AnyPoint"; // Pointer Eingangs Daten Detail
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
06.03.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Funktion gibt die Offset-Adresse eines Any-Pointers zurück.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
// Any initialisieren
|
|
||||||
#pData := #I_Any;
|
|
||||||
|
|
||||||
// Adress-Offset berechnen
|
|
||||||
#"Any.GetOffset" := DWORD_TO_INT(SHR(IN := SHL(IN := #pDataAny.BytePointer, N := 16), N := 19));
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,129 +0,0 @@
|
|||||||
FUNCTION "Any.Lng" : Word
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
AUTHOR : FSI
|
|
||||||
VERSION : 0.3
|
|
||||||
VAR_INPUT
|
|
||||||
I_StartBitAndRange : Any; // Definierter ANY-Pointer
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Lng : DInt; // ermittelte Länge
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
buffer : "Any.T_AnyPoint"; // Variable "buffer" vom Typ UDT: "T_AnyPoint"
|
|
||||||
tmpAny AT buffer : Any; // Temp. Variable zum Zugriff auf dem Buffer (UDT)
|
|
||||||
bitCnt : DInt; // Bit-Zähler
|
|
||||||
err : Word; // Fehler-Rückgabewert
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
26.09.2019 0.0 St. Maier Neuerstellung
|
|
||||||
10.10.2019 0.1 St. Maier Abhänigkeiten aus Baustein Beschreibung entfernt
|
|
||||||
10.10.2019 0.2 St. Maier O_Buffer entfernt - zukünftig für jedes Element einen
|
|
||||||
seperaten Baustein
|
|
||||||
11.10.2019 0.3 St. Maier Überarbeitung Kopf damit TIA kompatibel
|
|
||||||
17.10.2019 0.4 St. Maier Variablen Kommentare eingefügt - wurden bei der
|
|
||||||
Portierung nach TIA nicht übernommen
|
|
||||||
24.10.2019 0.5 St. Maier Datentypen erweitert
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################### Baustein Beschreibung #######################################
|
|
||||||
|
|
||||||
Abhängigkeiten (von anderen Fuktionen und Quellen):
|
|
||||||
-
|
|
||||||
|
|
||||||
Inputs:
|
|
||||||
- StartBitAndRange: Definierter ANY-Pointer
|
|
||||||
|
|
||||||
|
|
||||||
Outputs:
|
|
||||||
- Lng: ermittelte Länge
|
|
||||||
|
|
||||||
|
|
||||||
In-\Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Return-Value:
|
|
||||||
- AnyLng: Fehlermeldung für die Bausteinausgabe
|
|
||||||
|
|
||||||
Funktionsbeschreibung:
|
|
||||||
Der Baustein gibt die Länge eines Any-Pointer zurück.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(* Datentypen
|
|
||||||
|
|
||||||
Hex Dez Datentyp
|
|
||||||
00 0 NIL
|
|
||||||
01 1 Bool
|
|
||||||
02 2 Byte
|
|
||||||
03 3 Char
|
|
||||||
04 4 WORD
|
|
||||||
05 5 INT
|
|
||||||
06 6 DWORD
|
|
||||||
07 7 DINT
|
|
||||||
08 8 REAL
|
|
||||||
09 9 Date
|
|
||||||
0A 10 Time of day (TOD)
|
|
||||||
0B 11 Time
|
|
||||||
0C 12 S5Time
|
|
||||||
0D 13 String
|
|
||||||
0E 14 Date and Time (DT)
|
|
||||||
|
|
||||||
*)
|
|
||||||
|
|
||||||
#err := 0; // Rücksetze err-Variable
|
|
||||||
|
|
||||||
#tmpAny := #I_StartBitAndRange; // Hier werden die Daten aus der Eingangsvariable "StartBitAndRange" (ANY-
|
|
||||||
// Pointer) der temporären Variable "tmpAny" (ANY-Pointer mit Zugriff auf
|
|
||||||
// die Buffer-Variable vom Typ UDT "tAnyPoint") übergeben. Somit ist das Lesen
|
|
||||||
// und Schreiben der Daten in den Buffer möglich, um den Zeiger zu bilden.
|
|
||||||
|
|
||||||
CASE CHAR_TO_INT(BYTE_TO_CHAR(#buffer.DataType)) OF
|
|
||||||
1:
|
|
||||||
#bitCnt := 8 * #buffer.DataCount; // Boolean
|
|
||||||
2:
|
|
||||||
#bitCnt := #buffer.DataCount; // BYTE, dann multipliziere mit 8
|
|
||||||
3:
|
|
||||||
#bitCnt := #buffer.DataCount; // CHAR, dann multipliziere mit 8
|
|
||||||
4:
|
|
||||||
#bitCnt := #buffer.DataCount / 2; // WORD, dann multipliziere mit 16
|
|
||||||
5:
|
|
||||||
#bitCnt := #buffer.DataCount / 2; // INT, dann multipliziere mit 16
|
|
||||||
6:
|
|
||||||
#bitCnt := #buffer.DataCount / 4; // DWORD, dann multipliziere mit 32
|
|
||||||
7:
|
|
||||||
#bitCnt := #buffer.DataCount / 4; // DINT, dann multipliziere mit 32
|
|
||||||
8:
|
|
||||||
#bitCnt := #buffer.DataCount / 4; // REAL, dann multipliziere mit 32
|
|
||||||
9:
|
|
||||||
#bitCnt := #buffer.DataCount / 2; // Date, dann multipliziere mit 16
|
|
||||||
10:
|
|
||||||
#bitCnt := #buffer.DataCount / 4; // Time of day (TOD), dann multipliziere mit 32
|
|
||||||
11:
|
|
||||||
#bitCnt := #buffer.DataCount / 4; // Time, dann multipliziere mit 32
|
|
||||||
12:
|
|
||||||
#bitCnt := #buffer.DataCount / 2; // S5Time, dann multipliziere mit 16
|
|
||||||
14:
|
|
||||||
#bitCnt := #buffer.DataCount / 8; // Date and Time (DT), dann multipliziere mit 16
|
|
||||||
ELSE: // Andere Typen vom ANY-Pointer, werden nicht unterstützt!
|
|
||||||
#err := W#16#8001; // Typ vom ANY-Pointer wird nicht unterstützt
|
|
||||||
END_CASE;
|
|
||||||
|
|
||||||
#O_Lng := #bitCnt; // Länge ausgeben
|
|
||||||
#"Any.Lng" := #err; // Fehlermeldung für die Bausteinausgabe
|
|
||||||
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
FUNCTION "Any.NoOfBytes" : Int
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_Any : Any; // Eingangs-Any
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
pData : Any; // Pointer Eingangs Daten
|
|
||||||
pDataAny AT pData : "Any.T_AnyPoint"; // Pointer Eingangs Daten Detail
|
|
||||||
adrOffSet : Int; // Adress-Offset
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
06.03.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Funktion gibt die Anzahl der Bytes eines Any-Pointers zurück.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
// Any initialisieren
|
|
||||||
#pData := #I_Any;
|
|
||||||
|
|
||||||
// Offset bestimmen
|
|
||||||
#adrOffSet := "Any.GetOffset"(#pData);
|
|
||||||
|
|
||||||
CASE CHAR_TO_INT(BYTE_TO_CHAR(#pDataAny.DataType)) OF
|
|
||||||
|
|
||||||
1: // BOOL
|
|
||||||
#"Any.NoOfBytes" := #pDataAny.DataCount; // Boolean
|
|
||||||
|
|
||||||
2, 3: // Byte, Char
|
|
||||||
#"Any.NoOfBytes" := #pDataAny.DataCount; // 1 Byte
|
|
||||||
|
|
||||||
4, 5, 9, 12: // Word, Int, Date, S5Time
|
|
||||||
#"Any.NoOfBytes" := #pDataAny.DataCount * 2; // 2 Byte, mit 2 Byte multiplizieren
|
|
||||||
|
|
||||||
6..8, 10, 11: // DWord, DInt, Reak, TOD, Time
|
|
||||||
#"Any.NoOfBytes" := #pDataAny.DataCount * 4; // 4 Byte, mit 4 Byte multiplizieren
|
|
||||||
|
|
||||||
14: // DT
|
|
||||||
#"Any.NoOfBytes" := #pDataAny.DataCount * 8; // 8 Byte, mit 8 Byte multiplizieren
|
|
||||||
|
|
||||||
ELSE:
|
|
||||||
|
|
||||||
#"Any.NoOfBytes" := 0;
|
|
||||||
|
|
||||||
END_CASE;
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
FUNCTION "Any.Struct" : Word
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
AUTHOR : FSI
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_UDT : Any; // UDT
|
|
||||||
I_StartBitAndRange : Any; // Definierter ANY-Pointer
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_DataCount : DInt; // ermittelte Anzahl Elemente
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
lngUdt : DInt; // ermittelte Länge des UDT
|
|
||||||
lngStruct : DInt; // Länge des ANY-Pointers
|
|
||||||
err : Word; // Fehler-Rückgabewert
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
11.10.2019 0.0 St. Maier Neuerstellung
|
|
||||||
11.10.2019 0.1 St. Maier Überarbeitung Kopf damit TIA kompatibel
|
|
||||||
18.10.2019 0.2 St. Maier Variablen Kommentare eingefügt - wurden bei der
|
|
||||||
Portierung nach TIA nicht übernommen
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################### Baustein Beschreibung #######################################
|
|
||||||
|
|
||||||
Abhängigkeiten (von anderen Fuktionen und Quellen):
|
|
||||||
- AnyLng
|
|
||||||
|
|
||||||
Inputs:
|
|
||||||
- I_UDT: Referenz UDT
|
|
||||||
- StartBitAndRange: Definierter ANY-Pointer
|
|
||||||
|
|
||||||
|
|
||||||
Outputs:
|
|
||||||
- O_DataCount: ermittelte Länge/Anzahl der Elemente eines UDT Arrays
|
|
||||||
|
|
||||||
|
|
||||||
In-\Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Return-Value:
|
|
||||||
- AnyLng: Fehlermeldung für die Bausteinausgabe
|
|
||||||
|
|
||||||
Funktionsbeschreibung:
|
|
||||||
Der Baustein gibt die Länge/Anzahl der Elemente eines UDT Arrays zurück.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#err := 0 ; // Rücksetze err-Variable
|
|
||||||
|
|
||||||
// Länge des UDT bestimmen
|
|
||||||
#err := "Any.Lng"( I_StartBitAndRange := #I_UDT // IN: ANY
|
|
||||||
,O_Lng => #lngUdt // OUT: DINT
|
|
||||||
); // WORD
|
|
||||||
|
|
||||||
// Länge des ANY-Pointers bestimmen
|
|
||||||
#err := "Any.Lng"( I_StartBitAndRange := #I_StartBitAndRange // IN: ANY
|
|
||||||
,O_Lng => #lngStruct // OUT: INT
|
|
||||||
); // WORD
|
|
||||||
|
|
||||||
#O_DataCount := #lngStruct / #lngUdt; // Anzahl Elemente ausgeben
|
|
||||||
#"Any.Struct" := #err; // Fehlermeldung für die Bausteinausgabe
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
TYPE "Any.T_AnyCreate"
|
|
||||||
AUTHOR : FSI
|
|
||||||
VERSION : 0.0
|
|
||||||
STRUCT
|
|
||||||
DataType : Byte; // Code für den Datentyp (16#01=BOOL, 16#02=BYTE, 16#03=CHAR, 16#04=WORD, 16#05=INT, 16#06=DWORD, 16#07=DINT, 16#08=REAL, 16#09=DATE, 16#0A=TOD, 16#0B=TIME, 16#0C=S5TIME, 16#0E=DT, 16#13=STRING)
|
|
||||||
DataCount : Int; // Wiederholfaktor
|
|
||||||
DB_Number : Int; // Nummer für Datenbaustein
|
|
||||||
MemoryArea : Byte; // Speicherbereich (16#81=Input area (I), 16#82=Output area (O), 16#83=Bit memory area (M), 16#84=Shared Data Block (DB), 16#85=Instance Data Block (DI), 16#86=Local data (L stack), 16#87=Previous local data (V))
|
|
||||||
BytePointer : Int; // Zeiger für Byteadresse
|
|
||||||
BitPointer : Int; // Zeiger für Bitadresse
|
|
||||||
END_STRUCT;
|
|
||||||
|
|
||||||
END_TYPE
|
|
||||||
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
TYPE "Any.T_AnyPoint"
|
|
||||||
AUTHOR : FSI
|
|
||||||
VERSION : 0.0
|
|
||||||
STRUCT
|
|
||||||
SyntaxId : Byte; // Angabe der Syntax-ID
|
|
||||||
DataType : Byte; // Code für den Datentyp (16#01=BOOL, 16#02=BYTE, 16#03=CHAR, 16#04=WORD, 16#05=INT, 16#06=DWORD, 16#07=DINT, 16#08=REAL, 16#09=DATE, 16#0A=TOD, 16#0B=TIME, 16#0C=S5TIME, 16#0E=DT, 16#13=STRING)
|
|
||||||
DataCount : Int; // Wiederholfaktor
|
|
||||||
DB_Number : Word; // Nummer für Datenbaustein
|
|
||||||
BytePointer : DWord; // Zeiger für Byte- und Bitadresse
|
|
||||||
END_STRUCT;
|
|
||||||
|
|
||||||
END_TYPE
|
|
||||||
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
TYPE "Any.T_AnyPointDtl"
|
|
||||||
VERSION : 0.1
|
|
||||||
STRUCT
|
|
||||||
SyntaxId : Byte := 16#0; // Angabe der Syntax-ID
|
|
||||||
DataType : Byte := 16#0; // Code für den Datentyp (16#01=BOOL, 16#02=BYTE, 16#03=CHAR, 16#04=WORD, 16#05=INT, 16#06=DWORD, 16#07=DINT, 16#08=REAL, 16#09=DATE, 16#0A=TOD, 16#0B=TIME, 16#0C=S5TIME, 16#0E=DT, 16#13=STRING)
|
|
||||||
DataCount : Int := 0; // Wiederholfaktor
|
|
||||||
DB_Number : Word := 16#0; // Nummer für Datenbaustein
|
|
||||||
MemoryArea : Byte; // Speicherbereich (16#81=Input area (I), 16#82=Output area (O), 16#83=Bit memory area (M), 16#84=Shared Data Block (DB), 16#85=Instance Data Block (DI), 16#86=Local data (L stack), 16#87=Previous local data (V))
|
|
||||||
ByteAddressMSB : Byte; // Speicherbereich MSB
|
|
||||||
ByteAddressLSB : Word; // Speicherbereich LSB
|
|
||||||
END_STRUCT;
|
|
||||||
|
|
||||||
END_TYPE
|
|
||||||
|
|
||||||
@@ -1,95 +0,0 @@
|
|||||||
FUNCTION "BufClr" : Void
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_Data : Any; // Eingangswert
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
pData : Any; // Pointer Eingangs Daten
|
|
||||||
pDataAny AT pData : "Any.T_AnyPoint"; // Pointer Eingangs Daten Detail
|
|
||||||
pDataTrg : Any; // Pointer Eingangs Daten
|
|
||||||
pDataTrgAny AT pDataTrg : "Any.T_AnyPoint"; // Pointer Eingangs Daten Detail
|
|
||||||
step : Int; // Schrittweite für die Adressen
|
|
||||||
adrAct : Int; // Aktuelle Adresse
|
|
||||||
adrEnd : Int; // End Adresse
|
|
||||||
bitCnt : Int; // Bit-Zähler
|
|
||||||
tmpDWord : DWord; // tmp Var
|
|
||||||
adrOffSet : Int; // Adress-Offset
|
|
||||||
flt : Int; // Fehler Blkmov
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR CONSTANT
|
|
||||||
LEN_DW : Int := 4; // Doppelwort
|
|
||||||
LEN_W : Int := 2; // Wort
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
05.03.2021 0.0 St. Maier Neuerstellung
|
|
||||||
17.03.2021 0.0 St. Maier Var für End-Adress Bestimmung angepasst
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Funktion initialisiert ein beliebiges Array mit 0. Beim Aufruf wird der Funktion ein
|
|
||||||
Pointer auf das zu initialisierende Array übergeben. Das durch den Pointer angegebene Array
|
|
||||||
wird direkt im Speicher manipuliert.
|
|
||||||
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
// Pointer initizialisieren
|
|
||||||
#pData := #I_Data;
|
|
||||||
#pDataTrg := #pData;
|
|
||||||
|
|
||||||
// Byte-Offset berechnen
|
|
||||||
#adrOffSet := "Any.GetOffset"(#pData);
|
|
||||||
#adrAct := #adrOffSet;
|
|
||||||
|
|
||||||
// End-Adress berechnen
|
|
||||||
#adrEnd := "Any.GetEndAdr"(#pDataTrg);
|
|
||||||
|
|
||||||
// Schrittweiten berechnen
|
|
||||||
IF #pDataAny.DataCount / #LEN_DW > real#1.0 THEN
|
|
||||||
#step := #LEN_DW;
|
|
||||||
ELSE
|
|
||||||
#step := #LEN_W;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
WHILE (#adrAct <= #adrEnd) DO
|
|
||||||
|
|
||||||
#tmpDWord := DW#16#00000000;
|
|
||||||
|
|
||||||
// Daten zum Kopieren zusammenstellen
|
|
||||||
IF #step = #LEN_DW THEN // Doppelwort
|
|
||||||
#pDataTrgAny.DataType := B#16#06; // Doppelwort
|
|
||||||
ELSE // Wort
|
|
||||||
#pDataTrgAny.DataType := B#16#04; // Wort
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
#pDataTrgAny.BytePointer := dw#16#84000000 OR SHL(IN := WORD_TO_DWORD(INT_TO_WORD(#adrAct)), N := 3); // Byte-Adresse in Pointer laden
|
|
||||||
#pDataTrgAny.DataCount := 1; // Länge
|
|
||||||
#flt := BLKMOV(SRCBLK := #tmpDWord, DSTBLK => #pDataTrg); // Eingangs-Daten kopieren
|
|
||||||
|
|
||||||
// Schrittweite am Ende des Datenbereichs bestimmen
|
|
||||||
IF #adrEnd - #adrAct < #LEN_DW THEN
|
|
||||||
#step := #LEN_W;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Adressen inkrementieren
|
|
||||||
#adrAct := #adrAct + #step;
|
|
||||||
|
|
||||||
END_WHILE;
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
FUNCTION_BLOCK "CpuPrgChanged"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_PrgChanged : Bool; // Anwenderprogramm wurde geändert
|
|
||||||
O_HwChanged : Bool; // Hardware wurd geändert
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
"SFC51" : Struct
|
|
||||||
OUT_RET_VAL : Int;
|
|
||||||
OUT_BUSY : Bool;
|
|
||||||
OUT_SZL_HEADER : Struct
|
|
||||||
LENTHDR : Word;
|
|
||||||
N_DR : Word;
|
|
||||||
END_STRUCT;
|
|
||||||
OUT_DR : Struct
|
|
||||||
INDEX : Word; // Index-Informationen des Teilauszugs
|
|
||||||
sch_schal : Word; // Durch Betriebsartenschalter eingestellte
|
|
||||||
sch_par : Word; // parametrierte Schutzstufe
|
|
||||||
sch_rel : Word; // gültige Schutzstufe der CPU
|
|
||||||
bart_sch : Word; // Stellung des Betriebsartenschalters
|
|
||||||
anl_sch : Word; // Stellung des Anlaufartenschalters
|
|
||||||
ken_f : Word; // Reserviert
|
|
||||||
ken_rel : Word; // Kennung der Gültigkeit der vier folgendenPrüfsummen
|
|
||||||
ken_ver1_hw : Word; // Prüfsumme 1 der Hardwarekonfiguration
|
|
||||||
ken_ver2_hw : Word; // Prüfsumme 2 der Hardwarekonfiguration
|
|
||||||
ken_ver1_awp : Word; // Prüfsumme 1 des Anwenderprogramms
|
|
||||||
ken_ver2_awp : Word; // Prüfsumme 2 des Anwenderprogramms
|
|
||||||
res : Array[0..7] of Word;
|
|
||||||
END_STRUCT;
|
|
||||||
END_STRUCT;
|
|
||||||
checksumHw : Word;
|
|
||||||
checksumAwp : Word;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
hvVar : Bool;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
01.12.2020 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
// Aufruf SFC 51
|
|
||||||
#SFC51.OUT_RET_VAL := RDSYSST(REQ := true,
|
|
||||||
SZL_ID := W#16#232,
|
|
||||||
INDEX := W#16#4,
|
|
||||||
BUSY => #SFC51.OUT_BUSY,
|
|
||||||
SZL_HEADER => #SFC51.OUT_SZL_HEADER,
|
|
||||||
DR => #SFC51.OUT_DR
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
#hvVar := (#checksumAwp <> 0) AND NOT #SFC51.OUT_BUSY;
|
|
||||||
|
|
||||||
#O_HwChanged := (#SFC51.OUT_DR.ken_ver2_hw <> #checksumHw) AND #hvVar;
|
|
||||||
|
|
||||||
#O_PrgChanged := (#SFC51.OUT_DR.ken_ver2_awp <> #checksumAwp) AND #hvVar;
|
|
||||||
|
|
||||||
#checksumHw := #SFC51.OUT_DR.ken_ver2_hw;
|
|
||||||
#checksumAwp := #SFC51.OUT_DR.ken_ver2_awp;
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
FUNCTION "CpuRdZt" : Void
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_DatUzt : Date_And_Time; // Datum und Uhrzeit
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
retVal : Int; // Rückgabewert Systemzeitauslesen
|
|
||||||
tmpDatUzt : Date_And_Time;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
16.10.2019 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################### Baustein Beschreibung #######################################
|
|
||||||
|
|
||||||
Abhängigkeiten (von anderen Fuktionen und Quellen):
|
|
||||||
-
|
|
||||||
|
|
||||||
Inputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Outputs:
|
|
||||||
- O_DatUzt: Uhrzeit und Datum der CPU
|
|
||||||
|
|
||||||
In-\Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Return-Value:
|
|
||||||
-
|
|
||||||
|
|
||||||
Funktionsbeschreibung:
|
|
||||||
Baustein lies System Datum und Uhrzeit von der CPU aus.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
// Systemzeit auslesen
|
|
||||||
#retVal := RD_SYS_T(#tmpDatUzt);
|
|
||||||
|
|
||||||
IF #retVal = 0 THEN
|
|
||||||
|
|
||||||
// aktuelles Datum und Uhrzeit ausgeben
|
|
||||||
#O_DatUzt := #tmpDatUzt;
|
|
||||||
|
|
||||||
END_IF;
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
FUNCTION "CpuZt" : DWord
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
AUTHOR : FSI
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
"I_STIME.tx" : DWord; // Zeit
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR CONSTANT
|
|
||||||
debug : Bool;
|
|
||||||
N : Int;
|
|
||||||
offset : Int;
|
|
||||||
offset_1 : DWord := 0;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
23.09.2018 0.0 St. Maier Neuerstellung
|
|
||||||
11.10.2019 0.1 St. Maier Überarbeitung Kopf damit TIA kompatibel
|
|
||||||
17.10.2019 0.2 St. Maier I_STIME Eingefügt, damit keine Abhängigkeit zu einem
|
|
||||||
IDB besteht
|
|
||||||
18.10.2019 0.3 St. Maier Variablen Kommentare eingefügt - wurden bei der
|
|
||||||
Portierung nach TIA nicht übernommen
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################### Baustein Beschreibung #######################################
|
|
||||||
|
|
||||||
Abhängigkeiten (von anderen Fuktionen und Quellen):
|
|
||||||
- STIME, IDB_STIME
|
|
||||||
|
|
||||||
Inputs:
|
|
||||||
- I_STIME.tx
|
|
||||||
|
|
||||||
Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
In-\Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Return-Value:
|
|
||||||
-
|
|
||||||
|
|
||||||
Funktionsbeschreibung:
|
|
||||||
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#CpuZt := #"I_STIME.tx";
|
|
||||||
|
|
||||||
IF #debug THEN
|
|
||||||
#CpuZt := DINT_TO_DWORD((DWORD_TO_DINT(SHL(IN:=#CpuZt,N:=#N) OR SHL(IN:=DWORD#1,N:=#N))-1) + DWORD_TO_DINT(#offset_1));
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
FUNCTION "CpuZtUS" : DWord
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
AUTHOR : FSI
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
"I_STIME.tx" : DWord; // Zeit
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR CONSTANT
|
|
||||||
debug : Bool;
|
|
||||||
N : Int;
|
|
||||||
offset : Int;
|
|
||||||
offset_1 : DWord := 0;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
23.09.2018 0.0 St. Maier Neuerstellung
|
|
||||||
11.10.2019 0.1 St. Maier Überarbeitung Kopf damit TIA kompatibel
|
|
||||||
17.10.2019 0.2 St. Maier I_STIME Eingefügt, damit keine Abhängigkeit zu einem
|
|
||||||
IDB besteht
|
|
||||||
18.10.2019 0.3 St. Maier Variablen Kommentare eingefügt - wurden bei der
|
|
||||||
Portierung nach TIA nicht übernommen
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################### Baustein Beschreibung #######################################
|
|
||||||
|
|
||||||
Abhängigkeiten (von anderen Fuktionen und Quellen):
|
|
||||||
- STIME, IDB_STIME
|
|
||||||
|
|
||||||
Inputs:
|
|
||||||
- I_STIME.tx
|
|
||||||
|
|
||||||
Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
In-\Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Return-Value:
|
|
||||||
-
|
|
||||||
|
|
||||||
Funktionsbeschreibung:
|
|
||||||
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#CpuZtUS := DINT_TO_DWORD(DWORD_TO_DINT(#"I_STIME.tx") * 1000);
|
|
||||||
|
|
||||||
IF #debug THEN
|
|
||||||
#CpuZtUS := DINT_TO_DWORD((DWORD_TO_DINT(SHL(IN:=#CpuZtUS,N:=#N) OR SHL(IN:=DWORD#1,N:=#N))-1) + DWORD_TO_DINT(#offset_1));
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
TYPE "CpuZylZt.T_ZylZt"
|
|
||||||
AUTHOR : FSI
|
|
||||||
VERSION : 0.0
|
|
||||||
STRUCT
|
|
||||||
Zt : Time;
|
|
||||||
END_STRUCT;
|
|
||||||
|
|
||||||
END_TYPE
|
|
||||||
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
TYPE "CpuZylZt.T_ZylZtStat"
|
|
||||||
VERSION : 0.1
|
|
||||||
STRUCT
|
|
||||||
ZylZtMin : Time; // minimale gemessene Zykluszeit
|
|
||||||
ZylZtMax : Time; // maximal gemessene Zykluszeit
|
|
||||||
ZylZtAv : Time; // durschnittlich gemessene Zykluszeit
|
|
||||||
ZylZt : Time; // zuletzt gemessene Zykluszeit
|
|
||||||
SysZt : Time; // Laufzeit seit dem letzten Start
|
|
||||||
SysTg : Int; // Anzahl der Tage seit dem letzten Start
|
|
||||||
SysLfZt : "TimeDtl"; // Laufzeit seit dem letzten Start
|
|
||||||
Zyl : DWord; // Anzahl der Zyklen seit dem letzten Start
|
|
||||||
END_STRUCT;
|
|
||||||
|
|
||||||
END_TYPE
|
|
||||||
|
|
||||||
@@ -1,231 +0,0 @@
|
|||||||
FUNCTION_BLOCK "CpuZylZt"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
AUTHOR : FSI
|
|
||||||
VERSION : 1.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_Rst : Bool; // Reset
|
|
||||||
I_ZylZtSreg : Any; // Schieberegister für Zykluszeiten
|
|
||||||
"I_STIME.tx" : DWord; // Zeit
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_ZylZtMin : Time := t#10h; // minimale gemessene Zykluszeit
|
|
||||||
O_ZylZtMax : Time := t#0ms; // maximal gemessene Zykluszeit
|
|
||||||
O_ZylZtAv : Time := t#0ms; // durschnittlich gemessene Zykluszeit
|
|
||||||
O_ZylZt : Time := t#0ms; // zuletzt gemessene Zykluszeit
|
|
||||||
O_SysZt : Time := t#0ms; // Laufzeit seit dem letzten Start
|
|
||||||
O_SysTg : Int := 0; // Anzahl der Tage seit dem letzten Start
|
|
||||||
O_Zyl : DWord := 0; // Anzahl der Zyklen seit dem letzten Start
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
zylZt : Time; // zuletzt gemessene Zykluszeit
|
|
||||||
tx : Time; // aktuelle Systemzeit
|
|
||||||
init : Bool; // Baustein inizialisiert
|
|
||||||
anyFlt : Word; // Infos des Schieberegisters
|
|
||||||
ZylZtSum : Time; // Fehler beim Bestimmen der Länge
|
|
||||||
i : Int; // ermittelte Länge des AnyPointers
|
|
||||||
i_init : Bool;
|
|
||||||
tmpUdt : "CpuZylZt.T_ZylZt"; // Summe der Zykluszeiten
|
|
||||||
oldVal : "CpuZylZt.T_ZylZt";
|
|
||||||
cyclNrs : DInt; // Laufvariable für Schieberegister
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
TOP_SI : Struct
|
|
||||||
EV_CLASS : Byte;
|
|
||||||
EV_NUM : Byte;
|
|
||||||
PRIORITY : Byte;
|
|
||||||
NUM : Byte;
|
|
||||||
TYP2_3 : Byte;
|
|
||||||
TYP1 : Byte;
|
|
||||||
ZI1 : Word;
|
|
||||||
ZI2_3 : DWord;
|
|
||||||
END_STRUCT;
|
|
||||||
START_UP_SI : Struct
|
|
||||||
EV_CLASS : Byte;
|
|
||||||
EV_NUM : Byte;
|
|
||||||
PRIORITY : Byte;
|
|
||||||
NUM : Byte;
|
|
||||||
TYP2_3 : Byte;
|
|
||||||
TYP1 : Byte;
|
|
||||||
ZI1 : Word;
|
|
||||||
ZI2_3 : DWord;
|
|
||||||
END_STRUCT;
|
|
||||||
err : Int;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
23.09.2019 0.0 St. Maier Neuerstellung
|
|
||||||
24.09.2019 0.1 St. Maier Durchschittsberechnung der Zykluszeit angepasst
|
|
||||||
24.09.2019 1.0 St. Maier Überarbeitung des Baustein, damit nicht Baustein für
|
|
||||||
Verlängerung des Schieberegisters angepasst werden muss
|
|
||||||
sondern nur der dazugehörige DB
|
|
||||||
11.10.2019 1.1 St. Maier Überarbeitung Kopf damit TIA kompatibel
|
|
||||||
15.10.2019 2.0 St. Maier Überarbeitung des Baustein, damit nicht Baustein für
|
|
||||||
Verlängerung des Schieberegisters oder Anpassung des
|
|
||||||
UDT angepasst werden muss.
|
|
||||||
17.10.2019 2.1 St. Maier I_STIME Eingefügt, damit keine Abhängigkeit zu einem
|
|
||||||
IDB besteht
|
|
||||||
18.10.2019 2.2 St. Maier Variablen Kommentare eingefügt - wurden bei der
|
|
||||||
Portierung nach TIA nicht übernommen
|
|
||||||
18.10.2019 2.3 St. Maier O_ZylZtMin Defaultwert auf t#10h gesetzt,ansonsten
|
|
||||||
wird min. Zykluszeit von 0 ms angezeigt
|
|
||||||
24.10.2019 3.0 St. Maier Überarbeitung Schieberegister
|
|
||||||
10.02.2021 3.1 St. Maier Probleme mit Zeitwert im negativen Bereich behoben
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################### Baustein Beschreibung #######################################
|
|
||||||
|
|
||||||
Abhängigkeiten (von anderen Fuktionen und Quellen):
|
|
||||||
- RD_SINFO
|
|
||||||
- CpuZeit
|
|
||||||
- Any.Lng
|
|
||||||
- Any.Struct
|
|
||||||
|
|
||||||
Inputs:
|
|
||||||
- I_Rst : Reset
|
|
||||||
- I_ZylZtShiftReg : Schieberegister für Zykluszeiten
|
|
||||||
|
|
||||||
Outputs:
|
|
||||||
- O_ZylZtMin: minimale gemessene Zykluszeit
|
|
||||||
- O_ZylZtMax: maximal gemessene Zykluszeit
|
|
||||||
- O_ZylZtAv : durschnittlich gemessene Zykluszeit
|
|
||||||
- O_ZylZt : zuletzt gemessene Zykluszeit
|
|
||||||
- O_SysZt : Laufzeit seit dem letzten Start
|
|
||||||
- O_SysTg : Anzahl der Tage seit dem letzten Start
|
|
||||||
- O_Zyl : Anzahl der Zyklen seit dem letzten Start
|
|
||||||
|
|
||||||
In-\Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Return-Value:
|
|
||||||
-
|
|
||||||
|
|
||||||
Funktionsbeschreibung:
|
|
||||||
Dies Funktion überacht die Zykluszeiten der SPS und stellt eine Reihe von Informationen über
|
|
||||||
Zykluszeiten und Laufzeiten zur Verfügung.
|
|
||||||
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(* aktuelle Startinformationen auslesen *)
|
|
||||||
(* OB1_SCAN_1 BYTE - B#16#01: Abschluss des Neustarts (Warmstarts)
|
|
||||||
- B#16#02: Abschluss des Wiederanlaufs
|
|
||||||
- B#16#03: Abschluss des freien Zyklus
|
|
||||||
- B#16#04: Abschluss des Kaltstarts
|
|
||||||
- B#16#05: Erster OB 1-Zyklus der neuen Master-CPU nach
|
|
||||||
Master-Reserve-Umschaltung und STOP des
|
|
||||||
bisherigen Masters *)
|
|
||||||
|
|
||||||
#err := RD_SINFO(TOP_SI => #TOP_SI // OUT: STRUCT
|
|
||||||
, START_UP_SI => #START_UP_SI // OUT: STRUCT
|
|
||||||
); // INT
|
|
||||||
|
|
||||||
// Zurücksetzen der letzten Zykluszeit bei System start
|
|
||||||
IF #TOP_SI.EV_NUM <> 3 THEN
|
|
||||||
#zylZt := t#0ms;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Infos wie Array-Länge von Schieberegiaster bestimmen
|
|
||||||
#anyFlt := "Any.Struct"(I_UDT := #tmpUdt
|
|
||||||
, I_StartBitAndRange := #I_ZylZtSreg
|
|
||||||
, O_DataCount => #cyclNrs
|
|
||||||
);
|
|
||||||
|
|
||||||
#tx := DINT_TO_TIME(DWORD_TO_DINT("CpuZt"("I_STIME.tx" := #"I_STIME.tx"))) - #zylZt;
|
|
||||||
|
|
||||||
IF #I_Rst THEN
|
|
||||||
|
|
||||||
#O_ZylZtMin := t#10h;
|
|
||||||
#O_ZylZtMax := t#0ms;
|
|
||||||
#O_ZylZtAv := t#0ms;
|
|
||||||
#ZylZtSum := t#0ms;
|
|
||||||
#O_Zyl := 0;
|
|
||||||
#i := 0;
|
|
||||||
#i_init := false;
|
|
||||||
RETURN;
|
|
||||||
|
|
||||||
ELSIF #zylZt <> t#0ms THEN
|
|
||||||
|
|
||||||
IF #tx < #O_ZylZtMin AND #tx > t#0ms THEN
|
|
||||||
|
|
||||||
#O_ZylZtMin := #tx;
|
|
||||||
|
|
||||||
ELSIF #tx > #O_ZylZtMax THEN
|
|
||||||
|
|
||||||
#O_ZylZtMax := #tx;
|
|
||||||
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
#O_ZylZt := #tx;
|
|
||||||
#tmpUdt.Zt := #tx;
|
|
||||||
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
IF #init THEN
|
|
||||||
|
|
||||||
#O_SysZt := #O_SysZt + #tx;
|
|
||||||
|
|
||||||
IF #O_SysZt >= t#1d THEN
|
|
||||||
|
|
||||||
#O_SysZt := #O_SysZt - t#1d;
|
|
||||||
#O_SysTg := #O_SysTg + 1;
|
|
||||||
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Zähler zum durchlaufen des Registers
|
|
||||||
IF #i >= DINT_TO_INT(#cyclNrs) - 1 THEN
|
|
||||||
#i := 0;
|
|
||||||
#i_init := true;
|
|
||||||
ELSE
|
|
||||||
#i := #i + 1;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Daten aus Array abholen für Zykluszeitberechnung
|
|
||||||
"UdtAryGet"(I_SrcAry := #I_ZylZtSreg,
|
|
||||||
I_SrcIndex := #i,
|
|
||||||
I_DesUdt := #oldVal,
|
|
||||||
O_Ret => #err);
|
|
||||||
|
|
||||||
// "alte" Zykluszeit subtrahieren
|
|
||||||
IF #i_init = true THEN
|
|
||||||
#ZylZtSum := #ZylZtSum - #oldVal.Zt;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Daten kopieren
|
|
||||||
"UdtArySet"(I_SrcUdt:=#tmpUdt,
|
|
||||||
I_DestIndex:= #i,
|
|
||||||
I_DestAry:=#I_ZylZtSreg,
|
|
||||||
O_Ret=>#err);
|
|
||||||
|
|
||||||
// Zykluszeiten addieren
|
|
||||||
#ZylZtSum := #ZylZtSum + #tmpUdt.Zt;
|
|
||||||
|
|
||||||
|
|
||||||
#init := TRUE;
|
|
||||||
#zylZt := #zylZt + #tx;
|
|
||||||
#O_Zyl := DINT_TO_DWORD(DWORD_TO_DINT(#O_Zyl) + 1);
|
|
||||||
|
|
||||||
// Durchschnitts-Zykluszeit berechnen
|
|
||||||
IF #i_init THEN
|
|
||||||
#O_ZylZtAv := #ZylZtSum / (#cyclNrs - 1);
|
|
||||||
ELSE
|
|
||||||
#O_ZylZtAv := #ZylZtSum / (#i);
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,124 +0,0 @@
|
|||||||
FUNCTION_BLOCK "STIME"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
AUTHOR : FSI
|
|
||||||
VERSION : 0.2
|
|
||||||
VAR_OUTPUT
|
|
||||||
tx : DWord;
|
|
||||||
at_tx { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} AT tx : Array[0..31] of Bool;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
last_time : DWord;
|
|
||||||
bit31 : Bool;
|
|
||||||
init : Bool := TRUE;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
TOP_SI : Struct
|
|
||||||
EV_CLASS : Byte;
|
|
||||||
EV_NUM : Byte;
|
|
||||||
PRIORITY : Byte;
|
|
||||||
NUM : Byte;
|
|
||||||
TYP2_3 : Byte;
|
|
||||||
TYP1 : Byte;
|
|
||||||
ZI1 : Word;
|
|
||||||
ZI2_3 : DWord;
|
|
||||||
END_STRUCT;
|
|
||||||
START_UP_SI : Struct
|
|
||||||
EV_CLASS : Byte;
|
|
||||||
EV_NUM : Byte;
|
|
||||||
PRIORITY : Byte;
|
|
||||||
NUM : Byte;
|
|
||||||
TYP2_3 : Byte;
|
|
||||||
TYP1 : Byte;
|
|
||||||
ZI1 : Word;
|
|
||||||
ZI2_3 : DWord;
|
|
||||||
END_STRUCT;
|
|
||||||
err : Int;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
23.09.2019 0.0 St. Maier Neuerstellung
|
|
||||||
10.10.2019 0.1 St. Maier IDB Generierung eingefügt
|
|
||||||
11.10.2019 0.2 St. Maier Überarbeitung Kopf damit TIA kompatibel
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################### Baustein Beschreibung #######################################
|
|
||||||
|
|
||||||
Abhängigkeiten (von anderen Fuktionen und Quellen):
|
|
||||||
-
|
|
||||||
|
|
||||||
Inputs:
|
|
||||||
-
|
|
||||||
Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
In-\Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Return-Value:
|
|
||||||
-
|
|
||||||
|
|
||||||
Funktionsbeschreibung:
|
|
||||||
|
|
||||||
Der Siemens Sps Timer zählt von 0 bis 2 ^ 31-1 und startet nach Überlauf bei 0.
|
|
||||||
Dies bedeutet, dass das Bit 31 (das höchste Bit) niemals verwendet wird und daher ein Problem
|
|
||||||
auftritt, wenn t2 - t1 geprüft wird.
|
|
||||||
|
|
||||||
t2 - t1 ist auch in einer Überlaufsituation immer gültig, in der die Zeit t1 sehr hoch und t2 sehr
|
|
||||||
niedrig ist. Das Ergebnis der Subtraktion t2 - t1 ist jedoch weiterhin gültig.
|
|
||||||
Diese Berechnung funktioniert bei Siemens nicht, da das höchste Bit nicht verwendet wird.
|
|
||||||
|
|
||||||
Dieses Modul speichert das höchste Bit, ändert das höchste Bit bei jedem Überlauf und gibt dieses aus.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(* aktuelle Startinformationen auslesen *)
|
|
||||||
(* OB1_SCAN_1 BYTE - B#16#01: Abschluss des Neustarts (Warmstarts)
|
|
||||||
- B#16#02: Abschluss des Wiederanlaufs
|
|
||||||
- B#16#03: Abschluss des freien Zyklus
|
|
||||||
- B#16#04: Abschluss des Kaltstarts
|
|
||||||
- B#16#05: Erster OB 1-Zyklus der neuen Master-CPU nach
|
|
||||||
Master-Reserve-Umschaltung und STOP des
|
|
||||||
bisherigen Masters *)
|
|
||||||
|
|
||||||
#err := RD_SINFO( TOP_SI => #TOP_SI // OUT: STRUCT
|
|
||||||
,START_UP_SI => #START_UP_SI // OUT: STRUCT
|
|
||||||
); // INT
|
|
||||||
|
|
||||||
// Zurücksetzen der letzten Zykluszeit bei System start
|
|
||||||
IF #TOP_SI.EV_NUM = 1 OR #TOP_SI.EV_NUM = 2 OR #TOP_SI.EV_NUM = 4 OR NOT #init THEN
|
|
||||||
#last_time := 0;
|
|
||||||
#bit31 := false;
|
|
||||||
#init := true;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Systemzeit auslesen
|
|
||||||
#tx := DINT_TO_DWORD(TIME_TO_DINT(TIME_TCK()));
|
|
||||||
|
|
||||||
// Auf Überlauf überprüfen
|
|
||||||
IF DWORD_TO_DINT(#tx) < DWORD_TO_DINT(#last_time) THEN
|
|
||||||
// Wenn Überlauf, dann den Wert des höchsten Bits ändern
|
|
||||||
#bit31 := NOT #bit31;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Höchste Bit in einen Time-Wert ädnern
|
|
||||||
#at_tx[7] := #bit31;
|
|
||||||
|
|
||||||
// Die letzte Systemzeit zum Überprüfen des nächsten Überlaufs merken
|
|
||||||
#last_time := #tx;
|
|
||||||
|
|
||||||
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
FUNCTION "BlockDbToAny" : Void
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_BlockDb : Block_DB; // Block Datenbaustein
|
|
||||||
I_DataType : Byte; // Code für den Datentyp (16#01=BOOL, 16#02=BYTE, 16#03=CHAR, 16#04=WORD, 16#05=INT, 16#06=DWORD, 16#07=DINT, 16#08=REAL, 16#09=DATE, 16#0A=TOD, 16#0B=TIME, 16#0C=S5TIME, 16#0E=DT, 16#13=STRING)
|
|
||||||
I_DataCount : Int; // Wiederholfaktor
|
|
||||||
I_Byte : Int; // Zeiger für Byteadresse
|
|
||||||
I_Bit : Int; // Zeiger für Bitadresse
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Any : Any; // Any Out
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
err : Int;
|
|
||||||
Temp_1 : Any;
|
|
||||||
pDataAny AT Temp_1 : "Any.T_AnyPoint";
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
16.03.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Funktion erstellt aus einem Block_DB einen Any
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#pDataAny.SyntaxId := 16#10;
|
|
||||||
#pDataAny.DataType := #I_DataType;
|
|
||||||
#pDataAny.DataCount := #I_DataCount;
|
|
||||||
#pDataAny.DB_Number := BLOCK_DB_TO_WORD(#I_BlockDb);
|
|
||||||
#pDataAny.BytePointer :=dw#16#84000000 OR SHL(IN := WORD_TO_DWORD(INT_TO_WORD(#I_Byte)), N := 3) OR WORD_TO_DWORD(INT_TO_WORD(#I_Bit));
|
|
||||||
|
|
||||||
#Temp_1 := #Temp_1;
|
|
||||||
|
|
||||||
#err := BLKMOV(SRCBLK := #Temp_1, DSTBLK => #O_Any);
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
FUNCTION "DbNoByName" : Int
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_Db : Any; // DB
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
buffer : Any; // DB address ANY pointer - used for accessing DB data
|
|
||||||
pBuffer AT buffer : Struct // Diassembled ANY pointer structure
|
|
||||||
S7Code : Byte; // Code for S7 (fixed at 16#10)
|
|
||||||
DataType : Byte; // Code for data type
|
|
||||||
Length : Int; // Repetition factor = Send/receive length
|
|
||||||
DBNumber : Int; // Data block Number
|
|
||||||
MemoryArea : Byte; // Specified memory area = 0x84 = data block
|
|
||||||
ByteAddressMSB : Byte; // Byte address most significant bits
|
|
||||||
ByteAddressLSB : Word; // Byte address least significant bits
|
|
||||||
END_STRUCT;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
03.12.2020 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#buffer := #I_Db;
|
|
||||||
|
|
||||||
#DbNoByName := #pBuffer.DBNumber;
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
FUNCTION "UdtAryGet" : Void
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_SrcAry : Any; // Quell Array
|
|
||||||
I_SrcIndex : Int; // Index der ausgelesen werden soll
|
|
||||||
I_DesUdt : Any; // Ziel UDT zur Bestimmg der Datenlänge etc
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Ret : Int;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
anySrc : Any;
|
|
||||||
p_anySrc AT anySrc : "Any.T_AnyPoint";
|
|
||||||
anyDest : Any;
|
|
||||||
p_anyDest AT anyDest : "Any.T_AnyPoint";
|
|
||||||
tmpPt : DWord;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
24.10.2019 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################### Baustein Beschreibung #######################################
|
|
||||||
|
|
||||||
Abhängigkeiten (von anderen Fuktionen und Quellen):
|
|
||||||
-
|
|
||||||
|
|
||||||
Inputs:
|
|
||||||
- I_SrcAry : Quell Array
|
|
||||||
- I_SrcIndex : Index der ausgelesen werden soll
|
|
||||||
- I_DesUdt : Ziel UDT zur Bestimmg der Datenlänge etc
|
|
||||||
|
|
||||||
Outputs:
|
|
||||||
- O_Ret
|
|
||||||
: Rückgabewert des Blockmoves
|
|
||||||
|
|
||||||
In-\Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Return-Value:
|
|
||||||
-
|
|
||||||
|
|
||||||
Funktionsbeschreibung:
|
|
||||||
Diese Funktion ließt Daten an einer Bestimmen Stelle aus einem Array aus.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#anySrc := #I_SrcAry;
|
|
||||||
#anyDest := #I_DesUdt;
|
|
||||||
|
|
||||||
#tmpPt := DINT_TO_DWORD(DWORD_TO_DINT(#p_anySrc.BytePointer AND DW#16#FFFFFF) + INT_TO_DINT(#p_anyDest.DataCount) * INT_TO_DINT(#I_SrcIndex) * 8);
|
|
||||||
#p_anySrc.BytePointer := (#p_anySrc.BytePointer AND DW#16#FF000000) OR #tmpPt;
|
|
||||||
|
|
||||||
#p_anySrc.DataCount := #p_anyDest.DataCount;
|
|
||||||
|
|
||||||
#O_Ret := BLKMOV(SRCBLK := #anySrc, DSTBLK => #anyDest); // SFC20
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
FUNCTION "UdtArySet" : Void
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_SrcUdt : Any; // Quel UDT zur Bestimmg der Datenlänge etc
|
|
||||||
I_DestIndex : Int; // Index, in den geschrieben werden soll
|
|
||||||
I_DestAry : Any; // Ziel Array
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Ret : Int;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
anySrc : Any;
|
|
||||||
p_anySrc AT anySrc : "Any.T_AnyPoint";
|
|
||||||
anyDest : Any;
|
|
||||||
p_anyDest AT anyDest : "Any.T_AnyPoint";
|
|
||||||
tmpPt : DWord;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
24.10.2019 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################### Baustein Beschreibung #######################################
|
|
||||||
|
|
||||||
Abhängigkeiten (von anderen Fuktionen und Quellen):
|
|
||||||
-
|
|
||||||
|
|
||||||
Inputs:
|
|
||||||
- I_SrcUdt : Quel UDT zur Bestimmg der Datenlänge etc
|
|
||||||
- I_DestIndex : Index, in den geschrieben werden soll
|
|
||||||
- I_DestAry : Ziel Array
|
|
||||||
|
|
||||||
Outputs:
|
|
||||||
- O_Ret
|
|
||||||
: Rückgabewert des Blockmoves
|
|
||||||
|
|
||||||
In-\Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Return-Value:
|
|
||||||
-
|
|
||||||
|
|
||||||
Funktionsbeschreibung:
|
|
||||||
Die Funktion schreibt Daten an eine bestimmte Stelle in einem Array.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#anySrc := #I_SrcUdt;
|
|
||||||
#anyDest := #I_DestAry;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#tmpPt := DINT_TO_DWORD(DWORD_TO_DINT(#p_anyDest.BytePointer AND DW#16#FFFFFF) + INT_TO_DINT(#p_anySrc.DataCount) * INT_TO_DINT(#I_DestIndex) * 8);
|
|
||||||
#p_anyDest.BytePointer := (#p_anyDest.BytePointer AND DW#16#FF000000) OR #tmpPt;
|
|
||||||
|
|
||||||
#p_anyDest.DataCount := #p_anySrc.DataCount;
|
|
||||||
|
|
||||||
#O_Ret := BLKMOV(SRCBLK := #anySrc, DSTBLK => #anyDest); // SFC20
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
FUNCTION "UdtInAnyKop" : Void
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_SrcUdtAry : Any;
|
|
||||||
I_DestUdtAry : Any;
|
|
||||||
I_DestIndex : Int;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Ret : Int;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
anySrc : Any;
|
|
||||||
p_anySrc AT anySrc : "Any.T_AnyPoint";
|
|
||||||
anyDest : Any;
|
|
||||||
p_anyDest AT anyDest : "Any.T_AnyPoint";
|
|
||||||
tmpPt : DWord;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
14.10.2019 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################### Baustein Beschreibung #######################################
|
|
||||||
|
|
||||||
Abhängigkeiten (von anderen Fuktionen und Quellen):
|
|
||||||
-
|
|
||||||
|
|
||||||
Inputs:
|
|
||||||
- I_SrcUdtAry
|
|
||||||
- I_SrcIndex
|
|
||||||
- I_DestUdtAry
|
|
||||||
- I_DestIndex
|
|
||||||
|
|
||||||
Outputs:
|
|
||||||
- O_Ret
|
|
||||||
: Rückgabewert des Blockmoves
|
|
||||||
|
|
||||||
In-\Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Return-Value:
|
|
||||||
-
|
|
||||||
|
|
||||||
Funktionsbeschreibung:
|
|
||||||
Kopiert UDT's aus Arrays, die Datenlänge des UDT wird automatisch ermittelt.
|
|
||||||
Anpassungen der Datenlänge nach Änderungen an den UDT's entfällt somit.
|
|
||||||
|
|
||||||
Achtung Array bzw. Speichergrenzen werden nicht überprüft.
|
|
||||||
Gegebenenfalls, Indexangaben vorher auf Korrektheit prüfen bzw. limittieren!
|
|
||||||
Bei inkorrekten Indexangaben geht CPU in STOP.
|
|
||||||
|
|
||||||
Verwendung: Verwaltung von Datensätzen wie Rezepturen, Betriebsdaten,
|
|
||||||
Positionsdaten usw. in der Steuerung.
|
|
||||||
|
|
||||||
Kopiert wird von/zu: DB, statischen Lokaldaten im Instanz-DB
|
|
||||||
(Multinnstanzfähig, ohne zus. Adresskorrektur, da Step7 bei Verwendung von
|
|
||||||
Instanzdaten bei UDT's automatisch als Quelle [#84] DB und Nr. mit korrekter
|
|
||||||
Adress angibt statt nur DI [#85])
|
|
||||||
|
|
||||||
Nicht kopiert wrid von/zu lokalen Daten (TEMP), da vor- vorherige Lokaldaten
|
|
||||||
benötigt werden (S7 aber nur vorherige Lokaldaten unterstützt)
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#anySrc := #I_SrcUdtAry;
|
|
||||||
#anyDest := #I_DestUdtAry;
|
|
||||||
|
|
||||||
#tmpPt := DINT_TO_DWORD(DWORD_TO_DINT(#p_anyDest.BytePointer AND DW#16#FFFFFF) + INT_TO_DINT(#p_anySrc.DataCount) * INT_TO_DINT(#I_DestIndex) * 8);
|
|
||||||
#p_anyDest.BytePointer := (#p_anyDest.BytePointer AND DW#16#FF000000) OR #tmpPt;
|
|
||||||
|
|
||||||
#p_anyDest.DataCount := #p_anySrc.DataCount;
|
|
||||||
|
|
||||||
#O_Ret := BLKMOV(SRCBLK := #anySrc, DSTBLK => #anyDest); // SFC20
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,101 +0,0 @@
|
|||||||
FUNCTION "UdtInAnyUmkop" : Void
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_SrcUdtAry : Any;
|
|
||||||
I_SrcIndex : Int;
|
|
||||||
I_DestUdtAry : Any;
|
|
||||||
I_DestIndex : Int;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Ret : Int;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
anySrc : Any;
|
|
||||||
p_anySrc AT anySrc : "Any.T_AnyPoint";
|
|
||||||
anyDest : Any;
|
|
||||||
p_anyDest AT anyDest : "Any.T_AnyPoint";
|
|
||||||
tmpPt : DWord;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
15.10.2019 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################### Baustein Beschreibung #######################################
|
|
||||||
|
|
||||||
Abhängigkeiten (von anderen Fuktionen und Quellen):
|
|
||||||
-
|
|
||||||
|
|
||||||
Inputs:
|
|
||||||
- I_SrcUdtAry
|
|
||||||
- I_SrcIndex
|
|
||||||
- I_DestUdtAry
|
|
||||||
- I_DestIndex
|
|
||||||
|
|
||||||
Outputs:
|
|
||||||
- O_Ret
|
|
||||||
: Rückgabewert des Blockmoves
|
|
||||||
|
|
||||||
In-\Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Return-Value:
|
|
||||||
-
|
|
||||||
|
|
||||||
Funktionsbeschreibung:
|
|
||||||
Kopiert UDT's aus Arrays, die Datenlänge des UDT wird automatisch ermittelt.
|
|
||||||
Anpassungen der Datenlänge nach Änderungen an den UDT's entfällt somit.
|
|
||||||
|
|
||||||
Achtung Array bzw. Speichergrenzen werden nicht überprüft.
|
|
||||||
Gegebenenfalls, Indexangaben vorher auf Korrektheit prüfen bzw. limittieren!
|
|
||||||
Bei inkorrekten Indexangaben geht CPU in STOP.
|
|
||||||
|
|
||||||
Verwendung: Verwaltung von Datensätzen wie Rezepturen, Betriebsdaten,
|
|
||||||
Positionsdaten usw. in der Steuerung.
|
|
||||||
|
|
||||||
Kopiert wird von/zu: DB, statischen Lokaldaten im Instanz-DB
|
|
||||||
(Multinnstanzfähig, ohne zus. Adresskorrektur, da Step7 bei Verwendung von
|
|
||||||
Instanzdaten bei UDT's automatisch als Quelle [#84] DB und Nr. mit korrekter
|
|
||||||
Adress angibt statt nur DI [#85])
|
|
||||||
|
|
||||||
Nicht kopiert wrid von/zu lokalen Daten (TEMP), da vor- vorherige Lokaldaten
|
|
||||||
benötigt werden (S7 aber nur vorherige Lokaldaten unterstützt)
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#anySrc := #I_SrcUdtAry;
|
|
||||||
#anyDest := #I_DestUdtAry;
|
|
||||||
|
|
||||||
#tmpPt := DINT_TO_DWORD(DWORD_TO_DINT(#p_anyDest.BytePointer AND DW#16#FFFFFF) + INT_TO_DINT(#p_anySrc.DataCount) * INT_TO_DINT(#I_SrcIndex) * 8);
|
|
||||||
#p_anySrc.BytePointer := (#p_anyDest.BytePointer AND DW#16#FF000000) OR #tmpPt;
|
|
||||||
#p_anySrc.DB_Number := #p_anyDest.DB_Number;
|
|
||||||
|
|
||||||
#tmpPt := DINT_TO_DWORD(DWORD_TO_DINT(#p_anyDest.BytePointer AND DW#16#FFFFFF) + INT_TO_DINT(#p_anySrc.DataCount) * INT_TO_DINT(#I_DestIndex) * 8);
|
|
||||||
#p_anyDest.BytePointer := (#p_anyDest.BytePointer AND DW#16#FF000000) OR #tmpPt;
|
|
||||||
|
|
||||||
#p_anyDest.DataCount := #p_anySrc.DataCount;
|
|
||||||
|
|
||||||
#O_Ret := BLKMOV(SRCBLK := #anySrc, DSTBLK => #anyDest); // SFC20
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
TYPE "START_UP_SI"
|
|
||||||
VERSION : 0.1
|
|
||||||
STRUCT
|
|
||||||
EV_CLASS : Byte;
|
|
||||||
EV_NUM : Byte;
|
|
||||||
PRIORITY : Byte;
|
|
||||||
NUM : Byte;
|
|
||||||
TYP2_3 : Byte;
|
|
||||||
TYP1 : Byte;
|
|
||||||
ZI1 : Word;
|
|
||||||
ZI2_3 : DWord;
|
|
||||||
END_STRUCT;
|
|
||||||
|
|
||||||
END_TYPE
|
|
||||||
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
TYPE "TOP_SI"
|
|
||||||
VERSION : 0.1
|
|
||||||
STRUCT
|
|
||||||
EV_CLASS : Byte;
|
|
||||||
EV_NUM : Byte;
|
|
||||||
PRIORITY : Byte;
|
|
||||||
NUM : Byte;
|
|
||||||
TYP2_3 : Byte;
|
|
||||||
TYP1 : Byte;
|
|
||||||
ZI1 : Word;
|
|
||||||
ZI2_3 : DWord;
|
|
||||||
END_STRUCT;
|
|
||||||
|
|
||||||
END_TYPE
|
|
||||||
|
|
||||||
@@ -1,112 +0,0 @@
|
|||||||
FUNCTION "CalcLegHolidays" : Void
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_Year : Int; // Jahr, für dass die Feiertage errechnet werden soll
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_LegHolidays : "Dat.T_LegHoliday"; // Feiertage
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
hvODay : Int; // Hilfsvariable zur Bestimmung des Ostersonntags
|
|
||||||
i : Int; // Schleifenzähler
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR CONSTANT
|
|
||||||
MAX_HOLIDAYS : Int := 12; // max. Anzahl von Feiertagen, die errechnet werden sollen
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
12.01.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
|
|
||||||
Beschreibung:
|
|
||||||
Der Baustein berechnet die gesetzlichen Feiertage von BW Stand 2021.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
|
|
||||||
FOR #i := 0 TO #MAX_HOLIDAYS - 1 DO
|
|
||||||
|
|
||||||
CASE #i OF
|
|
||||||
0: // Ostersonntag
|
|
||||||
#hvODay := (204 - 11 * (#I_Year MOD 19)) MOD 30;
|
|
||||||
|
|
||||||
IF #hvODay > 27 THEN
|
|
||||||
#hvODay := #hvODay - 1;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
#hvODay := 28 + #hvODay - ((#I_Year + WORD_TO_INT(SHR(IN := INT_TO_WORD(#I_Year), N := 2)) + #hvODay - 13) MOD 7);
|
|
||||||
|
|
||||||
IF #hvODay > 33 THEN
|
|
||||||
#O_LegHolidays.holidays[#i]."date" := "SetDate"(I_Year := #I_Year, I_Month := 4, I_Day := #hvODay - 31);
|
|
||||||
ELSE
|
|
||||||
#O_LegHolidays.holidays[#i]."date" := "SetDate"(I_Year := #I_Year, I_Month := 3, I_Day := #hvODay);
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
#O_LegHolidays.holidays[#i]."desc" := 'Ostersonntag';
|
|
||||||
|
|
||||||
1: // Neujahr
|
|
||||||
#O_LegHolidays.holidays[#i]."date" := "SetDate"(I_Year := #I_Year, I_Month := 1, I_Day := 1);
|
|
||||||
#O_LegHolidays.holidays[#i]."desc" := 'Neujahr';
|
|
||||||
|
|
||||||
2: // Heilige Drei Könige
|
|
||||||
#O_LegHolidays.holidays[#i]."date" := "SetDate"(I_Year := #I_Year, I_Month := 1, I_Day := 6);
|
|
||||||
#O_LegHolidays.holidays[#i]."desc" :='Heilige Drei Könige';
|
|
||||||
|
|
||||||
3: // Karfreitag
|
|
||||||
#O_LegHolidays.holidays[#i]."date" := DINT_TO_DATE(DATE_TO_DINT(#O_LegHolidays.holidays[0]."date") - 2);
|
|
||||||
#O_LegHolidays.holidays[#i]."desc" := 'Karfreitag';
|
|
||||||
|
|
||||||
4: // Ostermontag
|
|
||||||
#O_LegHolidays.holidays[#i]."date" := DINT_TO_DATE(DATE_TO_DINT(#O_LegHolidays.holidays[0]."date") + 1);
|
|
||||||
#O_LegHolidays.holidays[#i]."desc" := 'Ostermontag';
|
|
||||||
|
|
||||||
5: // Tag der Arbeit
|
|
||||||
#O_LegHolidays.holidays[#i]."date" := "SetDate"(I_Year := #I_Year, I_Month := 5, I_Day := 1);
|
|
||||||
#O_LegHolidays.holidays[#i]."desc" := 'Tag der Arbeit';
|
|
||||||
|
|
||||||
6: // Pfingstsonntag
|
|
||||||
#O_LegHolidays.holidays[#i]."date" := DINT_TO_DATE(DATE_TO_DINT(#O_LegHolidays.holidays[0]."date") + 49);
|
|
||||||
#O_LegHolidays.holidays[#i]."desc" := 'Pfingstsonntag';
|
|
||||||
|
|
||||||
7: // Pfingstmontag
|
|
||||||
#O_LegHolidays.holidays[#i]."date" := DINT_TO_DATE(DATE_TO_DINT(#O_LegHolidays.holidays[0]."date") + 50);
|
|
||||||
#O_LegHolidays.holidays[#i]."desc" := 'Pfingstmontag';
|
|
||||||
|
|
||||||
8: // Tag der Deutschen Einheit
|
|
||||||
#O_LegHolidays.holidays[#i]."date" := "SetDate"(I_Year := #I_Year, I_Month := 10, I_Day := 3);
|
|
||||||
#O_LegHolidays.holidays[#i]."desc" := 'Tag der Deutschen Einheit';
|
|
||||||
|
|
||||||
9: // Allerheiligen
|
|
||||||
#O_LegHolidays.holidays[#i]."date" := "SetDate"(I_Year := #I_Year, I_Month := 11, I_Day := 1);
|
|
||||||
#O_LegHolidays.holidays[#i]."desc" := 'Allerheiligen';
|
|
||||||
|
|
||||||
10: // 1. Weihnachtsfeiertag
|
|
||||||
#O_LegHolidays.holidays[#i]."date" := "SetDate"(I_Year := #I_Year, I_Month := 21, I_Day := 25);
|
|
||||||
#O_LegHolidays.holidays[#i]."desc" := '1. Weihnachtsfeiertag';
|
|
||||||
|
|
||||||
11: // 2. Weihnachtsfeiertag
|
|
||||||
#O_LegHolidays.holidays[#i]."date" := "SetDate"(I_Year := #I_Year, I_Month := 21, I_Day := 26);
|
|
||||||
#O_LegHolidays.holidays[#i]."desc" := '2. Weihnachtsfeiertag';
|
|
||||||
|
|
||||||
ELSE
|
|
||||||
;
|
|
||||||
|
|
||||||
END_CASE;
|
|
||||||
|
|
||||||
END_FOR;
|
|
||||||
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
TYPE "Dat.Shift"
|
|
||||||
VERSION : 0.1
|
|
||||||
STRUCT
|
|
||||||
"Dat.ShiftDtl" : Array[0..4] of "Dat.ShiftDtl"; // Schichtdaten
|
|
||||||
END_STRUCT;
|
|
||||||
|
|
||||||
END_TYPE
|
|
||||||
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
TYPE "Dat.ShiftDtl"
|
|
||||||
VERSION : 0.1
|
|
||||||
STRUCT
|
|
||||||
End : Date_And_Time; // Ende der Schicht
|
|
||||||
Strt : Date_And_Time; // Start der Schicht
|
|
||||||
Shift : Char; // Schicht
|
|
||||||
END_STRUCT;
|
|
||||||
|
|
||||||
END_TYPE
|
|
||||||
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
TYPE "Dat.T_LegHoliday"
|
|
||||||
VERSION : 0.1
|
|
||||||
STRUCT
|
|
||||||
holidays : Array[0..11] of Struct // feste Feiertage
|
|
||||||
"date" : Date; // Datum des Feiertags
|
|
||||||
desc : String[35]; // Bezeichnung des Feiertags
|
|
||||||
END_STRUCT;
|
|
||||||
END_STRUCT;
|
|
||||||
|
|
||||||
END_TYPE
|
|
||||||
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
FUNCTION "SetDate" : Date
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_Year : Int;
|
|
||||||
I_Month : Int;
|
|
||||||
I_Day : Int;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
cnt : DWord;
|
|
||||||
MTH_OFS : DInt;
|
|
||||||
leap_year : Bool;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
12.01.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(* calculate the amount of days to 31.12. the year before *)
|
|
||||||
#cnt := DINT_TO_DWORD(DWORD_TO_DINT(SHR(IN := DINT_TO_DWORD(INT_TO_DINT(#I_Year) * 1461 - 2878173), N := 2)) + INT_TO_DINT(#I_Day));
|
|
||||||
(* add the days for the month of the year *)
|
|
||||||
CASE LIMIT(MN := 1, IN := #I_Month, MX := 12) OF
|
|
||||||
1:
|
|
||||||
#MTH_OFS := 0;
|
|
||||||
2:
|
|
||||||
#MTH_OFS := 31;
|
|
||||||
3:
|
|
||||||
#MTH_OFS := 59;
|
|
||||||
4:
|
|
||||||
#MTH_OFS := 90;
|
|
||||||
5:
|
|
||||||
#MTH_OFS := 120;
|
|
||||||
6:
|
|
||||||
#MTH_OFS := 151;
|
|
||||||
7:
|
|
||||||
#MTH_OFS := 181;
|
|
||||||
8:
|
|
||||||
#MTH_OFS := 212;
|
|
||||||
9:
|
|
||||||
#MTH_OFS := 243;
|
|
||||||
10:
|
|
||||||
#MTH_OFS := 273;
|
|
||||||
11:
|
|
||||||
#MTH_OFS := 304;
|
|
||||||
12:
|
|
||||||
#MTH_OFS := 334;
|
|
||||||
ELSE:
|
|
||||||
#MTH_OFS := 0;
|
|
||||||
END_CASE;
|
|
||||||
|
|
||||||
#cnt := DINT_TO_DWORD(DWORD_TO_DINT(#cnt) + #MTH_OFS);
|
|
||||||
|
|
||||||
(* for leap years and month > february then add one more day *)
|
|
||||||
IF #I_Year MOD 400 = 0 THEN
|
|
||||||
#leap_year := TRUE;
|
|
||||||
ELSIF #I_Year MOD 100 = 0 THEN
|
|
||||||
#leap_year := FALSE;
|
|
||||||
ELSIF #I_Year MOD 4 = 0 THEN
|
|
||||||
#leap_year := TRUE;
|
|
||||||
ELSE
|
|
||||||
#leap_year := FALSE;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
IF #I_Month > 2 AND #leap_year THEN
|
|
||||||
#cnt := DINT_TO_DWORD(DWORD_TO_DINT(#cnt) + 1);
|
|
||||||
END_IF;
|
|
||||||
(* generate the date *)
|
|
||||||
#SetDate := DINT_TO_DATE(DWORD_TO_DINT(#cnt) - 7305);
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
TYPE "Dbg.E_Dbg"
|
|
||||||
VERSION : 0.1
|
|
||||||
STRUCT
|
|
||||||
Mod { S7_HMI_Visible := 'False'} : Struct // Modus
|
|
||||||
Strt { S7_HMI_Visible := 'False'} : Int := 1; // Start der Zeitmessung
|
|
||||||
ZwZt { S7_HMI_Visible := 'False'} : Int := 2; // Zwischenzeit erfassen
|
|
||||||
Stp { S7_HMI_Visible := 'False'} : Int := 3; // Stop der Zeitmessung
|
|
||||||
Rst { S7_HMI_Visible := 'False'} : Int := 4; // Messspeicher reseten/leeren
|
|
||||||
END_STRUCT;
|
|
||||||
St : Struct // Baustein Status
|
|
||||||
None : Word := 16#00; // kein Status
|
|
||||||
Strt : Word := 16#01; // gestartet und initialisiert
|
|
||||||
Stp : Word := 16#02; // gestoppt
|
|
||||||
END_STRUCT;
|
|
||||||
Err : Struct
|
|
||||||
NoErr : Word := 16#00; // kein Fehler
|
|
||||||
NoMessErr : Word := 16#01; // Anzahl der Messungen überschritten
|
|
||||||
FunktErr : Word := 16#FF; // Funktionsaufruf nicht vorhanden
|
|
||||||
END_STRUCT;
|
|
||||||
END_STRUCT;
|
|
||||||
|
|
||||||
END_TYPE
|
|
||||||
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
TYPE "Dbg.T_GenCpuLst"
|
|
||||||
VERSION : 0.1
|
|
||||||
STRUCT
|
|
||||||
min : Int; // min. Cpu-Last
|
|
||||||
max : Int; // max. Cpu-Last
|
|
||||||
END_STRUCT;
|
|
||||||
|
|
||||||
END_TYPE
|
|
||||||
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
TYPE "Dbg.T_Sreg"
|
|
||||||
VERSION : 0.1
|
|
||||||
STRUCT
|
|
||||||
Zt : Int; // gemessene Zeit [ms]
|
|
||||||
END_STRUCT;
|
|
||||||
|
|
||||||
END_TYPE
|
|
||||||
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
FUNCTION_BLOCK "DbgGenCpuLst"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_MinVal : Int; // min. Zykluszeit in ms
|
|
||||||
I_MaxVal : Int; // max. Zykluszeit in ms
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
init : Bool;
|
|
||||||
oldVal : "STIME"; // alter Zeitwert
|
|
||||||
newVal : "STIME"; // aktueller Zeitwert
|
|
||||||
rdm : Int; // Zufallszahl, die auf den alten Zeitwert addiert wird
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
24.10.2019 0.0 St. Maier Neuerstellung
|
|
||||||
03.02.2020 0.1 St. Maier Init-Funktion eingefügt um Fehler beim Neustart zu
|
|
||||||
vermeiden.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################### Baustein Beschreibung #######################################
|
|
||||||
|
|
||||||
Abhängigkeiten (von anderen Fuktionen und Quellen):
|
|
||||||
- IN: EingangswerZufallszahl zwischen LOW und HIGHt
|
|
||||||
|
|
||||||
|
|
||||||
Inputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
In-\Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Return-Value:
|
|
||||||
- Nachkommateil von x
|
|
||||||
|
|
||||||
Funktionsbeschreibung:
|
|
||||||
Dieser Baustein Simuliert eine CPU-Last bzw.verlängert die Zykluszeit über einen
|
|
||||||
Zufallsgenerator. Über die Eingangsvariablen I_Min und I_Max können die Grenzen der Zyklus-
|
|
||||||
zeit bestimmt werden.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
IF NOT #init THEN
|
|
||||||
#newVal();
|
|
||||||
#init := true;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
#oldVal();
|
|
||||||
|
|
||||||
#rdm := "Rdm2"(
|
|
||||||
I_OldVal := #rdm
|
|
||||||
, I_MinVal := #I_MinVal
|
|
||||||
, I_MaxVal := #I_MaxVal
|
|
||||||
, "I_STIME.tx" := #oldVal.tx
|
|
||||||
);
|
|
||||||
|
|
||||||
WHILE DWORD_TO_DINT(#newVal.tx) < DWORD_TO_DINT(#oldVal.tx) + #rdm DO
|
|
||||||
|
|
||||||
#newVal();
|
|
||||||
|
|
||||||
END_WHILE;
|
|
||||||
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
TYPE "DbgTmr.T_Zt"
|
|
||||||
VERSION : 0.1
|
|
||||||
STRUCT
|
|
||||||
Zt : Int; // letzt gemessene Zeit [ms]
|
|
||||||
Min : Int := 32767; // Min. Wert [ms]
|
|
||||||
Max : Int; // Max. Wert [ms]
|
|
||||||
Av : Int; // Durchschnittswert [ms]
|
|
||||||
Sreg : Array[0..50] of "Dbg.T_Sreg"; // Schieberegister
|
|
||||||
HvAv : Struct // Hilfsvariablen zur Durchschnittsberechnung
|
|
||||||
Sum : Int; // Summe
|
|
||||||
Cnt : Int; // Zähler
|
|
||||||
CntInit : Bool;
|
|
||||||
END_STRUCT;
|
|
||||||
END_STRUCT;
|
|
||||||
|
|
||||||
END_TYPE
|
|
||||||
|
|
||||||
@@ -1,275 +0,0 @@
|
|||||||
FUNCTION_BLOCK "DbgTmr"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_E_Mod : Int; // Funktion die aufgerufen werden soll
|
|
||||||
I_SvDbgData : Any; // Array in den die Datengespeichert werden sollen
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_St : Word; // Statusausgabe
|
|
||||||
O_Err : Word; // Fehlerausgabe
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
E_Dbg : "Dbg.E_Dbg"; // Enum
|
|
||||||
tmpT_Zt : "DbgTmr.T_Zt"; // temp. Struct
|
|
||||||
rstT_Zt : "DbgTmr.T_Zt"; // Zum reseten benötigt
|
|
||||||
tmpT_Sreg : "Dbg.T_Sreg"; // temp. Struct für Bestimmung Länge Schieberegister
|
|
||||||
tmpZt : DInt; // temp. Zeit
|
|
||||||
zwZtCnt : Int; // Zähler für Zwischenzeiten
|
|
||||||
zwZtLen : DInt; // Anzahl der Zwischenzeiten
|
|
||||||
avLen : DInt; // Länge desSchieberegisters für Durchschnittsberechnung
|
|
||||||
errCode : Word; // Error der aufgerufenen Funktion
|
|
||||||
retVal : Int; // Error der aufgerufenen Funktion
|
|
||||||
sTime : "STIME";
|
|
||||||
rstCnt : Int; // Zähler zum Reseten der Daten
|
|
||||||
flkStp : "Flnk"; // Flankenauswertung Stop-Status
|
|
||||||
hvStp : Bool; // HV Modus Stop
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR CONSTANT
|
|
||||||
MOD_STRT : Int := 1; // Modus Start
|
|
||||||
MOD_ZW_ZT : Int := 2; // Modus Zwischenzeit
|
|
||||||
MOD_STP : Int := 3; // Modus Stop
|
|
||||||
MOD_RST : Int := 4; // Modus Reset
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
23.10.2019 0.0 St. Maier Neuerstellung
|
|
||||||
14.11.2019 1.0 St. Maier Erweiterung um Min.-, Max.- und Durchschnittswert-
|
|
||||||
berechnung
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################### Baustein Beschreibung #######################################
|
|
||||||
|
|
||||||
Funktionsbeschreibung:
|
|
||||||
Die Funktion errechnet die Laufzeit zwischen mehreren Aufrufen der gleichen Instanz in einem
|
|
||||||
Zyklus. Diese Funktion kann zum Bestimmen der Bearbeitungszeit einer anderen Funktion verwendet
|
|
||||||
werden.
|
|
||||||
Über den Eingang I_SvDbgData wird definiert, in welchen Speicherbereich die Daten gespeichert
|
|
||||||
werden sollen. Zur Erstellung des Speicherbereichs wird aus dem Datentyp DbgTmr.T_Zt ein Array
|
|
||||||
gebildet; dabei gibt die Array-Länge die Anzahl der Zwischenwerte vor.
|
|
||||||
|
|
||||||
Betriebsarten über den Eingang I_E_Mod anwählbar:
|
|
||||||
Start: Erstaufruf der Instanz
|
|
||||||
Zwischenzeit: Errechnung Zwischenzeiten inkl. Min.-, Max.- und Durchschnittszeiten
|
|
||||||
Stop: Stop der Funktion und Fehler zurücksetzen
|
|
||||||
|
|
||||||
Fehler-Codes:
|
|
||||||
- 0x01: Anzahl der Zwischenzeiten überschritten
|
|
||||||
- 0xFF: Funktionsaufruf nicht vorhanden
|
|
||||||
|
|
||||||
Status-Codes:
|
|
||||||
- 0x00: kein Status
|
|
||||||
- 0x01: Funktion gestartet
|
|
||||||
- 0x02: Funktion gestoppt
|
|
||||||
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
// ##############################################################################################
|
|
||||||
// ########## allgemeiner Teil
|
|
||||||
// ##############################################################################################
|
|
||||||
|
|
||||||
// Systemzeit auslesen
|
|
||||||
#sTime();
|
|
||||||
|
|
||||||
// ##############################################################################################
|
|
||||||
// ########## Modus/Funktionsaufrufe
|
|
||||||
// ##############################################################################################
|
|
||||||
|
|
||||||
CASE #I_E_Mod OF
|
|
||||||
#MOD_STRT: // Start-Funktionsaufruf
|
|
||||||
IF WORD_TO_INT(#O_St) <> WORD_TO_INT(#E_Dbg.St.Stp) THEN
|
|
||||||
GOTO Func_Strt;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
RETURN;
|
|
||||||
|
|
||||||
#MOD_ZW_ZT: // Zwischenzeit-Funktionsaufruf
|
|
||||||
IF WORD_TO_INT(#O_St) = WORD_TO_INT(#E_Dbg.St.Strt) THEN
|
|
||||||
GOTO Func_ZwZt;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
RETURN;
|
|
||||||
#MOD_STP: // Stop-Funktionsaufruf
|
|
||||||
IF WORD_TO_INT(#O_St) = WORD_TO_INT(#E_Dbg.St.Strt) THEN
|
|
||||||
GOTO Func_Stp;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
RETURN;
|
|
||||||
#MOD_RST: // Reset-Funktionsaufruf
|
|
||||||
IF WORD_TO_INT(#O_St) = WORD_TO_INT(#E_Dbg.St.Stp) THEN
|
|
||||||
GOTO Func_Rst;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
RETURN;
|
|
||||||
ELSE // Statement section ELSE
|
|
||||||
GOTO Err_FF;
|
|
||||||
|
|
||||||
RETURN;
|
|
||||||
END_CASE;
|
|
||||||
|
|
||||||
// ##############################################################################################
|
|
||||||
// ########## public Funktionen
|
|
||||||
// ##############################################################################################
|
|
||||||
|
|
||||||
// ########## Funktion Start ##########
|
|
||||||
Func_Strt:
|
|
||||||
#zwZtCnt := 0;
|
|
||||||
#tmpZt := DWORD_TO_DINT(#sTime.tx);
|
|
||||||
#O_St := #E_Dbg.St.Strt;
|
|
||||||
|
|
||||||
GOTO Func_ZwZtBer;
|
|
||||||
|
|
||||||
RETURN;
|
|
||||||
|
|
||||||
// ########## Funktion Zwischenzeit ##########
|
|
||||||
Func_ZwZt:
|
|
||||||
GOTO Func_ZwZtBer;
|
|
||||||
RETURN;
|
|
||||||
|
|
||||||
// ########## Funktion Stop ##########
|
|
||||||
Func_Stp:
|
|
||||||
#O_Err := #E_Dbg.Err.NoErr; // Fehler zurücksetzen
|
|
||||||
#O_St := #E_Dbg.St.Stp; // Status Stop setzen
|
|
||||||
GOTO Func_ZwZtBer; // Zwischenzeitberechnen
|
|
||||||
RETURN;
|
|
||||||
|
|
||||||
// ########## Funktion Reset ##########
|
|
||||||
Func_Rst:
|
|
||||||
#zwZtCnt := 0; // Zwischenzeitzähler zurücksetzen
|
|
||||||
#tmpZt := 0; // Zwischenzeit zurücksetzen
|
|
||||||
#O_St := #E_Dbg.St.None; // Status None setzen
|
|
||||||
|
|
||||||
// Anzahl der Zwischenzeiten bestimmen
|
|
||||||
#errCode := "Any.Struct"(I_UDT := #tmpT_Zt
|
|
||||||
, I_StartBitAndRange := #I_SvDbgData
|
|
||||||
, O_DataCount => #zwZtLen
|
|
||||||
);
|
|
||||||
|
|
||||||
// Den Array mit den Zwischenzeiten druchlaufen und Start-Werte setzen
|
|
||||||
FOR #rstCnt := 0 TO DINT_TO_INT(#zwZtLen) - 1 DO
|
|
||||||
|
|
||||||
// aktuelles Array-Element auf Start-Werte setzen
|
|
||||||
"UdtArySet"(I_SrcUdt := #rstT_Zt,
|
|
||||||
I_DestIndex := #rstCnt,
|
|
||||||
I_DestAry := #I_SvDbgData,
|
|
||||||
O_Ret => #retVal);
|
|
||||||
|
|
||||||
END_FOR;
|
|
||||||
|
|
||||||
RETURN;
|
|
||||||
|
|
||||||
// ##############################################################################################
|
|
||||||
// ########## private Funktionen
|
|
||||||
// ##############################################################################################
|
|
||||||
|
|
||||||
// ########## Zeitberechnung ##########
|
|
||||||
Func_ZwZtBer:
|
|
||||||
|
|
||||||
// Anzahl der Zwischenzeiten bestimmen
|
|
||||||
#errCode := "Any.Struct"(I_UDT := #tmpT_Zt
|
|
||||||
, I_StartBitAndRange := #I_SvDbgData
|
|
||||||
, O_DataCount => #zwZtLen
|
|
||||||
);
|
|
||||||
|
|
||||||
// Daten Zwischenzeit aus Array abholen und temp. zwischenspeichern zur weiteren Verarbeitung
|
|
||||||
"UdtAryGet"(I_SrcAry := #I_SvDbgData,
|
|
||||||
I_SrcIndex := #zwZtCnt,
|
|
||||||
I_DesUdt := #tmpT_Zt,
|
|
||||||
O_Ret => #retVal
|
|
||||||
);
|
|
||||||
|
|
||||||
// Zeit speichern zwischen Start bzw. der letzten Zwischenzeit bestimmen
|
|
||||||
#tmpT_Zt.Zt := DINT_TO_INT(DWORD_TO_DINT(#sTime.tx) - #tmpZt);
|
|
||||||
|
|
||||||
// Min. Zeit bestimmen
|
|
||||||
IF #tmpT_Zt.Zt < #tmpT_Zt.Min THEN
|
|
||||||
#tmpT_Zt.Min := #tmpT_Zt.Zt;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Max. Zeit bestimmen
|
|
||||||
IF #tmpT_Zt.Zt > #tmpT_Zt.Max THEN
|
|
||||||
#tmpT_Zt.Max := #tmpT_Zt.Zt;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Avs.Zeit Berechnen #####
|
|
||||||
|
|
||||||
// Zähler zum Durchlaufen des Schieberegisters
|
|
||||||
IF #tmpT_Zt.HvAv.Cnt >= DINT_TO_INT(#avLen) - 1 THEN
|
|
||||||
#tmpT_Zt.HvAv.Cnt := 0;
|
|
||||||
#tmpT_Zt.HvAv.CntInit := true;
|
|
||||||
ELSE
|
|
||||||
#tmpT_Zt.HvAv.Cnt := #tmpT_Zt.HvAv.Cnt + 1;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Infos wie Array-Länge von Schieberegister bestimmen (Schieberegister für Durchschnittsberechnung)
|
|
||||||
#errCode := "Any.Struct"(I_UDT := #tmpT_Sreg
|
|
||||||
, I_StartBitAndRange := #tmpT_Zt.Sreg
|
|
||||||
, O_DataCount => #avLen
|
|
||||||
);
|
|
||||||
|
|
||||||
// alte Zeit von Summenzeit subtrahieren (alter Wert muss zuerst subtrahiert befor neu errechneter addiert werden kann)
|
|
||||||
#tmpT_Zt.HvAv.Sum := #tmpT_Zt.HvAv.Sum - #tmpT_Zt.Sreg[#tmpT_Zt.HvAv.Cnt].Zt;
|
|
||||||
|
|
||||||
// errechnete Zwischenzeit im Schieberegister speichern
|
|
||||||
#tmpT_Zt.Sreg[#tmpT_Zt.HvAv.Cnt].Zt := #tmpT_Zt.Zt;
|
|
||||||
|
|
||||||
// errechnete Zwischenzeit auf Summenzeit addieren
|
|
||||||
#tmpT_Zt.HvAv.Sum := #tmpT_Zt.HvAv.Sum + #tmpT_Zt.Zt;
|
|
||||||
|
|
||||||
// Durchschnitt berechnen
|
|
||||||
IF #tmpT_Zt.HvAv.CntInit THEN
|
|
||||||
#tmpT_Zt.Av := #tmpT_Zt.HvAv.Sum / (DINT_TO_INT(#avLen) - 1);
|
|
||||||
ELSE
|
|
||||||
#tmpT_Zt.Av := #tmpT_Zt.HvAv.Sum / #tmpT_Zt.HvAv.Cnt;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// temp. Daten der Zwischenzeit in Array kopieren
|
|
||||||
"UdtArySet"(I_SrcUdt := #tmpT_Zt,
|
|
||||||
I_DestIndex := #zwZtCnt,
|
|
||||||
I_DestAry := #I_SvDbgData,
|
|
||||||
O_Ret => #retVal);
|
|
||||||
|
|
||||||
GOTO Func_ZwZtCnt;
|
|
||||||
RETURN;
|
|
||||||
|
|
||||||
|
|
||||||
// ########## Funktion Zähler erhöhen und Grenzen überprüfen ##########
|
|
||||||
Func_ZwZtCnt:
|
|
||||||
|
|
||||||
// Zähler inkrementieren und Grenzenüberwachung
|
|
||||||
IF #zwZtCnt >= #zwZtLen THEN
|
|
||||||
GOTO ERR_01; // Fehlerausgabe wenn Anzahl Zwischenzeiten größer als Array
|
|
||||||
ELSE
|
|
||||||
#zwZtCnt := #zwZtCnt + 1; // Zähler inkrementieren
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Zeit auslesen
|
|
||||||
#tmpZt := DWORD_TO_DINT(#sTime.tx);
|
|
||||||
RETURN;
|
|
||||||
|
|
||||||
// ########## Fehlerausgabe ##########
|
|
||||||
|
|
||||||
ERR_01:
|
|
||||||
#O_Err := #E_Dbg.Err.NoMessErr; // Anzahl der Zwischenzeiten überschritten
|
|
||||||
RETURN;
|
|
||||||
|
|
||||||
Err_FF:
|
|
||||||
#O_Err := #E_Dbg.Err.FunktErr; // Funktionsaufruf nicht vorhanden
|
|
||||||
RETURN;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
FUNCTION_BLOCK "PlcSimCheck"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_OUTPUT
|
|
||||||
RUN_IN_PLCSIM : Bool;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
RDSYSST : Struct
|
|
||||||
RET_WERT : Int;
|
|
||||||
REQ : Bool;
|
|
||||||
BUSY : Bool;
|
|
||||||
SZL_HEADER : Struct
|
|
||||||
LENTHDR : Word;
|
|
||||||
N_DR : Word;
|
|
||||||
END_STRUCT;
|
|
||||||
SZL_11C_5 : Struct
|
|
||||||
index : Word;
|
|
||||||
serialn : Array[0..23] of Char;
|
|
||||||
res : Array[1..4] of Word;
|
|
||||||
END_STRUCT;
|
|
||||||
END_STRUCT;
|
|
||||||
CPU_DATA : Struct
|
|
||||||
Index : Word;
|
|
||||||
CPUIdent : Array[1..34] of Byte;
|
|
||||||
Reserved : Word;
|
|
||||||
MajorVersion : Word;
|
|
||||||
MinorVersion_1 : Byte;
|
|
||||||
MinorVersion_2 : Byte;
|
|
||||||
END_STRUCT;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
24.02.2020 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#RDSYSST.RET_WERT := RDSYSST( // SFC51 Module identification
|
|
||||||
REQ := true
|
|
||||||
, SZL_ID := W#16#11C // W#16#011C: a single identification data record
|
|
||||||
, INDEX := W#16#5 // W#16#0005: Serial number of the module
|
|
||||||
, BUSY => #RDSYSST.BUSY
|
|
||||||
, SZL_HEADER => #RDSYSST.SZL_HEADER
|
|
||||||
, DR => #CPU_DATA
|
|
||||||
);
|
|
||||||
|
|
||||||
#RUN_IN_PLCSIM:= #CPU_DATA.CPUIdent[1] = B#16#0;
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
FUNCTION "CpuZtUS" : DWord
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
AUTHOR : FSI
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
"I_STIME.tx" : DWord; // Zeit
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR CONSTANT
|
|
||||||
debug : Bool;
|
|
||||||
N : Int;
|
|
||||||
offset : Int;
|
|
||||||
offset_1 : DWord := 0;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
23.09.2018 0.0 St. Maier Neuerstellung
|
|
||||||
11.10.2019 0.1 St. Maier Überarbeitung Kopf damit TIA kompatibel
|
|
||||||
17.10.2019 0.2 St. Maier I_STIME Eingefügt, damit keine Abhängigkeit zu einem
|
|
||||||
IDB besteht
|
|
||||||
18.10.2019 0.3 St. Maier Variablen Kommentare eingefügt - wurden bei der
|
|
||||||
Portierung nach TIA nicht übernommen
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################### Baustein Beschreibung #######################################
|
|
||||||
|
|
||||||
Abhängigkeiten (von anderen Fuktionen und Quellen):
|
|
||||||
- STIME, IDB_STIME
|
|
||||||
|
|
||||||
Inputs:
|
|
||||||
- I_STIME.tx
|
|
||||||
|
|
||||||
Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
In-\Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Return-Value:
|
|
||||||
-
|
|
||||||
|
|
||||||
Funktionsbeschreibung:
|
|
||||||
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#CpuZtUS := DINT_TO_DWORD(DWORD_TO_DINT(#"I_STIME.tx") * 1000);
|
|
||||||
|
|
||||||
IF #debug THEN
|
|
||||||
#CpuZtUS := DINT_TO_DWORD((DWORD_TO_DINT(SHL(IN:=#CpuZtUS,N:=#N) OR SHL(IN:=DWORD#1,N:=#N))-1) + DWORD_TO_DINT(#offset_1));
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
FUNCTION_BLOCK "FltMav"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_X : DInt; // Eingangswert
|
|
||||||
I_N : Int; // Anzahl der Mittelwerte
|
|
||||||
I_Rst : Bool; // asynchraner Reset Eingang
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Y : DInt; // gefilterter Wert
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
init : Bool;
|
|
||||||
buffer : Array[0..31] of DInt;
|
|
||||||
i : Int;
|
|
||||||
sum : DInt;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
tmp : Int;
|
|
||||||
tN : Int;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
11.02.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Funktion ist ein Filter mit gleitendem Mittelwert. Beim Filter mit
|
|
||||||
gleitendem Mittelwert (auch Moving Average Filter genannt) wird der Mit-
|
|
||||||
telwert von N aufeinander folgenden Messwerten als Mittelwert ausgege-
|
|
||||||
ben.
|
|
||||||
Y:= (X0 + X1 + … + Xn-1) / N
|
|
||||||
X0 ist der Wert X im momentanen Zyklus, X1 ist der Wert im Zyklus davor
|
|
||||||
usw. Die Anzahl der Werte über die der Mittelwert gebildet werden soll
|
|
||||||
wird am Eingang I_N spezifziert, der Wertebereich von I_N liegt zwischen 1
|
|
||||||
und 32.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
|
|
||||||
(* limit N to size of buffer *)
|
|
||||||
#tN := MIN(IN1 := #I_N, IN2 := 32);
|
|
||||||
|
|
||||||
(* startup initialisation *)
|
|
||||||
IF NOT #init OR #I_Rst OR #tN = 0 THEN
|
|
||||||
#init := TRUE;
|
|
||||||
#tmp := #tN - 1;
|
|
||||||
FOR #i := 0 TO #tmp DO
|
|
||||||
#buffer[#i] := #I_X;
|
|
||||||
END_FOR;
|
|
||||||
#sum := #O_Y * #tN;
|
|
||||||
#O_Y := #I_X;
|
|
||||||
ELSE
|
|
||||||
#tmp := #tN;
|
|
||||||
#i := "Inc1"(I_X := #i,
|
|
||||||
I_N := #tmp);
|
|
||||||
#sum := #sum + #I_X - #buffer[#i];
|
|
||||||
#O_Y := #sum / #tN;
|
|
||||||
#buffer[#i] := #I_X;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
FUNCTION_BLOCK "FltMav_Real"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_X : Real; // Eingangswert
|
|
||||||
I_N : Int; // Anzahl der Mittelwerte
|
|
||||||
I_Rst : Bool; // asynchraner Reset Eingang
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Y : Real; // gefilterter Wert
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
init : Bool;
|
|
||||||
buffer : Array[0..31] of Real;
|
|
||||||
i : Int;
|
|
||||||
sum : Real;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
tmp : Int;
|
|
||||||
tN : Int;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
11.02.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Funktion ist ein Filter mit gleitendem Mittelwert. Beim Filter mit
|
|
||||||
gleitendem Mittelwert (auch Moving Average Filter genannt) wird der Mit-
|
|
||||||
telwert von N aufeinander folgenden Messwerten als Mittelwert ausgege-
|
|
||||||
ben.
|
|
||||||
Y:= (X0 + X1 + … + Xn-1) / N
|
|
||||||
X0 ist der Wert X im momentanen Zyklus, X1 ist der Wert im Zyklus davor
|
|
||||||
usw. Die Anzahl der Werte über die der Mittelwert gebildet werden soll
|
|
||||||
wird am Eingang I_N spezifziert, der Wertebereich von I_N liegt zwischen 1
|
|
||||||
und 32.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(* limit N to size of buffer *)
|
|
||||||
#tN := MIN(IN1 := #I_N, IN2 := 32);
|
|
||||||
|
|
||||||
(* startup initialisation *)
|
|
||||||
IF NOT #init OR #I_Rst OR #tN = 0 THEN
|
|
||||||
#init := TRUE;
|
|
||||||
#tmp := #tN - 1;
|
|
||||||
FOR #i := 0 TO #tmp DO
|
|
||||||
#buffer[#i] := #I_X;
|
|
||||||
END_FOR;
|
|
||||||
#sum := #O_Y * #tN;
|
|
||||||
#O_Y := #I_X;
|
|
||||||
ELSE
|
|
||||||
#tmp := #tN;
|
|
||||||
#i := "Inc1"(I_X := #i,
|
|
||||||
I_N := #tmp);
|
|
||||||
#sum := #sum + #I_X - #buffer[#i];
|
|
||||||
#O_Y := #sum / #tN;
|
|
||||||
#buffer[#i] := #I_X;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,98 +0,0 @@
|
|||||||
FUNCTION_BLOCK "FltMedian"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_X : Int;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Y : Int;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
val : Array[0..10] of Int;
|
|
||||||
age : Array[0..10] of Int;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
bfrVal : Array[0..10] of Int;
|
|
||||||
bfrAge : Array[0..10] of Int;
|
|
||||||
bfrIdx : Int;
|
|
||||||
valIdx : Int;
|
|
||||||
tmpIdx : Int;
|
|
||||||
oldestDel : Bool;
|
|
||||||
oldestAge : Int;
|
|
||||||
oldestIdx : Int;
|
|
||||||
incomingValue : Bool;
|
|
||||||
medianIdx : Int;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR CONSTANT
|
|
||||||
FILTER_ELEMENTS : Int := 11;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
11.02.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#bfrIdx := 0; // Initialize Index
|
|
||||||
#valIdx := 0; // Initialize Index
|
|
||||||
#oldestDel := FALSE;
|
|
||||||
#oldestAge := -1;
|
|
||||||
#incomingValue := FALSE;
|
|
||||||
#medianIdx := (#FILTER_ELEMENTS / 2);
|
|
||||||
|
|
||||||
// Find oldest element (this will be removed from updated list)
|
|
||||||
FOR #tmpIdx := 0 TO #FILTER_ELEMENTS - 1 DO
|
|
||||||
IF #age[#tmpIdx] > #oldestAge THEN
|
|
||||||
#oldestAge := #age[#tmpIdx];
|
|
||||||
#oldestIdx := #tmpIdx;
|
|
||||||
END_IF;
|
|
||||||
END_FOR;
|
|
||||||
|
|
||||||
|
|
||||||
WHILE #bfrIdx < #FILTER_ELEMENTS DO
|
|
||||||
// If this is oldest element, then just skip over it so that it falls out of list.
|
|
||||||
IF #valIdx = #oldestIdx THEN
|
|
||||||
#valIdx := #valIdx + 1;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// If new value is smaller than current index value, then write incoming value to buffer
|
|
||||||
IF #incomingValue = FALSE AND #I_X <= #val[#valIdx] OR #valIdx > (#FILTER_ELEMENTS - 1) THEN
|
|
||||||
// Write incoming value and age to buffer
|
|
||||||
#bfrVal[#bfrIdx] := #I_X;
|
|
||||||
#bfrAge[#bfrIdx] := 0;
|
|
||||||
#bfrIdx := #bfrIdx + 1;
|
|
||||||
#incomingValue := TRUE;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Write current value and incremented age to buffer
|
|
||||||
IF #bfrIdx < #FILTER_ELEMENTS THEN
|
|
||||||
#bfrVal[#bfrIdx] := #val[#valIdx];
|
|
||||||
#bfrAge[#bfrIdx] := #age[#valIdx] + 1;
|
|
||||||
#bfrIdx := #bfrIdx + 1;
|
|
||||||
#valIdx := #valIdx + 1;
|
|
||||||
END_IF;
|
|
||||||
END_WHILE;
|
|
||||||
|
|
||||||
|
|
||||||
// Write buffer to values/ages
|
|
||||||
FOR #tmpIdx := 0 TO (#FILTER_ELEMENTS - 1) DO
|
|
||||||
#val[#tmpIdx] := #bfrVal[#tmpIdx];
|
|
||||||
#age[#tmpIdx] := #bfrAge[#tmpIdx];
|
|
||||||
END_FOR;
|
|
||||||
|
|
||||||
// You've been waiting for it! Here it is...
|
|
||||||
// Return median of dataset (middle element)
|
|
||||||
#O_Y := #val[#medianIdx];
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,98 +0,0 @@
|
|||||||
FUNCTION_BLOCK "FltMedian_Real"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_X : Real;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Y : Real;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
val : Array[0..10] of Real;
|
|
||||||
age : Array[0..10] of Int;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
bfrVal : Array[0..10] of Real;
|
|
||||||
bfrAge : Array[0..10] of Int;
|
|
||||||
bfrIdx : Int;
|
|
||||||
valIdx : Int;
|
|
||||||
tmpIdx : Int;
|
|
||||||
oldestDel : Bool;
|
|
||||||
oldestAge : Int;
|
|
||||||
oldestIdx : Int;
|
|
||||||
incomingValue : Bool;
|
|
||||||
medianIdx : Int;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR CONSTANT
|
|
||||||
FILTER_ELEMENTS : Int := 11;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
19.02.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#bfrIdx := 0; // Initialize Index
|
|
||||||
#valIdx := 0; // Initialize Index
|
|
||||||
#oldestDel := FALSE;
|
|
||||||
#oldestAge := -1;
|
|
||||||
#incomingValue := FALSE;
|
|
||||||
#medianIdx := (#FILTER_ELEMENTS / 2);
|
|
||||||
|
|
||||||
// Find oldest element (this will be removed from updated list)
|
|
||||||
FOR #tmpIdx := 0 TO #FILTER_ELEMENTS - 1 DO
|
|
||||||
IF #age[#tmpIdx] > #oldestAge THEN
|
|
||||||
#oldestAge := #age[#tmpIdx];
|
|
||||||
#oldestIdx := #tmpIdx;
|
|
||||||
END_IF;
|
|
||||||
END_FOR;
|
|
||||||
|
|
||||||
|
|
||||||
WHILE #bfrIdx < #FILTER_ELEMENTS DO
|
|
||||||
// If this is oldest element, then just skip over it so that it falls out of list.
|
|
||||||
IF #valIdx = #oldestIdx THEN
|
|
||||||
#valIdx := #valIdx + 1;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// If new value is smaller than current index value, then write incoming value to buffer
|
|
||||||
IF #incomingValue = FALSE AND #I_X <= #val[#valIdx] OR #valIdx > (#FILTER_ELEMENTS - 1) THEN
|
|
||||||
// Write incoming value and age to buffer
|
|
||||||
#bfrVal[#bfrIdx] := #I_X;
|
|
||||||
#bfrAge[#bfrIdx] := 0;
|
|
||||||
#bfrIdx := #bfrIdx + 1;
|
|
||||||
#incomingValue := TRUE;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Write current value and incremented age to buffer
|
|
||||||
IF #bfrIdx < #FILTER_ELEMENTS THEN
|
|
||||||
#bfrVal[#bfrIdx] := #val[#valIdx];
|
|
||||||
#bfrAge[#bfrIdx] := #age[#valIdx] + 1;
|
|
||||||
#bfrIdx := #bfrIdx + 1;
|
|
||||||
#valIdx := #valIdx + 1;
|
|
||||||
END_IF;
|
|
||||||
END_WHILE;
|
|
||||||
|
|
||||||
|
|
||||||
// Write buffer to values/ages
|
|
||||||
FOR #tmpIdx := 0 TO (#FILTER_ELEMENTS - 1) DO
|
|
||||||
#val[#tmpIdx] := #bfrVal[#tmpIdx];
|
|
||||||
#age[#tmpIdx] := #bfrAge[#tmpIdx];
|
|
||||||
END_FOR;
|
|
||||||
|
|
||||||
// You've been waiting for it! Here it is...
|
|
||||||
// Return median of dataset (middle element)
|
|
||||||
#O_Y := #val[#medianIdx];
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
FUNCTION_BLOCK "FltPt1"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_Val : Real; // Eingangssignal
|
|
||||||
I_T : Time; // Zeitkonstante
|
|
||||||
I_K : Real := 1.0; // Multiplikator
|
|
||||||
"I_STIME.tx" : DWord; // Zeit
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Val : Real; // Aussgangssignal
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
last : DWord;
|
|
||||||
tx : DWord;
|
|
||||||
init : Bool;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
03.02.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Funktion ist ein LZI-Übertragungsglied mit einem proportionalen
|
|
||||||
Übertragungsverhalten 1. Ordnung, auch als Tiefpass Filter 1. Ordnung
|
|
||||||
bezeichnet. Der Multiplikator I_K legt den Verstärkungsfaktor (Multiplikator)
|
|
||||||
fest und I_T die Zeitkonstante.
|
|
||||||
Eine Änderung am Eingang wird am Ausgang gedämpft sichtbar. Das
|
|
||||||
Ausgangssignal steigt innerhalb von I_T auf 63% des Eingangswerts und
|
|
||||||
nach 3 * I_T auf 95% des Eingangswerts an. Somit ist nach einer
|
|
||||||
sprunghaften Änderung des Eingangssignals von 0 auf 10 der Ausgang
|
|
||||||
zum Zeitpunkt der Eingangsänderung 0, steigt nach 1 * I_T auf 6,3 an und
|
|
||||||
erreicht nach 3 * I_T 9,5 und nähert sich dann asymptotisch dem Wert 10
|
|
||||||
an. Beim ersten Aufruf wird der Ausgang O_VAL mit dem Eingangswert I_Val
|
|
||||||
initialisiert um ein defniertes Anlauf Verhalten zu gewährleisten. Falls der
|
|
||||||
Eingang I_T gleich T#0s ist entspricht der Ausgang O_VAL = I_K * I_Val.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#tx := "CpuZtUS"(#"I_STIME.tx");
|
|
||||||
|
|
||||||
IF NOT #init OR #I_T = t#0s THEN
|
|
||||||
#init := TRUE;
|
|
||||||
#O_Val := #I_K * #I_Val;
|
|
||||||
ELSE
|
|
||||||
#O_Val := #O_Val + (#I_Val * #I_K - #O_Val) * DINT_TO_REAL(DWORD_TO_DINT(#tx) - DWORD_TO_DINT(#last)) / DINT_TO_REAL(TIME_TO_DINT(#I_T)) * 1.0E-3;
|
|
||||||
IF ABS(#O_Val) < 1.0E-20 THEN
|
|
||||||
#O_Val := 0.0;
|
|
||||||
END_IF;
|
|
||||||
END_IF;
|
|
||||||
#last := #tx;
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
FUNCTION_BLOCK "FltPt2"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_Val : Real; // Eingangssignal
|
|
||||||
I_T : Time; // Zeitkonstante
|
|
||||||
I_D : Real; // Dämpfung
|
|
||||||
I_K : Real := 1.0; // Multiplikator
|
|
||||||
"I_STIME.tx" : DWord := 16#0; // Zeit
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Val : Real; // Ausgangssignal
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
init : Bool;
|
|
||||||
int1 : "Integrate";
|
|
||||||
int2 : "Integrate";
|
|
||||||
tn : Real;
|
|
||||||
I1 : Real;
|
|
||||||
I2 : Real;
|
|
||||||
tn2 : Real;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
04.02.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Funktion ist ein LZI-Übertragungsglied mit einem proportionalen Übertra-
|
|
||||||
gungsverhalten 2. Ordnung, auch als Tiefpass Filter 2. Ordnung bekannt.
|
|
||||||
Der Multiplikator I_K legt den Verstärkungsfaktor (Multiplikator) fest, I_T und
|
|
||||||
I_D die Zeitkonstante und die Dämpfung. Falls der Eingang I_T gleich T#0s ist
|
|
||||||
entspricht der Ausgang O_Vak = I_K * I_Val.
|
|
||||||
Die entsprechende Funktionalbeziehung in Zeitbereich ist folgende Dife-
|
|
||||||
renzialgleichung gegeben:
|
|
||||||
T² * OUT''(T) + 2 * D* T * OUT'(T) + OUT(T) = K * in(T).
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
// startup initialisation
|
|
||||||
IF NOT #init OR #I_T = T#0s THEN
|
|
||||||
#init := TRUE;
|
|
||||||
#O_Val := #I_K * #I_Val;
|
|
||||||
#I2 := #O_Val;
|
|
||||||
ELSE
|
|
||||||
#tn := DINT_TO_REAL(TIME_TO_DINT(#I_T)) * 1.0E-3;
|
|
||||||
#tn2 := #tn * #tn;
|
|
||||||
|
|
||||||
#int1(I_X := #I_Val * #I_K / #tn2 - #I1 * 0.5 * #I_D / #tn - #I2 / #tn2,
|
|
||||||
"I_STIME.tx":= #"I_STIME.tx",
|
|
||||||
O_Y => #I1
|
|
||||||
);
|
|
||||||
|
|
||||||
#int2(I_X := #I1,
|
|
||||||
"I_STIME.tx":= #"I_STIME.tx",
|
|
||||||
O_Y => #I2
|
|
||||||
);
|
|
||||||
|
|
||||||
#O_Val := #I2;
|
|
||||||
END_IF;
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
FUNCTION_BLOCK "LowPassFilter"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_Val : Real; // ungefilterte Eingangswert
|
|
||||||
I_Tau : Real; // Zeitinterval (in Sekunden) für Filterzyklus
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Val : Real; // gefilteter Ausgabewert nach Tiefpass
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
lastFltVal : Real; // letztes Filtervalue
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
expRate : Real; // entspricht exp(-0.1 / I_Tau)
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
03.02.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#expRate := EXP(-0.1 / #I_Tau);
|
|
||||||
#O_Val := #lastFltVal * #expRate + (#I_Val * (1 - #expRate)); // neuen Ausgangwert berechnen
|
|
||||||
#lastFltVal := #O_Val; // Ausgangwert für nächsten Zyklus speichern
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
FUNCTION "Pt1" : Void
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_C : Real; // Tiefpasskonstante, z.B.: 0.01 = 99.8% Endwert nach ca. 1000 Zyklen. Max. 1.0
|
|
||||||
I_Val : Real; // ungefilterte Eingangswert
|
|
||||||
I_En : Bool; // Filterfunktion aktivieren
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Val : Real; // gefilteter Ausgabewert nach Tiefpass
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
"const" : Real; // auf 1.0 begrenzte Konstante
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
02.02.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#const := #I_C;
|
|
||||||
|
|
||||||
// Max. Wert Konstante = 1.0
|
|
||||||
IF #I_C > real#1.0 THEN
|
|
||||||
#const := real#1.0;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
IF #I_En THEN // Filter eingeschalten
|
|
||||||
#O_Val := ((#I_Val - #O_Val) * #const) + #O_Val;
|
|
||||||
ELSE // Filter ausgeschalten
|
|
||||||
#O_Val := #I_Val;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
FUNCTION_BLOCK "Flnk.NrVal"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
AUTHOR : FSI
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_Val : DInt;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Flnk : Bool;
|
|
||||||
O_FlnkPos : Bool;
|
|
||||||
O_FlnkNeg : Bool;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
flk : "Flnk";
|
|
||||||
flkPos : "Flnk";
|
|
||||||
flkNeg : "Flnk";
|
|
||||||
altVal : DInt;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
10.10.2019 0.0 St. Maier Neuerstellung
|
|
||||||
11.10.2019 0.1 St. Maier Überarbeitung Kopf damit TIA kompatibel
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################### Baustein Beschreibung #######################################
|
|
||||||
|
|
||||||
Abhängigkeiten (von anderen Fuktionen und Quellen):
|
|
||||||
- keine
|
|
||||||
|
|
||||||
Inputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
In-\Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Return-Value:
|
|
||||||
-
|
|
||||||
|
|
||||||
Funktionsbeschreibung:
|
|
||||||
|
|
||||||
Flankenauswertung eines numerischen Signals.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
// positive Werteänderung
|
|
||||||
#flkPos(I_Val := #I_Val > #altVal // IN: BOOL
|
|
||||||
);
|
|
||||||
|
|
||||||
// negative Werteänderung
|
|
||||||
#flkNeg(I_Val := #I_Val < #altVal// IN: BOOL
|
|
||||||
);
|
|
||||||
|
|
||||||
// Ausgabe
|
|
||||||
#O_Flnk := #flkPos.O_FlnkPos OR #flkNeg.O_FlnkPos; // Impuls bei positiver und negativer Werteänderung
|
|
||||||
#O_FlnkPos := #flkPos.O_FlnkPos; // Impuls bei positiver Werteänderung
|
|
||||||
#O_FlnkNeg := #flkNeg.O_FlnkPos; // Impuls bei negativer Werteänderung
|
|
||||||
|
|
||||||
#altVal := #I_Val;
|
|
||||||
|
|
||||||
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
FUNCTION_BLOCK "Flnk"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
AUTHOR : FSI
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_Val : Bool;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_FlnkPos : Bool;
|
|
||||||
O_FlnkNeg : Bool;
|
|
||||||
O_FlnkPosNeg : Bool;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
hvPos : Bool;
|
|
||||||
hvNeg : Bool;
|
|
||||||
hvPosNeg : Bool;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
10.10.2019 0.0 St. Maier Neuerstellung
|
|
||||||
11.10.2019 0.1 St. Maier Überarbeitung Kopf damit TIA kompatibel
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################### Baustein Beschreibung #######################################
|
|
||||||
|
|
||||||
Abhängigkeiten (von anderen Fuktionen und Quellen):
|
|
||||||
- keine
|
|
||||||
|
|
||||||
Inputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
In-\Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Return-Value:
|
|
||||||
-
|
|
||||||
|
|
||||||
Funktionsbeschreibung:
|
|
||||||
|
|
||||||
Flankenauswertung eines binären Signals. Es werden positive, negative und positive und negative
|
|
||||||
Flanke des Eingangssignals ausgewertet.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
// Impuls bei Flanke 0->1
|
|
||||||
#O_FlnkPos := #I_Val AND NOT #hvPos;
|
|
||||||
#hvPos := #I_Val;
|
|
||||||
|
|
||||||
// Impuls bei Flanke 1->0
|
|
||||||
#O_FlnkNeg := NOT #I_Val AND #hvNeg;
|
|
||||||
#hvNeg := #I_Val;
|
|
||||||
|
|
||||||
// Impuls bei Flanke 0->1 & 1->0
|
|
||||||
#O_FlnkPosNeg := (#I_Val AND NOT #hvPosNeg) OR (NOT #I_Val AND #hvPosNeg);
|
|
||||||
#hvPosNeg := #I_Val;
|
|
||||||
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
TYPE "IbaSimDatFrmWrkSt.T_Cmd"
|
|
||||||
VERSION : 0.1
|
|
||||||
STRUCT
|
|
||||||
Frg : Bool; // Freigabe an PC zum Senden/Empfangen
|
|
||||||
PcSnd : Bool; // PC verbunden
|
|
||||||
NewDat : Bool; // neue Daten vorhanden
|
|
||||||
END_STRUCT;
|
|
||||||
|
|
||||||
END_TYPE
|
|
||||||
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
TYPE "IbaSimDatFrmWrkSt.T_Data"
|
|
||||||
VERSION : 0.1
|
|
||||||
STRUCT
|
|
||||||
Cmd : "IbaSimDatFrmWrkSt.T_Cmd"; // Befehle
|
|
||||||
Data : Array[0..254] of Byte; // Daten
|
|
||||||
END_STRUCT;
|
|
||||||
|
|
||||||
END_TYPE
|
|
||||||
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
FUNCTION_BLOCK "IbaSimDatFrmWrkSt"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_Data : Any; // Eingangsdaten
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_IN_OUT
|
|
||||||
IO_Cmd : "IbaSimDatFrmWrkSt.T_Cmd"; // Triggersignal
|
|
||||||
IO_Data { S7_HMI_Visible := 'False'} : Any; // Datenausgabe
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
adr : Int; // Adresszähler
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
pTmpData : Any; // Pointer Tmp-Daten
|
|
||||||
pTmpDataAny AT pTmpData : "Any.T_AnyPoint"; // Pointer Tmp-Daten Detail
|
|
||||||
noElements : Int; // Anzahl der Elemente
|
|
||||||
flt : Int; // Fehler von Blkmov
|
|
||||||
adrOffSet : Int; // Adress-Offset
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
10.03.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
IF NOT #IO_Cmd.Frg OR NOT #IO_Cmd.PcSnd THEN
|
|
||||||
RETURN;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Pointer initizialisieren
|
|
||||||
#pTmpData := #I_Data;
|
|
||||||
|
|
||||||
// Anzahl der Einzelelemente/Typen bestimmen
|
|
||||||
#noElements := "Any.NoOfBytes"(#I_Data) / "Any.NoOfBytes"(#IO_Data) - 1;
|
|
||||||
|
|
||||||
// // Adressgrenzen überwachen
|
|
||||||
// IF #adr >= #adrOffSet + #noElements * "Any.NoOfBytes"(#IO_Data) THEN
|
|
||||||
// #adr := #adrOffSet;
|
|
||||||
// END_IF;
|
|
||||||
|
|
||||||
// Byte-Offset berechnen
|
|
||||||
#adrOffSet := "Any.GetOffset"(#I_Data);
|
|
||||||
|
|
||||||
// Daten zum Kopieren zusammenstellen
|
|
||||||
#pTmpDataAny.BytePointer := #pTmpDataAny.BytePointer OR SHL(IN := WORD_TO_DWORD(INT_TO_WORD(#adrOffSet)), N := 3); // Byte-Adresse in Pointer laden
|
|
||||||
#pTmpDataAny.DataCount := "Any.NoOfBytes"(#IO_Data); // Länge
|
|
||||||
|
|
||||||
// Daten kopieren und am Ausgang bereitstellen
|
|
||||||
#flt := BLKMOV(SRCBLK := #pTmpData, DSTBLK => #IO_Data); // Eingangs-Daten kopieren
|
|
||||||
#IO_Cmd.NewDat := false;
|
|
||||||
|
|
||||||
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
DATA_BLOCK "IbaSimDatFrmWrkSt_"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
STRUCT
|
|
||||||
GenCpuLst : "Dbg.T_GenCpuLst";
|
|
||||||
rcv : "IbaSimDatFrmWrkSt.T_Data"; // Daten von PC
|
|
||||||
abc_1 : Struct // Daten an PC
|
|
||||||
Cmd : Struct
|
|
||||||
Strt : Bool;
|
|
||||||
NewDat : Bool;
|
|
||||||
NewDatQuit : Bool;
|
|
||||||
END_STRUCT;
|
|
||||||
Data : Array[0..254] of Byte;
|
|
||||||
END_STRUCT;
|
|
||||||
END_STRUCT;
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
|
|
||||||
END_DATA_BLOCK
|
|
||||||
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
TYPE "IbaSimDatMgt.E_IbaSimDatMgt"
|
|
||||||
VERSION : 0.1
|
|
||||||
STRUCT
|
|
||||||
Mod : Struct // Modus
|
|
||||||
EnzlStep : Int := 1; // Einzelschritt-Betrieb
|
|
||||||
END_STRUCT;
|
|
||||||
END_STRUCT;
|
|
||||||
|
|
||||||
END_TYPE
|
|
||||||
|
|
||||||
@@ -1,118 +0,0 @@
|
|||||||
FUNCTION_BLOCK "IbaSimDatMgt.Main"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_Trig : Bool := false; // Triggersignal
|
|
||||||
I_Data : Any; // Eingangsdaten
|
|
||||||
I_Mod : Int; // Modus
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Finished : Bool := false; // Durchlauf beendet
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_IN_OUT
|
|
||||||
IO_Data { S7_HMI_Visible := 'False'} : Any; // Datenausgabe
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
ibaSimDatMgt : "IbaSimDatMgt";
|
|
||||||
enzlStepFlnk : "Flnk";
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR CONSTANT
|
|
||||||
MOD_ENZL_STEP : Int := 1; // Einzelschritt-Betrieb
|
|
||||||
MOD_ZYL_STEP : Int := 2; // Zyklusschritt-Betrieb
|
|
||||||
MOD_ONE_LOOP : Int := 3; // Schleifen-Betrieb
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
17.02.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
#### Modus/Funktionsaufrufe
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
CASE #I_Mod OF
|
|
||||||
|
|
||||||
#MOD_ENZL_STEP: // Einzelschritt-Betrieb
|
|
||||||
GOTO Func_EnzlStep;
|
|
||||||
|
|
||||||
#MOD_ZYL_STEP: // Zyklusschritt-Betrieb
|
|
||||||
GOTO Func_ZylStep;
|
|
||||||
|
|
||||||
#MOD_ONE_LOOP: // Schleifen-Betrieb
|
|
||||||
GOTO Func_OneLoop;
|
|
||||||
|
|
||||||
ELSE // Statement section ELSE
|
|
||||||
GOTO END;
|
|
||||||
|
|
||||||
END_CASE;
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
#### publilc Funktionen
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
// ### Funktion Einzelschritt-Betrieb
|
|
||||||
Func_EnzlStep:
|
|
||||||
|
|
||||||
// Flankenauswertung
|
|
||||||
#enzlStepFlnk(I_Val:=#I_Trig);
|
|
||||||
|
|
||||||
#ibaSimDatMgt(I_Trig:=#enzlStepFlnk.O_FlnkPos,
|
|
||||||
I_Data:=#I_Data,
|
|
||||||
O_Finished=>#O_Finished,
|
|
||||||
IO_Data:=#IO_Data
|
|
||||||
);
|
|
||||||
GOTO END;
|
|
||||||
|
|
||||||
// ### Funktion Zyklusschritt-Betrieb
|
|
||||||
Func_ZylStep:
|
|
||||||
|
|
||||||
#ibaSimDatMgt(I_Trig := #I_Trig,
|
|
||||||
I_Data := #I_Data,
|
|
||||||
IO_Data := #IO_Data
|
|
||||||
);
|
|
||||||
|
|
||||||
#O_Finished := #ibaSimDatMgt.O_AktAdr = #ibaSimDatMgt.O_MaxAdr;
|
|
||||||
GOTO END;
|
|
||||||
|
|
||||||
// ### Funktion Schleifen-Betrieb
|
|
||||||
Func_OneLoop:
|
|
||||||
|
|
||||||
#O_Finished := false;
|
|
||||||
|
|
||||||
REPEAT
|
|
||||||
|
|
||||||
#ibaSimDatMgt(I_Trig := true,
|
|
||||||
I_Data := #I_Data,
|
|
||||||
IO_Data := #IO_Data
|
|
||||||
);
|
|
||||||
|
|
||||||
UNTIL #ibaSimDatMgt.O_AktAdr <= #ibaSimDatMgt.O_MaxAdr END_REPEAT;
|
|
||||||
|
|
||||||
#O_Finished := true;
|
|
||||||
GOTO END;
|
|
||||||
|
|
||||||
// ### Funktion Ende
|
|
||||||
END:
|
|
||||||
;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
FUNCTION_BLOCK "IbaSimDatMgt"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_Trig : Bool; // Triggersignal
|
|
||||||
I_Data : Any; // Eingangsdaten
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Finished : Bool; // Durchlauf beendet
|
|
||||||
O_AktAdr : Int; // aktuelle Adresse
|
|
||||||
O_MaxAdr : Int; // max. Adresse
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_IN_OUT
|
|
||||||
IO_Data { S7_HMI_Visible := 'False'} : Any; // Datenausgabe
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
adr : Int; // Adresszähler
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
pTmpData : Any; // Pointer Tmp-Daten
|
|
||||||
pTmpDataAny AT pTmpData : "Any.T_AnyPoint"; // Pointer Tmp-Daten Detail
|
|
||||||
noElements : Int; // Anzahl der Elemente
|
|
||||||
flt : Int; // Fehler von Blkmov
|
|
||||||
adrOffSet : Int; // Adress-Offset
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
17.02.2021 0.0 St. Maier Neuerstellung
|
|
||||||
06.03.2021 1.0 St. Maier Optimierung Funktion
|
|
||||||
- Adress-Offset-Brechnung mit Funktion Any.GetOffset
|
|
||||||
- Anzahl Bytes bestimmen mit Funktion Any.NoOfBytes
|
|
||||||
- Tmp-Var opitimiert
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#O_Finished := false;
|
|
||||||
|
|
||||||
IF NOT #I_Trig THEN
|
|
||||||
RETURN;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Pointer initizialisieren
|
|
||||||
#pTmpData := #I_Data;
|
|
||||||
|
|
||||||
// Anzahl der Einzelelemente/Typen bestimmen
|
|
||||||
#noElements := "Any.NoOfBytes"(#I_Data) / "Any.NoOfBytes"(#IO_Data) - 1;
|
|
||||||
|
|
||||||
// Adressgrenzen überwachen
|
|
||||||
IF #adr >= #adrOffSet + #noElements * "Any.NoOfBytes"(#IO_Data) THEN
|
|
||||||
#adr := #adrOffSet;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Byte-Offset berechnen
|
|
||||||
#adrOffSet := "Any.GetOffset"(#IO_Data);
|
|
||||||
|
|
||||||
// Daten zum Kopieren zusammenstellen
|
|
||||||
#pTmpDataAny.BytePointer := #pTmpDataAny.BytePointer OR SHL(IN := WORD_TO_DWORD(INT_TO_WORD(#adr)), N := 3); // Byte-Adresse in Pointer laden
|
|
||||||
#pTmpDataAny.DataCount := "Any.NoOfBytes"(#IO_Data); // Länge
|
|
||||||
|
|
||||||
// Daten kopieren und am Ausgang bereitstellen
|
|
||||||
#flt := BLKMOV(SRCBLK := #pTmpData, DSTBLK => #IO_Data); // Eingangs-Daten kopieren
|
|
||||||
|
|
||||||
// Adresse inkrementieren
|
|
||||||
IF #adr < #adrOffSet + (#noElements * "Any.NoOfBytes"(#IO_Data) - 1) THEN
|
|
||||||
#adr := #adr + "Any.NoOfBytes"(#IO_Data);
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Ausgänge schreiben
|
|
||||||
#O_Finished := true;
|
|
||||||
#O_AktAdr := #adr;
|
|
||||||
#O_MaxAdr := #adrOffSet + #noElements * "Any.NoOfBytes"(#IO_Data);
|
|
||||||
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,93 +0,0 @@
|
|||||||
FUNCTION_BLOCK "ChckBwg"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_Frg : Bool; // Freigabe Eingang
|
|
||||||
I_X : DInt; // Messwert der zu überwachen ist
|
|
||||||
I_PosBwg : Bool := false; // positive Bewegungsrichtung
|
|
||||||
I_NegBwg : Bool := false; // negative Bewegungsrichtung
|
|
||||||
I_Rng : DInt; // zulässiger Bereich/Tolerantfeld, wenn keine Bewegung ausgeführt wird
|
|
||||||
I_MaxDeltaSprg : Int; // max. erlaubtes/r Delta/Sprung für Sprungüberwachung
|
|
||||||
I_Dly : Time := T#0ms; // Verzögerungszeit
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Flt : Bool; // Fehlerausgang
|
|
||||||
O_FltDtl : Word; // Fehler im Detail
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
checkBwgStop : "ChckBwgStop"; // Überwachung Stillstandsdrift
|
|
||||||
chckBwgRitg : "ChckBwgRitg"; // Überwachung Bewegungsrichtung
|
|
||||||
sprgKorMessWrt : "SprgKorMessWrt"; // Sprungüberwachung des Messwertes
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
03.03.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Der Baustein überwacht eine Achse/Messsystem, ob dieses im Stillstand aus einem vor-
|
|
||||||
gegebenen Bereich I_Rng driftet, ob sich der Messwert zur Bewegungsrichtung ändert und ob
|
|
||||||
der Messwert Sprünge I_MaxDeltaSprg hat.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
// Freigabe Eingang überwachen
|
|
||||||
IF NOT #I_Frg THEN
|
|
||||||
|
|
||||||
#O_Flt := false;
|
|
||||||
#O_FltDtl := w#16#00;
|
|
||||||
RETURN;
|
|
||||||
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Überprüfen ob Achse wegdriftet
|
|
||||||
#checkBwgStop(I_En := NOT #I_PosBwg AND NOT #I_NegBwg,
|
|
||||||
I_X := #I_X,
|
|
||||||
I_Rng := #I_Rng);
|
|
||||||
|
|
||||||
// Überprüfung der Bewegungsrichtung
|
|
||||||
#chckBwgRitg(I_X := #I_X,
|
|
||||||
I_Pos := #I_PosBwg,
|
|
||||||
I_Neg := #I_NegBwg,
|
|
||||||
I_Dly:=#I_Dly);
|
|
||||||
|
|
||||||
// Überprüfen des Messwertes auf Sprünge
|
|
||||||
#sprgKorMessWrt(I_En := #I_PosBwg OR #I_NegBwg,
|
|
||||||
I_MaxDelta := #I_MaxDeltaSprg,
|
|
||||||
I_Mode := 0,
|
|
||||||
IO_X := #I_X);
|
|
||||||
|
|
||||||
// Fehlerausgabe
|
|
||||||
#O_Flt := #checkBwgStop.O_Flt OR #chckBwgRitg.O_Flt OR #sprgKorMessWrt.O_Flt;
|
|
||||||
|
|
||||||
// Überwachung Stillstandsdrift angesprochen
|
|
||||||
IF #checkBwgStop.O_Flt THEN
|
|
||||||
#O_FltDtl := #O_FltDtl OR w#16#01;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Überwachung Bewegungsrichtung angesprochen
|
|
||||||
IF #chckBwgRitg.O_Flt THEN
|
|
||||||
#O_FltDtl := #O_FltDtl OR w#16#02;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Sprungüberwachung des Messwertes angesprochen
|
|
||||||
IF #sprgKorMessWrt.O_Flt THEN
|
|
||||||
#O_FltDtl := #O_FltDtl OR w#16#04;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,142 +0,0 @@
|
|||||||
FUNCTION_BLOCK "ChckBwgRitg"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_X : DInt; // Messwert der zu überwachen ist
|
|
||||||
I_Pos : Bool; // positive Bewegungsrichtung
|
|
||||||
I_Neg : Bool; // negative Bewegungsrichtung
|
|
||||||
I_Dly : Time; // Verzögerungszeit
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Flt : Bool := false; // Überwachung angeschlagen
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
init : Bool; // Buffer initialisiert
|
|
||||||
flnkPos : "Flnk"; // Flankenauswertung der Positionsrichtungen
|
|
||||||
flnkNeg : "Flnk"; // Flankenauswertung der Positionsrichtungen
|
|
||||||
dly {OriginalPartName := 'TON'; LibVersion := '1.0'} : TON;
|
|
||||||
delta : DInt; // Delta von x und x-1
|
|
||||||
oldVal : DInt;
|
|
||||||
buf : Array[0..#BUF_MAX] of DInt; // Buffer für Messwerte
|
|
||||||
bufX : Array[0..#BUF_MAX] of DInt; // Buffer für Messwerte
|
|
||||||
i : Int; // Zähler
|
|
||||||
ii : Int; // Zähler
|
|
||||||
cnt : Int; // Zähler für Überwachung Bewungsrichtung
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR CONSTANT
|
|
||||||
BUF_MAX : Int := 10; // max. Bufferlänge
|
|
||||||
NO_MIN_BWG : Int := 3; // Anzahl Delta für Begungsrichtung i.O.
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
03.03.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################################################################################
|
|
||||||
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Funktion überprüft, ob sich das Eingangssigal I_X zur Bewegungsrichtung ändert.
|
|
||||||
Bei postiver Bewegungsrichtung muss sich das Eingangssingal in positiver und bei
|
|
||||||
negativer Bewegungsrichtung in negative Richtung ändern. Ist die nicht der Fall liegt ein
|
|
||||||
Fehler vor und der Ausgang O_Flt wird auf true gesteuert.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
// Flankenauswertung der Bewgungsrichtungen
|
|
||||||
#flnkPos(I_Val := #I_Pos);
|
|
||||||
#flnkNeg(I_Val := #I_Neg);
|
|
||||||
|
|
||||||
#dly(IN := #I_Pos OR #I_Neg,
|
|
||||||
PT := #I_Dly);
|
|
||||||
|
|
||||||
// Änderung der Bewegungsrichtung - Buffer zurücksetzen
|
|
||||||
IF #flnkPos.O_FlnkNeg OR #flnkNeg.O_FlnkNeg OR NOT #dly.Q THEN
|
|
||||||
|
|
||||||
#init := false;
|
|
||||||
#oldVal := 0;
|
|
||||||
#ii := 0;
|
|
||||||
//"BufClr"(#buf); // Buffer löschen
|
|
||||||
//"BufClr"(#bufX); // Buffer löschen
|
|
||||||
#O_Flt := false;
|
|
||||||
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
IF NOT #dly.Q THEN
|
|
||||||
RETURN;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// oldVal initialisieren
|
|
||||||
IF #oldVal = 0 THEN
|
|
||||||
#oldVal := #I_X;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Delta zwischen alten und aktuellen Messwert bilden
|
|
||||||
#delta := #I_X - #oldVal;
|
|
||||||
|
|
||||||
// Delta in Buffer eintragen
|
|
||||||
#buf[#ii] := #delta;
|
|
||||||
#bufX[#ii] := #I_X;
|
|
||||||
|
|
||||||
// Zählervar. inkrementieren
|
|
||||||
#ii := #ii + 1;
|
|
||||||
|
|
||||||
// Zählervar. überwachen
|
|
||||||
IF #ii > #BUF_MAX THEN
|
|
||||||
#init := true;
|
|
||||||
#ii := 0;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// aktueller Messwert speichern
|
|
||||||
#oldVal := #I_X;
|
|
||||||
|
|
||||||
// Wenn Baustein nicht inizialisert, hier beenden
|
|
||||||
IF NOT #init THEN
|
|
||||||
RETURN;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Buffer durchlaufen und Delta auswerten
|
|
||||||
#cnt := 0;
|
|
||||||
FOR #i := 0 TO #BUF_MAX DO
|
|
||||||
|
|
||||||
// Delta in Verbindung mit der Bewegungsrichtung überwachen
|
|
||||||
IF (#buf[#i] > 0 AND #I_Pos) OR (#buf[#i] < 0 AND #I_Neg) THEN
|
|
||||||
#cnt := #cnt + 1;
|
|
||||||
END_IF;// Überprüfen ob eine Bewegung angefordert ist
|
|
||||||
|
|
||||||
IF NOT #I_Pos AND NOT #I_Neg THEN
|
|
||||||
|
|
||||||
#init := false;
|
|
||||||
#oldVal := 0;
|
|
||||||
#ii := 0;
|
|
||||||
// "BufClr"(#buf); // Buffer löschen
|
|
||||||
// "BufClr"(#bufX); // Buffer löschen
|
|
||||||
#O_Flt := false;
|
|
||||||
|
|
||||||
RETURN;
|
|
||||||
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
END_FOR;
|
|
||||||
|
|
||||||
// Zählerstand Bewegungsrichtung auswerten
|
|
||||||
IF #cnt >= #NO_MIN_BWG OR (#I_Pos AND #bufX[#BUF_MAX - 1] - #bufX[0] > 0) OR (#I_Neg AND #bufX[0] - #bufX[#BUF_MAX - 1] > 0) THEN
|
|
||||||
;
|
|
||||||
#O_Flt := false;
|
|
||||||
ELSE
|
|
||||||
#O_Flt := true;
|
|
||||||
END_IF;
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
FUNCTION_BLOCK "ChckBwgStop"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_En : Bool; // Freigabe Eingang, Start Überwachung, Stillstand
|
|
||||||
I_X : DInt; // Messwert der zu überwachen ist
|
|
||||||
I_Rng : DInt; // zulässiger Bereich/Tolerantfeld
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Flt : Bool := false; // Überwachung angeschlagen
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
enFlnk : "Flnk"; // Flankenauswertung
|
|
||||||
x : DInt; // Stillstandsposition gespeichert
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
03.03.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Funktions überwacht bei Stillstand einer Bewegung I_EN = true, ob das Eingangssignal I_X
|
|
||||||
aus dem vorgegebenen Range driftet. Ist dies der Fall, wird der Fehlerausgang O_Flt auf true
|
|
||||||
gesetzt.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
// Flankenauswertung
|
|
||||||
#enFlnk(I_Val:=#I_En);
|
|
||||||
|
|
||||||
// Wenn keine Freigabe vorhanden.
|
|
||||||
IF NOT #I_En THEN
|
|
||||||
|
|
||||||
#O_Flt := FALSE;
|
|
||||||
RETURN;
|
|
||||||
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Stillstandposition speichern
|
|
||||||
IF #enFlnk.O_FlnkPos THEN
|
|
||||||
#x := #I_X;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Bereichsüberwachung und Fehlerausgabe
|
|
||||||
IF REAL_TO_DINT(SQRT(SQR((DINT_TO_REAL(#I_X - #x))))) >= #I_Rng THEN
|
|
||||||
#O_Flt := true;
|
|
||||||
ELSE
|
|
||||||
#O_Flt := false;
|
|
||||||
END_IF;
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
FUNCTION_BLOCK "ImpToGeschDrehz"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_Imp : Bool; // Impulseingang (z.B. Drehzahlwächter)
|
|
||||||
I_Dmr : Int; // Durchmesser der Rolle [mm]
|
|
||||||
I_ImpProUmdr : Int; // Impulse pro Umdrehung
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Geschw : Real; // Errechnete Geschwindigkeit [m/sec]
|
|
||||||
O_Drehz : Real; // Errechnete Drehzahl [n/min]
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
stime : "STIME"; // Zeit
|
|
||||||
impCnt : Int; // Imulszähler
|
|
||||||
impFlnk : "Flnk";
|
|
||||||
startTime : DWord; // Startzeit bei erster positiver Flanke
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR CONSTANT
|
|
||||||
PI : Real := 3.141593;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
28.10.2019 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#stime();
|
|
||||||
|
|
||||||
// Flankenauswertung
|
|
||||||
#impFlnk(I_Val:=#I_Imp);
|
|
||||||
|
|
||||||
// positive Flanken zählen
|
|
||||||
IF #impFlnk.O_FlnkPos THEN
|
|
||||||
|
|
||||||
#impCnt := #impCnt + 1;
|
|
||||||
|
|
||||||
// Zeit bei erster positiven Flanke speichern
|
|
||||||
IF #impCnt = 1 THEN
|
|
||||||
#startTime := #stime.tx;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
IF #impCnt > #I_ImpProUmdr THEN
|
|
||||||
|
|
||||||
// Drehzahl berechnen
|
|
||||||
#O_Drehz := 60000.0 / INT_TO_REAL(#impCnt - 1) / INT_TO_REAL(DWORD_TO_INT(#stime.tx) - DWORD_TO_INT(#startTime)) ;
|
|
||||||
|
|
||||||
// Geschwindigkeit berechnen
|
|
||||||
#O_Geschw := INT_TO_REAL(#I_Dmr) * #PI * #O_Drehz / 60 / 1000;
|
|
||||||
|
|
||||||
// Zähler zurücksetzen
|
|
||||||
#impCnt := 0;
|
|
||||||
|
|
||||||
END_IF;
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,115 +0,0 @@
|
|||||||
FUNCTION_BLOCK "SprgKorMessWrt"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_En : Bool; // Freigabe Eingang
|
|
||||||
I_MaxDelta : Int; // max. erlaubtes/r Delta/Sprung
|
|
||||||
I_Mode : Int; // Modus 0 = keine Korrektur, 1 = Korrektur mit Delta x-1, 2 = Korrektur mit Trend-Delta
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Flt : Bool; // Überwachung angeschlagen
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_IN_OUT
|
|
||||||
IO_X : DInt; // korregierter Wert
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
init : Bool;
|
|
||||||
oldData : Struct // Altwerte von Zyklus n-1
|
|
||||||
x : DInt; // Messsignal
|
|
||||||
delta : DInt; // Sprunggröße
|
|
||||||
END_STRUCT;
|
|
||||||
trend : "TrendEx"; // Trend des Deltas
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
korVal : DInt; // Korrekturwert
|
|
||||||
delta : DInt; // Delta von x und x-1
|
|
||||||
flt : Bool; // Fehler-Flag
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
28.02.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Funktion überwacht, wenn der Eingang I_En = true ist, die Sprunghöhe/Delta des Eingangs-
|
|
||||||
signals IO_X. Ist das Delta größer/gleich dem am Eingang I_MaxDelta eingestellen Wertes wird
|
|
||||||
bei I_Mode = 0 der Eingangswert IO_X nicht korrigiert, sondern nur der Ausgang O_Flt für einen
|
|
||||||
Zyklus auf true gesetzt, bei I_Mode = 1 wird der Eingangswert IO_X mit dem Delta des Zyklus
|
|
||||||
davor korrigiert und bei I_Mode = 2 wird der Eingangswert IO_X mit dem Trend aus den letzten
|
|
||||||
x-Zyklen korrigiert.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
IF NOT #init THEN
|
|
||||||
|
|
||||||
#init := true;
|
|
||||||
#oldData.x := #IO_X;
|
|
||||||
#oldData.delta := #delta;
|
|
||||||
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Freigabe überprüfen
|
|
||||||
IF NOT #I_En THEN
|
|
||||||
#init := false;
|
|
||||||
#O_Flt := false;
|
|
||||||
RETURN;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
#delta := #IO_X - #oldData.x;
|
|
||||||
|
|
||||||
// Trend von Delta bestimmen
|
|
||||||
IF #I_Mode = 2 THEN
|
|
||||||
#trend(I_X := DINT_TO_REAL(#delta),
|
|
||||||
I_N := 5
|
|
||||||
);
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Sprung des Messsignals auswerten
|
|
||||||
IF ABS(#delta) >= INT_TO_DINT(#I_MaxDelta) THEN
|
|
||||||
|
|
||||||
CASE #I_Mode OF
|
|
||||||
|
|
||||||
1: // Korrektur mit Delta x-1
|
|
||||||
#IO_X := #oldData.x + #oldData.delta; // Messwert korrigieren;
|
|
||||||
|
|
||||||
2: // Korrektur mit Trend-Delta
|
|
||||||
#IO_X := #oldData.x + REAL_TO_DINT(#trend.O_Q.D); // Messwert korrigieren; ;
|
|
||||||
|
|
||||||
ELSE // Statement section ELSE
|
|
||||||
;
|
|
||||||
END_CASE;
|
|
||||||
|
|
||||||
#flt := true; // Fehler-Flag setzen
|
|
||||||
|
|
||||||
ELSE
|
|
||||||
|
|
||||||
#flt := false; // Fehler-Flag zurücksetzen
|
|
||||||
|
|
||||||
// Speichern der aktual Werte für nächsten Zyklus
|
|
||||||
#oldData.delta := #delta;
|
|
||||||
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Ausgänge beschreiben
|
|
||||||
#O_Flt := #flt;
|
|
||||||
|
|
||||||
// Speichern der aktual Werte für nächsten Zyklus
|
|
||||||
#oldData.x := #IO_X;
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
FUNCTION "BoolToReal" : Real
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
AUTHOR : FSI
|
|
||||||
VERSION : 0.2
|
|
||||||
VAR_INPUT
|
|
||||||
I_BoolVal : Bool;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
29.07.2019 0.0 St. Maier Neuerstellung
|
|
||||||
15.08.2019 0.1 St. Maier Header angepasst und Beschreibung angepasst
|
|
||||||
11.10.2019 0.2 St. Maier Überarbeitung Kopf damit TIA kompatibel
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################### Baustein Beschreibung #######################################
|
|
||||||
|
|
||||||
Abhängigkeiten (von anderen Fuktionen und Quellen):
|
|
||||||
- keine
|
|
||||||
|
|
||||||
Inputs:
|
|
||||||
- I_BoolVal: Wert der in einen Real-Wert konvertiert werden soll
|
|
||||||
|
|
||||||
Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
In-\Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Return-Value:
|
|
||||||
- in Real konvertierter Eingangswert
|
|
||||||
|
|
||||||
Funktionsbeschreibung:
|
|
||||||
Es wird das am Eingang I_BoolVal in einen Real-Wert gewandelt.
|
|
||||||
|
|
||||||
Konvertierungs-Regeln:
|
|
||||||
- true = 1.0
|
|
||||||
- false = 0.0
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
IF #I_BoolVal = true THEN
|
|
||||||
#BoolToReal := 1.0;
|
|
||||||
ELSE
|
|
||||||
#BoolToReal := 0.0;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
TYPE "DatUztDtl.T_DatUztDtl"
|
|
||||||
VERSION : 0.1
|
|
||||||
STRUCT
|
|
||||||
Jr : Byte := 0; // Jahr
|
|
||||||
Mon : Byte := 0; // Monat
|
|
||||||
Tg : Byte := 0; // Tag
|
|
||||||
Std : Byte := 0; // Stunde
|
|
||||||
Min : Byte := 0; // Minute
|
|
||||||
Sek : Byte := 0; // Sekunde
|
|
||||||
Msek : Byte := 0; // Millisekunde
|
|
||||||
Tmp : Byte := 0; // Millisekunden und Wochentag (1-7, 1 = Sonntag)
|
|
||||||
END_STRUCT;
|
|
||||||
|
|
||||||
END_TYPE
|
|
||||||
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
TYPE "DatUztDtl.T_DatUztMod"
|
|
||||||
VERSION : 0.1
|
|
||||||
STRUCT
|
|
||||||
Jr : Int := 0; // Jahr
|
|
||||||
Mon : Int := 0; // Monat
|
|
||||||
Tg : Int := 0; // Tag
|
|
||||||
Std : Int := 0; // Stunde
|
|
||||||
Min : Int := 0; // Minute
|
|
||||||
Sek : Int := 0; // Sekunde
|
|
||||||
Msek : Int := 0; // Millisekunde
|
|
||||||
WoTg : Int := 0; // Wochentag (1-7, 1 = Sonntag)
|
|
||||||
END_STRUCT;
|
|
||||||
|
|
||||||
END_TYPE
|
|
||||||
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
FUNCTION "DatUztDtl" : Void
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_DatUzt : Date_And_Time; // Datum und Uhrzeit
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_DatUztMod : "DatUztDtl.T_DatUztMod"; // Datum und Uhrzeit modifiziert
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
tempDatUzt : Date_And_Time; // Datum und Uhrzeit
|
|
||||||
tempDatUzDtl AT tempDatUzt : "DatUztDtl.T_DatUztDtl";
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
16.10.2019 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################### Baustein Beschreibung #######################################
|
|
||||||
|
|
||||||
Abhängigkeiten (von anderen Fuktionen und Quellen):
|
|
||||||
-
|
|
||||||
|
|
||||||
Inputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Outputs:
|
|
||||||
- O_DatUzt: Uhrzeit und Datum der CPU
|
|
||||||
|
|
||||||
In-\Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Return-Value:
|
|
||||||
-
|
|
||||||
|
|
||||||
Funktionsbeschreibung:
|
|
||||||
Baustein konvertiert Datum und Uhrzeit und gibt dieses einzel aus.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#tempDatUzt := #I_DatUzt;
|
|
||||||
|
|
||||||
// Werte konvertieren
|
|
||||||
#O_DatUztMod.Jr := BCD16_TO_INT(#tempDatUzDtl.Jr) + 2000;
|
|
||||||
#O_DatUztMod.Mon := BCD16_TO_INT(#tempDatUzDtl.Mon);
|
|
||||||
#O_DatUztMod.Tg := BCD16_TO_INT(#tempDatUzDtl.Tg);
|
|
||||||
#O_DatUztMod.Std := BCD16_TO_INT(#tempDatUzDtl.Std);
|
|
||||||
#O_DatUztMod.Min := BCD16_TO_INT(#tempDatUzDtl.Min);
|
|
||||||
#O_DatUztMod.Sek := BCD16_TO_INT(#tempDatUzDtl.Sek);
|
|
||||||
#O_DatUztMod.Msek := (BCD16_TO_INT(#tempDatUzDtl.Msek) * 10) + WORD_TO_INT(#tempDatUzDtl.Tmp AND W#16#F0);
|
|
||||||
#O_DatUztMod.WoTg := WORD_TO_INT(#tempDatUzDtl.Tmp AND W#16#0F);
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
FUNCTION "HexToAscii" : Void
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
AUTHOR : FSI
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
inputDWord : DWord;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
outputChar : Array[0..7] of Char;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
tmpBuffer : DWord;
|
|
||||||
tmpStoreAscii : Array[0..7] of Int;
|
|
||||||
tmpChkDWord : DWord;
|
|
||||||
tmpChkInt : Int;
|
|
||||||
i : Int;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
|
|
||||||
|
|
||||||
(*############################################################################
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
13.08.2019 0.0 343 Neuerstellung
|
|
||||||
11.10.2019 0.1 St. Maier Überarbeitung Kopf damit TIA kompatibel
|
|
||||||
|
|
||||||
############################################################################*)
|
|
||||||
|
|
||||||
#tmpBuffer := #inputDWord;
|
|
||||||
|
|
||||||
#i := 0;
|
|
||||||
REPEAT
|
|
||||||
|
|
||||||
// Übergabe und Umwandlung in CHAR für BYTE 0, wenn i=0
|
|
||||||
IF #i > 0 THEN // 1)
|
|
||||||
|
|
||||||
// Der Inhalt der Variablen "tmpbufffer" wird um 4 Bit nach rechts verschoben. ==> nächstes BYTE, wenn i>0.
|
|
||||||
#tmpBuffer := SHR(IN := #tmpBuffer, N := 4);
|
|
||||||
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
#tmpChkDWord := #tmpBuffer AND 16#0000000f;
|
|
||||||
#tmpChkInt := DWORD_TO_INT(#tmpChkDWord);
|
|
||||||
|
|
||||||
// Überprüfe, ob der konvertierte Wert größer ist als 9.
|
|
||||||
IF #tmpChkInt > 9 THEN
|
|
||||||
|
|
||||||
// Der konvertierte Wert ist > 9, somit liegt der Wert der Variablen vom Datentyp CHAR zwischen 'A' und 'F'. Addiere dazu den Offset "W#16#37".
|
|
||||||
#tmpChkInt := #tmpChkInt + 16#0037;
|
|
||||||
|
|
||||||
ELSE
|
|
||||||
|
|
||||||
// Der konvertierte Wert ist <) 9, somit liegt der Wert der Variablen vom Datentyp CHAR zwischen '1' und '9'. Addiere dazu den Offset "W#16#30".
|
|
||||||
#tmpChkInt := #tmpChkInt + 16#0030;
|
|
||||||
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
#tmpStoreAscii[#i] := #tmpChkInt;
|
|
||||||
#outputChar[#i] := INT_TO_CHAR(#tmpStoreAscii[#i]);
|
|
||||||
#i := #i + 1;
|
|
||||||
|
|
||||||
UNTIL #i = 8
|
|
||||||
END_REPEAT;
|
|
||||||
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
TYPE "TimeDtl"
|
|
||||||
VERSION : 0.1
|
|
||||||
STRUCT
|
|
||||||
Tg : DInt;
|
|
||||||
Std : DInt;
|
|
||||||
Min : DInt;
|
|
||||||
Sec : DInt;
|
|
||||||
Msec : DInt;
|
|
||||||
END_STRUCT;
|
|
||||||
|
|
||||||
END_TYPE
|
|
||||||
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
FUNCTION "TimeToMinSecMses" : Void
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_Zt : Time;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_ZtDtl : "TimeDtl";
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
tmpZt : DInt;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR CONSTANT
|
|
||||||
MSEC_TO_MIN : DInt := 60000;
|
|
||||||
MSEC_TO_SEC : DInt := 1000;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
15.10.2019 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################### Baustein Beschreibung #######################################
|
|
||||||
|
|
||||||
Abhängigkeiten (von anderen Fuktionen und Quellen):
|
|
||||||
- keine
|
|
||||||
|
|
||||||
Inputs:
|
|
||||||
- I_Zt : Zeit die umgerechnet werden soll
|
|
||||||
|
|
||||||
Outputs:
|
|
||||||
- O_ZtDtl : Zeit aufgeschlüsselt
|
|
||||||
|
|
||||||
In-\Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Return-Value:
|
|
||||||
-
|
|
||||||
|
|
||||||
Funktionsbeschreibung:
|
|
||||||
Umrechnung der Eingangszeit in Minuten, Sekunden und Millisekunden.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
// Zeit in dint konvertieren
|
|
||||||
#tmpZt := TIME_TO_DINT(#I_Zt);
|
|
||||||
|
|
||||||
// Umrechnung in Minuten
|
|
||||||
#O_ZtDtl.Min := #tmpZt / #MSEC_TO_MIN;
|
|
||||||
|
|
||||||
// Umrechnung in Sekunden
|
|
||||||
#O_ZtDtl.Sec := (#tmpZt MOD #MSEC_TO_MIN) / #MSEC_TO_SEC;
|
|
||||||
|
|
||||||
// Bestimmung der Millisekunden
|
|
||||||
#O_ZtDtl.Msec := (#tmpZt MOD #MSEC_TO_MIN) MOD #MSEC_TO_SEC;
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
FUNCTION "TimeToMinSecMsesDtl" : Void
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_Zt : Time;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Min : DInt;
|
|
||||||
O_Sec : DInt;
|
|
||||||
O_Msec : DInt;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
tmpZt : DInt;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR CONSTANT
|
|
||||||
MSEC_TO_MIN : DInt := 60000;
|
|
||||||
MSEC_TO_SEC : DInt := 1000;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
15.10.2019 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################### Baustein Beschreibung #######################################
|
|
||||||
|
|
||||||
Abhängigkeiten (von anderen Fuktionen und Quellen):
|
|
||||||
- keine
|
|
||||||
|
|
||||||
Inputs:
|
|
||||||
- I_Zt : Zeit die umgerechnet werden soll
|
|
||||||
|
|
||||||
Outputs:
|
|
||||||
- O_Min : Anteil der Minuten der Eingangszeit
|
|
||||||
- O_Sec : Anteil der Sekunden der Eingangszeit
|
|
||||||
- O_Msec : Anteil der Millisekunden der Eingangszeit
|
|
||||||
|
|
||||||
In-\Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Return-Value:
|
|
||||||
-
|
|
||||||
|
|
||||||
Funktionsbeschreibung:
|
|
||||||
Umrechnung der Eingangszeit in Minuten, Sekunden und Millisekunden.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
// Zeit in dint konvertieren
|
|
||||||
#tmpZt := TIME_TO_DINT(#I_Zt);
|
|
||||||
|
|
||||||
// Umrechnung in Minuten
|
|
||||||
#O_Min := #tmpZt / #MSEC_TO_MIN;
|
|
||||||
|
|
||||||
// Umrechnung in Sekunden
|
|
||||||
#O_Sec := (#tmpZt MOD #MSEC_TO_MIN) / #MSEC_TO_SEC;
|
|
||||||
|
|
||||||
// Bestimmung der Millisekunden
|
|
||||||
#O_Msec := (#tmpZt MOD #MSEC_TO_MIN) MOD #MSEC_TO_SEC;
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
FUNCTION "TimeToSecMses" : Void
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_Zt : Time;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_ZtDtl : "TimeDtl";
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
tmpZt : DInt;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR CONSTANT
|
|
||||||
MSEC_TO_SEC : DInt := 1000;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
15.10.2019 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################### Baustein Beschreibung #######################################
|
|
||||||
|
|
||||||
Abhängigkeiten (von anderen Fuktionen und Quellen):
|
|
||||||
- keine
|
|
||||||
|
|
||||||
Inputs:
|
|
||||||
- I_Zt : Zeit die umgerechnet werden soll
|
|
||||||
|
|
||||||
Outputs:
|
|
||||||
- O_ZtDtl : Zeit aufgeschlüsselt
|
|
||||||
|
|
||||||
In-\Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Return-Value:
|
|
||||||
-
|
|
||||||
|
|
||||||
Funktionsbeschreibung:
|
|
||||||
Umrechnung der Eingangszeit in Sekunden und Millisekunden.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
// Zeit in dint konvertieren
|
|
||||||
#tmpZt := TIME_TO_DINT(#I_Zt);
|
|
||||||
|
|
||||||
// Umrechnung in Sekunden
|
|
||||||
#O_ZtDtl.Sec := #tmpZt / #MSEC_TO_SEC;
|
|
||||||
|
|
||||||
// Bestimmung der Millisekunden
|
|
||||||
#O_ZtDtl.Msec := #tmpZt MOD #MSEC_TO_SEC;
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
FUNCTION "TimeToSecMsesDtl" : Void
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_Zt : Time;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Sec : DInt;
|
|
||||||
O_Msec : DInt;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
tmpZt : DInt;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR CONSTANT
|
|
||||||
MSEC_TO_SEC : DInt := 1000;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
15.10.2019 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################### Baustein Beschreibung #######################################
|
|
||||||
|
|
||||||
Abhängigkeiten (von anderen Fuktionen und Quellen):
|
|
||||||
- keine
|
|
||||||
|
|
||||||
Inputs:
|
|
||||||
- I_Zt : Zeit die umgerechnet werden soll
|
|
||||||
|
|
||||||
Outputs:
|
|
||||||
- O_Sec : Anteil der Sekunden der Eingangszeit
|
|
||||||
- O_Msec : Anteil der Millisekunden der Eingangszeit
|
|
||||||
|
|
||||||
In-\Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Return-Value:
|
|
||||||
-
|
|
||||||
|
|
||||||
Funktionsbeschreibung:
|
|
||||||
Umrechnung der Eingangszeit in Sekunden und Millisekunden.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
// Zeit in dint konvertieren
|
|
||||||
#tmpZt := TIME_TO_DINT(#I_Zt);
|
|
||||||
|
|
||||||
// Umrechnung in Sekunden
|
|
||||||
#O_Sec := #tmpZt / #MSEC_TO_SEC;
|
|
||||||
|
|
||||||
// Bestimmung der Millisekunden
|
|
||||||
#O_Msec := #tmpZt MOD #MSEC_TO_SEC;
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
FUNCTION "TimeToStdMinSecMsec" : Void
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_Zt : Time;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_ZtDtl : "TimeDtl";
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
tmpZt : DInt;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR CONSTANT
|
|
||||||
MSEC_TO_STD : DInt := 3600000;
|
|
||||||
MSEC_TO_MIN : DInt := 60000;
|
|
||||||
MSEC_TO_SEC : DInt := 1000;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
15.10.2019 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################### Baustein Beschreibung #######################################
|
|
||||||
|
|
||||||
Abhängigkeiten (von anderen Fuktionen und Quellen):
|
|
||||||
- keine
|
|
||||||
|
|
||||||
Inputs:
|
|
||||||
- I_Zt : Zeit die umgerechnet werden soll
|
|
||||||
|
|
||||||
Outputs:
|
|
||||||
- O_ZtDtl : Zeit aufgeschlüsselt
|
|
||||||
|
|
||||||
In-\Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Return-Value:
|
|
||||||
-
|
|
||||||
|
|
||||||
Funktionsbeschreibung:
|
|
||||||
Umrechnung der Eingangszeit in Stunden, Minuten, Sekunden und Millisekunden.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
// Zeit in dint konvertieren
|
|
||||||
#tmpZt := TIME_TO_DINT(#I_Zt);
|
|
||||||
|
|
||||||
// Umrechnung in Stunden
|
|
||||||
#O_ZtDtl.Std := #tmpZt / #MSEC_TO_STD;
|
|
||||||
|
|
||||||
// Umrechnung in Minuten
|
|
||||||
#O_ZtDtl.Min := (#tmpZt MOD #MSEC_TO_STD) / #MSEC_TO_MIN;
|
|
||||||
|
|
||||||
// Umrechnung in Sekunden
|
|
||||||
#O_ZtDtl.Sec := ((#tmpZt MOD #MSEC_TO_STD) MOD #MSEC_TO_MIN) / #MSEC_TO_SEC;
|
|
||||||
|
|
||||||
// Bestimmung der Millisekunden
|
|
||||||
#O_ZtDtl.Msec := ((#tmpZt MOD #MSEC_TO_STD) MOD #MSEC_TO_MIN) MOD #MSEC_TO_SEC;
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
FUNCTION "TimeToStdMinSecMsecDtl" : Void
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_Zt : Time;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Std : DInt;
|
|
||||||
O_Min : DInt;
|
|
||||||
O_Sec : DInt;
|
|
||||||
O_Msec : DInt;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
tmpZt : DInt;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR CONSTANT
|
|
||||||
MSEC_TO_STD : DInt := 3600000;
|
|
||||||
MSEC_TO_MIN : DInt := 60000;
|
|
||||||
MSEC_TO_SEC : DInt := 1000;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
15.10.2019 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################### Baustein Beschreibung #######################################
|
|
||||||
|
|
||||||
Abhängigkeiten (von anderen Fuktionen und Quellen):
|
|
||||||
- keine
|
|
||||||
|
|
||||||
Inputs:
|
|
||||||
- I_Zt : Zeit die umgerechnet werden soll
|
|
||||||
|
|
||||||
Outputs:
|
|
||||||
- O_Std : Anteil der Stunden der Eingangszeit
|
|
||||||
- O_Min : Anteil der Minuten der Eingangszeit
|
|
||||||
- O_Sec : Anteil der Sekunden der Eingangszeit
|
|
||||||
- O_Msec : Anteil der Millisekunden der Eingangszeit
|
|
||||||
|
|
||||||
In-\Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Return-Value:
|
|
||||||
-
|
|
||||||
|
|
||||||
Funktionsbeschreibung:
|
|
||||||
Umrechnung der Eingangszeit in Stunden, Minuten, Sekunden und Millisekunden.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
// Zeit in dint konvertieren
|
|
||||||
#tmpZt := TIME_TO_DINT(#I_Zt);
|
|
||||||
|
|
||||||
// Umrechnung in Stunden
|
|
||||||
#O_Std := #tmpZt / #MSEC_TO_STD;
|
|
||||||
|
|
||||||
// Umrechnung in Minuten
|
|
||||||
#O_Min := (#tmpZt MOD #MSEC_TO_STD) / #MSEC_TO_MIN;
|
|
||||||
|
|
||||||
// Umrechnung in Sekunden
|
|
||||||
#O_Sec := ((#tmpZt MOD #MSEC_TO_STD) MOD #MSEC_TO_MIN) / #MSEC_TO_SEC;
|
|
||||||
|
|
||||||
// Bestimmung der Millisekunden
|
|
||||||
#O_Msec := ((#tmpZt MOD #MSEC_TO_STD) MOD #MSEC_TO_MIN) MOD #MSEC_TO_SEC;
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
FUNCTION "TimeToTgStdMinSecMsec" : Void
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_Zt : Time;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_ZtDtl : "TimeDtl";
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
tmpZt : DInt;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR CONSTANT
|
|
||||||
MSEC_TO_TG : DInt := 86400000;
|
|
||||||
MSEC_TO_STD : DInt := 3600000;
|
|
||||||
MSEC_TO_MIN : DInt := 60000;
|
|
||||||
MSEC_TO_SEC : DInt := 1000;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
15.10.2019 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################### Baustein Beschreibung #######################################
|
|
||||||
|
|
||||||
Abhängigkeiten (von anderen Fuktionen und Quellen):
|
|
||||||
- keine
|
|
||||||
|
|
||||||
Inputs:
|
|
||||||
- I_Zt : Zeit die umgerechnet werden soll
|
|
||||||
|
|
||||||
Outputs:
|
|
||||||
- O_ZtDtl : Zeit aufgeschlüsselt
|
|
||||||
|
|
||||||
In-\Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Return-Value:
|
|
||||||
-
|
|
||||||
|
|
||||||
Funktionsbeschreibung:
|
|
||||||
Umrechnung der Eingangszeit in Tage, Stunden, Minuten, Sekunden und Millisekunden.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
// Zeit in dint konvertieren
|
|
||||||
#tmpZt := TIME_TO_DINT(#I_Zt);
|
|
||||||
|
|
||||||
// Umrechung in Tage
|
|
||||||
#O_ZtDtl.Std := #tmpZt / #MSEC_TO_TG;
|
|
||||||
|
|
||||||
// Umrechnung in Stunden
|
|
||||||
#O_ZtDtl.Std := (#tmpZt MOD #MSEC_TO_TG) / #MSEC_TO_STD;
|
|
||||||
|
|
||||||
// Umrechnung in Minuten
|
|
||||||
#O_ZtDtl.Min := ((#tmpZt MOD #MSEC_TO_TG) MOD #MSEC_TO_STD) / #MSEC_TO_MIN;
|
|
||||||
|
|
||||||
// Umrechnung in Sekunden
|
|
||||||
#O_ZtDtl.Sec := (((#tmpZt MOD #MSEC_TO_TG) MOD #MSEC_TO_STD) MOD #MSEC_TO_MIN) / #MSEC_TO_SEC;
|
|
||||||
|
|
||||||
// Bestimmung der Millisekunden
|
|
||||||
#O_ZtDtl.Msec := (((#tmpZt MOD #MSEC_TO_TG) MOD #MSEC_TO_STD) MOD #MSEC_TO_MIN) MOD #MSEC_TO_SEC;
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,84 +0,0 @@
|
|||||||
FUNCTION "TimeToTgStdMinSecMsecDtl" : Void
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_Zt : Time;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Tg : DInt;
|
|
||||||
O_Std : DInt;
|
|
||||||
O_Min : DInt;
|
|
||||||
O_Sec : DInt;
|
|
||||||
O_Msec : DInt;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
tmpZt : DInt;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR CONSTANT
|
|
||||||
MSEC_TO_TG : DInt := 86400000;
|
|
||||||
MSEC_TO_STD : DInt := 3600000;
|
|
||||||
MSEC_TO_MIN : DInt := 60000;
|
|
||||||
MSEC_TO_SEC : DInt := 1000;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
15.10.2019 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################### Baustein Beschreibung #######################################
|
|
||||||
|
|
||||||
Abhängigkeiten (von anderen Fuktionen und Quellen):
|
|
||||||
- keine
|
|
||||||
|
|
||||||
Inputs:
|
|
||||||
- I_Zt : Zeit die umgerechnet werden soll
|
|
||||||
|
|
||||||
Outputs:
|
|
||||||
- O_Tg : Anteil der Tage der Eingangszeit
|
|
||||||
- O_Std : Anteil der Stunden der Eingangszeit
|
|
||||||
- O_Min : Anteil der Minuten der Eingangszeit
|
|
||||||
- O_Sec : Anteil der Sekunden der Eingangszeit
|
|
||||||
- O_Msec : Anteil der Millisekunden der Eingangszeit
|
|
||||||
|
|
||||||
In-\Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Return-Value:
|
|
||||||
-
|
|
||||||
|
|
||||||
Funktionsbeschreibung:
|
|
||||||
Umrechnung der Eingangszeit in Tage, Stunden, Minuten, Sekunden und Millisekunden.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
// Zeit in dint konvertieren
|
|
||||||
#tmpZt := TIME_TO_DINT(#I_Zt);
|
|
||||||
|
|
||||||
// Umrechung in Tage
|
|
||||||
#O_Tg := #tmpZt / #MSEC_TO_TG;
|
|
||||||
|
|
||||||
// Umrechnung in Stunden
|
|
||||||
#O_Std := (#tmpZt MOD #MSEC_TO_TG) / #MSEC_TO_STD;
|
|
||||||
|
|
||||||
// Umrechnung in Minuten
|
|
||||||
#O_Min := ((#tmpZt MOD #MSEC_TO_TG) MOD #MSEC_TO_STD) / #MSEC_TO_MIN;
|
|
||||||
|
|
||||||
// Umrechnung in Sekunden
|
|
||||||
#O_Sec := (((#tmpZt MOD #MSEC_TO_TG) MOD #MSEC_TO_STD) MOD #MSEC_TO_MIN) / #MSEC_TO_SEC;
|
|
||||||
|
|
||||||
// Bestimmung der Millisekunden
|
|
||||||
#O_Msec := (((#tmpZt MOD #MSEC_TO_TG) MOD #MSEC_TO_STD) MOD #MSEC_TO_MIN) MOD #MSEC_TO_SEC;
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
FUNCTION "ByteOfDWord" : Byte
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_In : DWord; // Eingangs-DWORD
|
|
||||||
I_N : Int; // Byte-Nr
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
04.03.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Beschreibung:
|
|
||||||
Der Funktion zerlegt ein Byte(I_In) in seine einzelnen Bits (O_B0 .. O_B7)
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#ByteOfDWord := DWORD_TO_BYTE(SHR(IN := #I_In, N := WORD_TO_INT(SHL(IN := INT_TO_WORD(#I_N), N := 3))));
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
FUNCTION "ByteToBits" : Void
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_In : Byte; // Eingangsbyte
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_B0 : Bool; // Bit 0
|
|
||||||
O_B1 : Bool; // Bit 1
|
|
||||||
O_B2 : Bool; // Bit 2
|
|
||||||
O_B3 : Bool; // Bit 3
|
|
||||||
O_B4 : Bool; // Bit 4
|
|
||||||
O_B5 : Bool; // Bit 5
|
|
||||||
O_B6 : Bool; // Bit 6
|
|
||||||
O_B7 : Bool; // Bit 7
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
x : Byte;
|
|
||||||
tx AT x : Array[0..7] of Bool;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
04.03.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Beschreibung:
|
|
||||||
Der Funktion zerlegt ein Byte(I_In) in seine einzelnen Bits (O_B0 .. O_B7)
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#x := #I_In;
|
|
||||||
|
|
||||||
#O_B0 := #tx[0];
|
|
||||||
#O_B1 := #tx[1];
|
|
||||||
#O_B2 := #tx[2];
|
|
||||||
#O_B3 := #tx[3];
|
|
||||||
#O_B4 := #tx[4];
|
|
||||||
#O_B5 := #tx[5];
|
|
||||||
#O_B6 := #tx[6];
|
|
||||||
#O_B7 := #tx[7];
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,200 +0,0 @@
|
|||||||
FUNCTION_BLOCK "CrcGen"
|
|
||||||
TITLE = 'CRC_GEN'
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
AUTHOR : hugo
|
|
||||||
FAMILY : LOGIC
|
|
||||||
NAME : CRCGEN
|
|
||||||
VERSION : 2.0
|
|
||||||
//
|
|
||||||
//CRC_GEN generates a CRC checksum from a block of data and returns the checksum in a DWORD to be connected to the data for transmission.
|
|
||||||
//the CRC Polynom is specified with the config variable PN and the length of the Polynom is specified by PL
|
|
||||||
//A Polynom x4 + X + 1 is represented by 0011 with length 4, the highest order bit is not specified at all..
|
|
||||||
//The input data is an array of byte of any size, the function is called by CRC_GEN(ADR(array),SIZEOF(array), ....).
|
|
||||||
//
|
|
||||||
//uses: REVERSE (FC310)
|
|
||||||
// REFLECT (FC426)
|
|
||||||
VAR_INPUT
|
|
||||||
PT : Pointer;
|
|
||||||
_PT { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} AT PT : Struct
|
|
||||||
DBNr { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Word;
|
|
||||||
Adr { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : DWord;
|
|
||||||
END_STRUCT;
|
|
||||||
SIZE : Int;
|
|
||||||
PL : Int;
|
|
||||||
PN : DWord;
|
|
||||||
INIT : DWord;
|
|
||||||
REV_IN : Bool;
|
|
||||||
REV_OUT : Bool;
|
|
||||||
XOR_OUT : DWord;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
CRC_GEN : DWord;
|
|
||||||
_CRC_GEN { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} AT CRC_GEN : Array[0..31] of Bool;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
pos : Int;
|
|
||||||
shift : Int;
|
|
||||||
dx : Byte;
|
|
||||||
_dx AT dx : Array[0..7] of Bool;
|
|
||||||
bits : Int;
|
|
||||||
rTEST_DB : Int;
|
|
||||||
Adr : Int;
|
|
||||||
DB_LENGTH : Word;
|
|
||||||
WRITE_PROT : Bool;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
04.03.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Beschreibung:
|
|
||||||
Die Funktion generiert eine CRC-Checksumme aus einen beliebig großen Array of Byte. Beim Aufruf
|
|
||||||
wird der Funktion ein Pointer auf das zu bearbeitende Array und dessen Größe in Bytes übergeben.
|
|
||||||
Das Polynom kann ein beliebiges POLYNOM bis maximal 32 Bit Länge sein. Ein Polynom X³ + X² + 1
|
|
||||||
wird mit 101 dargestellt (1*X³ + 1*X² + 0*X¹ + 1* X⁰). Das höchstwertige Bit, in diesem Fall
|
|
||||||
1*X³ wird dabei im Polynom nicht angegeben den es ist immer eins. Es können Polynome bis X³²
|
|
||||||
(CRC 32) verarbeitet werden. Durch den Wert INIT kann dem CR eine Startwert übergeben werden,
|
|
||||||
üblich sind hier 0000 und FFFF. Der zu verwendende Startwert ist der in der Literatur übliche
|
|
||||||
„Direct Initial Value“. Der Eingan XOR_OUT legt fest mit welcher Bitfolge die Checksumme am Ende
|
|
||||||
mit XOR verknüpft wird. Die Eingänge REV_IN und REV_OUT legen die Bitfolge der Daten Fest.
|
|
||||||
Wenn REV_IN = TRUE wird jedes Byte mit LSB beginnend verarbeitet, REV_IN = FALSE wird jeweils
|
|
||||||
mit MSB begonnen. REV_OUT=TRUE dreht entsprechend die Bitfolge der Checksumme um. Der Bautein
|
|
||||||
benötigt eine Mindestlänge der zu verarbeitenden Daten von 4 Bytes, und ist nach oben nur durch
|
|
||||||
die maximale Array Größe begrenzt.
|
|
||||||
Die weiter unten folgende CRC Tabelle gibt nähere Auskunft über gebräuchliche CRC's und deren
|
|
||||||
Setup Daten für CrcGen. Aufgrund der Vielzahl von möglichen und auch gebräuchlichen CRC's ist
|
|
||||||
es uns nicht möglich eine vollständige Liste aufzuführen. Für weitergehende Recherchen ist die
|
|
||||||
Webseite http://regregex.bbcmicro.net/crc-catalogue.htm zu empfehlen.
|
|
||||||
Online Berechnungen zum testen sind mit folgendem Java Tool möglich:
|
|
||||||
http://zorc.breitbandkatze.de/crc.html
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(* Datenbaustein Testen *)
|
|
||||||
#rTEST_DB := TEST_DB(DB_NUMBER := #_PT.DBNr
|
|
||||||
, DB_LENGTH => #DB_LENGTH
|
|
||||||
, WRITE_PROT => #WRITE_PROT
|
|
||||||
);
|
|
||||||
|
|
||||||
// Ende wenn Test-DB <> 0 = Fehler
|
|
||||||
IF #rTEST_DB <> 0 THEN
|
|
||||||
RETURN;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Ende wenn DB zu klein
|
|
||||||
IF WORD_TO_INT(#DB_LENGTH) / 1 < #SIZE THEN
|
|
||||||
RETURN;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
#Adr := DWORD_TO_INT(SHR(IN := SHL(IN := #_PT.Adr, N := 8), N := 11));
|
|
||||||
|
|
||||||
// align polygon
|
|
||||||
#shift := 32 - #PL;
|
|
||||||
#PN := SHL(IN := #PN, N := #shift);
|
|
||||||
|
|
||||||
(* load first 4 bytes into register minimum message size is 4 bytes
|
|
||||||
for smaller messages fill with 0#s at the beginning*)
|
|
||||||
FOR #pos := 0 TO 3 DO
|
|
||||||
|
|
||||||
IF #REV_IN THEN
|
|
||||||
#CRC_GEN := SHL(IN := #CRC_GEN, N := 8) OR "Reverse"(WORD_TO_BLOCK_DB(#_PT.DBNr).DB(#Adr + #pos));
|
|
||||||
ELSE
|
|
||||||
#CRC_GEN := SHL(IN := #CRC_GEN, N := 8) OR WORD_TO_BLOCK_DB(#_PT.DBNr).DB(#Adr + #pos);
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
END_FOR;
|
|
||||||
#pos := 4;
|
|
||||||
|
|
||||||
// XOR with #INIT value
|
|
||||||
#CRC_GEN := #CRC_GEN XOR SHL(IN := #INIT, N := #shift);
|
|
||||||
|
|
||||||
// calculate CRC FOR each byte
|
|
||||||
WHILE #pos < #SIZE DO
|
|
||||||
|
|
||||||
IF #REV_IN THEN
|
|
||||||
#dx := "Reverse"(WORD_TO_BLOCK_DB(#_PT.DBNr).DB(#Adr + #pos));
|
|
||||||
ELSE
|
|
||||||
#dx := WORD_TO_BLOCK_DB(#_PT.DBNr).DB(#Adr + #pos);
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
#pos := #pos + 1;
|
|
||||||
|
|
||||||
// crc calculation FOR one byte
|
|
||||||
FOR #bits := 0 TO 7 DO
|
|
||||||
|
|
||||||
IF #_CRC_GEN[7] THEN
|
|
||||||
#CRC_GEN := (SHL(IN := #CRC_GEN, N := 1) OR BOOL_TO_DWORD(#_dx[7])) XOR #PN;
|
|
||||||
ELSE
|
|
||||||
#CRC_GEN := SHL(IN := #CRC_GEN, N := 1) OR BOOL_TO_DWORD(#_dx[7]);
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
#dx := SHL(IN := #dx, N := 1);
|
|
||||||
|
|
||||||
END_FOR;
|
|
||||||
END_WHILE;
|
|
||||||
|
|
||||||
// all bytes are processed, need TO finish the registers 32 bits
|
|
||||||
FOR #bits := 0 TO 31 DO
|
|
||||||
IF #_CRC_GEN[7] THEN
|
|
||||||
#CRC_GEN := (SHL(IN := #CRC_GEN, N := 1) OR BOOL_TO_DWORD(#_dx[7])) XOR #PN;
|
|
||||||
ELSE
|
|
||||||
#CRC_GEN := SHL(IN := #CRC_GEN, N := 1) OR BOOL_TO_DWORD(#_dx[7]);
|
|
||||||
END_IF;
|
|
||||||
END_FOR;
|
|
||||||
|
|
||||||
// final XOR
|
|
||||||
#CRC_GEN := SHR(IN := #CRC_GEN, N := #shift) XOR #XOR_OUT;
|
|
||||||
|
|
||||||
// "Reverse" the crc_out put IF necessary
|
|
||||||
IF #REV_OUT THEN
|
|
||||||
#CRC_GEN := "Reflect"(I_D := #CRC_GEN,
|
|
||||||
I_L := #PL);
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
|
|
||||||
(* typical crc polynoms
|
|
||||||
|
|
||||||
CRC-4-ITU x4 + x + 1 (ITU G.704, p. 12) 0x3 or 0xC (0x9)
|
|
||||||
CRC-5-ITU x5 + x4 + x2 + 1 (ITU G.704, p. 9) 0x15 or 0x15 (0x0B) Bluetooth
|
|
||||||
CRC-5-USB x5 + x2 + 1 (use: USB token packets) 0x05 or 0x14 (0x9)
|
|
||||||
CRC-6-ITU x6 + x + 1 (ITU G.704, p. 3) 0x03 or 0x30 (0x21)
|
|
||||||
CRC-7 x7 + x3 + 1 (use: telecom systems, MMC) 0x09 or 0x48 (0x11)
|
|
||||||
CRC-8-ATM x8 + x2 + x + 1 (use: ATM HEC) 0x07 or 0xE0 (0xC1)
|
|
||||||
CRC-8-CCITT x8 + x7 + x3 + x2 + 1 (use: 1-Wire bus) 0x8D or 0xB1 (0x63)
|
|
||||||
CRC-8-Dallas/Maxim x8 + x5 + x4 + 1 (use: 1-Wire bus) 0x31 or 0x8C (0x19)
|
|
||||||
CRC-8 x8 + x7 + x6 + x4 + x2 + 1 0xD5 or 0xAB (0x57)
|
|
||||||
CRC-8-SAE J1850 x8 + x4 + x3 + x2 + 1 0x1D or 0xB8
|
|
||||||
CRC-10 x10 + x9 + x5 + x4 + x + 1 0x233 or 0x331 (0x263)
|
|
||||||
CRC-12 x12 + x11 + x3 + x2 + x + 1 (use: telecom systems) 0x80F or 0xF01 (0xE03)
|
|
||||||
CRC-15-CAN x15 + x14 + x10 + x8 + x7 + x4 + x3 + 1 0x4599 or 0x4CD1 (0x19A3)
|
|
||||||
CRC-16-Fletcher Not a CRC; see Fletcher's checksum Used in Adler-32 A & B CRCs
|
|
||||||
CRC-16-CCITT x16 + x12 + x5 + 1 (XMODEM,X.25, V.41, Bluetooth, PPP, IrDA; known as "CRC-CCITT") 0x1021 or 0x8408 (0x0811)
|
|
||||||
CRC-16-IBM x16 + x15 + x2 + 1 (USB, many others; also known as "CRC-16") 0x8005 or 0xA001 (0x4003)
|
|
||||||
CRC-24-Radix-64 x24 + x23 + x18 + x17 + x14 + x11 + x10 + x7 + x6 + x5 + x4 + x3 + x + 1 0x864CFB or 0xDF3261 (0xBE64C3)
|
|
||||||
CRC-32-Adler Not a CRC; see Adler-32 See Adler-32
|
|
||||||
CRC-32-MPEG2 x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1 0x04C11DB7 or 0xEDB88320 (0xDB710641) Also used in IEEE 802.3
|
|
||||||
CRC-32-IEEE 802.3 x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1 (V.42) 0x04C11DB7 or 0xEDB88320 (0xDB710641)
|
|
||||||
CRC-32C (Castagnoli) x32 + x28 + x27 + x26 + x25 + x23 + x22 + x20 + x19 + x18 + x14 + x13 + x11 + x10 + x9 + x8 + x6 + 1 0x1EDC6F41 or 0x82F63B78 (0x05EC76F1)
|
|
||||||
CRC-64-ISO x64 + x4 + x3 + x + 1 (use: ISO 3309) 0x000000000000001B or 0xD800000000000000 (0xB000000000000001)
|
|
||||||
CRC-64-ECMA-182 x64 + x62 + x57 + x55 + x54 + x53 + x52 + x47 + x46 + x45 + x40 + x39 + x38 + x37 + x35 + x33 + x32 + x31 + x29 + x27 + x24 + x23 + x22 + x21 + x19 + x17 + x13 + x12 + x10 + x9 + x7 + x4 + x + 1
|
|
||||||
(as described in ECMA-182 p.63) 0x42F0E1EBA9EA3693 or 0xC96C5795D7870F42 (0x92D8AF2BAF0E1E85)
|
|
||||||
*)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
FUNCTION "Reflect" : DWord
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_D : DWord; // Eingangswert
|
|
||||||
I_L : Int; // Anzahl der zu drehenden Bits
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
tD : DWord;
|
|
||||||
i : Int;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
04.03.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Beschreibung:
|
|
||||||
Die Funktion dreht die Reihenfolge der durch die Anzahl I_L spezifzierten Bits-
|
|
||||||
Bits in einem DWORD um. Die höherwertigen Bits als die durch die Länge
|
|
||||||
I_L spezifzierten bleiben unverändert.
|
|
||||||
|
|
||||||
Beispiel:
|
|
||||||
REVERSE(10101010 00000000 11111111 10011110, 8)
|
|
||||||
ergibt 10101010 00000000 11111111 01111001
|
|
||||||
|
|
||||||
Beispiel:
|
|
||||||
REVERSE(10101010 00000000 11111111 10011110, 32)
|
|
||||||
ergibt 01111001 11111111 00000000 01010101
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#tD := #I_D;
|
|
||||||
#Reflect := 0;
|
|
||||||
|
|
||||||
FOR #i := 1 TO #I_L DO
|
|
||||||
|
|
||||||
#Reflect := SHL(IN := #Reflect, N := 1) OR (#tD AND DW#16#0000_0001); //BOOL_TO_DWORD(D.0);
|
|
||||||
#tD := SHR(IN := #tD, N := 1);
|
|
||||||
|
|
||||||
END_FOR;
|
|
||||||
|
|
||||||
#Reflect := #Reflect OR SHL(IN := #tD, N := #I_L);
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
FUNCTION "Reverse" : Byte
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_In : Byte; // Eingangswert
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
04.03.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Beschreibung:
|
|
||||||
Die Funktion dreht die Reihenfolge in einem Byte um. Bit 7 von I_In wir zu Bit 0, Bit 6 wird
|
|
||||||
zu Bit 1 usw.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#Reverse := SHL(IN := #I_In, N := 7) OR SHR(IN := #I_In, N := 7) OR (ROR(IN := #I_In, N := 3) AND 2#01000100) OR (ROL(IN := #I_In, N := 3) AND 2#00100010)OR (SHL(IN := #I_In, N := 1) AND 2#00010000) OR (SHR(IN := #I_In, N := 1) AND 2#00001000);
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,117 +0,0 @@
|
|||||||
FUNCTION_BLOCK "Schichtpl.Mgt"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_GplSchichten : Any; // geplante Schichten
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_SchichtStrt : Time; // Produktion startet in x
|
|
||||||
O_SchichtEnd : Time; // Produktion Ende seit x
|
|
||||||
O_Prdkt : Bool; // Produktion
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
tmpPrdktEnd { S7_HMI_Visible := 'False'} : Date_And_Time;
|
|
||||||
flnkPrdktEnd { S7_HMI_Visible := 'False'} : "Flnk";
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
actSysZt : Date_And_Time; // aktuelle Systemzeit
|
|
||||||
err : Int; // Fehler von Systemzeit auslesen
|
|
||||||
adrOffset : Int; // Adress-Offset
|
|
||||||
adrLng : Int; // Adress-Länge
|
|
||||||
noElements : Int; // Anzahl der Elemente
|
|
||||||
i : Int; // Schleifenzähler
|
|
||||||
pTmpData : Any; // Pointer Tmp-Daten
|
|
||||||
pTmpDataAny AT pTmpData : "Any.T_AnyPoint"; // Pointer Tmp-Daten Detail
|
|
||||||
tmpSchicht : Array[0..1] of "Schichtpl.T_Schicht"; // Tmp Schichten
|
|
||||||
strtGef : Bool; // Start gefunden
|
|
||||||
endGef : Bool; // Ende gefunden
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
07.03.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
???
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
// aktuelle Systemzeit auslesen
|
|
||||||
#err := RD_SYS_T(#actSysZt);
|
|
||||||
|
|
||||||
// Produktionsende
|
|
||||||
#flnkPrdktEnd(I_Val := #O_Prdkt); // Flankenauswertung
|
|
||||||
|
|
||||||
IF #flnkPrdktEnd.O_FlnkNeg THEN
|
|
||||||
#tmpPrdktEnd := #actSysZt; // Zeitstempel Produktionsende speichern
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
|
|
||||||
// Any-Pointer initialisieren
|
|
||||||
#pTmpData := #I_GplSchichten;
|
|
||||||
|
|
||||||
// Offseet bestimmen
|
|
||||||
#adrOffset := "Any.GetOffset"(#I_GplSchichten);
|
|
||||||
|
|
||||||
// Länge berechnen des gesamten Datenbereichs
|
|
||||||
#adrLng := "Any.NoOfBytes"(#I_GplSchichten);
|
|
||||||
|
|
||||||
// Anzahl der Einzelelemente/Typen bestimmen
|
|
||||||
#noElements := "Any.NoOfBytes"(#I_GplSchichten) / "Any.NoOfBytes"(#tmpSchicht);
|
|
||||||
|
|
||||||
// Länge des Typs eintragen
|
|
||||||
#pTmpDataAny.DataCount := #adrLng / #noElements * 2;
|
|
||||||
|
|
||||||
#strtGef := false;
|
|
||||||
#endGef := false;
|
|
||||||
|
|
||||||
|
|
||||||
FOR #i := 0 TO #noElements - 2 DO
|
|
||||||
|
|
||||||
// Daten zum Kopieren zusammenstellen
|
|
||||||
#pTmpDataAny.BytePointer := dw#16#84000000 OR SHL(IN := WORD_TO_DWORD(INT_TO_WORD(#adrOffset + #adrLng / #noElements * #i)), N := 3); // Byte-Adresse in Pointer laden
|
|
||||||
#err := BLKMOV(SRCBLK := #pTmpData, DSTBLK => #tmpSchicht);
|
|
||||||
|
|
||||||
IF #tmpSchicht[0].Strt > DT#1990-1-1-00:00:00 AND #tmpSchicht[0].End > DT#1990-1-1-00:00:00 THEN
|
|
||||||
|
|
||||||
// Schicht Start finden
|
|
||||||
IF (#tmpSchicht[0].Strt > #actSysZt OR (#tmpSchicht[1].Strt > #actSysZt AND #tmpSchicht[0].Strt < #actSysZt)) AND NOT #strtGef THEN
|
|
||||||
|
|
||||||
#O_SchichtStrt := #tmpSchicht[0].Strt - #actSysZt; // Zeit bis Schichtstart
|
|
||||||
#strtGef := true;
|
|
||||||
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Schicht Ende finden
|
|
||||||
IF #tmpSchicht[0].End <> #tmpSchicht[1].Strt AND #strtGef AND NOT #endGef AND #O_Prdkt THEN
|
|
||||||
|
|
||||||
#O_SchichtEnd := #tmpSchicht[0].End - #actSysZt;
|
|
||||||
#endGef := true;
|
|
||||||
|
|
||||||
ELSIF NOT #O_Prdkt THEN
|
|
||||||
#O_SchichtEnd := #tmpPrdktEnd - #actSysZt;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
END_FOR;
|
|
||||||
|
|
||||||
#O_Prdkt := #O_SchichtStrt < t#0ms;
|
|
||||||
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
TYPE "Schichtpl.T_Schicht"
|
|
||||||
VERSION : 0.1
|
|
||||||
STRUCT
|
|
||||||
Schicht : Char; // Schicht F = Frühschicht, S= Spätschicht, N = Nachtschicht
|
|
||||||
Strt : Date_And_Time; // Schichtbeginn
|
|
||||||
End : Date_And_Time; // Schichtende
|
|
||||||
END_STRUCT;
|
|
||||||
|
|
||||||
END_TYPE
|
|
||||||
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
TYPE "Schichtpl.T_Schichten"
|
|
||||||
VERSION : 0.1
|
|
||||||
STRUCT
|
|
||||||
Schichten : Array[0..9] of "Schichtpl.T_Schicht"; // geplante Schichten
|
|
||||||
END_STRUCT;
|
|
||||||
|
|
||||||
END_TYPE
|
|
||||||
|
|
||||||
@@ -1,114 +0,0 @@
|
|||||||
FUNCTION_BLOCK "SigGen"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_Rst : Bool; // Reset der Ausgangssignale
|
|
||||||
I_Amp : Real; // Amplitude des Signals
|
|
||||||
I_Offs : Real; // Signal Offset
|
|
||||||
I_ZylZtSig : DInt; // Periode des Signals in ms
|
|
||||||
I_ZylZtOb : Int; // Zykluszeit des OBs in ms
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Rec : Real; // Rechteck-Signal
|
|
||||||
O_Sz : Real; // Sägezahn-Signal
|
|
||||||
O_Dr : Real; // Dreieck-Signal
|
|
||||||
O_Sin : Real; // Sinus-Signal
|
|
||||||
O_Cnt : DInt; // Zähler-Signal
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
nloop : DInt; // Schleifenzähler
|
|
||||||
loop_max : DInt; // Anzahl der Schritte in einem Durchlauf -> Sinus
|
|
||||||
loop_half : DInt; // hal of the number for the signal in one piriod -> Rectangle, Sawtooth
|
|
||||||
nsaw : DInt; // Schrittzähler für Sägezahn-Signal
|
|
||||||
ntri : DInt; // Schrittzähler für Dreieck-Signal
|
|
||||||
ntri_max : DInt; // max. Schritte für Dreieck-Signal
|
|
||||||
tri_dir : Bool; // toggel bit für positives/negatives Zählen Dreieck-Signal
|
|
||||||
nsin : DInt; // Schrittzähler für Sinus-Signal
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
24.02.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
// Program
|
|
||||||
#loop_max := ROUND(DINT_TO_REAL(#I_ZylZtSig) / INT_TO_REAL(#I_ZylZtOb)); //number of steps needed for the complete periodic time -> Sinus
|
|
||||||
#loop_half := ROUND(DINT_TO_REAL(#I_ZylZtSig) / (real#2.0 * INT_TO_REAL(#I_ZylZtOb))); // number of steps needed for the half periodic time -> Rectangle, Sawtooth
|
|
||||||
#ntri_max := ROUND(DINT_TO_REAL(#loop_half) / real#2.0); // setting maximum for the Triangle signal to the half, counter is going to the negativ maximum as well
|
|
||||||
|
|
||||||
|
|
||||||
// Reset of all output values if RESET is TRUE
|
|
||||||
IF #I_Rst = TRUE THEN
|
|
||||||
#O_Rec := 0.0;
|
|
||||||
#O_Dr := 0.0;
|
|
||||||
#O_Sz := 0.0;
|
|
||||||
#O_Sin := 0.0;
|
|
||||||
#O_Cnt := 0;
|
|
||||||
#nloop := 0;
|
|
||||||
#nsaw := 0;
|
|
||||||
#ntri := 0;
|
|
||||||
#tri_dir := FALSE;
|
|
||||||
#nsin := 0;
|
|
||||||
ELSE
|
|
||||||
//
|
|
||||||
// Building the output values
|
|
||||||
//
|
|
||||||
#O_Cnt := #nloop; // set output to the actual number of the loop counter
|
|
||||||
// Loop counter to build the positive and negative oscilation
|
|
||||||
IF #nloop < #loop_half THEN
|
|
||||||
#O_Rec := #I_Offs + #I_Amp; // Rectangle-Signal is set to high
|
|
||||||
ELSE
|
|
||||||
#O_Rec := #I_Offs - #I_Amp; // Rectangle-Signal is set to low
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
#nloop := #nloop + 1; // increment each time if the FB is startet
|
|
||||||
|
|
||||||
IF #nloop = #loop_max THEN // set loop counter to zero at the end of the piriod
|
|
||||||
#nloop := 0;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Building the Sawtooth Signal
|
|
||||||
#O_Sz := #I_Offs + #I_Amp * DINT_TO_REAL(#nsaw) / DINT_TO_REAL(#loop_half);
|
|
||||||
#nsaw := #nsaw + 1; // increment counter used for the Sawtooth signal
|
|
||||||
IF #nsaw = #loop_half THEN
|
|
||||||
#nsaw := 0;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Building the Triangle Signal
|
|
||||||
#O_Dr := #I_Amp * DINT_TO_REAL(#ntri) / DINT_TO_REAL(#ntri_max);
|
|
||||||
|
|
||||||
IF #tri_dir = FALSE THEN // check dircetion for the counter
|
|
||||||
#ntri := #ntri + 1; // build poistive ramp
|
|
||||||
ELSE
|
|
||||||
#ntri := #ntri - 1; // build negative ramp
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
IF #ntri >= #ntri_max THEN // toggle the direction to build the triangle signal to negativ ramp
|
|
||||||
#tri_dir := TRUE;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
IF #ntri <= (-1 * #ntri_max) THEN // toggle the direction to build the triangle signal to positive ramp
|
|
||||||
#tri_dir := FALSE;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
|
|
||||||
// Building the Sinus Signal (counting up until 2*PI)
|
|
||||||
#O_Sin := #I_Offs + #I_Amp * SIN(real#6.283185 * DINT_TO_REAL(#nsin) / DINT_TO_REAL(#loop_max));
|
|
||||||
#nsin := #nsin + 1; // increment counter for the
|
|
||||||
IF #nsin = #loop_max THEN // set counter to 0 if full periodic is reached
|
|
||||||
#nsin := 0;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
END_IF;
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
TYPE "Trend.T_Trend"
|
|
||||||
VERSION : 0.1
|
|
||||||
STRUCT
|
|
||||||
Q : Bool; // I_X steigend = TRUE
|
|
||||||
TU : Bool; // TRUE wenn sich Eingang I_X erhöht
|
|
||||||
TD : Bool; // TRUE wenn sich Eingang I_X reduziert
|
|
||||||
D : Real; // Deltas der Eingangsänderung
|
|
||||||
END_STRUCT;
|
|
||||||
|
|
||||||
END_TYPE
|
|
||||||
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
TYPE "Trend.T_Trend_DINT"
|
|
||||||
VERSION : 0.1
|
|
||||||
STRUCT
|
|
||||||
Q : Bool; // I_X steigend = TRUE
|
|
||||||
TU : Bool; // TRUE wenn sich Eingang I_X erhöht
|
|
||||||
TD : Bool; // TRUE wenn sich Eingang I_X reduziert
|
|
||||||
D : DInt; // Deltas der Eingangsänderung
|
|
||||||
END_STRUCT;
|
|
||||||
|
|
||||||
END_TYPE
|
|
||||||
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
FUNCTION_BLOCK "Trend"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_X : Real; // Eingangssignal
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Data : "Trend.T_Trend";
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
lastX : Real;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
16.02.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Funktion überwacht den Eingang I_X und zeigt am Ausgang O_Data.Q an ob I_X steigt (O_Data.Q
|
|
||||||
= TRUE) oder I_X fällt (O_Data.Q = FALSE). wenn sich I_X nicht verändert bleibt O_Data.Q auf
|
|
||||||
seinen letzten Wert stehen. Erhöht sich I_X so wird der Ausgang O_Data.TU für
|
|
||||||
einen Zyklus TRUE und am Ausgang D wird I_X – lastX angezeigt. Ist I_X
|
|
||||||
niedriger als lastX so wird O_Data.TD für einen Zyklus TRUE und am Ausgang O_Data.D
|
|
||||||
wird lastX – I_X ausgegeben. lastX ist ein interner Wert des Bausteins
|
|
||||||
und ist der Wert von I_X im letzten Zyklus.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#O_Data.TU := #I_X > #lastX;
|
|
||||||
#O_Data.TD := #I_X < #lastX;
|
|
||||||
#O_Data.Q := #O_Data.TU OR #O_Data.TD;
|
|
||||||
#O_Data.D := #I_X - #lastX;
|
|
||||||
|
|
||||||
#lastX := #I_X;
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
FUNCTION_BLOCK "TrendEx"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_X : Real; // Eingangssignal
|
|
||||||
I_N : Int; // Anzahl der Mittelwerte
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Q : "Trend.T_Trend"; // I_X steigend = TRUE
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
fltMav : "FltMav_Real"; // Moving Average Filter
|
|
||||||
tmpX : Real;
|
|
||||||
lastX : Real;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
16.02.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Funktion überwacht den Eingang I_X und zeigt am Ausgang O_Data.Q an ob I_X steigt (O_Data.Q
|
|
||||||
= TRUE) oder I_X fällt (O_Data.Q = FALSE). wenn sich I_X nicht verändert bleibt O_Data.Q auf
|
|
||||||
seinen letzten Wert stehen. Erhöht sich I_X so wird der Ausgang O_Data.TU für
|
|
||||||
einen Zyklus TRUE und am Ausgang D wird I_X – lastX angezeigt. Ist I_X
|
|
||||||
niedriger als lastX so wird O_Data.TD für einen Zyklus TRUE und am Ausgang O_Data.D
|
|
||||||
wird lastX – I_X ausgegeben. lastX ist ein interner Wert des Bausteins
|
|
||||||
und ist der Wert von I_X im letzten Zyklus.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
// Mittelwertbildung
|
|
||||||
#fltMav(I_X:=#I_X,
|
|
||||||
I_N:=#I_N,
|
|
||||||
O_Y=>#tmpX);
|
|
||||||
|
|
||||||
// Auswertung
|
|
||||||
#O_Q.TU := #tmpX > #lastX;
|
|
||||||
#O_Q.TD := #tmpX < #lastX;
|
|
||||||
#O_Q.Q := #O_Q.TU OR #O_Q.TD;
|
|
||||||
#O_Q.D := #tmpX - #lastX;
|
|
||||||
|
|
||||||
#lastX := #tmpX;
|
|
||||||
|
|
||||||
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
FUNCTION_BLOCK "TrendEx_DINT"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_X : DInt; // Eingangssignal
|
|
||||||
I_N : Int; // Anzahl der Mittelwerte
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Q : "Trend.T_Trend_DINT"; // I_X steigend = TRUE
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
fltMav : "FltMav"; // Moving Average Filter
|
|
||||||
tmpX : DInt;
|
|
||||||
lastX : DInt;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
16.02.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Funktion überwacht den Eingang I_X und zeigt am Ausgang O_Data.Q an ob I_X steigt (O_Data.Q
|
|
||||||
= TRUE) oder I_X fällt (O_Data.Q = FALSE). wenn sich I_X nicht verändert bleibt O_Data.Q auf
|
|
||||||
seinen letzten Wert stehen. Erhöht sich I_X so wird der Ausgang O_Data.TU für
|
|
||||||
einen Zyklus TRUE und am Ausgang D wird I_X – lastX angezeigt. Ist I_X
|
|
||||||
niedriger als lastX so wird O_Data.TD für einen Zyklus TRUE und am Ausgang O_Data.D
|
|
||||||
wird lastX – I_X ausgegeben. lastX ist ein interner Wert des Bausteins
|
|
||||||
und ist der Wert von I_X im letzten Zyklus.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
// Mittelwertbildung
|
|
||||||
#fltMav(I_X:=#I_X,
|
|
||||||
I_N:=#I_N,
|
|
||||||
O_Y=>#tmpX);
|
|
||||||
|
|
||||||
// Auswertung
|
|
||||||
#O_Q.TU := #tmpX > #lastX;
|
|
||||||
#O_Q.TD := #tmpX < #lastX;
|
|
||||||
#O_Q.Q := #O_Q.TU OR #O_Q.TD;
|
|
||||||
#O_Q.D := #tmpX - #lastX;
|
|
||||||
|
|
||||||
#lastX := #tmpX;
|
|
||||||
|
|
||||||
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
FUNCTION_BLOCK "Trend_DINT"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_X : DInt; // Eingangssignal
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Data : "Trend.T_Trend_DINT";
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
lastX : DInt;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
16.02.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Funktion überwacht den Eingang I_X und zeigt am Ausgang O_Data.Q an ob I_X steigt (O_Data.Q
|
|
||||||
= TRUE) oder I_X fällt (O_Data.Q = FALSE). wenn sich I_X nicht verändert bleibt O_Data.Q auf
|
|
||||||
seinen letzten Wert stehen. Erhöht sich I_X so wird der Ausgang O_Data.TU für
|
|
||||||
einen Zyklus TRUE und am Ausgang D wird I_X – lastX angezeigt. Ist I_X
|
|
||||||
niedriger als lastX so wird O_Data.TD für einen Zyklus TRUE und am Ausgang O_Data.D
|
|
||||||
wird lastX – I_X ausgegeben. lastX ist ein interner Wert des Bausteins
|
|
||||||
und ist der Wert von I_X im letzten Zyklus.
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#O_Data.TU := #I_X > #lastX;
|
|
||||||
#O_Data.TD := #I_X < #lastX;
|
|
||||||
#O_Data.Q := #O_Data.TU OR #O_Data.TD;
|
|
||||||
#O_Data.D := #I_X - #lastX;
|
|
||||||
|
|
||||||
#lastX := #I_X;
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
FUNCTION "BlkMovExt" : Int
|
|
||||||
TITLE = 'Memory Compare'
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
AUTHOR : Smiffy
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_DbName : Any;
|
|
||||||
I_DbNo : Int;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
pIN1 : Any; // DB address ANY pointer - used for accessing DB data
|
|
||||||
pAnyIN1 AT pIN1 : Struct // Diassembled ANY pointer structure
|
|
||||||
S7Code : Byte; // Code for S7 (fixed at 16#10)
|
|
||||||
DataType : Byte; // Code for data type
|
|
||||||
Length : Int; // Repetition factor = Send/receive length
|
|
||||||
DBNumber : Int; // Data block Number
|
|
||||||
MemoryArea : Byte; // Specified memory area = 0x84 = data block
|
|
||||||
ByteAddressMSB : Byte; // Byte address most significant bits
|
|
||||||
ByteAddressLSB : Word; // Byte address least significant bits
|
|
||||||
END_STRUCT;
|
|
||||||
pIN2 : Any; // DB address ANY pointer - used for accessing DB data
|
|
||||||
pAnyIN2 AT pIN2 : Struct // Diassembled ANY pointer structure
|
|
||||||
S7Code : Byte; // Code for S7 (fixed at 16#10)
|
|
||||||
DataType : Byte; // Code for data type
|
|
||||||
Length : Int; // Repetition factor = Send/receive length
|
|
||||||
DBNumber : Int; // Data block Number
|
|
||||||
MemoryArea : Byte; // Specified memory area = 0x84 = data block
|
|
||||||
ByteAddressMSB : Byte; // Byte address most significant bits
|
|
||||||
ByteAddressLSB : Word; // Byte address least significant bits
|
|
||||||
END_STRUCT;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
08.12.2020 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#pIN1 := #I_DbName;
|
|
||||||
|
|
||||||
#pIN2 := #pIN1;
|
|
||||||
#pAnyIN2.DBNumber := #I_DbNo;
|
|
||||||
|
|
||||||
#BlkMovExt := BLKMOV(SRCBLK:=#pIN1, DSTBLK=>#pIN2);
|
|
||||||
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,118 +0,0 @@
|
|||||||
FUNCTION "MemCmp" : Bool
|
|
||||||
TITLE = 'Memory Compare'
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
AUTHOR : Smiffy
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_In1 : Any; // Quelle 1
|
|
||||||
I_In2 : Any; // Quelle 2
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
retVal : Int;
|
|
||||||
in1End : DInt; // End addresses for memory areas
|
|
||||||
in2End : DInt; // End addresses for memory areas
|
|
||||||
tst1 : Byte;
|
|
||||||
tst2 : Byte;
|
|
||||||
memPtr : DInt; // Current memory pointer
|
|
||||||
pIN1 : Any; // DB address ANY pointer - used for accessing DB data
|
|
||||||
pAnyIN1 AT pIN1 : Struct // Diassembled ANY pointer structure
|
|
||||||
S7Code : Byte; // Code for S7 (fixed at 16#10)
|
|
||||||
DataType : Byte; // Code for data type
|
|
||||||
Length : Int; // Repetition factor = Send/receive length
|
|
||||||
DBNumber : Int; // Data block Number
|
|
||||||
MemoryArea : Byte; // Specified memory area = 0x84 = data block
|
|
||||||
ByteAddressMSB : Byte; // Byte address most significant bits
|
|
||||||
ByteAddressLSB : Word; // Byte address least significant bits
|
|
||||||
END_STRUCT;
|
|
||||||
u1Addr : DInt; // Union pointer for calculation of byte offset address
|
|
||||||
u1 AT u1Addr : Struct // This is equivalent to a union in 'c' dword goes in and word / byte LSB / byte MSB come out
|
|
||||||
ByteAddrLSBPad : Byte; // Not Used
|
|
||||||
ByteAddrMSB : Byte; // Byte address most significant bits
|
|
||||||
WordAddr : Word; // Byte address least significant bits
|
|
||||||
END_STRUCT;
|
|
||||||
pIN2 : Any; // DB address ANY pointer - used for accessing DB data
|
|
||||||
pAnyIN2 AT pIN2 : Struct // Diassembled ANY pointer structure
|
|
||||||
S7Code : Byte; // Code for S7 (fixed at 16#10)
|
|
||||||
DataType : Byte; // Code for data type
|
|
||||||
Length : Int; // Repetition factor = Send/receive length
|
|
||||||
DBNumber : Int; // Data block Number
|
|
||||||
MemoryArea : Byte; // Specified memory area = 0x84 = data block
|
|
||||||
ByteAddressMSB : Byte; // Byte address most significant bits
|
|
||||||
ByteAddressLSB : Word; // Byte address least significant bits
|
|
||||||
END_STRUCT;
|
|
||||||
u2Addr : DInt; // Union pointer for calculation of byte offset address
|
|
||||||
u2 AT u2Addr : Struct // This is equivalent to a union in 'c' dword goes in and word / byte LSB / byte MSB come out
|
|
||||||
ByteAddrLSBPad : Byte; // Not Used
|
|
||||||
ByteAddrMSB : Byte; // Byte address most significant bits
|
|
||||||
WordAddr : Word; // Byte address least significant bits
|
|
||||||
END_STRUCT;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
24.11.2020 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Funktion vergleicht zwei Speicherbereiche (IN1, IN2). Sind die Bereiche gleich, liefert
|
|
||||||
die Funktion eine "true" ansonsten ein "false".
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#pIN1 := #I_In1;
|
|
||||||
#pAnyIN1.DataType := 16#02;
|
|
||||||
#u1.ByteAddrMSB := #pAnyIN1.ByteAddressMSB;
|
|
||||||
#u1.WordAddr := #pAnyIN1.ByteAddressLSB;
|
|
||||||
#in1End := #u1Addr + (#pAnyIN1.Length * 8);
|
|
||||||
#pAnyIN1.Length := 1;
|
|
||||||
|
|
||||||
#pIN2 := #I_In2;
|
|
||||||
#pAnyIN2.DataType := 16#02;
|
|
||||||
#u2.ByteAddrMSB := #pAnyIN2.ByteAddressMSB;
|
|
||||||
#u2.WordAddr := #pAnyIN2.ByteAddressLSB;
|
|
||||||
#in2End := #u2Addr + (#pAnyIN2.Length * 8);
|
|
||||||
#pAnyIN2.Length := 1;
|
|
||||||
|
|
||||||
WHILE (#u1Addr < #in1End) AND (#u2Addr < #in2End) DO
|
|
||||||
#retVal := BLKMOV(SRCBLK := #pIN1, DSTBLK => #tst1);
|
|
||||||
IF #retVal <> 0 THEN
|
|
||||||
#MemCmp := FALSE;
|
|
||||||
RETURN;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
#retVal := BLKMOV(SRCBLK := #pIN2, DSTBLK => #tst2);
|
|
||||||
|
|
||||||
IF #retVal <> 0 THEN
|
|
||||||
#MemCmp := FALSE;
|
|
||||||
RETURN;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
IF #tst1 <> #tst2 THEN
|
|
||||||
#MemCmp := FALSE;
|
|
||||||
RETURN;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
#u1Addr := #u1Addr + 8;
|
|
||||||
#pAnyIN1.ByteAddressMSB := #u1.ByteAddrMSB;
|
|
||||||
#pAnyIN1.ByteAddressLSB := #u1.WordAddr;
|
|
||||||
#u2Addr := #u2Addr + 8;
|
|
||||||
#pAnyIN2.ByteAddressMSB := #u2.ByteAddrMSB;
|
|
||||||
#pAnyIN2.ByteAddressLSB := #u2.WordAddr;
|
|
||||||
END_WHILE;
|
|
||||||
|
|
||||||
#MemCmp := TRUE;
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
FUNCTION "MemCmpExt" : Bool
|
|
||||||
TITLE = 'Memory Compare'
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
AUTHOR : Smiffy
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_DbName : Any;
|
|
||||||
I_DbNo : Int;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Len : Word;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
pIN1 : Any; // DB address ANY pointer - used for accessing DB data
|
|
||||||
pAnyIN1 AT pIN1 : Struct // Diassembled ANY pointer structure
|
|
||||||
S7Code : Byte; // Code for S7 (fixed at 16#10)
|
|
||||||
DataType : Byte; // Code for data type
|
|
||||||
Length : Int; // Repetition factor = Send/receive length
|
|
||||||
DBNumber : Int; // Data block Number
|
|
||||||
MemoryArea : Byte; // Specified memory area = 0x84 = data block
|
|
||||||
ByteAddressMSB : Byte; // Byte address most significant bits
|
|
||||||
ByteAddressLSB : Word; // Byte address least significant bits
|
|
||||||
END_STRUCT;
|
|
||||||
pIN2 : Any; // DB address ANY pointer - used for accessing DB data
|
|
||||||
pAnyIN2 AT pIN2 : Struct // Diassembled ANY pointer structure
|
|
||||||
S7Code : Byte; // Code for S7 (fixed at 16#10)
|
|
||||||
DataType : Byte; // Code for data type
|
|
||||||
Length : Int; // Repetition factor = Send/receive length
|
|
||||||
DBNumber : Int; // Data block Number
|
|
||||||
MemoryArea : Byte; // Specified memory area = 0x84 = data block
|
|
||||||
ByteAddressMSB : Byte; // Byte address most significant bits
|
|
||||||
ByteAddressLSB : Word; // Byte address least significant bits
|
|
||||||
END_STRUCT;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
03.12.2020 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#pIN1 := #I_DbName;
|
|
||||||
|
|
||||||
#pIN2 := #pIN1;
|
|
||||||
#pAnyIN2.DBNumber := #I_DbNo;
|
|
||||||
|
|
||||||
#MemCmpExt := "MemCmp"(I_In1:=#pIN1,
|
|
||||||
I_In2:=#pIN2
|
|
||||||
);
|
|
||||||
|
|
||||||
#O_Len := INT_TO_WORD(#pAnyIN1.Length);
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,176 +0,0 @@
|
|||||||
FUNCTION "MemCmpOpt" : Bool
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_In1 : Any; // Quelle 1
|
|
||||||
I_In2 : Any; // Quelle 2
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
in1End : DInt; // End addresses for memory areas
|
|
||||||
in2End : DInt; // End addresses for memory areas
|
|
||||||
pIN1 : Any; // DB address ANY pointer - used for accessing DB data
|
|
||||||
pAnyIN1 AT pIN1 : Struct // Diassembled ANY pointer structure
|
|
||||||
S7Code : Byte; // Code for S7 (fixed at 16#10)
|
|
||||||
DataType : Byte; // Code for data type
|
|
||||||
Length : Int; // Repetition factor = Send/receive length
|
|
||||||
DBNumber : Int; // Data block Number
|
|
||||||
MemoryArea : Byte; // Specified memory area = 0x84 = data block
|
|
||||||
ByteAddressMSB : Byte; // Byte address most significant bits
|
|
||||||
ByteAddressLSB : Word; // Byte address least significant bits
|
|
||||||
END_STRUCT;
|
|
||||||
u1Addr : DInt; // Union pointer for calculation of byte offset address
|
|
||||||
u1 AT u1Addr : Struct // This is equivalent to a union in 'c' dword goes in and word / byte LSB / byte MSB come out
|
|
||||||
ByteAddrLSBPad : Byte; // Not Used
|
|
||||||
ByteAddrMSB : Byte; // Byte address most significant bits
|
|
||||||
WordAddr : Word; // Byte address least significant bits
|
|
||||||
END_STRUCT;
|
|
||||||
pIN2 : Any; // DB address ANY pointer - used for accessing DB data
|
|
||||||
pAnyIN2 AT pIN2 : Struct // Diassembled ANY pointer structure
|
|
||||||
S7Code : Byte; // Code for S7 (fixed at 16#10)
|
|
||||||
DataType : Byte; // Code for data type
|
|
||||||
Length : Int; // Repetition factor = Send/receive length
|
|
||||||
DBNumber : Int; // Data block Number
|
|
||||||
MemoryArea : Byte; // Specified memory area = 0x84 = data block
|
|
||||||
ByteAddressMSB : Byte; // Byte address most significant bits
|
|
||||||
ByteAddressLSB : Word; // Byte address least significant bits
|
|
||||||
END_STRUCT;
|
|
||||||
u2Addr : DInt; // Union pointer for calculation of byte offset address
|
|
||||||
u2 AT u2Addr : Struct // This is equivalent to a union in 'c' dword goes in and word / byte LSB / byte MSB come out
|
|
||||||
ByteAddrLSBPad : Byte; // Not Used
|
|
||||||
ByteAddrMSB : Byte; // Byte address most significant bits
|
|
||||||
WordAddr : Word; // Byte address least significant bits
|
|
||||||
END_STRUCT;
|
|
||||||
step : Int; // Schrittweite für die Adressen
|
|
||||||
tmpDWord : Array[0..1] of DWord; // temporäres Doppelwort zum Zwischenspeichern
|
|
||||||
tmpData : Struct // temporäre Daten
|
|
||||||
data : DInt; // Adresse
|
|
||||||
dbNo : Word; // Datenbaustein Nummer
|
|
||||||
memArea : Int; // Speicherbereich
|
|
||||||
END_STRUCT;
|
|
||||||
i : Int; // Zählervariable
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR CONSTANT
|
|
||||||
LEN_DW : Int := 4; // Doppelwort
|
|
||||||
LEN_W : Int := 2; // Wort
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
11.01.2020 0.0 St. Maier Neuerstellung
|
|
||||||
06.03.2021 1.0 St. Maier Schrittweitenberechnung angepasst
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Beschreibung:
|
|
||||||
|
|
||||||
Die Funktion vergleicht den Inhalte zweier Datenbereiche (IN1, IN2). Sind die Datenbausteinge
|
|
||||||
gleich, liefert die Funktion eine "true" ansonsten ein "false".
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#pIN1 := #I_In1;
|
|
||||||
#u1.ByteAddrMSB := #pAnyIN1.ByteAddressMSB;
|
|
||||||
#u1.WordAddr := #pAnyIN1.ByteAddressLSB;
|
|
||||||
#in1End := WORD_TO_INT(#u1.WordAddr) / 8 + #pAnyIN1.Length;
|
|
||||||
#u1Addr := #u1Addr / 8;
|
|
||||||
|
|
||||||
#pIN2 := #I_In2;
|
|
||||||
#u2.ByteAddrMSB := #pAnyIN2.ByteAddressMSB;
|
|
||||||
#u2.WordAddr := #pAnyIN2.ByteAddressLSB;
|
|
||||||
#in2End := WORD_TO_INT(#u2.WordAddr) / 8 + #pAnyIN2.Length;
|
|
||||||
#u2Addr := #u2Addr / 8;
|
|
||||||
|
|
||||||
// Schrittweiten berechnen
|
|
||||||
IF #pAnyIN1.Length / #LEN_DW >= 1 AND #pAnyIN2.Length / #LEN_DW >= 1 THEN
|
|
||||||
#step := #LEN_DW;
|
|
||||||
ELSE
|
|
||||||
#step := #LEN_W;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
WHILE (#u1Addr < #in1End) AND (#u2Addr < #in2End) DO
|
|
||||||
|
|
||||||
FOR #i := 0 TO 1 DO
|
|
||||||
|
|
||||||
CASE #i OF
|
|
||||||
0: // Parameter Eingangspointer 1
|
|
||||||
#tmpData.data := #u1Addr; // Adresse zwischenspeichern
|
|
||||||
#tmpData.dbNo := INT_TO_WORD(#pAnyIN1.DBNumber); // Datenbaustein-Nr. zwischenspeichern
|
|
||||||
#tmpData.memArea := WORD_TO_INT(#pAnyIN1.MemoryArea); // Speicherbereich
|
|
||||||
|
|
||||||
1: // Parameter Eingangspointer 2
|
|
||||||
#tmpData.data := #u2Addr; // Adresse zwischenspeichern
|
|
||||||
#tmpData.dbNo := INT_TO_WORD(#pAnyIN2.DBNumber); // Datenbaustein-Nr. zwischenspeichern
|
|
||||||
#tmpData.memArea := WORD_TO_INT(#pAnyIN2.MemoryArea); // Speicherbereich
|
|
||||||
|
|
||||||
END_CASE;
|
|
||||||
|
|
||||||
CASE #tmpData.memArea OF
|
|
||||||
|
|
||||||
129: // Eingänge (0x81)
|
|
||||||
IF #step = #LEN_DW THEN // Doppelwort
|
|
||||||
#tmpDWord[#i] := %ED(#tmpData.data);
|
|
||||||
ELSE
|
|
||||||
#tmpDWord[#i] := %EW(#tmpData.data);
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
130: // Ausgänge (0x82)
|
|
||||||
IF #step = #LEN_DW THEN // Doppelwort
|
|
||||||
#tmpDWord[#i] := %AD(#tmpData.data);
|
|
||||||
ELSE
|
|
||||||
#tmpDWord[#i] := %AW(#tmpData.data);
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
131: // Merkerbereich (0x83)
|
|
||||||
IF #step = #LEN_DW THEN // Doppelwort
|
|
||||||
#tmpDWord[#i] := %MD(#tmpData.data);
|
|
||||||
ELSE
|
|
||||||
#tmpDWord[#i] := %MW(#tmpData.data);
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
132,132: // Datenbaustein (0x84)
|
|
||||||
IF #step = #LEN_DW THEN // Doppelwort
|
|
||||||
#tmpDWord[#i] := WORD_TO_BLOCK_DB(#tmpData.dbNo).DD(#tmpData.data);
|
|
||||||
ELSE
|
|
||||||
#tmpDWord[#i] := WORD_TO_BLOCK_DB(#tmpData.dbNo).DW(#tmpData.data);
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
ELSE // Statement section ELSE
|
|
||||||
#MemCmpOpt := FALSE;
|
|
||||||
RETURN;
|
|
||||||
|
|
||||||
END_CASE;
|
|
||||||
|
|
||||||
END_FOR;
|
|
||||||
|
|
||||||
// Daten vergleichen
|
|
||||||
IF #tmpDWord[0] <> #tmpDWord[1] THEN
|
|
||||||
#MemCmpOpt := FALSE;
|
|
||||||
RETURN;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Schrittweite am Ende des Datenbereichs bestimmen
|
|
||||||
IF #in1End - #u1Addr < #LEN_DW OR #in2End - #u2Addr < #LEN_DW THEN
|
|
||||||
#step := #LEN_W;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Adressen inkrementieren
|
|
||||||
#u1Addr := #u1Addr + #step;
|
|
||||||
#u2Addr := #u2Addr + #step;
|
|
||||||
|
|
||||||
END_WHILE;
|
|
||||||
|
|
||||||
#MemCmpOpt := TRUE;
|
|
||||||
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
FUNCTION "MemCmpOptExt" : Bool
|
|
||||||
TITLE = 'Memory Compare'
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
AUTHOR : Smiffy
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_DbName : Any;
|
|
||||||
I_DbNo : Int;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Len : Word;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
pIN1 : Any; // DB address ANY pointer - used for accessing DB data
|
|
||||||
pAnyIN1 AT pIN1 : Struct // Diassembled ANY pointer structure
|
|
||||||
S7Code : Byte; // Code for S7 (fixed at 16#10)
|
|
||||||
DataType : Byte; // Code for data type
|
|
||||||
Length : Int; // Repetition factor = Send/receive length
|
|
||||||
DBNumber : Int; // Data block Number
|
|
||||||
MemoryArea : Byte; // Specified memory area = 0x84 = data block
|
|
||||||
ByteAddressMSB : Byte; // Byte address most significant bits
|
|
||||||
ByteAddressLSB : Word; // Byte address least significant bits
|
|
||||||
END_STRUCT;
|
|
||||||
pIN2 : Any; // DB address ANY pointer - used for accessing DB data
|
|
||||||
pAnyIN2 AT pIN2 : Struct // Diassembled ANY pointer structure
|
|
||||||
S7Code : Byte; // Code for S7 (fixed at 16#10)
|
|
||||||
DataType : Byte; // Code for data type
|
|
||||||
Length : Int; // Repetition factor = Send/receive length
|
|
||||||
DBNumber : Int; // Data block Number
|
|
||||||
MemoryArea : Byte; // Specified memory area = 0x84 = data block
|
|
||||||
ByteAddressMSB : Byte; // Byte address most significant bits
|
|
||||||
ByteAddressLSB : Word; // Byte address least significant bits
|
|
||||||
END_STRUCT;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
19.01.2021 0.0 St. Maier Neuerstellung
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
#pIN1 := #I_DbName;
|
|
||||||
|
|
||||||
#pIN2 := #pIN1;
|
|
||||||
#pAnyIN2.DBNumber := #I_DbNo;
|
|
||||||
|
|
||||||
#MemCmpOptExt := "MemCmpOpt"(I_In1 := #pIN1,
|
|
||||||
I_In2 := #pIN2
|
|
||||||
);
|
|
||||||
|
|
||||||
#O_Len := INT_TO_WORD(#pAnyIN1.Length);
|
|
||||||
END_FUNCTION
|
|
||||||
|
|
||||||
@@ -1,228 +0,0 @@
|
|||||||
FUNCTION_BLOCK "Chronometer"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
AUTHOR : FSI
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_Enable : Bool;
|
|
||||||
I_Reset : Bool;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_OUTPUT
|
|
||||||
O_Days : DInt;
|
|
||||||
O_Out : Time;
|
|
||||||
O_Reset : Bool;
|
|
||||||
O_Overflow : Bool;
|
|
||||||
O_DataInconsistence : Bool;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
lastDateAndTime : Date_And_Time;
|
|
||||||
t_0 { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} AT lastDateAndTime : Struct
|
|
||||||
Y { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Byte;
|
|
||||||
M { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Byte;
|
|
||||||
D { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Byte;
|
|
||||||
H { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Byte;
|
|
||||||
MI { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Byte;
|
|
||||||
S { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Byte;
|
|
||||||
CS { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Byte;
|
|
||||||
MS { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Byte;
|
|
||||||
END_STRUCT;
|
|
||||||
actualDateAndTime : Date_And_Time;
|
|
||||||
t_1 { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} AT actualDateAndTime : Struct
|
|
||||||
Y { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Byte;
|
|
||||||
M { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Byte;
|
|
||||||
D { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Byte;
|
|
||||||
H { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Byte;
|
|
||||||
MI { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Byte;
|
|
||||||
S { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Byte;
|
|
||||||
CS { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Byte;
|
|
||||||
MS { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Byte;
|
|
||||||
END_STRUCT;
|
|
||||||
firstScan : Bool;
|
|
||||||
day0 : DInt;
|
|
||||||
day1 : DInt;
|
|
||||||
deltaDay : DInt;
|
|
||||||
time0 : DInt;
|
|
||||||
time1 : DInt;
|
|
||||||
deltaTime : DInt;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
rv : Int;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
|
|
||||||
|
|
||||||
(*############################################################################
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
21.03.2019 0.0 St. Maier Neuerstellung
|
|
||||||
11.10.2019 0.1 St. Maier Überarbeitung Kopf damit TIA kompatibel
|
|
||||||
############################################################################*)
|
|
||||||
|
|
||||||
ENO := true;
|
|
||||||
|
|
||||||
// Reset
|
|
||||||
#O_Reset := #I_Reset;
|
|
||||||
|
|
||||||
IF #I_Reset = true THEN
|
|
||||||
|
|
||||||
#O_Days := 0;
|
|
||||||
#O_Out := DINT_TO_TIME(0);
|
|
||||||
#O_Overflow := 0;
|
|
||||||
#O_DataInconsistence := false;
|
|
||||||
#firstScan := true;
|
|
||||||
#day0 := 0;
|
|
||||||
#day1 := 0;
|
|
||||||
#deltaDay := 0;
|
|
||||||
#time0 := 0;
|
|
||||||
#time1 := 0;
|
|
||||||
#deltaTime := 0;
|
|
||||||
|
|
||||||
ELSIF #I_Enable = true THEN
|
|
||||||
|
|
||||||
IF #firstScan= true THEN
|
|
||||||
|
|
||||||
#rv := RD_SYS_T(OUT => #lastDateAndTime);
|
|
||||||
|
|
||||||
#time0 := INT_TO_DINT(WORD_TO_INT(BYTE_TO_WORD(#t_0.MS))/16*10 + WORD_TO_INT(BYTE_TO_WORD(#t_0.MS))MOD 16)/10;
|
|
||||||
#time0 := #time0 + INT_TO_DINT(WORD_TO_INT(BYTE_TO_WORD(#t_0.CS))/16*10 + WORD_TO_INT(BYTE_TO_WORD(#t_0.CS))MOD 16)*10;
|
|
||||||
#time0 := #time0 + INT_TO_DINT(WORD_TO_INT(BYTE_TO_WORD(#t_0.S ))/16*10 + WORD_TO_INT(BYTE_TO_WORD(#t_0.S ))MOD 16)*1000;
|
|
||||||
#time0 := #time0 + INT_TO_DINT(WORD_TO_INT(BYTE_TO_WORD(#t_0.MI))/16*10 + WORD_TO_INT(BYTE_TO_WORD(#t_0.MI))MOD 16)*60000;
|
|
||||||
#time0 := #time0 + INT_TO_DINT(WORD_TO_INT(BYTE_TO_WORD(#t_0.H ))/16*10 + WORD_TO_INT(BYTE_TO_WORD(#t_0.H ))MOD 16)*3600000;
|
|
||||||
|
|
||||||
// Tage lesen
|
|
||||||
#day0 := INT_TO_DINT(WORD_TO_INT(BYTE_TO_WORD(#t_0.D ))/16*10 + WORD_TO_INT(BYTE_TO_WORD(#t_0.D ))MOD 16);
|
|
||||||
#day0 := #day0 + INT_TO_DINT(WORD_TO_INT(BYTE_TO_WORD(#t_0.Y ))/16*10 + WORD_TO_INT(BYTE_TO_WORD(#t_0.Y ))MOD 16)*365;
|
|
||||||
#day0 := #day0 + INT_TO_DINT(WORD_TO_INT(BYTE_TO_WORD(#t_0.Y ))/16*10 + WORD_TO_INT(BYTE_TO_WORD(#t_0.Y ))MOD 16)/4;
|
|
||||||
|
|
||||||
IF (WORD_TO_INT(BYTE_TO_WORD(#t_0.Y ))/16*10 + WORD_TO_INT(BYTE_TO_WORD(#t_0.Y ))MOD 16)MOD 4=0 THEN
|
|
||||||
|
|
||||||
CASE WORD_TO_INT(BYTE_TO_WORD(#t_0.M)) OF
|
|
||||||
1: #day0 := #day0 + 0;
|
|
||||||
2: #day0 := #day0 + 31;
|
|
||||||
3: #day0 := #day0 + 60;
|
|
||||||
4: #day0 := #day0 + 91;
|
|
||||||
5: #day0 := #day0 + 121;
|
|
||||||
6: #day0 := #day0 + 152;
|
|
||||||
7: #day0 := #day0 + 182;
|
|
||||||
8: #day0 := #day0 + 213;
|
|
||||||
9: #day0 := #day0 + 244;
|
|
||||||
16: #day0 := #day0 + 274;
|
|
||||||
17: #day0 := #day0 + 305;
|
|
||||||
18: #day0 := #day0 + 335;
|
|
||||||
ELSE:
|
|
||||||
#O_DataInconsistence := TRUE;
|
|
||||||
END_CASE;
|
|
||||||
|
|
||||||
ELSE
|
|
||||||
|
|
||||||
CASE WORD_TO_INT(BYTE_TO_WORD(#t_0.M)) OF
|
|
||||||
1: #day0 := #day0 + 0;
|
|
||||||
2: #day0 := #day0 + 31;
|
|
||||||
3: #day0 := #day0 + 59;
|
|
||||||
4: #day0 := #day0 + 90;
|
|
||||||
5: #day0 := #day0 + 120;
|
|
||||||
6: #day0 := #day0 + 151;
|
|
||||||
7: #day0 := #day0 + 181;
|
|
||||||
8: #day0 := #day0 + 212;
|
|
||||||
9: #day0 := #day0 + 243;
|
|
||||||
16: #day0 := #day0 + 273;
|
|
||||||
17: #day0 := #day0 + 304;
|
|
||||||
18: #day0 := #day0 + 334;
|
|
||||||
ELSE:
|
|
||||||
#O_DataInconsistence := TRUE;
|
|
||||||
END_CASE;
|
|
||||||
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
#firstScan := FALSE;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
#rv := RD_SYS_T(OUT => #actualDateAndTime);
|
|
||||||
|
|
||||||
// Read time / Zeit lesen
|
|
||||||
#time1 := INT_TO_DINT(WORD_TO_INT(BYTE_TO_WORD(#t_1.MS))/ 16 * 10 + WORD_TO_INT(BYTE_TO_WORD(#t_1.MS))MOD 16) / 10;
|
|
||||||
#time1 := #time1 + INT_TO_DINT(WORD_TO_INT(BYTE_TO_WORD(#t_1.CS))/ 16 * 10 + WORD_TO_INT(BYTE_TO_WORD(#t_1.CS))MOD 16) * 10;
|
|
||||||
#time1 := #time1 + INT_TO_DINT(WORD_TO_INT(BYTE_TO_WORD(#t_1.S ))/ 16 * 10 + WORD_TO_INT(BYTE_TO_WORD(#t_1.S ))MOD 16) * 1000;
|
|
||||||
#time1 := #time1 + INT_TO_DINT(WORD_TO_INT(BYTE_TO_WORD(#t_1.MI))/ 16 * 10 + WORD_TO_INT(BYTE_TO_WORD(#t_1.MI))MOD 16) * 60000;
|
|
||||||
#time1 := #time1 + INT_TO_DINT(WORD_TO_INT(BYTE_TO_WORD(#t_1.H ))/ 16 * 10 + WORD_TO_INT(BYTE_TO_WORD(#t_1.H ))MOD 16) * 3600000;
|
|
||||||
|
|
||||||
// Read days / Tage lesen
|
|
||||||
#day1 := INT_TO_DINT(WORD_TO_INT(BYTE_TO_WORD(#t_1.D ))/ 16 * 10 + WORD_TO_INT(BYTE_TO_WORD(#t_1.D ))MOD 16);
|
|
||||||
#day1 := #day1 + INT_TO_DINT(WORD_TO_INT(BYTE_TO_WORD(#t_1.Y ))/ 16 * 10 + WORD_TO_INT(BYTE_TO_WORD(#t_1.Y ))MOD 16) * 365;
|
|
||||||
#day1 := #day1 + INT_TO_DINT(WORD_TO_INT(BYTE_TO_WORD(#t_1.Y ))/ 16 * 10 + WORD_TO_INT(BYTE_TO_WORD(#t_1.Y ))MOD 16) / 4;
|
|
||||||
|
|
||||||
IF (WORD_TO_INT(BYTE_TO_WORD(#t_1.Y ))/ 16 * 10 + WORD_TO_INT(BYTE_TO_WORD(#t_1.Y ))MOD 16)MOD 4 = 0 THEN
|
|
||||||
|
|
||||||
CASE WORD_TO_INT(BYTE_TO_WORD(#t_1.M)) OF
|
|
||||||
1: #day1 := #day1 + 0;
|
|
||||||
2: #day1 := #day1 + 31;
|
|
||||||
3: #day1 := #day1 + 60;
|
|
||||||
4: #day1 := #day1 + 91;
|
|
||||||
5: #day1 := #day1 + 121;
|
|
||||||
6: #day1 := #day1 + 152;
|
|
||||||
7: #day1 := #day1 + 182;
|
|
||||||
8: #day1 := #day1 + 213;
|
|
||||||
9: #day1 := #day1 + 244;
|
|
||||||
16: #day1 := #day1 + 274;
|
|
||||||
17: #day1 := #day1 + 305;
|
|
||||||
18: #day1 := #day1 + 335;
|
|
||||||
ELSE:
|
|
||||||
#O_DataInconsistence := TRUE;
|
|
||||||
END_CASE;
|
|
||||||
|
|
||||||
ELSE
|
|
||||||
|
|
||||||
CASE WORD_TO_INT(BYTE_TO_WORD(#t_1.M)) OF
|
|
||||||
1: #day1 := #day1 + 0;
|
|
||||||
2: #day1 := #day1 + 31;
|
|
||||||
3: #day1 := #day1 + 59;
|
|
||||||
4: #day1 := #day1 + 90;
|
|
||||||
5: #day1 := #day1 + 120;
|
|
||||||
6: #day1 := #day1 + 151;
|
|
||||||
7: #day1 := #day1 + 181;
|
|
||||||
8: #day1 := #day1 + 212;
|
|
||||||
9: #day1 := #day1 + 243;
|
|
||||||
16: #day1 := #day1 + 273;
|
|
||||||
17: #day1 := #day1 + 304;
|
|
||||||
18: #day1 := #day1 + 334;
|
|
||||||
ELSE:
|
|
||||||
#O_DataInconsistence := TRUE;
|
|
||||||
END_CASE;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Berechne die abgelaufene Zeit und die Tage
|
|
||||||
#deltaTime := #time1 - #time0;
|
|
||||||
#deltaDay := 0;
|
|
||||||
|
|
||||||
WHILE #deltaTime > 86400000 DO
|
|
||||||
#deltaTime := #deltaTime - 86400000;
|
|
||||||
#deltaDay := #deltaDay + 1;
|
|
||||||
END_WHILE;
|
|
||||||
|
|
||||||
WHILE #deltaTime < 0 DO
|
|
||||||
#deltaTime := #deltaTime + 86400000;
|
|
||||||
#deltaDay := #deltaDay - 1;
|
|
||||||
END_WHILE;
|
|
||||||
|
|
||||||
#deltaDay := #deltaDay + #day1 - #day0;
|
|
||||||
|
|
||||||
IF #deltaDay < 0 THEN
|
|
||||||
#O_DataInconsistence := TRUE;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
#O_Out := DINT_TO_TIME(#deltaTime);
|
|
||||||
#O_Days := #deltaDay;
|
|
||||||
|
|
||||||
ELSE
|
|
||||||
#firstScan := TRUE;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,168 +0,0 @@
|
|||||||
FUNCTION_BLOCK "SkLfztUebw.Main"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_StepNr : Int; // aktuelle Schrittnummer
|
|
||||||
"I_STIME.tx" : DWord; // Zeit
|
|
||||||
I_LfztUebw : Any; // Register Schrittzeiten
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
zylZt : Time; // zuletzt gemessene Zykluszeit
|
|
||||||
tx : Time; // aktuelle Systemzeit
|
|
||||||
anyFlt : Word; // Fehler beim Bestimmen der Länge
|
|
||||||
stepNrs : DInt; // Anzahl der Schritte
|
|
||||||
zylZtSum : DInt; // Summe der Zykluszeiten
|
|
||||||
tempStepZt : "SkLfztUebw.T_Lfzt"; // Temp Variable zur Bestimmung der Anzahl Schritte
|
|
||||||
tempGesStepZt : "SkLfztUebw.T_Lfzt";
|
|
||||||
flkStep : "Flnk.NrVal"; // Flankenauswertung bei Schritt-Nr. Änderung
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
TOP_SI : Struct
|
|
||||||
EV_CLASS : Byte;
|
|
||||||
EV_NUM : Byte;
|
|
||||||
PRIORITY : Byte;
|
|
||||||
NUM : Byte;
|
|
||||||
TYP2_3 : Byte;
|
|
||||||
TYP1 : Byte;
|
|
||||||
ZI1 : Word;
|
|
||||||
ZI2_3 : DWord;
|
|
||||||
END_STRUCT;
|
|
||||||
START_UP_SI : Struct
|
|
||||||
EV_CLASS : Byte;
|
|
||||||
EV_NUM : Byte;
|
|
||||||
PRIORITY : Byte;
|
|
||||||
NUM : Byte;
|
|
||||||
TYP2_3 : Byte;
|
|
||||||
TYP1 : Byte;
|
|
||||||
ZI1 : Word;
|
|
||||||
ZI2_3 : DWord;
|
|
||||||
END_STRUCT;
|
|
||||||
err : Int;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR CONSTANT
|
|
||||||
GES_ZT : Int := 0;
|
|
||||||
STEP01 : Int := 1;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
23.09.2019 0.0 St. Maier Neuerstellung
|
|
||||||
11.10.2019 0.1 St. Maier Überarbeitung Kopf damit TIA kompatibel
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################### Baustein Beschreibung #######################################
|
|
||||||
|
|
||||||
Abhängigkeiten (von anderen Fuktionen und Quellen):
|
|
||||||
- RD_SINFO
|
|
||||||
- CpuZeit
|
|
||||||
|
|
||||||
Inputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
In-\Outputs:
|
|
||||||
- IO_ZylZtShiftReg: Schieberegister für Zykluszeiten
|
|
||||||
|
|
||||||
Return-Value:
|
|
||||||
-
|
|
||||||
|
|
||||||
Funktionsbeschreibung:
|
|
||||||
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(* aktuelle Startinformationen auslesen *)
|
|
||||||
(* OB1_SCAN_1 BYTE - B#16#01: Abschluss des Neustarts (Warmstarts)
|
|
||||||
- B#16#02: Abschluss des Wiederanlaufs
|
|
||||||
- B#16#03: Abschluss des freien Zyklus
|
|
||||||
- B#16#04: Abschluss des Kaltstarts
|
|
||||||
- B#16#05: Erster OB 1-Zyklus der neuen Master-CPU nach
|
|
||||||
Master-Reserve-Umschaltung und STOP des
|
|
||||||
bisherigen Masters *)
|
|
||||||
#err := RD_SINFO(TOP_SI => #TOP_SI
|
|
||||||
, START_UP_SI => #START_UP_SI
|
|
||||||
);
|
|
||||||
|
|
||||||
// Zurücksetzen der letzten Zykluszeit bei System start
|
|
||||||
IF #TOP_SI.EV_NUM <> 3 THEN
|
|
||||||
#zylZt := t#0ms;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Infos wie Array-Länge von Schieberegister bestimmen
|
|
||||||
#anyFlt := "Any.Struct"(I_UDT := #tempStepZt
|
|
||||||
, I_StartBitAndRange := #I_LfztUebw
|
|
||||||
, O_DataCount => #stepNrs
|
|
||||||
);
|
|
||||||
|
|
||||||
// Funktion beenden, wenn Schritt 0 oder Schritt-Nr. größer als max. Schrittanzahl am Eingang ansteht
|
|
||||||
IF #I_StepNr = #GES_ZT OR #I_StepNr >= (#stepNrs) THEN
|
|
||||||
|
|
||||||
#zylZt := t#0ms;
|
|
||||||
RETURN;
|
|
||||||
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Flankenauswertung bei Schritt-Nr. Änderungen
|
|
||||||
#flkStep(I_Val := #I_StepNr// IN: DINT
|
|
||||||
);
|
|
||||||
|
|
||||||
// Flanke bei Schrittwechsel
|
|
||||||
IF #flkStep.O_Flnk THEN
|
|
||||||
|
|
||||||
// Schrittzeit zurücksetzen
|
|
||||||
//IO_LfztUebw.Data[#I_StepNr].lfztAkt := t#0ms;
|
|
||||||
#tempStepZt.lfztAkt := t#0ms;
|
|
||||||
|
|
||||||
// Gesamt-Zeit der Schrittkette bei Schritt 1 zurücksetzen
|
|
||||||
IF #I_StepNr = #STEP01 THEN
|
|
||||||
|
|
||||||
//IO_LfztUebw.Data[I_CONST_STEPS.GES_ZT].lfztAkt := t#0ms;
|
|
||||||
#tempGesStepZt.lfztAkt := t#0ms;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
#tx := DINT_TO_TIME(DWORD_TO_DINT(#"I_STIME.tx")) - #zylZt;
|
|
||||||
|
|
||||||
// Gesamt- und Schrittzeitbestimmung
|
|
||||||
IF #zylZt > t#0ms THEN
|
|
||||||
|
|
||||||
// Gesamt-Zeit Bestimmung
|
|
||||||
//IO_LfztUebw.Data[I_CONST_STEPS.GES_ZT].lfztAkt := IO_LfztUebw.Data[I_CONST_STEPS.GES_ZT].lfztAkt + #tx;
|
|
||||||
#tempGesStepZt.lfztAkt := #tempGesStepZt.lfztAkt + #tx;
|
|
||||||
|
|
||||||
"UdtInAnyKop"(I_SrcUdtAry:= #tempGesStepZt,
|
|
||||||
I_DestUdtAry:=#I_LfztUebw ,
|
|
||||||
I_DestIndex:=0,
|
|
||||||
O_Ret=> #err);
|
|
||||||
|
|
||||||
|
|
||||||
// Schrittzeit Bestimmung
|
|
||||||
//IO_LfztUebw.Data[#I_StepNr].lfztAkt := IO_LfztUebw.Data[#I_StepNr].lfztAkt + #tx;
|
|
||||||
#tempStepZt.lfztAkt := #tempStepZt.lfztAkt + #tx;
|
|
||||||
|
|
||||||
"UdtInAnyKop"(I_SrcUdtAry:= #tempStepZt,
|
|
||||||
I_DestUdtAry:=#I_LfztUebw ,
|
|
||||||
I_DestIndex:=#I_StepNr,
|
|
||||||
O_Ret=> #err);
|
|
||||||
|
|
||||||
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
#zylZt := #zylZt + #tx;
|
|
||||||
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,168 +0,0 @@
|
|||||||
FUNCTION_BLOCK "SkLfztUebw.Main_1"
|
|
||||||
{ S7_Optimized_Access := 'FALSE' }
|
|
||||||
VERSION : 0.1
|
|
||||||
VAR_INPUT
|
|
||||||
I_StepNr : Int; // aktuelle Schrittnummer
|
|
||||||
"I_STIME.tx" : DWord; // Zeit
|
|
||||||
I_LfztUebw : Any; // Register Schrittzeiten
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR
|
|
||||||
zylZt : Time; // zuletzt gemessene Zykluszeit
|
|
||||||
tx : Time; // aktuelle Systemzeit
|
|
||||||
anyFlt : Word; // Fehler beim Bestimmen der Länge
|
|
||||||
stepNrs : DInt; // Anzahl der Schritte
|
|
||||||
zylZtSum : DInt; // Summe der Zykluszeiten
|
|
||||||
tempStepZt : "SkLfztUebw.T_Lfzt"; // Temp Variable zur Bestimmung der Anzahl Schritte
|
|
||||||
tempGesStepZt : "SkLfztUebw.T_Lfzt";
|
|
||||||
flkStep : "Flnk.NrVal"; // Flankenauswertung bei Schritt-Nr. Änderung
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR_TEMP
|
|
||||||
TOP_SI : Struct
|
|
||||||
EV_CLASS : Byte;
|
|
||||||
EV_NUM : Byte;
|
|
||||||
PRIORITY : Byte;
|
|
||||||
NUM : Byte;
|
|
||||||
TYP2_3 : Byte;
|
|
||||||
TYP1 : Byte;
|
|
||||||
ZI1 : Word;
|
|
||||||
ZI2_3 : DWord;
|
|
||||||
END_STRUCT;
|
|
||||||
START_UP_SI : Struct
|
|
||||||
EV_CLASS : Byte;
|
|
||||||
EV_NUM : Byte;
|
|
||||||
PRIORITY : Byte;
|
|
||||||
NUM : Byte;
|
|
||||||
TYP2_3 : Byte;
|
|
||||||
TYP1 : Byte;
|
|
||||||
ZI1 : Word;
|
|
||||||
ZI2_3 : DWord;
|
|
||||||
END_STRUCT;
|
|
||||||
err : Int;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
VAR CONSTANT
|
|
||||||
GES_ZT : Int := 0;
|
|
||||||
STEP01 : Int := 1;
|
|
||||||
END_VAR
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
(*#################################################################################################
|
|
||||||
|
|
||||||
Copyright (c) Fondium Singen GmbH
|
|
||||||
|
|
||||||
### Änderungshistorie ###
|
|
||||||
|
|
||||||
Datum: Version: Bearbeiter: Beschreibung:
|
|
||||||
23.09.2019 0.0 St. Maier Neuerstellung
|
|
||||||
11.10.2019 0.1 St. Maier Überarbeitung Kopf damit TIA kompatibel
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(*################################### Baustein Beschreibung #######################################
|
|
||||||
|
|
||||||
Abhängigkeiten (von anderen Fuktionen und Quellen):
|
|
||||||
- RD_SINFO
|
|
||||||
- CpuZeit
|
|
||||||
|
|
||||||
Inputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
Outputs:
|
|
||||||
-
|
|
||||||
|
|
||||||
In-\Outputs:
|
|
||||||
- IO_ZylZtShiftReg: Schieberegister für Zykluszeiten
|
|
||||||
|
|
||||||
Return-Value:
|
|
||||||
-
|
|
||||||
|
|
||||||
Funktionsbeschreibung:
|
|
||||||
|
|
||||||
|
|
||||||
#################################################################################################*)
|
|
||||||
|
|
||||||
(* aktuelle Startinformationen auslesen *)
|
|
||||||
(* OB1_SCAN_1 BYTE - B#16#01: Abschluss des Neustarts (Warmstarts)
|
|
||||||
- B#16#02: Abschluss des Wiederanlaufs
|
|
||||||
- B#16#03: Abschluss des freien Zyklus
|
|
||||||
- B#16#04: Abschluss des Kaltstarts
|
|
||||||
- B#16#05: Erster OB 1-Zyklus der neuen Master-CPU nach
|
|
||||||
Master-Reserve-Umschaltung und STOP des
|
|
||||||
bisherigen Masters *)
|
|
||||||
#err := RD_SINFO(TOP_SI => #TOP_SI
|
|
||||||
, START_UP_SI => #START_UP_SI
|
|
||||||
);
|
|
||||||
|
|
||||||
// Zurücksetzen der letzten Zykluszeit bei System start
|
|
||||||
IF #TOP_SI.EV_NUM <> 3 THEN
|
|
||||||
#zylZt := t#0ms;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Infos wie Array-Länge von Schieberegister bestimmen
|
|
||||||
#anyFlt := "Any.Struct"(I_UDT := #tempStepZt
|
|
||||||
, I_StartBitAndRange := #I_LfztUebw
|
|
||||||
, O_DataCount => #stepNrs
|
|
||||||
);
|
|
||||||
|
|
||||||
// Funktion beenden, wenn Schritt 0 oder Schritt-Nr. größer als max. Schrittanzahl am Eingang ansteht
|
|
||||||
IF #I_StepNr = #GES_ZT OR #I_StepNr >= (#stepNrs) THEN
|
|
||||||
|
|
||||||
#zylZt := t#0ms;
|
|
||||||
RETURN;
|
|
||||||
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
// Flankenauswertung bei Schritt-Nr. Änderungen
|
|
||||||
#flkStep(I_Val := #I_StepNr// IN: DINT
|
|
||||||
);
|
|
||||||
|
|
||||||
// Flanke bei Schrittwechsel
|
|
||||||
IF #flkStep.O_Flnk THEN
|
|
||||||
|
|
||||||
// Schrittzeit zurücksetzen
|
|
||||||
//IO_LfztUebw.Data[#I_StepNr].lfztAkt := t#0ms;
|
|
||||||
#tempStepZt.lfztAkt := t#0ms;
|
|
||||||
|
|
||||||
// Gesamt-Zeit der Schrittkette bei Schritt 1 zurücksetzen
|
|
||||||
IF #I_StepNr = #STEP01 THEN
|
|
||||||
|
|
||||||
//IO_LfztUebw.Data[I_CONST_STEPS.GES_ZT].lfztAkt := t#0ms;
|
|
||||||
#tempGesStepZt.lfztAkt := t#0ms;
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
#tx := DINT_TO_TIME(DWORD_TO_DINT(#"I_STIME.tx")) - #zylZt;
|
|
||||||
|
|
||||||
// Gesamt- und Schrittzeitbestimmung
|
|
||||||
IF #zylZt > t#0ms THEN
|
|
||||||
|
|
||||||
// Gesamt-Zeit Bestimmung
|
|
||||||
//IO_LfztUebw.Data[I_CONST_STEPS.GES_ZT].lfztAkt := IO_LfztUebw.Data[I_CONST_STEPS.GES_ZT].lfztAkt + #tx;
|
|
||||||
#tempGesStepZt.lfztAkt := #tempGesStepZt.lfztAkt + #tx;
|
|
||||||
|
|
||||||
"UdtInAnyKop"(I_SrcUdtAry:= #tempGesStepZt,
|
|
||||||
I_DestUdtAry:=#I_LfztUebw ,
|
|
||||||
I_DestIndex:=0,
|
|
||||||
O_Ret=> #err);
|
|
||||||
|
|
||||||
|
|
||||||
// Schrittzeit Bestimmung
|
|
||||||
//IO_LfztUebw.Data[#I_StepNr].lfztAkt := IO_LfztUebw.Data[#I_StepNr].lfztAkt + #tx;
|
|
||||||
#tempStepZt.lfztAkt := #tempStepZt.lfztAkt + #tx;
|
|
||||||
|
|
||||||
"UdtInAnyKop"(I_SrcUdtAry:= #tempStepZt,
|
|
||||||
I_DestUdtAry:=#I_LfztUebw ,
|
|
||||||
I_DestIndex:=#I_StepNr,
|
|
||||||
O_Ret=> #err);
|
|
||||||
|
|
||||||
|
|
||||||
END_IF;
|
|
||||||
|
|
||||||
#zylZt := #zylZt + #tx;
|
|
||||||
|
|
||||||
END_FUNCTION_BLOCK
|
|
||||||
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
TYPE "SkLfztUebw.T_Lfzt"
|
|
||||||
VERSION : 0.1
|
|
||||||
STRUCT
|
|
||||||
lfztMin : Time; // minimale zulässige Laufzeit
|
|
||||||
lfztMax : Time; // maximale zulässige Laufzeit
|
|
||||||
lfztAkt : Time; // aktelle Laufzeit
|
|
||||||
END_STRUCT;
|
|
||||||
|
|
||||||
END_TYPE
|
|
||||||
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user