[VB.net] Verschillende apparaten besturen met 1 broncode

Pagina: 1
Acties:

  • Looney11
  • Registratie: December 2004
  • Laatst online: 17-09 06:47
Hallo Allemaal,

Op dit moment maken wij gebruik van een zelf geschreven programma die ons in staat stelt een apparaat via een GPIB-bus te besturen. De commando's worden vanuit het programma rechtstreeks op de bus gezet en als zodanig werkt het programma keurig.

Het probleem wat zich nu voordoet is dat er een ander apparaat aangekocht is die, helaas, een net wat andere commandoset gebruikt. We willen onze software hiervoor geschikt maken en, met het oog op de toekomst, wellicht ook voor meerdere apparaten.

Het huidige ervaringsniveau is vooral gekomen door "trial and error", het gebruik van VB zelf aangeleerd.
Onze vraag is of we dit probleem het beste kunnen oplossen door gebruik te gaan maken van een setting bestand waarbij we de commando's generaliseren en dan met een init bestand de correcte commando's inlezen of dat wellicht gebruik van een DLL of Class beteer/makkelijk is?

Een voorbeeld van de huidige code:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Private Sub doFreqRange(ByVal highest As Boolean)
        clearSettings()
        setRefLvlOffset()
        fsp.Write("BAND:AUTO OFF")            ' Resolution bandwidth 100 kHz
        fsp.Write("BAND 100 kHz")
        fsp.Write("BAND:VID:AUTO OFF")        ' Video bandwidth 100 kHz
        fsp.Write("BAND:VID 100 kHz")
        fsp.Write("SWE:TIME:AUTO OFF")        ' Sweep time 1 minute
        fsp.Write("SWE:TIME 60s")
        fsp.Write("DET RMS")                  ' Detector Peak
        If highest Then
            fsp.Write("FREQ:CENT 2483.5 MHz") ' Center frequency = 2483.5
        Else
            fsp.Write("FREQ:CENT 2400 MHz")   ' Center frequency = 2400
        End If
        fsp.Write("FREQ:SPAN 50 MHz")         ' Span
        fsp.Write("CALC:DLIN1:STAT ON")       ' Limit line on
        fsp.Write("CALC:DLIN1 -30 dBm")       ' Limit line -30 dBm
        fsp.Write("DISP:WIND:TRAC:MODE MAXH") ' Trace max hold
        fsp.GoToLocal()

        MsgBox("Hit enter when sweep is ready")


Het apparaat "FSP" wordt hier rechtstreeks benaderd. De nieuw(ere) FSV is er echter ook al en de software dient o.a. hierop te worden aangepast maar de commando's zijn net even wat anders.

Hebben jullie tips/trucs/leesvoer om ons op de goede weg te helpen?

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik zou gewoon een degelijke class-structuur opzetten. Als je dan later nog een andere apparaat krijgt, kun je gewoon een nieuwe class schrijven.

Zo zou je bijvoorbeeld de volgende structuur kunnen krijgen. ( Het is natuurlijk wel erg afhankelijk van wat de apparaten allemaal doen. Als ze veel overeenkomsten hebben, dan kan dat verzameld worden in een base-class, en specifieke dingen doe je dan in een sub-class )
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class GPIBDevice
{
    public void SendCommand(GPIBCommand command){
        //Stuur command over je bus
    }
}

class GPIBFrequencyDevice : GPIBDevice
{
    public virtual void SetFrequency( int frequency ) {
        SendCommand( new GenericFrequencyCommand(frequency) );
    }

   public virtual void SomeGenericFrequencyFunction(){}
}

class SomeSpecialisedGPIBFrequencyDevice : GPIBFrequencyDevice 
{
    public overidde void SetFrequency( int frequency ) {
        SendCommand( new SomeOtherFrequencyCommand(frequency));
    }

    public virtual void SomeUniqueFunction(){}
}

[ Voor 27% gewijzigd door Woy op 03-09-2009 09:44 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Woy schreef op donderdag 03 september 2009 @ 09:39:
Ik zou gewoon een degelijke class-structuur opzetten. Als je dan later nog een andere apparaat krijgt, kun je gewoon een nieuwe class schrijven.
Als aanvulling hierop, zou je de instantie van de benodigde klasse op basis van een setting in bijvoorbeeld een ini bestand via een Factory pattern kunnen laten plaatsvinden:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
  GPIBDevice d = null;

  switch (deviceType) 
  {
    case DeviceTypes.FrequencyDevice:
      d = new GPIBFrequencyDevice();
      break;
    case DeviceTypes.SomeSpecialisedGPIBFrequencyDevice:
      d = new SomeSpecialisedGPIBFrequencyDevice();
      break;
  }
}

[ Voor 5% gewijzigd door Verwijderd op 03-09-2009 13:13 . Reden: Zinsbouw ]


  • Jeroen V
  • Registratie: Februari 2004
  • Laatst online: 16-09 21:23

Jeroen V

yadda yadda yadda

Is het dan niet mooier om dat met behulp van Unity te doen?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:16
Jeroen V schreef op donderdag 03 september 2009 @ 16:28:
Is het dan niet mooier om dat met behulp van Unity te doen?
Waarom persé Unity en geen andere IoC container ?

https://fgheysels.github.io/


  • roeleboel
  • Registratie: Maart 2006
  • Niet online

roeleboel

en zijn beestenboel

de theorie voor een 'mooie' oplossing kan je hier alvast eens bekijken:
http://en.wikipedia.org/wiki/Command_pattern

Acties:
  • 0 Henk 'm!

  • Looney11
  • Registratie: December 2004
  • Laatst online: 17-09 06:47
Bedankt voor de opties, we gaan ze bestuderen.

Verder werd mijn collega attent gemaakt op "interface" wat we nog ook gaan uitdiepen.

Nogmaals bedankt

Acties:
  • 0 Henk 'm!

Verwijderd

Looney11 schreef op maandag 07 september 2009 @ 15:44:
Bedankt voor de opties, we gaan ze bestuderen.

Verder werd mijn collega attent gemaakt op "interface" wat we nog ook gaan uitdiepen.

Nogmaals bedankt
Een Interface zou je kunnen definiëren als je gebruikt maakt van het factory en command pattern. Je kunt dan in een Interface het contract definiëren van de method signatures en concrete implementaties deze Interface laten implementeren. In geval van de factory gebruik je gewoon de Interface als return type in geval van het command pattern kun je (volgens mij) gewoon de methods uit de interface gebruiken om een template van commando's te definieren:

C#:
1
2
3
4
5
6
IDevice d; // initialiseren

d.Initialize();
while (d.Running())
  d.DoWork();
d.Destroy();
Pagina: 1