项目场景:
现在已经通过HslCommunication连接上了PLC,需要对DB1.DBD10的位置处进行数据写入。
问题描述
但是进行将12.2写入指定位置DB1.DBD10时,发现无法从博图中实时检测到数据的写入。
下面是我当时错误的数据写入方法:【主要是值varValue的转换处理问题】
WriteDataToPLC函数,这是自己封装的,调用这个函数时,给varValue传入的是“12.2”,即objcet varValue = "12,2"
;
public string WriteDataToPLC(string varAddress, object varValue,string type)
{
switch (type)
{
case "bool":
this.Plc.Write(varAddress, (bool)varValue);
break;
case "float":
this.Plc.Write(varAddress, (float)varValue);
break;
}
}
发现运行错误,去查看底层的Write()函数,发现它最终传的值是float类型,而我上面的(float)varValue
不也是强制转换为float类型嘛。
解决方案:
后来我想到,还有一种方式,就改成下面的方式,结果运行通了【如下代码}
public string WriteDataToPLC(string varAddress, object varValue,string type)
{
switch (type)
{
case "bool":
this.Plc.Write(varAddress, (bool)varValue);
break;
case "float":
this.Plc.Write(varAddress, float.Parse(varValue.ToString()));
break;
}
}
原因分析:
为什么我在C#编程中,Object varValue="12.2"的时候,(float)varValue就解析不了成float类型,而float.Parse(varValue.ToString()) 却可以呢
人工智能回答:
在C#中,当你使用(float)varValue进行类型转换时,实际上是将一个Object类型的变量强制转换为float类型。然而,由于Object类型的变量实际上存储的是一个字符串对象,而不是一个浮点数,所以这种转换会导致运行时错误。
而当你使用float.Parse(varValue.ToString())时,首先通过varValue.ToString()将Object类型的变量转换为字符串表示形式,然后使用float.Parse()方法将字符串解析为float类型的值。这种方法可以正确地解析字符串中的浮点数,因此不会引发异常。