Strona 1 z 2
Dzielenie odcinka na równe części na podstawie "widełek" [BASCOM]
: 13 gru 2019, 8:00
autor: airman
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
Re: Dzielenie odcinka na równe części na podstawie "widełek" [BASCOM]
: 13 gru 2019, 17:59
autor: niveasoft
Przepraszam, że wcześniej nie odpowiedziałem. Jakoś silnik Forum nie powiadomił mnie o zapytaniu. Trudno
Pan to chyba źle opisał :
W skrócie po podaniu długości odcinka dostaje informację o ilości punktów oraz wyliczonej długości podziału.
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?
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.
Re: Dzielenie odcinka na równe części na podstawie "widełek" [BASCOM]
: 16 gru 2019, 7:47
autor: airman
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
$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
Re: Dzielenie odcinka na równe części na podstawie "widełek" [BASCOM]
: 16 gru 2019, 8:23
autor: niveasoft
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
$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
Re: Dzielenie odcinka na równe części na podstawie "widełek" [BASCOM]
: 16 gru 2019, 8:45
autor: airman
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.
7444691100_1576143990.jpg
Re: Dzielenie odcinka na równe części na podstawie "widełek" [BASCOM]
: 16 gru 2019, 9:06
autor: niveasoft
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.
Re: Dzielenie odcinka na równe części na podstawie "widełek" [BASCOM]
: 16 gru 2019, 9:38
autor: airman
niveasoft pisze: ↑16 gru 2019, 9:06
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.
Masz rację.
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.
20191216_093153.jpg
A co do młyna to i tak dziękuję, że znajdujesz czas by pomóc innym.
Re: Dzielenie odcinka na równe części na podstawie "widełek" [BASCOM]
: 16 gru 2019, 15:25
autor: Oldman
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.
$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
Re: Dzielenie odcinka na równe części na podstawie "widełek" [BASCOM]
: 17 gru 2019, 9:11
autor: airman
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
Pomoc = Gabaryt \ Przerwamax
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
Re: Dzielenie odcinka na równe części na podstawie "widełek" [BASCOM]
: 17 gru 2019, 10:16
autor: Oldman
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)