ASCII -> 16進変換
このFP命令は、実行条件ENがTRUEのときs_Startで指定された16進ASCII HEXコードを16進文字に変換します。n_Charsは変換するバイト数を指定します。結果はdに格納されます。
ASCIIコードは、1つの16進文字を表すのに8ビット(1バイト)必要です。変換の結果、データ長は変換前のASCIIコードの半分になります。入力
先頭アドレス
バイト数
出力
変換バイト
ASCIIコードの2文字が2つの1バイト数字に変換されます。この過程で、上位文字と下位文字が交換されます。4文字分を一区切りにして変換します。
ASCII HEXコードと16進数の対応表:
16進数 |
ASCII HEXコード |
---|---|
0123456789ABCDEF |
16#30 16#31 16#32 16#33 16#34 16#35 16#36 16#37 16#38 16#39 16#41 16#42 16#43 16#44 16#45 16#46 |
インデックス修飾時にエリアを超えたとき
n_Charsで指定したバイト数がs_Startで指定したエリアを超えるとき
変換結果がdで指定したデータエリアを超えるとき
n_Chars = 0
0~F以外のASCII文字が指定されているとき
インデックス修飾時にエリアを超えたとき
n_Charsで指定したバイト数がs_Startで指定したエリアを超えるとき
変換結果がdで指定したデータエリアを超えるとき
n_Chars = 0
0~F以外のASCII文字が指定されているとき
オフセット |
ASCIIコード |
16進相当 |
オフセット |
変換後のHexデータ |
|||
s1_Start |
0 |
16#4241 |
BA |
Þ |
d |
0 |
16#CDAB |
1 |
16#4443 |
DC |
1 |
||||
n_Chars |
0 |
16#0004 |
2 |
||||
1 |
3 |
オフセット |
ASCIIコード |
16進相当 |
オフセット |
変換後のHexデータ |
|||
s1_Start |
0 |
16#4241 |
BA |
Þ |
d |
0 |
16#CDAB |
1 |
16#4443 |
DC |
1 |
||||
n_Chars |
0 |
16#0004 |
2 |
||||
1 |
16#0000 |
3 |
|||||
2 |
4 |
オフセット |
ASCIIコード |
16進相当 |
オフセット |
変換後のHexデータ |
|||
s1_Start |
0 |
16#3231 |
21 |
Þ |
d |
0 |
16#3412 |
1 |
16#3433 |
43 |
1 |
16#7856 |
|||
2 |
16#3635 |
65 |
2 |
||||
3 |
16#3837 |
87 |
3 |
||||
n_Chars |
0 |
16#0008 |
4 |
||||
1 |
5 |
奇数サイズの文字列が変換される場合、最終変換バイトのビット位置 0~3 に 0 が入力されます。
オフセット |
ASCIIコード |
16進相当 |
オフセット |
変換後のHexデータ |
|||
s1_Start |
0 |
16#3231 |
21 |
Þ |
d |
0 |
16#3412 |
1 |
16#3433 |
43 |
1 |
16#7056 |
|||
2 |
16#3635 |
65 |
2 |
||||
3 |
16#3837 |
87 |
3 |
||||
n_Chars |
0 |
16#0007 |
4 |
||||
1 |
5 |
POUヘッダには、このプログラムで使用するすべての入力変数と出力変数を宣言します。 POUヘッダは全プログラム言語で使用できます。
VAR
bStart: BOOL:=FALSE;
(*activates the function*)
wASCIIInput: WORD:=16#3031;
wConversionResult: WORD:=0;
END_VAR
変数bStartがTRUEにセットされると、このファンクションが実行されます。
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_CONTACT,,bStart,5,2,7,4,);
B(B_VARIN,,wASCIIInput,11,3,13,5,);
B(B_VARIN,,2,11,4,13,6,);
B(B_VAROUT,,wConversionResult,23,3,25,5,);
B(B_F,FP_ASCII_TO_HEX!,,13,1,23,6,,?DEN?Ds_Start?Dn_Chars?AENO?Cd);
L(1,3,5,3);
L(7,3,13,3);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
END_BODY
If (bStart) then
FP_ASCII_TO_HEX(s_Start := wASCIIInput,
n_Chars := 2,
d => wConversionResult);
End_if;