在我的第一个C#项目中,我有一个类:
internal class DbVisuStart
{
// Start 6.0 -
// Start_Lines 6.0 -
[S7String(S7StringType.S7String, 40)]
public string Start_Lines_Lines0 { get; set; } = ""; // 6.0 -
[S7String(S7StringType.S7String, 40)]
public string Start_Lines_Lines1 { get; set; } = ""; // 48.0 -
[S7String(S7StringType.S7String, 40)]
public string Start_Lines_Lines2 { get; set; } = ""; // 90.0 -
[S7String(S7StringType.S7String, 40)]
public string Start_Lines_Lines3 { get; set; } = ""; // 132.0 -
[S7String(S7StringType.S7String, 40)]
public string Start_Lines_Lines4 { get; set; } = ""; // 174.0 -
[S7String(S7StringType.S7String, 40)]
public string Start_Lines_Lines5 { get; set; } = ""; // 216.0 -
[S7String(S7StringType.S7String, 40)]
public string Start_Lines_Lines6 { get; set; } = ""; // 258.0 -
}我正在使用S7.Net库,在第101行的class.cs文件中,我得到了一个异常,我不知道我的类有什么问题。
在VS2022中,输出数据是:
抛出的异常:"System.ArgumentException“在S7.Net.dll异常中抛出:"System.ArgumentException”在System.Windows.Forms.dll中,未处理的"System.ArgumentException“类型异常发生在System.Windows.Forms.dll中,请将S7StringAttribute添加到string属性中
我只对绳子有问题。请帮帮我。
编辑:这是来自class.cs文件S7.Net库的代码片段(Jason/s7netplus来自github):
case "String":
numBytes = Math.Ceiling(numBytes);
if ((numBytes / 2 - Math.Floor(numBytes / 2.0)) > 0)
numBytes++;
S7StringAttribute? attribute = type.GetCustomAttributes<S7StringAttribute>().SingleOrDefault();
if (attribute == default(S7StringAttribute))
throw new ArgumentException("Please add S7StringAttribute to the string property"); //Line 101
numBytes += attribute.ReservedLengthInBytes;
break;System.Linq.Enumerable.SingleOrDefault (zwrócona)空S7.Net.Types.S7StringAttribute属性空S7.Net.Types.S7StringAttribute类型{Name = "String“FullName = "System.String"} System.Type {System.RuntimeType}
EDIT2:对不起,我用错了库的链接。现在它是正确的。
下面是我的程序中的调用路径:
DbVisuStart dbVst = new();
private void Timer1_Tick(object sender, EventArgs e)
{
timer1.Interval = 250;
lblDateTime.Text = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
ReadS7(this);//InvUpd(this.Controls);
}
private static void ReadS7(FrmMain frm)
{
//frm.plc.ReadClass(frm.dbVa, 1, 0); // this is without strings and is ok
frm.plc.ReadClass(frm.dbVst, 1, 6);
//frm.plc.ReadClass(frm.dbVAc,1, 718); // this is without strings and is ok
}发布于 2022-04-12 16:56:42
属性不支持S7StringAttribute,只能在字段中使用。我假设您的问题是属性的后台字段没有使用属性修饰(因为它们是自动生成的)。我看到的第二件事是,您使用了一个类,据我所知,您可以使用struct来表示数据。因此,您的课程应该重新考虑到这一点:
internal struct DbVisuStart
{
// Start 6.0 -
// Start_Lines 6.0 -
[S7String(S7StringType.S7String, 40)]
public string Start_Lines_Lines0; // 6.0 -
[S7String(S7StringType.S7String, 40)]
public string Start_Lines_Lines1; // 48.0 -
[S7String(S7StringType.S7String, 40)]
public string Start_Lines_Lines2; // 90.0 -
[S7String(S7StringType.S7String, 40)]
public string Start_Lines_Lines3; // 132.0 -
[S7String(S7StringType.S7String, 40)]
public string Start_Lines_Lines4; // 174.0 -
[S7String(S7StringType.S7String, 40)]
public string Start_Lines_Lines5; // 216.0 -
[S7String(S7StringType.S7String, 40)]
public string Start_Lines_Lines6; // 258.0 -
}我个人切换到付费产品来自treager的IP S7链接.NET SDK
https://stackoverflow.com/questions/71845097
复制相似问题