今回の記事ではTOYOPUC-Nano 10GXを使用していて、PLC自身からPINGを実行するプログラムを説明します。実際に Nano 10GXから 192.168.250.199 へPINGを送信し、成功したらM10をONするところまで試してみました。
さ、FAを楽しもう。

Point1:Nano 10GXのL1/L2とLink No.は違う
最初に少し分かりにくかったのがここです。Nano 10GXには物理的な通信ポートとしてL1、L2などがありますが、PCwin2ではそれとは別にLink No.1~8を設定します。
Nano 10GXモードでは、プログラムごとにLink No.1~8を持つ仕様になっています。またPCwin2では、ポートL1/L2がそれぞれ実機のL1/L2ポートに対応します。

つまり、Link No.1 = 物理L1とは限りません。
たとえば今回の構成では、
Link No.1 → Built-in L1 → EtherNet/IP
Link No.2 → Built-in L2 → Ethernet
としました。
PCwin2の取説でも、内蔵L1および内蔵L2にはEthernetを設定でき、リンクモジュールとして「イーサネット(32ポート)」を選択できます。今回はL1をすでにEtherNet/IPで使用していたため、PING用としてL2をEthernetに割り付けました。
Point2:PINGの宛先は特殊レジスタへ書き込む
TOYOPUCのEthernet PINGでは、一般的なPLC命令のように”PING 192.168.251.199”という命令を書くわけではありません。PINGしたいIPアドレスを、Link No.に対応した特殊レジスタへ書き込みます。PING先IPを書き込むアドレスは次のようになっています。
1 S31C~S31D
2 S33C~S33D
3 S35C~S35D
4 S37C~S37D
5 S39C~S39D
6 S3BC~S3BD
7 S3DC~S3DD
8 S3FC~S3FD
今回はLink No.2なので、S33CとS33Dを使用します。
Point3:IPアドレスを16進数へ変換する
今回PINGしたいIPは、192.168.251.199です。
各オクテットを16進数に変換します。
192 = C0h
168 = A8h
251 = FBh
199 = C7h
したがって、
192.168.251.199
↓
C0 A8 FB C7
となります。
TOYOPUCではこれを16bitずつ逆側から格納します。
S33C = FBC7h
S33D = C0A8h
マニュアルにも、例として
172.16.93.133
= AC 10 5D 85
S31C = 5D85h
S31D = AC10h
という格納方法が示されています。
この規則をそのまま今回のIPへ当てはめています。
Point4:PINGは2秒ごとに繰り返される
PING先IPを特殊レジスタへ設定すると、PINGテストは2秒ごとに繰り返し実行されます。PINGを終了したい場合は、PING先を書き込んだ特殊なレジスタを0000hへ戻します。
つまり、一度、
S33C = FBC7h
S33D = C0A8h
を設定すれば、毎スキャンWMOVする必要はありません。
例えば初回スキャンだけ実行するようにしておくと分かりやすいです。
Point5:300番台の状態モニタを使う
PING結果は、CPUのS300番台の状態モニタ領域にも反映されます。マニュアルではLink No.ごとの状態モニタ範囲が次のように定義されています。
1 S300~S30F
2 S320~S32F
3 S340~S34F
4 S360~S36F
5 S380~S38F
6 S3A0~S3AF
7 S3C0~S3CF
8 S3E0~S3EF
今回はLink No.2なので、S320~S32Fを使用します。マニュアル上では、
*8 = PING正常
*9 = PING異常
と定義されています。
Link No.2の場合、S325-A = PING正常、S325-B = PING異常となります。
Implementation
ここからプロジェクトを構築します。
Link設定
最初にTOYOPUC-Nano 10GXのLinkパラメータをセットアップします。Parameter→Link Parametersをクリックします。

P1-2を選び→Link Setupします。

下図のように、
- Rack No:Build-in
- Slot.no:L2
- Link module name:Ethernet(32Port)
設定します。

IP設定
先程設定したLinkを選び→Detailをクリックします。

Own Node IP AddressでL2のIPアドレスを設定します。

下図のようにLink1=Ethernet/IP、Link2=Ethernet(32Port)になります。

プログラム
次はPINGコマンドを発行するプログラムを作成します。今回はPorgram1を使用します。

こちらはプログラムの全体です。

Line003-Line004
M4をONするとS033CとS033DをWMOVに使用しデータ転送します。
- W033C=FAC7h=250.199
- W033D=C0A8h=192.168
W033CとW033Dが0以外の値を書き込むとPLCが自動的にPINGコマンドを発行します。

M4をOFFすると0をS033CとS033DをWMOVに使用しデータ転送し、PINGコマンドを停止します。

最後はPING正常とエラーの状態を判断し、M10とM11をONにします。

結果
下図のようにM4がONし、192.168.250.199とPINGコマンドが通過できればM10がONになります。

また192.168.250.199とPINGコマンドが通過できればM11がONになります。

ハマったところ-PINGコマンド発行しない
自分のプロジェクトではもともと:
- Link No.1
- Built-in L1
- EtherNet/IP
としてL1を使用していました。そしてそこで最初は、
- S31C
- S31D
PING先を書き込んでいました。
しかしPING機能はEthernetとして設定したLinkに対して使用する機能です。そこで、
- Link No.1 → Built-in L1 → EtherNet/IP
- Link No.2 → Built-in L2 → Ethernet
と役割を分離しました。
結果として、
- L1:EtherNet/IP
- L2:PING用Ethernet
という構成にすることで、既存のEtherNet/IP通信を残したままPING監視を追加できました。