Autor Thema: Programmieren mir ST  (Gelesen 4348 mal)

Offline Malefiz

  • Newbie
  • *
  • Beiträge: 7
Programmieren mir ST
« am: Februar 21, 2020, 16:00:59 Nachmittag »
Hallo zusammen,

Ich habe eine Frage zu der Programmiersprache.
Bei der zuweisen zweier MB wird der Wert übertragen oder nur ein Pointer ?

Offline weiss_nix

  • Sr. Member
  • ****
  • Beiträge: 608
  • it has to be easy, it's a easy!
Antw:Programmieren mir ST
« Antwort #1 am: Februar 21, 2020, 16:19:05 Nachmittag »
Hallo Malefiz,
ich vermute reference by value
Sollte ich (gefährliches) Halbwissen verbreiten, beuge ich demütig mein Haupt mit der Gewissheit versagt zu haben!
WICHTIG: Sämtliche Programme dienen lediglich der Veranschaulichung von Funktionen und sind nicht für den Produktiveinsatz geeignet!

Offline Malefiz

  • Newbie
  • *
  • Beiträge: 7
Antw:Programmieren mir ST
« Antwort #2 am: Februar 22, 2020, 14:25:36 Nachmittag »
Dann kann ich mir folgendes Problem nicht erklären.
Im allgemeinen Versuch ich der Reihe jede Minute für 1 Sekunde einen von 20 Ausgängen zu betätigen. Das ganze soll in ST programmiert werden um mich mit der Sprache zu beschäftigen.


MB 10 ist der Ausgang eines Zählers. Der jede Minute um 1 hoch zählt. Zwischen 1 und 20.

Und um jetzt nicht 20 Timer zu gebrauchen wollte ich das so Lösen.
[
If MB10=MB11 then.  // MB10 Zähler MB11 Hilfsmerker
    M20:=False;.            // Freigabe Timer 05
    M22:=False;.            // Rücksetzen Ausgang Timer 05
Else
    T05 (
             EN :=NOT M20,.
             RE :=,
             ST :=,
             I1  := T#2000ms,
             I2  :=,
             Q1 > M22,.    // Timerausgang
             QV >
              );
              If M22 = True then   //nach Ablauf des Timers Ausgang
                                                  // zurück setzen und Hilfsmerker gleich
                                                   // setzten
                   M20:= true;
                   Q20:=false;
                   MB11:=MB10
              Else
                   Q20:= True;  // solange Timer 05 nicht abgelaufen ist
                                          // Ausgang setzen
              End_if;
End_if/
/code]

Der erste Durchlauf funktioniert ab den zweiten wird in der Simulation sofort der Wert in MB11 übernommen und die If Bedingungen nicht mehr durchlaufen. Für Q20:= true würde ich bei laufenden Code noch ein Case einbauen.
« Letzte Änderung: Februar 22, 2020, 22:41:08 Nachmittag von Malefiz »

Offline Juergen

  • easy god
  • *****
  • Beiträge: 1955
  • Jürgen
Antw:Programmieren mir ST
« Antwort #3 am: Februar 22, 2020, 16:59:02 Nachmittag »
Hallo Malefiz,
ich versuche mich auch noch in St und habe deine Aufgabe mal versucht.
Hier mein  Beispiel als Anlage mit 8 Ausgängen, das mit wenig schreibarbeit schnell auf 32 erweiterbar ist. Angefangen mit einer Pausenzeit wird mit einer Testzeit von 10s  immer ein Ausgang für 1 s angesteuert.
Wird Zählerstand 9 Erreicht, wird kein Ausgang mehr zugewiesen und der Zähler zurückgesetzt.
Beachten das die Easy Q5 Bis 16 nicht verwendet, sonden erst bei 17 Weiter macht.
« Letzte Änderung: Februar 22, 2020, 17:31:11 Nachmittag von Juergen »
Mit freundlichem Gruß Juergen


Alle Programme sind nur Beispiele und Selber zu Testen.
Geprüft wurde nur in der Simulation der Software oder mit Simulator am Schreibtisch. Die Beispiele sind mit Sicherheitsschaltungen zu ergänzen.

Offline weiss_nix

  • Sr. Member
  • ****
  • Beiträge: 608
  • it has to be easy, it's a easy!
Antw:Programmieren mir ST
« Antwort #4 am: Februar 22, 2020, 20:02:40 Nachmittag »
@Malefiz
Wenn du deinen Code etwas kommentieren würdest, wäre es IMHO etwas leichter zu versuchen deine Überlegungen nachzuvollziehen.
Einen Timer innerhalb einer Bedingung zu starten ist aus meiner Sicht problematisch da der Code für Start bzw. Ende möglicherweise nicht durchlaufen wird. Ist in deinem Codeschnipsel die eckige Klammer am Anfang ein Teil einer Indizierung?

Dieser Abschnitt macht für mich auch keinen Sinn If M20 = True then
       M20:= true;
Sollte ich (gefährliches) Halbwissen verbreiten, beuge ich demütig mein Haupt mit der Gewissheit versagt zu haben!
WICHTIG: Sämtliche Programme dienen lediglich der Veranschaulichung von Funktionen und sind nicht für den Produktiveinsatz geeignet!

Offline Malefiz

  • Newbie
  • *
  • Beiträge: 7
Antw:Programmieren mir ST
« Antwort #5 am: Februar 22, 2020, 22:42:02 Nachmittag »
Ist falsch abgetippt sollte M22 = True sein

Offline weiss_nix

  • Sr. Member
  • ****
  • Beiträge: 608
  • it has to be easy, it's a easy!
Antw:Programmieren mir ST
« Antwort #6 am: Februar 23, 2020, 09:54:23 Vormittag »
@Malefiz
ich würde es so lösen wollen ...
// Blinktimer
T02 (
EN := true,
RE := ,
ST := ,
I1 := T#1s0ms,
I2 := T#5s0ms,
Q1 => ,
QV =>
);

// negative Flanke von T02
M1 := not T02Q1 and M2;
M2 := T02Q1;

// Ausgang[17 + Zähler] ansteuern
Q[17 + MB10] := T02Q1;

// Management der Zählvariable
IF M1 then
MB10 := MB10 + 1;
elsif MB10 > 7 then
MB10 := 0;
end_if;
Sollte ich (gefährliches) Halbwissen verbreiten, beuge ich demütig mein Haupt mit der Gewissheit versagt zu haben!
WICHTIG: Sämtliche Programme dienen lediglich der Veranschaulichung von Funktionen und sind nicht für den Produktiveinsatz geeignet!

Offline weiss_nix

  • Sr. Member
  • ****
  • Beiträge: 608
  • it has to be easy, it's a easy!
Antw:Programmieren mir ST
« Antwort #7 am: Februar 23, 2020, 10:34:48 Vormittag »
@Juergen und alle anderen die es interessiert ....
um ein bestimmtes Bit(Bitmuster) in einem Byte, Word, DWord  zu setzen bzw. verschieben bedarf es in ST nicht unbedingt einer UF
[Klugscheisser Modus = EIN]
In ähnlichen Programmiersprachen lassen sich Bitmuster z.B. mit Shiften verschieben
SHL (verschieben richtung höherwertiges Bit) und SHR (verschieben richtung niederwertiges Bit)
da es diese Möglichkeit in EasySoft nicht gibt kann man es auch durch eine Multiplikation mit 2 (ist gleichwertig mit "SHL 1"),
oder eine Division durch 2 (wäre gleichwertig mit "SHR 1") bewerkstelligen.
z.B. würde "MB01 := 1 SHL 1" den Wert 2 ergeben, "MB01 := 128 SHR 7" den Wert 1 ergeben
wenn man den Gedanken weiter verfolgt kommt man zu dem Schluss dass MB01 := 1 * (2 ** 7) eine Verschiebung um 7 Stellen bewirkt
wobei ":= 1" setzen des 1 Bit, verschieben mit "*" oder "/"  und "2**7" die Anzahl der zu verschiebenden Stellen angibt
[Klugscheisser Modus = AUS]
Dieser Beitrag ist gedacht um die Vorteile einer Hochsprachenprogrammierung aufzuzeigen und keinesfalls als Korrektur anderer Programme!
« Letzte Änderung: Februar 23, 2020, 11:17:08 Vormittag von weiss_nix »
Sollte ich (gefährliches) Halbwissen verbreiten, beuge ich demütig mein Haupt mit der Gewissheit versagt zu haben!
WICHTIG: Sämtliche Programme dienen lediglich der Veranschaulichung von Funktionen und sind nicht für den Produktiveinsatz geeignet!

Offline Juergen

  • easy god
  • *****
  • Beiträge: 1955
  • Jürgen
Antw:Programmieren mir ST
« Antwort #8 am: Februar 23, 2020, 12:49:31 Nachmittag »
Hallo weiss_nix,

genau das habe ich in meinem Letzten Beitrag verlinkten Beipiel mit meinem UF gemacht. UF damit ich den in ST, Kop und Fup verweden kann.
Kennwort für meinen UF ist js

CASE IA1 OF // Zahlenwerte im IA1 A1 für die Auswertung
1..31:   QA1 := 2**(IA1 -1); // Berechen Zählerwert mit 2 Hoch 0 bis 2 Hoch 30 dem Ausgang Bitweie zuweisen
32:     QA1 :=-2147483648; // Negativen Wert von Bit 32 extra zugewiesen
ELSE
QA1 := 0; //  Wenn keine Bedinnung erfüllt Wert 0
                                                                                       
END_CASE;
« Letzte Änderung: Februar 23, 2020, 13:05:25 Nachmittag von Juergen »
Mit freundlichem Gruß Juergen


Alle Programme sind nur Beispiele und Selber zu Testen.
Geprüft wurde nur in der Simulation der Software oder mit Simulator am Schreibtisch. Die Beispiele sind mit Sicherheitsschaltungen zu ergänzen.

Offline weiss_nix

  • Sr. Member
  • ****
  • Beiträge: 608
  • it has to be easy, it's a easy!
Antw:Programmieren mir ST
« Antwort #9 am: Februar 23, 2020, 19:28:31 Nachmittag »
@Juergen,
schön gelöst! Ich finde man sollte solche Codeschnipsel zugänglich machen zumal sich mehrere für ST-Programmierung interessieren.
Sollte ich (gefährliches) Halbwissen verbreiten, beuge ich demütig mein Haupt mit der Gewissheit versagt zu haben!
WICHTIG: Sämtliche Programme dienen lediglich der Veranschaulichung von Funktionen und sind nicht für den Produktiveinsatz geeignet!

Offline Juergen

  • easy god
  • *****
  • Beiträge: 1955
  • Jürgen
Antw:Programmieren mir ST
« Antwort #10 am: Februar 23, 2020, 19:52:57 Nachmittag »
Hallo weiss_nix, :)

ich dachte das ich anderer stelle den UF schon vorgestellt habe. Finde den Beitrag nicht mehr.
Kennwort vorsichtshalber wegen dem Fehler, das  Bausteine ohne Kennwort plötzlich eines Bekommen.
Mit freundlichem Gruß Juergen


Alle Programme sind nur Beispiele und Selber zu Testen.
Geprüft wurde nur in der Simulation der Software oder mit Simulator am Schreibtisch. Die Beispiele sind mit Sicherheitsschaltungen zu ergänzen.

Offline weiss_nix

  • Sr. Member
  • ****
  • Beiträge: 608
  • it has to be easy, it's a easy!
Antw:Programmieren mir ST
« Antwort #11 am: Februar 24, 2020, 17:51:20 Nachmittag »
@Juergen, ja da muss ich dir zustimmen! Im Bereich UF ist die easySoft V7.11 noch sehr buggy :(
Sollte ich (gefährliches) Halbwissen verbreiten, beuge ich demütig mein Haupt mit der Gewissheit versagt zu haben!
WICHTIG: Sämtliche Programme dienen lediglich der Veranschaulichung von Funktionen und sind nicht für den Produktiveinsatz geeignet!

Offline Malefiz

  • Newbie
  • *
  • Beiträge: 7
Antw:Programmieren mir ST
« Antwort #12 am: Februar 26, 2020, 18:24:15 Nachmittag »
Vielen Dank für eure Unterstützung
Eine abgewandelt Version von weiss_nix hat zum Erfolg geführt

Offline weiss_nix

  • Sr. Member
  • ****
  • Beiträge: 608
  • it has to be easy, it's a easy!
Antw:Programmieren mir ST
« Antwort #13 am: Februar 27, 2020, 07:46:43 Vormittag »
... danke für das positive Feedback
Sollte ich (gefährliches) Halbwissen verbreiten, beuge ich demütig mein Haupt mit der Gewissheit versagt zu haben!
WICHTIG: Sämtliche Programme dienen lediglich der Veranschaulichung von Funktionen und sind nicht für den Produktiveinsatz geeignet!