无法使用s7netplus c#从PLC读取带有数组的结构

时间:2019-06-10 07:59:45

标签: arrays .net struct plc

尝试使用this库从Siemens S300 PLC读取s7netplus数据块

和我映射的代码结构如下

       [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 个答案:

答案 0 :(得分:1)

我没有在Siemens上使用C#,但是在Bechoff中,必须将数组编组为ByValArray

现在您说的VCM_Setpoint是2字节无符号整数,大小为16,这听起来很奇怪。请问以下工作(由16个值组成的ushort(WORD)数组,对吗?)

[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;

在IEC 61131-3环境中,将是以下情况

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

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