2016-07-15 5 views
1

私は2つのレジスタをPLC(modbus)からSQLサーバに、それぞれ16ビット転送します。私は私が私のPlcのと同じ結果を必要とし、この2つの整数を組み合わせたい、とRealのSQLデータ型に実際のデータ型へのSqlサーバの変換

declare @int1, @int2 integer 

declare @result real 

Select @int1 = 18196 
    , @int2 = 28800 

Select @result = @int1 * 65536 + @int2 //-- this result is not wanted 

を変換するために、結果は私が実際のデータ型に変換するにはどうすればよい38000.5

ですSQLで???

私の頭には、ネットを検索すると、ヘルプ

に感謝を傷つける他の方法は、周りの

select @result = 38000.5 

Select convert(integer, substring(convert(varbinary, @result),1,2) //18196 

Select convert(integer, substring(convert(varbinary, @result),3,2) //28800 
+0

'real'はおおよそのデータ型です。単に' decimal'を使うのではないのですか? – HoneyBadger

+0

これは、PlcでRealとしてマスクされているため、後方のサーボが実際の値を使用するためです。 – Thorsten

答えて

0
declare @result real 
declare @first int, @second int 

set @result=38000.5 


set @first = convert(integer, substring(convert(varbinary, @result),1,2)) --18196 
set @second = convert(integer, substring(convert(varbinary, @result),3,2)) --28800 

print @first 
print @second 
declare @binaryfloat varbinary(4)=convert(varbinary(2),@first)+convert(varbinary(2),@second); 

SELECT SIGN(CAST(@BinaryFloat AS INT)) 
    * (1.0 + (CAST(@BinaryFloat AS INT) & 0x007FFFFF) * POWER(CAST(2 AS REAL), -23)) 
    * POWER(CAST(2 AS REAL), (CAST(@BinaryFloat AS INT) & 0x7f800000)/0x00800000 - 127) 

である。しかし@honeybadgerが書いたように、なぜ通常のタイプを使用していませんか?

関連する問題