winform中读取西门子1200PLC中Real数据的问题

PLC中的Real类型数据,占用32个bit,采用IEEE754标准格式存储,类似于2进制的科学计数法,如下图所示,而Byte类型数据是以8位二进制补码形式存储。

IEEE754标准

经测试S7netplus通讯库中的Read()函数读取PLC中的Real数据时,括号内的参数采用简写形式时,即写成类似这种形式:object? values = plc.Read(“DB1.DBD4”);,其返回值是IEEE754格式的二进制数据,比如S7-1200中的DB1.DBD4中存储的是4.5,但是读取出来是1083179008。

Read返回值

IEEE754格式转换

当不采用简写形式,即:Read(S7.Net.DataType.DataBlock, 1, 4, S7.Net.VarType.Real, 1);时,返回的是正常的float数据4.5。使用简写Read(“DB1.DBB2”);可正常读取PLC中的Byte类型数据。

​ C#与PLC中的数据类型不一样,在PLC中Byte— 8位,Word/Int—16位,DWord—32位,但在C#中byte—8位,ushort—16位,int—32位。所以C#与PLC中的数据互相交换时,尤其在写操作时,需要经过以下转换:

PLC数据 -> C#数据
Byte -> byte
Word -> short/ushort — 或者使用int16/uint16
Dword -> int/uint — 或者使用int32/uint32
bit -> bool

1
2
3
4
5
6
7
8
9
10
11
//ComboBox中的字符串转换成枚举类型,注意必须是枚举里面的名称才能转换
S7.Net.CpuType cpuType = (S7.Net.CpuType)Enum.Parse(typeof(S7.Net.CpuType), comboBox1.Text);
string ip = textBox1.Text; //IP本来就是字符串
short rack = short.Parse(textBox2.Text); //把字符串转换成short,简单处理仅限输入数字。
short slot = short.Parse(textBox3.Text);
S7.Net.Plc plc = new S7.Net.Plc(cpuType,ip,rack,slot);
plc.Open();

//PLC中Real变量32位,储存格式IEEE745---C#中的int变量32位,存储格式二进制补码
float t = (float)plc.Read(S7.Net.DataType.DataBlock, 1, 4, S7.Net.VarType.Real, 1);
label6.Text = t.ToString();

连接到PLC


winform中读取西门子1200PLC中Real数据的问题
http://example.com/2025/08/26/winform中读取西门子1200PLC中Real数据的问题/
作者
admin
发布于
2025年8月26日
许可协议