三菱Q#QJ7124N-R4_通信プロトコルを使う

#QJ7124N-R4とは？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/6589eec7-8265-5d07-b1d2-9ff2d3e50ca4.png)
QシリーズC24は，相手機器とQシリーズシーケンサCPUをシリアル通信用のRS-232,
RS-422/485回線で接続し，次に示すデータ交信を実現するためのユニットです。  
今回は通信プロトコルを使って通信することです。
そしてその中にある通信プロトコル支援機能を使います。

##通信プロトコルとは？

QJ71C24N(-R2/R4)と相手機器間でデータ交信をする際に，相手機器側のプロトコルでデータ送受信を行うデータ交信機能の1つ。GX Configurator-SC（ 通信プロトコル支援機能）にて設定を行う。

##通信プロトコル支援機能とは？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/e7ec5623-844c-3bb6-f6bf-2258baca979a.png)

簡単なStepとしては：
GX Configurator-SC（ 通信プロトコル支援機能）で使用できる機能。
以下に，機能の概要を示す。

- 相手機器に合わせたプロトコルの設定
- QJ71C24N(-R2/R4)のフラッシュROMへの，プロトコル設定データの書込み／読出し
- デバッグ支援機能

Step By Step:

1. GX Configurator-SC（通信プロトコル支援機能）で，相手機器のプロトコルを選択または作成／編集し， QJ71C24N(-R2/R4)のフラッシュROMにプロトコル設定データを書き込みます。
2. 専用命令（CPRTCL命令）で，フラッシュROMに書き込んだプロトコルを実行します。

##配線
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/70af55ff-3595-e946-1043-1f798c526695.png)

- SDA，SDB信号
    - QシリーズC24から相手機器へデータを送信するための信号です。
- RDA,RDB信号
    - QシリーズC24が相手機器からデータを受信するための信号です。
     
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/538868f0-8cf7-c250-2098-bf0128dd3454.png)

##専用命令
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/4772d69a-ce43-f942-4b8d-7547401e735f.png)
専用命令（CPRTCL命令）を使用することにより，一度に最大8プロトコルの連続実行ができます。
送信データ格納エリア，受信データ格納エリアを指定することで，デバイスやバッファメモリを通信パケットに組み込めます。

- 送信の場合
    - ユーザはチャンネル番号など，システムに依存する可変要素を，指定したデバイスやバッファメモリに設定します。QJ71C24N(-R2/R4)は，ユーザが指定したデバイスやバッファメモリに設定された値を送信パケットの指定位置に自動付加し， パケットを送信します。
- 受信の場合
    - QJ71C24N(-R2/R4)は，読み出し値など，必要なデータのみをユーザが指定したデバイスやバッファメモリに自動的に格納します。

###説明
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/2b8c3a21-0a1f-8414-35e9-9fef171d6267.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/487b5777-c74e-84a8-4b90-6c3a710990db.png)
##外見
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/b8c1c8b4-96b1-b536-73eb-27ea9a68f4da.png)
###LED
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/69ce4cd1-adc8-9b7a-031a-9b2cf154ea77.png)
##I/O割付
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/160d5a5d-f001-a076-76c2-8524d142c5af.png)
#GXWorks2バージョン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/f5583ff5-bc77-805c-79f3-27cb208745da.png)
##構成
###GXWorks側
まずハードウェア構成を設定します。PCパラメータを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/23c3e9e0-15a4-bf24-ed23-a57125f196f9.png)
次はI/O割付設定→右にあるユニット追加のボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/ce6672ee-bf2d-1ce6-66e6-1a74d185bc61.png)
このような画面が出てきます。
ユニット種別はシリアルコミュニケーション…なになにを選びます。
ユニット形名はQ71C24N-R4を選びます。
先頭アドレスはめんどくさいから０にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/4bd22b16-ee27-d95f-29b1-27b45fce4dd6.png)
###GX Configurator-SC
エラーなしにモジュール追加できたら、ツール→通信プロトコル支援機能→シリアルコミュニケーションユニットをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/73eca79b-88b4-f5c6-a852-45a3cf76ca3f.png)
新しいプロトコルFileを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/b87d47bf-ff5c-361a-db77-3d170cfbbf96.png)
以下のような画面が出てきます。
追加をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/ce878ea3-5742-63f1-9477-57237d61f610.png)
ここで新規追加を選択し、OKを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/819a591d-131f-ac98-8c83-6bfa8709b39d.png)
新しいプロトコルが１つ追加されました。
通信タイプは通信送信で、パケットはなにも設定してません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/e48ad07b-3f54-c143-7117-65e12451bbcb.png)

仮に相手側の送信Formatはこうにします：
>
＜STX>Station＋Cmd＋＜CR＞＜LF＞
Station:ASCII ‘00’-’99’
Cmd：ASCII３文字

そして通信Formatはこうにします：
>
<STX>Station＋Response＋<CR><LF>
Station:ASCII ‘00’-’99’
Response：ASCII３ー８文字

まず送信のほうを設定します。
送信の矢印→のとなりにあるパケット設定をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/ecfbc56e-f59e-fe3b-1f5c-7e8f21163ff6.png)
新規追加で固定データを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/08aacab8-7c71-c3ea-a93e-0fb11aacf921.png)
次はASCII制御コードを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/939b153b-d145-c182-7240-647b7d30b99f.png)
ここでSTXを選び、插入し、OKを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/33d6a80a-afa4-1f04-77de-14115ed32a77.png)
次はStationを設定します。
新規追加→変換なし変数をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/ad9b5dcb-a779-4547-bc9c-113aa2ddd90f.png)
構成要素名：なくてもエラーにならないけど、わかりやすくするためになにか入れよう。
固定長・可変長：Stationは"00”から”99”までなので固定長でもOKです。
格納エリア：D2000にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/f9e70fd6-134e-efe1-f202-04bf7623717f.png)
Cmdも3文字だけなので、固定長にして3を設定します。
格納はD2001にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/b5533db5-2c8c-075e-69d8-22843e691278.png)
こんな感じですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/02bd0eb7-50fb-7b19-c5ca-6703abb6ba46.png)
今度受信側を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/1d1ad398-6ce7-a447-d16c-2e12f9cf21ed.png)
相手側からもらうResponseが３－８文字なので、ここは可変長します。そうしないとTimeoutになります。最大データ長ちょっと余裕をもって10Bytesにします。
可変長なので、受信格納データ以外に受信データ長格納エリアにも設定が必要です。
つまり、最終的になんBytesもらったかをここに書き込んでいます。
D3021：受信データ長格納エリア
D3022-3026：受信格納データエリア
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/5dfc8c9b-f078-eebe-6252-53b9ff08658e.png)
最後はCRLF入れれば完成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/18ccb3b6-d48b-3d3a-d6f5-d6da731a5081.png)
こんな感じになりますね。
あとちょっとメモしないといけないのは、先作ったプロトコルは番号1ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/6f75b815-0c50-7f19-aa11-8e8cb2cc69e2.png)
次は作ったものをユニットに書き込みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/fe660b36-6dac-ca74-9770-b7849869f683.png)
もしモジュール1つ以上あれば正しいアドレスを選んでください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/22ca0167-ad1e-adb2-d5e3-0525a69dad13.png)
##PLCプログラム
ここから三菱のプログラムを組みます。自分はあまり三菱得意ではないので本当に
簡単なサンプルしか提供できません。まずはモジュールリセットですね。
なんでY0EとY0Fはそれぞれのチャネルをリセットするデバイスなのか、先のアドレス表に参照してください。もし実際に使うシリアル通信のモジュールは1つ以上なら構造体にしたほうが便利かもしれませんね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/ad2f45e0-a815-0ddc-8c66-20f96472fecc.png)
M1はなにかのトリガーですね。1sパルスでもいいですし、Stepでもなんでもいいです。
そのとき相手側とつながってるチャネルを設定し(1,2）、実行するプロトコルの番号を与え、最後は連続実行数を与えておけば基本的はOKです。
連続実行数はサンプル2で説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/4cdccd7d-e395-af85-0705-97dbe9327ee1.png)
まず、Station番号”01”をD2000に書き込みます。
つぎ、Cmdを”CMD"をD2001に書き込みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/340543ee-46bd-6018-e122-e080a0a6570f.png)
同じく、なぜX1EがモジュールReadyなのか、先のアドレス表に参照ください。
使用する命令はG.CPRTCLです。GP.CPRTCLはG.CPRTCLのパルスバージョンです。
”通信プロトコル支援機能でフラッシュROMに書き込んでたプロトコル、および特殊プロトコルを実行します”のことができるようです。
実行終わったたらD10(実行結果が格納されたデバイス)が0ならエラーなし、0でなければなにかのエラーがあることです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/75ea459e-2d0f-cc4a-ce6f-ceb8e20b1330.png)
そのとき、D3020はStation名、D3021は受け取ったデータの長さ、D3022からD3026まではもらったデータです。

###連続実行数
例えば、いまのデバイスが一つの項目設定するのに、二回コマンドを送らないといけないことにしましょう。つまりHandShakeがあるって感じですね。
>
＜STX＞Station＋Cmd＋＜CR＞＜LF＞
Station:ASCII ‘00’-’99’
Cmd：ASCII３文字

そして通信Formatはこうにします：
>
＜STX＞Station＋”ACC"＋＜CR＞＜LF＞

次に、
>
＜STX＞Station＋Data＋＜CR＞＜LF＞
＜STX＞Station＋”OK"＋＜CR＞＜LF＞
Station:ASCII ‘00’-’99’
Response：ASCII３ー８文字

そのとき、もちろん二回GP.CPRTCLを実行するのも大丈夫ですがこの連続実行数を”2”にすれば、1つめのプロトコルが実行終わったら自動的に2つめのプロトコルを実行してくれる。（確かに最大8まで。）
（S）＋３は2番め実行したいプロトコルの番号。
N2は今度2を入れます。
なのでいまの構成だとまず（S）＋２のプロトコル(番号２)実行し、終わったら自動的に
（S）＋３（番号３）を実行する、だけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/410109be-85d2-1b92-2582-7388bd906923.png)

以上になりますーお疲れ様です。