F70_BCC

ブロックチェックコード計算

メッセージ転送時のエラー検出に使用されるブロックチェックコード(BCC)を計算します。s2_Startで指定された16ビットエリアに格納されているs3_NumberバイトのASCIIデータのブロックチェックコードを、s1_Controlで指定された方法で計算します。ブロックチェックコード(BCC)は、dで指定された16ビットエリアの下位バイトに格納します。(BCCは1バイトです。dの上位バイトは変化しません。)

パラメータ

入力

s1_Control (INT)

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)

s2_Start (WORD, INT, UINT)

BCC計算を行う16ビットデータエリアの先頭アドレス

s3_Number (INT)

BCC計算を行うデータのバイト数

出力

d (WORD, INT, UINT)

BCCを格納する16ビットエリア

解説

F命令を使用する代わりに、対応するFP7命令を使用することをおすすめします。FP_CRCFP_BCC

制御コードs2_Controlの指定s1_Control

  1.  (1) 計算方法

    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)

  2.  (2) 計算開始位置("s2"からのバイト数)

    0–F

  3.  (3) 格納開始位置("d"からのバイト数)
  4.  (4) 変換データ
    • 0: バイナリデータ(CRC: 2バイト/CRC以外: 1バイト)
    • 1: ASCIIデータ(2バイト)
注記

計算方法にCRC−16を指定する場合は、変換データにASCIIコードを指定することはできません。

エラーフラグ

sys_bIsOperationErrorHold (TRUEになり、TRUEを保持)

対象データのバイト数の指定がデータのエリアを超えるときON

sys_bIsOperationErrorNonHold (1回のスキャンに対してTRUE)

対象データのバイト数の指定がデータのエリアを超えるときON

POUヘッダ

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

LDボディ

StartTRUEになると、ASCII_Stringに対するブロックチェック文字列の計算が行われます。計算方法は、排他的論理和です。(大量のデータを転送するときにこの方法を使用します。)

排他的論理和演算を使用したBCC演算の例:

bvar_1

bvar_2

bvar_3

0

0

0

0

1

1

1

0

1

1

1

0

  1.  (1) ASCII-HEX-code
  2.  (2) ASCII-BIN-code
  3.  (3) Exclusive ORing
  4.  (4) 演算
  5.  (5) ブロックチェック文字列 (BCC)
  6.  (6) 演算結果(16#1D)はdに格納されます。

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

STボディ

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;

最終修正日: 2022-01-07このページに関するフィードバックお問い合わせ窓口