You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 05:35:27