首页 > 解决方案 > 无法使用 s7netplus c# 从 PLC 读取带有数组的结构

问题描述

我正在尝试使用s7netplus库从 Siemens S300 PLC读取此数据块

我的映射代码结构看起来像这样

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

我读取了除了两个数组之外的所有其他值,上面的命令没有问题,但是这两个数组总是结果为 null

我还尝试创建一个构造函数并在那里初始化所有字段,但仍然得到相同的结果。

甚至有可能,我怎样才能读取这两个数组?

标签: arrays.netstructplc

解决方案


我没有在 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;

推荐阅读