Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[C#] Updaten van properties vanuit externe bron en GUI *

Pagina: 1
Acties:

  • RoelRoel
  • Registratie: December 2004
  • Laatst online: 12-11 17:03
Ik ben bezig met het maken van een ovenbesturingsprogramma in C#. Ik zit nu nog in de ontwerpfase en kom het volgende probleem tegen:

Ik heb een aantal objecten die onderdelen van de oven voorstellen en de waarden hiervan bijhouden in properties.

Vanuit de User Interface moet bijvoorbeeld de temperatuurSetpoint van een Thermokoppel ingesteld kunnen worden. Ook moet de ingestelde temperatuurSetpoint kunnen worden afgelezen van de ovenbesturingskaarten (in het geheugen van die kaarten).
Het communiceren met de besturingskaarten gebeurt via een Communicatie object.

Daar zit het probleem, want als ik een temperatuurSetpoint instel en het zo maak dat deze d.m.v. van het Communicatie object via de comport naar de besturingskaarten wordt verstuurd als de propertie geset wordt en ik gebruik vervolgens ook deze propertie wanneer ik de ingestelde waarde op de kaart opgehaald heb met het Communicatie object zou er een oneindige loop ontstaan.

Mijn oplossing is nu om er extra functies als bijvoorbeeld UpdateTemperatuur(value) aan te maken in het thermocouple object die aangeroepen worden als er informatie van de ovenbesturingskaarten wordt opgevraagd.

Maar dat vind ik niet zo'n nette oplossing omdat deze functies dan ook vanuit de GUI aan te roepen zijn. Nou weet ik wel dat ik dat niet moet doen, maar iemand die misschien verder gaat met mijn project niet.
Ook zijn er eigenschappen van de thermocouple die alleen het communicatieobject zou moeten kunnen veranderen en niet de GUI.

Het lijkt me dat er een nettere oplossing moet bestaan.

Sorry als de omschrijving een beetje vaag is ik hoop dat het probleem duidelijk is.
Vind het ook lastig om een passende topictitel hiervoor te bedenken.

[ Voor 5% gewijzigd door RoelRoel op 14-10-2008 16:51 . Reden: Temperatuur verandert in TemperatuurSetpoint ]


  • Flard
  • Registratie: Februari 2001
  • Laatst online: 21:03
Wat waarschijnlijk wel belangrijk is: in welke taal ben je aan het werk.

Getuige de term 'Properties' gok ik op C# of Visual Basic. Daar zou je bijvoorbeeld de eigenlijke waarde in een private field bijhouden, en daar een public propertie omheen zetten. In de setter kun je dan de waarde 'submitten' naar je thermokoppel. De 'interne' refresh functie werkt dan ook het field bij i.p.v. de property.

In pseudocode:
C#:
1
2
3
4
5
6
7
8
9
10
private int temperature;
public int Temperature
{
  get { return temperature; }
  set 
  { 
    temperature = value;
    // ComObject.Functie(value);
  }
}

  • RoelRoel
  • Registratie: December 2004
  • Laatst online: 12-11 17:03
Heb het er net ff bijgezet. C# idd.

Temperature moet je trouwens niet kunnen setten |:( (slecht voorbeeld stom van me)
Maar dat moet het communicatie object weer wel want die vraagt het op vanuit de ovenbesturing.
Hierbij wil ik dus ook niet dat je dat ook vanuit de GUI kan doen.
Maar bijvoorbeeld wel de TemperatureSetpoint. Die moet ingesteld kunnen worden vanuit de GUI maar er moet ook kunnen worden opgevragen vanuit de besturingskaart wat de waarde op die kaart is.

Als ik het zo maak zoals je zegt dat wanneer als je de TemperatureSetpoint propertie set hij het direct verstuurd naar het communicatieobject. Wat moet ik dan doen als het communicatie die waarde ophaalt. Deze kan niet de set gebruiken want dan gaat ie het weer ophalen en dan blijft dat eeuwig doorgaan.

[ Voor 81% gewijzigd door RoelRoel op 14-10-2008 16:46 ]


  • .Gertjan.
  • Registratie: September 2006
  • Laatst online: 17-02 21:20

.Gertjan.

Owl!

RoelRoel schreef op dinsdag 14 oktober 2008 @ 16:39:
Heb het er net ff bijgezet. C# idd.

Temperature moet je trouwens niet kunnen setten |:( (slecht voorbeeld stom van me)
Maar dat moet het communicatie object weer wel want die vraagt het op vanuit de ovenbesturing.
Hierbij wil ik dus ook niet dat je dat ook vanuit de GUI kan doen.
Maar bijvoorbeeld wel de TemperatureSetpoint. Die moet ingesteld kunnen worden vanuit de GUI maar er moet ook kunnen worden opgevragen vanuit de besturingskaart wat de waarde op die kaart is.

Als ik het zo maak zoals je zegt dat wanneer als je de TemperatureSetpoint propertie set hij het direct verstuurd naar het communicatieobject. Wat moet ik dan doen als het communicatie die waarde ophaalt. Deze kan niet de set gebruiken want dan gaat ie het weer ophalen en dan blijft dat eeuwig doorgaan.
Kun je bij het ophalen van de data vanaf de oven niet direct in het private field schrijven? Dus niet via de property? In dit geval zul je de code om de data te lezen in de zelfde class moeten hebben.

Meestal is het wel netter om de Properties te gebruiken om de data te setten, maar in jouw geval denk ik dat de readers van de oven data gewoon maar de privates moeten gebruiken.

The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.


  • Flard
  • Registratie: Februari 2001
  • Laatst online: 21:03
Wil je de temperatuur of de temperatuursetpoint dan ergens 'cachen', of moet die altijd realtime zijn?

Je kunt namelijk bijvoorbeeld ook de setter een andere access modifier meegeven (bijv. internal set).

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Interface
{
  public int Temperature
  {
    get { return ComObject.GetTemperature(); }
    internal set { ComObject.SetTemperature(value); }
  }


  public int TemperatureSetpoint
  {
    get { return ComObject.GetTemperatureSetpoint(); }
    set { ComObject.SetTemperatureSetpoint(); }
  }
}


Als je de waarde gecached wilt houden krijg je waarschijnlijk een Refresh-'thread' die steeds de waardes vernieuwd. In dat geval zou je de nieuwe waarde in het field kunnen zetten, en verder dus de code uit mijn vorige reactie kunnen gebruiken. Eventueel hang je daar dan ook nog een event aan, zodat je GUI weet dat de temperatuur is veranderd.

Misschien kun je wat (relevante) code geven, zodat we een beetje een beeld hebben hoe die loop ontstaat?

  • RoelRoel
  • Registratie: December 2004
  • Laatst online: 12-11 17:03
Bedankt voor de behulpzaamheid. Gisteren heb ik het met iemand erover gehad. En je zou zeggen dat ik in plaats van de waardes te cachen ze ook direct via de set en get functie naar de besturingskaarten kan sturen / opvragen.
Het probleem is alleen dat de besturingskaarten per kaart alleen functies hebben om 3 Temperatuursetpoints per kaart tegelijk te updaten of op te vragen. Als ik er 1 wil wijzigen is het handig als ik de andere 2 gecached heb.

[ Voor 3% gewijzigd door RoelRoel op 15-10-2008 09:50 ]


  • Flard
  • Registratie: Februari 2001
  • Laatst online: 21:03
Nou ja, dan lijkt me dat je iets zoals het volgende wil hebben:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private int setPoint1;
private int setPoint2;
private int setPoint3;
public int TemperatureSetPoint1
{
  get
  {
    RefreshSetpointValues();
    return setPoint1;
  } 
  set
  {
    RefreshSetpointValues();
    setPoint1 = value;
    ComObject.WriteSetpointValues(setPoint1, setPoint2, setPoint3);
  }
}

// idem voor setpoints 2 en 3


offtopic:
Ik snap dat je inmiddels begrijpt waarom een goede topicstart zo belangrijk is. Je begint nu met steeds meer functionele 'eisen' te komen, die je heel goed had kunnen beschrijven in je TS. Daardoor had je waarschijnlijk ook meteen een goed antwoord gekregen, in plaats van dat wij steeds moeten raden. Met een beetje voorbeeldcode was meteen al een heel stuk meer duidelijk geworden.

  • lier
  • Registratie: Januari 2004
  • Laatst online: 22:29

lier

MikroTik nerd

Is het niet een mogelijkheid om met een event te werken bij een wijziging van de temperatuur ? Daarmee kan je realtime info bereiken en je gaat één kant op voor de communicatie van de klassen...

Eerst het probleem, dan de oplossing

Pagina: 1