LibNoDave C# Wort/Doppelwort schreiben

Keb

Level-1
Beiträge
15
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Einen wunder schönen Nachmittag wünsche ich euch.

Ich beschäftige mich seit ein paar Tagen mit C# und LibNoDave. Beides ist noch Neuland für mich.
Durch viel lesen und suchen habe ich schon einiges geschafft (Bits/Bytes/Merker/E/A; lesen/schreiben).

Nun komme ich nicht mehr weiter.

Ich möchte nun ein Wort bzw ein Doppelwort eines DB's lesen und beschreiben. Das lesen funktioniert, nur mit dem schreiben hab ich keine Idee wie ich das machen könnte.

Hier den bisherigen Code:
Code:
    // WORT lesen    
private void btReadWord_Click(object sender, EventArgs e)
    {
        try
        {
            tbReadWord.Text = string.Empty;
            dc.readBytes(libnodave.daveDB, (int)nDBWord.Value, (int)nByteWord.Value, 2,null);
            int res = dc.getS16();   
            tbReadWord.Text = res.ToString();
        }
        catch (Exception ex)
        {
            MsgBox(ex);
        }
    }
    // WORT schreiben *IN ARBEIT*
    private void btWriteWord_Click(object sender, EventArgs e)
    {
        try
        {
            int res = dc.writeBytes(libnodave.daveOutputs, (int)nDBWord.Value, (int)nByteWord.Value, 2, new byte[] { (byte)nWriteWord.Value }); // Ist noch nicht angepasst!!
            if (res != 0)
                throw new Exception("unable to write");
        }
        catch (Exception ex)
        {
            MsgBox(ex);
        }
    }
Mir fällt nichts ein, wie ich die Funktion zum schreiben von Bytes abändern muss, um ein Wort schreiben zu können.

Ich hoffe ich habe mein Problem gut genug erläutert und freue mich auf jeglichen Hinweis der zum Ziel führt.

Danke schon jetzt für jede Hilfestellung. :D

PS: Falls ihr eine Dokumentation zu LibNoDave C# habt wäre das auch super ich konnte bisher noch keine entdecken.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich mach das so. Der String muß halt vorher in ein Array aufgedröselt werden.
Code:
//=============================================================================================================================
        // String / Char in SPS schreiben
        //=============================================================================================================================
        public int write_string(string[] input)
        {
            int _result = 0;
            int length = input.Length;
            byte[] bytes = new byte[length];
            int i = 0;
            for (i = 0; i <= length-1; i++)   //length-1
            {
                bytes[i] = Convert.ToByte(input[i]);
            }
            try
            {
                _result = dc.writeBytes(libnodave.daveDB, 3, 10, 10, bytes);//Array in SPS schreiben
            }
            catch
            {
                //Fehlermeldung 
            }
            return _result;
        }
 
Zuletzt bearbeitet:
@Jochen : Vielen Dank Jochen, das sieht auf den ersten Blick schon sehr umfangreich aus, da finde ich sicher etwas.

@Bapho : Das aufdröseln des Strings in ein Array hatte ich mir auch schon im Hinterkopf überlegt, doch nicht gewusst wie ich das in C# codieren könnte. Ich danke dir vielmals und werde mich gleich mal in die Programmierung stürzen. :D

Ich danke Euch herzlichst!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dank der Vorlage von Bapho für Strings, habe ich es geschafft, eine Dezimalzahl im Format WORD zu schreiben.

Hier der laufende Code:
Code:
private void btWriteWord_Click(object sender, EventArgs e)    
{
        Int16 myInt16 = Convert.ToInt16(nWriteWord.Value);      // Konvertieren der angegebenen Dezimalzahl
        byte[] byteArray = BitConverter.GetBytes(myInt16);        
        byte[] bytes = byteArray.Reverse().ToArray();           // drehen des Arrays, damit die Bytes in der Richtigen Reihenfolge in den DB geschrieben werden

        try
        {
            int res = dc.writeBytes(libnodave.daveDB, (int)nDBWord.Value, ((int)nByteWord.Value),2,bytes);
            if (res != 0)
                throw new Exception("unable to write");                                     
          }
        catch (Exception ex)
        {
            MsgBox(ex);
        }
    }

Danke nochmal für den Denkanstoß Bapho :)

Mit freundlichen Grüßen

Keb ;)
 
Hallo zusammen!
Ich habe noch eine Frage zum schreiben, die hier denke ich auch noch rein passt.

Ich möchte im Bereich der Merker(daveFlags) und Ausgänge(daveOutputs) außer Bits auch ein Byte,Wort,Doppelwort schreiben können.
Den folgenden Code verwende ich bei DB's:
Code:
int res = dc.writeBytes(libnodave.daveDB,DB, StartByte,AnzahlByte, bytes)
  if (res != 0)
                throw new Exception("unable to write");
Bei Merkern verwende ich diesen Code:
Code:
int res = dc.writeBytes(libnodave.daveFlags,0, StartByte,1, bytes)
  if (res != 0)
                throw new Exception("unable to write");
Bei Ausgängen verwende ich diesen Code:
Code:
int res = dc.writeBytes(libnodave.daveOutputs,0, StartByte,1, bytes)
  if (res != 0)
                throw new Exception("unable to write");
Obwohl der Code bis auf die hier geschriebene Stellen identisch ist, will er mir im Merker und Ausgang Bereich keine Bytes schreiben. Woran kann das liegen?
Kann man Bytes nur im DB schreiben?

Grüße Keb
 
will er mir im Merker und Ausgang Bereich keine Bytes schreiben.
Was heißt "will keine Bytes schreiben" - bekommst Du irgendeine Fehlermeldung oder siehst Du an der SPS nur nicht das von Dir erhoffte Ergebnis?
Kann es sein, daß das SPS-Programm "Deine" Merker und Ausgänge dauernd beschreibt?

In welche CPU willst Du eigentlich schreiben?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich habe wohl vergessen dazu zu schreiben, dass er die Zeile "throw new Exception("unable to write");" ausführt. Das bedeutet für mich, das in der Libnodave Funktion ein Fehler auftritt. Was für einer das ist kann ich ja leider nicht einsehen bzw ich wüsste nicht wo.
Ich habe nochmal nachgeschaut welche CPU ich benutze:
SIMATIC CPU 314C-2PN/CP
Auf der CPU ist kein Programmcode vorhanden, der die Merker/ Ausgänge beschreibt. Wenn ich die Merker/Ausgänge die ich mit dem Byte beschreiben möchte,
Bitweise beschreibe erhalte ich keinen Fehler.

Grüße
Keb

 
Die Fehlernummer wäre 10, die daveStrError funktion hab ich noch nicht gefunden suche aber gerade danach


EDIT:
Gesucht und gefunden. der Fehlertext lautet: "The desire item is not available in the PLC".
Dazu frage ich mich wie das sein kann, da ich ja die Bits des Bytes wo ich beschreiben möchte einzeln beschreiben kann. Dort müsste dann theoretisch der gleiche Fehler auftauchen bei einem der Bits. Das ist aber nicht der Fall.

Keb
 
Zuletzt bearbeitet:
Ich habe für das Start Byte noch einmal Werte angegeben: Den Wert 100, den Wert 0 und den Wert 1 getestet. Es ergab sich leider keinerlei Änderung der Fehlermeldung.

Keb

Edit: Ich glaub ich muss mir für die Merker selbst eine ByteSchreiben Funktion über ersetllen, die über einzelne Bits schreibt.
 
Zuletzt bearbeitet:
Kannst du mal den kompletten Code einer der nicht funktionierenden Methoden (inkl. Variablen-Deklarationen) hier einstellen ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier der Ganze Code der glaube ich relevant ist.
Code:
    private void btWriteAll_Click(object sender, EventArgs e)
    {
        // Variablen Initialisieren
        bool BitBool = false;
        bool ByteBool = false;
        bool StringBool = false;


        bool RealZahl = false;
        bool Fehler = false;


        int libBereich = 0;
        int libDatenBaustein = 0;
        int libByte = 0;
        int libBit = 0;
        int libAnzahlByte = 0;


        string tempStr = string.Empty;


        // in welchem Bereich soll gelesen werden, zuweisung der Bausteinnummer.
        switch (comboBox1.SelectedItem.ToString())
        {
            case "DatenBaustein":
                libBereich = libnodave.daveDB;
                libDatenBaustein = (int)nDBAll.Value;
                break;
            case "Merker":
                libBereich = libnodave.daveFlags;
                libDatenBaustein = 0;
                break;
            case "Eingang":
                libBereich = libnodave.daveInputs;
                libDatenBaustein = 0;
                break;
            case "Ausgang":
                libBereich = libnodave.daveOutputs;
                libDatenBaustein = 0;
                break;
        } // Switch-Case


        // Zuweiseung der Werte anhand des Ausgewählten Formats
        switch (comboBox2.SelectedItem.ToString())
        {
            case "Bit":
                BitBool = true;
                libBit = (int)nBitAll.Value;
                break;
            case "Byte":
              //  if (libBereich != libnodave.daveDB) { MessageBox.Show(this, "Diese Funktion ist fehlerbehaftet und steht daher noch nicht zur Verfügung!\nWir bitten um Verständnis."); break; } 
                libAnzahlByte = 1;
                ByteBool = true;
                break;
            case "Wort":
                if (libBereich != libnodave.daveDB) { MessageBox.Show(this, "Diese Funktion ist fehlerbehaftet und steht daher noch nicht zur Verfügung!\nWir bitten um Verständnis."); break; } 
                libAnzahlByte = 2;
                ByteBool = true;
                break;
            case "Doppelwort":
                if (libBereich != libnodave.daveDB) { MessageBox.Show(this, "Diese Funktion ist fehlerbehaftet und steht daher noch nicht zur Verfügung!\nWir bitten um Verständnis."); break; } 
                ByteBool = true;
                break;
            case "Real":
                if (libBereich != libnodave.daveDB) { MessageBox.Show(this, "Diese Funktion ist fehlerbehaftet und steht daher noch nicht zur Verfügung!\nWir bitten um Verständnis."); break; } 
                libAnzahlByte = 4;
                RealZahl = true;
                ByteBool = true;
                break;
            case "String":
                if (libBereich != libnodave.daveDB) { MessageBox.Show(this, "Diese Funktion ist fehlerbehaftet und steht daher noch nicht zur Verfügung!\nWir bitten um Verständnis."); break; } 
                StringBool = true;
                break;
        } // Switch-Case


        libByte = (int)nByteAll.Value;


        if (BitBool)
        {
            schreibeBits(nWriteAll.Text, libBereich, libDatenBaustein, libByte, libBit, ref Fehler);
        }


        if (ByteBool)
        {
            schreibeBytes(nWriteAll.Text, libBereich, libDatenBaustein, libByte, libAnzahlByte, RealZahl, ref Fehler);
        }
        if (StringBool)
        {
            schreibeString(tbWriteAll.Text, libBereich, libDatenBaustein, libByte, ref Fehler);
        }                    
    
    }// btnWriteAll_Click



    private void schreibeBytes(string ZuSchreibenderWert, int libBereich, int libDatenBaustein, int libByte,int libAnzahlByte, bool RealZahl, ref bool Fehler)
    {
        timer2.Enabled = false;


        byte[] byteArray;
        byte[] bytes = {};


        // Für Byte schreiben
        if (libAnzahlByte==1)
        {
            Int16 tempInt = Convert.ToInt16(ZuSchreibenderWert);
            bytes = BitConverter.GetBytes(tempInt);  
        }// if
       
        // Für Wort schreiben
         if (libAnzahlByte==2)
        {
            Int16 myInt16 = Convert.ToInt16(ZuSchreibenderWert);
            byteArray = BitConverter.GetBytes(myInt16);
            bytes = byteArray.Reverse().ToArray();        
        }// if
      
        // Für Doppelwort schreiben
        if (libAnzahlByte==4)
        {
            // für Real schreiben
            if (RealZahl)
            {
                // String prüfen und vorbereiten
                ZuSchreibenderWert = ZuSchreibenderWert.Replace('.', ',');
                // String in Float, Float in Byte[] umwandeln  
                float tempFloat;
                try
                {
                    tempFloat = float.Parse(ZuSchreibenderWert);


                }
                catch (Exception ex)
                {
                    MsgBox(ex);
                    Fehler = true;
                    timer2.Enabled = true;
                    return;
                }
                byteArray = BitConverter.GetBytes(tempFloat);
                byteArray = byteArray.Reverse().ToArray(); // Drehen des Arrays, da sonst die Bytes in umgedrehter Reihenfolge geschrieben werden  
            }// if
            else 
            {
                Int32 myInt32 = Convert.ToInt32(nWriteDWord.Value);
                byteArray = BitConverter.GetBytes(myInt32);
                bytes = byteArray.Reverse().ToArray();
            }// else


        }// if


      // Schreiben der Bytes            
        try
        {
            int res = dc.writeBytes(libnodave.daveDB, libDatenBaustein, libByte, libAnzahlByte, bytes);            
            if (res != 0)
                throw new Exception("unable to write");
            Fehler = false;
            timer2.Enabled = true;
            return;
        }
        catch (Exception ex)
        {
            Fehler = true;
            MsgBox(ex);
            timer2.Enabled = true;
            return;
        }// try_catch
    }// schreibeBytes

Ich habe gerade beim Code einfügen gesehen, dass ich an einer Stelle anstatt der Variable "libBereich" direkt libnodave.daveDB stehen hatte. Hab es geändert und getestet. Jetzt geht alles ...

Das ist mir jetzt wirklich richtig peinlich. :oops:
So etwas zu übersehen...*Kopf_trifft_Tischplatte*

Ich danke Euch wirklich wirklich sehr für eure Bemühungen.
Verzeiht mir.

Grüße
Keb
 
Zurück
Oben