c#定义数组写入寄存器
时间: 2025-01-13 15:49:54 浏览: 24
C# 中定义数组并写入寄存器
为了实现将数据写入寄存器,在C#中通常会先创建一个字节数组用于存储要发送的数据。下面是一个简单的例子,展示如何定义一个数组并向PLC的寄存器写入这些数据:
using System;
using System.Net.Sockets;
public class Program {
public static void Main() {
// 定义要写入寄存器的数据
ushort[] writeData = new ushort[] { 1024, 2048 };
try {
using (TcpClient client = new TcpClient("plc_ip_address", 502)) {
NetworkStream stream = client.GetStream();
foreach (var item in writeData) {
byte[] registerValueBytes = BitConverter.GetBytes(item);
if(BitConverter.IsLittleEndian){
Array.Reverse(registerValueBytes); // Ensure big endian format for Modbus
}
// 假设这里有一个函数 WriteRegister 可以处理具体的Modbus协议细节,
// 并接受目标地址和值作为参数。
WriteRegister(stream, /* targetAddress */ 0x0A, registerValueBytes);
}
}
} catch (Exception ex) {
Console.WriteLine($"Error: {ex.Message}");
}
}
private static void WriteRegister(NetworkStream stream, byte address, byte[] value) {
// 构建请求报文,此处省略具体构建过程...
// 发送带有CRC校验码的消息至PLC
byte[] messageToSend = BuildWriteRequest(address, value);
stream.Write(messageToSend, 0, messageToSend.Length);
// 接收响应消息
byte[] responseBuffer = new byte[256];
int bytesRead = stream.Read(responseBuffer, 0, responseBuffer.Length);
// 验证服务器返回的结果...
}
private static byte[] BuildWriteRequest(byte address, byte[] value) {
// 创建包含功能码、地址以及待写入数值的实际请求帧体
List<byte> requestFrameBody = new List<byte>();
requestFrameBody.Add(/* functionCode */ 0x06); // Assuming single register write
requestFrameBody.AddRange(new []{address});
requestFrameBody.AddRange(value);
// 计算CRC-16校验码
byte[] crcResult = CRC16(requestFrameBody.ToArray());
requestFrameBody.AddRange(crcResult);
return requestFrameBody.ToArray();
}
}
上述代码片段展示了怎样利用BitConverter
类转换整数为字节序列,并考虑到Modbus RTU/TCP协议可能要求大端序(big-endian),因此当检测到当前架构采用小端序(little-endian)时会对字节数组做反转操作[^1]。
此外,还提供了两个辅助方法:一个是负责实际执行写入命令的方法WriteRegister()
;另一个是用来组装完整的Modbus请求包的方法BuildWriteRequest()
,其中包含了计算CRC16校验码的过程。
相关推荐


















