[VB] aanroep naar Priv Sub geeft 'Argument Not Specified'

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • The_Butler
  • Registratie: April 2001
  • Laatst online: 26-09 13:06
Disclaimer, mijn kennis ligt bij PLC en SCADA systemen en niet echt bij VB of C# - voor een hobby projectje waar ik potentieel vele uren werk kan besparen heb ik toch de stoute schoenen aan getrokken en visual studio geinstalleerd, ik hoop dat mijn vraag dus eenvoudig is...

Ik gebruik tweetal Siemens DLL's om de Siemens TIA Portal programmeer omgeving te benaderen (Siemens PLC projecten geautomatiseerd openen en bewerken). Om een project te openen moet ik beveiligings credentails meegeven, hiervoor gebruik ik de volgende aanroep (gekopieerd uit de handleiding van Siemens):
code:
1
MyProject = MyTiaPortal.Projects.Open(New FileInfo(ProjectPath), MyUmacDelegate)

Het probleem dat ik heb heeft temaken met de MyUmacDelegate aanroep, deze verwijst naar de volgende sub:
code:
1
2
3
4
5
6
7
    Private Sub MyUmacDelegate(UmacCredentials As UmacCredentials)
        Dim pass As New System.Security.SecureString()
        pass.AppendChar("x") 'dummy password x for testing
        UmacCredentials.Type = UmacUserType.Project // has value of 0, this is a normal user
        UmacCredentials.Name = "DummyUser1" 'dummy user account created for testing
        UmacCredentials.SetPassword(pass)
    End Sub


Bovenstaande code snippet heb ik uit een handleiding gepakt maar daar stond niet de volledige functie. Ik begrijp wat er moet gebeuren, voor het openen van een project moet ik een soort container meegeven waarin de username en password staan, deze container wordt in een aparte sub gevuld (later is de bedoeling dat dit een user interface wordt, voor nu wil ik gewoon testen of ik een beveiligd project kan openen)

Nu zie ik dat bij de aanroep (eeste code blokje) de tekst MyUmacDelegate rood is onderlijnd en de volgende foutmelding geeft: Argument not specified for parameter '<parametername>' of '<methodname>'

En ik weet niet zo goed hoe ik dit oplos; ik raak vooral in de war door de voorgeleverde Class en Delegate van de Siemens library. Als het nu een simpele string was die naar een sub werd gegooid dan zou het al een stuk makkelijker zijn om te volgen...

Kan iemand mij een duwtje in de goede richting geven over wat ik mis / waar ik moet zoeken naar het probleem, moeet ik een argument meegeven met de MyUmacDelegate aanroep ofzo?

Ik heb zelf al de code uit de SUB gehaald en bij de aanroepende functie gezet om te zien of ik wat duidelijkere foutmeldingen kreeg maar zonder resultaat.

at your service

Beste antwoord (via The_Butler op 26-06-2022 15:09)


  • Lethalis
  • Registratie: April 2002
  • Niet online
The_Butler schreef op zondag 26 juni 2022 @ 12:25:
Goede suggestie - maar helaas; ik ga hier wel even mee verder dingen proberen...

[Afbeelding]
Als "New" niet toegankelijk is, dan gaat het om een private constructor. Er zijn meestal maar een aantal redenen om dat te doen:
1. Het is een base class die je niet direct hoort te gebruiken. Kijk dus naar classes die hiervan overerven.
2. De constructor is private, omdat de ontwikkelaars ervoor gekozen hebben hun eigen "Create" functie te maken. Dit kan handig zijn om bepaalde intenties beter te communiceren. Bijvoorbeeld "CreateWithCredentials" kan een optie zijn.
3. Je moet verplicht parameters meesturen (andere overload).

Anyways, dit is een algemeen antwoord op de foutmelding in jouw screenshot. Ik heb verder geen ervaring met die Siemens library. Het lijkt er alleen op dat je de class UmacCredentials op een andere manier moet maken (of krijgt).

Wat gebeurt er als je F12 (go to definition) doet wanneer je op de class staat met de cursor? Welke overloads of andere methods zijn wel beschikbaar?

[edit: AddressOf]
Bij nader inzien, de delegate lijkt alleen bedoeld om de credentials (aan) te vullen. Het is dus een functie die wordt aangeroepen op het moment dat je Open uitvoert, waarin je de UmacCredentials krijgt om ze aan te vullen met gegevens.

Ik zou eens AddressOf ervoor zetten:
code:
1
MyProject = MyTiaPortal.Projects.Open(New FileInfo(ProjectPath), AddressOf MyUmacDelegate)

Het is immers een soort "pointer" naar de functie. Ik zou de functie daarna ook hernoemen naar SetUmacCredentials ofzoiets ipv hem te laten eindigen op Delegate.

[ Voor 32% gewijzigd door Lethalis op 26-06-2022 13:37 ]

Ask yourself if you are happy and then you cease to be.

Alle reacties


Acties:
  • 0 Henk 'm!

  • itons
  • Registratie: Oktober 2003
  • Niet online
code:
1
MyProject = MyTiaPortal.Projects.Open(New FileInfo(ProjectPath), MyUmacDelegate())


Of denk ik dan echt te simpel?

Acties:
  • 0 Henk 'm!

  • The_Butler
  • Registratie: April 2001
  • Laatst online: 26-09 13:06
Helaas, ik heb het net geprobeerd, de aanroep is nogsteeds rood onderlijnd...

Afbeeldingslocatie: https://tweakers.net/i/cIidqwb61CEnANO8rg-0pLhwqRA=/800x/filters:strip_icc():strip_exif()/f/image/ljLewF6eZBF0UgDlP1mWs071.jpg?f=fotoalbum_large

at your service


Acties:
  • 0 Henk 'm!

  • Juup
  • Registratie: Februari 2000
  • Niet online
En iets als:
Visual Basic:
1
MyProject = MyTiaPortal.Projects.Open(New FileInfo(ProjectPath), MyUmacDelegate(New UmacCredentials()))

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


Acties:
  • 0 Henk 'm!

  • The_Butler
  • Registratie: April 2001
  • Laatst online: 26-09 13:06
Goede suggestie - maar helaas; ik ga hier wel even mee verder dingen proberen...

Afbeeldingslocatie: https://tweakers.net/i/DMR05tHLrKZ4FSXH_5JKVFzwG3Q=/800x/filters:strip_icc():strip_exif()/f/image/fafkBdUAB2Pf9oVxB8Br0TNC.jpg?f=fotoalbum_large


Edit:

code:
1
MyProject = MyTiaPortal.Projects.Open(New FileInfo(ProjectPath), MyUmacDelegate(New UmacDelegate()))

Geeft alleen een probleem bij de haakjes, maar hij verwacht een AdresOff of Lambda expressie... ik vind het allemaal behoorlijk vaag maar blijf puzellen..

[ Voor 23% gewijzigd door The_Butler op 26-06-2022 13:00 ]

at your service


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • Lethalis
  • Registratie: April 2002
  • Niet online
The_Butler schreef op zondag 26 juni 2022 @ 12:25:
Goede suggestie - maar helaas; ik ga hier wel even mee verder dingen proberen...

[Afbeelding]
Als "New" niet toegankelijk is, dan gaat het om een private constructor. Er zijn meestal maar een aantal redenen om dat te doen:
1. Het is een base class die je niet direct hoort te gebruiken. Kijk dus naar classes die hiervan overerven.
2. De constructor is private, omdat de ontwikkelaars ervoor gekozen hebben hun eigen "Create" functie te maken. Dit kan handig zijn om bepaalde intenties beter te communiceren. Bijvoorbeeld "CreateWithCredentials" kan een optie zijn.
3. Je moet verplicht parameters meesturen (andere overload).

Anyways, dit is een algemeen antwoord op de foutmelding in jouw screenshot. Ik heb verder geen ervaring met die Siemens library. Het lijkt er alleen op dat je de class UmacCredentials op een andere manier moet maken (of krijgt).

Wat gebeurt er als je F12 (go to definition) doet wanneer je op de class staat met de cursor? Welke overloads of andere methods zijn wel beschikbaar?

[edit: AddressOf]
Bij nader inzien, de delegate lijkt alleen bedoeld om de credentials (aan) te vullen. Het is dus een functie die wordt aangeroepen op het moment dat je Open uitvoert, waarin je de UmacCredentials krijgt om ze aan te vullen met gegevens.

Ik zou eens AddressOf ervoor zetten:
code:
1
MyProject = MyTiaPortal.Projects.Open(New FileInfo(ProjectPath), AddressOf MyUmacDelegate)

Het is immers een soort "pointer" naar de functie. Ik zou de functie daarna ook hernoemen naar SetUmacCredentials ofzoiets ipv hem te laten eindigen op Delegate.

[ Voor 32% gewijzigd door Lethalis op 26-06-2022 13:37 ]

Ask yourself if you are happy and then you cease to be.


Acties:
  • +1 Henk 'm!

  • The_Butler
  • Registratie: April 2001
  • Laatst online: 26-09 13:06
Lethalis schreef op zondag 26 juni 2022 @ 13:02:
[...]

Ik zou eens AddressOf ervoor zetten:
code:
1
MyProject = MyTiaPortal.Projects.Open(New FileInfo(ProjectPath), AddressOf MyUmacDelegate)

Het is immers een soort "pointer" naar de functie. Ik zou de functie daarna ook hernoemen naar SetUmacCredentials ofzoiets ipv hem te laten eindigen op Delegate.
@Lethalis HELD! Dat is de oplossing, het loopt als een trein nu! Ik moet me denk ik wel even inlezen wat nu precies die AddressOf manier van werken inhoud; of beter gezegd hoe ik zonder hulp had kunnen weten dat ik dit op deze manier had moeten doen, anders gaat het de volgende keer weer fout.

at your service


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
The_Butler schreef op zondag 26 juni 2022 @ 15:09:
[...]


@Lethalis HELD! Dat is de oplossing, het loopt als een trein nu! Ik moet me denk ik wel even inlezen wat nu precies die AddressOf manier van werken inhoud; of beter gezegd hoe ik zonder hulp had kunnen weten dat ik dit op deze manier had moeten doen, anders gaat het de volgende keer weer fout.
Het type is een Delegate, dat is een soort function pointer. Je moet dus een referentie naar een function meegeven, en dat doe je met het addressof keyword.

“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.”

Pagina: 1