Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 19

Thema: AND O Gewichtung in ST

  1. #1
    Registriert seit
    04.02.2013
    Beiträge
    271
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo, ich habe ein Programm bekommen, was ich auf eine Andere Steuerung umsetzen soll.

    Nun sind hier viele Dinge zwar schon in ST gemacht, allerdings mit vielen Verknüpfungen in einer Zeile.
    Ich wollte diese Bedingungen nun in eine IF abfrage packen und etwas leserlicher verschachteln.

    Nun zur Frage: Wie ist die gewichtung von AND und OR in ST???? Kann man das so sehen wie Punkt vor Strichrechnung? ---> AND vor OR????

    Hier ein zu übersetzender Programmcode:

    Code:
    sac_virtual_master.Start:=SR_start_ref.Q1 AND CAC_main_drive.ActualAxisMode=7 OR sac_virtual_master.AxisMode=1 AND machine_running OR sac_virtual_master.AxisMode=1 AND  tip_buttom;
    Wie würde das hier aussehen?

    Danke schon mal
    Zitieren Zitieren AND O Gewichtung in ST  

  2. #2
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.207
    Danke
    927
    Erhielt 3.293 Danke für 2.662 Beiträge

    Standard

    AND geht vor OR - das ist auch so im Codesys-Handbuch dokumentiert, Stichworte: Ausdrücke, Bindungsstärke.

    Doch warum willst Du den perfekten Zuweisungsausdruck in dieses unsägliche IF..THEN verschlimmbessern? Man kann auch Zuweisungsausdrücke übersichtlich mehrzeilig formatieren.

    Bei der Umwandlung einer Zuweisung in IF..THEN besteht die Gefahr, daß (fehlerhafter) Code programmiert wird, der anders als der original-Code funktioniert; oder es wird (durch die dann 2 Zuweisungen) wahrscheinlich einfach nur sinnlos aufgeblähter Code erzeugt.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. #3
    Registriert seit
    01.06.2007
    Beiträge
    56
    Danke
    0
    Erhielt 20 Danke für 20 Beiträge

    Standard

    Ja wie du vermutest AND vor UND
    um eine bessere Lesbarkeit zu erhalten reicht es meistens schon aus es untereinander zu schreiben
    z.B.

    sac_virtual_master.Start := R_start_ref.Q1 AND CAC_main_drive.ActualAxisMode=7
    OR sac_virtual_master.AxisMode=1 AND machine_running
    OR sac_virtual_master.AxisMode=1 AND tip_buttom;

    mfg Jochen

  4. Folgender Benutzer sagt Danke zu J Schohaus für den nützlichen Beitrag:

    SY50 (18.10.2013)

  5. #4
    Registriert seit
    07.10.2013
    Beiträge
    96
    Danke
    7
    Erhielt 11 Danke für 10 Beiträge

    Standard

    Zitat Zitat von J Schohaus Beitrag anzeigen
    Ja wie du vermutest AND vor UND
    um eine bessere Lesbarkeit zu erhalten reicht es meistens schon aus es untereinander zu schreiben
    z.B.

    sac_virtual_master.Start := R_start_ref.Q1 AND CAC_main_drive.ActualAxisMode=7
    OR sac_virtual_master.AxisMode=1 AND machine_running
    OR sac_virtual_master.AxisMode=1 AND tip_buttom;

    mfg Jochen
    Hier ein Vorschlag, das brauchen wir zuerst (kann als *.lib gespeichert werden)
    (*Funktion*)
    FUNCTION FC_8_Bit_to_Byte: BYTE
    VAR_INPUT
    B0:BOOL;
    B1:BOOL;
    B2:BOOL;
    B3:BOOL;
    B4:BOOL;
    B5:BOOL;
    B6:BOOL;
    B7:BOOL;
    END_VAR
    VAR
    END_VAR
    (*************************************************************)
    FC_8_Bit_to_Byte:=0;


    FC_8_Bit_to_Byte:= BOOL_TO_BYTE(B0)
    OR SHL(BOOL_TO_BYTE(B1),1)
    OR SHL(BOOL_TO_BYTE(B2),2)
    OR SHL(BOOL_TO_BYTE(B3),3)
    OR SHL(BOOL_TO_BYTE(B4),4)
    OR SHL(BOOL_TO_BYTE(B5),5)
    OR SHL(BOOL_TO_BYTE(B6),6)
    OR SHL(BOOL_TO_BYTE(B7),7);
    (**********************************************************************)
    (*ENDE Funktion*)


    (*Programm*)
    Cmd:=FC_8_Bit_to_Byte(
    (*1*) B0:=R_start_ref.Q1,
    (*2*) B1:=CAC_main_drive.ActualAxisMode=7,
    (*4*) B2:=sac_virtual_master.AxisMode=1,
    (*8*) B3:=machine_running ,
    (*1*) B4:=sac_virtual_master.AxisMode=1
    (*2*) B5:= tip_buttom,
    (*4*) B6:=0,
    (*8*) B7:=0,
    );
    sac_virtual_master.Start:=0;(*RS *)

    CASE Cmd OF
    16#03: sac_virtual_master.Start:=1;
    16#0C: sac_virtual_master.Start:=1;
    16#30: sac_virtual_master.Start:=1;
    END_CASE;


    Oder
    sac_virtual_master.Start:=0;(*RS *)

    CASE Cmd OF
    16#03,16#0C,16#30: sac_virtual_master.Start:=1;
    END_CASE;

    (******************************************************)
    wird was zusaetzlich gebraucht, einfach in case einfuegen

    Irek

  6. #5
    Registriert seit
    17.07.2009
    Ort
    Am Rande der Ostalb
    Beiträge
    5.493
    Danke
    1.142
    Erhielt 1.243 Danke für 974 Beiträge

    Standard

    @Irek
    Einer unserer langjährigen Lieferanten hat neulich einen Millionenauftrag verloren wegen unübsichtlicher, schwer verständlicher Programmierung.
    Mit so einem Code wie du ihn hin hier zeigst, würdest du bei uns nicht ins Haus kommen.
    Welcher Instandhalter soll das noch nachvollziehen können?

    Gruß
    Dieter

  7. #6
    Registriert seit
    07.10.2013
    Beiträge
    96
    Danke
    7
    Erhielt 11 Danke für 10 Beiträge

    Standard

    Zitat Zitat von Blockmove Beitrag anzeigen
    @Irek
    Einer unserer langjährigen Lieferanten hat neulich einen Millionenauftrag verloren wegen unübsichtlicher, schwer verständlicher Programmierung.
    Mit so einem Code wie du ihn hin hier zeigst, würdest du bei uns nicht ins Haus kommen.
    Welcher Instandhalter soll das noch nachvollziehen können?

    Gruß
    Dieter
    Ja, das trift hier zu, weil bei vielen das Wissen um Binaerzahlen und HEX-Zahlen nicht vorhanden sei.
    Wer aus der Siemenswelt kommt und mit U E1.1 O E1.3 SA1.1 programmiert hat ist hier total verloren.
    Ich sehe das auch bei uns, mit Siemens angefangen und stehengeblieben!
    Bei Codesys (Beckhoff) wird dann meistens in uneffektiven FUP programmiert, deswegen kommen manche Zeilen in eine Lib,
    und der Delikvent kann dann seine Legos zusammensetzen.

    Irek

  8. #7
    Registriert seit
    24.02.2009
    Beiträge
    1.244
    Danke
    23
    Erhielt 276 Danke für 235 Beiträge

    Standard

    Zitat Zitat von Blockmove Beitrag anzeigen
    @Irek
    Einer unserer langjährigen Lieferanten hat neulich einen Millionenauftrag verloren wegen unübsichtlicher, schwer verständlicher Programmierung.
    Mit so einem Code wie du ihn hin hier zeigst, würdest du bei uns nicht ins Haus kommen.
    Welcher Instandhalter soll das noch nachvollziehen können?

    Gruß
    Dieter
    Warum schreibt ihr dann nicht in euer Lastenheft: "Unsere Instandhalter verstehen nur 0815 Binärverknüpfungen. Bitte Programmcode entsprechend aufblähen". Ich wette euer Langjähriger Lieferant hätte dann auch entsprechend geliefert.

    Ich fasse da wo es sinnvoll ist auch binäre Signale in Bytes, Wörtern oder Doppelwörtern zusammen und arbeite dann mit denen weiter. Gerade beim Auswerten von Signalskombinationen bei denen es dutzende oder hunderte Zustände geben kann wird die Instandhaltung mit der "klassischen" Bitverknüpfung garantiert auch nicht Glücklicher.

  9. #8
    Registriert seit
    17.07.2009
    Ort
    Am Rande der Ostalb
    Beiträge
    5.493
    Danke
    1.142
    Erhielt 1.243 Danke für 974 Beiträge

    Standard

    @Irek

    Was ist an deiner Programmierung übsichtlicher oder besser als an der Programmierung von Jochen?

    Zitat Zitat von J Schohaus Beitrag anzeigen
    sac_virtual_master.Start := R_start_ref.Q1 AND CAC_main_drive.ActualAxisMode=7
    OR sac_virtual_master.AxisMode=1 AND machine_running
    OR sac_virtual_master.AxisMode=1 AND tip_buttom;
    Und stell dir vor, ich würde sowas simples wie einen NC-Start sogar auch in Codesys in FUP packen.
    Einfach weil ich dann weiss, dass es der Instandhalter locker findet und ich dann nicht in meiner Freizeit gestört werde.

    Gruß
    Dieter

  10. #9
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    752
    Danke
    27
    Erhielt 165 Danke für 143 Beiträge

    Standard

    Zitat Zitat von PN/DP Beitrag anzeigen
    Doch warum willst Du den perfekten Zuweisungsausdruck in dieses unsägliche IF..THEN verschlimmbessern?
    Vermutlich, weil IF..THEN..ELSE-Konstrukte vieles besser verständlich machen, wenn man eher ereignisorientiert denkt und arbeitet. Man könnte z. B. schreiben:
    Code:
    IF CAC_main_drive.ActualAxisMode=7
    THEN
       sac_virtual_master.Start:=SR_start_ref.Q1;
    ELSIF sac_virtual_master.AxisMode=1
    THEN
       sac_virtual_master.Start:=machine_running OR tip_buttom;
    ELSE
       sac_virtual_master.Start:=FALSE;
    END_IF
    Ob das der Verständlichkeit förderlich ist, kann man anhand der einzelnen aus dem Zusammenhang herausgelösten Codezeile nicht wirklich beurteilen. Wenn ich nur die eine Zeile betrachte, würde ich aber auch als grundsätzlicher IF..THEN..ELSE-Befürworter darauf verzichten.

    @Irek
    Hast Du vielleicht vergessen, Deinen Beitrag als "Fun zum Feierabend" zu kennzeichnen?
    Wie lange wird es dauern, bis jemand endlich herausgefunden hat, wann sac_virtual_master.Start = True wird? Ich bin solchen Basteleien gegenüber nicht von vornherein abgeneigt, aber in diesem Fall ist das weit über das Ziel hinausgeschossen. Und aussagekräftige Konstantennamen statt Zahlenwerte für die CASE-Selektoren sind das Mindeste, was man dabei seiner Nachwelt zugute tun sollte.

  11. #10
    Registriert seit
    25.06.2008
    Ort
    Blomberg/Lippe
    Beiträge
    1.293
    Danke
    51
    Erhielt 130 Danke für 124 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    AND vor UND
    Gruß
    Mobi


    „Das Einfache kompliziert zu machen ist alltäglich. Das Komplizierte einfach zu machen –
    das ist Kreativität“ (Charles Mingus).

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •