将西门子PLC(S7-1200)的真实数据类型转换为Visual C#Windows窗体



我正在尝试从西门子PLC(S7-1200(读取实际值,并将其显示在Windows窗体中。我正在使用S7.NET库与PLC通信,并使用TIA Portal V15对PLC进行编程/监控。

我可以从PLC读取Windows窗体中的特定数据块(DB3.DBD0(,它确实返回了一个值,但该值以其他格式显示。例如,如果我将DB3.DBD0中的值修改为"2.22",它会给出"1.074665+09"。我希望它返回与TIA门户中相同的值,即"2.22"。

下面是我用来转换值的代码。

object real0 = Convert.ToSingle(plc.Read("DB3.DBD0"));
label43.Text = real0.ToString();

如果我的问题不清楚,请告诉我,我可以试着更详细地解释。

提前谢谢!

PLC数据类型显示为REAL(浮点数("IEEE浮点数",根据http://www.plcdev.com/step_7_elementary_data_types

这些数字用分数表示,因此2.2无法准确定义。非常详细的解释:为什么浮点数不准确?

简单的解释很好:https://floating-point-gui.de/basic

尝试转换为十进制数据类型,然后四舍五入以删除尾部0的

西门子和其他PLC系统将这些数字存储为WORD。

例如,2.22浮点值/实际值在PLC中存储为0x400E147B。中字节顺序。A=40,B=0E,C=14,D=7B。

但正如我所看到的,您正在从PLC读取正确的十六进制值,但将其转换为32位整数。

您可以从以下位置查看:https://www.scadacore.com/tools/programming-calculators/online-hex-converter/

您必须将其强制转换为uint并将其转换为double。

例如:var real0 = Convert.ToDouble((uint)plc.Read("DB3.DBD0"));或者这个:var real0 = ((uint)plc.Read("DB3.DBD0")).ConvertToDouble();

我希望这有帮助:(

关于更多的例子,你可以试试这个视频,它有点过时了,所以你可能需要做一些不同的小事:https://www.mesta-automation.com/siemens-s7-plc-c-s7-net-plc-driver/

最新更新