# OPC-UA Daten werden von Client geschrieben kommen aber nicht im DB an



## M0077227 (7 Mai 2021)

Hallo zusammen,

ich bin langsam am Ende meines Lateins*ACK*

UNd zwar geht es draum, dass ich eine bidirektionale kommunikation zwischen einem MES und einer Steuerung afbauen soll. Als Kommunikationsglied wird der interne OPC-UA Server der Steuerung genutzt. Nun habe ich aber das Problem, dass die Kommuniktaion an sich zwar läuft aber es immer wiedermal dazu kommt, dass Daten nicht richtig in der Steuerung ankommen.

Ich habe bereits ein Ticket bei Siemens aufgemacht aber noch keine Lösung bekommen, kennt jemand von euch dieses Problem bzw. hat jemand eine Lösung


----------



## MFreiberger (7 Mai 2021)

Moin 0077227,

was heißt "Daten nicht richtig in der Steuerung ankommen"? Sind Werte Verändert? Kommen sie nicht richtig "durch"? 

Wie wird auf die Daten zugegriffen?
- read/write
- registered read/write
- subscription (publishzeit? samplingzeit?)?

VG

MFreiberger


----------



## M0077227 (7 Mai 2021)

IM Log des Clients sehe ich das er die Daten erfolgreich geschreiben werden aber im DB der Steuerung kommen diese Daten nicht an also in meinem Fall wird der Trigger nicht mehr erhöht sondern bleibt unverändert.

Der Datenzugriff läuft über read/write der Clinet schreibt die Information zurück sobal er sie erhält im Server selbst arbeite ich mit einer publishingtime von 100ms habe mit der Zeit aber auch schon gespielt und keine Verbesserung erreicht.

Das Problem, dass die Daten nicht richtig ankommen tritt aber auch nicht immer auf, also wir Produzieren ca. alle 2 Minuten ein Teil und alle Zehnteile ca. tritt der Frehler auf. Es ist aber auch kein Muster erkennbar


----------



## blackpeat (7 Mai 2021)

wird von beiden Seiten auf die Daten geschrieben oder nur von einer Seite?


----------



## M0077227 (7 Mai 2021)

von beiden Seiten ich habe da aber schon einmal getraced und sehe nicht das da irgendwas überschreiben werden sollte.
Was auch meine erste Vermutung


----------



## MFreiberger (7 Mai 2021)

Moin 0077227,

Hast Du mal den Wert mit einem anderen Client (z.B. UaExpert) beobachtet?

Wie viele Nodes kann der Server bereitstellen, wie viele werden vom Client abgefragt?

Gibt es Verbindungslatenzen, -unterbrechungen, etc.?

VG

MFreiberger


----------



## blackpeat (7 Mai 2021)

Was für eine Steuerung hast du? Bei Siemens z.b. sind die Abarbeitungspunkte nicht synchronisiert. Das heißt es wir auch mal unter dem Zyklus etwas in deine DB's geschrieben. Wenn du da deine Daten z.B. in temporären Variablen zwischen speicherst und die dann zurück kopierst kann es sein das die Daten überschrieben werden.


----------



## Heinileini (7 Mai 2021)

M0077227 schrieb:


> von beiden Seiten ich habe da aber schon einmal getraced und sehe nicht das da irgendwas überschreiben werden sollte.


Was denn nun? Wird oder wird nicht? 

Meinst Du, es wird zwar geschrieben, aber immer nur das, was eigentlich sowieso schon drin steht?


----------



## M0077227 (7 Mai 2021)

MFreiberger schrieb:


> Moin 0077227,





MFreiberger schrieb:


> Hast Du mal den Wert mit einem anderen Client (z.B. UaExpert) beobachtet?
> 
> Wie viele Nodes kann der Server bereitstellen, wie viele werden vom Client abgefragt?
> 
> ...




Ja das Habe ich bereits gemacht aber ich sehe auch da nichts anderes also auch das gleiche Bild als das der Client nichts schreiben würde aberlaut Log wurde es geschrieben


----------



## M0077227 (7 Mai 2021)

Heinileini schrieb:


> Was denn nun? Wird oder wird nicht?





Heinileini schrieb:


> Meinst Du, es wird zwar geschrieben, aber immer nur das, was eigentlich sowieso schon drin steht?




Das Ziel wird prinzipell von der SPS und vom Client beschrieben und zwar in der Form, dass die Steuerung den Wert ungerade setzt und der Client den Wert grade setzt aber die Steuerung schreibt immer nur mit einer Flanke also kann es auch nicht sein das die Steuerung den Wert des Clients überschreibt


----------



## M0077227 (7 Mai 2021)

blackpeat schrieb:


> Was für eine Steuerung hast du? Bei Siemens z.b. sind die Abarbeitungspunkte nicht synchronisiert. Das heißt es wir auch mal unter dem Zyklus etwas in deine DB's geschrieben. Wenn du da deine Daten z.B. in temporären Variablen zwischen speicherst und die dann zurück kopierst kann es sein das die Daten überschrieben werden.




Ich habe einmal eine 1512F und eine 1517F von Siemesn aber die antwort des Clients dauert mindestens 50ms und ich habe einen Zyklus von 7ms also vergehen normal einige Zyklen bis die Antwort kommt oder sehe ich das Falsch?

Was könnte ich denn machen um das zu verhindern?


----------



## blackpeat (7 Mai 2021)

Wenn ich dich richtige verstehe Schreibt die 

Steuerung eine *1*
Dann wird über OPC eine *2 *geschickt
Die SPS schreibt dann wieder eine *3*
usw.

Wird über OPC geguckt was drin steht bevor geschrieben wird?

Wie sieht dein Code aus der das beschreibt?

Aber wie geschrieben die Zyklen sind nicht synchronisiert, der OPC schreibt also irgendwann während des 7ten Zyklus (in deinem Beispiel) in deinen DB. 

Wenn du in deinem Code also ständig schreibst kann es sein das du das auch mal überschreibst oder das am Anfang eine andere Zahl drin steht als am Ende.

Bespiel: Wann das Problem auftritt

```
tempVar:=DB.Var;
weiter Code
hier schreibt der OPC 
weiter Code
DB.VAR:=tempVar;
```

Bespiel: Wann das Problem nicht auftritt

```
hier schreibt der OPC
tempVar:=DB.Var;
weiter Code
DB.VAR:=tempVar;
```


----------



## PN/DP (7 Mai 2021)

M0077227 schrieb:


> Das Ziel wird prinzipell von der SPS und vom Client beschrieben


Die Variable die vom OPC Client beschrieben wird, übergibst Du die per IN_OUT an einen Baustein? (Übergabe byValue)

Falls Ja: Wenn der OPC Client die Variable genau dann beschreibt, wenn die Baustein-Instanz läuft, dann bekommt der Baustein das nicht mit und nach dem Ende des Baustein-Durchlaufs wird der Wert (so wie der Baustein ihn hinterläßt) auf die angeschlossene Variable zurückgeschrieben - die zwischenzeitliche Änderung der angeschlossenen Variable geht also verloren! Du müsstest die Übergabe so lösen, daß der Wert byReferenz übergeben wird, z.B. die Variable in eine Struktur packen und die Struktur übergeben, dann wird nicht nach Bausteinende zurückgeschrieben. Achtung: der Wert kann sich jederzeit ändern, bei mehrmaligen Zugriffen kann im zweiten Zugriff ein anderer Wert drin stehen als beim ersten Zugriff! Für mehrmalige Zugriffe müsste der Code sich eine Kopie ("Prozess"-Abbild) der Variable machen.

Harald


----------



## Heinileini (7 Mai 2021)

M0077227 schrieb:


> Das Ziel wird prinzipell von der SPS und vom Client beschrieben und zwar in der Form, dass die Steuerung den Wert ungerade setzt und der Client den Wert grade setzt aber die Steuerung schreibt immer nur mit einer Flanke also kann es auch nicht sein das die Steuerung den Wert des Clients überschreibt


D.h. sozusagen, dass die Steuerung das niederwertigste Bit der Variablen immer nur setzt und der Client es immer nur rücksetzt.
Das sollte eigentlich funktionieren, vorausgesetzt beide Partner lesen zuerst den Zustand und der eine setzt einmalig nur dann, wenn das Bit 0 ist und der andere rücksetzt einmalig nur, wenn das Bit 1 ist.
Hinter "einmalig" versteckt sich natürlich "eine Art von" FlankenAuswertung.
Generell ist es aber vernünftiger, für jede Richtung eine eigene Variable zu benutzen.


----------



## JesperMP (7 Mai 2021)

Was passiert wenn du probierst mittels ein OPC test client dieselbe Addressen zu schreiben ?
Eventuell zuerst den MES OPC Client entfernen.


----------

