goedenmiddag,
ik zit met een "klein" software probleempje:
k ben een code aan het schrijven voor een stappenmotor, deze beweegt van links naar rechts.
ik beperk de beweging met een softwarelimiet.
als de stepper naar rechts gaat, stopt hij bij >= 15000
als de stepper naar links gaat, stopt hij bij <= 8000
zodra hij de limiet heeft bereikt, mag hij niet meer in dezelfde richting kunnen bewegen.
Tot nu toe zou je zeggen simpel.
dus ik schrijf een code.
maar die geeft een error:
Traceback (most recent call last):
File "<stdin>", line 27, in <module>
File "<stdin>", line 9, in move
NameError: local variable referenced before assignmentomdat aan X_limitswitch_right en X_limitswitch_left nog geen waarde is toegekent natuurlijk.
maar waar kan ik de toekenning doen? (wat is gebruikelijk)
dat wil je maar één keer doen, en niet elke keer dat een lus word doorlopen.
Bedankt.
code is puur, om het probleem inzichtelijk te maken.
def movement(K):
while (K):
if move == to_the_right:
X_limitswitch_left = 0
if X_limitswitch_right == 0:
if pos >= 15000:
X_limitswitch_right= 1
break
if move == to_the_left:
X_limitswitch_right = 0
if X_limitswitch_left == 0:
if pos <= 8000:
X_limitswitch_left = 1
break
# MAIN LOOP **************************
while True:
K = 1
movement(K)Gewoon bovenaan is het makkelijkste.
X_limitswitch_left = 0;
X_limitswitch_right = 0;
def movement(K):
while (K):
if move == to_the_right:
X_limitswitch_left = 0
if X_limitswitch_right == 0:
if pos >= 15000:
X_limitswitch_right= 1
break
if move == to_the_left:
X_limitswitch_right = 0
if X_limitswitch_left == 0:
if pos <= 8000:
X_limitswitch_left = 1
break
# MAIN LOOP **************************
while True:
K = 1
movement(K)
Ik zou denken dat je move, to_the_left, to_the_right, en pos ook nog ergens moet declareren.
Ik zou denken dat je move, to_the_left, to_the_right, en pos ook nog ergens moet declareren.
klopt natuurlijk, maar dit is 1 van de dingen, die in de echte code anders zijn geregeld, hier alleen om een voorbeeld te maken.
ik heb dat geprobeerd gewoon boven de functie, maar dat werkte niet.
volgens mij werkt dat wel voor in de "main loop" maar niet een functie "verderop" (movement(K)).
def movement(K):
X_limitswitch_left = 0;
X_limitswitch_right = 0;
while (K):
global X_limitswitch_left, Xlimitswitch_right
if move == to_the_right:
X_limitswitch_left = 0
if X_limitswitch_right == 0:
if pos >= 15000:
X_limitswitch_right= 1
break
if move == to_the_left:
X_limitswitch_right = 0
if X_limitswitch_left == 0:
if pos <= 8000:
X_limitswitch_left = 1
break
# MAIN LOOP **************************
while True:
K = 1
movement(K)Door de variabelen 'global' te maken, zou het moeten werken..
Paulinha_B
Honourable Member
"Ik spreek Spaans tegen God, Italiaans tegen de vrouwen, Frans tegen mannen en Duits tegen mijn paard." Dixit Carlos V, Römisch-deutscher Kaiser
Zo'n "global" declaraties heb ik ook al toegepast, maar eigenlijk lijkt me dat maar een lapmiddel, weinig elegant. Het zou niet mogen nodig zijn, lijkt me.
global heb ik ook nog geprobeerd, maar mischien heb ik dat toen niet goed toegepast.
maar dit lijkt mij toch een "alledaags" software dingetje, wat je regelmatig tegenkomt.
Klopt, global moet je toevoegen. Dat was ik even vergeten. Ik doe niet zo vaak python.
Dus het gaat in 2 stappen:
Eerst moet je de beide variabelen buiten de functie declareren, dus bovenaan het programma.
En vervolgens moet je binnen de functie de beide variabelen opnieuw declareren als global. Als je dat niet doet dan krijg je binnen de functie een set nieuwe variabelen met dezelfde naam, maar een andere waarde.
Het programma wordt dan:
X_limitswitch_left = 0
X_limitswitch_right = 0
def movement(K):
global X_limitswitch_left
global X_limitswitch_right
while (K):
if move == to_the_right:
X_limitswitch_left = 0
if X_limitswitch_right == 0:
if pos >= 15000:
X_limitswitch_right = 1
break
if move == to_the_left:
X_limitswitch_right = 0
if X_limitswitch_left == 0:
if pos <= 8000:
X_limitswitch_left = 1
break
# MAIN LOOP **************************
while True:
K = 1
movement(K)
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Op zondag 9 juni 2024 20:12:00 schreef Paulinha_B:
Zo'n "global" declaraties heb ik ook al toegepast, maar eigenlijk lijkt me dat maar een lapmiddel, weinig elegant. Het zou niet mogen nodig zijn, lijkt me.
Sommige dingen zijn zo wel iets "natuurlijker". In C kan je een variabele "static" maken zodat ie alleen binnen het file of binnen een functie bekend is, maar wel z'n waarde behoudt buiten de functie.
Wil je het helemaal netjes doen, dan moet je een een object maken wat dan interne variabelen kan bijhouden. Je krijgt dan iets als:
xmovement = movement (X_DIRPIN, X_STEPPIN)
ymovement = movement (Y_DIRPIN, Y_STEPPIN)
xmovement.setlimits (8000, 15000)
ymovement.setlimits (2300, 6000)
while True:
xmovement.moverelative (1)
De rest gaat mijn "effe uit m'n mouw schudden" teboven.