[Java] onlogisch probleem

Pagina: 1
Acties:

  • Machiel21
  • Registratie: September 2001
  • Laatst online: 08-02-2024
Hoihoi,

Ik zal eerst ff beginnen met mijn code.

Controle.java
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
public class Controle
{
    private Communicatie com1 = new Communicatie("COM1");
    
    public Controle()
    {           
        // Voert een scancommando uit.
        com1.Uitvoer("&P1");  
        
        try
        { 
            Thread.sleep(7000);
        }
        catch(Exception e)
        {}
                 
        // Stelt de begin- en eindsnelheid in van de motoren.
           com1.Uitvoer("XI200"); 
           com1.Uitvoer("XV5000");
           com1.Uitvoer("YI200");
           com1.Uitvoer("YV5000");
           com1.Uitvoer("ZI200");
           com1.Uitvoer("ZV5000");
           
           // Zet de beginpositie van de motoren op 0.
           com1.Uitvoer("XO0"); 
           com1.Uitvoer("YO0");
           com1.Uitvoer("ZO0");
    }

    public void BeweegZ(int iZ)
    {
        int aantalStappenZ = berekenStappen(iZ);
        
        com1.Uitvoer("Z-" + aantalStappenZ);
        com1.Uitvoer("ZE0");
        com1.Uitvoer("&W*");
        com1.Uitvoer("ZW100");
    }
        
    public int OptellenX(int X, int iX)
    {   
        int aantalStappenX = berekenStappen(iX);
        
        com1.Uitvoer("X-" + aantalStappenX / iX); // Beweeg 1cm per keer.
        com1.Uitvoer("XE0"); // Brengt de stroom weer tot 0.
        com1.Uitvoer("&W*"); // Wacht tot alle assen zijn gestopt
        com1.Uitvoer("XW100");
        
        X++;
        return X;
    }
    
    public int AftellenX(int X, int iX)
    {
        int aantalStappenX = berekenStappen(iX);    
        
        com1.Uitvoer("X+" + aantalStappenX/iX);
        com1.Uitvoer("XE0");
        com1.Uitvoer("&W*"); 
        com1.Uitvoer("XW100");
        
        X--;
        return X;
    }
    
    public int OptellenY(int Y, int iY)
    {
        int aantalStappenY = berekenStappen(iY);        
                
        com1.Uitvoer("Y-" + aantalStappenY / iY);
        com1.Uitvoer("YE0");
        com1.Uitvoer("&W*"); 
        com1.Uitvoer("YW100");

        Y++;
        return Y;
    }
    
    // Bereken hoeveel stappen een bepaalde lengte is.      
    private int berekenStappen(int lengte)
    {
        int stappen = lengte * 20100; // 1cm is 20100 stappen.
        return stappen;
    }
    
    public void Reset()
    {
      com1.Uitvoer("RESET");
    }
    
    public void Stoppen()
    {
        // Stop elke beweging/proces.
        com1.Uitvoer("ABORT"); 
    }
    
    public void Beginpunt()
    {
      // Brengt alle assen weer naar de beginpositie.
      com1.Uitvoer("XR0"); 
      com1.Uitvoer("YR0");
      com1.Uitvoer("ZR0");
      
      // Brengt de stroom van alle assen weer naar 0.
      com1.Uitvoer("XE0"); 
      com1.Uitvoer("YE0");
      com1.Uitvoer("ZE0");  
    }
}

XYZVlak.java
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
    Controle controle = new Controle();

    private void startXYZVlak()
    {       
        int X = 0;
        int Y = 0;
        int C = 0;
        
        // Maakt van de cijfer in een tekstvak een Integer.
        int iX = Integer.parseInt(txtCmX.getText());
        int iY = Integer.parseInt(txtCmY.getText());
        int iZ = Integer.parseInt(txtCmZ.getText());
        
        if (iZ != 0)
        {
            controle.BeweegZ(iZ);
        }
        
        for (int a = 1; a <= iY+1; a++)
        {   
            if (X == iX)
            {
                do
                {
                    X = controle.AftellenX(X, iX);
                }
                while (X != 0);
                C++;
            }
            else
            {
                do
                {
                    X = controle.OptellenX(X, iX);
                }
                while (X != iX);
                C++;
            }
            
            if (C == 1)
            {
                if (Y != iY)
                 {
                     Y = controle.OptellenY(Y, iY);;
                     C--;
                 }
            }    
        }
      controle.Beginpunt();
    }

De code in XYZVlak.java wordt aangeroepen zodra er op een knop wordt gedrukt. De gebruiker vult 3 waarden in (X, Y (Z is niet belangrijk nu))

Mijn probleem is nu als de gebruiker de volgende waarden invoert:

X = 1 of 2 of 3
Y = 1 of 2 of 3

dan gaat alles goed, behalve als de gebruiker waarden invoert hoger dan 3 of voor zowel X en Y de waarde 3 invoert.

De waarden zijn het aantal cm (wordt omgerekend naar het aantal stappen) dat een stappenmotor moet draaien.
De commando worden via de COMpoort verstuurt (Ja, alles is goed geinstalleerd, geconfigureerd). Ik gebruik j2sdk versie 1.3.1_03 en heb het geprobeerd op Windows 2000 en Windows 98 en allebei hetzeflde probleem.

Wie weet waar het aan kan liggen? Ik snap niet waarom waarden boven de 3 niet goed werken :? :?

  • sjroorda
  • Registratie: December 2001
  • Laatst online: 09:47
onlogisch probleem vraagt om een onlogische oplossing :+

Ik zou niet weten waar het aan ligt, het enige dat ik kan vinden met een beetje reden tot oplossing is de regel
code:
1
int stappen = lengte * 20100; // 1cm is 20100 stappen.

als lengte == 1, dan stappen = 20100
als lengte == 2, dan stappen = 40200
als lengte == 3, dan stappen = 60300
als lengte == 4, dan stappen = 80400

Tot en met lengte == 3 blijft alles onder de 16-bits integers, als je lengte groter wordt dan 3, past 'stappen' niet meer in een 16-bit getal.

Maar waarom ik deze oplossing onlogisch vind, is dat Java volgens mij met 32-bit integers werkt :?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Als ik eerlijk ben vind ik dit een zootje en het lijkt me een stuk handiger als je dit eens omschrijft tot normale code. Verder willen System.outs wel eens helpen.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Op woensdag 26 juni 2002 15:11 schreef sjroorda het volgende:
onlogisch probleem vraagt om een onlogische oplossing :+

Ik zou niet weten waar het aan ligt, het enige dat ik kan vinden met een beetje reden tot oplossing is de regel
code:
1
int stappen = lengte * 20100; // 1cm is 20100 stappen.

als lengte == 1, dan stappen = 20100
als lengte == 2, dan stappen = 40200
als lengte == 3, dan stappen = 60300
als lengte == 4, dan stappen = 80400

Tot en met lengte == 3 blijft alles onder de 16-bits integers, als je lengte groter wordt dan 3, past 'stappen' niet meer in een 16-bit getal.

Maar waarom ik deze oplossing onlogisch vind, is dat Java volgens mij met 32-bit integers werkt :?
Ja maar mischien werkt dat apparaat wel met 16-bit getallen en dan ligt de fout dus niet bij het programma.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Machiel21
  • Registratie: September 2001
  • Laatst online: 08-02-2024
Thx voor jullie snelle hulp,

Idd Java werkt met 32-bit integers, dus dat moet geen probleem zijn. de waarden long maken heeft ook geen zin :?

Als ik System.out.println gebruik krijg ik mooi de waarden te zien van X en Y op een goede manier maar de motoren draaien niet op een goede manier alleen als de waarden niet hoger komen dan 3.

Ik snap er de helemaal niets van :? :?

  • sjroorda
  • Registratie: December 2001
  • Laatst online: 09:47
wat rwb al zei: JAva werkt wel met 32-bit, maar wellicht jouw com-apparaat niet.

Is er geen mogelijkheid te testen met 'stappen = lengte * 2010'? Dus factor 10 kleiner? Als-ie er dan bij 30 mee stopt, weet je genoeg!

  • Machiel21
  • Registratie: September 2001
  • Laatst online: 08-02-2024
Op woensdag 26 juni 2002 15:26 schreef sjroorda het volgende:
wat rwb al zei: Java werkt wel met 32-bit, maar wellicht jouw com-apparaat niet.

Is er geen mogelijkheid te testen met 'stappen = lengte * 2010'? Dus factor 10 kleiner? Als-ie er dan bij 30 mee stopt, weet je genoeg!
Nee, das het probleem ook niet. Ik kan wel met een andere zelf geschreven programma en een bijgeleverde programma hogere waarden invullen dan 3 * 20100. Namelijk de Z-as heeft een totaal aantal stappen van 504.500 = 25 cm. En kan zonder problemen in 1x van 0 naar 25 cm.

Daar zit het probleem dus ook niet, maar waar dan wel :?

  • Machiel21
  • Registratie: September 2001
  • Laatst online: 08-02-2024
Bedankt voor jullie hulp allemaal.

Ik heb het probleem gevonden. (nou ik, iemand heeft mij geholpen).

Het apparaat die ik aanstuur heeft een buffer en wanneer men waarden invoerde hoger dan 3 dan kreeg die buffer dus een overflow aan data....

Nu wacht ik gewoon een tijdje, zodat die overflow niet meer voorkomt. |:(
Pagina: 1