.NET <--> ADS <--> SPS; sinnvolle Architektur

twincatter

Level-1
Beiträge
137
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Gemeinde!

Ich bin Neuling in Sachen ADS-Kommunikation und möchte gerne einige Fragen an die Experten stellen.
Es geht um die grungsätzliche Architektur der ADS-Kommunikation in einem VB.NET-Programm und des TwinCAT-Programms (CX1020).
Ich versuche einen Fertigungsautomaten zu realisieren. Steuerung läuft in einem CX1020, jeweils 40 IOs, 3 Stepper und 3 Servoachsen, zusätzliche Saftyklemmmen. Dann nehme ich mal an 100 Variablen zur übertragen an den PC.
Ich lehne mich an das Beckhoff-Beispielprogramm "Maschine" an in dem die Kommunikation eventgesteuert (Notification) erfolgt.

Hier die (ersten) Fragen:
1.)
Ich denke es ist nicht sinnvoll einzelne Variablen über ADS zu übertragen
Stattdessen könnt ich mir vorstellen Strukturen als Block zu übertragen.
2)
Ich könnte mir vorstellen die Strukturen so aufzubauen
a) StrukturLesen_HohePriorität
(z.B. Achspositionierung beendet, jetzt Aktion in .NET-Prog)
b) StrukturLesen_GeringePriorität
(z.B. Istpositionen nur zur Darstellung in Visu)
c) Struktur_Schreiben
3) gibt es einen Richtwert wieviel Information pro Struktur übertragen werden soll/kann. Ist es besser z.B. 10 "kleine" Strukturen zu übertragen oder eine "große" Struktur?
4) gibt es irgendwo ein Beispielprojekt einer echt relisierten Anlage um deren Aufbau zu studieren und ggf. abzuspicken?

Es fehlt mit im Moment einfach noch der Überblick.

Vielen Dank!
 
Die ADS-Kommunikation belastet die SPS recht heftig und dafür hat die SPS auch einen extra Task.

Unterscheide zwischen Variablen, die ständig ausgelesen werden müssen und solchen, wo es reicht, die z.B. nur einmla die Sekunde zu lesen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ja genau...

wenn es Zeitkritsche Werte gibt, die du z.B. alle 5ms brauchst (Aufzeichung oder so), dann leg alles in ein Array ab und lasse dir dann die Variable (Array) alle 5ms senden, nimmst es dann auseinander und fertig.

Einzelne Variablen könnten eventuell zu spät bei dir ankommen. Einziger Trost dabei: Die Variablen werden dir mit Zeitstempel gesendet.

Im Prinzip ist es egal ob du 1 Bit oder ein Array mit 1000 Real überträgst. Solange es "ein Paket" ist.

Wichtig ist immer, die Verbindung ordentlich zu beenden (Händle).

Strukturen lassen sich nicht so gut mit ADS mit dem OCX oder der dll behandeln.

MfG CAS
 
Vielen Dank schon einmal!

Ich hätte gerne Strukturen übertragen, habe es aber in Verbindung mit "tcClient.AddDeviceNotification" noch nicht geschafft. Strukturen zu übertragen wären meiner nach übersichtlicher und leichter erweiterbar.
Wäre für Informationen wie dies funktioniert dankbar.

Wird in der Praxis die eventgesteuerte Übertragung "OnNotification" verwendet oder ist die zyklische Übertragung besser? Ich denke bei der eventgesteuerten Übertragung tritt weniger Datenverkehr auf, bin aber bezüglich der Zuverlässigkeit unsicher. Kann es vorkommen, daß ein Event "verschlafen" wird?

Außerdem habe ich seit 2 Tagen folgendes Verhalten
Für die Ausführung des roten Codes (siehe unten) werden ca. 10 Sekunden benötigt, alle weitern Schritte werden praktisch unmittelbar ausgeführt. Bis vor ein paar Tagen wurde auch der erste Schritt schnell ausgeführt.
Wie lange dauert es in der Regel bis AddDeviceNotifications durchgeführt sind?

Vielen Dank!

tcClient.Connect("172.16.5.60.1.1", 801)
tcClient.Timeout = 20000
symbolLoader = tcClient.CreateSymbolInfoLoader()
Catch ex AsException
MessageBox.Show(ex.Message)
EndTry
Try
' Initialisieren der Überwachung der SPS-Variablen
' Initializing the monitoring of the PLC variables
hEngine = tcClient.AddDeviceNotification(".engine", dataStream, 0, 1, AdsTransMode.OnChange, 10, 0, DBNull.Value)
hDeviceUp = tcClient.AddDeviceNotification(
".deviceUp", dataStream, 1, 1, AdsTransMode.OnChange, 10, 0, DBNull.Value)



 
zu 1) je schwächer der Prozessor desto weniger Kommunikation wäre eine solide Grundregel.

zu 2a) Wenn von Achspositionierungen die Rede ist wird mit Sicherheit min. ein CX1010 bzw. CX5010 zum Einsatz kommen. Hier sollte genügend Rechenleistung vorhanden sein um sich keine Gedanke über die ADS-Kommunikation machen zu müssen.
Fertigmeldungen bzw. Ereignisse sollten vielleicht als Notification angelegt werden um nicht permanent pollen zu müssen. So wird man zeitnah über eine Zustandsänderung informiert.

zu 2b) Für den Anlagenstatus zur Visualisierung reicht es mMn aus eine Struktur alles 200ms zu lesen. Hier ist die Größe der Struktur weniger von Interesse.
Der Einfachheit halber sollte man versuchen den Anlagenstatus ebenfalls über eine Notification abzurufen. Hierbei sollte vielleicht die cycleTime (AddDeviceNotification) vergrössert werden um nicht unnötig Events zu feuern.
Sollte ADS-Kommunikationsaufwand zu groß werden kann ggbf. der Routerspeicher angepasst werden. Für 99% der Anwendungen ist dies aber nicht notwendig.

zu 3) Ist einzig abhängig vom eingestellten Routerspeicher und der CPU-Leistung. Das ScopeView arbeitet ausschliesslich mit Notifications und sammelt Daten Zyklustreu ein.

zu 4) Für alle Methoden gibt es Beispiele im InfoSys. Nur halt keine Fix-und-Fertig Lösung.

Sofern in .Net programmiert wird sollte man vor jedem ADS Zugriff prüfen, ob der ADS-Router im Run-Mode ist und ob die ausgewählte Runtime immer noch im Run ist.

Gruß

MH
 
Zuviel Werbung?
-> Hier kostenlos registrieren
tcClient.Connect("172.16.5.60.1.1", 801)
tcClient.Timeout = 20000
symbolLoader = tcClient.CreateSymbolInfoLoader()
Catch ex AsException
MessageBox.Show(ex.Message)
EndTry
Try
' Initialisieren der Überwachung der SPS-Variablen
' Initializing the monitoring of the PLC variables
hEngine = tcClient.AddDeviceNotification(".engine", dataStream, 0, 1, AdsTransMode.OnChange, 10, 0, DBNull.Value)
hDeviceUp = tcClient.AddDeviceNotification(
".deviceUp", dataStream, 1, 1, AdsTransMode.OnChange, 10, 0, DBNull.Value)

BÖSE BÖSE!!!
Du hast die CycleTime auf 10ms gesetzt!! Das ist für eine Visualisierung viel zu hoch, es sollten 100ms oder ähnliches reichen.
Der ganz dicke Fehler ist jedoch das MaxDelay auf 0 zu setzen. Hier solltest einen Wert wie 1s wählen!!
Du hast die maximale Verzögerungszeit zwischen zwei Telegrammen auf 0ms gesetzt. Damit versucht der Server zu jedem Zeitpunkt eine neue Notification zu senden, sogar mehrmals pro Zyklus.

Ich würde dir auch empfehlen die Methode ohne Offset und Length zu verwenden, dann werden die Daten automatisch an das Ende im Stream eingefügt.
 
Zuletzt bearbeitet:
Zurück
Oben