VBAでEasyCommを使用した三菱MELSEC-FXとのシリアル通信

こんにちは、Ryoです。
工場で働いていれば必ず機械装置があって、その制御には必ずと言って良いぐらいPLC
Programmable Logic Controller)が使われてますよね。
その中で製品特性を測定する装置は検査データを管理する都合上PCを接続して
データ収集や保存作業等を行うことが多いと思います。

この場合、データ収集する都合で考えれば測定条件を監視し開始タイミングを決めて、
測定データが安定したら読み込み、計測機器のCh変更、合否判定等々。。。をPC側で
制御する為にはPLCをコントロールする必要が出てきます。

今回は主に計測制御として使用しているEasyComm&VBAでPLC-シリアル通信をする為の
送受信コマンドについてご紹介したいと思います。

普段はVBのSerialPortクラスを使って組んでいますが、簡易的な計測制御とデータ収集の場合はExcel-VBA上で完結した方がオペレータが使いやすいということもあり、EasyCommを今でも使わせていただいています。



1.EasyCommについて

これはアクティブセルの木下さんが作られたフリーソフトなのですが、非常に完成度が
高いものなので使いやすい上に、私が今まで使ってきた計測器制御の通信であれば、EasyCommに絡むエラーは発生していないですから素晴らしいと思います。

2004年にはサポート終了されてしまっていますが、それから13年経過した今でも
Win7やWin10では何の支障もなく動作しています。
ここまでのソフトを無償で提供してサポートまで尽力されてた木下さんという方は
本当に立派な方だと心底思います。

現在はアクティブセルサイトでDL出来ませんので、下のリンクに準備しておきます。
使い方はわかりやすいマニュアルもありますから大丈夫だと思います。

EasyCommのダウンロードはこちら!

ダウンロード後の初期設定等はこちらの記事で書いています。

こんにちは、Ryoです。 私が今も愛用させていただいているEasyComm関連で来られる方が多いようで嬉しいですね。 これまでご...

2.PLCとのシリアル通信方法

今回ご紹介するコードで実際に通信を行っているPLC&関連機器をご紹介しておきます。

<< 三菱電機(制御) FX3S-30MT/ES

小規模の制御に適したベーシック機。CPU・電源・
入出力が一体のオールインワン。

FX3G-232-BD
FXシリーズシーケンサ 機能拡張ボード  >>

上に紹介しているFX3Sのシリアル通信用
拡張ボードです。


<< ELECOM USBtoシリアルケーブル
   USBオス-RS-232C用 UC-SGT1

   コネクタ:RS-232Cコネクタ D-Sub9ピン(オス)
   ケーブル長:0.5m

   シリアル-USB変換ケーブルです。

そして以下に記載するのがPLCとのシリアル通信サンプルコードになります。


 ec.COMn = 1
  
 '//ボーレート9600、パリティなし、データビット8、ストップビット1//
  ec.Setting = "9600,n,8,1"
 '//CR/LFをデリミタに設定(AsciiLineプロパティに文字列代入時、設定したデリミタ文字が末尾に付加//
  ec.Delimiter = "CRLF"
  ec.AsciiLineTimeOut = 1500
  
 '//局番0/M330がONしているかの読み込み//
  ec.AsciiLine = Chr$(&H5) & "00FFBRAM03300135"
  ec.WAITmS = 150     
  A$ = ec.AsciiLine '//受信

  

ec.COMn=1はCOMポート1の指定です。
次に通信設定をしますが、ここは機器との通信環境によって変わります。
デリミタ付加設定、タイムアウト設定はこれがほぼデフォルトな気がします。

ec.AsciiLineでPLCへコマンドを送信しますが、
ここに記述している”00FFBRAM033001″まではMELSEC-Fのマニュアルに記載された
コマンドと同様になります。

残りの”35″は”00FFBRAM033001″の16進数合計(下2桁)がサムチェックコードになり、
それが”35″なのですが、この記述ですと毎回自分で計算することになります。
そうなると面倒なので、以下の様にサムチェック計算用関数を作って処理します。


 '//予め変数にコマンドをセットしておく
 PLCcmd = "00FFBRAM033001"
 '//この場合SumCheck関数でサムチェックコードを計算
  PLC_out = SumCheck(PLCcmd)
 '↓↓そしてこの様な形でPLCへコマンド送信する
  ec.AsciiLine = Chr$(&H5) & PLC_out

 ’↓↓サムチェック計算用
 Function SumCheck(PLCcmd)

    Dim i As Integer
    Dim leng As Integer
    Dim DT, Ct As Variant
    
    leng = Len(PLCcmd)

    For i = 1 To leng
      DT = Asc(Mid(PLCcmd, i, 1))
      Ct = Ct + DT
    Next i

    SumC = Right(Hex$(Ct), 2)
    SumCheck = PLCcmd & SumC
    
 End Function

MELSEC-Fのマニュアルで決められたコマンドはPC-PLC間でやり取りしますから、
予め変数にセットしておくと良いと思います。
後はサムチェック計算用関数に渡し、16進数に変換させながら加算させていき、
最終的な計算値から下二桁を抜き取ってコマンドに付加して戻します。




PLCの読出し・書込みに関する記事は以下に書いています。

こんにちは、Ryoです。 VBAでシリアル通信を行う相手側がシーケンサー(PLC)であることは多いかと思います。 その際に一番多...

受信したデータでON/OFFを確認したり、送信したコマンドが正常か否かを
戻りのACKで確認するのですが、そのまま受信しただけではACKの様な制御文字は
文字化けして確認出来ないと思います。

そこの処理に関しては、私もこちらのサイトを参考にさせていただいてますので、
同様のコードで対処出来ると思います。

(制御文字の可視化については同サイト内のこちらにもサンプルコードがあります)

こんにちは、Ryoです。 以前の記事「VBAでEasyCommを使用した三菱MELSEC-FXとのシリアル通信」でVBAとPLC ...

以上がEasyCommを使ったPLCとの送受信になります。
出来ることなら、このままずっとEasyComm使っていきたいなぁと思うRyoでした。
何かのご参考になれば幸いです。

Ryo

スポンサーリンク
スポンサーリンク

楽天トラベル

シェアする

フォローする

スポンサーリンク

楽天トラベル