Arrays 无法使用s7netplus c从PLC读取带有数组的结构#
我正在尝试使用库从西门子S300 PLC读取数据块 我的映射代码结构如下所示Arrays 无法使用s7netplus c从PLC读取带有数组的结构#,arrays,.net,struct,plc,Arrays,.net,Struct,Plc,我正在尝试使用库从西门子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
[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);
我读取了除两个数组之外的所有其他值,上面的命令没有问题,但是这两个数组的结果总是空的
我还尝试创建一个构造函数并初始化那里的所有字段,但仍然得到了相同的结果
有没有可能,我如何读取这两个阵列?我没有在西门子公司使用C,但在Bechoff公司,阵列必须按ByValArray
进行编组
现在你说的是VCM_设定点
是2字节无符号整数,大小为16,听起来很奇怪。下面的工作(16个值的ushort(WORD)数组,对吗?)
在IEC 61131-3环境中,应如下所示:
//C#
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public ushort[] VCM_Setpoint;
//PLC
VCM_Setpoint : ARRAY[0..15] OF WORD;
VCM_Setpoint
是一个单词数组(2个字节),正如您所看到的,我用上面的'UnmanagedType.I2'和UnmanagedType.H2'尝试了所有选项,结果仍然相同VCM_设定点
返回为null,而不是一个零数组,只是null。您尝试过BYVALARY吗?如果您这样做了但没有成功,您是否尝试将ArraySubType设置为UnmanagedType.I2或UnmanagedType.H2?PLC中该数组的大小是多少,16?我尝试了ByValArray
,使用和不使用UnmanagedType.I2
或UnmanagedType.H2
,但仍然返回null。是的,尺寸是16(你可以在图片中看到)哦,是的,我明白了,没有注意到图片。从源代码中,我可以看到struct中不支持该字符串。也许数组也不受支持,因为字符串的工作方式类似于字节数组。很抱歉,我帮不上忙。我查看了源代码的一部分,看起来您是对的,不支持数组。无论如何谢谢你的帮助
//C#
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public ushort[] VCM_Setpoint;
//PLC
VCM_Setpoint : ARRAY[0..15] OF WORD;