こんにちは、Ryoです。
VBAでシリアル通信を行う相手側がシーケンサー(PLC)であることは多いかと思います。
その際に一番多く使うと思われるコマンドとしては読出しと書込みがありますので、三菱マイクロシーケンサMelsec FXシリーズになりますが、PLC側コマンド解説とVBAでの記述について書きます。
1.PLCコマンド「読出し」解説
Web検索などでもマニュアルは入手できると思いますが、その中の「計算機リンク」に基づき解説していきます。
◆コマンドとデバイスメモリの読出し・書込み
デバイスメモリ・ビット単位で書込みや読出しを行う場合、
BR : 一括読出し
BW : 一括書込み
この二つのコマンドをよく使います。
使用環境によって違うかもしれませんが、私の場合は殆どBRとBWで事足りてますね。
◆デバイス範囲
PLC型式によって上表の通り差異があります。
入力/出力リレーはPLCが外部機器制御に使いますので、PCと通信する場合は補助リレー(M)を使うことが多いのではないでしょうか。
◆デバイスメモリ・ビット単位の一括読出し<BRコマンド>
デバイス点数の指定範囲は次の条件を満足するように指定します。
・ 1≦デバイス点数≦256(256点の設定は00Hで指定)
・ 先頭デバイス番号+デバイス点数-1≦最大デバイス番号
局番号,PC番号,デバイス点数,サムチェックコードは、16進数で表現します。
ここまで見ると「何??」「よくわからんのだけど?」ってなりますよね。
マニュアルに沿った実例だとイメージしやすいと思いますので、説明します。
◆指定例
「局番“5”」のシーケンサ「X040~X044の5点」を読み出す。
伝文ウエイト時間は100ms
「X040~X044」はX040とX043がOFFで他はONとする。
≪PC側≫
指定例を当てはめるとこの様な形になります。
サムチェックコードは矢印範囲の16進数を加算し、下2桁の数値が当てはまります。
伝文ウェイトは0~150msまで10ms単位で指定し、0~FH(16進)で表現しますので、100msは“A”となります。
そして、VBAでEasyCommを使いコマンドを送信する時はこのように記述します。
'//PLC⇔PCのポートをCOM1と仮定// ec.COMn = 1 '//ボーレート9600、パリティなし、データビット8、ストップビット1// ec.Setting = "9600,n,8,1" ec.WAITmS = 500 '//CR/LFをデリミタに設定(AsciiLineプロパティに文字列代入時、設定したデリミタ文字が末尾に付加// ec.Delimiter = "CRLF" ec.AsciiLineTimeOut = 1500 '//局番5/X040~X044の読み込み// ec.AsciiLine = Chr$(&H5) & "00FFBRAX00400547"
COMポート、通信条件は使用環境によって適宜設定してください。
実際にPLCへコマンドを送信しているのは
ec.AsciiLine = Chr$(&H5) & “00FFBRAX00400547”
この部分になります。
ちなみに範囲ではなく、単一の場合(例:X040のみ読む)は
ec.AsciiLine = Chr$(&H5) & “00FFBRAX0040013E”
という形で指定すればOKです。(末尾3Eはサムチェックコード)
このサンプルではサムチェックコードも含めてコマンド指定していますが、実際に使用する際は別に関数処理した方が良いと思いますので、別記事のこちらを参照してください。
≪PLC(シーケンサー側)≫
PCからコマンドを送信して正常に処理されれば、上図の形で受信します。
X040~X044の状態については表で示す通り、0がOFF、1がONになります。
EasyCommで受信は以下になります。
'//局番5/X040~X044の読み込み// ec.AsciiLine = Chr$(&H5) & "00FFBRAX00400547" 'コマンド送信した後の受信 A$ = ec.AsciiLine
この記述で受信は出来ますが、STXやETXなどの制御文字は表示する為には別に処理が必要となりますので、以下の記事に対処を書いています。
制御文字を可視化し正常に受信出来れば{STX}05FF01101{ETX}05が返ってきます。
2.PLCコマンド「書込み」解説
◆デバイスメモリ・ビット単位の一括書込み<BWコマンド>
デバイス点数の指定範囲条件は以下になります。
・1 ≦ デバイス点数 ≦ 160
・先頭デバイス番号+デバイス点数ー1 ≦ 最大デバイス番号
局番号、PC番号、デバイス点数、サムチェックコードはBRコマンド同様に16進数表現です。
◆指定例
局番”0”、シーケンサーM903~M907の5点に書込む場合
(伝文ウェイト時間は0ms)
≪PC側≫
このコマンドをEasyCommで記述すると以下になります。
'//PLC⇔PCのポートをCOM1と仮定// ec.COMn = 1 '//ボーレート9600、パリティなし、データビット8、ストップビット1// ec.Setting = "9600,n,8,1" ec.WAITmS = 500 '//CR/LFをデリミタに設定(AsciiLineプロパティに文字列代入時、設定したデリミタ文字が末尾に付加// ec.Delimiter = "CRLF" ec.AsciiLineTimeOut = 1500 '//局番0/M903~M907の書込み// ec.AsciiLine = Chr$(&H5) & "00FFBW0M0903050110126"
COMポート、通信条件は使用環境によって適宜設定してください。
実際にPLCへコマンドを送信しているのは
ec.AsciiLine = Chr$(&H5) & “00FFBW0M0903050110126”
この部分になります。
ちなみに範囲ではなく、単一の場合(例:M903のみ書込む)は
ec.AsciiLine = Chr$(&H5) & “00FFBW0M090301160”
という形で指定すればOKです。(末尾60はサムチェックコード)
≪PLC(シーケンサー側)≫
ACK+「局番号」+「PC番号」として「ACK00FF」
PCからコマンドを送信して正常に処理されれば、上図の形で受信します。
ACKが返ってくれば書込みは正常に完了したと判断できます。
EasyCommでの受信や制御文字については読込と同様の処理になります。
3.まとめ
用途にもよりますが、VBAを使ってPC-PLC間でのシリアル通信では簡易的な制御に使用することが多いのではないかと思いますのでBRやBWコマンドの使用頻度は高いです。
EasyCommの場合、マニュアルで指定されているコマンドをほぼそのまま使えますから送受信自体も簡単ですのでお薦めです。
PLCのコマンドや他の手段などはMelsec Fシリーズのマニュアルに詳しく記載されてますので、参照されると良いと思います。
ただし、制御文字は処理しないと読めませんからご注意くださいね。
大事なことなので最後にもう一回言っておきました(笑)
以上がシリアル通信でのPLC(Melsec)読出・書込コマンド解説になります。
今回の記事が何かの参考になれば幸いです。
Ryo