-> Hier kostenlos registrieren
Hallo
Ich habe ein Programm in C# mit WPF Oberfläche geschrieben welches im Hintergrund mit der "TwinCAT.Ads.dll" von Beckhoff arbeitet.
Zur abfrage meiner Variablen nutze ich die DeviceNotification Funktion, in der ich das Zeitlimit für das Abfragen auf 250 ms gestellt habe.
Zu überwachen sind 26 Variablen vom Typ BOOL, DINT oder LREAL (insgesamt 93 Bytes).
Ändert sich ein Variablenwert wird das Event aufgerufen:
Dies funktioniert eigendlich ganz gut.... bis das Programm irgendwann abstürtzt weil es mehr wie 1 GB Arbeitsspeicher reserviert hat :shock:
Ist eine Verbindung aufgebaut, werden in meinem Code keine neuen Variablen Deklariert, kein Array gefüllt usw.
Trotzdem steigt der Speicher stetig an.
Die einzige alternative die mir einfällt ist jede Variable einzeln zu pollen.
Kennt jemand das Problem oder hat einen Tipp was ich da machen kann.
Gruß
Stefan
Ich habe ein Programm in C# mit WPF Oberfläche geschrieben welches im Hintergrund mit der "TwinCAT.Ads.dll" von Beckhoff arbeitet.
Zur abfrage meiner Variablen nutze ich die DeviceNotification Funktion, in der ich das Zeitlimit für das Abfragen auf 250 ms gestellt habe.
Zu überwachen sind 26 Variablen vom Typ BOOL, DINT oder LREAL (insgesamt 93 Bytes).
Code:
private int Zyklus_VarRefresh = 250; //Zykluszeit zum Erneuern der SPS Werte
private TcAdsClient tcClient; //ADS Client
private static AdsStream adsreaderStream = new AdsStream(93); //ADS Stream zum Zyklischen Abfragen aller Variablen
private static BinaryReader binReader = new BinaryReader(adsreaderStream); //Reader für ADS Stream zum Zyklischen Abfragen aller Variablen
...
Handle_GlobalVar1 = tcClient.AddDeviceNotification(".GlobalVar1", adsreaderStream, 0, 4, AdsTransMode.OnChange, Zyklus_VarRefresh, 0, DBNull.Value); //4 Bytes
Handle_GlobalVar2 = tcClient.AddDeviceNotification(".GlobalVar2", adsreaderStream, 4, 4, AdsTransMode.OnChange, Zyklus_VarRefresh, 0, DBNull.Value); //4 Bytes
...
tcClient.Synchronize = true;
tcClient.AdsNotification += new AdsNotificationEventHandler(tcClient_AdsNotification);
Ändert sich ein Variablenwert wird das Event aufgerufen:
Code:
void tcClient_AdsNotification(object sender, AdsNotificationEventArgs e)
{
e.DataStream.Position = e.Offset;
switch (e.NotificationHandle)
{
//GlobalVar1
case 1:
...
Dies funktioniert eigendlich ganz gut.... bis das Programm irgendwann abstürtzt weil es mehr wie 1 GB Arbeitsspeicher reserviert hat :shock:
Ist eine Verbindung aufgebaut, werden in meinem Code keine neuen Variablen Deklariert, kein Array gefüllt usw.
Trotzdem steigt der Speicher stetig an.
Die einzige alternative die mir einfällt ist jede Variable einzeln zu pollen.
Kennt jemand das Problem oder hat einen Tipp was ich da machen kann.
Gruß
Stefan