Quantcast
Channel: SPS-Forum - Automatisierung und Elektrotechnik
Viewing all 49265 articles
Browse latest View live

Energieelektroniker (m/w)

$
0
0
Mit Zuverlässigkeit, Kontinuität und dem Know-how unserer rund 390 Mitarbeiter/innen hat sich Fripa als namhafter Hersteller für
Haushalts- und Hygienepapiere etabliert.

Unser Team braucht Verstärkung.
Deshalb suchen wir ab sofort:

Energieelektroniker (m/w)

Ihr Aufgabengebiet:

  • Mitarbeit an Projekten bei Steuerungserweiterungen
  • Durchführung von Maschinenoptimierungen, Steuerungsanpassungen und Wartungsplanungen
  • Fehlerdiagnose und -behebung an unseren Produktionsanlagen
  • Dokumentation der Prüfergebnisse

Ihr Profil:
  • Abgeschlossene Ausbildung als Elektroniker/in für Betriebstechnik oder Energieelektroniker
  • Weiterbildung zum staatlich geprüften Techniker oder vergleichbare Weiterbildung wünschenswert
  • Erweiterte Kenntnisse in der Programmierung von Step 7/WinCC
  • Kenntnisse im Bereich Antriebstechnik (Frequenzumrichter/Servotechnik)
  • Strukturierte, eigenverantwortliche und lösungsorientierte Arbeitsweise sowie prozessorientiertes und fachübergreifendes Denken
  • Hohe Auffassungsgabe, Zuverlässigkeit sowie Belastbarkeit und Teamfähigkeit

Wir bieten eine umfassende Einarbeitung in die anspruchsvollen und abwechslungsreichen Aufgaben. Sie arbeiten in einem engagierten
Team im Umfeld eines innovativen Familienunternehmens mit flachen Hierarchien und kurzen Entscheidungswegen.

Wenn wir Ihr Interesse geweckt haben, dann freuen wir uns auf Ihre aussagekräftigen Bewerbungsunterlagen, die Sie bitte inklusive Ihrer
Entgeltvorstellung und Ihres frühestmöglichen Eintrittstermins per Post oder E-Mail an unsere Personalabteilung senden:

Fripa Papierfabrik Albert Friedrich KG
Personalabteilung - Großheubacher Str. 4 - 63897 Miltenberg
Tel. (09371) 502-542 - E-Mail: personal@fripa.de
www.fripa.de


servlet_Energieelektroniker.pdf
Angehängte Dateien

Step 7 Dieselaggregate Synchronisation

$
0
0
Moin moin Experten,
es geht um einen Inselbetrieb einer Photovol.-Anlage kombiniert mit einer Notstromaggregate für ein Dorf in Afrika.
Als Energiespeicher dient ein Batterie-Backup System (Gleich & Wechselrichter sind enthalten)
Das Thema Automatisierung (Visualisierung & SPS programmierung) ist für micht nicht das Problem.
Im idealen Fall (Sommer) liefert die PV-Anlage Strom genug (100%).
Im Winter ist es allerdings manchmal problematisch. Ggf muss man die Notstromaggregate einbeziehen. Hier liegt mein Problem.

1-Wie werden beide Spannungsquellen synchronisiert?
-Spannung, Frequenz und Phasenverschiebung(Strom-Spannung) müssen im Tollerenzbereich liegen danach beide Spannungsschienen zusammenschalten???
-Reicht die SPS aus zum Synchronisieren oder braucht man extra ein sog. Vektorsprungrelais?

2- Laut meinem Chef muss nach der Synchronisation die Spannung des Generators angehoben werden, durch Erhöhung der RPM??? COS Phi muss auch im Tollerenzbereich bleiben

3-Z.B. Vormittags sind es 70% Strom aus der PV und 30% Strom aus dem Generator . Nachmittags liefert die PV 60% .Ggf muss der Generator 40% liefern. Man muss also die Leistung vom Generator erhöhen (Drehzahl erhöhen). In der Übergangsphase (Spannung,Frequenz,Phasenverschiebung passen nicht mehr ) muss man wieder synchronisieren oder mache ich einen Denkfehler?

Ich bin dankbar für jeden Hinweis. :D

Herzliche Grüße

Csharp

TIA TIA stürzt ab nach Konsistenzprüfung der Sicherheitsprogramm

$
0
0
Hallo,

beim Übersetzten stürzt TIA V14 nach Konsistenzprüfung der Sicherheitsprogramm ab.

Hat jemand ein Lösungsvorschlag oder eine Empfehlung?

danke sehr !

TIA Übersetzen Einstellungen ändern

$
0
0
Hallo,

kann man in TIA V14 die Einstellungen für Programm- Übersetzen ändern? wenn, ja wo kann ich das einstellen?
Ich möchte z.B. anstatt eine Fehlermeldung eine Warnung bekommen.

Danke sehr!

Beckhoff Steuerung mit TwinCat 3 verbinden

$
0
0
Hallo,

ich wollte heute eine Beckhoff Steuerung (CX9000-0001) mit TwinCAT3 verbinden (Später soll das ganze noch mit einem OPC UA Server verbunden werden). Als ich das Ziel System wählen wollte ist irgedetwas schief gegangen(neben den Namen der SPS stand ERROR),ich habe sie SPS zurück gesetzt,es hat aber nicht geholfen. Ist es möglich,dass diese Steuerung nicht mit TC3 kompatibel ist?

Error.JPG
Grüße aleksandra
Angehängte Grafiken

Digitales Zeitrelais oder Logo! ?

$
0
0
Brauche ein Digitales Zeitrelais das genau 8,5h +/- 1 Minute kann.

Da es eine CCC Zulassung für China haben sollte, kam mir gleich die Logo! in den Sinn

Gegenvorschlag erwünscht.
Danke

TIA Blinkleuchte bei Ausschaltverzögerung

$
0
0
Wie kann ich folgendes programmieren:

Ein Schalter I0.0 schaltet einen Motor Q0.0

Wenn ich dann den Schalter ausschalte soll der Motor 15min nachlaufen.

Also TOF-Baustein und als Bedingung dazwischen als TOF_Q

Wie kann ich aber zusätzlich eine Leuchte dazu blinken lassen solange wie die Zeit abläuft?
Diese Leuchte soll aber erst blinken sobald die Zeit läuft und nicht schon vorher.
Problem: Bei TOF sind die Ausgänge ja immer sofort geschaltet und fallen nur ab nach der eingestellten Zeit.

Was gibt es da für einen Baustein?

:confused::confused:

TIA Orientalmotor cpu150 TIA V13 SP1 per Motbus anbinden.

$
0
0
Hallo
Ich versuche schon seit 2 Tagen verzweifelt die Orientalmotoren zum laufen zu bekommen.

Das Treiber Modul ist ein BLED3CM-R dieser hat ja ein Modbus ..

Die 1500 Steuerrungen können ja Modbus oder? Dort gibt es ja die Fertigen Bausteine MB_Client und Server.

Wie muss ich die Einstellen bzw was muss ich an dem Modul einstellen ? Welche Baudrate usw.

Kann mir da jemand Helfen oder hat Erfahrung?

Mfg C.Hellmig

TIA Datensenden mit TSend_C an Server senden

$
0
0
Hallo,
ich versuche gerade vergebens einen String an einen Server zuschicken.
Was ich habe ist...

1515SP PC IP 192.168.0.101

Server IP 172.25.182.37 Port 13000

Router Scalance S615

Sie haben für mich diese Adresse reserviert
IP: 172.27.61.47
Mask: 255.255.254.0
Gateway: 172.27.60.1

Mein Problem ist ich hab nur einen Ethernet Port an der SPS.
Es ist das erste mal das ich sowas realisiere deswegen entschuldige ich mich dann gleich mal für blöde Fragen.
Gruß

TIA ARRAY-DB Datentyp ändern

$
0
0
Moin Zusammen,

gibt es eine Möglichkeit den Datentyp eines ARRAY-DB nach dem Anlagen noch zu ändern? Bei mir ist unter den Bausteineigenschaften das Feld mit dem Datentyp für den ARRAY-DB "ausgegraut". Oder muss ich irgend eine spezielle Ansicht im TIA-Portal wählen?

mfg
MFreiberger

TIA komisches Phänomen bei Zuweisung von strct in SCL

$
0
0
Folgendes Problem:

Habe einen Datentypen "A" mit 3Int und 1Dint
Lege einen DB an mit einem Array Eintrag[1..50] von "A"
Mache eine SCL Zuweisung Datenbaustein.Eintrag[5]:=Datenbaustein.Eintrag[6]

funktioniert nicht, er kopiert nur den ersten int des Datentypes. Mache ich alle Variablen des Datentypen zu int, funktioniert es.

Jemand eine Erklärung

Switch

$
0
0
Hallo Leute,

ich hätte da mal eine Frage, und zwar hatten wir das Problem das bei uns der Switch ausgefallen war, natürlich war die Verbindung zur Visu gekappt.
Kann man eigentlich 2 Switches verwenden (Redunant machen), wenn der eine ausfällt den, daß man den zweiten zuschalten kann.


Gruss

Manfred

B&R Automation Studio

$
0
0
Hi,

I am programming a Loadcell with B&R Modul AIA744. i have read the following values so far.

Weight Corresponding Load celll value

5 Kg 8800 - 9300
31.5 Kg 23700 -24200
1 Kg 3000-3500

I would like to use a formula to calculate the corresponding weight from the read loadcell so that i can represnt it using a Bar Diagram?
Can some one help me please ?

Thanks in Advance

TC3: Programmierung mit Passwort schützen

$
0
0
Guten Morgen zusammen,

ich programmiere gerade eine Anlage die nach China geht mit TwinCat 3. Mein Kunde hat allerdings Patente auf die Anlage angemeldet und befürchtet nun das die Anlage von den Chinesen nachgebaut wird und will zu mindestens die Programmierung mit den ganzen FB`s schützen das man dort nicht so leicht rankommt! Weiß daher evtl. einer von euch wie ich die Programmierung so schützen kann das sie weder gelesen noch verändert werden kann von einem aussenstehenden ?

String zerlegen in Realwerte

$
0
0
Hallo Freunde,
ich bin grade etwas am verzweifeln..

Ich hab einen String der aus 40 Zeichen a 4 Werte besteht:

' 222.23$N 333.34$N 2$N 444.45$N'

Dieser soll nun in drei Realwerte und 1 Intwert zerlegt werden..
Eine Funktion String_To_Real/Int gibt es ja..
aber wie sage ich nun das ich ab Byte 0 8 Zeichen haben möchte, ab Byte 10 8 Zeichen etc?
Habe schon versucht das ganze in ein Array of String zu wandeln mit wenig Erfolg...

Bin für jede Anregung dankbar!!!

Lizenz TF6310 Problem

$
0
0
Moin,


ich nutze zu Testzwecken eine CX9020 und benötige die TCP/IP Lizenz. Lief auch soweit ganz gut mit den Testlizenzen. Nun wollte ich heute noch etwas spielen und ich erhalte vom FB_SocketConnect Fehler 1828 -> Activate license for TwinCAT 3 function.
Ich habe aber eine aktive Lizenz für TF6310 (wieder 7 Tage).

Habe ich was vergessen? Config schon alles neu übertragen.
Angehängte Grafiken

Step 7 Hardware/Software

$
0
0
Hallo alle zusammen,
ich möchte für meine Arbeitsstelle die nötige Hardware und Software zum Programmieren von Logo, S5 und S7 zusammenstellen.
Muss natürlich auf Vollständigkeit achten, eine Nachbestellung ist sonst bei dieser Investition etwas schwierig.
bspw.
Hardware: Simantic Field PG M5 + Netz.-Leitung und Stecker + EU Tastatur + SATA-USB 2.0 Adapter, für Field PG M4/M3/M2/M + MPI-Kabel + S5 EPROM Adapter
Software: Windows7 Ultim.SP1 64-Bit + STEP 7 & WinCC im TIA Portal: STEP 7 Prof. V14 SP1 + WinCC Adv. V14 SP1
Es wäre wirklich Prima wenn Ihr dieses Beispiel mal durchgeht - vervollständigt und nicht notwendige Punkte ändert.
Ich danke schon mal im voraus.
Gruß Andreas

Merker %MWX über Modbus setzen und anschließend in Steuerung verwenden

$
0
0
Hallo Zusammen

Ich möchte über Modbus einen Merker setzen und diesen dann über die Steuerung auswerten.
In meinem Fall will ich den Merker %MW0 setzen, diesen steuere ich über die Adresse 12288, wie in der Doku beschrieben an. Anschließend möchte ich, dass dieser Merker einen Wert auf eine Variable schreibt, die ich dann anschließend in meiner Steuerung auswerten kann. Mein Problem ist das der Merker erst gar nicht gesetzt wird und ich weiß auch nicht, wie ich ihn anschließend in meiner Steuerung benutzen kann.

Ich habe ein Zuweisung wie folgt in ST geschrieben:
%QW0 := %MW0

demnach müsste ich doch %MW0 beschreiben können und dieser Wert wird anschließend in %QW0 geschrieben!?

Controller:
  • 750-841; FW21

Module:
  • 2x 750-402
  • 1x 750-501
  • 2x 750-502

Codesys:
  • v2.3.9.49

Projekt:
Anhang 36984

TIA Bereichslängenfehler SCL

$
0
0
Servus Leute,

wie mein Titel schon sagt bekomme ich einen Bereichslängenfehler in einem SCL Baustein. Ich kann mir leider nicht erklären woher dieser Fehler kommt.
Kurz zur Erklärung:
Der betroffene Baustein prüft einen erhaltenen Fahrauftrag auf plausibilität. Der Fehler taucht auch nicht bei jedem Fahrauftrag auf. Ich hoffe ihr habt vielleicht ne Idee was es sein könnte, oder könnt mir vielleicht helfen wie ich den Fehler diagnostizieren kann.

Hier der Auszug aus dem Diagnosepuffer der CPU

Code:

Diagnosepuffer der Baugruppe Kran1_3100 [CPU 1515F-2 PN]


Artikel-Nr. / Bezeichn.      Komponente                    Version
6ES7 515-2FM01-0AB0          Hardware                      3
- - -                        Firmware                      V 2.0.1
Firmware-Erweiterung          Firmware-Erweiterung          ---



103 von 523; Ereignis-ID: 16# 02:2522
Temporärer CPU-Fehler: Bereichslängenfehler in FB 11
betrifft OB 1 Ausführung
Lesezugriff Gepufferter DB-Bereich
fehlerhafte Adresse, Operand ersetzt
 
 Kran1_3100
interne Adressierungsdetails: Caddr=16#00000146, Bereich: Gepufferter DB-Bereich, Adr: 11357

Kommendes Ereignis
11.05.2017 17:11:08.305



Und hier der Quellcode des Bausteins, ich habe die Stelle rot markiert an die er mir springt wenn ich auf den Butten im Editor öffnen klicke.

Code:

FUNCTION_BLOCK "FB_Auftragspruefung_NEU"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
  VAR_INPUT
      IN_Einlagern : Bool;  // Auftrag: Einlagern eines Stapels
      IN_Auslagern : Bool;  // Auftrag: Auslagern eines Stapels
      IN_Umlagern : Bool;  // Auftrag: Umlagern eines Stapels
      IN_Kantholz : Bool;  // Auftrag ist eine Kantholzbox
      IN_Reset : Bool;  // Zurücksetzen der Auftrag OK/nicht OK Merker
      IN_Quelle : String[4];  // Bezeichnung der Quelle
      IN_Ziel : String[4];  // Bezeichnung des Lagerorts
      IN_Aufnahmefoerd : String[4];  // Kennung des Aufnahmeförderers
      IN_Abgabefoerd : String[4];  // Kennung des Abgabeförderers
      IN_Kantholzfoerd : String[4];  // Kennung des Kantholzförderers
      IN_Reihe_Ein : Int;  // Nummer der Lagerreihe (Einlagern)
      IN_Tiefe_Ein : Int;  // Nummer der Lagertiefe (Einlagern)
      IN_Ebene_Ein : Int;  // Nummer der Lagerebene (Einlagern)
      IN_Hoehe_Ein : DInt;  // Physikalische Höhe (Einlagern)
      IN_Reihe_Aus : Int;  // Nummer der Lagerreihe (Auslagern)
      IN_Tiefe_Aus : Int;  // Nummer der Lagertiefe (Auslagern)
      IN_Ebene_Aus : Int;  // Nummer der Lagerebene (Auslagern)
      IN_Hoehe_Aus : DInt;  // Physikalische Höhe (Auslagern)
      IN_TE_Hoehe : Int;  // Höhe der TE aus Fahrauftrag
      IN_uGrenzw_Hoehe : DInt;  // Unterer Grenzwert für die Abweichung der Höhe des Fahrauftrags zur gespeicherten Höhe im Positions-DB
      IN_oGrenzw_Hoehe : DInt;  // Oberer Grenzwert für die Abweichung der Höhe des Fahrauftrags zur gespeicherten Höhe im Positions-DB
  END_VAR

  VAR_OUTPUT
      OUT_Auftrag_OK : Bool;  // Auftrag plausibel
      OUT_Auftrag_nOK : Bool;  // Auftrag nicht ausführbar
      OUT_Platz_belegt : Bool;  // Einlagern / Umlagern: Ziel belegt
      OUT_Platz_frei : Bool;  // Auslagern: Platz frei
  END_VAR

  VAR
      STAT_nAusfuehrbar : Bool;  // Auftrag nicht ausführbar
      STAT_Platz_belegt : Bool;  // Einlagern / Umlagern: Ziel belegt
      STAT_Platz_frei : Bool;  // Auslagern: Platz frei
  END_VAR

  VAR_TEMP
      TMP_Hoehe_Rest_Aus : DInt;  // Resthöhe Auslagern (Höhe Positions-DB - Höhe Fahrauftrag)
      TMP_Hoehe_Rest_Ein : DInt;  // Resthöhe Einlagern (Höhe Positions-DB - Höhe Fahrauftrag)
  END_VAR


BEGIN
    (*
    Prüfung ob erhaltener Fahrauftrag plausibel
   
    Sprung zwischen Lagerabbild-DB und Positions-DB ist möglich, da sie den gleichen Aufbau haben
    Aufbau Positions-DB:    Reihe[1..9].Tiefe[1..19]
    Aufbau Lagerabbild-DB:  Reihe[1..9].Tiefe[1..19].Ebene[1..9]
    *)
    //==========================================================================================================================================================================================
    //                      Prüfen ob Koordinaten des Fahrauftrags im Lagerabbild vorhanden sind
    //==========================================================================================================================================================================================
                                                                                                                                        // Kommentar zu den Codezeilen
                                                                                                                                        // =====================================================
    IF (#IN_Reihe_Ein > 9) OR (#IN_Reihe_Aus > 9) OR                                                                                    // Abfrage ob Reihe größer 9
        (#IN_Tiefe_Ein > 19) OR (#IN_Tiefe_Aus > 19) OR                                                                                // Abfrage ob Tiefe größer 19
        (#IN_Ebene_Ein > 9) OR (#IN_Ebene_Aus > 9) THEN                                                                                // Abfrage ob Ebene größer 10
        #STAT_nAusfuehrbar := TRUE;                                                                                                    // Setzen Merker Auftrag nicht ausführbar
    END_IF;                                                                                                                            //
    //==========================================================================================================================================================================================
    //                      Auftragsprüfung wenn Koordinaten im Lagerabbild vorhanden sind
    //==========================================================================================================================================================================================
                                                                                                                                        // Kommentar zu den Codezeilen
                                                                                                                                        // =====================================================
    IF NOT #STAT_nAusfuehrbar AND #IN_Einlagern AND NOT (#IN_Ziel = #IN_Abgabefoerd OR #IN_Ziel = #IN_Kantholzfoerd) THEN              // Abfrage ob Ausführbar und Einlagern und Ziel nicht Abgabe- oder Kantholzförderer
        #TMP_Hoehe_Rest_Ein := ("DB_Positionen".Reihe[#IN_Reihe_Ein].Tiefe[#IN_Tiefe_Ein].Z - #IN_Hoehe_Ein);                          // Resthöhe Positions-DB - Fahrauftrag berechnen
        IF ("DB_Lagerabbild".Reihe[#IN_Reihe_Ein].Tiefe[#IN_Tiefe_Ein].Nicht_vorhanden) OR                                              // Abfrage ob Ziel physikalisch vorhanden
            (NOT #IN_Kantholz AND ((#IN_Reihe_Ein <= 2 AND #IN_Tiefe_Ein <= 3) OR #IN_Ziel = #IN_Kantholzfoerd OR #IN_Quelle = #IN_Kantholzfoerd)) OR                    // Abfrage ob Holzstapel auf Kantholzplatz soll
            (#IN_Kantholz AND ((#IN_Reihe_Ein <= 2 AND #IN_Tiefe_Ein > 3))) OR                                                          // Abfrage ob Kantholzbox auf Holzstapelplatz soll
            (NOT "DB_Lagerabbild".Reihe[#IN_Reihe_Ein].Tiefe[#IN_Tiefe_Ein].Ebene[#IN_Ebene_Ein - 1].Belegt AND #IN_Ebene_Ein >2) THEN  // Abfrage ob der darunter liegende Platz frei ist
            #STAT_nAusfuehrbar := TRUE;                                                                                                // Setzen Merker Auftrag nicht ausführbar
        ELSIF NOT #STAT_nAusfuehrbar AND "DB_Lagerabbild".Reihe[#IN_Reihe_Ein].Tiefe[#IN_Tiefe_Ein].Ebene[#IN_Ebene_Ein].Belegt OR      // Abfrage ob vorgegebenes Ziel belegt ist
            (#TMP_Hoehe_Rest_Ein > #IN_oGrenzw_Hoehe) OR                                                                                // Abfrage ob Physikalische Höhe außerhalb der Grenze liegt
            (#TMP_Hoehe_Rest_Ein < #IN_uGrenzw_Hoehe) THEN                                                                              // Abfrage ob Physikalische Höhe außerhalb der Grenze liegt
            #STAT_Platz_belegt := TRUE;                                                                                                // Setzen Merker Platz belegt (Einlagern)
        ELSE                                                                                                                            //
            #OUT_Auftrag_OK := TRUE;                                                                                                    // Setzen Ausgang Auftrag OK (Einlagern)
        END_IF;                                                                                                                        //
    ELSIF NOT #STAT_nAusfuehrbar AND #IN_Auslagern THEN                                                                                // Abfrage ob Ausführbar und Auslagern
        #TMP_Hoehe_Rest_Aus := ("DB_Positionen".Reihe[#IN_Reihe_Aus].Tiefe[#IN_Tiefe_Aus].Z - #IN_Hoehe_Aus - #IN_TE_Hoehe);            // Resthöhe Positions-DB - Fahrauftrag berechnen
        IF ("DB_Lagerabbild".Reihe[#IN_Reihe_Aus].Tiefe[#IN_Tiefe_Aus].Nicht_vorhanden) OR                                              // Abfrage ob Quelle physikalisch vorhanden
            (NOT #IN_Kantholz AND ((#IN_Reihe_Aus <= 2 AND #IN_Tiefe_Aus <= 3) OR #IN_Ziel = #IN_Kantholzfoerd)) OR                    // Abfrage ob Holzstapel von Kantholzplatz geholt werden soll
            (#IN_Kantholz AND ((#IN_Reihe_Aus <= 2 AND #IN_Tiefe_Aus > 3))) OR                                                          // Abfrage ob Kantholzbox von Holzstapelplatz geholt werden soll
            "DB_Lagerabbild".Reihe[#IN_Reihe_Aus].Tiefe[#IN_Tiefe_Aus].Ebene[#IN_Ebene_Aus + 1].Belegt THEN                            // Abfrage ob der darüber liegende Platz belegt ist
            #STAT_nAusfuehrbar := TRUE;                                                                                                // Setzen Merker Auftrag nicht ausführbar
        ELSIF NOT #STAT_nAusfuehrbar AND (NOT "DB_Lagerabbild".Reihe[#IN_Reihe_Aus].Tiefe[#IN_Tiefe_Aus].Ebene[#IN_Ebene_Aus].Belegt OR // Abfrage ob vorgegebenee Quelle frei ist
            (#TMP_Hoehe_Rest_Aus > #IN_oGrenzw_Hoehe) OR                                                                                // Abfrage ob Physikalische Höhe außerhalb der Grenze liegt
            (#TMP_Hoehe_Rest_Aus < #IN_uGrenzw_Hoehe)) THEN                                                                            // Abfrage ob Physikalische Höhe außerhalb der Grenze liegt
            #STAT_Platz_frei := TRUE;                                                                                                  // Setzen Merker Platz frei (Auslagern)
        ELSE                                                                                                                            //
            #OUT_Auftrag_OK := TRUE;                                                                                                    // Setzen Ausgang Auftrag OK (Auslagern)
        END_IF;                                                                                                                        //
    ELSIF NOT #STAT_nAusfuehrbar AND #IN_Umlagern THEN                                                                                  // Abfrage ob Ausführbar und Umlagern
        #TMP_Hoehe_Rest_Ein := ("DB_Positionen".Reihe[#IN_Reihe_Ein].Tiefe[#IN_Tiefe_Ein].Z - #IN_Hoehe_Ein);                          // Resthöhe Positions-DB - Fahrauftrag berechnen
        #TMP_Hoehe_Rest_Aus := ("DB_Positionen".Reihe[#IN_Reihe_Aus].Tiefe[#IN_Tiefe_Aus].Z - #IN_Hoehe_Aus - #IN_TE_Hoehe);            // Resthöhe Positions-DB - Fahrauftrag berechnen
        IF ("DB_Lagerabbild".Reihe[#IN_Reihe_Ein].Tiefe[#IN_Tiefe_Ein].Nicht_vorhanden) OR                                              // Abfrage ob Ziel physikalisch vorhanden
            ("DB_Lagerabbild".Reihe[#IN_Reihe_Aus].Tiefe[#IN_Tiefe_Aus].Nicht_vorhanden) OR                                            // Abfrage ob Quelle physikalisch vorhanden
            (NOT #IN_Kantholz AND ((#IN_Reihe_Ein <= 2 AND #IN_Tiefe_Ein <= 3) OR #IN_Ziel = #IN_Kantholzfoerd OR #IN_Quelle = #IN_Kantholzfoerd)) OR                    // Abfrage ob Holzstapel auf Kantholzplatz soll
            (#IN_Kantholz AND ((#IN_Reihe_Ein <= 2 AND #IN_Tiefe_Ein > 3))) OR                                                          // Abfrage ob Kantholzbox auf Holzstapelplatz soll
            (NOT #IN_Kantholz AND ((#IN_Reihe_Aus <= 2 AND #IN_Tiefe_Aus <= 3) OR #IN_Ziel = #IN_Kantholzfoerd)) OR                    // Abfrage ob Holzstapel von Kantholzplatz geholt werden soll
            (#IN_Kantholz AND ((#IN_Reihe_Aus <= 2 AND #IN_Tiefe_Aus > 3))) OR                                                          // Abfrage ob Kantholzbox von Holzstapelplatz geholt werden soll
            (NOT "DB_Lagerabbild".Reihe[#IN_Reihe_Ein].Tiefe[#IN_Tiefe_Ein].Ebene[#IN_Ebene_Ein - 1].Belegt AND #IN_Ebene_Ein >2) OR    // Abfrage ob der darunter liegende Platz frei ist
            "DB_Lagerabbild".Reihe[#IN_Reihe_Aus].Tiefe[#IN_Tiefe_Aus].Ebene[#IN_Ebene_Aus + 1].Belegt THEN                            // Abfrage ob der darüber liegende Platz belegt ist
            #STAT_nAusfuehrbar := TRUE;                                                                                                // Setzen Merker Auftrag nicht ausführbar
        ELSIF NOT #STAT_nAusfuehrbar AND ("DB_Lagerabbild".Reihe[#IN_Reihe_Ein].Tiefe[#IN_Tiefe_Ein].Ebene[#IN_Ebene_Ein].Belegt OR    // Abfrage ob vorgegebenes Ziel belegt ist
            (#TMP_Hoehe_Rest_Ein > #IN_oGrenzw_Hoehe) OR                                                                                // Abfrage ob Physikalische Höhe außerhalb der Grenze liegt
            (#TMP_Hoehe_Rest_Ein < #IN_uGrenzw_Hoehe)) THEN                                                                            // Abfrage ob Physikalische Höhe außerhalb der Grenze liegt
            #STAT_Platz_belegt := TRUE;                                                                                                // Setzen Merker Platz belegt (Umlagern)
        ELSIF NOT #STAT_nAusfuehrbar AND (NOT "DB_Lagerabbild".Reihe[#IN_Reihe_Aus].Tiefe[#IN_Tiefe_Aus].Ebene[#IN_Ebene_Aus].Belegt OR // Abfrage ob vorgegebenee Quelle frei ist
            (#TMP_Hoehe_Rest_Aus > #IN_oGrenzw_Hoehe) OR                                                                                // Abfrage ob Physikalische Höhe außerhalb der Grenze liegt
            (#TMP_Hoehe_Rest_Aus < #IN_uGrenzw_Hoehe)) THEN                                                                            // Abfrage ob Physikalische Höhe außerhalb der Grenze liegt
            #STAT_Platz_frei := TRUE;                                                                                                  // Setzen Merker Platz frei (Umlagern)
        ELSE                                                                                                                            //
            #OUT_Auftrag_OK := TRUE;                                                                                                    // Setzen Ausgang Auftrag OK (Umlagern)
        END_IF;                                                                                                                        //
    ELSIF NOT #STAT_nAusfuehrbar AND #IN_Einlagern AND (#IN_Ziel = #IN_Abgabefoerd OR #IN_Ziel = #IN_Kantholzfoerd) THEN                //                                                                                                                //
        #OUT_Auftrag_OK := True;                                                                                                        //
    END_IF;                                                                                                                            //
    //==========================================================================================================================================================================================
    //                          Setzen der Ausgänge
    //==========================================================================================================================================================================================
    #OUT_Auftrag_nOK := #STAT_nAusfuehrbar;                                                                                            // Setzen Ausgang Auftrag nicht ausführbar
    #OUT_Platz_belegt := #STAT_Platz_belegt;                                                                                            // Setzen Ausgang Platz belegt
    #OUT_Platz_frei := #STAT_Platz_frei;                                                                                                // Setzen Ausgang Platz frei
    //==========================================================================================================================================================================================
    //                          Rücksetzen der Merker und Ausgänge
    //==========================================================================================================================================================================================
    IF #IN_Reset THEN                                                                                                                  // Abfrage ob Reset
        #STAT_nAusfuehrbar := FALSE;                                                                                                    // Rücksetzen Merker nicht Ausführbar
        #STAT_Platz_frei := FALSE;                                                                                                      // Rücksetzen Merker Platz frei
        #STAT_Platz_belegt := FALSE;                                                                                                    // Rücksetzen Merker Platz belegt
        #OUT_Auftrag_OK := FALSE;                                                                                                      // Rücksetzen Ausgang Auftrag OK
    END_IF;                                                                                                                            // 
   
   
END_FUNCTION_BLOCK

#IN_Kantholz ist ein Bool und wird von außen auch mit einem Bool aus einem Global-DB beschaltet. Ich weiß, dass der Code nicht elegant ist, aber das waren meine ersten SCL Gehversuche also habt bitte etwas Rücksicht ;)

Achja verwendet wird TIA Portal V13 SP1, die CPU ist eine 1515F-2 PN. Ich hoffe das sind alle Infos die ihr braucht.

Gruß ThomasM

Step 7 SCL Beispiel, toggeln einer Variable bei einer IF Abfrage

$
0
0
Hallo zusammen,
ich habe ein einfaches Beispiel in SCL vorliegen und verstehe nicht warum die Variable tunaimmer zwischen FALSE und TRUE springt. Somit ändert sich das Ergebnis der Ausgangs variable zwischen 1 und 2, wenn die Variable varinput TRUE ist. Kann mir jemand das erklären?
FUNCTION FC13 :VOID


VAR_INPUT
inputvar :BOOL;
END_VAR


VAR_OUTPUT
result :REAL;
END_VAR


VAR
tuna :BOOL;


END_VAR


BEGIN
IF inputvar AND NOT tuna
THEN
result:= SQRT(2+2);
ELSE
result:=1;
END_IF;
tuna:= inputvar;


END_FUNCTION
Viewing all 49265 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>