siemens sps zu hardware kommunizieren mit Rs422/485

JesperMP

Well-known member
Beiträge
6.413
Punkte Reaktionen
1.208
Zuviel Werbung?
->Hier kostenlos registrieren
JSEngineering hat es gerade in den vorigen Beitrag beschrieben.
Du kannst nicht ein REQ fest auf TRUE schalten. Die Send wird nur bei eine steigende Flanke angestossen.
 

JesperMP

Well-known member
Beiträge
6.413
Punkte Reaktionen
1.208
Du hast einfach JSEngineerings code 1-zu-1 reinkopiert ?? obwohl das er schreint "C-ähnlich". Es ist nur einen übergeordnete Beispiel wie man es machen konnte. Die Implementierung benötigt etwas mehr.
Wenn man dein Code anschaut, dann denke ich dass deine Benutzername "SPS Engineering" etwas irreführend ist.
Bei "Engineering" versteht man dass man einen Tiefen technischen Kenntniss zu den Gebiet hat.
 

JSEngineering

Well-known member
Beiträge
1.024
Punkte Reaktionen
254
Du hast einfach JSEngineerings code 1-zu-1 reinkopiert ?? obwohl das er schreint "C-ähnlich". Es ist nur einen übergeordnete Beispiel wie man es machen konnte. Die Implementierung benötigt etwas mehr.
Wenn man dein Code anschaut, dann denke ich dass deine Benutzername "SPS Engineering" etwas irreführend ist.
Bei "Engineering" versteht man dass man einen Tiefen technischen Kenntniss zu den Gebiet hat.
Meine Kommentare sind nicht zur Schönheit da... da gehören Deine Bausteine hin... und wenn Du schon meinen Code 1:1 kopierst, ohne Deine Bausteine einzufügen, dann mußt Du zumindest eine Verbindung per Steuer-Variablen zu Deinem Code herstellen.
Fertigen Code kannst Du hier in den seltensten Fällen erwarten.
 
OP
S
Beiträge
16
Punkte Reaktionen
0
Hier habe ich die code in scl geschrieben das hier markiert ist counter obwohl 1 gesetzt ist , springt der nicht zum 1 anweisung. kann jemand mir helfen damit . Hier will ich in schrittkette laufen. Danke.
 

Anhänge

  • counter.JPG
    counter.JPG
    145,8 KB · Aufrufe: 9
OP
S
Beiträge
16
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Kann es sein, dass Du den Counter in jedem Zyklus mit 0 initialisierst?
entweder über eine Anweisung vor/nach dem Case oder ist Counter eventuell eine TEMP Variable?

Mehr Code wäre hier hilfreich.
counter habe ich oben in Temp als int definiert. aber wenn bedingung erfüllt ist muss es unten zum 1 springen aber geht nicht unten. Hat jemand lösung. danke
 

Anhänge

  • counter2.JPG
    counter2.JPG
    77 KB · Aufrufe: 5
  • counter.JPG
    counter.JPG
    95,4 KB · Aufrufe: 5

Windoze

Well-known member
Beiträge
157
Punkte Reaktionen
82
Temp-Variablen speichern ihren Wert nur bis der Baustein verlassen wird. Im nächsten Zyklus steht da wieder 0 drin. Verschiebe die Variable mal in den Static Bereich.
 

JSEngineering

Well-known member
Beiträge
1.024
Punkte Reaktionen
254
counter habe ich oben in Temp als int definiert. aber wenn bedingung erfüllt ist muss es unten zum 1 springen aber geht nicht unten. Hat jemand lösung. danke
Das hab ich vermutet. Der Wert wird nicht bis zum nächsten Zyklus gespeichert und ist damit in jedem Zyklus 0. Ab damit in STATIC. Dort werden die Werte zyklusübergreifend gespeichert.
 

PN/DP

User des Jahres 2011 - 2013; 2015 - 2017; 2020
Beiträge
17.235
Punkte Reaktionen
5.072
Ich kann nicht das einsetzen ,weil der send.Done und RCV.ndr geht niemals zu TRUE. Deswegen kann ich nicht machen.
Bist Du sicher? DONE und NDR werden nur für einen Zyklus aktiv, das kann man fast nie beobachten. Du könntest einen Zähler mit DONE und NDR verschalten, dann siehst Du ob sich der Zählerstand ändert.

Wenn DONE und NDR wirklich niemals TRUE werden, dann funktioniert das Senden schon gar nicht. Entweder wird der Code gar nicht ausgeführt oder gar kein Sendeauftrag aktiviert (REQ) oder das Send liefert einen ERROR + STATUS, was auch nur einen Zyklus aktiv ist. Direkt nach dem Send-Baustein solltest Du den Error-STATUS irgendwohin sichern/speichern, um den Wert sehen zu können.
Code:
"SEND_PTP_DB"(...
              DONE => "SEND_PTP_DB".DONE,
              ERROR => "SEND_PTP_DB".ERROR,
              ...
             );

//für Beobachten ERROR-STATUS speichern
IF "SEND_PTP_DB".ERROR THEN
    #static_Last_SEND_ERRSTATUS := "SEND_PTP_DB".STATUS;
    #static_ERROR_counter := #static_ERROR_counter + 1;
END_IF;

//für Beobachten erfolgreiche Sendeaufträge mitzählen
IF "SEND_PTP_DB".DONE THEN
    #static_DONE_counter := #static_DONE_counter + 1;
END_IF;

Übrigens: das Speichern der FB-Instanz-Ausgänge in die selbe Instanz (auf sich selbst kopieren wie z.B. DONE => "SEND_PTP_DB".DONE) ist nicht nötig, kann man aber machen um die Werte einfacher beobachten zu können. Was bei Werten, die nur einen Zyklus lang anliegen, aber nicht viel bringt.

Harald
 

PN/DP

User des Jahres 2011 - 2013; 2015 - 2017; 2020
Beiträge
17.235
Punkte Reaktionen
5.072
Zuviel Werbung?
->Hier kostenlos registrieren
Dein "IEC_Timer_0_DB".TON(IN := TRUE, ...) wird nicht funktionieren, wenn der Timer nicht auch irgendwo mal mit IN := FALSE aufgerufen wird.
Merke: Timer niemals nur bedingt/manchmal aufrufen, sondern unbedingt immer.
Merke: TON benötigen an IN einen FALSE/TRUE-Übergang zum Starten (der TON muß auch das FALSE an IN mal "sehen")

Harald
 
Oben