visualisierung mit .Net und TwinCat

Gerri

Level-1
Beiträge
822
Reaktionspunkte
37
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, ich würde gerne eine Visu mit .Net (Windows Forms) machen.
Nun bin ich am Überlegen wie man das am sinvollsten ageht.

Es gibt zwar genügend Beispiele im InfoSys nur will ich nicht in die falsche Richtung arbeiten. Was macht Sinn, was kostet unnötig Zeit.

Soll man jede Variable in beiden Systemen anlegen oder automatisch die deklaration einlesen oder die Symbole ohne adressen lesen oder mit dem ADS Stream arbeiten oder oder oder...

Wer hat erfahrung wie an das .Net (C#) Programm schnell um neue Variablen erweitern kann?
 
Für Visualisierung, also Darstellung von Daten nutze ich meistens Strukturen aus den wichtigen Daten und dann Notifications auf die gerade benötigten Strukturen legen. Den ByteStream dann entweder mit BinaryReader auslesen oder über Marshal in eine .Net Struktur kopieren.
 
In der PLC bildest du deine Daten in Strukturen ab:
Code:
TYPE ST_Monitoring:
STRUCT
    iEins: UINT;
    iZwei: UINT;
    iDrei: UINT;
END_STRUCT
END_TYPE
Davon legst du eine globale Variable an, die du aus der PLC mit den Daten füllst:
Code:
gstMonitoring: ST_Monitoring;
Code:
gstMonitoring.iEins:= 1;
gstMonitoring.iZwei:= 2;
gstMonitoring.iDrei:= 3;
Dann legst du aus der C#.Net Visu eine Notification auf diese Struktur an:
Code:
iHandle =  tcClient.AddDeviceNotification(".gstMonitoring", dataStream, AdsTransMode.OnChange, 1000, 10000, null);
Den DataStream ließt du dann über einen BinaryReader aus:
Code:
BinaryReader reader = new BinaryReader(dataStream);
iEins = reader.ReadUint16();
iZwei = reader.ReadUint16();
iDrei = reader.ReadUint16();
Oder du legst eine Struktur mit StructLayout an:
Code:
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
struct Monitoring
{
    usint Eins;
    usint Zwei;
    usint Drei;
}
und kopierst über Marshal:
Code:
[COLOR=#0000FF]int[/COLOR] size = Marshal.SizeOf(Monitoring);
[COLOR=#0000FF]byte[/COLOR][] temp = [COLOR=#0000FF]new[/COLOR] [COLOR=#0000FF]byte[/COLOR][size];

GCHandle handle = GCHandle.Alloc(temp, GCHandleType.Pinned);
    [COLOR=#0000FF]
object[/COLOR] struc = Marshal.PtrToStructure(handle.AddrOfPinnedObject(), Monitoring);

handle.Free();

Monitoring monitoring = struc as Monitoring;

Jetzt habe ich dir aber genug vorgekaut. Informationen findest im InfoSys von Beckhoff oder bei MSDN.
 
alles klar soweit. und was ist deiner Meinung nach der sinvollste weg die daten zu bschreiben? Das sind ja leider 2 paar schuhe mit TC u .Net.
Was ich bis jetzt gefunden habe verheisst das man 2 Variablen benötigt (je eine für lesen und für schreiben) wobei lesen über die Vriablennamen möglcih ist und schreiben über den offset u den stream, oder?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
alles klar soweit. und was ist deiner Meinung nach der sinvollste weg die daten zu bschreiben? Das sind ja leider 2 paar schuhe mit TC u .Net.
Was ich bis jetzt gefunden habe verheisst das man 2 Variablen benötigt (je eine für lesen und für schreiben) wobei lesen über die Vriablennamen möglcih ist und schreiben über den offset u den stream, oder?

Es ist sowohl lesen, als auch schreiben per (Index Group, Index Offset) oder den VariablenNamen möglich.

Schreiben von Werten passiert in einer HMI erfahrungsgemäß recht selten und wenn dann sind es nur vereinzelte Werte oder Kommandos. Daher lege ich auf die Variable per Name ein Handle an, welches ich dann Nutze um direkt auf die Variable zu schreiben.
 
Zurück
Oben