# siemens sps zu hardware kommunizieren mit Rs422/485



## spsEngineering (1 Oktober 2021)

Ich habe hier mit s7-1200 sps mit Rs485 zwei Temperatur messung  kamera angeschlossen , und habe ich jeder kamera eine mit Busadresse definiert. 001 und 002 . das problem ist das jetzt kamera nimmt alle daten was mit port Rs485 kommt , hat jemand ahnung wie  kann ich die 2 unterscheiden damit nimmt eigene daten.  ich habe von punkt zu punkt kommunikation , send ptp und rcv ptp gearbeitet. wenn ich mit kommando 001?T$L$R schicke dann es muss ein antwort mit 001!T = 25.5°C$R geben , manchmal kriege ich das aber ab und zu kriege komische zeichen. Und der Kamera hat auch terminierung widerstand drinne,


----------



## Heinileini (1 Oktober 2021)

Das habe ich im letzten JahrTausend mit einem PC per Basic-Programm und mit zig Jumo-Reglern problemlos zum Laufen gebracht - allerdings an Siemens vorbei.
Ich hoffe, Du schüttest die Schnittstelle nicht mit Aufträgen so zu, dass es eng wird. Immer schön abwarten, bis ein Auftrag zu Ende ausgeführt ist, eher der nächste ausgegeben wird. Mehr kann ich leider nicht beitragen.


----------



## spsEngineering (3 Oktober 2021)

Heinileini schrieb:


> Das habe ich im letzten JahrTausend mit einem PC per Basic-Programm und mit zig Jumo-Reglern problemlos zum Laufen gebracht - allerdings an Siemens vorbei.
> Ich hoffe, Du schüttest die Schnittstelle nicht mit Aufträgen so zu, dass es eng wird. Immer schön abwarten, bis ein Auftrag zu Ende ausgeführt ist, eher der nächste ausgegeben wird. Mehr kann ich leider nicht beitragen.


kannst du mir bisschen hinweis geben wie kann ich die 2 hardware in einem serial port einsetzen , waere sehr dankbar.


----------



## Thomas_v2.1 (3 Oktober 2021)

Bei RS485 ist das Protokoll ja nicht festgelegt, d.h. wann sich ein Teilnehmer überhaupt vom Empfangs- auf den Sendemodus umschalten darf.
Wenn das bei dir mit 001? und 002? als geschieht, muss das ja in den Geräten dokumentiert sein. Was sind das denn genau für Temperaturmessungen?
Ich würde mal versuchen nur einen Teilnehmer am Bus anzuschließen wie es sich dann verhält. Dann sollte sich ja nur unter einer Adresse jemand melden.


----------



## JSEngineering (4 Oktober 2021)

Moin Sarjan,

das Thema hängt doch bestimmt mit diesem Thread zusammen:





						TIA Portal V17 kommunikation fehler.
					

Ich habe mit CM1241 RS422/485 ein temperatur sensor verbundet und will der temperatur auslesen. ich habe als baustein punkt zu punkt kommunikation benutzt aber manchmal kriege ich gute temperatur aber manchmal mit unknown zeichen. Habe so viel recherchiert aber kriege ich kein antwort. können...




					www.sps-forum.de
				




Bisher war von einer Kamera die Rede. Funktioniert das denn jetzt mit einer Kamera?
Erst einmal nur mit einer probieren und das sauber zum Laufen bekommen und dann um die zweite Kamera kümmern.


----------



## spsEngineering (4 Oktober 2021)

JSEngineering schrieb:


> Moin Sarjan,
> 
> das Thema hängt doch bestimmt mit diesem Thread zusammen:
> 
> ...


es funktioniert ohne problem des erste kamera. Nachdem ich zweite kamera verbundet habe bei receive buffer nimmt alle temperatur mit unknown zeichen, das ist die problem jetzt.


----------



## JSEngineering (4 Oktober 2021)

Für mein Verständnis:
Du sendest: 001?T$L$R
Antwortet jetzt Kamera 1 oder Kamera 2 oder beide?

Wenn beide senden, dann hast Du Überlagerung der Telegramme = kaputt.


----------



## spsEngineering (4 Oktober 2021)

JSEngineering schrieb:


> Für mein Verständnis:
> Du sendest: 001?T$L$R
> Antwortet jetzt Kamera 1 oder Kamera 2 oder beide?
> 
> Wenn beide senden, dann hast Du Überlagerung der Telegramme = kaputt.


ich habe 2 send und Rcv bausteine . erste kamera habe ich busadresse 001 und zweite 002 , deswegen schicke ich erste 001?T$L$R danach 002?T$L$R . aber in Receive habe ich nicht genau temperatur gekriegt.


----------



## JSEngineering (4 Oktober 2021)

Du fragst also beide gleichzeitig an?
Das wird nicht funktionieren...

1. Frage Kamera 1
2. Warte auf Antwort Kamera 1
3. Frage Kamera 2
4. Warte auf Antwort Kamera 2
5. Beginne mit 1.



Heinileini schrieb:


> Ich hoffe, Du schüttest die Schnittstelle nicht mit Aufträgen so zu, dass es eng wird. Immer schön abwarten, bis ein Auftrag zu Ende ausgeführt ist, eher der nächste ausgegeben wird.


----------



## spsEngineering (4 Oktober 2021)

JSEngineering schrieb:


> Du fragst also beide gleichzeitig an?
> Das wird nicht funktionieren...
> 
> 1. Frage Kamera 1
> ...


Ich habe mit clock eingesetzt in frage des send ptp und danach timer zum Rcv . genauso habe ich mit andere camera gemacht. Ist es ordnung oder noch etwas müssen wir machen


----------



## Heinileini (4 Oktober 2021)

"AlwaysTRUE" am Eingang des Timers? Was soll das bewirken?
Ich mache mir mittlerweile Gedanken, ob nicht der Receive bereits das Abfragen der Information enthält. Ich kenne leider den FunktionsUmfang und die Funktionsweise des Bausteins nicht.


----------



## JSEngineering (4 Oktober 2021)

Heinileini schrieb:


> "AlwaysTRUE" am Eingang des Timers? Was soll das bewirken?
> Ich mache mir mittlerweile Gedanken, ob nicht der Receive bereits das Abfragen der Information enthält. Ich kenne leider den FunktionsUmfang und die Funktionsweise des Bausteins nicht.


Das bewirkt nur, daß der Receive 1s nach Programmstart aktiv wird.
Ob der Receive auch das Senden empfängt 🤔 gute Frage... Vermute aber, daß der CP so intelligent sein wird, das zu unterscheiden.

Ich würde auf jeden Fall das Send_PTP.Done an das RCV_PTP.EN_R anbinden.

Und wie gesagt: nicht beide Kameras gleichzeitig ansprechen, dann wollen auch beide gleichzeitig antworten.

Das ganze am besten in eine Schrittkette einbauen.


----------



## Heinileini (4 Oktober 2021)

JSEngineering schrieb:


> Ob der Receive auch das Senden empfängt 🤔 gute Frage... Vermute aber, daß der CP so intelligent sein wird, das zu unterscheiden.


Ich glaube, da haben wir uns falsch verstanden. Die Leitungen für Senden und Empfangen sind doch zwei separate Leitungen und die SendeLeitung des CP ist doch nicht auf die EmpfangsEingang verdrahtet!?
Mir schwebte eher etwas in der Richtung Get vor. Dass nämlich mit dem Baustein eine bestimmte Information abgeholt werden soll und dazu selbstverständlich zunächst die Information gesendet werden muss, welche Information man zu lesen gedenkt.
Ich denke mal, dass man diesen Ablauf zu Fuss mit Send und Receive in "EigenRegie" programmieren muss.



JSEngineering schrieb:


> Das bewirkt nur, daß der Receive 1s nach Programmstart aktiv wird.


Wie kann man dem Receive mitteilen "jetzt bitte den EmpfangsPuffer nicht mit dem nächsten empfangenen Telegramm überschreiben, weil ich ihn noch nicht ausgwertet habe"? Ich würde erwarten, dass man dazu den EN_R "wegnimmt", bis man wieder bereit ist, etwas zu empfangen.
Was macht denn der Receive, wenn ich den EN_R dauernd (sozusagen für mehrere Telegramme) auf TRUE belasse?

Die SendeAufträge bei betätigter Taste im 10-Hz-Rhythmus hinauszudonnern finde ich etwas abenteuerlich.


----------



## JSEngineering (4 Oktober 2021)

Heinileini schrieb:


> Ich glaube, da haben wir uns falsch verstanden. Die Leitungen für Senden und Empfangen sind doch zwei separate Leitungen und die SendeLeitung des CP ist doch nicht auf die EmpfangsEingang verdrahtet!?


Naja, eigentlich nicht, RS485 arbeitet in der Regel mit 2-Draht... also kann ich theoretisch selber hören, was ich sage... aber das sollte eigentlich der CP regeln können...



Heinileini schrieb:


> Wie kann man dem Receive mitteilen "jetzt bitte den EmpfangsPuffer nicht mit dem nächsten empfangenen Telegramm überschreiben, weil ich ihn noch nicht ausgwertet habe"?


Nun ja, den Empfangspuffer steuerst Du damit glaube ich nicht, nur die Auswertung des selben. Denn der Puffer liegt ja im CP und der Receive geht nur vorbei und guckt nach, ob da was liegt. Wenn jetzt der Puffer durch irgendwas geflutet würde, könntest Du das nicht verhindern. Dann gibt es den Puffer-Überlauf. Dann muß man öfter mit Receive vorbeikommen und den Inhalt abholen.

Ich bin immer noch bei der Schrittkette - und da kann man dann auch schick bestimmen, wie oft man die anstößt, ob mit 1Hz oder schneller...
Vielleicht will man ja bei Tastendruck auch nur einmal lesen!?


----------



## Heinileini (4 Oktober 2021)

JSEngineering schrieb:


> Naja, eigentlich nicht, RS485 arbeitet in der Regel mit 2-Draht... also kann ich theoretisch selber hören, was ich sage... aber das sollte eigentlich der CP regeln können...


Dafür finde ich keinen Beleg. Da ist die Rede von HalbDuplex mit 2 Leitungen und VollDuplex mit 4 Leitungen.
In beiden Fällen wird das Vorhandensein einer weiteren Leitung (GND bzw. BezugsPotenzial) oft verschwiegen bzw. nur angedeutet.
Die 2 Leitungen bei 2-Draht sind RxD und TxD (*r*eceive und *t*ransmit = send).
Die 4 Leitungen bei 4-Draht sind RxD+ und RxD- sowie TxD+ und TxD-, weil hier Differenz-Ausgänge und -Eingänge verwendet werden.

In beiden Fällen ist damit nicht gemeint, dass Sende- und EmpfangsDaten sich dieselbe Leitung teilen bzw. abwechselnd belegen.
Im Übrigen enthalten beide Bezeichnungen (HalbDuplex und VollDuplex) das Wort Duplex, das ja besagt, dass gleichzeitig empfangen und gesendet werden kann.



JSEngineering schrieb:


> Vielleicht will man ja bei Tastendruck auch nur einmal lesen!?


Davon gehe ich auch aus. Aber das muss man erst mal schaffen, wenn man mit dem TastenDruck ein 10-Hz-Signal moduliert.


----------



## PN/DP (4 Oktober 2021)

Der hier beim Fragesteller verwendete RS485 verwendet wie üblicherweise 2 Leitungen (A und B, oder P und N, manchmal auch als RxTx+ und RxTx- bezeichnet, GND wird nicht benötigt!), die abwechselnd für Senden und Empfangen verwendet werden (halbduplex). Es darf immer nur ein Teilnehmer senden. Slaves dürfen nur nach Aufforderung senden in einem je nach Protokoll vorher festgelegten Zeitfenster. Deshalb muß immer zu nur einem Teilnehmer etwas gesendet werden und die Antwort (oder Timeout) abgewartet werden, bevor mit dem nächsten Teilnehmer kommuniziert werden kann.

Harald


----------



## spsEngineering (5 Oktober 2021)

PN/DP schrieb:


> Der hier beim Fragesteller verwendete RS485 verwendet wie üblicherweise 2 Leitungen (A und B, oder P und N, manchmal auch als RxTx+ und RxTx- bezeichnet, GND wird nicht benötigt!), die abwechselnd für Senden und Empfangen verwendet werden (halbduplex). Es darf immer nur ein Teilnehmer senden. Slaves dürfen nur nach Aufforderung senden in einem je nach Protokoll vorher festgelegten Zeitfenster. Deshalb muß immer zu nur einem Teilnehmer etwas gesendet werden und die Antwort (oder Timeout) abgewartet werden, bevor mit dem nächsten Teilnehmer kommuniziert werden kann.
> 
> Harald


Habe ich mit Clock gearbeitet jeder 1sekunde schickt die daten und nimmt mit Receive Buffer. Aber wie kann ich da fragen zu warten nach etwas geschickt habe.  kann ich mein program zeigen wenn du willst. Danke erst mal für Hilfe.


----------



## spsEngineering (12 Oktober 2021)

ich habe hier mein code unten eingefügt . kann jemand helfen damit der program zu lösen und wollte auch schrittkette bauen aber irgendwo der program stoppt selber. und da in code habe ich length genommen weil wenn etwas buffer in Receive kommt dann incrementiert die length. 
wenn jemand mit quellcode hilft dann wäre hilfreich.


----------



## JSEngineering (13 Oktober 2021)

Moin SPSengineering,

sind die beiden Code-Fragmente Alternativen oder laufen die irgendwie zusammen?
Beim FUP-Ausschnitt sehe ich am ersten Send ein dauerhaftes TRUE. Ich weiß nicht, ob der Baustein auf Flanke reagiert... Entweder sendet er genau ein Mal oder aber dauerhaft. Die weiteren Bausteine hingegen sind mit FALSE deaktiviert!?

Im SCL-Ausschnitt wird es noch konfuser: Du fragst ein Request vom Send ab und aktivierst damit den Receive!? Warum benutzt Du nicht die Done und NDR Ausgänge der Bausteine?

Wenn Du schon in SCL programmierst, dann nutze doch die CASE-Anweisung, um eine vernünftige Schrittkette zu programmieren:


```
VAR Temp
    step : int;
end_var

CASE step OF
    0: //Send-Bausteinaufruf mit REQ := true
       step := step + 1;
    1: //Send-Bausteinaufruf mit REQ := false
       IF Send.Done THEN
          step := step + 1;
       END_IF;
    2: //Receive-Baustein-Aufruf
       IF Receive.NDR THEN
             step := step + 1;
       END_IF;
    3: // Auswerung der empfangenen Daten
       step := ...// entweder wieder zu 0 springen oder weiter mit weiteren Schritten für die zweite Kamera
          
END_CASE;
```

Das muß natürlich weiter ausgeschmückt werden mit Fehlerabfrage etc. pp.


----------



## spsEngineering (13 Oktober 2021)

JSEngineering schrieb:


> Moin SPSengineering,
> 
> sind die beiden Code-Fragmente Alternativen oder laufen die irgendwie zusammen?
> Beim FUP-Ausschnitt sehe ich am ersten Send ein dauerhaftes TRUE. Ich weiß nicht, ob der Baustein auf Flanke reagiert... Entweder sendet er genau ein Mal oder aber dauerhaft. Die weiteren Bausteine hingegen sind mit FALSE deaktiviert!?
> ...


ich habe probiert erst mal nur eine kamera in schrittkette zu laufen aber es schickt nur einmal die Temperatur und stoppt.  ist da irgendwo fehler mit Send REQ ? Habe ich foto unten beigefügt .


----------



## JesperMP (13 Oktober 2021)

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 (13 Oktober 2021)

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.


----------



## JesperMP (13 Oktober 2021)

- dobbelpost -


----------



## JSEngineering (13 Oktober 2021)

JesperMP schrieb:


> 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.


----------



## spsEngineering (20 Oktober 2021)

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.


----------



## Heinileini (20 Oktober 2021)

spsEngineering schrieb:


> ... obwohl 1 gesetzt ist , springt der nicht zum 1 anweisung.


Wo ist die CASE-Anweisung, die das "Springen" organisiert?


----------



## spsEngineering (20 Oktober 2021)

Heinileini schrieb:


> Wo ist die CASE-Anweisung, die das "Springen" organisiert?


Da oben das case OF  ist versteckt, fängt von 0 und 1 ...2 geht so weiter. aber 0 ist schon ausgeführt aber 1 geht nicht weiter.


----------



## JSEngineering (20 Oktober 2021)

spsEngineering schrieb:


> Da oben das case OF  ist versteckt, fängt von 0 und 1 ...2 geht so weiter. aber 0 ist schon ausgeführt aber 1 geht nicht weiter.


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.


----------



## spsEngineering (20 Oktober 2021)

JSEngineering schrieb:


> 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


----------



## Windoze (20 Oktober 2021)

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 (20 Oktober 2021)

spsEngineering schrieb:


> 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.


----------



## JSEngineering (20 Oktober 2021)

Warum kombinierst Du eine Schrittkette mit Taktmerkern?
Hast Du stattdessen mal überlegt/versucht, die Schrittkette aus #19 umzusetzen?


----------



## spsEngineering (20 Oktober 2021)

JSEngineering schrieb:


> Warum kombinierst Du eine Schrittkette mit Taktmerkern?
> Hast Du stattdessen mal überlegt/versucht, die Schrittkette aus #19 umzusetzen?


Ich kann nicht das einsetzen ,weil der send.Done und RCV.ndr geht niemals zu TRUE. Deswegen kann ich nicht machen.


----------



## PN/DP (20 Oktober 2021)

spsEngineering schrieb:


> 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.

```
"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 (20 Oktober 2021)

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


----------



## spsEngineering (22 Oktober 2021)

Hier habe ich mein program funktioniert gut und läuft in schrittkette . erst gibt erste kamera temperatur 001 dann gibt andere kamera temperatur 002
aber jetzt problem ist das der antwort kriege ich langsamer. habe ich auch ein alarm eingesetzt wenn  mehr 30 grad ist blinkt led es blinkt led und gibt temperatur aber langsamer.  danach habe ich clock bisschen höher gemacht mit 5Hz aber kriege ich antwort vertauscht mit platz in receive buffer. der schickt nicht in schrittkette .  hat jemand ahnung damit.


----------



## JSEngineering (22 Oktober 2021)

Ich würde die ganzen Timer und Blinker aus der Schrittkette raus nehmen, die benötigst du da eigentlich nicht. 
Statt dessen die Flanken für das Request selber über die Schrittfolge erzeugen.
Und dann die Schrittkette mit einem Blinker oder Timer zyklisch anstoßen.


----------

