今回の記事ではいままでずっと謎だったAdd FB for IO Channelボタンをどう使うかを説明します。よろしくお願いします。
Configuration
今回の構成はCodesysがEthernet/IP のScannerでAXCF 3152 PLCNEXTがAdapterになります。
Reference Link
http://soup01.com/ja/category/protocol/ethernet-ip/
Implementation
Add FB for IO Channelという設定を使用するにはCodesysの2つのAttributeが必要です。それは’io_function_block’ と ‘io_function_block_mapping’です。
io_function_block
Function blockにそのAttributeをつけるとDevice MappingからI/O Mappingに振り分けることができます。つまりAdd FB for IO Channelのボタンをクリックすると該当するFunction blockが表示されるようになります。
io_function_block_mapping
io_function_block AttributeつけてるFunction Blockにio_function_block_mappingのAttribute
があるパラメータはI/O Mappingと自動に紐づけることになります。。注意するのは複数のVariableをio_function_block_mapping Attributeつけても、I/O Mappingと紐付けられるのは最初に合うパラメータだけ(INPUTかOUTPUT、そしてデータタイプが一致)になります。
FB_PLCNEXT_INPUTPROCESS
まずいつも通りにFunction Blockを作成します。
VAR
まずFUNCTION BLOCKの先頭に{attribute ‘io_function_block’}をつけます。
そうするとAdd FB for IO ChannelからそのFB_PLCNEXT_INPUTPROCESSを選択できるようになります。次はByteINの前に{attribute ‘io_function_block_mapping’}をつけます。
つまりAdd FB for IO ChannelからFB_PLCNEXT_INPUTPROCESSを設定すると、そのデバイスは自動的にByteINという変数と紐付けられる。
{attribute ‘io_function_block’} FUNCTION_BLOCK FB_PLCNEXT_INPUTPROCESS VAR_INPUT {attribute ‘io_function_block_mapping’} ByteIN:USINT; END_VAR VAR_OUTPUT Encoded:ARRAY[0..7]OF BOOL; END_VAR VAR END_VAR |
PROGRAM
Function Block内のプログラムはそのByteIN変数をBoolにバラしてEncodedという長さ8のBool配列に出力します。
Encoded[0]:=ByteIN.0; Encoded[1]:=ByteIN.1; Encoded[2]:=ByteIN.2; Encoded[3]:=ByteIN.3; Encoded[4]:=ByteIN.4; Encoded[5]:=ByteIN.5; Encoded[6]:=ByteIN.6; Encoded[7]:=ByteIN.7; |
Assign IO
PLCNEXT AXCF-3152をEhternetIP Networkに追加し>Ethernet/IP I/O Mapping>一つ目のInput変数を選び>Add FB for IO Channelをクリックします。
FB_PLCNEXT_INPUTPROCESSを選び>OKします。
自動的にFunction Blockが作成され紐付けられます。
Function Blockにアクセスするには直接にAXC_F_3152_FB_PLCNEXT_INPUTPROCESS_3.YourVariableでOKです!
ではいくつかのInput変数を定義します。
Ethernet/IP IEC ObjectsのTabには作成されたFunction Block Instanceを一覧できますし、その画面から直接AddボタンからFBを作成もできます。
MAIN
VAR
PROGRAM PLC_PRG VAR ByteFromPLCNEXT:ARRAY[0..255]OF BYTE; ByteToPLCNEXT :ARRAY[0..255]OF BYTE; a1,a2,a3,a4,a252,a253,a254,a255 :ARRAY[0..7]OF BOOL; END_VAR |
PROGRAM
注意するのはFB_PLCNEXT_INPUTPROCESSもすでにBackgroundで呼び出しされたのでMAINのプログラムでCALLする必要がありません。
a1:=AXC_F_3152_FB_PLCNEXT_INPUTPROCESS_1.Encoded; a2:=AXC_F_3152_FB_PLCNEXT_INPUTPROCESS_2.Encoded; a3:=AXC_F_3152_FB_PLCNEXT_INPUTPROCESS_3.Encoded; a4:=AXC_F_3152_FB_PLCNEXT_INPUTPROCESS_4.Encoded; a252:=AXC_F_3152_FB_PLCNEXT_INPUTPROCESS_252.Encoded; a253:=AXC_F_3152_FB_PLCNEXT_INPUTPROCESS_253.Encoded; a254:=AXC_F_3152_FB_PLCNEXT_INPUTPROCESS_254.Encoded; a255:=AXC_F_3152_FB_PLCNEXT_INPUTPROCESS_255.Encoded; |
PLCNEXT Side
PLCNEXT側はいくつかの変数にTureを書き込みます。
Result
実際にもなにもやらずにプログラムが処理されました!
Sample Code
以下のLinkからProjectをDownloadしてください。
https://github.com/soup01Threes/Codesys/blob/main/Codesys-Example-Add%20FB%20IO%20Channel.project