TF6250 Modbus TCP サーバ

サービスの起動

以下のフォルダへアクセスします。

C:\Program Files (x86)\Beckhoff\TwinCAT\Functions\TF6250-Modbus-TCP\Win32\Server

この中のTcModbusSrv.xml.sampleを次節以後で説明する内容でアクセスを許可したい変数エリアをXMLエディタ(テキストエディタでも可)で定義し、同じ場所へTcModbusSrv.xmlとして保存してください。デフォルトのまま変更が無ければこの操作は不要です。TcModbusSrv.xmlは無い状態でもデフォルト値としてこの設定で動作します。

次にWindowsサービスTcModbusSrvを開始すると外部からの接続待ち受けを開始します。

Tip

次節で説明する各種設定変更を行った場合は、都度このサービスの再起動を行って設定を反映させる必要があります。

設定

次のとおりTcModbusSrv.xmlファイルを直接編集して行います。編集後はサービスを再起動して設定を反映してください。

待ち受けTCPポートの変更

<Configuration>
    <Port>502</Port>

最初の502を別のポートへ変更してください。併せて、このポートを外部からアクセスできるように、Windowsのファイヤウォール設定で、Inbound側のアクセスを許可設定する必要があります。

Tip

TwinCAT BSDの場合はiptables, TwinCAT Linux の場合はnftablesで許可設定を行ってください。

入出力I/OデバイスのModbusクライアントへの共有

<InputCoils><OutputCoils>セクションは、IOツリー以下にある%IX(入力)%QX(出力)のアドレスを共有定義するエリアです。TwinCAT3のシステム(IO)デバイスに割り当てられるADSメモリは次のサイトに一覧表があります。

https://infosys.beckhoff.com/content/1033/tc3_ads_intro/117463563.html?id=5698026452165921197

このうち、ビットデバイスの入力エリアはインデックスグループ : オフセット0x0000F021:0x000FA000にあり、出力エリアはインデックスグループ : オフセット0x0000F031:0x001F4000に格納されています。

この設定が次のファイルの通り指定された状態となっています。

<Configuration>
    <Port>502</Port>
    <IpAddr/>
    <Mapping>
        <InputCoils>
            <!-- process image of the physical inputs (bit access) -->
            <MappingInfo>
                <AdsPort>851</AdsPort>
                <!-- Modbus Start Address 0 = 0x0000 -->
                <StartAddress>0</StartAddress>
                <!-- Modbus End Address 32767 = 0x7FFF -->
                <EndAddress>32767</EndAddress>
                <!-- IndexGroup 61473 = 0xF021 PLC process diagram of the physical inputs (%IX field). -->
                <IndexGroup>61473</IndexGroup>
                <!-- IndexOffset 1024000 = 0xFA000 -> The index offset contains the bit address which is calculated from base offset (0xFA000) + byte number +8 + bit number -->
                <IndexOffset>0</IndexOffset>
            </MappingInfo>
                :
        </InputCoils>
        <OutputCoils>
            <!--process image of the physical outputs (bit access) -->
            <MappingInfo>
                <AdsPort>851</AdsPort>
                <!-- Modbus Address 0 = 0x0000 -->
                <StartAddress>0</StartAddress>
                <!-- Modbus Address 0 = 0x7FFF -->
                <EndAddress>32767</EndAddress>
                <!-- IndexGroup 61473 = 0xF031 -> PLC process diagram of the physical outputs(%QX field) -->
                <IndexGroup>61489</IndexGroup>
                <!-- IndexOffset 2048000 = 0x1F4000 -> The index offset contains the bit address which is calculated from the base offset (0x1F4000) + byte number *8 + bit number. -->
                <IndexOffset>2048000</IndexOffset>
            </MappingInfo>
                   :

ここに記載されているとおり、bit型のデータが1バイトづつ間隔を空けてADSメモリにマッピングされ、Modbusアドレス0x00000x7fffに配置されています。たとえば、次のEL2008の各アドレスは、%QX89.0 ~ %QX89.7 に配置されていることがわかります。

ここから、Modbusアドレス上では、出力コイルの、 0x0000\(+\)8\(\times\)89\(+\)0\(=\)712 を先頭に、712~719 (16進数では 0x02C8 ~ 0x02CF)のアドレスで Modbus クライアント側はアクセスすることができます。

同様に<InputRegisters><OutputRegisters>セクションは WORDデバイス(16bit整数サイズ)の入出力データエリアです。こちらについても同様の方法で、EtherCATやEtherNet/IPなどの入出力データを直接モニタ、書き込む事ができます。

PLC変数シンボルを指定したModbusクライアントへの共有

PLCプログラム内で定義した変数への共有は、以下のとおり変数名とModbusアドレスの開始~終了アドレスを指定する方法で定義します。初期設定は以下のとおりです。

エリア

Modbusアドレス

変数

型・サイズ

入力ステータス

0x8000 - 0x80FF

GVL.mb_Input_Coils

256点 BOOL型

出力コイル

0x8000 - 0x80FF

GVL.mb_Output_Coils

256点 BOOL型

入力レジスタ

0x8000 - 0x80FF

GVL.mb_Input_Registers

256点 WORD型

出力レジスタ

0x8000 - 0x80FF

GVL.mb_Output_Registers

256点 WORD型

必要に応じてサイズや変数を変更・追加・削除してください。

<Configuration>
   <Port>502</Port>
   <IpAddr/>
   <Mapping>
       <InputCoils>
               :
           <!-- digitial inputs mapping by variable name -->
           <MappingInfo>
               <AdsPort>851</AdsPort>
               <!-- Modbus Address 32768 = 0x8000 -->
               <StartAddress>32768</StartAddress>
               <!-- Modbus Address 33023 = 0x80FF -->
               <EndAddress>33023</EndAddress>
               <VarName>GVL.mb_Input_Coils</VarName>
           </MappingInfo>
       </InputCoils>
       <OutputCoils>
               :
           <!-- digitial outputs mapping by variable name -->
           <MappingInfo>
               <AdsPort>851</AdsPort>
               <!-- Modbus Address 32768 = 0x8000 -->
               <StartAddress>32768</StartAddress>
               <!-- Modbus Address 33023 = 0x80FF -->
               <EndAddress>33023</EndAddress>
               <VarName>GVL.mb_Output_Coils</VarName>
           </MappingInfo>
       </OutputCoils>
              :

デフォルトのままであれば、次の通り変数定義を行ってください。

{attribute 'qualified_only'}
VAR_GLOBAL
    mb_Input_Coils        : ARRAY [0..255] OF BOOL;
    mb_Output_Coils       : ARRAY [0..255] OF BOOL;
    mb_Input_Registers    : ARRAY [0..255] OF WORD;
    mb_Output_Registers   : ARRAY [0..255] OF WORD;
END_VAR

PLCデータのADSインデックスグループ・オフセットを指定したModbusクライアントへの共有

シンボル化されていない様々なPLC内部のADSアドレスは、インデックスグループ0x4040にてアクセスできます。このインデックスオフセットは、PLCインスタンスの、Data Areaタブに一覧されるPLC内部データツリーのSize列に表記されています。

ここから読み取った値は、次の通りModbusアドレスの0x60000x7fffにマッピングされています。デフォルトの場合のインデックスオフセットは0のため、最大0x00001FFFのオフセットまでしか読み取ることができません。インデックスグループ0x4040のオフセット範囲は0x000000000xFFFFFFFFと広大なため、必要な個所を適切にセグメントを分けて定義する必要があります。この際、先頭の任意のオフセットアドレスを定義してください。

<Configuration>
    <Port>502</Port>
    <IpAddr/>
    <Mapping>
        <OutputRegisters>
                :
            <!--  PLC data area -->
            <MappingInfo>
                <AdsPort>851</AdsPort>
                <!-- Modbus Address 32768 = 0x6000 -->
                <StartAddress>24576</StartAddress>
                <!-- Modbus Address 32767 = 0x7FFF -->
                <EndAddress>32767</EndAddress>
                <!-- IndexGroup 16448 = 0x4040 - PLC data area -->
                <IndexGroup>16448</IndexGroup>
                <!-- The index offset is byte offset -->
                <IndexOffset>0</IndexOffset>
            </MappingInfo>
                  :
        </OutputRegisters>
    </Mapping>
</Configuration>