Shared Memory mit String in Struct



  • Hallo,

    ich will ein (oder je ein) struct in C# mit einigen Daten zu lesen und zu schreiben.

    EIn Prozes (SPS) hat definierte String Größen, somit weiß ich die Größe theoretisch.

    Wie kann ich nun auf der C# Seite eine fixe Größe definieren (Referenzenieren ist ja nicht erlaubt bzw geht nicht, da ja keine fixe Größe ermittelbar ist).



  • Ich nehme an du willst auf der C bzw. C++ Seite char Arrays in der struct haben...? Korrekt?

    Dann gibt es mehrere Möglichkeiten. Wenn du fixed verwenden kannst ("allow unsafe code" und so), dann kannst du fixed verwenden 😃
    Siehe z.B. http://stackoverflow.com/questions/19152441/create-fixed-size-string-in-a-struct-in-c

    Oder du kannst das MarshalAsAttribute verwenden.
    Beispielsweise (ungetestet)

    [StructLayout(LayoutKind.Sequential, Pack = 8, CharSet = CharSet.Ansi)]
    struct Foo
    {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
        public string Fixed20;
    
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
        public char[] Fixed20AsArray;
    }
    

    Die char -Array Variante ist umständlicher, dafür etwas flexibler. z.B. kannst du bei der String-Variante keinen 20 Zeichen langen String verwenden, da immer ein Null-Terminator angehängt wird. Ebenso wirst du u.U. Probleme mit Strings haben die ein Nullbyte enthalten.
    Und die Werte Pack sowie CharSet im StructLayoutAttribute musst du natürlich ggf. anpassen - weiss ja nicht was du brauchst.
    (Die SizeConst Werte musst du natürlich auch anpassen, aber das sollte hoffentlich klar sein.)



  • ich bekomm das mit dem unsafe nicht hin. irgendwo passen dann die Variablen bzw Übergeordneten STRUCT´s nicht zusammen:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace iViewExtension
    {
    
        public  struct DataExchangeEmailIn
        {
            internal byte stateIn;  // von PLC an C#/ Bit 0 = True neue Daten;
            internal Int32 port;
            internal char[] server;
            internal char[] absender;
            internal char[] empfaenger;
            internal char[] nachricht;
            internal char[] betreff;
            internal char[] user;
            internal char[] passwort;
            internal char[] iViewId;
            internal byte controlIn;
        }
        public struct DataExchangeEmailOut
        {
            internal byte controlOut;  // von C# an PLC/ Bit 0 = True - neue Done;
        }
        public struct DataExchangeIn
        {
            internal DataExchangeEmailIn eMailIn;
        }
        public struct DataExchangeOut
        {
            internal DataExchangeEmailOut eMailOut;
        }
    
        public static class GVL
        {
            public static DataExchangeIn SmIn;
            public static DataExchangeOut SmOut;
            public static DataExchangeEmailIn eMailToIgm;
        }
    }
    


  • Aha.
    Und nu? Das ist ein bisschen zu wenig Information als dass dir jemand helfen könnte. Wie sieht die C (ohne 😵 API von der SPS aus? Da gibt's doch sicher irgendwelche Headerfiles.



  • naja, mir steltl sich noch die Frage wie ich einen fixed char[33] in einen string umwandeln kann.

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
       unsafe public struct DataExchangeEmailIn 
        {
            internal fixed char server[255];
        }
    


  • Google: C# char array to string
    Google: C# string to char array


Log in to reply