Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: C# und .NET ::  Probleme mit Daten auslesen  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
Gerri3d
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.02.2017
Beiträge: 18
Beitrag Gerri3d Mitglied 12:58:18 17.02.2017   Titel:   Probleme mit Daten auslesen            Zitieren

Hallo, ich bekomme daten nur aus der
"System.IO.MemoryMappedFiles"
wenn ich die einzelnen Zeilen mit Breakpoints setze.
Wenn das Programm nur durchläucht, ist die Konsole leer.

Es lieg tnicht daran, dass das Programm schon durchgelaufen wird, da ich eine ENdlos Whileschleife verwende.

DIe MemoryMapped Methode, die ich geschrieben habe befindet sich in einer eigenen Klasse der .sln (weiß nicht in iwie fern das eventuel helfen könnte)
lg
MFK
Mitglied

Benutzerprofil
Anmeldungsdatum: 02.11.2002
Beiträge: 5933
Beitrag MFK Mitglied 14:36:30 17.02.2017   Titel:              Zitieren

Vermutlich benutzt du MemoryMappedFile falsch.

Zeig ein Minimalbeispiel des Codes, das das Problem reproduziert.

_________________
"Funktioniert nicht" ist keine ausreichende Fehlerbeschreibung.
Gerri3d
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.02.2017
Beiträge: 18
Beitrag Gerri3d Mitglied 15:29:42 17.02.2017   Titel:              Zitieren

Klasse mit Memory mapped File (STRUCT auf variable port reduziert):

C#:
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
       unsafe public struct DataExchangeEmailInTmp
        {
            public Int16 port;
        }
       
        unsafe public DataExchangeIn Mem()
        {
            DataExchangeEmailInTmp dataExchangeReadTmp;
            DataExchangeIn dataExchangeRead;
 
            // init
            dataExchangeRead.eMailIn.port = 0;
 
            // get size
            int dataSIze = Marshal.SizeOf(typeof(DataExchangeEmailInTmp));
 
            // Open a mapped file with read access and one with write access.
            //  using (var mmfRead = MemoryMappedFile.CreateOrOpen("_CODESYS_SharedMemoryTest_Write", dataSIze))
            using (var mmfRead = MemoryMappedFile.CreateOrOpen("_CODESYS_SharedMemoryTest_Write", dataSIze))
            using (var accessorRead = mmfRead.CreateViewAccessor(0, dataSIze, MemoryMappedFileAccess.Read))
 
            // Read the structure
            accessorRead.Read(0, out dataExchangeReadTmp);
                       
            return dataExchangeRead; // STRUCT Mit STrings anstelle char[255]                  
        }
    }


AUFRUF:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
        static void Main(string[] args)
        {
           
            while (true)
            {
                Thread.Sleep(100);
 
                //Read Data from Shared Memory
                SharedMemoryRead ShareMemRd = new SharedMemoryRead();
                GVL.SmIn = ShareMemRd.Mem();
            }
        }


Die Daten passen soweit (jedenfalls wenn ich breakpoints setze)..
MFK
Mitglied

Benutzerprofil
Anmeldungsdatum: 02.11.2002
Beiträge: 5933
Beitrag MFK Mitglied 16:53:34 17.02.2017   Titel:              Zitieren

Und wer schreibt? Und wie synchronisierst du Lesen und Schreiben?

_________________
"Funktioniert nicht" ist keine ausreichende Fehlerbeschreibung.
Gerri3d
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.02.2017
Beiträge: 18
Beitrag Gerri3d Mitglied 17:48:11 17.02.2017   Titel:              Zitieren

Eine CodeSys SPS schreibt.

Im Test wurde einmal geschrieben mit der SPS. Dadurch ist synchronisierne ja nicht das Problem.

Wie gesagt, die Dtaen kann man sehen mit Breakpoints im Watch Fenster
MFK
Mitglied

Benutzerprofil
Anmeldungsdatum: 02.11.2002
Beiträge: 5933
Beitrag MFK Mitglied 18:40:05 17.02.2017   Titel:              Zitieren

Dann machst du wohl bei der Ausgabe etwas falsch.

_________________
"Funktioniert nicht" ist keine ausreichende Fehlerbeschreibung.
Gerri3d
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.02.2017
Beiträge: 18
Beitrag Gerri3d Mitglied 19:54:29 17.02.2017   Titel:              Zitieren

wie sollte man einen Int16 der Struktur auf der Konsole ausgeben?
C#:
 Console.WriteLine(GVL.SmIn.eMailIn.port);
MFK
Mitglied

Benutzerprofil
Anmeldungsdatum: 02.11.2002
Beiträge: 5933
Beitrag MFK Mitglied 21:56:07 17.02.2017   Titel:              Zitieren

Wenn die Konsole "leer" ist, wird dieser Code wohl nie ausgeführt.

Wenn man dir den Code nicht Zeile für Zeile aus der Nase ziehen müsste, wären wir wohl schon weiter...

_________________
"Funktioniert nicht" ist keine ausreichende Fehlerbeschreibung.
Gerri3d
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.02.2017
Beiträge: 18
Beitrag Gerri3d Mitglied 08:39:04 18.02.2017   Titel:              Zitieren

ja gut. Hier ist das Prog.:

VARAIBLENDEKLARATION:

C#:
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
using System;
using System.Collections.Generic;

using System.Linq;

using System.Runtime.InteropServices;
//NEU
using System.Text;
using System.Threading.Tasks;

 
namespace iViewExtension
{
       
    public struct DataExchangeEmailIn // => MELDUNG: Unsafe code may only appear if compilling with / unsafe
    {
        public byte stateIn;
        public Int32 port;
        public string server;
        public string absender;
        public string empfaenger;
        public string nachricht;
        public string betreff;
        public string user;
        public string passwort;
        public string iViewId;
        public byte controlIn;
    }
 
    public struct DataExchangeEmailOut
    {
        public  byte controlOut;  // von C# an PLC/ Bit 0 = True - neue Done;
    }
    public struct DataExchangeIn
    {
        public DataExchangeEmailIn eMailIn;
    }
    public struct DataExchangeOut
    {
        public DataExchangeEmailOut eMailOut;
    }
 
    public static class GVL
    {
        public static DataExchangeIn SmIn;
        public static DataExchangeOut SmOut;
        public static DataExchangeEmailIn eMailToIgm;
    }
}


________________________________________________________________________________
MAIN

C#:
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
using System;
using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Threading;

 
 
namespace iViewExtension
{
     class Program
    {
     
        static void Main(string[] args)
        {    
            while (true)
            {
                //Read Data from Shared Memory
                SharedMemoryRead ShareMemRd = new SharedMemoryRead();
                GVL.SmIn = ShareMemRd.Mem();
 
                // Write Data to Shared Memory              
                /*  SharedMemoryWrite ShareMemWr = new SharedMemoryWrite();
                  ShareMemWr.Mem(GVL.SmOut) */

                ;
 
                Console.WriteLine(GVL.SmIn.eMailIn.port);
 
                // sende eMail - costumer
                //   int state = eMail.sendMail(SmIn.eMailIn);              
            }
        }
    }
}

_____________________________________________________________________________
MAPPED FILE READ CLASS

C#:
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
using System;
using System.IO.MemoryMappedFiles;

using System.Runtime.InteropServices;

using System.Text;

using System.Threading;

 
 
namespace iViewExtension
{
    class SharedMemoryRead
    {
        unsafe public struct DataExchangeEmailInTmp
        {
            public Int16 port;
            public byte stateIn;
            public fixed byte server[256];
            public fixed byte absender[256];
            public fixed byte empfaenger[256];
            public fixed byte nachricht[256];
            public fixed byte betreff[256];
            public fixed byte user[256];
            public fixed byte passwort[256];
            public fixed byte iViewId[256];
            public byte controlIn;
        }
 
        unsafe public string getStrng(byte* fixedbyteArr)
        {
            byte[] TmpArrayB = new byte[256];
 
            for (int i = 0; i<256; i++)
            {
                TmpArrayB[i] = fixedbyteArr[i];
            }
            return Encoding.UTF8.GetString(TmpArrayB, 0, 255);
        }
 
        unsafe public DataExchangeIn Mem()
        {
            DataExchangeEmailInTmp dataExchangeReadTmp;
            DataExchangeIn dataExchangeRead;
 
            // init
            dataExchangeRead.eMailIn.absender = "";
            dataExchangeRead.eMailIn.betreff = "";
            dataExchangeRead.eMailIn.empfaenger = "";
            dataExchangeRead.eMailIn.iViewId = "";
            dataExchangeRead.eMailIn.nachricht = "";
            dataExchangeRead.eMailIn.passwort = "";
            dataExchangeRead.eMailIn.server = "";
            dataExchangeRead.eMailIn.user = "";
            dataExchangeRead.eMailIn.port = 0;
            dataExchangeRead.eMailIn.stateIn = 0;
            dataExchangeRead.eMailIn.controlIn = 0;
 
            // get size
            int dataSIze = Marshal.SizeOf(typeof(DataExchangeEmailInTmp));
 
            // Open a mapped file with read access and one with write access.
            //  using (var mmfRead = MemoryMappedFile.CreateOrOpen("_CODESYS_SharedMemoryTest_Write", dataSIze))
            using (var mmfRead = MemoryMappedFile.CreateOrOpen("_CODESYS_SharedMemoryTest_Write", dataSIze))
            using (var accessorRead = mmfRead.CreateViewAccessor(0, dataSIze, MemoryMappedFileAccess.Read))
 
            // Read the structure
            accessorRead.Read(0, out dataExchangeReadTmp);
 
            dataExchangeRead.eMailIn.port = dataExchangeReadTmp.port;
            dataExchangeRead.eMailIn.controlIn = dataExchangeReadTmp.controlIn;
            dataExchangeRead.eMailIn.stateIn = dataExchangeReadTmp.stateIn;
 
            // convert STRUCT byte arrays to string
            dataExchangeRead.eMailIn.betreff = getStrng(dataExchangeReadTmp.betreff);
            dataExchangeRead.eMailIn.absender = getStrng(dataExchangeReadTmp.absender);
            dataExchangeRead.eMailIn.server = getStrng(dataExchangeReadTmp.server);
            dataExchangeRead.eMailIn.empfaenger = getStrng(dataExchangeReadTmp.empfaenger);
            dataExchangeRead.eMailIn.iViewId = getStrng(dataExchangeReadTmp.iViewId);
            dataExchangeRead.eMailIn.nachricht = getStrng(dataExchangeReadTmp.nachricht);
            dataExchangeRead.eMailIn.passwort = getStrng(dataExchangeReadTmp.passwort);
            dataExchangeRead.eMailIn.user = getStrng(dataExchangeReadTmp.user);
                       
 
            return dataExchangeRead; // STRUCT Mit STrings anstelle char[255]                  
        }
    }
}
Th69
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.03.2008
Beiträge: 4327
Beitrag Th69 Mitglied 09:55:00 18.02.2017   Titel:              Zitieren

Kann es sein, daß du die "using"-Anweisung nicht verstehst (deine Einrückung deutet jedenfalls darauf hin)?
So interpretiert es der Compiler:
C#:
using (var mmfRead = MemoryMappedFile.CreateOrOpen("_CODESYS_SharedMemoryTest_Write", dataSIze))
using (var accessorRead = mmfRead.CreateViewAccessor(0, dataSIze, MemoryMappedFileAccess.Read))
{
    // Read the structure
    accessorRead.Read(0, out dataExchangeReadTmp);
}

Danach wird die MemoryMappedFile-Instanz wieder disposed (denn das ist der Sinn von "using"-Anweisungen!
C++ Forum :: C# und .NET ::  Probleme mit Daten auslesen  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.