ST Programmierung Moeller S40

MarioR

Level-1
Beiträge
12
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich progge gerade ein wenig mit einer Moeller PS4-341,
IDE ist Moeller S40.

Gibt es denn keine Variablentypen welche Adressen speichern können?
bzw.
Gibt es Funktionen, die mir Adressen erzeugen?

Hintergrund dieser Frage:

Ich progge sonst C++, JAVA, VB.NET. Dort erzeuge ich eine Funktion
und übergebe ihr die "Adresse". In der S40 müsste ich ja für jede Adresse
die gleiche Funktion neu proggen.
Also:

Statt so (C++ like)
Code:
 TESTON(%I0.0.0.0.2);
TESTON(%I0.0.0.0.3)
dann so (S40)
Code:
TESTON2();
TESTON3();
mmm...


Gruß

Mario
 
Hää... ich lese nur Bahnhof. Kann aber auch daran liegen das es am Sonntag Morgen liegt.

Was willst Du nun an die Funktion übergeben?

Bei CoDeSys ST kann man auch Pointern aber das ist eher selten notwendig.


Schilder mal eine kleine Beispielaufgabe da kann man das besser erklären.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

... mal wieder Rolladensteuerung.

Dabei brauche ich immer die gleichen Funktionen:

RL_Hoch_Start(Adresse, Zeit)
RL_Hoch_Stop(Adresse)
RL_Runter_Start(Adresse, Zeit)
RL_Runter_Stop(Adresse)

RLGrp_Hoch_Start(Array of Adresse, Zeit)
RLGrp_Hoch_Stop(Array of Adresse)
RLGrp_Runter_Start(Array of Adresse, Zeit)
RLGrp_Runter_Stop(Array of Adresse)

Die Adressen brauche ich auch innerhalb der Funktionen, da ich einiges Prüfen muß.

Dazu mal noch eine andere Frage:

Kann man eigendlich selber sogenannte Herstellerfunktionsblöcke schreiben?

Gruß Mario
 
Ich nehme an es geht hier um Codesys? Dann baue Dir einfach einen Funktionsbaustein, der bekommt die Eingangsparameter (Taster, maximale Fahrzeit....) und die Ausgangsparameter (Ausgang, Anzeige HMI....). Für jeden Rolladen eine Instanz anlegen, fertig.
 
Ps4-341

Hallo,

die Programmiersoftware S40 ist eine Eigenentwicklung von Moeller nach
IEC 61131-3 und basiert nicht auf Codesys.

Die Adresse einer Variablen kannst du z.B. mit dem "&"-Operator (in AWL)
laden.
Du kannst es aber so machen wie Oberchefe es gesagt hat:
Programmier entsprechende Funktionen oder Funktionsbausteine und
versorge diese mit Parametern. Dafür mußt du die Adressen der variablen nicht
wissen.

MFG
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok, so habe ich es gemacht.

Ich habe eine FB Programmiert, welcher den Auf- und Abtaster bekommt und
drinnen kontrolliert was gemacht werden soll.

- Alles steht
- Auf drücken
- fährt hoch
- Ab drücken
- hält an
- noch mal ab drücken
- fährt runter
usw.

Für die Fahrzeit nehme ich einen INT Wert, da ich mit den Zeitbausteinen
nicht klarkomme. D.H. Ich könnte ja einen Ausschaltverzögerer nehmen und
Ihm sagen "Nach 30 Sec ausschalten", aber ich kann diese Fahrt dann nicht
Stoppen. Unterbrechen (Anhalten) kann ich ja schon, aber nicht Abbrechen.
Oder?

Nun wieder zur Fahrzeit. Ich würde gern einen Takt von ca. 50ms erzeugen
und diesem in den FB verwenden, dann wäre ja meine Fahrzeit-INT eine
Einheit von 50ms. Wie mache ich das am dümmsten?
Den Takt im FB erzeugen, oder draußen einen Takt erzeugen und die FB's
nach jedem Takt aufrufen?

Gruß Mario
 
Ich würde das gar nicht mit dem INT Wert machen.

Aber ich kenne die S40 Programmierung ja auch nich.

Ich würde als eingang für den FB eine TIME Variable anlegen und im FB eine oder zwei Instanzen von TOF Anlegen und diesen Benutzen um einen Impuls der Tasters zu verlänger (oder ähnliches). Schau mal in der Hilfe nach TOF und TON.
 
Hallo,

bin wieder da.

Schau mal in der Hilfe nach TOF und TON.

Aber wie breche ich diese Ausschaltverzögerung (TOF) vorzeitig ab?

Zur Erläuterung:

Ich würde eine TOF mit 30sec. auf den Taster "Hoch" legen und dann fährt
der Rolladen hoch. Nun drücke ich nach der Hälfte den Taster "Hoch" oder
"Runter" und der Rolladen soll stoppen. ??

Gruß Mario
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo noch mal,

so ich habe jetzt einen TimePulse benutzt. Dazu mal folgender CODE:

MainProg
Code:
PROGRAM RLST
VAR_GLOBAL
    FB_HAR:    FB_UD;

    TaktNormVollHoch:            UINT;
    TaktNormVollRunter:        UINT;
    TaktNormLueckeRunter:     UINT;

    HAR_FT_U:                    F_TRIG;
    HAR_FT_D:                    F_TRIG;

    HAR_I_U AT %I0.0.0.0.0:    BOOL;
    HAR_I_D AT %I0.0.0.0.1:    BOOL;
    HAR_O_U AT %Q0.0.0.0.0:    BOOL;
    HAR_O_D AT %Q0.0.0.0.1:    BOOL;
END_VAR

(*Zeiten für Rolladenfahrt festlegen in ms*)
TaktNormVollHoch := 8000;
TaktNormVollRunter := 8000;
TaktNormLueckeRunter := 4000;

(*Hausanschlussraum Taster Hoch / Runter*)
HAR_FT_U ( CLK := HAR_I_U);
HAR_FT_D ( CLK := HAR_I_D);
FB_HAR ( Up := HAR_FT_U.Q,
    Down := HAR_FT_D.Q,
    UpTakt := TaktNormVollHoch,
    DownTakt := TaktNormVollRunter,
    OutputUp => HAR_O_U,
    OutputDown => HAR_O_D);
END_PROGRAM
Funktionsbaustein FB_UD

Code:
FUNCTION_BLOCK FB_UD

VAR_INPUT
    Up:            BOOL;
    Down:            BOOL;
    UpTakt:        UINT;
    DownTakt:    UINT;
END_VAR

VAR_OUTPUT
    OutputUp:    BOOL;
    OutputDown:    BOOL;
END_VAR

VAR 
    TaktUp:        TimePulse;
    Stop:            BOOL;
    TaktDown:    TimePulse;
END_VAR
IF (OutputUp OR OutputDown) AND (Up OR Down) THEN
    Stop := TRUE;
ELSE
    Stop := FALSE;
END_IF;

TaktUp ( Set := Up,
    ReSet := Stop,
    PresetTime := UpTakt,
    PulseOutput => OutputUp,
    ElapsedTime => );

TaktDown ( Set := Down,
    ReSet := Stop,
    PresetTime := DownTakt,
    PulseOutput => OutputDown,
    ElapsedTime => );
END_FUNCTION_BLOCK
Zur Entwicklung habe ich meine SPS "ein bisschen zusammen geknüppert",
d.h. fest mit Kabel an die Stromversorgung angeschlossen, auch die
0V-Klemme der Digitalen Inputs. Nur als "Taster" benutze ich eine
Stromprüferspitze, welche ich an ein +24V-Kabel angeklemmt habe.
Damit tippe ich auf die Eingänge und simuliere so den Tasterdruck.

Nur ab und zu (na ja öfters als ab und zu) "spinnt" die Schaltung:
- Sie schaltet die Ausgänge direkt um, oder
- Sie schaltet einen Ausgang nicht an etc.

Liegt das an meinem "Taster"?

Gruß Mario
 
Entprellen

Also wenn ich sowas mit Tastendruck Starten/ Stoppen/ Halten und soweiter machen will entprelle ich die Tasten grundsätzlich immer.
Nimm die Funktion Flankenauswertung (R_TRIG bzw. F_TRIG) und schau dann mal weiter.
 
Hallo Serviceman,

die "Tasten" SIND entprellt. Bitte den Code lesen, dort sieht man,
daß ich den Tastendruck zuerst an einen F_Trig leite und dessen
Ausgang an den FB.

Gruß Mario
 
die "Tasten" SIND entprellt. Bitte den Code lesen, dort sieht man,
daß ich den Tastendruck zuerst an einen F_Trig leite und dessen
Ausgang an den FB.

Das ist aber keine Entprellung, wenn der Taster prellt, dann kommt Deine Flanke auch öfters. Da mußt Du schon mit einem Timer arbeiten (oder aber kann nur der Taster für die andere Richtung die Bewegung wieder stoppen, dann kannst Du Dir bei der ersten Flanke einen Merker setzen und die Taste solange blockieren bis wieder die Taste für die Gegenrichtung gekommen ist und umgekehrt genauso.

Eine Entprellung kann so aussehen:

Code:
    FUNCTION_BLOCK Entprellung
VAR_INPUT
    Taster: BOOL;
END_VAR
VAR_OUTPUT
    Flanke: BOOL;
END_VAR
VAR
    Timer: TOF;
END_VAR

Code:
(***********************************************************************************************)
(*            Funktion für die Entprellung von Tastern                            *)
(*                                                                            *)
(***********************************************************************************************)

IF Taster AND NOT Timer.Q THEN
Flanke:= TRUE;
ELSE
Flanke:= FALSE;
END_IF
Timer(IN:=Taster , PT:=DINT_TO_TIME(G_Prellzeit) );
 
Zurück
Oben