ブロックチェックコード計算
メッセージ転送時のエラー検出に使用されるブロックチェックコード(BCC)を計算します。s2_Startで指定された16ビットエリアに格納されているs3_NumberバイトのASCIIデータのブロックチェックコードを、s1_Controlで指定された方法で計算します。ブロックチェックコード(BCC)は、dで指定された16ビットエリアの下位バイトに格納します。(BCCは1バイトです。dの上位バイトは変化しません。)
入力
BCCの計算方法を指定します。
0: 加算(SYS_BCC_CALCULATION_METHOD_ADD)
1: 減算(SYS_BCC_CALCULATION_METHOD_SUB)
2: 排他的論理和(SYS_BCC_CALCULATION_METHOD_XOR)
16#A: CRC-16 (SYS_BCC_CALCULATION_METHOD_CRC16)
BCC計算を行う16ビットデータエリアの先頭アドレス
BCC計算を行うデータのバイト数
出力
BCCを格納する16ビットエリア
F命令を使用する代わりに、対応するFP7命令を使用することをおすすめします。FP_CRC、FP_BCC
制御コードs2_Controlの指定s1_Control
0: 加算(SYS_BCC_CALCULATION_METHOD_ADD)
1: 減算(SYS_BCC_CALCULATION_METHOD_SUB)
2: 排他的論理和(SYS_BCC_CALCULATION_METHOD_XOR)
16#A: CRC-16 (SYS_BCC_CALCULATION_METHOD_CRC16)
0–F
計算方法にCRC−16を指定する場合は、変換データにASCIIコードを指定することはできません。
対象データのバイト数の指定がデータのエリアを超えるときON
対象データのバイト数の指定がデータのエリアを超えるときON
POUヘッダには、このプログラムで使用するすべての入力変数と出力変数を宣言します。 POUヘッダは全プログラム言語で使用できます。
VAR
Start: BOOL:=FALSE;
(*activates the function*)
BCC_Calc_Method: INT:=2;
ASCII_String: STRING[32]:='%01#RCSX0000';
(*specifies the operation:
0: addition
1: subtraction
2:XOR*)
BCC: WORD:=0;
(*result after a 0->1 leading
edge from start: 10#172*)
END_VAR
StartがTRUEになると、ASCII_Stringに対するブロックチェック文字列の計算が行われます。計算方法は、排他的論理和です。(大量のデータを転送するときにこの方法を使用します。)
排他的論理和演算を使用したBCC演算の例:
bvar_1 |
bvar_2 |
bvar_3 |
|
0 |
0 |
0 |
|
0 |
1 |
1 |
|
1 |
0 |
1 |
|
1 |
1 |
0 |
8ビットの排他的論理和演算の結果を得るため、下記のように、最初の2文字のASCII BINコードを演算します。
比較符号 |
ASCII BINコード |
% |
00100101 |
0 |
00110000 |
排他的論理和結果 |
00010101 |
この結果を用いて、次の文字("1")のASCII BINコードと演算します。
比較符号 |
ASCII BINコード |
排他的論理和結果 |
00010101 |
1 |
00110001 |
次の排他的論理和 |
00100100 |
最後の文字まで繰り返します。
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 11 ;
NETWORK_BODY
B(B_F,F70_BCC!,Instance,26,1,34,7,,?DEN?Ds1_Control?Ds2_Start?Ds3_Number?AENO?Cd);
B(B_CONTACT,,Start,3,2,5,4,);
B(B_VARIN,,BCC_Calc_Method,24,3,26,5,);
B(B_F,Adr_Of_VarOffs_I!,Instance,16,5,25,9,,?D@'Var'?DOffs?CAdr);
B(B_VAROUT,,BCC,34,3,36,5,);
B(B_VARIN,,ASCII_String,11,4,13,6,);
B(B_VARIN,,2,14,7,16,9,);
B(B_F,LEN!,Instance,16,8,21,11,,?DIN?C);
L(16,5,16,7);
L(13,5,16,5);
L(13,5,13,10);
L(13,10,16,10);
L(25,5,25,7);
L(25,5,26,5);
L(26,6,26,10);
L(21,10,26,10);
L(5,3,26,3);
L(1,3,3,3);
L(1,0,1,11);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF start then
F70_BCC( s1_Control:= BCC_Calc_Methode,
s2_Start:= Adr_Of_VarOffs( Var:= ASCII_String,
Offs:= 2),
s3_Number:= LEN( ASCII_String),
d=> BCC);
END_IF;