arrays - 无法使用 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
我还尝试创建一个构造函数并在那里初始化所有字段,但仍然得到相同的结果。
甚至有可能,我怎样才能读取这两个数组?
解决方案
我没有在 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;
推荐阅读
- javascript - 在普通的 VueJS 项目中使用 Typescript 函数
- sql - 将 SQL 中第一个字符之后的所有内容更新为小写?
- wkhtmltopdf - wkhtmltopdf 显示黑框而不是文本
- javascript - 解决无法集中读取未定义的属性“propertyName”
- sql - 在VB6中我们需要使用哪些adodb记录集选项来在短时间内从SQL中加载数据
- sql - 将记录链接到其他人
- c# - 如何用星号打印星号图案
- ios - 如何在点击的光线触摸而不是来自中心视图的光线处生成 Reality Composer 场景
- apache - 确定原因并修复 302 重定向
- word2vec - 为什么“[UNK]”这个词在 word2vec 词汇表中排在第一位?