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

如何在Microsoft SQL中实现Modbus 32位浮点数据的Swap Words功能?

在Microsoft SQL中实现Modbus 32位浮点的字交换转换

可以通过创建自定义SQL函数来实现字交换(Swap Words)并转换为正确的浮点数值,以下是具体方案:

核心逻辑

Modbus的32位浮点值由两个16位保持寄存器组成,你的情况是Kepware采集时错误拼接了两个寄存器的顺序(低字在前、高字在后),通过交换这两个16位字的位置,再转换为IEEE754单精度浮点值即可得到正确读数。

方案1:处理二进制类型的原始数据

如果采集到的原始值存储为binary(4)类型,使用以下函数:

CREATE FUNCTION dbo.ModbusSwapWordsToFloat(@RawData BINARY(4))
RETURNS FLOAT
AS
BEGIN
    -- 交换前后两个16位字(前2字节与后2字节互换)
    DECLARE @SwappedData BINARY(4) = SUBSTRING(@RawData, 3, 2) + SUBSTRING(@RawData, 1, 2)
    -- 将交换后的二进制数据转换为浮点值
    RETURN CONVERT(FLOAT, @SwappedData)
END
GO

方案2:处理整数类型的原始数据

如果Kepware将两个16位寄存器拼接为INT类型存储,使用以下函数:

CREATE FUNCTION dbo.ModbusSwapWordsIntToFloat(@RawInt INT)
RETURNS FLOAT
AS
BEGIN
    -- 将整数转换为4字节二进制数据
    DECLARE @RawData BINARY(4) = CONVERT(BINARY(4), @RawInt)
    -- 交换前后两个16位字
    DECLARE @SwappedData BINARY(4) = SUBSTRING(@RawData, 3, 2) + SUBSTRING(@RawData, 1, 2)
    -- 转换为浮点值
    RETURN CONVERT(FLOAT, @SwappedData)
END
GO

使用示例

假设你的数据表名为PowerMeterData,原始数据字段为RawVoltage:

  • 如果字段是binary(4)类型:
SELECT
    RawVoltage,
    dbo.ModbusSwapWordsToFloat(RawVoltage) AS CorrectVoltage
FROM PowerMeterData
  • 如果字段是INT类型:
SELECT
    RawVoltage,
    dbo.ModbusSwapWordsIntToFloat(RawVoltage) AS CorrectVoltage
FROM PowerMeterData

注意事项

  1. 确认原始数据的存储类型:如果是字符串类型(如VARCHAR),需要先转换为binary(4)或INT再传入函数。
  2. 验证精度:SQL Server的FLOAT是双精度类型,转换单精度浮点数据不会丢失精度。
  3. 测试验证:可以用已知的正确读数反向验证函数,比如将正确值转换为二进制后交换字,再用函数还原,确认结果一致。

内容的提问来源于stack exchange,提问作者Hm_Joy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 04:25:08