Delay in Visual Basic Script

Pagina: 1
Acties:

  • DSK
  • Registratie: Februari 2001
  • Laatst online: 21-12 07:31

DSK

boeiend...

Topicstarter
Ik heb al een hele tijd gezocht op goole en GoT, maar nergens een werkend antwoord voor mijn probleem gevonden...

Hoe is het mogelijk een bepaalde delay in een Visual Basic Script te steken?

Ik heb er al een topic over gevonden, maar geen enkele van de gegeven oplossingen werkt. [rml][ VBS] Delay[/rml]

Het probleem is waarschijnlijk mijn gebrek aan kennis van Visual Basic scripting. Normaal programmeer ik in C/C++.

Voor mijn eindwerk moet ik een XY-schrijver (soort plotter) sturen. Daardoor moeten waarden gestuurd worden naar een PLC.

Het werkt als volgt:
waarde sturen
Assen verplaatsen zich (neemt dus tijd in beslag)
als de assen zich op de doelpositie bevinden, nieuwe waarden sturen.
zoiets zou ik dus moeten hebben:
code:
1
2
3
4
5
6
7
xaspos=beginx
yaspos=beginy

Delay 5000

yaspos=100
xaspos=100


Er is ook een mogelijkheid om een timer te laten draaien in de PLC maar deze methode is nogal omslachtig en kreeg ik ook niet echt werkend.
Een variabele start de timer
een andere bevat de waarde tot wanneer de timer 1 wordt
Als de timer 1 wordt, dan wordt een variabele op 1 geplaatst.

Dit heb ik geprobeerd, maar werkte niet:
code:
1
2
3
4
5
6
xaspos=beginx
yaspos=beginy

tijd_timer= 5000
start_timer=1
If timer_klaar=1 Then yaspos=100


Hopelijk kan iemand me hierbij helpen.

Blog (Linux-related)


  • pjonk
  • Registratie: November 2000
  • Laatst online: 11-12 18:02
Jensd schreef op 10 april 2004 @ 10:40:
Ik heb er al een topic over gevonden, maar geen enkele van de gegeven oplossingen werkt. [rml][ VBS] Delay[/rml]
Wat werkt er dan niet? Die laatste post met de wscript.sleep method lijkt mij namelijk wel een manier.
Voor mijn eindwerk moet ik een XY-schrijver (soort plotter) sturen. Daardoor moeten waarden gestuurd worden naar een PLC.
PLC heb ik wel eens van gehoord. Is dat een soort netwerkkastje bij de plotter waarmee je communiceert? Vertel eens wat meer hierover. :)
Het werkt als volgt:
waarde sturen
Assen verplaatsen zich (neemt dus tijd in beslag)
als de assen zich op de doelpositie bevinden, nieuwe waarden sturen.
zoiets zou ik dus moeten hebben:
code:
1
2
3
4
5
6
7
xaspos=beginx
yaspos=beginy

Delay 5000

yaspos=100
xaspos=100
Klinkt niet echt als een safe manier. Je hebt op deze manier geen zekerheid of de assen zich daadwerkelijk hebben verplaatst (je gokt eigenlijk dat dit na 5 seconden wel gebeurt is). Kun je dit niet op een of andere manier afvragen?
Waar ik dan aan denk is in pseudo-code:

code:
1
2
3
4
5
6
7
8
xaspos=beginx
yaspos=beginy

do
loop until assenverplaatst

yaspos=100
xaspos=100

Maar goed ik weet niet of dit mogelijk is. Wellicht dat je de technische docs er even bij moet pakken.

It’s nice to be important but it’s more important to be nice


  • DSK
  • Registratie: Februari 2001
  • Laatst online: 21-12 07:31

DSK

boeiend...

Topicstarter
Alleseerst bedankt voor je reactie:
Wat werkt er dan niet? Die laatste post met de wscript.sleep method lijkt mij namelijk wel een manier.
Als ik dit invoeg in mn script, krijg ik volgende foutmelding bij het compilen:
code:
1
2
3
4
VB checking syntax...
Enhanced syntax check for ProTool...
Line: 4,    Error: Unknown identifier , wscript
1 Error, 0 Warnings


Hoe moet ik die wscipt dan declareren?
PLC heb ik wel eens van gehoord. Is dat een soort netwerkkastje bij de plotter waarmee je communiceert? Vertel eens wat meer hierover. :)
Een PLC is een soort microcontroller die uitgangen stuurt. Deze is verbonden via de seriële poort naar de PC (de PC zorgt voor de visualisatie en doorsturen van waarden naar de PLC).
De PLC is dan weer verbonden met een zelfgemaakte interface die de PWM signalen die uit de PLC komen omzet naar een analoge spanning (die benodigd is om de assen van de schrijver te laten bewegen).
Klinkt niet echt als een safe manier. Je hebt op deze manier geen zekerheid of de assen zich daadwerkelijk hebben verplaatst (je gokt eigenlijk dat dit na 5 seconden wel gebeurt is). Kun je dit niet op een of andere manier afvragen?
Waar ik dan aan denk is in pseudo-code:

code:
1
2
3
4
5
6
7
8
xaspos=beginx
yaspos=beginy

do
loop until assenverplaatst

yaspos=100
xaspos=100

Maar goed ik weet niet of dit mogelijk is. Wellicht dat je de technische docs er even bij moet pakken.
Dit is niet mogelijk aangezien er geen sensoren zijn die kunnen controleren op welke plaats de as zich bevindt. De as verplaatst zich naargelang de aangeleverde spanning. Die spanning is een omgezet signaal van de PWM blokgolf uit de PLC.

Die vertraging kan ik gewoon een ruime tijd nemen (bijvoorbeeld de tijd die nodig is om van nulpunt naar verste punt te gaan +2sec) De snelheid waarmee de bewerkingen plaatshebben speelt niet echt een rol

Blog (Linux-related)


  • DSK
  • Registratie: Februari 2001
  • Laatst online: 21-12 07:31

DSK

boeiend...

Topicstarter
Na wat zoeken ben ik erop gekomen dat volgende oplossing ook zou moeten werken:

Een oneindige loop, waarin 2 IF-statements worden geplaatst: als de teller nog niet gedaan is, naar de eerste positie, is de teller gedaan naar de volgende.

code:
1
2
3
4
5
6
7
timer_on=1
Dim teller
For teller=1 To 10 
If timer_klaar=1 Then xaspos=50
If timer_klaar=0 Then xaspos=100
teller=teller-1
Next


Dit voorbeeld zou toch moeten een oneindige lus hebben? taangezien teller per keer doorlopen één opgeteld wordt & één afgetrokken...

Alleen werkt het blijkbaar niet

Blog (Linux-related)


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Jensd schreef op 10 april 2004 @ 10:40:
Normaal programmeer ik in C/C++.
Uhm.. NOFI, maar dan bedenk je toch wel erg ranzige methodes voor je oplossing.
Jensd schreef op 10 april 2004 @ 14:17:
Na wat zoeken ben ik erop gekomen dat volgende oplossing ook zou moeten werken:

Een oneindige loop, waarin 2 IF-statements worden geplaatst: als de teller nog niet gedaan is, naar de eerste positie, is de teller gedaan naar de volgende.

code:
1
2
3
4
5
6
7
timer_on=1
Dim teller
For teller=1 To 10 
If timer_klaar=1 Then xaspos=50
If timer_klaar=0 Then xaspos=100
teller=teller-1
Next


Dit voorbeeld zou toch moeten een oneindige lus hebben? taangezien teller per keer doorlopen één opgeteld wordt & één afgetrokken...

Alleen werkt het blijkbaar niet
Waarom dan in godsnaam bijvoorbeeld 2 if statements? En waarom geen do...until of desnoods een while...wend? In een for-lus je teller verlagen is erg ranzig, ook in C/C++.

Met alle respect, ik denk dat je je toch eerst wat meer moet verdiepen in het programmeren in zijn algemeenheid.

Verder: Hoe stuur je die PLC aan vanuit VBS? Gebruik je een COM-object? of stuur je direct de poort aan? (En zo ja, hoe dan?) Kent die PLC geen delays? Kun je die niet naar de PLC sturen? Kan de PLC geen seintje geven of event raisen als 'ie op de juiste positie is?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • DSK
  • Registratie: Februari 2001
  • Laatst online: 21-12 07:31

DSK

boeiend...

Topicstarter
Uhm.. NOFI, maar dan bedenk je toch wel erg ranzige methodes voor je oplossing.
Normaal programmeer ik zeer netjes naar mijn weten, maar ik ben zo goed als ten einde raad bij dit probleem en dan ga je vanalles proberen
Waarom dan in godsnaam bijvoorbeeld 2 if statements? En waarom geen do...until of desnoods een while...wend? In een for-lus je teller verlagen is erg ranzig, ook in C/C++.
Omdat ik geen enkele van die oplossingen werkend krijg. Het lukt mij op geen enkele manier om een lus te maken tot een bepaalde voorwaarde is voldaan

Voorbeeld:
code:
1
2
3
4
5
timer_on=1
Do Until timer_klaar=1
[xaspos=100]
Loop
xaspos=50

Dit voorbeeld geeft geen fouten als ik compile, maar werkt niet zoals het zou moeten...
Dit moet toch de waarde 100 aanhouden voor xaspos totdat timer_klaar 1 wordt?
De as verplaatst zicht naar 100, maar als timer_klaar 1 wordt, dan blijft ze daar.
Verder: Hoe stuur je die PLC aan vanuit VBS? Gebruik je een COM-object? of stuur je direct de poort aan? (En zo ja, hoe dan?)
Ik stuur die PLC met een Protool/Pro programma. Deze verzeorgt de communicatie naar de PLC. Je kunt er bijvoorbeeld een script laten uitvoeren als er op een knop gedrukt wordt. de waardes xaspos of timer_on worden naar bits of woorden in de PLC geschreven. Deze moet je eerst aanmaken dmv. tags
Kent die PLC geen delays? Kun je die niet naar de PLC sturen?
Het is natuurlijk mogelijk om de PLC in delay te zetten, maar dan loopt het programma op de PC gewoon verder. En zijn alle waarden verstuurd zonder dat er iets gebeurt.
Kan de PLC geen seintje geven of event raisen als 'ie op de juiste positie is?
Zoals eerder vermeld, is er geen terugkoppeling van de schrijver naar de PLC. De schrijver verplaatst zijn assen naargelang de aangeleverde spanning aan de ingang.
Als je er bijvoorbeeld een bron aansluit van 5V, dan gaan de assen naar een bepaalde positie, veranderdt die spanning, dan gaan ze naar een andere positie...

Blog (Linux-related)


  • DSK
  • Registratie: Februari 2001
  • Laatst online: 21-12 07:31

DSK

boeiend...

Topicstarter
Na dit topic nog even volledig te hebben doorgelezen heb ik het probleem toch kunnen oplossen met een timer te laten draaien in de PLC:

code:
1
2
3
4
5
6
7
8
9
10
11
timer_on=1
xaspos=beginx
yaspos=beginy

do
loop until timer_klaar

timer_on=0
timer_on=1
yaspos=doelpositiey
xaspos=doelpositiex


Hartelijk dank voor het helpen :)

[ Voor 7% gewijzigd door DSK op 11-04-2004 14:24 ]

Blog (Linux-related)

Pagina: 1