尝试使用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);
我读取了除两个数组以外的所有其他值,而上述命令没有问题,但是两个数组始终为空
我还尝试创建一个构造函数并初始化那里的所有字段,但是仍然得到相同的结果。
有没有可能,如何读取两个数组?
答案 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;