From 35d47a2dc13a0ede44d16ca90473cf813594fe2b Mon Sep 17 00:00:00 2001 From: "GukSang.Jin" Date: Fri, 30 Jan 2026 15:38:36 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=AF=BB=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CSI-H238M/CSI-H238M/Services/ModbusService.cs | 38 ++++++++++++++++--- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/CSI-H238M/CSI-H238M/Services/ModbusService.cs b/CSI-H238M/CSI-H238M/Services/ModbusService.cs index d067612..cc8b26f 100644 --- a/CSI-H238M/CSI-H238M/Services/ModbusService.cs +++ b/CSI-H238M/CSI-H238M/Services/ModbusService.cs @@ -745,6 +745,34 @@ namespace COFTester.Services return result; } + /// + /// 將兩個寄存器轉換為 Float (IEEE 754 Big-Endian) + /// Modbus 標準字節序:高字在前,每字內高字節在前 + /// + protected float ConvertRegistersToFloatRead(ushort[] registers, int startIndex = 0) + { + if (registers.Length < startIndex + 2) + throw new ArgumentException("寄存器數組長度不足"); + + ushort highReg = registers[startIndex]; + ushort lowReg = registers[startIndex + 1]; + + byte[] floatBytes = new byte[4]; + // 高寄存器→高2字節,低寄存器→低2字節 + floatBytes[0] = (byte)(highReg >> 8); + floatBytes[1] = (byte)highReg; + floatBytes[2] = (byte)(lowReg >> 8); + floatBytes[3] = (byte)lowReg; + + // 處理小端序系統 + if (BitConverter.IsLittleEndian) + { + Array.Reverse(floatBytes); + } + + return BitConverter.ToSingle(floatBytes, 0); + } + /// /// 將 32位浮點型轉換為兩個寄存器 (IEEE 754) /// @@ -1247,7 +1275,7 @@ namespace COFTester.Services // D350 水平手動速度 var hSpeedRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.HorizontalManualSpeedRegister, 2); - parameters.HorizontalManualSpeed = ConvertRegistersToFloat(hSpeedRegs, 0); + parameters.HorizontalManualSpeed = ConvertRegistersToFloatRead(hSpeedRegs, 0); // D360 水平手動位移 var hDispRegs = await _modbusMaster.ReadHoldingRegistersAsync( @@ -1257,22 +1285,22 @@ namespace COFTester.Services // D310 升降手動速度 var vSpeedRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.VerticalManualSpeedRegister, 2); - parameters.VerticalManualSpeed = ConvertRegistersToFloat(vSpeedRegs, 0); + parameters.VerticalManualSpeed = ConvertRegistersToFloatRead(vSpeedRegs, 0); // D320 升降手動位移 var vDispRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.VerticalManualDisplacementRegister, 2); - parameters.VerticalManualDisplacement = ConvertRegistersToFloat(vDispRegs, 0); + parameters.VerticalManualDisplacement = ConvertRegistersToFloatRead(vDispRegs, 0); // D290 升降極限 var vLimitRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.VerticalLimitRegister, 2); - parameters.VerticalLimit = ConvertRegistersToFloat(vLimitRegs, 0); + parameters.VerticalLimit = ConvertRegistersToFloatRead(vLimitRegs, 0); // D292 水平極限 var hLimitRegs = await _modbusMaster.ReadHoldingRegistersAsync( _config.SlaveId, _config.HorizontalLimitRegister, 2); - parameters.HorizontalLimit = ConvertRegistersToFloat(hLimitRegs, 0); + parameters.HorizontalLimit = ConvertRegistersToFloatRead(hLimitRegs, 0); // D1320 拉力系數 var forceCoefRegs = await _modbusMaster.ReadHoldingRegistersAsync(