Dzielenie odcinka na równe części na podstawie "widełek" [BASCOM]
-
- Posty: 7
- Rejestracja: 13 gru 2019, 7:30
Dzielenie odcinka na równe części na podstawie "widełek" [BASCOM]
Witam.
Potrzebuje podzielić odcinek na równe części i wyliczyć ilość punktów uwzględniając przy tym wytyczne dot długości min. i max. odcinka.
W skrócie po podaniu długości odcinka dostaje informację o ilości punktów oraz wyliczonej długości podziału.
Przykład
Odcinek: 1200mm
"widełki" podziału: 220-300mm
początek i koniec odcinka to stała wartość 60mm
W jaki sposób mogę to obliczyć ? i czy w ogóle jest możliwość wykonania tego przy użyciu BASCOM ?
Dziękuję za ewentualną pomoc.
Pozdrawiam
Potrzebuje podzielić odcinek na równe części i wyliczyć ilość punktów uwzględniając przy tym wytyczne dot długości min. i max. odcinka.
W skrócie po podaniu długości odcinka dostaje informację o ilości punktów oraz wyliczonej długości podziału.
Przykład
Odcinek: 1200mm
"widełki" podziału: 220-300mm
początek i koniec odcinka to stała wartość 60mm
W jaki sposób mogę to obliczyć ? i czy w ogóle jest możliwość wykonania tego przy użyciu BASCOM ?
Dziękuję za ewentualną pomoc.
Pozdrawiam
- niveasoft
- Posty: 1216
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: Dzielenie odcinka na równe części na podstawie "widełek" [BASCOM]
Przepraszam, że wcześniej nie odpowiedziałem. Jakoś silnik Forum nie powiadomił mnie o zapytaniu. Trudno
Pan to chyba źle opisał :
Nie obraź się, ale coraz więcej ludzi ma problem z określeniem swoich oczekiwań Potraktuj to jako żart, ale też przeczytaj swoje pytanie i moje.
Nie, nie jestem kobietą. Nie potrafię się domyśleć. W technice nie ma na to miejsca.
Pan to chyba źle opisał :
Tak pobieżnie rozumuje, że chcesz dostać informacje o wyliczonej długości podziału po podaniu ilości punktów oraz długości odcinka?W skrócie po podaniu długości odcinka dostaje informację o ilości punktów oraz wyliczonej długości podziału.
Nie obraź się, ale coraz więcej ludzi ma problem z określeniem swoich oczekiwań Potraktuj to jako żart, ale też przeczytaj swoje pytanie i moje.
Nie, nie jestem kobietą. Nie potrafię się domyśleć. W technice nie ma na to miejsca.
-
- Posty: 7
- Rejestracja: 13 gru 2019, 7:30
Re: Dzielenie odcinka na równe części na podstawie "widełek" [BASCOM]
Nie obrażam się w żadnym wypadku, sam byłem świadom, że mi ciężko wytłumaczyć a innemu może być ciężko to zrozumieć
to dlatego narysowałem prosty przykład ^^
Długość wkładanego elementu do maszyny zgodnie z rysunkiem to 1200mm (długości mogą być od 800 do 5000mm)
po wpisaniu wymiaru na klawiaturze numerycznej urządzenie powinno automatycznie rozmierzyć punkty obróbki oraz wyświetlić ich ilość na hd44780 czyli:
pierwszy punkt zawsze 60mm od początku profilu, każdy kolejny równo rozmieszczony ma się zmieścić w przedziale 220-300mm lecz ostatni musi wypaść 60mm od końca.
Wydziorgałem wstępnie program którego testuje w symulatorze jednak wymiar mi się nie zgadza. Przy wymiarze 2345mm powinno być 10 otworów w rozstawie 247,22mm Oto on:
temp- wpisany wymiar
to dlatego narysowałem prosty przykład ^^
Długość wkładanego elementu do maszyny zgodnie z rysunkiem to 1200mm (długości mogą być od 800 do 5000mm)
po wpisaniu wymiaru na klawiaturze numerycznej urządzenie powinno automatycznie rozmierzyć punkty obróbki oraz wyświetlić ich ilość na hd44780 czyli:
pierwszy punkt zawsze 60mm od początku profilu, każdy kolejny równo rozmieszczony ma się zmieścić w przedziale 220-300mm lecz ostatni musi wypaść 60mm od końca.
Wydziorgałem wstępnie program którego testuje w symulatorze jednak wymiar mi się nie zgadza. Przy wymiarze 2345mm powinno być 10 otworów w rozstawie 247,22mm Oto on:
temp- wpisany wymiar
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $sim
- $regfile = "m32def.dat"
- $crystal = 8000000
- $hwstack = 64
- $swstack = 32
- $framesize = 64
- $baud = 1200
- $timeout = 10000
- Config Submode = New
- Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7 , Wr = Portb.1
- Config Lcd = 16x2
- Cursor Off , Noblink
- Cls
- config portd.1=input
- dim PrzerwaMax as word
- dim PrzerwaMin as word
- dim Przerwaa as word
- dim Przerwa as word
- dim Otwory as word
- dim Skrajnyotwor as byte
- dim Temp as word
- dim x as single
- dim y as word
- dim z as single
- PrzerwaMax=300 'przerwa maksymalna
- PrzerwaMin=220 'przerwa minimalna
- Skrajnyotwor=120 'skrajny otwor 60x2=120mm
- Temp=2345 'calkowity wymiar elementu obrabianego
- przerwa=0
- set portd.1=0
- Do
- przerwa=temp-skrajnyotwor
- przerwa=przerwa\otwory
- locate 1,1
- lcd temp
- locate 2,1
- lcd Otwory
- otwory=otwory+1
- if przerwa>=PrzerwaMin and przerwa<=PrzerwaMax then
- gosub wiercenie
- end if
- Loop
- End
- wiercenie:
- cls
- do
- locate 1,1
- lcd "OK!"
- y=otwory+1
- x=przerwa/y
- locate 1,6
- lcd otwory
- locate 2,1
- lcd "wymiar ";x;"mm"
- loop until portd.1=1 'czekaj az przycisk nie zostanie wcisniety
- return
- niveasoft
- Posty: 1216
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: Dzielenie odcinka na równe części na podstawie "widełek" [BASCOM]
No nie zawsze można podzielić bez reszty. Zerknij co tu wymodziłem.
...a nie wiem czy wcześniej pisałeś, że możemy zejść do ułamków milimetra czyli liczb z przecinkiem
...a nie wiem czy wcześniej pisałeś, że możemy zejść do ułamków milimetra czyli liczb z przecinkiem
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $sim
- $regfile = "m32def.dat"
- $crystal = 8000000
- $hwstack = 64
- $swstack = 32
- $framesize = 64
- $baud = 1200
- $timeout = 10000
- Config Submode = New
- Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7 , Wr = Portb.1
- Config Lcd = 16x2
- Cursor Off , Noblink
- Cls
- Config Portd.1 = Input
- Dim Przerwamax As Word
- Dim Przerwamin As Word
- Dim Przerwaa As Word
- Dim Przerwa As Word
- Dim Otwory As Word
- Dim Skrajnyotwor As Byte
- Dim Temp As Word
- Dim X As Single
- Dim Y As Word
- Dim Z As Single
- Dim My_temp1 As Word , My_temp2 As Word , Helpb As Byte , Mem1 As Word , Mem2 As Word
- Przerwamax = 300 'przerwa maksymalna
- Przerwamin = 220 'przerwa minimalna
- Skrajnyotwor = 120 'skrajny otwor 60x2=120mm
- Temp = 2345 'calkowity wymiar elementu obrabianego
- Przerwa = 0
- Przerwa = Temp - Skrajnyotwor '2225
- My_temp2 = Przerwamin - 1
- Mem1 = Przerwamax
- Do
- Incr My_temp2 'zwiększaj przerwe 220, 221, 223, 224...
- My_temp1 = Przerwa 'przypomnij długość początkową
- My_temp1 = My_temp1 Mod My_temp2 'dziel przez przerwę i sprawdź resztę
- If My_temp1 = 0 Then 'nie ma reszty->Okay!
- Helpb = 1
- Exit Do
- Else 'niestety mamy resztę z dzielenia
- If My_temp1 < Mem1 Then 'jeśli reszta mniejsza od poprzedniej to
- Mem1 = My_temp1 'zapamietaj reszte
- Mem2 = My_temp2 'zapamietaj przerwe
- End If
- End If
- If My_temp2 >= Przerwamax Then 'gdyby przerwa miała już 300 to opuść
- Helpb = 2
- Exit Do
- End If
- Loop
- Select Case Helpb
- Case 1 :
- Print "Okay! Przerwa powinna wynosić " ; My_temp2
- Case 2
- Print "Nie udało się podzielić bez reszty. Wynik z najniższą resztą=" ; Mem1 ; " to " ; Mem2
- End Select
- End
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
-
- Posty: 7
- Rejestracja: 13 gru 2019, 7:30
Re: Dzielenie odcinka na równe części na podstawie "widełek" [BASCOM]
Możemy zejść do ułamków milimetra,tak by w późniejszym czasie można było łatwo przerzucić na kroki silnika. Jak już dzielenie będzie poprawne to muszę dodać jeszcze obsługę klawiatury i wspomnianego silnika krokowego step/dir
Jednak Przy wymiarze 2345mm powinno być 10 otworów w rozstawie 247,22mm
wynik z programu to 278 z resztą 1.
Jednak Przy wymiarze 2345mm powinno być 10 otworów w rozstawie 247,22mm
wynik z programu to 278 z resztą 1.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Ostatnio zmieniony 16 gru 2019, 14:58 przez airman, łącznie zmieniany 3 razy.
- niveasoft
- Posty: 1216
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: Dzielenie odcinka na równe części na podstawie "widełek" [BASCOM]
Trzeba nad tym pomyśleć, bo Ty tak piszesz, ze otworów ma być dziesięć przy tym wymiarze a jak sprawdzisz kalkulatorem to (2345-120)/278=8,003597122302158
Może to później policzę na Single, albo wszystko się pomnoży x100 żeby się pozbyć ułamków. Na razie mam poniedziałkowy młyn.
Może to później policzę na Single, albo wszystko się pomnoży x100 żeby się pozbyć ułamków. Na razie mam poniedziałkowy młyn.
-
- Posty: 7
- Rejestracja: 13 gru 2019, 7:30
Re: Dzielenie odcinka na równe części na podstawie "widełek" [BASCOM]
Masz rację.niveasoft pisze: ↑16 gru 2019, 9:06Trzeba nad tym pomyśleć, bo Ty tak piszesz, ze otworów ma być dziesięć przy tym wymiarze a jak sprawdzisz kalkulatorem to (2345-120)/278=8,003597122302158
Może to później policzę na Single, albo wszystko się pomnoży x100 żeby się pozbyć ułamków. Na razie mam poniedziałkowy młyn.
Można to podzielić w dwojaki sposób mieszcząc się w widełkach. Jeden otwór trzeba dodać gdyż nie jest liczony w programie czyli wychodzi 9.
A co do młyna to i tak dziękuję, że znajdujesz czas by pomóc innym.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
- Oldman
- Posty: 61
- Rejestracja: 19 cze 2019, 11:15
Re: Dzielenie odcinka na równe części na podstawie "widełek" [BASCOM]
Wymyśliłem taki algorytm który może ułatwi obliczenia.
Masz odcinek o długości np. 2500mm. Najpierw odejmujesz od niego 2x60 czyli zostaje 2380. Teraz dzielisz to przez dolną wartość widełek czyli przez 220. Wynik to 10,82.
Część całkowita czyli 10 to największa ilość możliwych odcinków. Teraz dzielisz 2380 przez górną wartość widełek czyli 300 i otrzymujesz 7,9. Znowu bierzesz część całkowitą, w tym wypadku 7, i gdy część dziesiętna nie jest równa zeru to zwiększasz o jeden (7+1). Jeżeli z dzielenia wyjdzie liczba całkowita np. 8,00 to oczywiście już jej nie zwiększasz. Otrzymujesz najmniejsza ilość równych odcinków =8. Czyli w grę wchodzi podział przez 8, 9, i 10. Przy długościach odcinków odpowiednio: 297,5 264,4 i 238.
Napisałem krótki program, w którym wykorzystałem mój algorytm.
Masz odcinek o długości np. 2500mm. Najpierw odejmujesz od niego 2x60 czyli zostaje 2380. Teraz dzielisz to przez dolną wartość widełek czyli przez 220. Wynik to 10,82.
Część całkowita czyli 10 to największa ilość możliwych odcinków. Teraz dzielisz 2380 przez górną wartość widełek czyli 300 i otrzymujesz 7,9. Znowu bierzesz część całkowitą, w tym wypadku 7, i gdy część dziesiętna nie jest równa zeru to zwiększasz o jeden (7+1). Jeżeli z dzielenia wyjdzie liczba całkowita np. 8,00 to oczywiście już jej nie zwiększasz. Otrzymujesz najmniejsza ilość równych odcinków =8. Czyli w grę wchodzi podział przez 8, 9, i 10. Przy długościach odcinków odpowiednio: 297,5 264,4 i 238.
Napisałem krótki program, w którym wykorzystałem mój algorytm.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $sim
- $regfile = "m32def.dat"
- $crystal = 8000000
- $hwstack = 64
- $swstack = 32
- $framesize = 64
- $baud = 1200
- $timeout = 10000
- Config Submode = New
- Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7 , Wr = Portb.1
- Config Lcd = 16x2
- Cursor Off , Noblink
- Cls
- Config Portd.1 = Input
- Dim Gabaryt As Single
- Dim Pomoc As Single
- Dim Przerwamax As Word
- Dim Przerwamin As Word
- Dim N As Byte 'minimalna ilość odcinków
- Dim M As Byte 'maksymalna ilość odcinków
- Dim Reszta As Single
- Dim Przerwa As Single
- Gabaryt = 2345
- Przerwamax = 300 'przerwa maksymalna
- Przerwamin = 220 'przerwa minimalna
- Gabaryt = Gabaryt - 120
- M = Gabaryt \ Przerwamin 'tu uzyskujemy wynik w liczbach całkowitych, dziesiętne z automatu zostają odrzucone (odwrotna kreska ukośna)
- ' czyli M to największa możliwa ilość odcinków przy zadanych widełkach
- Pomoc = Gabaryt / Przerwamax 'a tu dzielimy przez zwykłą kreskę ukośną więc otrzymujemy wynik z częścią ułamkową
- Reszta = Frac(pomoc) 'wyciągamy część ułamkową, tą po kropce
- Print "Pomoc=" ; Pomoc 'te dwa "printy" dopisałem żeby było widać jak to pracuje
- Print "Reszta=" ; Reszta
- If Reszta = 0 Then ' i sprawdzamy czy ma wartość zerową
- N = Pomoc 'jeśli tak to wynik dzielenia jest gotową minimalną ilością odcinków
- ' (przy przepisaniu do N tracimy to co po kropce bo N jest liczbą typu Byte
- Else
- N = Pomoc + 1 'jeżeli z dzielenia wyszły jakieś ułamki to zwiększamy N o jeden
- End If
- '&&&&&&&&&&&&&&&&&& Właściwie tu się kończy "mój " algorytm, reszta to już jest tylko część obliczeniowa dla sprawdzenia poprawności działania
- Do 'to NIE JEST pętla główna programu
- Przerwa = Gabaryt \ N 'najpierw zaczynamy dzielić materiał na minimalną ilość odcinków
- Print "Ilość odcinków=" ; N ; " Długość odcinka=" ; Przerwa ' tu wypisujemy wynik działania
- Incr N ' przechodzimy do kolejnej liczby podziału
- If N > M Then Exit Do 'dopóki nie zaliczymy wszystkich możliwych wariantów
- Loop
- End
Ostatnio zmieniony 17 gru 2019, 11:20 przez Oldman, łącznie zmieniany 3 razy.
-
- Posty: 7
- Rejestracja: 13 gru 2019, 7:30
Re: Dzielenie odcinka na równe części na podstawie "widełek" [BASCOM]
Program działa bardzo dobrze i bardzo dziękuję Oldman za nakierowanie, mam wrażenie, że zajmuje troszkę więcej miejsca w pamięci ale to nie jest problem (jeszcze ).
gabaryt | Przerwa
1500 | 276,000mm
2345 | 247,222mm
4214 | 272,933mm
To przykładowe wyniki z kalkulatora którego posiadam. Czy można zrobić działanie które wypluje mi takie wyniki ? ewentualnie czy możesz Opisać w komentarzach działanie każdej linii ?
Na marginesie nie wiedziałem, że istnieje funkcja FRAC zastanawiam się dlaczego wyciągamy dziesiętne funkcją FRAC wcześniej dzieląc bez reszty ?
Być może zadaję śmieszne pytania jednak programowanie to dla mnie ciągła nauka o tyle o ile układy potrafię zmontować tak z językami się biję od dłuższego czasu
gabaryt | Przerwa
1500 | 276,000mm
2345 | 247,222mm
4214 | 272,933mm
To przykładowe wyniki z kalkulatora którego posiadam. Czy można zrobić działanie które wypluje mi takie wyniki ? ewentualnie czy możesz Opisać w komentarzach działanie każdej linii ?
Na marginesie nie wiedziałem, że istnieje funkcja FRAC zastanawiam się dlaczego wyciągamy dziesiętne funkcją FRAC wcześniej dzieląc
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- Pomoc = Gabaryt \ Przerwamax
Być może zadaję śmieszne pytania jednak programowanie to dla mnie ciągła nauka o tyle o ile układy potrafię zmontować tak z językami się biję od dłuższego czasu
- Oldman
- Posty: 61
- Rejestracja: 19 cze 2019, 11:15
Re: Dzielenie odcinka na równe części na podstawie "widełek" [BASCOM]
Dla każdego programowanie to ciągła nauka, niezależnie od zaawansowania Oczywiście nie dotyczy Bartka
W programie dopisałem komentarze a tu jeszcze kilka uwag.
Program oblicza wszystkie możliwe podziały dla zadanej długości materiału i widełek, dlatego następnie musisz mieć możliwość wyboru tego, który Cię interesuje. Przykładowo dla długości materiału 5000mm mamy aż 6 możliwych podziałów (od 17 do 22). Dopiero po wybraniu podziału (z klawiatury?) należy obliczyć pozycje kolejnych otworów. Pierwszy oczywiście na 60-tym milimetrze, kolejny na "60 + Przerwa" itd.
W moim przykładzie brakuje jakiejkolwiek kontroli wpisanych wartości. Na przykład czy Gabaryt jest większy od Przerwamax, czy Przerwamax jest większa od Przerwymin itp.
Jakby co to pytaj. Mirek.
Edit: Dopisałem dwa "Printy" żebyś mógł podejrzeć jak zmieniają się wartości Pomoc i Reszta. Sprawdź dla długości np. 3720 (podział bez reszty)
W programie dopisałem komentarze a tu jeszcze kilka uwag.
Program oblicza wszystkie możliwe podziały dla zadanej długości materiału i widełek, dlatego następnie musisz mieć możliwość wyboru tego, który Cię interesuje. Przykładowo dla długości materiału 5000mm mamy aż 6 możliwych podziałów (od 17 do 22). Dopiero po wybraniu podziału (z klawiatury?) należy obliczyć pozycje kolejnych otworów. Pierwszy oczywiście na 60-tym milimetrze, kolejny na "60 + Przerwa" itd.
W moim przykładzie brakuje jakiejkolwiek kontroli wpisanych wartości. Na przykład czy Gabaryt jest większy od Przerwamax, czy Przerwamax jest większa od Przerwymin itp.
Jakby co to pytaj. Mirek.
Edit: Dopisałem dwa "Printy" żebyś mógł podejrzeć jak zmieniają się wartości Pomoc i Reszta. Sprawdź dla długości np. 3720 (podział bez reszty)