電力101 104規約中遙測量型別轉換

2021-07-30 10:03:06 字數 2251 閱讀 6918

參考

dl/t634.5101-2002和dl/t634.5104-2009標準中遙測量的標識型別有歸一化值nva,標度化值sva,短浮點數r32-ieee std 754,本文介紹利用union資料型別完成位元組陣列向這三種型別轉換的方法。

定義union資料型別,該union型別定義了多種不同資料型別的內部變數,但各個內部變數共享一段記憶體,在不同時間裡儲存不同的資料型別和長度的變數,此處共只占用4個位元組。

typedef

unsigned

char byte;

typedef

unsigned

long dword;

typedef

union

// 4 bytes

exc_datatype;

nva:=f16[1…16]<−1

…+1−

2−15 >

d7d6

d5d4

d3d2

d1d02−

8 2−

9 2−

10 2−

11 2−

12 2−

13 2−

14 2−

15 s2

−12−

2 2−

3 2−

4 2−

5 2−

6 2−

7

歸一化值由兩個位元組組成。1位符號位,0表示正數,1表示負數。15位資料位,正數是原碼,負數是補碼。

float bytes2float_nva( const qbytearray &bytes )

else

//正數:原碼

fval = (float)undatatype.snint; // 0--32767

return fval/32768;//2**15=32768

}

sva:=i16[1…16]<−2

15 …+215

−1>

標度化值也由兩個位元組組成。1位符號位,0表示正數,1表示負數。15位資料位,正數是原碼,負數是補碼。

float bytes2float_sva( const qbytearray &bytes )

else

//正數:原碼

fval = (float)undatatype.snint; // 0--32767

return fval;

}

r32-ieee std 754:=r32.23

小數fraction:=u32,23[1…23]<

0 …1−

2−23>

指數exponent:=u32,8[24…31]<

0 …

255>

符號sign:=bs1[1]

d7d6

d5d4

d3d2

d1d02−

16 2−

17 2−

18 2−

19 2−

20 2−

21 2−

22 2−

23 2−

8 2−

9 2−

10 2−

11 2−

12 2−

13 2−

14 2−

15

e20

2−1 2−

2 2−

3 2−

4 2−

5 2−

6 2−

7

s27

2625

2423

2221

短浮點數由四個位元組組成。1位符號位,0表示正數,1表示負數。

由於c語言中浮點數本身就是採用ieee格式來儲存的,可巧妙利用union資料型別實現兩者之間的轉換,如下

float bytes2float_ieee754( const qbytearray &bytes )

電力101/104規約中遙測資料歸一化問題

c程式中用union實現浮點數與ieee格式轉換

IEC104 電力規約解析

三遙 遙測 遙信 遙控 基本架構與osi模型對比如下圖 會話型別 傳送 無應答 s1 傳送 確認 s2 傳送 響應 s3 幀格式 單位元組幀,固定幀,可變幀 101固定幀 固定長度5個位元組,以0x10為啟動字元,以0x16為結束字元,包括鏈路控制域 鏈路位址域 校驗和 控制域 位址域 256 10...

關於電力行業104規約解析 固定幀程式解析

很多朋友開啟104規約要寫程式了,但104規約文章很長,很難看,很難理解,對於初學的人員來說比較難理解 其實104規約主要理解一下報頭部分的控制報文。如下 設定遙測 void cmainframe setycapci 理解了報頭就知道了,我們在組包的時候就需要將資料加上,要計算資料的長度。傳送遙信資...

Scala中規約操作reduce與fold函式

規約操作是對容器的元素進行兩兩運算,將其 規約 為乙個值。常用的規約方法有reduce和fold,兩個方法唯一的差別是,reduce是從容器的兩個元素開始規約,而fold則是從提供的初始值開始規約。同樣地,對於無序容器而言,fold方法不保證規約時的遍歷順序,如要保證順序,請使用foldleft和f...