Невозможно прочитать структуру с массивом (-ами) из ПЛК, используя s7netplus c # - PullRequest
0 голосов
/ 10 июня 2019

я пытаюсь прочитать этот блок данных из ПЛК Siemens S300 с использованием s7netplus libary

, и моя структура отображенного кода выглядит следующим образом

       [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
       public struct CIP_B
        {

           public bool Start_Req;
           public bool Start_Ack;
           public bool End_Req;
           public bool End_Ack;
           public bool Ended_OK;
           public bool Step_Interupted;
           public bool Value_Changed;
           public Byte CIP_OBJ;
           public Byte CIP_TYPE;
           [MarshalAs(UnmanagedType.U2, SizeConst = 16)]
           public ushort[] VCM_Setpoint;
           public Int16 Step_Num;
           public Int16 changedValue;
            [MarshalAs(UnmanagedType.U1, SizeConst = 10)]
           public Byte[] Spare;
}

Я использую эту команду для чтения структуры

  var res = (CIP_B)_plcClient.ReadStruct(typeof(CIP_B), 71, 0);

Я прочитал все остальные значения, кроме двух массивов, без проблем с вышеуказанной командой, но оба массива всегда приводят к нулю

Я также пытался создать конструктор и инициализировать там все поля, но все же получаю тот же результат.

Возможно ли вообще, как я могу прочитать два массива?

1 Ответ

1 голос
/ 10 июня 2019

Я не использовал C # с Siemens, но с Bechoff массив должен быть распределен как ByValArray.

Теперь вы говорите, что VCM_Setpoint - это 2-байтовое беззнаковое целое число размером 16, что звучит странно. Работает ли следующее (массив ushort (WORD) из 16 значений, я прав?)

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public ushort[] VCM_Setpoint;

//If you need to marshal the array subtype too, use the ArraySubtype
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.SET_TYPE_HERE, SizeConst = 16)]
public ushort[] VCM_Setpoint;

В среде МЭК 61131-3 это будет следующим

//C#
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public ushort[] VCM_Setpoint;

//PLC
VCM_Setpoint : ARRAY[0..15] OF WORD;
...