# Mit Sharp7 Dateien kopieren funktioniert nur im Simulator



## tommylik (20 Juni 2022)

Servus,

Ich habe mir mit Visual Studio 2019 ein kleines NetFramework 4.8 Projekt erstellt.

Aufgabe von diesem kleinen Tool ist sich mit einer S7-400 zu verbinden und auf ein zyklisches Trigger Signal (ca. alle 65sek.) zu warten und damit dann
einige File I/O Aktionen durchzuführen. Kopieren und verschieben von Dateien und Ordner teils Lokal aber auch über das Netzwerk.
Ich benutze für die Verbindung mit der S7 die Sharp7.dll. Das ganze habe ich mit NetToPLCsim getestet. Das Trigger Signal und diverse Variablen
habe ich mir im Simulator gesetzt und das funktioniert auch  alles so wie es soll. Die Winforms zeigt mir alles an was sie anzeigen soll. 
Und alle Dateien so wie Ordner werden einwandfrei von der jeweiligen Quelle in das Zielverzeichnis kopiert oder verschoben.
Starte ich diese Tool auf dem eigentlichen PC mit der echten CPU funktioniert es nicht. Dazu noch ein paar Infos. NetFramework 4.8 ist installiert.
Vorlage und Basis für mein Projekt beruht auf: http://snap7.sourceforge.net/sharp7.html
Bei meinen ersten Versuchen hatte ich noch nicht den Backgroundworker. Da hat das kopieren zwar funktioniert 
aber die Software hat sich wegen dem kopieren aufgehängt und war nicht mehr bedienbar bis das kopieren fertig war.
Mit dem Backgroundworker ist das Tool stabiler geworden im Ablauf aber in Verbindung einer echten SPS passiert fast Garnichts.
Ich habe so gar eine Progress Bar eingebaut um das kopieren zu visualisieren und im Simulator passt die Anzeige auch zum kopieren der Dateien.
In Verbindung mit der echten SPS sieht es so aus als wenn das kopieren erst Minuten nach dem Trigger Signal gestartet wird.
In der Progress Bar erscheint dann Minuten später dann mal die 0% und das wars. Mit dem Simulator ist das in einigen Sek. auf 100%.
Meine einzige Vermutung die ich äußern kann, ist das in dem Code noch ein gravierender Fehler ist. Da aber mit dem Simulator alles "funktioniert"
weiß ich nicht wo ich suchen soll. Einige von Euch haben bestimmt sehr viel Erfahrung damit und es wäre super wenn mir einer von Euch helfen könnte.

Ich werde ein paar Dateien mit Anhängen weil der ganze Code reinstellen viel zu lang wäre. 
Ich hoffe jemand von Euch entdeckt etwas. Wäre schade wenn meine Arbeit umsonst war.

Grüße Tommylik


----------



## Heinileini (20 Juni 2022)

tommylik schrieb:


> In Verbindung mit der echten SPS sieht es so aus als wenn das kopieren erst Minuten nach dem Trigger Signal gestartet wird.
> In der Progress Bar erscheint dann Minuten später dann mal die 0% und das wars. Mit dem Simulator ist das in einigen Sek. auf 100%.


Könnte es sein, dass im ProgressBar die 0 erst nach Beendung des KopierVorgangs erscheint?
Wird der KopierVorgang denn vollständig ausgeführt oder wird er, wie Du suggerierst, abgebrochen?


----------



## Thomas_v2.1 (20 Juni 2022)

Ich habe mir jetzt nicht dein Programm angesehen, aber Nettoplcsim prüft nicht die korrekte TSAP Angabe, solange du nicht in Nettoplcsim den Haken dafür setzt. Die meisten Beispiele verwenden als Rack/Slot die Kombination 0/2, weil das für eine S7-300 immer gilt. Bei einer S7-400 kann die CPU aber auch auf einem anderen Slot gesteckt werden z.B. Rack 0 Slot 3. Dann funktioniert das mit Nettoplcsim oder an einer S7-300, an einer realen S7-400 aber nicht. Darum solltest du in deinem Programm auf jeden Fall eine Einstellmöglichkeit für diese Parameter vorsehen, entweder über das GUI oder über eine Konfugurationsdatei.


----------



## tommylik (20 Juni 2022)

Danke für Eure Antworten.

@Heinileini 



> Könnte es sein, dass im ProgressBar die 0 erst nach Beendung des KopierVorgangs erscheint?


Das kann ich dir nicht beantworten aber jemand anderes der Ahnung von C# hat, sagte mir das das mit der ProgressBar richtig programmiert ist.


> Wird der KopierVorgang denn vollständig ausgeführt oder wird er, wie Du suggerierst, abgebrochen?


Es tut sich gar nichts. Es wird nicht kopiert. Und nach einiger Zeit taucht die 0 % auf.

@Thomas_v2.1 

Übergebe ich mit der GUI.




Ist mit TSAP Check verbunden.

Grüße Tom


----------



## Thomas_v2.1 (20 Juni 2022)

Ist Rack 0 Slot 2 denn nun richtig bei der 400er? Da ich das bei Nettoplcsim selber nicht auslesen kann, musst du bei aktivierter Prüfung eben beispielsweise Rack 0 Slot 3 selber einstellen wenn die CPU da sitzt. Slot 2 ist bei einer 400er aber auch möglich.


----------



## 312C (20 Juni 2022)

Wenn ich das richtig sehe, sollte dieser "Kopiervorgang" in "MainForm.cs" Zeile 553 angestoßen werden. Wenn du die Möglichkeit dazu hast, setze doch mal einen Haltepunkt vor die Abfrage vorher und prüfe, ob der Vorgang überhaupt angestoßen wird und ob du überhaupt gültige Daten bekommst.


----------



## tommylik (20 Juni 2022)

@Thomas_v2.1 

Ist richtig.




@312C 


> Wenn du die Möglichkeit dazu hast, setze doch mal einen Haltepunkt



Ich bin gerade zu Hause und kann es nicht mit der echten CPU testen. 
Ich werde mich morgen mit dem Laptop mal mit der CPU verbinden und mit VS das probieren.

Kann es vielleicht auch an der Exe Datei liegen, weil die starte ich auf dem PC mit der echten SPS?




Vielleicht fehlt ja eine Datei. Aber wenn ich die Datei starte kommt keine Fehlermeldung.

Grüße Tom


----------



## tommylik (20 Juni 2022)

Hallo an alle,

Hier nochmal ein Bild von dem Test mit dem Simulator.




Funktioniert bestens aber warum nicht mit der echten SPS. Oben links auf dem Bild seht ihr alle Dateien und Ordner.
Daher denke ich das der Code richtig ist. Vielleicht liegt es an der Schnittstelle Sharp7.cs
In meinem ersten Post habe ich gesagt das ich Sharp7.dll nutze das ist falsch.

Wäre ein dll-Datei besser?

Vielen Dank nochmal für Eure Antworten.


Grüße Tom


----------



## DeltaMikeAir (20 Juni 2022)

Könnte evtl. die von dir verwendete IP ( 192.168.0.1 ) ein Problem darstellen? Sie ist ja die Standardadresse vieler Geräte ( z.b. Router, Fritzbox, auch über WLAN.... ). Evtl. ist diese IP doppelt im Netzwerk vorhanden.

Wobei, vermutlich nicht da du sie nur für NettoPlcSim nutzt.


----------



## 312C (20 Juni 2022)

tommylik schrieb:


> Daher denke ich das der Code richtig ist. Vielleicht liegt es an der Schnittstelle Sharp7.cs
> In meinem ersten Post habe ich gesagt das ich Sharp7.dll nutze das ist falsch.
> 
> Wäre ein dll-Datei besser?



Hier gibt es eine kurze Erklärung zu dem Thema.
Für die Funktion des Programms ist es aber grundsätzlich egal, ob die DLL genutzt wird oder nicht. Mittels Debugger könnte festgestellt werden, ob die Kommunikation zur SPS überhaupt das Problem darstellt.


----------



## tommylik (20 Juni 2022)

Danke für Eure Antworten.

@312C 



> ob die Kommunikation zur SPS überhaupt das Problem darstellt



Das werde ich morgen dann nochmal checken.
Ob ich einen Unterschied finde zwischen Simulator und echte SPS.




Ich denke ich habe das vernünftig in Abschnitte aufgeteilt. CPU verbinden.
Timer starten für das Zyklische lesen der SPS Variablen.
Trigger Signal Stoppt den Timer und startet den BackgroundWorker.
Kopieren soll durchgeführt werden. Fertig. Timer wieder starten
und dadurch wird wieder die Visu aktualisiert.

Mal sehen was ich finden kann. Vielleicht entdeckt ja einer von Euch noch was.

Vielen Dank für die Antworten und Ideen. Gute Nacht.

Grüße Tom


----------



## Thomas_v2.1 (20 Juni 2022)

Die Kommunikation zu Plcsim über Nettoplcsim ist ich würde mal grob schätzen 10-100 Mal schneller als zu einer S7-400.
Eine S7-400 hat auch noch die Besonderheit, dass die Daten der Netzwerkkommunikation auch mitten im OB1 Zyklus eingebunden werden. Bei Plcsim verhält sie sich hingegen wie eine S7-300 (ohne priorisierte BuB-Kommunikation). Da muss man bei der Programmierung drauf achten, z.B. wenn Daten auf über S7-Kommunikation zugegriffen wird, an Bausteine als InOut Parameter (per Value) übergeben werden.


----------



## tommylik (21 Juni 2022)

Servus Thomas,

Vielen Dank für deine Antwort.

Also es werden Strings und Bits aus einem DB gelesen und nach dem kopieren setze ich ein Bit im selben DB auf 0.
Wenn ich Pech habe kann ich das so gar nicht umsetzen.

Was könnte ich tun um es zu verbessern?

Grüße Tom


----------



## funkey (21 Juni 2022)

Also ich arbeite gerne mit Sharp7.
Hatte aber auch einmal Probleme bei der Kommunikation mit einer älteren S7-400er CPU.
Da scheint es in der Bibliothek einen Bug zu geben, obwohl es für mich eher so ausgesehen hat, als ob die CPU (oder der CP) einen Bug hat.
Nach dem fixieren der PDU-Size auf 240 Byte funktionierte es dann aber einwandfrei!

Einfach vor dem Verbinden zu SPS folgenden Code einfügen:

```
int pduSize = 240;  //Damit auch die alten 400er funktionieren (416-3DP)
                    client.SetParam(S7Consts.p_i32_PDURequest, ref pduSize);
```

Vielleicht liegt es bei dir ja auch daran!

Schöne Grüße
funkey


----------

