OMRON PLCでKEYENCE PLCのメモリを読み書き

# OMRON NJ/NXシリーズPLCからKEYENCE KVシリーズへメッセージ通信をするSysmacStudioライブラリを作成しました
このライブラリではKVシリーズPLCの状態やメモリの読み書きができます

https://osdes.com/oms/sample/PlcLink/KvLink.html

# KvLink Liblary
OMRON Sysmac Studio NJ/NXシリーズ  
[KEYENCE KVシリーズと接続](https://osdes.com/oms/sample/PlcLink/KvLink.html "https://osdes.com/oms/sample/PlcLink/KvLink.html")

## ライブラリの概要
KEYENCE KVシリーズの内臓Ethernetポートに対してメッセージ通信を行いPLCの状態やメモリの読み書きをします  
次の２つのタイプのメッセージを使って通信するライブラリです
- [上位リンク](#上位リンク通信)
- [CIP通信](#cip通信)
  
## 上位リンク通信
### FB一覧
名前空間 ： KvLink
<table>
    <tr>
        <td width = 200>HostLinkRunModeRead</td>
        <td width = 400>動作モード確認</td>
    </tr>
    <tr>
        <td>HostLinkRunModeChange</td>
        <td>モード変更</td>
    </tr>
    <tr>
        <td>HostLinkUnitType</td>
        <td>機種の問い合わせ</td>
    </tr>
    <tr>
        <td>HostLinkErrClr</td>
        <td>エラークリア</td>
    </tr>
    <tr>
        <td>HostLinkEr</td>
        <td>エラー番号確認</td>
    </tr>
    <tr>
        <td>HostLinkSetTime</td>
        <td>時刻設定</td>
    </tr>
    <tr>
        <td>HostLinkSet</td>
        <td>強制セット</td>
    </tr>
    <tr>
        <td>HostLinkReset</td>
        <td>強制リセット</td>
    </tr>
    <tr>
        <td>HostLinkSts</td>
        <td>連続強制セット</td>
    </tr>
    <tr>
        <td>HostLinkRss</td>
        <td>連続強制リセット</td>
    </tr>
    <tr>
        <td>HostLinkRead</td>
        <td>データ読出し</td>
    </tr>
    <tr>
        <td>HostLinkReads</td>
        <td>連続データ読出し</td>
    </tr>
    <tr>
        <td>HostLinkWrite</td>
        <td>データ書き込み</td>
    </tr>
    <tr>
        <td>HostLinkWrites</td>
        <td>連続データ書き込み</td>
    </tr>
    <tr>
        <td>HostLinkMBR</td>
        <td>モニタ読出し（ビット）</td>
    </tr>
    <tr>
        <td>HostLinkMWR</td>
        <td>モニタ読出し（ワード）</td>
    </tr>
</table>

### HostLinkRunModeRead - 動作モード確認
<dl>
    <dd>
        入力<br>
        <table>
            <tr>
                <td>IpAddress</td>
                <td>ReciveData</td>
            </tr>
        </table>
        <br>
        出力<br>
        <table>
            <tr>
                <td>ReciveData</td>
                <td>'0'=PROGRAM, '1'=RUN</td>
            </tr>
        </table>
    </dd>
</dl>

### HostLinkRunModeChange - モード変更
<dl>
    <dd>
        入力<br>
        <table>
            <tr>
                <td>IpAddress</td>
                <td>送信先IPアドレス</td>
            </tr>
            <tr>
                <td>RunMode</td>
                <td>FALSE=PROGRAM, TRUE=RUN</td>
            </tr>
        </table>
        <br>
        出力<br>
        <table>
            <tr>
                <td>ReciveData</td>
                <td>'OK'または'NG'</td>
            </tr>
        </table>
    </dd>
</dl>

### HostLinkUnitType - 機種の問い合わせ  
<dl>
    <dd>
        入力<br>
        <table>
            <tr>
                <td>IpAddress</td>
                <td>送信先IPアドレス</td>
            </tr>
        </table>
        <br>
        出力<br>
        <table>
            <tr>
                <td>ReciveData</td>
                <td>PLCの型式</td>
            </tr>
        </table>
        <br>
        PLCの型式<br>
        KV-8000 : 57	KV-8000A : 58	KV-7300 : 54<br>
        KV-7500 : 55	KV-3000 : 51	KV-5000 : 52<br>
        KV-5500 : 53	KV-NC32T : 128	KV-N60xx : 132<br>
        KV-N40xx : 133	KV-N24xx : 134  
    </dd>
</dl>


### HostLinkErrClr - エラークリア  
<dl>
    <dd>
        入力<br>  
        <table>
            <tr>
                <td>IpAddress</td>
                <td>送信先IPアドレス</td>
            </tr>
        </table>
        <br>
        出力<br>
        <table>
            <tr>
                <td>ReciveData</td>
                <td>'OK'または'NG'</td>
            </tr>
        </table>
    </dd>
</dl>

### HostLinkEr - エラー番号確認  
<dl>
    <dd>
        入力<br>
        <table>
            <tr>
                <td>IpAddress</td>
                <td>送信先IPアドレス</td>
            </tr>
        </table>
        <br>
        出力<br>
        <table>
            <tr>
                <td>ReciveData</td>
                <td>エラー番号</td>
            </tr>
        </table>
    </dd>
</dl>

### HostLinkSetTime- 時刻設定  
<dl>
    <dd>
        送信元PLCの時刻と合わせます<br>
        入力<br>
        <table>
            <tr>
                <td>IpAddress</td>
                <td>送信先IPアドレス</td>
            </tr>
        </table>
        <br>
        出力<br>
        <table>
            <tr>
                <td>ReciveData</td>
                <td>'OK'または'NG'</td>
            </tr>
        </table>
    </dd>
</dl>

### HostLinkSet - 強制セット 
<dl>
    <dd>
        入力<br>
        <table>
            <tr>
                <td>IpAddress</td>
                <td>送信先IPアドレス</td>
            </tr>
            <tr>
                <td>Address</td>
                <td>ビットデバイス</td>
            </tr>
        </table>
        <br>
        出力<br>
        <table>
            <tr>
                <td>ReciveData</td>
                <td>'OK'または'NG'</td>
            </tr>
        </table>
    </dd>
</dl>

### HostLinkReset - 強制リセット 
<dl>
    <dd>
        入力<br>
        <table>
            <tr>
                <td>IpAddress</td>
                <td>送信先IPアドレス</td>
            </tr>
            <tr>
                <td>Address</td>
                <td>ビットデバイス</td>
            </tr>
        </table>
        <br>
        出力<br>
        <table>
            <tr>
                <td>ReciveData</td>
                <td>'OK'または'NG'</td>
            </tr>
        </table>
    </dd>
</dl>

### HostLinkSts - 連続強制セット 
<dl>
    <dd>
        入力<br>
        <table>
            <tr>
                <td>IpAddress</td>
                <td>送信先IPアドレス</td>
            </tr>
            <tr>
                <td>Address</td>
                <td>ビットデバイス</td>
            </tr>
            <tr>
                <td>Size</td>
                <td>書込み個数</td>
            </tr>
        </table>
        <br>
        出力<br>
        <table>
            <tr>
                <td>ReciveData</td>
                <td>'OK'または'NG'</td>
            </tr>
        </table>
    </dd>
</dl>

### HostLinkRss - 連続強制リセット 
<dl>
    <dd>
        入力<br>
        <table>
            <tr>
                <td>IpAddress</td>
                <td>送信先IPアドレス</td>
            </tr>
            <tr>
                <td>Address</td>
                <td>ビットデバイス</td>
            </tr>
            <tr>
                <td>Size</td>
                <td>書込み個数</td>
            </tr>
        </table>
        <br>
        出力<br>
        <table>
            <tr>
                <td>ReciveData</td>
                <td>'OK'または'NG'</td>
            </tr>
        </table>
    </dd>
</dl>

### HostLinkRead - データ読出し
<dl>
    <dd>
        入力<br>
        <table>
            <tr>
                <td>IpAddress</td>
                <td>送信先IPアドレス</td>
            </tr>
            <tr>
                <td>Address</td>
                <td>ワードデバイス</td>
            </tr>
        </table>
        <br>
        出力<br>
        <table>
            <tr>
                <td>ReciveData</td>
                <td>受信データ</td>
            </tr>
        </table>
    </dd>
</dl>

### HostLinkReads - 連続データ読出し
<dl>
    <dd>
        入力<br>
        <table>
            <tr>
                <td>IpAddress</td>
                <td>送信先IPアドレス</td>
            </tr>
            <tr>
                <td>Address</td>
                <td>ワードデバイス</td>
            </tr>
            <tr>
                <td>Size</td>
                <td>読出し個数</td>
            </tr>
        </table>
        <br>
        出力<br>
        <table>
            <tr>
                <td>ReciveData</td>
                <td>受信データ （スペース区切り）</td>
            </tr>
        </table>
    </dd>
</dl>

### HostLinkWrite - データ書き込み
<dl>
    <dd>
        入力<br>
        <table>
            <tr>
                <td>IpAddress</td>
                <td>送信先IPアドレス</td>
            </tr>
            <tr>
                <td>Address</td>
                <td>ワードデバイス</td>
            </tr>
            <tr>
                <td>WriteData</td>
                <td>書込みデータ</td>
            </tr>
        </table>
        <br>
        出力<br>
        <table>
            <tr>
                <td>ReciveData</td>
                <td>'OK'または'NG'</td>
            </tr>
        </table>
    </dd>
</dl>

### HostLinkWrites - 連続データ書き込み
<dl>
    <dd>
        入力<br>
        <table>
            <tr>
                <td>IpAddress</td>
                <td>送信先IPアドレス</td>
            </tr>
            <tr>
                <td>Address</td>
                <td>ワードデバイス</td>
            </tr>
            <tr>
                <td>Size</td>
                <td>書込み個数</td>
            </tr>
            <tr>
                <td>WriteData</td>
                <td>書込みデータ （スペース区切り）</td>
            </tr>
        </table>
        <br>
        出力<br>
        <table>
            <tr>
                <td>ReciveData</td>
                <td>'OK'または'NG'</td>
            </tr>
        </table>
    </dd>
</dl>

### HostLinkMBR - モニタ読出し（ビット）
<dl>
    <dd>
        入力<br>
        <table>
            <tr>
                <td>IpAddress</td>
                <td>送信先IPアドレス</td>
            </tr>
            <tr>
                <td>Devices</td>
                <td>ビットデバイス （スペース区切り）</td>
            </tr>
        </table>
        <br>
        出力<br>
        <table>
            <tr>
                <td>ReciveData</td>
                <td>受信データ （スペース区切り）</td>
            </tr>
        </table>
    </dd>
</dl>

### HostLinkMWR  - モニタ読出し（ワード）
<dl>
    <dd>
        入力<br>
        <table>
            <tr>
                <td>IpAddress</td>
                <td>送信先IPアドレス</td>
            </tr>
            <tr>
                <td>Devices</td>
                <td>ワードデバイス （スペース区切り）</td>
            </tr>
        </table>
        <br>
        出力<br>
        <table>
            <tr>
                <td>ReciveData</td>
                <td>受信データ （スペース区切り）</td>
            </tr>
        </table>
    </dd>
</dl>

### ビットデバイス
R0, B0, MR0, LR0, CR0, T0, C0, CTC0, VB0 等

### ワードデバイス
R0, B0, MR0, LR0, CR0, VB0, DM0, EM0, FM0, ZF0, W0, TM0, Z1, T0, TC0, TS0, C0, CC0, CS0, AT0, CM0, VM0 等

データ形式<br>
.U .S .D .L .H を指定可能

### レスポンス (ReciveData)
正常時
|O|K|[CR]|[LF]|
|:-:|:-:|:-:|:-:|

正常時 （データあり）
|データ１|sp|データ２|sp|データ３|sp|...|データｎ|[CR]|[LF]|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|

sp=スペース

異常時
|E|?|[CR]|[LF]|
|:-:|:-:|:-:|:-:|

E0 = デバイス番号異常<br>
E1 = コマンド異常<br>
E2 = プログラム未登録<br>
E3 = 書込み禁止<br>
E4 = コマンド異常<br>
E5 = 本体エラー<br>
E6 = コメントなし<br>


## CIP通信
CIP通信はEthernet/IPユニットのメッセージ通信（サーバ）機能を利用してデータの読出しなどをします

### FB一覧
名前空間 ： KvLink
<table>
    <tr>
        <td width = 200>CipRunModeRead</td>
        <td width = 400>動作モード確認</td>
    </tr>
    <tr>
        <td>CipRunModeChange</td>
        <td>モード変更</td>
    </tr>
    <tr>
        <td>CipUnitType</td>
        <td>機種の問い合わせ</td>
    </tr>
    <tr>
        <td>CipErrClr</td>
        <td>エラークリア</td>
    </tr>
    <tr>
        <td>CipEr</td>
        <td>エラー番号確認</td>
    </tr>
    <tr>
        <td>CipReads</td>
        <td>連続データ読出し</td>
    </tr>
    <tr>
        <td>CipWrites</td>
        <td>連続データ書き込み</td>
    </tr>
</table>

### CipRunModeRead - 動作モード確認 
<dl>
    <dd>
        入力<br>
        <table>
            <tr>
                <td>RoutePath</td>
                <td>ルートパス</td>
            </tr>
        </table>
        <br>
        出力<br>
        <table>
            <tr>
                <td>RespDat</td>
                <td>00=PROGRAM, 01=RUN</td>
            </tr>
        </table>
    </dd>
</dl>

### CipRunModeChange - モード変更
<dl>
    <dd>
        入力<br>
        <table>
            <tr>
                <td>RoutePath</td>
                <td>ルートパス</td>
            </tr>
            <tr>
                <td>RunMode</td>
                <td>FALSE=PROGRAM, TRUE=RUN</td>
            </tr>
        </table>
        <br>
        出力<br>
        <table>
            <tr>
                <td>RespDat</td>
                <td>受信データ</td>
            </tr>
        </table>
    </dd>
</dl>

### CipUnitType - 機種の問い合わせ
<dl>
    <dd>
        入力<br>
        <table>
            <tr>
                <td>RoutePath</td>
                <td>ルートパス</td>
            </tr>
        </table>
        <br>
        出力<br>
        <table>
            <tr>
                <td>RespDat</td>
                <td>PLCの型式</td>
            </tr>
        </table>
    </dd>
</dl>
PLCの型式<br>
KV-8000 : 39	KV-8000A : 3A	KV-7300 : 36<br>
KV-7500 : 37	KV-3000 : 33	KV-5000 : 34<br>
KV-5500 : 35	KV-NC32T : 80	KV-N60xx : 84<br>
KV-N40xx : 85	KV-N24xx : 86<br>

### CipErrClr - エラークリア
<dl>
    <dd>
        入力<br>
        <table>
            <tr>
                <td>RoutePath</td>
                <td>ルートパス</td>
            </tr>
        </table>
        <br>
        出力<br>
        <table>
            <tr>
                <td>RespDat</td>
                <td>受信データ</td>
            </tr>
        </table>
    </dd>
</dl>

### CipEr - エラー番号確認
<dl>
    <dd>
        入力<br>
        <table>
            <tr>
                <td>RoutePath</td>
                <td>ルートパス</td>
            </tr>
        </table>
        <br>
        出力<br>
        <table>
            <tr>
                <td>RespDat</td>
                <td>エラー番号</td>
            </tr>
        </table>
    </dd>
</dl>

### CipReads - 連続データ読出し
<dl>
    <dd>
        入力<br>
        <table>
            <tr>
                <td>RoutePath</td>
                <td>ルートパス</td>
            </tr>
            <tr>
                <td>Device</td>
                <td>デバイス種別</td>
            </tr>
            <tr>
                <td>Address</td>
                <td>デバイス番号</td>
            </tr>
            <tr>
                <td>DataType</td>
                <td>データ形式<br>0=初期値, 1=ワード, 2=2ワード, 3=ビット</td>
            </tr>
            <tr>
                <td>ReadSize</td>
                <td>デバイス数</td>
            </tr>
        </table>
        <br>
        出力<br>
        <table>
            <tr>
                <td>RespSize</td>
                <td>受信バイト数</td>
            </tr>
            <tr>
                <td>RespDat</td>
                <td>受信データ</td>
            </tr>
        </table>
    </dd>
</dl>

### CipWrites - 連続データ書き込み
<dl>
    <dd>
        入力<br>
        <table>
            <tr>
                <td>RoutePath</td>
                <td>ルートパス</td>
            </tr>
            <tr>
                <td>Device</td>
                <td>デバイス種別</td>
            </tr>
            <tr>
                <td>Address</td>
                <td>デバイス番号</td>
            </tr>
            <tr>
                <td>DataType</td>
                <td>データ形式<br>0=初期値, 1=ワード, 2=2ワード, 3=ビット</td>
            </tr>
            <tr>
                <td>WriteSize</td>
                <td>書込みバイト数</td>
            </tr>
            <tr>
                <td>WriteData</td>
                <td>書込みデータ</td>
            </tr>
        </table>
        <br>
        出力<br>
        <table>
            <tr>
                <td>RespDat</td>
                <td>受信データ</td>
            </tr>
        </table>
    </dd>
</dl>

### レスポンス (RespDat)
メモリの状態が以下のとき
|MR0|MR1|MR2|MR3|MR4|MR5|MR6|MR7|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|ON|ON|ON|ON|OFF|ON|OFF|OFF|

DataType = 3 （ビット）の場合
|01|01|01|01|00|01|00|00|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|

DataType = 1または2 （ワード）の場合
|FF|02|
|:-:|:-:|