using System; using System.Net.Sockets; using System.Threading.Tasks; using UnityEngine; public class ModbusTcpClient { private TcpClient tcpClient; private string serverIp = "127.0.0.1"; private int serverPort = 12315; public ModbusTcpClient() { tcpClient = new TcpClient(); } public async Task ConnectToServer() { try { await tcpClient.ConnectAsync(serverIp, serverPort); Debug.Log("Connected to Modbus server."); await SendModbusRequest(); } catch (Exception ex) { Debug.Log("Error connecting to Modbus server: " + ex.Message); } } private async Task SendModbusRequest() { byte[] request = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, 0x00, 0x00, 0x00, 0x10 }; NetworkStream stream = tcpClient.GetStream(); if (stream.CanWrite) { await stream.WriteAsync(request, 0, request.Length); Debug.Log("Modbus request sent."); await ReadResponse(stream); } } private async Task ReadResponse(NetworkStream stream) { byte[] response = new byte[256]; int bytesRead = await stream.ReadAsync(response, 0, response.Length); Debug.Log("Received response from Modbus server."); if (bytesRead > 9) // 确保响应长度足够 { // 解析响应数据 int length = response[5]; // 获取数据长度 byte deviceId = response[6]; // 设备编号 byte functionCode = response[7]; // 功能码 Debug.Log($"Device ID: {deviceId}, Function Code: {functionCode}, Data Length: {length}"); // 从第9个字节开始,每两个字节解析一个数据 for (int i = 9; i < 9 + length; i += 2) { ushort dataValue = (ushort)(response[i] << 8 | response[i + 1]); switch ((i - 9) / 2) { case 0: // 钥匙开关数据 Debug.Log($"Key Switch Data: {dataValue}"); break; case 1: // 方向盘数据 Debug.Log($"Steering Wheel Data: {dataValue}"); break; case 2: // 方向盘上喇叭状态 Debug.Log($"Horn Status: {dataValue}"); break; case 3: // 刹车踏板数据 Debug.Log($"Brake Pedal Data: {dataValue}"); break; case 4: // 油门踏板数据 Debug.Log($"Throttle Pedal Data: {dataValue}"); break; case 5: // 离合踏板数据 Debug.Log($"Clutch Pedal Data: {dataValue}"); break; case 6: // 手刹数据 Debug.Log($"Handbrake Data: {dataValue}"); break; // 其他预留数据的解析 default: Debug.Log($"Reserved Data {i/2 - 4}: {dataValue}"); break; } } } else { Debug.Log("Invalid response length."); } } public void CloseConnection() { if (tcpClient != null) { if (tcpClient.Connected) { tcpClient.GetStream().Close(); tcpClient.Close(); Debug.Log("Connection to Modbus server closed."); } } } }