Αναβαθμισμένη Έκδοση Προγραμματισμού Siemens SCL: 12 Πρακτικές Βιομηχανικές Περιπτώσεις
2025-07-03
12 Βιομηχανικές πρακτικές περιπτώσεις (1-6)
Υπόθεση 1: Έλεγχος εκκίνησης-αποστολής κινητήρα
Σκλ
Δραστηριότητα FB_MotorControl
VAR_INPUT
Κουμπί εκκίνησης: BOOL
Κουμπί StopButton: BOOL;
Σήμα υπερφόρτωσης: BOOL;
ΕΝΤ_ΒΑΡ
VAR_OUTPUT
Κύρος εκτέλεσης:
Δείκτης σφάλματος: BOOL
ΕΝΤ_ΒΑΡ
Ξεκινήστε.
Αρχίστε-Σταματήστε λογική.
Αν το κουμπί Start και όχι το κουμπί Stop και όχι το κουμπί Overload, τότε
Εκτελεστικό καθεστώς: = ΠΡΟΣΟΧΗ;
ΕΛΣΙΦ Κλείδωμα ή ΥπερφόρτωσηΣύνθημα ΕΤΩΝ
Κύρος εκτέλεσης:= FALSE;
END_IF
// Δείκτη σφάλματος
Δείκτης σφάλματος: = Σήμα υπερφόρτωσης.
Εφαρμογή του παρόντος παραρτήματος
Υπόθεση 2: Εφαρμογή χρονόμετρου
Σκλ
FUNCTION_BLOCK FB_DelayStart
VAR_INPUT
Σημάδι εκκίνησης: BOOL
Διάρκεια καθυστέρησης: χρόνος: = T#5S;
ΕΝΤ_ΒΑΡ
VAR_OUTPUT
Σημάδι εξόδου: BOOL.
ΕΝΤ_ΒΑΡ
VAR
Διάρκεια καθυστέρησης: ΤΟΝ
ΕΝΤ_ΒΑΡ
Ξεκινήστε.
Δοκιμαστικό σήμα: Δοκιμαστικό σήμα:
Σημείο εξόδου: = DelayTimer.Q;
Εφαρμογή του παρόντος παραρτήματος
Υπόθεση 3: Ελέγχος θερμοκρασίας PID
Σκλ
FUNCTION_BLOCK FB_TempControl
VAR_INPUT
σημείο αναφοράς: REAL·
Η τιμή της διαδικασίας: REAL.
ΕΝΤ_ΒΑΡ
VAR_OUTPUT
Ελέγχος: Πραγματική.
ΕΝΤ_ΒΑΡ
VAR
Kp: Πραγματική:= 2.0;
Ki: Πραγματικό:= 0.05;
Kd: Πραγματικό:= 0.5;
IntegralTerm: REAL:= 0·
Τελευταίο σφάλμα: REAL:= 0;
Χρονοδιακόπτης: ΤΟΝ
ΕΝΤ_ΒΑΡ
Ξεκινήστε.
// Εκτελείται περιοδικά (100ms)
Χρονοδιακόπτης ((IN:= ΟΧΙ Χρονοδιακόπτης.Q, PT:= T#100ms);
Αν χρονοδιακόπτης.Τότε
Λάθος VAR: = Θέμα ρύθμισης - Αξία διαδικασίας·
IntegralTerm: = IntegralTerm + σφάλμα.
VAR DerivativeTerm := Λάθος - LastError;
Τελευταίο σφάλμα: = σφάλμα;
ΕλέγχοςΑποτέλεση:= Kp * Λάθος + Ki * IntegralTerm + Kd * ΑποσχηματισμόςTerm
Ελέγχος Εκδοχή:= LIMIT(0.0, ControlOutput, 100.0) ·
Χρονοδιακόπτης ((IN):= FALSE);
END_IF
Εφαρμογή του παρόντος παραρτήματος
Υπόθεση 4: Διαχείριση ουράς παραγωγής
Σκλ
FUNCTION_BLOCK FB_ProductionQueue
VAR_INPUT
NewOrder: BOOL;
OrderID: INT·
ΣυμπλήρωσηΣύνθημα: BOOL;
ΕΝΤ_ΒΑΡ
VAR_OUTPUT
Τρέχουσα σειρά: INT;
Διάρκεια ουράς: INT·
ΕΝΤ_ΒΑΡ
VAR
Διάταξη σειράς: ARRAY[1..50] OF INT·
Κεφαλίδα ουράς: INT:= 1;
Ακολουθία ουράς: INT:= 1;
ΕΝΤ_ΒΑΡ
Ξεκινήστε.
Νέα σειρά παραγγελιών.
Εάν το NewOrder AND QueueLength είναι < 50 τότε
OrderQueue[QueueTail] := OrderID·
QueueTail:= QueueTail MOD 50 + 1;
Διάρκεια ουράς:= Διάρκεια ουράς + 1;
END_IF
// Ολοκληρώθηκε η σειρά παραγγελιών
Εάν το πλήρες σήμα και το μήκος ουράς > 0
Κύκλος αναμονής:= Κύκλος αναμονής MOD 50 + 1;
Διάρκεια ουράς:= Διάρκεια ουράς - 1;
END_IF
// τρέχουσα σειρά
Εφόσον το μήκος ουράς > 0
CurrentOrder:= OrderQueue[QueueHead];
ΑΛΛΗ
Τρέχουσα Τάξη:= 0;
END_IF
Εφαρμογή του παρόντος παραρτήματος
Υπόθεση 5: Έλεγχος κλειδαριότητας θύρας ασφαλείας
Σκλ
FUNCTION_BLOCK FB_SafetyGate
VAR_INPUT
Πύλη 1 κλειστή, Πύλη 2 κλειστή: BOOL.
Κουμπί EStop: BOOL;
ΕπαναφοράButton: BOOL
ΕΝΤ_ΒΑΡ
VAR_OUTPUT
Πρόσθετες πληροφορίες σχετικά με την ασφάλεια
ΕΝΤ_ΒΑΡ
VAR
Κράτος αποκλεισμού: BOOL:= FALSE;
Κλειδωτικός χρόνος: ΤΟΝ.
ΕΝΤ_ΒΑΡ
Ξεκινήστε.
// Κατάσταση ασφάλειας
VAR AllGatesClosed:= Gate1Closed AND Gate2Closed (Όλες οι πύλες κλειστές)
Σταματήστε επείγουσα προτεραιότητα.
Αν το βάζεις στο κουμπί τότε.
Πρόσθετες πληροφορίες σχετικά με την ασφάλεια:
Κράτος κλεισίματος: = ΠΡΟΣΟΧΗ;
Επικαιροποιημένη έκδοση:
Επιστροφή
END_IF
Ανοίξτε λογική.
Εάν το κουμπί ResetButton και το κλείδωμαStatus και το κλείδωμαTimer.Q Τότε
Κράτος αποκλεισμού:= FALSE;
END_IF
- Κανονική λειτουργία.
ΑΝ ΟΧΙ Κλείδωμα, τότε.
Κατάσταση ασφάλειας: = Όλες οι πύλες κλειστές.
END_IF