From cc327d36e9819f30246d6959ecd34b7b694a36a0 Mon Sep 17 00:00:00 2001 From: Z Date: Wed, 26 Jun 2024 15:54:35 +0800 Subject: [PATCH] add multi float write --- .../Gateway/Script/View/ViewModbusGateway.cs | 67 ++++++++++++++++++- .../Module/Extension/EGConvertExtension.cs | 24 +++++++ .../Module/ProtocolTools/EGModbus.cs | 8 ++- .../Module/ProtocolTools/EGTCPClient.cs | 1 - 4 files changed, 95 insertions(+), 5 deletions(-) diff --git a/Example/Gateway/Script/View/ViewModbusGateway.cs b/Example/Gateway/Script/View/ViewModbusGateway.cs index c43bc9b..820331d 100644 --- a/Example/Gateway/Script/View/ViewModbusGateway.cs +++ b/Example/Gateway/Script/View/ViewModbusGateway.cs @@ -26,6 +26,13 @@ namespace EGFramework.Examples.Gateway{ // GD.Print(BitConverter.GetBytes(fData.ToDoubleArray()[0]).ToStringByHex()); // byte[] fData = {0x42,0x0D,0x33,0x33}; // GD.Print(fData.ToFloatArrayBigEndian()[0]); + this.EGRegisterMessageEvent(e=>{ + if(e.ValueSet.ContainsKey("rotational_speed")){ + WriteHoldingRegisterTCP("192.168.1.170:8234","rotational_speed",e.ValueSet["rotational_speed"]); + GD.Print("Write success!"); + } + }); + this.EGOnMessage(); } // Called every frame. 'delta' is the elapsed time since the previous frame. @@ -139,10 +146,33 @@ namespace EGFramework.Examples.Gateway{ { { "type", "SpeedControlDeviceLogin" } }; - this.EGTCPClient().SendStringData("192.168.1.11",9966,loginData.ToString()); + // this.EGTCPClient().SendStringData("192.168.1.11",9966,loginData.ToString()); + this.EGTCPClient().SendStringData("192.168.1.170",5501,loginData.ToString()); await Task.Delay(50); - this.EGTCPClient().SendStringData("192.168.1.11",9966,resultJson); - + // this.EGTCPClient().SendStringData("192.168.1.11",9966,resultJson); + this.EGTCPClient().SendStringData("192.168.1.170",5501,resultJson); + } + + public async void WriteHoldingRegisterTCP(string ipPort,string registerKey,object value){ + DataModbusValue modbusValue = null; + foreach(KeyValuePair deviceTCP in Setting.DevicesTCP){ + if(Setting.DevicesTCP[deviceTCP.Key].ValueRegisters.ContainsKey(registerKey)){ + modbusValue = Setting.DevicesTCP[deviceTCP.Key].ValueRegisters[registerKey]; + } + } + if(modbusValue == null){ + return; + } + ModbusTCP_Response? result = await this.EGModbus().WriteOnceTCPAsync(modbusValue.RegisterType,ipPort,0x01,modbusValue.Address,value); + if(result != null){ + if(!((ModbusTCP_Response)result).IsError){ + GD.Print("Write"+((ModbusTCP_Response)result).FunctionType); + }else{ + GD.Print("Error:"+((ModbusTCP_Response)result).ErrorCode); + } + }else{ + GD.Print("Timeout!"); + } } public async void ReadTest(){ @@ -244,4 +274,35 @@ namespace EGFramework.Examples.Gateway{ this.data = data; } } + public struct TypeTCPSetRotateData:IResponse{ + public int code { set; get; } + public string data { set; get; } + public Dictionary ValueSet { set; get; } + + public bool TrySetData(string protocolData, byte[] protocolBytes) + { + try + { + if(protocolBytes[0]=='{'){ + + TypeTCPSetRotateData receivedData = JsonConvert.DeserializeObject(protocolData); + this.code = receivedData.code; + this.data = receivedData.data; + if(data != null && data != ""){ + ValueSet = JsonConvert.DeserializeObject>(data); + }else{ + return false; + } + return true; + }else{ + return false; + } + } + catch (System.Exception) + { + return false; + throw; + } + } + } } diff --git a/addons/EGFramework/Module/Extension/EGConvertExtension.cs b/addons/EGFramework/Module/Extension/EGConvertExtension.cs index 37bbdb3..2646c0e 100644 --- a/addons/EGFramework/Module/Extension/EGConvertExtension.cs +++ b/addons/EGFramework/Module/Extension/EGConvertExtension.cs @@ -277,6 +277,30 @@ namespace EGFramework { return byteArray; } + public static byte[] ToByteArray(this float value) + { + byte[] byteArray = new byte[4]; + byte[] tempArray = BitConverter.GetBytes(value); + if(!BitConverter.IsLittleEndian){ + Array.Reverse(tempArray); + } + //Array.Reverse(tempArray); // 大端序需要反转字节数组以满足高字节在后 + Array.Copy(tempArray, 0, byteArray, 0, 4); + return byteArray; + } + public static byte[] ToByteArrayBigEndian(this float value) + { + byte[] byteArray = new byte[4]; + byte[] tempArray = BitConverter.GetBytes(value); + if(BitConverter.IsLittleEndian){ + Array.Reverse(tempArray); + } + //Array.Reverse(tempArray); // 大端序需要反转字节数组以满足高字节在后 + Array.Copy(tempArray, 0, byteArray, 0, 4); + return byteArray; + } + + public static float[] ToFloatArray(this byte[] byteArray) { float[] floatArray = new float[byteArray.Length / 4]; diff --git a/addons/EGFramework/Module/ProtocolTools/EGModbus.cs b/addons/EGFramework/Module/ProtocolTools/EGModbus.cs index 434a995..5bc5ea9 100644 --- a/addons/EGFramework/Module/ProtocolTools/EGModbus.cs +++ b/addons/EGFramework/Module/ProtocolTools/EGModbus.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Threading.Tasks; using Godot; @@ -234,7 +235,12 @@ namespace EGFramework{ this.EGSendMessage(WriteRequest,serialPort,ProtocolType.TCPClient); break; case ModbusRegisterType.HoldingRegister: - WriteRequest = new ModbusTCP_WriteSingleHoldingRegister(deviceAddress,registerAddress,(ushort)value); + if(value.GetType() == typeof(float)){ + ushort[] writeData = ((float)value).ToByteArrayBigEndian().ToUShortArray(); + WriteRequest = new ModbusTCP_WriteMultiHoldingRegister(deviceAddress,registerAddress,writeData); + }else{ + WriteRequest = new ModbusTCP_WriteSingleHoldingRegister(deviceAddress,registerAddress,(ushort)value); + } this.EGSendMessage(WriteRequest,serialPort,ProtocolType.TCPClient); break; } diff --git a/addons/EGFramework/Module/ProtocolTools/EGTCPClient.cs b/addons/EGFramework/Module/ProtocolTools/EGTCPClient.cs index a18d320..753f54e 100644 --- a/addons/EGFramework/Module/ProtocolTools/EGTCPClient.cs +++ b/addons/EGFramework/Module/ProtocolTools/EGTCPClient.cs @@ -141,7 +141,6 @@ namespace EGFramework{ byte[] receivedByte = new byte[bytesRead]; Array.Copy(buffer, 0, receivedByte, 0, bytesRead); ResponseMsg receivedMsgs = new ResponseMsg(data,receivedByte,ClientName, ProtocolType.TCPClient); - Godot.GD.Print("[TCP-R]+("+ClientName+")" + data); ResponseMsgs.Enqueue(receivedMsgs); //this.EGOnReceivedData(receivedMsgs); }