Zmienna #5041 użyta jako warunek funkcji staje się stałą
: 11 paź 2015, 15:19
Jak w temacie. W krótkim macro przeznaczonym do planowania powierzchni czołowej, zamiast tzw. zmiennej iteracyjnej użyłem prostego warunku z wykorzystaniem aktualnego położenia na osi X, które to przechowywane jest pod zmienną #5041, który przedstawia się następująco: Z pozoru wszystko wygląda poprawnie, wykonuj, dopóki położenie na X (#5041) pomniejszone o połowę średnicy (#7/2) jest mniejsze niż zadany wymiar (#2) powiększony o dwa (wyjście poza materiał).
Nie mniej jednak, pojawia się błąd, pętla nie jest wykonywana. Po przebadaniu różnych możliwości błędu, otrzymałem jednobrzmiący wniosek: zmienna #5041, użyta jako warunek w pętli będzie zwracać 250 (odległość od zera roboczego do zera maszyny), ZAWSZE, nie zwracając żadnej uwagi na to, że aktualne położenie wskazuje na co innego, np wartość 50...
Reasumując, pętla ta nigdy się nie wykona. Idąc za ciosem dodałem do warunku porównywanego wspominaną wartość 250 (którą zawsze reprezentuje "stała" #5041): efekt jest łatwy do przewidzenia, tym razem pętla się wykona, nieskończoną liczbę razy, bo w końcu nasza zmienna #5041 jest "stałą"...
Pracowałem na symulatorze z poziomu PC, pomyślałem więc że może zaburzone jest zwracanie poprawnej wartości zmiennej, poprzez co udałem się do pracowni i skorzystałem z oryginalnego symulatora HAAS. Efekt ten sam. Tam jednak zbadałem zmiany wartości zm. #5041 na dwa sposoby:
1. Dopisanie 250 do warunku pętli celem jej wykonania, następnie wprowadzenie wyrażenia w pętli F#5041 (czyli wartość posuwu wynosi tyle samo, co aktualna liczba reprezentowana przez #5041) (a jak wiemy, tę wartość można na bieżąco podglądać na ekranie symulacji). Efektem była jednorazowa zmiana F na 250, i choć zmieniał się X, to wyświetlana wartość F zawsze byłą taka sama.
2. Podobnie jak przedtem dodałem 250, tym jednak że do sprawdzenia wartości #5041 użyłem zmiennej globalnej #105: #105=#5041, a następnie sprawdzałem ją z poziomu MDI DNC->CURNT COMDS->2xPAGE DOWN->3x strzałka w prawo. Ku mojemu zdumieniu, owa wartość zmieniała się poprawnie, co było widać nawet wówczas, gdy zwracana wartość powinna zakończyć pętle a ta jednak nadal się wykonywała poprzez stałą zmienną #5041, której poza warunkiem obserwowałem jako zmienną.
Ktoś może powiedzieć, o co do jasnej chodzi?... Siedziałem wiele godzin nad tym problemem, wiem że dodanie osobnej zmiennej iteracyjnej załatwi problem, ale tak się problemów nie rozwiązuje, czyż nie tak? Dostępu do maszyny celem dobitnego sprawdzenia niestety nie mam.
//edit
gdyby kogoś interesowała całość kodu: http://pokazywarka.pl/5gqp7c/
Kod: Zaznacz cały
WHILE [[#5041-[#7/2]] LT [#2+2]] DO2
Nie mniej jednak, pojawia się błąd, pętla nie jest wykonywana. Po przebadaniu różnych możliwości błędu, otrzymałem jednobrzmiący wniosek: zmienna #5041, użyta jako warunek w pętli będzie zwracać 250 (odległość od zera roboczego do zera maszyny), ZAWSZE, nie zwracając żadnej uwagi na to, że aktualne położenie wskazuje na co innego, np wartość 50...
Reasumując, pętla ta nigdy się nie wykona. Idąc za ciosem dodałem do warunku porównywanego wspominaną wartość 250 (którą zawsze reprezentuje "stała" #5041):
Kod: Zaznacz cały
WHILE [[#5041-[#7/2]] LT [#2+2+250]] DO2
Pracowałem na symulatorze z poziomu PC, pomyślałem więc że może zaburzone jest zwracanie poprawnej wartości zmiennej, poprzez co udałem się do pracowni i skorzystałem z oryginalnego symulatora HAAS. Efekt ten sam. Tam jednak zbadałem zmiany wartości zm. #5041 na dwa sposoby:
1. Dopisanie 250 do warunku pętli celem jej wykonania, następnie wprowadzenie wyrażenia w pętli F#5041 (czyli wartość posuwu wynosi tyle samo, co aktualna liczba reprezentowana przez #5041) (a jak wiemy, tę wartość można na bieżąco podglądać na ekranie symulacji). Efektem była jednorazowa zmiana F na 250, i choć zmieniał się X, to wyświetlana wartość F zawsze byłą taka sama.
2. Podobnie jak przedtem dodałem 250, tym jednak że do sprawdzenia wartości #5041 użyłem zmiennej globalnej #105: #105=#5041, a następnie sprawdzałem ją z poziomu MDI DNC->CURNT COMDS->2xPAGE DOWN->3x strzałka w prawo. Ku mojemu zdumieniu, owa wartość zmieniała się poprawnie, co było widać nawet wówczas, gdy zwracana wartość powinna zakończyć pętle a ta jednak nadal się wykonywała poprzez stałą zmienną #5041, której poza warunkiem obserwowałem jako zmienną.
Ktoś może powiedzieć, o co do jasnej chodzi?... Siedziałem wiele godzin nad tym problemem, wiem że dodanie osobnej zmiennej iteracyjnej załatwi problem, ale tak się problemów nie rozwiązuje, czyż nie tak? Dostępu do maszyny celem dobitnego sprawdzenia niestety nie mam.
//edit
gdyby kogoś interesowała całość kodu: http://pokazywarka.pl/5gqp7c/