Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: Libnodave JAVA readBit

  1. #1
    Registriert seit
    07.08.2012
    Beiträge
    0
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo liebe Community!

    Ich habe gerade meine ersten Gehversuche mit LIBNODAVE in Java unternommen. Funktioniert bislang einwandfrei.
    Ich würde allerdings eine getBit oder readBit wo wirklich nur 1 Bit ausgelesen wird benötigen.
    Hat jemand von Euch schon sowas gemacht bzw. wäre bereit mir diese Funktion zur Verfügung zu stellen?

    Vielen Dank,

    LG

    Thomas
    Zitieren Zitieren Libnodave JAVA readBit  

  2. #2
    schirgitom ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    07.08.2012
    Beiträge
    0
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hi!

    Das Problem hat sich schon erübrigt, habe es zusammenbekommen.
    Jetzt hänge ich aber beim schreiben von einem einzigen Bit.
    Kann mir da jemand bitte helfen?

    Vielen Dank,

    LG

    Thomas

  3. #3
    Registriert seit
    17.03.2013
    Ort
    Tettnang
    Beiträge
    0
    Danke
    0
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Falls du noch Hilfe brauchst dann melde dich
    MFG
    Zitieren Zitieren Brauchst du die Hilfe noch ?  

  4. #4
    Registriert seit
    03.04.2008
    Beiträge
    6.205
    Danke
    237
    Erhielt 817 Danke für 691 Beiträge

    Standard

    Wenn der Kollge nach fast 9 Monaten keine Lösung gefunden hätte da ist eine späte Geburt.


    bike
    "Any fool can write code that a computer can understand.
    Good programmers write code that humans can understand."
    --Martin Fowler

  5. #5
    Registriert seit
    14.06.2013
    Beiträge
    0
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo. Brauche dringend Hilfe!

    Hat nun jemand ne Lösung gefunden? ich möchte auch unbedingt einzelne Bits anzeigen lassen und steuern!

    gerne auch private email.

    ist wirklich dringend. sitze an meiner Bachelorarbeit.

  6. #6
    Registriert seit
    17.03.2013
    Ort
    Tettnang
    Beiträge
    0
    Danke
    0
    Erhielt 2 Danke für 2 Beiträge

    Standard

    - 8 bit einlesen.
    - mittels Teilen und Modulo das gesuchte Bit herausfiltern oder per Bitshiften
    - vergleichen ob das Bit verändert werden muss oder nicht.
    - wenn es verändert werden muss, dann die 8 Bits mit dem veränderten Wert wieder zusammenbasteln.
    - 8 bits schreiben.
    siehe Grundlagen Binärrechnen.
    Lg

  7. #7
    Registriert seit
    14.06.2013
    Beiträge
    0
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    danke erst einmal für die schnelle Antwort ich hatte schon angst, dass hier keiner mehr reinguckt.

    ich muss das ganze mal ein bissl zurückschrauben. Habe jetzt erst seit 2 Monaten Java- bzw. Android-Programmierung-Erfahrungen. Ich versuch mich immer noch in libnodave reinzuarbeiten, sehe da aber noch nicht wirklich durch. Wie meinst du das denn mit den Bit einlesen? Ich finde wie gesagt nur readBytes() bzw. getByte(). soll ich das das byte, welches das Bit enthält mit getbyte() einlesen und dann immer durch 2 teilen und über den Rest (Modulo) die Bits iwie auslesen???

  8. #8
    Registriert seit
    14.06.2013
    Beiträge
    0
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich habe jetzt mal ein kleines java-Programm (nicht android-Programm) geschrieben, was einzelne Bits ausliest und auch einlesen kann. Die wichtigen Stellen habe ich schwarz markiert:

    Code:
    import java.io.IOException;import java.util.Scanner;
    
    
    public class readAndWriteBit {
    
    
        public static void main(String[] args) throws IOException
        {
    // TODO Auto-generated method stub
            byte b = (byte) 10010001;
            outputBits(b);
        }
    
    
        public static void outputBits(byte b) throws IOException
        {
            System.out.print("Output: ");
            for (int bit = 7; bit>=0; bit--)
            {
                int i = 0;
                boolean is = ((b >> bit) & 1 ) == 1;
                if (is == true)
                {
                    i = 1;
                    System.out.print(i);
                }
    else
                {
                    i = 0;
                    System.out.print(i);
                }
    
    
            }
            System.out.println("");
            System.out.print("Do you want to change certain Bits? y/n: ");
            queryContinue(b);
        }
    
    
        public static void queryContinue(byte b) throws IOException
        {
            Scanner inputQueryContinue = new Scanner(System.in);
            String queryAnswerContinue = inputQueryContinue.nextLine();
    
    
            if(queryAnswerContinue.equals("y"))
            {
                System.out.print("Which bit do you want to change? (0-7): ");
                queryBit(b);
            }
            else if(queryAnswerContinue.equals("n"))
            {
                System.out.println("Completed program !!!");
                System.exit(0);
            }
    else
            {
                System.out.print("___Please, just enter 'y' or 'n' !!!___: ");
                queryContinue(b);
            }
        }
    
    
    public static void queryBit(byte b)
        {
            int bitAnswer = 0;
            Scanner inputBit = new Scanner(System.in);
    
    
    try
            {
                bitAnswer = inputBit.nextInt();
                int bit = 7 - bitAnswer;
                System.out.print("True or false? (0/1): ");
                queryCondition(b, bit);
            }
            catch (Exception e)
            {
                System.out.print("ERROR:___Please, just enter the bit position of the 8-digit-byte !!! (0-7)___: ");
                queryBit(b);
            }
        }
    
    
        public static void queryCondition(byte b, int bit)
        {
            int conditionAnswer;
    
    
            Scanner inputCondition = new Scanner(System.in);
    try
            {
                conditionAnswer = inputCondition.nextInt();
                setBit(b, bit, conditionAnswer);
    
    
            }
            catch(Exception e)
            {
                System.out.print("ERROR:___Please, enter 0 for FALSE or 1 for TRUE !!! (0/1)___: ");
                queryCondition(b, bit);
            }
        }
    
    
        public static void setBit(byte b, int bit, int conditionAnswer) throws IOException
        {
            if( conditionAnswer == 1)
            {
                b = (byte)(b | (1 << bit));
                outputBits(b);
            }
            else if(conditionAnswer == 0)
            {
                b = (byte)(b & ~(1 << bit));
                outputBits(b);
            }
        }
    }
    
    Meine Frage ist jetzt nur wie kann ich das auf mein libnodave-Quellcode übertragen (TestISOTCP-Klasse?!) ? Wie oder wo wird das Byte denn übergeben? Wird das nicht irgendwo als Array übergeben? Wenn ich in meine Merker-Klasse schaue, sehe ich, dass das Byte MD0 als float deklariert wird !? Oder kann ich das dort einfach als byte deklarieren und dann mein Programm (s.o.) anwenden? oder muss ich schon eher das Byte abgreifen?

  9. #9
    Registriert seit
    17.03.2013
    Ort
    Tettnang
    Beiträge
    0
    Danke
    0
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Lieber Bastueh,
    zuerst macht es wirklich keinen Sinn, einzelne Bits hin- und herzuschieben.
    Wenn du mit einer Methode getBit() ein Bit anschauen willst, startest du eine TCP/IP Kommunikation von zweimal 1540 Bits also 3080 Bits wovon du mal eines brauchst und 2999 Bits Müll enthält.
    Je mehr Trash du durch die gegen schiebst, desto höher die Verzögerung deines System.
    Aus diesem Grund holt man sich so viel Daten auf einmal wie möglich und bastelt die Daten die man braucht in Java ins System ein.

    Nun, was muss ich tun, wenn ich ein einzelnes Bit auslösen möchte.

    Zuerst ließt du ein Byte ein.
    Ein Byte besteht aus 8 Bit also 256 Möglichkeiten.

    Von binäre 0 0 0 0 0 0 0 0 = dezimal 0
    von binäre 1 1 1 1 1 1 1 1 = dezimal 255.

    Ich nehmen jetzt die binäre Zahl 01010101 also dezimal = 85 als Beispiel.
    Die Bits haben die Zahlenwertigkeit von 128/64 /32/16 /8/4/2/1
    0 1 0 1 0 1 0 1
    64 + 16 + 4 + 1 = 85.

    Ich möchte jetzt prüfen ob das 5te bit eine 1 oder null ist.
    Zuerst setze ich alle Bits vor der 5ten Stelle auf Null.
    Das geht mit %32 also Modulo32 (Wertigkeit des gesuchten Bits).
    Damit wird aus der 85 eine 25.
    Nun dividierst du das Ergebnis durch die Wertigkeit der 5ten Stelle also 32.
    Dadurch das 32 eine Integer Zahl ist, wird das Ergebnis eine Integer also eine Ganzzahl sein,
    25/32 ergibt dann 0.

    Du kannst das auch mit deinem Bitshiften oder deinem logischen und Operator machen.
    Das 5te Bit ist somit eine „Null“.

    Also musst du nun lediglich eine Methode schreiben die ein Byte einließt und als zusätzlichen Übergabeparameter welches Bit ausgelesen werden muss. Als Rückgabeparameter kann du dann ein Boolean machen.

    Willst du nur ein Bit schreiben.
    Dann lese die 8 Bytes ein.
    Speichere den Zwischenstand der Bits in lokalen Variablen .
    Kontrolliere ob sich das Bit was du setzen willst sich geändert hat.
    Wenn ja dann bastle die 8 Bits wieder zusammen und rufe die Methode writeByte() auf.

    Die ganze Methode sollte dann am Ende ein achtzeiler werden.
    Welchen Bachelor machst du eigentlich ?
    Have Fun

  10. #10
    Registriert seit
    14.06.2013
    Beiträge
    0
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Danke erst einmal für die schnelle und ausführliche Antwort.

    Mit dem binären Zahlensystem und Rechnen und so kenn ich mich schon aus. Hatte 2 Semester Informatik und mache BAoE Elektro- und Informationstechnik. Dort habe ich aber halt nur die Grundlagen beigebracht bekommen. Java-Programmierung lerne ich jetzt für mich erst seit 2 Monaten da ich die Aufgabe für ne android-app bekommen habe. Ich würde gerne zum Überprüfen die 8 Bits eines Bytes auslesen und ein Bit setzen. Warum ich das machen will ist erst einmal egal.

    Das mit dem Modulo kenn ich nur vom Papier her…ich teile eine Zahl solange durch 2, bis ich über den Rest den Binärcode rausbekomme...kann mir aber das quellcode-mäßig nicht vorstellen ?! Kann ich das denn mit einer float- oder long-Variable machen? wie gesagt ich habe die libnodave-Quellcode-Sammlung in meine App integriert und würde sie auch gerne verstehen, aber selbst mit dem Debugger sehe ich nicht so richtig durch, was passiert. Auch ne Anleitung finde ich nicht wirklich. Für die C-libnodave-Sammlung scheint es dies zu geben ?! Und als Beispiel ist ein Merker MD1 als long und ein MD12 als float deklariert.

    Und wie sieht mein Programm aus? Ich lese doch ein deklariertes Byte ein, lasse mir nacheinander die Bits angeben (wahrscheinlich über dieses "Bitshiften") und setze in der letzten Methode ein vom Benutzer gewähltes Bit auf True oder False (wie der Nutzer es eben will). Ist das denn nicht in Ordnung?

    Also das Programm funktioniert auch…nur weiß ich nicht wie ich das in libnodave integrieren kann verstehst du was ich meine?
    Mal nen kurzen Auszug aus libnodave….


    Merker.class:
    Code:
    public class Merker
    {
        public static byte MB0;
        public static long MD1;
        public static float MD12;
    }
    aus der TestISOTCP.class:
    Code:
    ...
    System.out.println("Trying to read 16 bytes from FW0.\n");
                    dc.readBytes(Nodave.FLAGS, 0, 0, 16, null);// Read Flag
    
                    Merker.MB0 = (byte) dc.getBYTE();
    
                    for (int bit = 7; bit>=0; bit--)
                    {
                        int i = 0;
                        boolean is = ((Merker.MB0 >> bit) & 1 ) == 1;
                        if (is == true)
                        {
                            i = 1;
                            System.out.print(i);
                        }
                        else
                        {
                            i = 0;
                            System.out.print(i);
                        }
                    }
    
                    Merker.MD1 = dc.getU32();
                    Merker.MD12 = dc.getFloat();    
    
                    System.out.println("1 Byte" + Merker.MB0);
                    System.out.println("4 DWORDS " + Merker.MD1);
                    System.out.println("1 Float: " + Merker.MD12);
    
                    if (doWrite)// Here we write from PLC
                    {
                        System.out.println("Now we write back these data");
    
                        by = Nodave.bswap_8(Merker.MB0);
                        dc.writeBytes(Nodave.FLAGS,0, 0, 4, by);
                
                        by = Nodave.bswap_32(Merker.MD1 + 1);
                        dc.writeBytes(Nodave.FLAGS, 0, 1, 4, by);
    
                        by = Nodave.toPLCfloat(Merker.MD12 + 0.1);
                        dc.writeBytes(Nodave.FLAGS, 0, 12, 4, by);
    
                        dc.readBytes(Nodave.FLAGS, 0, 0, 16, null);
    
                        Merker.MB0 = (byte) dc.getBYTE();
                        Merker.MD1 = dc.getU32();
                        Merker.MD12 = dc.getFloat();
    
                        System.out.println("FD0: " + Merker.MB0);
                        System.out.println("FD1: " + Merker.MD1);
                        System.out.println("FD12: " + Merker.MD12);
    …
    ich hab lediglich MB0 und alles um MB0 zu Testzwecken hinzugefügt. Kann es aber leider jetzt nicht testen, da ich nur auf Arbeit meine Steuerung dazu habe.

Ähnliche Themen

  1. libnodave Java Performance
    Von asalmut im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 04.10.2015, 20:36
  2. libnodave java
    Von bresner1 im Forum Hochsprachen - OPC
    Antworten: 1
    Letzter Beitrag: 16.03.2015, 12:37
  3. Libnodave für Java
    Von Reto im Forum Hochsprachen - OPC
    Antworten: 0
    Letzter Beitrag: 17.01.2011, 13:11
  4. libnodave ReadBit/WriteBit mit Delphi
    Von jangbu im Forum Hochsprachen - OPC
    Antworten: 12
    Letzter Beitrag: 09.03.2008, 00:07
  5. libnodave java
    Von Reto im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 28.02.2007, 23:55

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •