OMRON#NX102-9000からUNSENDコマンドをNXR-SXD1204-CSTに発行しよう

今回の記事では、Safety Controllerとして OMRON NX102-9000 + NX-SL5500 を使用し、CIP Safety Targetとして NXR-SXD1204-CST をEtherNet/IPネットワーク上に接続し、UNSEND関数を使用し、NXR-SXD1204-CSTにコマンドを送信します。

FAを楽しもう!

Reference Link

http://soup01.com/ja/category/omron%e3%82%aa%e3%83%a0%e3%83%ad%e3%83%b3/nxr-sxd/

http://soup01.com/ja/category/protocol/ethernet-ip/cip-safety/

CIPUCMMSend

CIPUCMMSend 命令は、CIP ネットワーク上の指定されたデバイスに UCMM CIP メッセージを送信します。

VAR_INPUT

パラメータ

説明

RoutePath

送信先までの通信経路

TimeOut

応答待ちのタイムアウト時間

ServiceCode

実行するCIPサービスのコード

RqPath

Class、Instance、Attributeなどの要求先

ServiceDat

実際に送信するコマンドデータ

Size

送信するデータ要素数

VAR_IN_OUT

パラメータ

説明

RespServiceDat

相手機器から返されるレスポンスデータ

VAR_OUTPUT

パラメータ

説明

RespSize

受信したレスポンスデータのサイズ

_sREQUEST_PATH

項目

意味

説明

データ型

ClassID

クラスID

対象CIP ObjectのClass ID

UINT

InstanceID

インスタンスID

対象Object内のInstance ID

UINT

isAttributeID

Attribute ID使用有無

TRUE:Attribute IDを使用する / FALSE:Attribute IDを使用しない

BOOL

AttributeID

Attribute ID

対象AttributeのID

UINT

Safety Supervisor Object(Class Code: 39 hex)

Safety Supervisor Objectは、CIP Safety対応デバイスの中核となるオブジェクトです。デバイスの状態管理や設定、リセット、モード変更など、安全機器全体を監督する役割を持っています。

CIP Safetyでは、Safety Supervisorの実装を大きく次の2種類に分類しています。

実装

対応範囲

Baseline Supervisor

Required指定のAttributeとService

SNCT Supervisor

Baseline機能+SNCT対応時に必要なConditional機能

Baseline Supervisor

Baseline Supervisorは、Safety Supervisor Objectで「必須(Required)」と定義されているすべてのAttributeとServiceを実装した、基本仕様のSupervisorです。Safety Supervisorのステートマシンに必要な基本動作を備えています。ただし、必須ではないServiceに関連する状態イベント処理については、実装対象に含まれません。つまり、CIP Safetyデバイスとして成立するための、最小限かつ標準的なSupervisor実装です。

SNCT Supervisor

SNCT Supervisorは、Baseline Supervisorの機能をすべて備えたうえで、さらに「SNCT対応時に必須(Conditional)」とされるAttributeとServiceを実装した拡張Supervisorです。SNCTは、CIP SafetyデバイスのSafety Network Number(SNN)など、安全ネットワーク設定を行うための構成ツールに関係します。したがって、両者の関係は次のように整理できます。

デバイス全体の状態管理

Safety Supervisor Objectは、主に次の情報と動作を一元管理します。

  • Application Objectの状態定義
  • 各Objectの状態に関連するStatus情報
  • AlarmやWarningなどのException Status
  • Safety Deviceに属するObjectが従うべき共通のBehavior Model

例えば、Safety Supervisor ObjectのInstanceに対してResetが要求された場合、Safety Supervisor自身だけがResetされるわけではありません。そのSupervisorに関連付けられた、すべてのApplication ObjectにもReset処理が適用されます。

この仕組みにより、Safety Supervisorだけが初期状態へ戻り、Safety I/OなどのApplication Objectが古い状態のまま残る、といった不整合を防ぎます。要するに、Safety Supervisorの状態がSafety Device全体の状態を決定するということです。各ObjectはSafety Supervisorに従属し、Reset、状態遷移、異常処理などをデバイス全体で一貫して実行します。

All Safety Devices shall contain, at a minimum, a basic level of safety functionality. Safety devices are built off of this baseline. As shown in Figure 6-3.1, the baseline safety functionality is defined as one which contains a “baseline” Safety Supervisor (refer to Section 5-4) for high-integrity device control and one or more Safety Validator instances for highintegrity safety I/O connections. It is optional for safety profiles to support the SNCT implementation of the Safety Supervisor, but is highly recommended since the profile then includes a common, TUV-certified configuration solution. All safety profile definitions shall specify which level (i.e. Baseline or SNCT) of Safety Supervisor is required.

求められる基本的な安全機能

すべてのSafety Device(安全デバイス)は、最低限、基本となる安全機能を備えている必要があります。CIP Safety対応デバイスは、この基本機能を土台として、必要な安全機能を追加して構成されます。

  • デバイスを高い安全完全性で制御するための、基本構成の Safety Supervisor
  • 高い安全完全性を持つSafety I/O通信を処理するための、1つ以上の Safety Validatorインスタンス

Safety Supervisorは、安全デバイス全体の状態や設定を管理する重要な役割を持ちます。一方、Safety ValidatorはSafety I/O Connectionを通じてやり取りされる安全データを検証し、通信の完全性を確保する役割を担います。

つまり、CIP Safetyデバイスの最低構成を概念的に表すと、

Safety Device
Safety Supervisor
+ 1個以上の Safety Validator

になります。

モード変更:executing

この機能は、I/O Connectionとは独立して「Executing(実行中)」状態をサポートする必要があるLogic Deviceで必須となります。また、Safety Deviceでモード変更を実行する際には、パスワードが必要です。

こちらはWiresharkから取ったPacket Capatureです。

Event

IDLE時の動作

EXECUTING時の動作

コメント

安全接続に失敗しました/接続が切断されました

IDLEのまま

Standard I/O または Safety I/O Connection が1つでもOpenのままであれば、EXECUTINGを維持する。それ以外の場合はIDLEへ遷移する

このプロファイルでは、Standard I/O または Safety I/O Connection が少なくとも1つ確立されていない限り、デバイスはIDLE状態となる

標準または安全I/O接続が確立されました

EXECUTINGへ遷移する

EXECUTINGを維持する

タイプ1 セーフティオープン

デバイスを設定し、EXECUTINGへ遷移する

Standard I/OおよびSafety I/O Connectionを切断し、デバイスを設定した後、EXECUTINGへ戻る

安全I/O接続が削除されました

サポートしない

サポートしない

Connectionの削除はサポートされない

モード変更

エラー応答:“Service Not Supported”

エラー応答:“Service Not Supported”

このプロファイルではMode Changeは定義されていない

Lock/Unlock

SNCTインターフェースに対応するCIP安全装置に必須で、Safety Device のコンフィグレーションをロックまたはアンロックする操作は、無条件に実行できるものではなく、パスワードを伴うサービスとして定義されています。こちらはWiresharkから取ったPacket Capatureです。

Implementation

ここから実装していきます。基本はNXR-SXD1204-CSTそのままで、プログラムだけを追加する形になります。

Sysmac Studio

Sysmac Studio側を構築します。

Program1 UNSEND Message

次はUSEND関数を使用し、NXR-SXD1204-CSTにLock/Unlock/Idle/Executingコマンドを送信するプログラムを作成します。

VAR

こちらはプログラムの変数になります。

Program

こちらはメインプログラムです。

// ============================================================
// INITIALISATION
// ============================================================
IF NOT InitDone THEN

// ——————————————————–
// Safety Supervisor Object
//
// Class = 16#39
// Instance = 1
// Attribute = none
// ——————————————————–
ReqPath.ClassID := UINT#16#39;
ReqPath.InstanceID := UINT#1;
ReqPath.isAttributeID := FALSE;
ReqPath.AttributeID := UINT#0;


// Clear request data
FOR i := 0 TO 26 DO
ReqData[i] := BYTE#16#00;
END_FOR;


// Clear response data
FOR i := 0 TO 31 DO
RespData[i] := BYTE#16#00;
END_FOR;


// ——————————————————–
// TUNID
//
// ここに実機のTUNIDを入れる
//
// TUNID[0..5] = SNN 6 bytes
// TUNID[6..9] = Node ID 4 bytes

// ——————————————————–
TUNID[0] := BYTE#16#01;
TUNID[1] := BYTE#16#00;
TUNID[2] := BYTE#16#00;
TUNID[3] := BYTE#16#00;
TUNID[4] := BYTE#16#04;
TUNID[5] := BYTE#16#00;

TUNID[6] := BYTE#16#01;
TUNID[7] := BYTE#16#FA;
TUNID[8] := BYTE#16#A8;
TUNID[9] := BYTE#16#C0;


// Initialise FB
fbCommand(
Execute := FALSE,
RoutePath := ’02\192.168.250.1′,
TimeOut := UINT#20,
ServiceCode := BYTE#16#53,
RqPath := ReqPath,
ServiceDat := ReqData[0],
Size := UINT#0,
RespServiceDat := RespData[0]
);

InitDone := TRUE;

END_IF;


// ============================================================
// COMMAND EDGE DETECTION
// ============================================================

// ————————————————————
// IDLE
// ————————————————————
IF CmdIdle AND NOT CmdIdleOld AND NOT Busy AND NOT SendReq THEN

Command := INT#1;

// Mode Change Service
CurrentService := BYTE#16#53;

// Mode
ReqData[0] := BYTE#16#00; // Idle

// Password = 16 bytes
FOR i := 1 TO 16 DO
ReqData[i] := BYTE#16#00;
END_FOR;

CurrentSize := UINT#17;

SendReq := TRUE;

END_IF;


// ————————————————————
// EXECUTING
// ————————————————————
IF CmdExecuting AND NOT CmdExecOld AND NOT Busy AND NOT SendReq THEN

Command := INT#2;

// Mode Change Service
CurrentService := BYTE#16#53;

// Mode
ReqData[0] := BYTE#16#01; // Executing

// Password = 16 bytes
FOR i := 1 TO 16 DO
ReqData[i] := BYTE#16#00;
END_FOR;

CurrentSize := UINT#17;

SendReq := TRUE;

END_IF;


// ————————————————————
// LOCK
// ————————————————————
IF CmdLock AND NOT CmdLockOld AND NOT Busy AND NOT SendReq THEN

Command := INT#3;

// Configuration Lock / Unlock Service
CurrentService := BYTE#16#52;

// Value
ReqData[0] := BYTE#16#01; // Lock

// Password = 16 bytes
FOR i := 1 TO 16 DO
ReqData[i] := BYTE#16#00;
END_FOR;

// TUNID = 10 bytes
FOR i := 0 TO 9 DO
ReqData[i + 17] := TUNID[i];
END_FOR;

// 1 byte Value
// + 16 byte Password
// + 10 byte TUNID
// = 27 bytes
CurrentSize := UINT#27;

SendReq := TRUE;

END_IF;


// ————————————————————
// UNLOCK
// ————————————————————
IF CmdUnlock AND NOT CmdUnlockOld AND NOT Busy AND NOT SendReq THEN

Command := INT#4;

// Configuration Lock / Unlock Service
CurrentService := BYTE#16#52;

// Value
ReqData[0] := BYTE#16#00; // Unlock

// Password = 16 bytes
FOR i := 1 TO 16 DO
ReqData[i] := BYTE#16#00;
END_FOR;

// TUNID = 10 bytes
FOR i := 0 TO 9 DO
ReqData[i + 17] := TUNID[i];
END_FOR;

CurrentSize := UINT#27;

SendReq := TRUE;

END_IF;


// ============================================================
// SAVE PREVIOUS COMMAND STATES
// ============================================================
CmdIdleOld := CmdIdle;
CmdExecOld := CmdExecuting;
CmdLockOld := CmdLock;
CmdUnlockOld := CmdUnlock;


// ============================================================
// CIP UCMM SEND
//
// Target:
// NXR-S 192.168.250.1
//
// Safety Supervisor:
// Class 16#39
// Instance 1
//
// Services:
// 16#53 = Mode Change
// 16#52 = Configuration Lock / Unlock
// ============================================================
fbCommand(
Execute := SendReq,

RoutePath := ’02\192.168.250.1′,

// 2.0 sec
TimeOut := UINT#20,

ServiceCode := CurrentService,

RqPath := ReqPath,

// Arrayの場合は先頭Element
ServiceDat := ReqData[0],

Size := CurrentSize,

// Response Arrayも先頭Element
RespServiceDat := RespData[0],

Done => Done,
Busy => Busy,
Error => Error,
ErrorID => ErrorID,
ErrorIDEx => ErrorIDEx,
RespSize => RespSize
);


// ============================================================
// RESET EXECUTE
// ============================================================
IF Busy THEN
SendReq := FALSE;
END_IF;

IF Done THEN
SendReq := FALSE;
Command := INT#0;
END_IF;

IF Error THEN
SendReq := FALSE;
Command := INT#0;
END_IF;

ダウンロード

最後はプログラムをCPUにDownloadしましょう。

結果

こちらの動画から動作確認できます。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする