S7NetPlus读取西门子S7-1500 PLC的Word/DWord十六进制值问题
解决S7NetPlus读取S7-1500 Word/DWord并输出十六进制的方法
核心思路
ReadBytes返回的是原始字节数组,不能直接转ASCII。需要先将字节数组转换为对应数值类型(Word对应UInt16,DWord对应UInt32),再格式化为十六进制字符串,同时注意西门子PLC的大端字节序(高位字节在前),需调整字节顺序适配.NET的小端处理逻辑。
代码实现示例
读取Word类型数据(2字节)
using S7.Net; var plc = new Plc(CpuType.S71500, "192.168.0.1", 0, 1); plc.Open(); // 读取数据块DB1、起始地址0的2字节(Word类型) byte[] wordBytes = plc.ReadBytes(DataType.DataBlock, 1, 0, 2); // 调整字节顺序(大端转小端,适配.NET数值转换) Array.Reverse(wordBytes); ushort wordValue = BitConverter.ToUInt16(wordBytes, 0); // 格式化为4位带前导零的十六进制字符串 string hexWord = wordValue.ToString("X4"); Console.WriteLine($"Word十六进制值: {hexWord}"); plc.Close();
读取DWord类型数据(4字节)
using S7.Net; var plc = new Plc(CpuType.S71500, "192.168.0.1", 0, 1); plc.Open(); // 读取数据块DB1、起始地址2的4字节(DWord类型) byte[] dwordBytes = plc.ReadBytes(DataType.DataBlock, 1, 2, 4); // 调整字节顺序(大端转小端) Array.Reverse(dwordBytes); uint dwordValue = BitConverter.ToUInt32(dwordBytes, 0); // 格式化为8位带前导零的十六进制字符串 string hexDword = dwordValue.ToString("X8"); Console.WriteLine($"DWord十六进制值: {hexDword}"); plc.Close();
关键说明
- 字节顺序调整:西门子S7系列PLC存储Word/DWord时采用大端字节序,而.NET的
BitConverter默认使用系统小端序,必须反转字节数组才能得到正确数值。 - 十六进制格式化:
ToString("X4")确保Word输出4位十六进制(不足补前导零),ToString("X8")确保DWord输出8位十六进制;若需要小写格式,替换为"x4"或"x8"即可。 - 直接字节转十六进制(无数值转换):如果不需要转换为数值类型,可直接遍历字节数组拼接原始存储顺序的十六进制字符串(无需反转):
string hexDirect = string.Join("", wordBytes.Select(b => b.ToString("X2"))); Console.WriteLine($"Word原始存储十六进制(大端): {hexDirect}");
内容的提问来源于stack exchange,提问作者Nordin
相关产品推荐
相关产品推荐

