This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Nhö vaäy ñieàu khieån theo chöông trình soá laø moät quaù trình töï ñoäng cho pheùp ñöa moät cô caáu di ñoäng töø vò trí naøy ñeán vò trí khaùc baèng moät leänh. Söï dòch chuyeån naøy coù theå laø löôïng di ñoäng thaúng hay goùc quay theo caùc baäc töï do.
Trong nhieàu tröôøng hôïp, phöông phaùp ñieàu khieån theo chöông trình soá ñöôïc thieát keá töï ñoäng hoaù vieäc di ñoäng moät cô caáu töø vò trí naøy ñeán vò trí khaùc, ta goïi laø “ñieàu khieån theo ñieåm”. Nhöng ta cuõng thöïc hieän deã daøng khi ruùt ngaén voâ haïn khoaûng caùch giöõa hai ñieåm di ñoäng keá tieáp nhau vaø seõ ñaït ñöôïc moät quaù trình ñieàu khieån quó ñaïo goïi laø “ñieàu khieån theo ñöôøng”.
Phöông phaùp ñieàu khieån chöông trình soá coù theå duøng ñeå di ñoäng baát kì moät cô caáu naøo ñöôïc truyeàn ñoäng baèng cô. Phaïm vi söû duïng cuûa noù raát roäng, nhöng chuû yeáu laø töï ñoäng hoaù maùy coâng cuï, vì lónh vöïc naøy bao goàm vieäc ñieàu khieån dao caét baèng caùc chöõ soá.
Maùy veõ ñöôïc thieát keá trong luaän vaên naøy laø maùy veõ ñöôïc ñieàu khieån theo chöông trình soá.
Phaàn chính cuûa maùy veõ goàm hai truïc X,Y ñeå ñieàu khieån vò trí qua laïi cuûa buùt veõ trong maët phaúng baûn veõ vaø truïc Z gaén tröïc tieáp vôùi buùt veõ ñeå ñieàu khieån nhaác buùt leân hay haï buùt xuoáng.
Moãi truïc X,Y ñöôïc caáu taïo goàm moät ñoäng cô böôùc coù truïc quay gaén lieàn vôùi moät vitme . Vitme laø moät truïc coù raêng xoaén, ñöôïc maøi kyõ. Neáu ta gaén moät vaät leân raêng xoaén cuûa vitme thì khi ñoäng cô quay, vitme seõ chuyeån chuyeån ñoäng quay thaønh chuyeån ñoäng tröôït cuûa vaät treân raêng xoaén. Tuøy theo chieàu quay cuûa ñoäng cô laø thuaän hay nghòch maø vaät seõ chuyeån ñoäng tôùi hay lui treân raêng xoaén.
Truïc X ñöôïc ñaët leân vitme cuûa truïc Y, coøn truïc Z laïi ñöôïc ñaët leân vitme cuûa truïc X. Keát quaû laø khi chæ quay moät ñoäng cô thì buùt veõ chæ di chuyeån theo moät truïc, coøn khi quay ñoàng thôøi hai ñoäng cô thì buùt veõ seõ di chuyeån theo hai truïc, vaø vieäc naøy daãn ñeán vieäc ta coù theå veõ ñöôïc caùc ñöôøng xieân vaø laø tieàn ñeà cho vieäc veõ caùc ñöôøng cong.
Truïc Z ñôn giaûn chæ laø moät nam chaâm ñieän coù truïc gaén vôùi buùt veõ duøng ñeå ñieàu khieån vò trí nhaác leân hay haï xuoáng cuûa noù. Khi coù doøng ñieän ñi qua nam chaâm, buùt seõ ñöôïc nhaác leân. Ngoaøi ra coøn moät soá coâng taéc haønh trình ñeå vieäc ñieàu khieån ñöôïc chính xaùc vaø deã daøng.
Tìm hieåu hai ñoäng cô böôùc cuûa hai truïc X,Y :Hai ñoäng cô böôùc trong moâ hình ñöôïc thieát keá nhö sau :- Ñoäng cô truïc X :
Moãi laàn xuaát thuû tuïc LineNDC_() leân thieát bò phaûi aùnh xaï hình vuoâng ñôn vò cuûa hình vuoâng lôùn nhaát teân thieát bò goïi laø hình vuoâng thieát bò. Nghóa laø, cho ñieåm baát kyø P(x,y) trong NDC ta caàn tính toïa ñoä thieát bò töông öùng Q(dx,dy) trong hình vuoâng thieát bò, nhö trong hình döôùi ñaây :
Pheùp aùnh xaï naøy phaûi tæ leä. Vì vaäy dx phaûi aùnh xaï tuyeán tính theo x, sao cho :
dx=Ax+Bvaø dy=Cy+D
vôùi A,B,C,D laø haèng soá.
2/ÖÙNG DUÏNG VAØO ÑEÀ TAØI: - Sau ñaây laø ñoaïn chöông trình minh hoïa vieäc chuyeån ñoåi toïa ñoä cuûa caùc ñieåm , ñöôøng töø heä toïa ñoä trong AutoCad sang heä toïa ñoä trong PC vaø heä toïa ñoä baøn veõ. - Khai baùo bieán: p.x ; p.y :toïa ñoä trong AutoCad (Kích thöôùc baûn veõ laø Page_Width * Page_Height ) PC_p.x ; PC_p.y :toïa ñoä trong PC (Baøn veõ trong PC laø phaàn töû Image.canvas coù kích thöôùc 350*350). Mv_p.x ; Mv_p.y :toïa ñoä trong baøn veõ (Baøn veõ cuûa maùy veõ coù kích thöôùc 420*297). - Procedure Chuyen_doi_toa_do ();
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
14
1
1
x
y P
dx
dy
Q
NDCLargest Square
Device Coordinate
space
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Begin If (Page_Width div 350) > (Page_Height div 350) then Scale:=Round(Page_Width div 350)+1 else Scale:=Round(Page_Height div 350)+1; PC_p.x:=350 div 2 + p.x div Scale; PC_p.y:=350 div 2 –p.y div Scale ; Mv_p.x:=p.x*10; /* Moãi böôùc cuûa ñoäng cô buùt di chuyeån ñöôïc 0.1mm*/ Mv_p.y:=p.y*10; End.
41 Start parameter (this value is 0.0 for a full ellipse)
42 End parameter (this value is 2pi for a full ellipse)
Nhoùm maõ sau öùng duïng cho caùc ñoái töôïng LINE : Nhoùm maõ Line :
Group codes
Description
100 Subclass marker (AcDbLine)
39 Thickness (optional; default = 0)
10 Start point (in WCS). DXF: X value; APP: 3D point
20, 30 DXF: Y and Z values of start point (in WCS)
11 End point (in WCS). DXF: X value; APP: 3D point
21, 31 DXF: Y and Z values of end point (in WCS)
210 Extrusion direction. (optional; default = 0, 0, 1). DXF: X value; APP: 3D vector
220, 230 DXF: Y and Z values of extrusion direction
Nhoùm maõ sau öùng duïng cho caùc ñoái töôïng POINT : Nhoùm maõ Point :
Group codes Description
100 Subclass marker (AcDbPoint)
10 Point location (in WCS). DXF: X value; APP: 3D point
20, 30 DXF: Y and Z values of point location (in WCS)
39 Thickness (optional; default = 0)
210 Extrusion direction. (optional; default = 0, 0, 1). DXF: X value; APP: 3D vector
220, 230 DXF: Y and Z values of extrusion direction
50 Angle of the X axis for the UCS in effect when the point was drawn (optional, default = 0); used when PDMODE is nonzero
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
19
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Nhoùm maõ sau öùng duïng cho caùc ñoái töôïng POLYLINE : Nhoùm maõ Polyline :
Group codes Description
100 Subclass marker (AcDb2dPolyline or AcDb3dPolyline)
10 DXF: always 0APP: a "dummy" point; the X and Y values are always 0, and the Z value is the polyline's elevation (in OCS when 2D, WCS when 3D)
20 DXF: always 0
30 DXF: polyline's elevation (in OCS when 2D, WCS when 3D)
39 Thickness (optional; default = 0)
70 Polyline flag (bit-coded); default is 0:1 = This is a closed polyline (or a polygon mesh closed in the M direction).2 = Curve-fit vertices have been added.4 = Spline-fit vertices have been added.8 = This is a 3D polyline.16 = This is a 3D polygon mesh.32 = The polygon mesh is closed in the N direction.64 = The polyline is a polyface mesh.128 = The linetype pattern is generated continuously around the vertices of this polyline.
40 Default starting width (optional; default = 0)
41 Default ending width (optional; default = 0)
71 Polygon mesh M vertex count (optional; default = 0)
72 Polygon mesh N vertex count (optional; default = 0)
73 Smooth surface M density (optional; default = 0)
74 Smooth surface N density (optional; default = 0)
75 Curves and smooth surface type (optional; default = 0); integer codes, not bit-coded:0 = No smooth surface fitted5 = Quadratic B-spline surface6 = Cubic B-spline surface8 = Bezier surface
210 Extrusion direction. (optional; default = 0, 0, 1). DXF: X value; APP: 3D vector
220, 230 DXF: Y and Z values of extrusion direction
Nhoùm maõ sau öùng duïng cho caùc ñoái töôïng SPLINE :
21, 31 DXF: Y and Z values of fit points (in WCS) (one entry per fit point)
Nhoùm maõ sau öùng duïng cho caùc ñoái töôïng TEXT : Nhoùm maõ Text :
Group codes Description
100 Subclass marker (AcDbText)
39 Thickness (optional; default = 0)
10 First alignment point (in OCS) DXF: X value; APP: 3D point
20, 30 DXF: Y and Z values of first alignment point (in OCS)
40 Text height
1 Default value (the string itself)
50 Text rotation (optional; default = 0)
41 Relative X scale factor—width (optional; default = 1).This value is also adjusted when fit-type text is used.
51 Oblique angle (optional; default = 0)
7 Text style name (optional, default = STANDARD)
71 Text generation flags (optional, default = 0):2 = Text is backward (mirrored in X),4 = Text is upside down (mirrored in Y)
72 Horizontal text justification type (optional, default = 0) integer codes (not bit-coded)0 = Left;1= Center; 2 = Right3 = Aligned (if vertical alignment = 0)4 = Middle (if vertical alignment = 0)5 = Fit (if vertical alignment = 0)See the following table for clarification
11 Second alignment point (in OCS). DXF: X value; APP: 3D point.This value is meaningful only if the value of a 72 or 73 group is nonzero (if the justification is anything other than baseline/left)
21, 31 DXF: Y and Z values of second alignment point (in OCS)
210 Extrusion direction. (optional; default = 0, 0, 1). DXF: X value; APP: 3D vector
220, 230 DXF: Y and Z values of extrusion direction
Neáu 2 ñieåm vôùi toïa ñoä (x1,y1) vaø (x2,y2) ñöôïc söû duïng ñeå xaùc ñònh neân moät ñöôøng thaúng thì phöông trình cuûa ñöôøng thaúng qua hai ñieåm ñöôïc vieát laïi nhö sau :
Töø phöông trình naøy chuùng ta coù theå xaây döïng quaù trình veõ caùc ñöôøng thaúng khi cho x bieán thieân theo caùc khoaûng x vaø keát quaû ta coù theå thu ñöôïc giaù trò cuûa bieán y thay ñoåi vôùi caùc khoaûng y töông öùng (y=kx).
Do caùc ñöôøng thaúng ñöôïc moâ taû trong heä toïa ñoä thöïc khi hieån thò trong maùy tính, heä toïa ñoä chính laø löôùi nguyeân neân baûn chaát cuûa quaù trình veõ caùc ñöôøng thaúng chính laø söï nguyeân hoùa caùc toïa ñoä caùc ñieåm thuoäc ñöôøng thaúng vaø veõ caùc pixel töông öùng.
Nguyeân lyù chung laø cho moät thaønh phaàn toïa ñoä x hay y bieán ñoåi theo töøng ñôn vò vaø tính toïa ñoä nguyeân coøn laïi sao cho gaàn vôùi toïa ñoä thöïc nhaát. Vieäc quyeát ñònh choïn x hay y bieán ñoåi phuï thuoäc vaøo ñoä roäng cuûa ñöôøng thaúng.
b/ Giaûi thuaät trung ñieåm sinh ñöôøng thaúng (MidPoint) :
Giaûi thuaät ñieåm giöõa (Midpoint) ñöôïc Pitteway ñöa ra nhöõng naêm 1967 vaø ñöôïc VanAken aùp duïng cho vieäc sinh caùc ñöôøng thaúng vaø ñöôøng troøn naêm 1985 cho ra caùc coâng thöùc ñôn giaûn vaø taïo ñöôïc caùc ñieåm töông töï vôùi giaûi thuaät Bresenham.
Giaû söû ñieåm (xi,yi) laø ñieåm hieän thôøi vaø vôùi giaûi thuaät Bresenham, vieäc quyeát ñònh ñieåm A hay ñieåm B laø ñieåm keá tieáp laø vieäc löïa choïn giaù trò y i+1 hay yi döïa vaøo khoaûng caùch töø AS hay töø BS. Vaø nhö vaäy giaûi thuaät ñaõ boû qua yeáu toá ñaùnh giaù ñôn giaûn laø : ñieåm M, trung ñieåm cuûa ñoaïn AB, maø qua ñoù vieäc so saùnh chæ ñôn giaûn laø quaù trình xeùt xem M naèm treân hay döôùi ñöôøng thaúng caàn sinh.
Ñaët d = F(xi+1,yi+1/2) laø trung ñieåm cuûa ñoaïn AB, ta coù :di = a(xi+1)+b(yi+1/2)+c
Vieäc so saùnh, hay kieåm tra M seõ ñöôïc thay baèng vieäc xeùt giaù trò d. Neáu d>0 ñieåm B ñöôïc choïn, neáu d<0 ñieåm A ñöôïc choïn. Trong tröôøng hôïp d=0 chuùng ta coù theå choïn ñieåm baát kyø A hay B.- Neáu B ñöôïc choïn thì M seõ taêng theo x moät ñôn vò
Khi ñoù :di+1 = F(xi+2,yi+1/2) di+1 = di+a = di+dy
- Neáu A ñöôïc choïn thì M taêng theo 2 höôùng x vaø y cuøng moät ñôn vò.Khi ñoù :
di+1 = F(xi+2,yi+3/2) di+1 = di+a+b = di+dy-dx
Ñeå tính ñöôïc giaù trò d1, laø giaù trò ñaàu tieân cho quaù trình tính toaùn, thay vaøo coâng thöùc treân ta coù :
Phöông trình ñöôøng troøn ñi qua taâm (xc,yc) ñöôïc bieåu dieãn döôùi daïng toång quaùt
(x - xc)2 + (y – yc)2 = R2
vôùi R laø baùn kính cuûa ñöôøng troøn.Vieäc sinh ra ñöôøng troøn coù theå ñôn giaûn taïo thaønh khi
cho bieán x chaïy töø xc xc + R hay vôùi ñöôøng troøn taâm truøng vôùi goác toïa ñoä thì tham bieán x chaïy töø 0 R.
Vì ñöôøng troøn coù hình daïng cong neân maät ñoä ñieåm ñöôïc taïo ra daøn traûi khoâng ñeàu treân maøn hình Raster thoâng qua caùc giaù trò toïa ñoä ñöôïc tính theo coâng thöùc :
Hình : Sô ñoà chaân 8951 c/ Sô löôïc veà caùc chaân cuûa 8951:
Port 0 (32 – 39): Laø moät port 2 chöùc naêng: 8 bit Data Bus & 8 bit thaáp Address Bus khi coù boä nhôù môû roäng.
Port 1 (1 – 8): Laø moät port I/O. Port 2 (21 – 28): Vöøa laøm port I/O, vöøa laø 8 bit cao
Address Bus khi coù boä nhôù môû roäng. Port 3 (10 – 17): Laø moät port coù coâng duïng keùp PSEN (Program Store Enable),(chaân 29): Laø tín hieäu ñieàu
khieån ñeå cho pheùp boä nhôù chöông trình môû roäng vaø thöôøng ñöôïc noái ñeán chaân OE (output enable) cuûa moät EPROM ñeå cho pheùp ñoïc caùc byte maõ leänh.
ALE (Address Latch Enable),(chaân 30): Khi port 0 ñöôïc duøng trong cheá ñoä vöøa laø Data Bus vöøa laø byte thaáp cuûa Address Bus thì ALE laø tín hieäu choát ñòa chæ vaøo moät thanh ghi beân ngoaøi trong nöõa ñaàu chu kyø boä nhôù. Sau ñoù port 0 duøng ñeå xuaát hoaëc nhaäp döõ lieäu trong nöõa sau cuûa chu kyø boä nhôù.
EA (External Access),(chaân 31): Tín hieäu vaøo EA neáu ôû möùc cao thì thöïc hieän chöông trình töø ROM noäi. Neáu ôû möùc thaáp, chöông trình chæ ñöôïc thi haønh töø boä nhôù môû roäng.
– maø noù gaây ra treo taïm thôøi chöông trình trong khi ñieàu kieän ñoù ñöôïc phuïc vuï bôûi moät chöông trình khaùc. Chöông trình giaûi quyeát ngaét ñöôïc goïi laø chöong trình phuïc vuï ngaét (ISR: Interrupt Service Routine). Khi
Caû hai loaïi ñoäng cô böôùc nam chaâm vónh cöûu cuõng nhö ñoäng cô böôùc töø trôû thay ñoåi, khi ta cung caáp naêng löôïng cho moät cöïc, rotor (khoâng coù taûi) seõ töï giöõ vò trí coá ñònh cuûa noù (nhôø moment giöõ) vaø ñoäng cô chæ coù theå quay khi taùc
Vì ñoäng cô söû duïng trong luaän vaên laø loaïi nam chaâm vónh cöûu neân ôû ñaây chæ xin giôùi thieäu moät soá maïch ñieàu khieån daønh cho loaïi ñoäng cô naøy. a/ Sô ñoà ñieàu khieån cô baûn :
Hình: Maïch ñieàu khieån coù haïn doøngR1 trong hình giôùi haïn doøng qua cuoän daây. Cho giôùi haïn
cuûa doøng ñieän laø I vaø trôû cuûa cuoän daây motor laø R, theo ñònh luaät Ohm ta tính ñöôïc aùp cung caáp cöïc ñaïi laø I(RW+R1). Cho töø caûm cuûa cuoän daây motor laø LW, haèng soá thôøi gian cho
procedure TMainEditForm.OpenDXFfile1Click(Sender: TObject);begin OpenFileDialog.Filter:='DXF file(*.dxf)|*.dxf'; If OpenFileDialog.Execute then Begin With TEditForm.Create(self) do Open(OpenFileDialog.FileName); End;end;
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù OpenFileDialog.Filter:='Text file(*.txt)|*.txt'; If OpenFileDialog.Execute then With TEditForm.Create(self) do begin Open(OpenFileDialog.FileName); TransferToCNC1.Enabled:=False; DrawingCNC1.Enabled:=True; Destination:=OpenFileDialog.FileName; end;end;
procedure TEditForm.ProcessSize;var str:string;begin readln(f,str); str:=no_blank(str); if str='10' then begin writeln(fout,'Size'); readln(f,str); str:=no_blank(str); writeln(fout,str); readln(f,str);
Procedure TEditForm.ProcessLine;var str:string; x1,y1,temp:real;begin readln(f,str); str:=no_blank(str); while str<>'10' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); x1:=StrToFloat(Str)-x0; readln(f,str); str:=no_blank(str); while str<>'20' do begin readln(f,str);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
70
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù str:=no_blank(str); end; readln(f,str); str:=no_blank(str); y1:=StrToFloat(Str)-y0; Process_G0(x1,y1); writeln(fout,'G1'); readln(f,str); str:=no_blank(str); while str<>'11' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); temp:=StrToFloat(Str)-x0; Current_X:=temp; Str:=FloatToStrF(temp,ffnumber,16,6); writeln(fout,str); readln(f,str); str:=no_blank(str); while str<>'21' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); temp:=StrToFloat(Str)-y0; Current_Y:=temp; Str:=FloatToStrF(temp,ffnumber,16,6); writeln(fout,str);end;
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù str:=no_blank(str); while str<>'70' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); if pos('1',str)<>0 then closed_poly:=true; readln(f,str); str:=no_blank(str); while str<>'10' do begin readln(f,str); str:=no_blank(str); end; check:=true; while check do begin readln(f,str); str:=no_blank(str); xb:=StrToFloat(Str)-x0; if closed_poly then x1:=xb; readln(f,str); readln(f,str); str:=no_blank(str); yb:=StrToFloat(Str)-y0; if First_Point then begin Process_G0(xb,yb); First_Point:=False; end; if closed_poly then begin y1:=yb; closed_poly:=false; rem:=true; end else begin writeln(fout,'G1'); Str:=FloatToStrF(xb,ffNumber,16,6); writeln(fout,str); Str:=FloatToStrF(yb,ffNumber,16,6); writeln(fout,str);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
72
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Current_X:=xb; Current_Y:=xb; end; readln(f,str); str:=no_blank(str); if str<>'10' then check:=false; end; if rem then begin writeln(fout,'G1'); Str:=FloatToStrF(x1,ffNumber,16,6); writeln(fout,str); Str:=FloatToStrF(y1,ffNumber,16,6); writeln(fout,str); end;end;
procedure TEditForm.ProcessCircle;var str:string; circheck:boolean; x1,y1,bk,ang1,ang2,Start_x,Start_y,End_X,End_Y:real; temp:integer;begin readln(f,str); str:=no_blank(str); while str<>'10' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); x1:=StrToFloat(Str)-x0; readln(f,str); str:=no_blank(str); while str<>'20' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); y1:=StrToFloat(Str)-y0; readln(f,str);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
73
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù str:=no_blank(str); while str<>'40' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); bk:=StrToFloat(str); readln(f,str); if pos('100',str)<>0 then circheck:=false else circheck:=true; if circheck then begin Process_G0(x1-bk,y1); writeln(fout,'G2'); Write_Arc(x1,y1,bk,x1,y1+bk); writeln(fout,'G2'); Write_Arc(x1,y1,bk,x1+bk,y1); writeln(fout,'G2'); Write_Arc(x1,y1,bk,x1,y1-bk); writeln(fout,'G2'); Write_Arc(x1,y1,bk,x1-bk,y1); Current_X:=x1-bk; Current_Y:=y1; end else begin readln(f,str); str:=no_blank(str); while str<>'50' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); ang1:=StrToFloat(str); readln(f,str); str:=no_blank(str); while str<>'51' do begin readln(f,str); str:=no_blank(str); end;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
74
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù readln(f,str); str:=no_blank(str); ang2:=StrToFloat(str); If ang2<ang1 then ang2:=ang2+360; Start_X:=x1+bk*cos(ang1*pi/180); Start_Y:=y1+bk*sin(ang1*pi/180); End_X:=x1+bk*cos(ang2*pi/180); End_Y:=y1+bk*sin(ang2*pi/180); Process_G0(Start_X,Start_Y); temp:=((round(ang1) div 90)+1)*90; If temp>=ang2 then Begin writeln(fout,'G3'); Write_Arc(x1,y1,bk,End_X,End_Y); End Else Begin temp:=((round(ang1) div 90)+2)*90; If temp>=ang2 then Begin temp:=temp-90; End_X:=x1+bk*cos(temp*pi/180); End_Y:=y1+bk*sin(temp*pi/180); writeln(fout,'G3'); Write_Arc(x1,y1,bk,End_X,End_Y); End_X:=x1+bk*cos(ang2*pi/180); End_Y:=y1+bk*sin(ang2*pi/180); writeln(fout,'G3'); Write_Arc(x1,y1,bk,End_X,End_Y); End Else Begin temp:=((round(ang1) div 90)+3)*90; If temp>=ang2 then Begin temp:=temp-180; End_X:=x1+bk*cos(temp*pi/180); End_Y:=y1+bk*sin(temp*pi/180); writeln(fout,'G3'); Write_Arc(x1,y1,bk,End_X,End_Y); temp:=temp+90; End_X:=x1+bk*cos(temp*pi/180); End_Y:=y1+bk*sin(temp*pi/180); writeln(fout,'G3'); Write_Arc(x1,y1,bk,End_X,End_Y);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
75
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù End_X:=x1+bk*cos(ang2*pi/180); End_Y:=y1+bk*sin(ang2*pi/180); writeln(fout,'G3'); Write_Arc(x1,y1,bk,End_X,End_Y); End Else Begin temp:=((round(ang1) div 90)+4)*90; If temp>=ang2 then Begin temp:=temp-270; End_X:=x1+bk*cos(temp*pi/180); End_Y:=y1+bk*sin(temp*pi/180); writeln(fout,'G3'); Write_Arc(x1,y1,bk,End_X,End_Y); temp:=temp+90; End_X:=x1+bk*cos(temp*pi/180); End_Y:=y1+bk*sin(temp*pi/180); writeln(fout,'G3'); Write_Arc(x1,y1,bk,End_X,End_Y); temp:=temp+90; End_X:=x1+bk*cos(temp*pi/180); End_Y:=y1+bk*sin(temp*pi/180); writeln(fout,'G3'); Write_Arc(x1,y1,bk,End_X,End_Y); End_X:=x1+bk*cos(ang2*pi/180); End_Y:=y1+bk*sin(ang2*pi/180); writeln(fout,'G3'); Write_Arc(x1,y1,bk,End_X,End_Y); End; End; End; End; End;End;
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù knot:array[0..50]of real; control_point:array[0..50]of RPoint;begin readln(f,str); str:=no_blank(str); while str<>'72' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); numknots:=StrToInt(str); readln(f,str); str:=no_blank(str); while str<>'73' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); numpoints:=StrToInt(str); readln(f,str); str:=no_blank(str); while str<>'40' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); for i:=0 to numknots-1 do begin knot[i]:=StrToFloat(str); readln(f,str); readln(f,str); end; for i:=0 to numpoints-1 do begin control_point[i].x:=StrToFloat(str); readln(f,str); readln(f,str); control_point[i].y:=StrToFloat(str); readln(f,str);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
77
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù readln(f,str); readln(f,str); readln(f,str); end; Process_G0(control_point[0].x,control_point[0].y); writeln(fout,'Spline'); writeln(fout,'Num Knots'); writeln(fout,IntToStr(numknots)); writeln(fout,'Num Points'); writeln(fout,IntToStr(numpoints)); writeln(fout,'Knots'); for i:=0 to numknots-1 do writeln(fout,FloatToStr(knot[i])); writeln(fout,'Control points'); for i:=0 to numpoints-1 do begin writeln(fout,FloatToStr(control_point[i].x)); writeln(fout,FloatToStr(control_point[i].y)); end;end;
procedure TEditForm.TransfertoCNC1Click(Sender: TObject);var str:string;Begin if savedialog1.execute then begin destination:=savedialog1.filename; If Pos('.txt',Destination)=0 then Destination:=Destination+'.txt'; assignfile(f,pathname); reset(f); assignfile(fout,destination); rewrite(fout); Repeat readln(f,str); if str='AcDbPoint' then ProcessPoint; Until (Str='AcDbPoint') or (eof(f)); reset(f); while not eof(f) do begin readln(f,str); if str='$LIMMAX' then ProcessSize else if str='AcDbLine' then ProcessLine else if str='AcDbPolyline' then
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
78
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù begin readln(f,str); if pos('90',str)<>0 then ProcessPolyline; end else if str='AcDbCircle' then ProcessCircle else if str='AcDbSpline' then ProcessSpline; end; closefile(fout); closefile(f); With TEditForm.Create(Self) do Begin Open(Destination); TransferToCNC1.Enabled:=False; DrawingCNC1.Enabled:=True; End; TransferToCNC1.Enabled:=False; end;End;
begin Pre_Run_Draw; Drawing.Show; AssignFile(f1,Destination); Reset(f1); Readln(f1,str); If Drawing.Auto1.Checked then begin Drawing.Run.Enabled:=True; Drawing.Pause.Enabled:=True; Drawing.Stop.Enabled:=True; Drawing.Send.Enabled:=False; end Else if Drawing.Singlestep1.Checked then begin Drawing.Run.Enabled:=True; Drawing.Pause.Enabled:=True;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
79
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Drawing.Stop.Enabled:=True; Drawing.Send.Enabled:=False; end Else if Drawing.Command1.Checked then begin Drawing.Run.Enabled:=False; Drawing.Pause.Enabled:=False; Drawing.Stop.Enabled:=False; Drawing.Send.Enabled:=True; end; While Pos('Size',str)=0 do Readln(f1,str); If Str='Size' then Begin Readln(f1,Str); Page_Width:=StrToFloat(str); Readln(f1,Str); Page_Height:=StrToFloat(str); If (Page_Width/Drawing.Image1.Width)>(Page_Height/Drawing.Image1.Height) then Image_Scale:=Round(Page_Width/Drawing.Image1.Width)+1 Else Image_Scale:=Round(Page_Height/Drawing.Image1.Height)+1; End; Closefile(f1); With Drawing.Image1.Canvas do begin CopyMode:=cmWhiteness; Arect:=Rect(0,0,Drawing.Image1.width,Drawing.image1.Height); CopyRect(ARect,Drawing.Image1.Canvas,ARect); CopyMode:=cmSrcCopy; {pen.color:=ClBlack; with Drawing.image1 do canvas.Rectangle(C_P.x-round(table_width/2/Image_Scale),C_P.y-round(table_height/2/Image_Scale),C_P.x+round(table_Width/2/Image_Scale),C_P.y+round(table_height/2/Image_Scale));} pen.color:=ClBlue; moveto(0,C_P.y); lineto(Drawing.Image1.Width,C_P.y); moveto(C_P.x,0); lineto(C_P.x,Drawing.Image1.Height); moveto(C_P.x,C_P.y); end;end;
Procedure TEditForm.Pre_Run_Draw;Var f:TextFile; f1:TextFile; cx,cy,r,Str:string; cur_x,cur_y,new_x,new_y:real; i,numknots,numpoints:integer; count:integer; Data:array[0..100]of real; temp:Real;Begin AssignFile(f,Destination); Reset(f); AssignFile(f1,Send_File); Rewrite(f1); Cur_x:=0; Cur_y:=0; count:=0; While (not Eof(f)) do Begin Readln(f,str); If Str='G0' then Begin Writeln(f1,'G9'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G6'); temp:=(ord(' ')*256+ord('L'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord('i')*256+ord('n'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord('e')*256+ord(' '))/10; writeln(f1,FloatToStr(temp)); temp:=(ord('t')*256+ord('o'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord(':')*256+ord(' '))/10; writeln(f1,FloatToStr(temp)); writeln(f1,'G8'); for i:=1 to 5 do
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
81
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù writeln(f1,'0'); writeln(f1,'G10'); for i:=1 to 5 do writeln(f1,'0'); readln(f,str); new_x:=StrToFloat(str); readln(f,str); new_y:=StrToFloat(str); str:='X='+FloatToStrF(new_x,ffnumber,7,1)+' '+'Y='+FloatToStrF(new_y,ffnumber,7,1); while (length(str) MOD 10)<>0 do str:=str+' '; for i:=1 to length(str) do begin if (i MOD 10)=1 then writeln(f1,'G6'); if (i mod 2)=1 then temp:=ord(str[i]); if (i mod 2)=0 then begin temp:=temp*256+ord(str[i]); writeln(f1,FloatToStr(temp/10)); end; end;{for} writeln(f1,'G8'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G0'); writeln(f1,FloatToStr(cur_x)); writeln(f1,FloatToStr(cur_y)); writeln(f1,'0'); writeln(f1,FloatToStr(new_x)); writeln(f1,FloatToStr(new_y)); Cur_x:=new_x; Cur_y:=new_y; End Else if Str='G1' then Begin Writeln(f1,'G9'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G6'); temp:=(ord(' ')*256+ord('L'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord('i')*256+ord('n'))/10;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
82
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù writeln(f1,FloatToStr(temp)); temp:=(ord('e')*256+ord(' '))/10; writeln(f1,FloatToStr(temp)); temp:=(ord('t')*256+ord('o'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord(':')*256+ord(' '))/10; writeln(f1,FloatToStr(temp)); writeln(f1,'G8'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G10'); for i:=1 to 5 do writeln(f1,'0'); readln(f,str); new_x:=StrToFloat(str); readln(f,str); new_y:=StrToFloat(str); str:='X='+FloatToStrF(new_x,ffnumber,7,1)+' '+'Y='+FloatToStrF(new_y,ffnumber,7,1); while (length(str) MOD 10)<>0 do str:=str+' '; for i:=1 to length(str) do begin if (i MOD 10)=1 then writeln(f1,'G6'); if (i mod 2)=1 then temp:=ord(str[i]); if (i mod 2)=0 then begin temp:=temp*256+ord(str[i]); writeln(f1,FloatToStr(temp/10)); end; end;{for} writeln(f1,'G8'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G1'); writeln(f1,FloatToStr(cur_x)); writeln(f1,FloatToStr(cur_y)); writeln(f1,'0'); writeln(f1,FloatToStr(new_x)); writeln(f1,FloatToStr(new_y)); Cur_x:=new_x; Cur_y:=new_y; End
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
83
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Else if Str='G2' then Begin Writeln(f1,'G9'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G6'); temp:=(ord(' ')*256+ord('A'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord('r')*256+ord('c'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord(' ')*256+ord('t'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord('o')*256+ord(':'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord(' ')*256+ord(' '))/10; writeln(f1,FloatToStr(temp)); writeln(f1,'G8'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G10'); for i:=1 to 5 do writeln(f1,'0'); readln(f,str); cx:=str; readln(f,str); cy:=str; readln(f,str); r:=str; readln(f,str); new_x:=StrToFloat(str); readln(f,str); new_y:=StrToFloat(str); str:='X='+FloatToStrF(new_x,ffnumber,7,1)+' '+'Y='+FloatToStrF(new_y,ffnumber,7,1); while (length(str) MOD 10)<>0 do str:=str+' '; for i:=1 to length(str) do begin if (i MOD 10)=1 then writeln(f1,'G6'); if (i mod 2)=1 then temp:=ord(str[i]); if (i mod 2)=0 then begin temp:=temp*256+ord(str[i]);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
84
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù writeln(f1,FloatToStr(temp/10)); end; end;{for} writeln(f1,'G8'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G2'); writeln(f1,cx); writeln(f1,cy); writeln(f1,r); writeln(f1,FloatToStr(new_X)); writeln(f1,FloatToStr(new_y)); Cur_x:=new_x; Cur_y:=new_y; End Else if Str='G3' then Begin Writeln(f1,'G9'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G6'); temp:=(ord(' ')*256+ord('A'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord('r')*256+ord('c'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord(' ')*256+ord('t'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord('o')*256+ord(':'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord(' ')*256+ord(' '))/10; writeln(f1,FloatToStr(temp)); writeln(f1,'G8'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G10'); for i:=1 to 5 do writeln(f1,'0'); readln(f,str); cx:=str; readln(f,str); cy:=str; readln(f,str); r:=str; readln(f,str); new_x:=StrToFloat(str);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
85
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù readln(f,str); new_y:=StrToFloat(str); str:='X='+FloatToStrF(new_x,ffnumber,7,1)+' '+'Y='+FloatToStrF(new_y,ffnumber,7,1); while (length(str) MOD 10)<>0 do str:=str+' '; for i:=1 to length(str) do begin if (i MOD 10)=1 then writeln(f1,'G6'); if (i mod 2)=1 then temp:=ord(str[i]); if (i mod 2)=0 then begin temp:=temp*256+ord(str[i]); writeln(f1,FloatToStr(temp/10)); end; end;{for} writeln(f1,'G8'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G3'); writeln(f1,cx); writeln(f1,cy); writeln(f1,r); writeln(f1,FloatToStr(new_X)); writeln(f1,FloatToStr(new_y)); Cur_x:=new_x; Cur_y:=new_y; End Else if Str='Num Knots' then Begin readln(f,str); numknots:=StrToInt(str); End Else if Str='Num Points' then Begin readln(f,str); numpoints:=StrToInt(str); End Else if Str='Knots' then Begin Data[0]:=(Numknots*256+numpoints)/10; inc(count); For i:=0 to numknots-1 do
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
86
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù begin readln(f,str); data[i+1]:=Round(StrToFloat(str)*10)/10+0.1*i; inc(count); end; End Else if Str='Control points' then Begin Writeln(f1,'G9'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G6'); temp:=(ord('S')*256+ord('p'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord('l')*256+ord('i'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord('n')*256+ord('e'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord(' ')*256+ord('t'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord('o')*256+ord(':'))/10; writeln(f1,FloatToStr(temp)); writeln(f1,'G8'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G10'); for i:=1 to 5 do writeln(f1,'0'); For i:=0 to numpoints-1 do begin readln(f,str); Data[2*i+1+numknots]:=StrToFloat(str); inc(count); readln(f,str); Data[2*i+1+1+numknots]:=StrToFloat(str); inc(count); end; Cur_x:=Data[count-2]; Cur_y:=Data[count-1]; str:='X='+FloatToStrF(cur_x,ffnumber,7,1)+' '+'Y='+FloatToStrF(cur_y,ffnumber,7,1); while (length(str) MOD 10)<>0 do str:=str+' '; for i:=1 to length(str) do begin
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
87
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù if (i MOD 10)=1 then writeln(f1,'G6'); if (i mod 2)=1 then temp:=ord(str[i]); if (i mod 2)=0 then begin temp:=temp*256+ord(str[i]); writeln(f1,FloatToStr(temp/10)); end; end;{for} writeln(f1,'G8'); for i:=1 to 5 do writeln(f1,'0'); While (count MOD 5)<>0 do begin Data[count]:=0; Inc(Count); end; For i:=0 to count-1 do Begin if (i MOD 5)=0 then writeln(f1,'G6'); writeln(f1,FloatToStr(Data[i])); End; writeln(f1,'G7'); writeln(f1,'0'); writeln(f1,'0'); writeln(f1,'0'); writeln(f1,FloatToStr(Cur_x)); writeln(f1,FloatToStr(Cur_y)); End; Application.ProcessMessages; End; {while} CloseFile(f); CloseFile(f1);End;end.
Function N(k,m,t:integer):integer;var denom1,denom2,sum:integer;begin if m=1 then if (t<knot[k])or(t>knot[k+1]) then N:=0 else N:=Denom else begin denom1:=knot[k+m-1]-knot[k]; if denom1<>0 then sum:=(t-knot[k])*N(k,m-1,t) div denom1 else sum:=0; denom2:=knot[k+m]-knot[k+1]; if denom2<>0 then sum:=sum+(knot[k+m]-t)*N(k+1,m-1,t)div denom2; N:=sum; end;{else}
procedure TDrawing.ConnectClick(Sender: TObject);begin If Connect_Flag=True then Begin Mscomm1.PortOpen:=False; Connect.Glyph.LoadFromFile('c:\my documents\luan van\Pc\Bmp\DriveDsc.Bmp'); Connect_Flag:=False; Connect.Hint:='Connect'; End Else Begin Connect.Glyph.LoadFromFile('c:\my documents\luan van\Pc\Bmp\DriveNet.Bmp'); Mscomm1.CommPort:=ComPort; Mscomm1.Settings:='9600,E,8,1'; Mscomm1.PortOpen:=true; Connect_Flag:=True; Connect.Hint:='Disconnect'; End;end;
begin x1:=p1.X div Image_Scale; y1:=p1.y div Image_Scale; x2:=p2.x div Image_Scale; y2:=p2.y div Image_Scale; a_s(x2,x1,deltax,b); a_s(y2,y1,deltay,c); if deltax>=deltay then begin d:=false; dinc2:=deltay-deltax; dinc1:=deltay; deltay:=-(deltax shr 1)+deltay; end else begin d:=true; dinc2:=deltax-deltay; dinc1:=deltax; deltax:=deltay; deltay:=-(deltay shr 1)+dinc1; end; while deltax>0 do begin
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
93
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù if not(Pause_Flag) then BEGIN if deltay<0 then begin deltay:=deltay+dinc1; if d then if c then down else up else if b then left else right; end else begin deltay:=deltay+dinc2; if b then if c then DownLeft else UpLeft else if c then DownRight else UpRight; end; dec(deltax); Sleep(Draw_Delay); END;{if pause_flag} Application.ProcessMessages; end;end;
procedure TDrawing.A_S(a,b:integer;var kq:integer;var s:boolean);begin if a>=b then begin kq:=a-b; s:=false; end else
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
94
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù begin kq:=b-a; s:=true; end;end;procedure TDrawing.up;begin with Image1.canvas do LineTo(penpos.x,penpos.y-1); {Application.ProcessMessages;}end;
procedure TDrawing.down;begin with Image1.canvas do LineTo(penpos.x,penpos.y+1); {Application.ProcessMessages;}end;
procedure TDrawing.Right;begin with Image1.canvas do LineTo(penpos.x+1,penpos.y); {Application.ProcessMessages;}end;
procedure TDrawing.Left;begin with Image1.canvas do LineTo(penpos.x-1,penpos.y); { Application.ProcessMessages;}end;
procedure TDrawing.UpRight;begin with Image1.canvas do Lineto(penpos.x+1,penpos.y-1); {Application.ProcessMessages;}end;
procedure TDrawing.UpLeft;begin with Image1.canvas do LineTo(penpos.x-1,penpos.y-1); {Application.ProcessMessages;}
procedure TDrawing.DownRight;begin with Image1.canvas do LineTo(penpos.x+1,penpos.y+1); {Application.ProcessMessages;}end;
procedure TDrawing.DownLeft;begin with Image1.canvas do LineTo(penpos.x-1,penpos.y+1); {Application.ProcessMessages;}end;
Procedure TDrawing.Arc(xc,yc,r,x2,y2,n:integer);var d1,d2,x,y:integer; comp:integer;Begin xc:=xc div Image_Scale; yc:=yc div Image_Scale; x2:=x2 div Image_Scale; y2:=y2 div Image_Scale; r:=r div Image_Scale; d1:=1-2*r; d2:=1-r; xc:=C_P.x+xc; yc:=C_P.y-yc; With image1.Canvas do BEGIN {with} case n of 1:begin x:=penpos.x-xc; y:=yc-penpos.y; comp:=x2; end; 2:begin x:=yc-penpos.y; y:=xc-penpos.x; comp:=y2; end; 3:begin x:=xc-penpos.x;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
96
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù y:=penpos.y-yc; comp:=-x2; end; 4:begin x:=penpos.y-yc; y:=penpos.x-xc; comp:=-y2; end; end; {case} while x>comp do begin if not(Pause_Flag) then BEGIN if d1<0 then begin if d2<0 then begin d1:=d1+2*y+2; d2:=d2+2*y+3; y:=y+1; Direction1(n); end else begin d1:=d1+2*(y-x)+5; d2:=d2+2*(y-x)+5; y:=y+1; x:=x-1; Direction2(n); end; end else begin d1:=d1-2*x+3; d2:=d2-2*x+2; x:=x-1; Direction3(n); end; Sleep(Draw_Delay); END;{if pause_flag} Application.ProcessMessages; end; END; {with}End;
Procedure TDrawing.Arc_QN(xc,yc,r,x2,y2,n:integer);var d1,d2,x,y:integer; comp:integer;Begin xc:=xc div Image_Scale; yc:=yc div Image_Scale; x2:=x2 div Image_Scale; y2:=y2 div Image_Scale; r:=r div Image_Scale; d1:=1-2*r; d2:=1-r; xc:=C_P.x+xc; yc:=C_P.y-yc; With image1.Canvas do BEGIN {with} case n of 1:begin x:=penpos.x-xc; y:=yc-penpos.y; comp:=y2; end; 2:begin x:=yc-penpos.y; y:=xc-penpos.x; comp:=-x2; end; 3:begin x:=xc-penpos.x; y:=penpos.y-yc; comp:=-y2; end; 4:begin x:=penpos.y-yc; y:=penpos.x-xc; comp:=x2;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
98
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù end; end; {case} convert(x,y); while x>comp do begin If not(Pause_Flag) then BEGIN if d1<0 then begin if d2<0 then begin d1:=d1+2*y+2; d2:=d2+2*y+3; y:=y+1; Direction1_QN(n); end else begin d1:=d1+2*(y-x)+5; d2:=d2+2*(y-x)+5; y:=y+1; x:=x-1; Direction2_QN(n); end; end else begin d1:=d1-2*x+3; d2:=d2-2*x+2; x:=x-1; Direction3_QN(n); end; Sleep(Draw_Delay); END;{if pause_flag} Application.ProcessMessages; end; END; {with}End;
Procedure TDrawing.Direction1(n:integer);Begin case n of 1:Up; 2:Left; 3:Down;
Procedure TDrawing.Direction2(n:integer);Begin case n of 1:UpLeft; 2:DownLeft; 3:DownRight; 4:UpRight; end;End;
Procedure TDrawing.Direction3(n:integer);Begin case n of 1:Left; 2:Down; 3:Right; 4:Up; end;End;
Procedure TDrawing.Direction1_QN(n:integer);Begin case n of 1:Right; 2:Up; 3:Left; 4:Down; end;End;
Procedure TDrawing.Direction2_QN(n:integer);Begin case n of 1:DownRight; 2:UpRight; 3:UpLeft; 4:DownLeft; end;End;
Procedure TDrawing.Direction3_QN(n:integer);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
100
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Begin case n of 1:Down; 2:Right; 3:Up; 4:Left; end;End;
procedure TDrawing.MSComm1Comm(Sender: TObject);Var InStr:string;begin If MSComm1.CommEvent=2 then Begin InStr:=MSComm1.Input; If Length(InStr)=0 then begin SetLength(InStr,1); InStr[1]:=Chr(0); end; if (ord(InStr[1])=$FF)and(Edit2.Text<>'4') then begin Send_Command; Notice.Caption:=Notice.Caption+'(Data error !)'; end else if (ord(InStr[1])=$0F)and(Edit2.Text<>'4') then begin Notice.caption:=('Line is empty !'); Transfer_Flag:=true; Send.Enabled:=true; If (command1.checked)or(Reset_Flag) then Update.Enabled:=true; end else if (ord(InStr[1])=$F0)and(Edit2.Text<>'4') then begin ShowMessage('Emergency stop from MicroController!'); Halt; end else if (ord(InStr[1])=$3F)and(Edit2.Text<>'4') then begin ShowMessage('Error! Go out of table!'); Halt; end else
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
101
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù begin Inc(Data_In_Counter); If (Data_In_Counter mod 2)=0 then begin xy:=xy*256+Ord(InStr[1]); If xy>32767 then xy:=xy-65536; if Data_In_Counter=2 then Edit8.Text:=(FloatToStr(xy/scale)) Else begin Edit9.Text:=(FloatToStr(xy/scale)); Data_In_Counter:=0; Notice.caption:=('Line is empty !'); Send.Enabled:=True; end; end else xy:=ord(InStr[1]); end; End;end;
procedure TDrawing.UpdateClick(Sender: TObject);begin If Drawing.Mscomm1.PortOpen=False then ShowMessage('Com Port is not opened !') Else begin Edit2.Text:='4'; Send_Command; end;end;
procedure TDrawing.FormClose(Sender: TObject; var Action: TCloseAction);begin If Mscomm1.PortOpen=true then begin Mscomm1.PortOpen:=False; Connect.Glyph.LoadFromFile('c:\my documents\luan van\Pc\Bmp\DriveDsc.Bmp'); Connect_Flag:=False; Connect.Hint:='Connect'; End; Run.Enabled:=true;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
102
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù if Reset_Flag=False then begin {Auto.Terminate;} showmessage('Chaøo taïm bieät - Heïn gaëp laïi'); halt; end;end;
procedure TDrawing.RunClick(Sender: TObject);begin If Mscomm1.PortOpen=False then ShowMessage('Com Port is not opened !') Else Begin Draw_Full; Edit1.ReadOnly:=True; Edit2.ReadOnly:=True; Edit3.ReadOnly:=True; Edit4.ReadOnly:=True; Edit5.ReadOnly:=True; Edit6.ReadOnly:=True; Edit7.ReadOnly:=True; Send.Enabled:=true; Reset_Flag:=false; Command1.Enabled:=False; If auto1.checked then begin AutoRun_Flag:=true; Update.enabled:=false; SingleStep1.Enabled:=False; end; If singleStep1.checked then auto1.Enabled:=False; {Auto:=TRun.Create(true); Auto.Resume;} Run_Draw; End;{else}end;
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù begin AutoRun_Flag:=true; Update.Enabled:=False; If (Command1.checked)and(Transfer_Flag) then Begin If Drawing.Mscomm1.PortOpen=False then ShowMessage('Com Port is not opened !') Else Begin Reset_Flag:=false; str:=Edit2.text; If Str='0' then Begin Edit5.Text:='0'; p1.x:=round(StrToFloat(Edit3.Text)); p1.y:=round(StrToFloat(Edit4.Text)); p2.x:=round(StrToFloat(Edit6.Text)); p2.y:=round(StrToFloat(Edit7.Text)); Transfer_Flag:=false; Send_Command; Image1.canvas.pen.color:=clgreen; DrawLine(p1,p2); Edit3.Text:=Edit6.Text; Edit4.Text:=Edit7.Text; End Else If Str='1' then Begin Edit5.Text:='0'; p1.x:=round(StrToFloat(Edit3.Text)); p1.y:=round(StrToFloat(Edit4.Text)); p2.x:=round(StrToFloat(Edit6.Text)); p2.y:=round(StrToFloat(Edit7.Text)); Transfer_Flag:=false; Send_Command; image1.canvas.pen.color:=clred; DrawLine(p1,p2); Edit3.Text:=Edit6.Text; Edit4.Text:=Edit7.Text; End Else if Str='2' then Begin p2.x:=round(StrToFloat(Edit6.Text)); p2.y:=round(StrToFloat(Edit7.Text)); r:=Round(StrToFloat(Edit5.Text)); pc.x:=Round(StrToFloat(Edit3.Text));
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
104
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù pc.y:=Round(StrToFloat(Edit4.Text)); p2.x:=p2.x-pc.x; p2.y:=p2.y-pc.y; if (p2.x>0)and(p2.y>=0) then m:=1 else if (p2.x<=0)and(p2.y>0) then m:=2 else if (p2.x<0)and(p2.y<=0) then m:=3 else if (p2.x>=0)and(p2.y<0) then m:=4; if Check_Error(StrToFloat(Edit3.Text),StrToFloat(Edit4.Text),StrToFloat(Edit5.Text) ,StrToFloat(Edit6.Text),StrToFloat(Edit7.Text)) then Begin Transfer_Flag:=false; image1.canvas.pen.color:=clred; Send_Command; Arc_QN(pc.x,pc.y,r,p2.x,p2.y,m); Edit3.Text:=Edit6.Text; Edit4.Text:=Edit7.Text; End Else ShowMessage('Data Error: End Point is not on circle!'); End Else If Str='3' then Begin p2.x:=round(StrToFloat(Edit6.Text)); p2.y:=round(StrToFloat(Edit7.Text)); r:=Round(StrToFloat(Edit5.Text)); pc.x:=Round(StrToFloat(Edit3.Text)); pc.y:=Round(StrToFloat(Edit4.Text)); p2.x:=p2.x-pc.x; p2.y:=p2.y-pc.y; if (p2.x>=0)and(p2.y>0) then m:=1 else if (p2.x<0)and(p2.y>=0) then m:=2 else if (p2.x<=0)and(p2.y<0) then m:=3 else if (p2.x>0)and(p2.y<=0) then m:=4;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
105
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù if Check_Error(StrToFloat(Edit3.Text),StrToFloat(Edit4.Text),StrToFloat(Edit5.Text) ,StrToFloat(Edit6.Text),StrToFloat(Edit7.Text)) then begin Transfer_Flag:=false; image1.canvas.pen.color:=clred; Send_Command; Arc(pc.x,pc.y,r,p2.x,p2.y,m); Edit3.Text:=Edit6.Text; Edit4.Text:=Edit7.Text; end else ShowMessage('Data Error: End Point is not on circle!'); End Else If Str='5' then Begin Edit4.Text:='0'; Edit5.Text:='0'; Transfer_Flag:=false; Send_Command; End Else If Str='6' then Begin Transfer_Flag:=false; Send_Command; End Else If Str='8' then Begin Edit3.Text:='0'; Edit4.Text:='0'; Edit5.Text:='0'; Transfer_Flag:=false; Send_Command; End; End;{Else} End;{if}end;
procedure TDrawing.PauseClick(Sender: TObject);begin {If auto.Suspended then begin Auto.Resume; pause.Flat:=false;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
106
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Stop.Enabled:=True; end Else begin Auto.Suspend; pause.Flat:=true; Stop.Enabled:=False; end;} If Pause_Flag then begin Pause_Flag:=False; pause.Flat:=false; Stop.Enabled:=True; end Else begin Pause_Flag:=true; pause.Flat:=true; Stop.Enabled:=False; end;end;
procedure TDrawing.StopClick(Sender: TObject);begin Close;end;Procedure Check_Out_Of_Table;Begin with bitmap.Canvas do begin if (penpos.X<(C_P.x-round(table_width/2/Image_Scale))) or (penpos.X>(C_P.x+round(table_Width/2/Image_Scale))) or (penpos.Y<(C_P.y-round(table_height/2/Image_Scale))) or (penpos.Y>(C_P.y+round(table_height/2/Image_Scale))) then Begin ShowMessage('Caûnh baùo: Hình veõ cuûa baïn ñaõ ra khoûi baøn veõ'); Check_Border:=false; End;{if} end;{with}End;procedure TDrawing.PreviewClick(Sender: TObject);var f:textfile; str:string;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
107
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù p1,p2,pc:point; m:byte; t,k,i,r:integer; Arect:TRect; Data:array[0..100]of real; temp:integer;begin If Preview.flat then begin Bitmap.Free; Preview.flat:=false; With Drawing.Image1.Canvas do begin CopyMode:=cmWhiteness; Arect:=Rect(0,0,Drawing.Image1.width,Drawing.image1.Height); CopyRect(ARect,Drawing.Image1.Canvas,ARect); CopyMode:=cmSrcCopy; pen.color:=ClBlue; moveto(0,C_P.y); lineto(Image1.Width,C_P.y); moveto(C_P.x,0); lineto(C_P.x,Image1.Height); moveto(C_P.x,C_P.y); Draw_Delay:=1200-DrawSpeed.Position; Run.Enabled:=true; connect.Enabled:=true; pause.Enabled:=true; stop.Enabled:=true; ResetMachine.Enabled:=true; end; end else Begin Check_Border:=true; Bitmap:=TBitmap.Create; Bitmap.Width:=image1.Width; bitmap.Height:=image1.Height; Preview.Flat:=true; Draw_Delay:=0; Run.Enabled:=False; connect.Enabled:=False; pause.Enabled:=False; stop.Enabled:=False; ResetMachine.Enabled:=False; AssignFile(f,Destination);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
108
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Reset(f); p1.x:=0; p1.y:=0; While (not Eof(f)) do Begin Readln(f,str); If Str='G0' then Begin Readln(f,str); p2.x:=round(StrToFloat(str)); Readln(f,str); p2.y:=round(StrToFloat(str)); Bitmap.canvas.pen.color:=clgreen; Bitmap.Canvas.MoveTo(p1.x div Image_Scale+C_P.x,C_P.y-(p1.y div Image_Scale)); Bitmap.Canvas.LineTo(p2.x div Image_Scale+C_P.x,C_P.y-(p2.y div Image_Scale)); if check_border then Check_Out_Of_Table; p1:=p2; End Else If Str='G1' then Begin Readln(f,str); p2.x:=round(StrToFloat(str)); Readln(f,str); p2.y:=round(StrToFloat(str)); Bitmap.canvas.pen.color:=clred; Bitmap.Canvas.MoveTo(p1.x div Image_Scale+C_P.x,C_P.y-(p1.y div Image_Scale)); Bitmap.Canvas.LineTo(p2.x div Image_Scale+C_P.x,C_P.y-(p2.y div Image_Scale)); If Check_Border then Check_Out_Of_Table; p1:=p2; End Else if (Str='G2') then Begin Readln(f,str); pc.x:=Round(StrToFloat(str)); Readln(f,str); pc.y:=Round(StrToFloat(str)); Readln(f,str); r:=Round(StrToFloat(str)); Readln(f,str);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
109
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù p2.x:=round(StrToFloat(Str)); Readln(f,str); p2.y:=round(StrToFloat(str)); Bitmap.canvas.pen.color:=clred; with Bitmap.canvas do begin Arc((pc.x-r) div Image_Scale+C_P.x,C_P.y-((pc.y-r) div Image_Scale) ,(pc.x+r) div Image_Scale+C_P.x,C_P.y-((pc.y+r) div Image_Scale) ,p2.x div Image_Scale+C_P.x,C_P.y-(p2.y div Image_Scale) ,p1.x div Image_Scale+C_P.x,C_P.y-(p1.y div Image_Scale)); MoveTo(p2.x div Image_Scale+C_P.x,C_P.y-(p2.y div Image_Scale)); end; If check_Border then Check_Out_Of_Table; p1:=p2; End Else If Str='G3' then Begin Readln(f,str); pc.x:=Round(StrToFloat(str)); Readln(f,str); pc.y:=Round(StrToFloat(str)); Readln(f,str); r:=Round(StrToFloat(str)); Readln(f,str); p2.x:=round(StrToFloat(Str)); Readln(f,str); p2.y:=round(StrToFloat(str)); Bitmap.canvas.pen.color:=clred; with Bitmap.canvas do begin Arc((pc.x-r) div Image_Scale+C_P.x,C_P.y-((pc.y-r) div Image_Scale) ,(pc.x+r) div Image_Scale+C_P.x,C_P.y-((pc.y+r) div Image_Scale) ,p1.x div Image_Scale+C_P.x,C_P.y-(p1.y div Image_Scale) ,p2.x div Image_Scale+C_P.x,C_P.y-(p2.y div Image_Scale)); MoveTo(p2.x div Image_Scale+C_P.x,C_P.y-(p2.y div Image_Scale)); end; If check_Border then Check_Out_Of_Table; p1:=p2; End
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
110
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Else if str='Num Knots' then Begin readln(f,str); numknots:=StrToInt(str); End{numknots} Else if str='Num Points' then Begin readln(f,str); numpoints:=StrToInt(str); End{numpoints} Else if str='Knots' then Begin for i:=0 to numknots-1 do begin readln(f,str); Knot[i]:=Round(StrToFloat(str)*10); end; End Else if str='Control points' then Begin for i:=0 to numpoints-1 do begin Readln(f,str); Control_Point[i].x:=Round(StrToFloat(str)*10); readln(f,str); Control_Point[i].y:=Round(StrToFloat(str)*10); end; Bitmap.canvas.pen.color:=clred; P1.x:=Control_Point[0].x div 10 div Image_Scale; P1.y:=Control_Point[0].y div 10 div Image_Scale; Bitmap.Canvas.LineTo(p1.x+C_P.x,C_P.y-p1.y); for i:=knot[0] to knot[numknots-1] do begin p2.x:=0; p2.y:=0; for k:=0 to numpoints-1 do begin temp:=N(k,4,i); p2.x:=p2.x+Control_Point[k].x*temp div denom; p2.y:=p2.y+Control_Point[k].y*temp div denom; end; p2.x:=p2.x div 10 div Image_Scale; p2.y:=p2.y div 10 div Image_Scale; with bitmap.Canvas do Begin
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
111
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù if p2.x>p1.x then begin lineto(penpos.X+1,penpos.y); inc(p1.x); end else if p2.x<p1.x then begin lineto(penpos.X-1,penpos.y); dec(p1.x); end; if p2.y>p1.y then begin lineto(penpos.X,penpos.y-1); inc(p1.y); end else if p2.y<p1.y then begin lineto(penpos.X,penpos.y+1); dec(p1.y); end; End;{With} end;{for} p1.x:=bitmap.canvas.penpos.x; p1.y:=bitmap.canvas.penpos.y; If check_Border then Check_Out_Of_Table; End; End; {while} Closefile(f); with image1.canvas do begin pen.color:=ClBlack; Rectangle(C_P.x-round(table_width/2/Image_Scale),C_P.y-round(table_height/2/Image_Scale),C_P.x+round(table_Width/2/Image_Scale),C_P.y+round(table_height/2/Image_Scale)); pen.color:=ClBlue; moveto(0,C_P.y); lineto(Drawing.Image1.Width,C_P.y); moveto(C_P.x,0); lineto(C_P.x,Drawing.Image1.Height); moveto(C_P.x,C_P.y); end; Image1.Canvas.CopyMode:=cmSrcAnd; Image1.Canvas.Draw(0,0,bitmap); end;
procedure TDrawing.ResetMachineClick(Sender: TObject);var ARect:TRect;begin If Mscomm1.PortOpen=False then ShowMessage('Com Port is not opened !') Else Begin Reset_Flag:=true; Edit2.Text:='0'; Edit3.Text:=Edit6.Text; Edit4.Text:=Edit7.Text; Edit5.Text:='0'; Edit6.Text:='0'; Edit7.Text:='0'; Transfer_Flag:=false; Send_Command; Update.Enabled:=false; With Image1.Canvas do begin CopyMode:=cmWhiteness; Arect:=Rect(0,0,Image1.width,image1.Height); CopyRect(ARect,Image1.Canvas,ARect); CopyMode:=cmSrcCopy; pen.color:=ClBlue; moveto(0,C_P.y); lineto(Image1.Width,C_P.y); moveto(C_P.x,0); lineto(C_P.x,Image1.Height); moveto(C_P.x,C_P.y); end; Auto1.Enabled:=True; SingleStep1.Enabled:=True; End;{else}end;
procedure TDrawing.FormCloseQuery(Sender: TObject; var CanClose: Boolean);begin if Reset_Flag=false then If MessageDlg('Do you want to reset machine?',mtConfirmation,[mbYes,mbNo],0)=mrYes then ResetMachineClick(sender);
procedure TDrawing.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);begin If Preview.Flat then with image1.Canvas do begin CopyMode:=cmMergePaint; Draw(Penpos.X-C_P.x,penpos.Y-C_P.y,Bitmap); CopyMode:=cmSrcAnd; Draw(X-C_P.x,-C_P.y+Y,Bitmap); Moveto(X,Y); end;end;Function TDrawing.check_error(I,J,R,X,Y:real):Boolean;var temp:real;Begin Check_Error:=True; temp:=Sqr(X-I)+Sqr(Y-J)-Sqr(R); temp:=sqrt(abs(temp)); If Round(temp)<>0 then Check_Error:=False;End;procedure TDrawing.Draw_full;var p1,p2,pc:Point; t,k,i,r:Integer; str:string; Bitmap:TBitmap; temp:integer; Data:array[0..255]of real;Begin Bitmap:=TBitmap.Create; Bitmap.Width:=image1.Width; bitmap.Height:=image1.Height; AssignFile(f,Destination); Reset(f);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
114
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù p1.x:=0; p1.y:=0; While (not Eof(f)) do Begin Readln(f,str); If Str='G0' then Begin Readln(f,str); p2.x:=round(StrToFloat(str)); Readln(f,str); p2.y:=round(StrToFloat(str)); Bitmap.canvas.pen.color:=clWhite; Bitmap.Canvas.MoveTo(p1.x div Image_Scale+C_P.x,C_P.y-(p1.y div Image_Scale)); Bitmap.Canvas.LineTo(p2.x div Image_Scale+C_P.x,C_P.y-(p2.y div Image_Scale)); p1:=p2; End Else If Str='G1' then Begin Readln(f,str); p2.x:=round(StrToFloat(str)); Readln(f,str); p2.y:=round(StrToFloat(str)); Bitmap.canvas.pen.color:=clLime; Bitmap.Canvas.MoveTo(p1.x div Image_Scale+C_P.x,C_P.y-(p1.y div Image_Scale)); Bitmap.Canvas.LineTo(p2.x div Image_Scale+C_P.x,C_P.y-(p2.y div Image_Scale)); p1:=p2; End Else if (Str='G2') then Begin Readln(f,str); pc.x:=Round(StrToFloat(str)); Readln(f,str); pc.y:=Round(StrToFloat(str)); Readln(f,str); r:=Round(StrToFloat(str)); Readln(f,str); p2.x:=round(StrToFloat(Str)); Readln(f,str); p2.y:=round(StrToFloat(str)); Bitmap.canvas.pen.color:=clLime; with Bitmap do
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
115
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Canvas.Arc((pc.x-r) div Image_Scale+C_P.x,C_P.y-((pc.y-r) div Image_Scale) ,(pc.x+r) div Image_Scale+C_P.x,C_P.y-((pc.y+r) div Image_Scale) ,p2.x div Image_Scale+C_P.x,C_P.y-(p2.y div Image_Scale) ,p1.x div Image_Scale+C_P.x,C_P.y-(p1.y div Image_Scale)); p1:=p2; End Else If Str='G3' then Begin Readln(f,str); pc.x:=Round(StrToFloat(str)); Readln(f,str); pc.y:=Round(StrToFloat(str)); Readln(f,str); r:=Round(StrToFloat(str)); Readln(f,str); p2.x:=round(StrToFloat(Str)); Readln(f,str); p2.y:=round(StrToFloat(str)); Bitmap.canvas.pen.color:=clLime; with Bitmap do Canvas.Arc((pc.x-r) div Image_Scale+C_P.x,C_P.y-((pc.y-r) div Image_Scale) ,(pc.x+r) div Image_Scale+C_P.x,C_P.y-((pc.y+r) div Image_Scale) ,p1.x div Image_Scale+C_P.x,C_P.y-(p1.y div Image_Scale) ,p2.x div Image_Scale+C_P.x,C_P.y-(p2.y div Image_Scale)); p1:=p2; End Else if str='Num Knots' then Begin readln(f,str); numknots:=StrToInt(str); End{numknots} Else if str='Num Points' then Begin readln(f,str); numpoints:=StrToInt(str); End{numpoints} Else if str='Knots' then Begin for i:=0 to numknots-1 do begin readln(f,str);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
116
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Knot[i]:=Round(StrToFloat(str)*10); end; End{knots} Else if str='Control points' then Begin for i:=0 to numpoints-1 do begin readln(f,str); Control_Point[i].x:=Round(StrToFloat(str)*10); readln(f,str); Control_Point[i].y:=Round(StrToFloat(str)*10); end; Bitmap.canvas.pen.color:=clLime; P1.x:=Control_Point[0].x div 10 div Image_Scale; P1.y:=Control_Point[0].y div 10 div Image_Scale; Bitmap.Canvas.LineTo(p1.x+C_P.x,C_P.y-p1.y); for i:=knot[0] to knot[numknots-1] do begin p2.x:=0; p2.y:=0; for k:=0 to numpoints-1 do begin temp:=N(k,4,i); p2.x:=p2.x+Control_Point[k].x*temp div denom; p2.y:=p2.y+Control_Point[k].y*temp div denom; end; p2.x:=p2.x div 10 div Image_Scale; p2.y:=p2.y div 10 div Image_Scale; with bitmap.Canvas do Begin if p2.x>p1.x then begin lineto(penpos.X+1,penpos.y); inc(p1.x); end else if p2.x<p1.x then begin lineto(penpos.X-1,penpos.y); dec(p1.x); end; if p2.y>p1.y then begin lineto(penpos.X,penpos.y-1); inc(p1.y); end
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
117
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù else if p2.y<p1.y then begin lineto(penpos.X,penpos.y+1); dec(p1.y); end; End;{With} end;{for i} p1:=p2; End; End; {while} Closefile(f); Image1.Canvas.CopyMode:=cmSrcAnd; Image1.Canvas.Draw(0,0,bitmap); Bitmap.Free;End;
Procedure TDrawing.Spline;var i,k,temp,x,y,old_x,old_y:integer;Begin old_x:=Control_Point[0].x div 10 div Image_Scale; old_y:=Control_Point[0].y div 10 div Image_Scale; i:=Knot[0]; while i<=knot[numknots-1] do begin if not(Pause_Flag) then BEGIN inc(i); x:=0; y:=0; for k:=0 to numpoints-1 do begin temp:=N(k,4,i); x:=x+Control_Point[k].x*temp div denom; y:=y+Control_Point[k].y*temp div denom; end; x:=x div 10 div Image_Scale; y:=y div 10 div Image_Scale; with image1.Canvas do begin if x>old_x then begin lineto(penpos.X+1,penpos.y); inc(old_x); end
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
118
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù else if x<old_x then begin lineto(penpos.X-1,penpos.y); dec(old_x); end; if y>old_y then begin lineto(penpos.X,penpos.y-1); inc(old_y); end else if y<old_y then begin lineto(penpos.X,penpos.y+1); dec(old_y); end; end;{with} Sleep(Draw_Delay div 5); END;{if pause_flag} Application.ProcessMessages; end;End;
Procedure TDrawing.Run_Draw;Var f:TextFile; Str:string; p1,p2,pc:Point; r:integer; m:byte; i,temp:integer;Begin Drawing.Run.Enabled:=false; AssignFile(f,Send_File); Reset(f); While (not Eof(f)) do Begin If (Transfer_Flag)and(AutoRun_Flag)and(not(Pause_Flag)) then Readln(f,str); If Str='G0' then Begin Edit2.Text:='0'; Readln(f,str); Edit3.Text:=str; Readln(f,str); Edit4.Text:=str;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
119
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Readln(f,str); Edit5.Text:=str; Readln(f,str); Edit6.Text:=str; Readln(f,str); Edit7.Text:=str; p1.x:=round(StrToFloat(Edit3.Text)); p1.y:=round(StrToFloat(Edit4.Text)); p2.x:=round(StrToFloat(Edit6.Text)); p2.y:=round(StrToFloat(Edit7.Text)); Transfer_Flag:=false; Drawing.Send_Command; image1.canvas.pen.color:=clgreen; DrawLine(p1,p2); if SingleStep1.Checked then begin AutoRun_Flag:=False; Update.Enabled:=True; end; End Else If Str='G1' then Begin Edit2.Text:='1'; readln(f,str); Edit3.Text:=str; readln(f,str); Edit4.Text:=str; readln(f,str); Edit5.Text:=str; readln(f,str); Edit6.Text:=str; readln(f,str); Edit7.Text:=str; p1.x:=round(StrToFloat(Edit3.Text)); p1.y:=round(StrToFloat(Edit4.Text)); p2.x:=round(StrToFloat(Edit6.Text)); p2.y:=round(StrToFloat(Edit7.Text)); Transfer_Flag:=false; Send_Command; image1.canvas.pen.color:=clred; DrawLine(p1,p2); if SingleStep1.Checked then begin AutoRun_Flag:=False; Update.Enabled:=True;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
120
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù end; End Else if Str='G2' then Begin Edit2.Text:='2'; Readln(f,str); Edit3.Text:=Str; Readln(f,str); Edit4.Text:=Str; Readln(f,str); Edit5.Text:=Str; Readln(f,str); Edit6.Text:=Str; Readln(f,str); Edit7.Text:=Str; p2.x:=round(StrToFloat(Edit6.Text)); p2.y:=round(StrToFloat(Edit7.Text)); r:=Round(StrToFloat(Edit5.Text)); pc.x:=Round(StrToFloat(Edit3.Text)); pc.y:=Round(StrToFloat(Edit4.Text)); p2.x:=p2.x-pc.x; p2.y:=p2.y-pc.y; if (p2.x>0)and(p2.y>=0) then m:=1 else if (p2.x<=0)and(p2.y>0) then m:=2 else if (p2.x<0)and(p2.y<=0) then m:=3 else if (p2.x>=0)and(p2.y<0) then m:=4; Transfer_Flag:=false; image1.canvas.pen.color:=clred; Send_Command; Arc_QN(pc.x,pc.y,r,p2.x,p2.y,m); if SingleStep1.Checked then begin AutoRun_Flag:=False; Update.Enabled:=True; end; End Else If Str='G3' then Begin Edit2.Text:='3'; Readln(f,str); Edit3.Text:=Str;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
121
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Readln(f,str); Edit4.Text:=Str; Readln(f,str); Edit5.Text:=Str; Readln(f,str); Edit6.Text:=Str; Readln(f,str); Edit7.Text:=Str; p2.x:=round(StrToFloat(Edit6.Text)); p2.y:=round(StrToFloat(Edit7.Text)); r:=Round(StrToFloat(Edit5.Text)); pc.x:=Round(StrToFloat(Edit3.Text)); pc.y:=Round(StrToFloat(Edit4.Text)); p2.x:=p2.x-pc.x; p2.y:=p2.y-pc.y; if (p2.x>=0)and(p2.y>0) then m:=1 else if (p2.x<0)and(p2.y>=0) then m:=2 else if (p2.x<=0)and(p2.y<0) then m:=3 else if (p2.x>0)and(p2.y<=0) then m:=4; Transfer_Flag:=false; image1.canvas.pen.color:=clred; Send_Command; Arc(pc.x,pc.y,r,p2.x,p2.y,m); if SingleStep1.Checked then begin AutoRun_Flag:=False; Update.Enabled:=True; end; End Else if str='G6' then Begin Edit2.Text:='6'; Readln(f,str); Edit3.Text:=Str; Readln(f,str); Edit4.Text:=Str; Readln(f,str); Edit5.Text:=Str; Readln(f,str); Edit6.Text:=Str; Readln(f,str);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
122
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Edit7.Text:=Str; Transfer_Flag:=false; Send_Command; if SingleStep1.Checked then begin AutoRun_Flag:=False; Update.Enabled:=True; end; End{G6} Else if str='G7' then Begin Edit2.Text:='7'; Readln(f,str); Edit3.Text:=Str; Readln(f,str); Edit4.Text:=Str; Readln(f,str); Edit5.Text:=Str; Readln(f,str); Edit6.Text:=Str; Readln(f,str); Edit7.Text:=Str; Transfer_Flag:=false; Send_Command; image1.canvas.pen.color:=clred; Spline; if SingleStep1.Checked then begin AutoRun_Flag:=False; Update.Enabled:=True; end; End{G7} Else if str='G8' then Begin Edit2.Text:='8'; Readln(f,str); Edit3.Text:=Str; Readln(f,str); Edit4.Text:=Str; Readln(f,str); Edit5.Text:=Str; Readln(f,str); Edit6.Text:=Str; Readln(f,str); Edit7.Text:=Str;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
123
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Transfer_Flag:=false; Send_Command; if SingleStep1.Checked then begin AutoRun_Flag:=False; Update.Enabled:=True; end; End{G8} Else if str='G9' then Begin Edit2.Text:='9'; Readln(f,str); Edit3.Text:=Str; Readln(f,str); Edit4.Text:=Str; Readln(f,str); Edit5.Text:=Str; Readln(f,str); Edit6.Text:=Str; Readln(f,str); Edit7.Text:=Str; Transfer_Flag:=false; Send_Command; if SingleStep1.Checked then begin AutoRun_Flag:=False; Update.Enabled:=True; end; End{G9} Else if str='G10' then Begin Edit2.Text:='10'; Readln(f,str); Edit3.Text:=Str; Readln(f,str); Edit4.Text:=Str; Readln(f,str); Edit5.Text:=Str; Readln(f,str); Edit6.Text:=Str; Readln(f,str); Edit7.Text:=Str; Transfer_Flag:=false; Send_Command; if SingleStep1.Checked then
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
124
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù begin AutoRun_Flag:=False; Update.Enabled:=True; end; End;{G10} Application.ProcessMessages; End; {while} CloseFile(f); ShowMessage('End of file!'); Update.enabled:=True; Send.Enabled:=false; Command1.Enabled:=True;End;end.
unit AutoRun;procedure TRun.UpdateCaption; begin Form1.Caption := 'Updated in a thread'; end; }
{ TRun }
procedure TRun.Execute;const n=30;Var f:TextFile; Str:string; p1,p2,pc:Point; r:integer; m:byte; i,temp,NumKnots,NumPoints:integer;begin { Place thread code here } FreeOnTerminate:=true; Drawing.Run.Enabled:=false; AssignFile(f,Destination); Reset(f); While (not Eof(f)) do Begin If {(Transfer_Flag)and}(AutoRun_Flag) then Readln(f,str); If Str='G0' then Begin
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
125
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Drawing.Edit5.Text:='0'; Drawing.Edit2.Text:='0'; Drawing.Edit3.Text:=Drawing.Edit6.Text; Drawing.Edit4.Text:=Drawing.Edit7.Text; Readln(f,str); Drawing.Edit6.Text:=Str; Readln(f,str); Drawing.Edit7.Text:=Str; p1.x:=round(StrToFloat(Drawing.Edit3.Text)); p1.y:=round(StrToFloat(Drawing.Edit4.Text)); p2.x:=round(StrToFloat(Drawing.Edit6.Text)); p2.y:=round(StrToFloat(Drawing.Edit7.Text)); Transfer_Flag:=false; Drawing.Send_Command; Drawing.image1.canvas.pen.color:=clgreen; Drawing.DrawLine(p1,p2); {Drawing.Send.Enabled:=false;} if drawing.SingleStep1.Checked then begin AutoRun_Flag:=False; Drawing.Update.Enabled:=True; end; End Else If Str='G1' then Begin Drawing.Edit5.Text:='0'; Drawing.Edit2.Text:='1'; Drawing.Edit3.Text:=Drawing.Edit6.Text; Drawing.Edit4.Text:=Drawing.Edit7.Text; Readln(f,str); Drawing.Edit6.Text:=Str; Readln(f,str); Drawing.Edit7.Text:=Str; p1.x:=round(StrToFloat(Drawing.Edit3.Text)); p1.y:=round(StrToFloat(Drawing.Edit4.Text)); p2.x:=round(StrToFloat(Drawing.Edit6.Text)); p2.y:=round(StrToFloat(Drawing.Edit7.Text)); Transfer_Flag:=false; {Drawing.Send.Enabled:=false;} Drawing.Send_Command; Drawing.image1.canvas.pen.color:=clred; Drawing.DrawLine(p1,p2); if drawing.SingleStep1.Checked then begin AutoRun_Flag:=False;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
126
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Drawing.Update.Enabled:=True; end; End Else if Str='G2' then Begin Drawing.Edit2.Text:='2'; Readln(f,str); Drawing.Edit3.Text:=Str; Readln(f,str); Drawing.Edit4.Text:=Str; Readln(f,str); Drawing.Edit5.Text:=Str; Readln(f,str); Drawing.Edit6.Text:=Str; Readln(f,str); Drawing.Edit7.Text:=Str; p2.x:=round(StrToFloat(Drawing.Edit6.Text)); p2.y:=round(StrToFloat(Drawing.Edit7.Text)); r:=Round(StrToFloat(Drawing.Edit5.Text)); pc.x:=Round(StrToFloat(Drawing.Edit3.Text)); pc.y:=Round(StrToFloat(Drawing.Edit4.Text)); p2.x:=p2.x-pc.x; p2.y:=p2.y-pc.y; if (p2.x>0)and(p2.y>=0) then m:=1 else if (p2.x<=0)and(p2.y>0) then m:=2 else if (p2.x<0)and(p2.y<=0) then m:=3 else if (p2.x>=0)and(p2.y<0) then m:=4; Transfer_Flag:=false; {Drawing.Send.Enabled:=false;} Drawing.image1.canvas.pen.color:=clred; Drawing.Send_Command; Drawing.Arc_QN(pc.x,pc.y,r,p2.x,p2.y,m); if drawing.SingleStep1.Checked then begin AutoRun_Flag:=False; Drawing.Update.Enabled:=True; end; End Else If Str='G3' then Begin Drawing.Edit2.Text:='3';
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
127
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Readln(f,str); Drawing.Edit3.Text:=Str; Readln(f,str); Drawing.Edit4.Text:=Str; Readln(f,str); Drawing.Edit5.Text:=Str; Readln(f,str); Drawing.Edit6.Text:=Str; Readln(f,str); Drawing.Edit7.Text:=Str; p2.x:=round(StrToFloat(Drawing.Edit6.Text)); p2.y:=round(StrToFloat(Drawing.Edit7.Text)); r:=Round(StrToFloat(Drawing.Edit5.Text)); pc.x:=Round(StrToFloat(Drawing.Edit3.Text)); pc.y:=Round(StrToFloat(Drawing.Edit4.Text)); p2.x:=p2.x-pc.x; p2.y:=p2.y-pc.y; if (p2.x>=0)and(p2.y>0) then m:=1 else if (p2.x<0)and(p2.y>=0) then m:=2 else if (p2.x<=0)and(p2.y<0) then m:=3 else if (p2.x>0)and(p2.y<=0) then m:=4; Transfer_Flag:=false; {Drawing.Send.Enabled:=false;} Drawing.image1.canvas.pen.color:=clred; Drawing.Send_Command; Drawing.Arc(pc.x,pc.y,r,p2.x,p2.y,m); if drawing.SingleStep1.Checked then begin AutoRun_Flag:=False; Drawing.Update.Enabled:=True; end; End Else if str='G6' then Begin Drawing.Edit2.Text:='6'; Readln(f,str); Drawing.Edit3.Text:=Str; Readln(f,str); Drawing.Edit4.Text:=Str; Readln(f,str); Drawing.Edit5.Text:=Str;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
128
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Readln(f,str); Drawing.Edit6.Text:=Str; Readln(f,str); Drawing.Edit7.Text:=Str; Transfer_Flag:=false; Drawing.Send_Command; if drawing.SingleStep1.Checked then begin AutoRun_Flag:=False; Drawing.Update.Enabled:=True; end; End{G6} Else if str='End Spline' then Begin Drawing.Edit2.Text:='7'; Drawing.Edit3.Text:='0'; Drawing.Edit4.Text:='0'; Drawing.Edit5.Text:='0'; Drawing.Edit6.Text:='0'; Drawing.Edit7.Text:='0'; Transfer_Flag:=false; Drawing.Send_Command; Drawing.image1.canvas.pen.color:=clred; Drawing.Spline; if drawing.SingleStep1.Checked then begin AutoRun_Flag:=False; Drawing.Update.Enabled:=True; end; End; End; {while} CloseFile(f); ShowMessage('End of file!'); Drawing.Update.enabled:=True; Drawing.Send.Enabled:=false; Drawing.Command1.Enabled:=True;end;end.
MotorX_Bit bit P1.1MotorY_Bit bit P1.2B1 bit 10HC1 bit 11HD1 bit 12HKeyPressed bit 13HTimer_F1 bit 14H ;Côø baùo ñaõ chaïy ñöôïc 16 laàn TimeBase
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
131
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Timer_F2 bit 15HDraw_Flag bit 16HTransmit_Flag bit 17HMotor_Flag bit 18HLine_Draw bit 19HCircle_Rev_Draw bit 1AHCircle_For_Draw bit 1BHSpline_Draw bit 1CHGR_Flag bit 1DHEQ_Flag bit 1EHLE_Flag bit 1FHData_Out bit 20HX_Del bit 21HY_Del bit 22HLCD_Busy bit 23HRun bit 24HLCD_Display_Flag bit 25HF1 bit KeyOut.0 ;Nuùt thöù 1F2 bit KeyOut.1 ;Nuùt thöù 2F3 bit KeyOut.2 ;Nuùt thöù 3F4 bit KeyOut.3 ;Nuùt thöù 4KeyIn bit P1.7Start bit P2.4Press bit P2.5Led_EN bit P1.3Start_X bit P3.4End_X bit P3.5Start_Y bit P3.2End_Y bit P3.3Pen_Lift bit P3.6RS bit P1.4RW bit P1.5E bit P1.6
PUSH X1HMOV R7,#0MOV R6,#0 ;zero out partial remainder
MOV TMP_0,#0 MOV TMP_1,#0
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
140
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù MOV TMP_2,#0 MOV TMP_3,#0 MOV R4,BKH ;load divisor MOV R3,BKL MOV R5,#32 ;loop count ;This begins the loop Div_loop: CALL Shift_D ;shift the dividend and return MSB in C MOV A,R6 ;shift carry into LSB of partial remainder RLC A MOV R6,A MOV A,R7 RLC A MOV R7,A ;now test to see if R7:R6 >= R4:R3 CLR C MOV A,R7 ;subtract R4 from R7 to see if R4 < R7 SUBB A,R4 ; A = R7 - R4, carry set if R7 < R4 JC Cant_sub ;at this point R7>R4 or R7=R4 JNZ Can_sub ;jump if R7>R4 ;if R7 = R4, test for R6>=R3 CLR C MOV A,R6 SUBB A,R3 ; A = R6 - R3, carry set if R6 < R3 JC Cant_sub Can_sub: ;subtract the divisor from the partial remainder CLR C MOV A,R6 SUBB A,R3 ; A = R6 - R3 MOV R6,A MOV A,R7 SUBB A,R4 ; A = R7 - R4 - Borrow MOV R7,A SETB C ; shift a 1 into the quotient JMP Quot Cant_sub: ;shift a 0 into the quotient CLR C Quot: ;shift the carry bit into the quotient CALL Shift_Q ; Test for competion DJNZ R5,Div_loop
POP X1HMOV A,X1HJNB ACC.7,End_DIV32_SubMOV Y1H,#0FFHMOV Y1L,#0FDH%ADD16 (TMP_1,TMP_0,Y1H,Y1L,TMP_1,TMP_0)
End_DIV32_Sub:RET
;===========================================;Shift_D;===========================================Shift_D: ;shift the dividend one bit to the left and return the MSB in C CLR C MOV A,Y1L RLC A MOV Y1L,A MOV A,Y1H RLC A MOV Y1H,A MOV A,X1L RLC A MOV X1L,A MOV A,X1H RLC A MOV X1H,AEnd_Shift_D: RET;===========================================;Shift_Q;===========================================Shift_Q: ;shift the quotent one bit to the left and shift the C into LSB MOV A,TMP_0 RLC A MOV TMP_0,A MOV A,TMP_1 RLC A MOV TMP_1,A MOV A,TMP_2 RLC A MOV TMP_2,A MOV A,TMP_3 RLC A MOV TMP_3,A
MOV A,R2 MUL AB MOV TMP_0,A ;low-order result MOV TMP_1,B ;high_order result ;Now generate the next higher order byte MOV B,R5 MOV A,R2 MUL AB ADD A,TMP_1 ;low-order result MOV TMP_1,A ; save MOV A,B ; get high-order result ADDC A,TMP_2 ; include carry from previous operation MOV TMP_2,A ; save JNC Mul32_loop1 INC TMP_3 ; propagate carry into TMP_3 Mul32_loop1: MOV B,R4 MOV A,R3 MUL AB ADD A,TMP_1 ;low-order result MOV TMP_1,A ; save MOV A,B ; get high-order result ADDC A,TMP_2 ; include carry from previous operation MOV TMP_2,A ; save JNC Mul32_loop2 INC TMP_3 ; propagate carry into TMP_3 Mul32_loop2: ; Now start working on the 3rd byte MOV B,R6 MOV A,R2 MUL AB ADD A,TMP_2 ;low-order result
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
143
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù MOV TMP_2,A ; save MOV A,B ; get high-order result ADDC A,TMP_3 ; include carry from previous operation MOV TMP_3,A ; save ; Now the other half MOV B,R5 MOV A,R3 MUL AB ADD A,TMP_2 ;low-order result MOV TMP_2,A ; save MOV A,B ; get high-order result ADDC A,TMP_3 ; include carry from previous operation MOV TMP_3,A ; save ; Now finish off the highest order byte MOV B,R7 MOV A,R2 MUL AB ADD A,TMP_3 ;low-order result MOV TMP_3,A ; save ; Forget about the high-order result, this is only 32 bit math! MOV B,R6 MOV A,R3 MUL AB ADD A,TMP_3 ;low-order result MOV TMP_3,A ; saveEnd_Mul32_Sub: