こんにちは、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出来ませんので、下のリンクに準備しておきます。
使い方はわかりやすいマニュアルもありますから大丈夫だと思います。
ダウンロード後の初期設定等はこちらの記事で書いています。
2.PLCとのシリアル通信方法
今回ご紹介するコードで実際に通信を行っているPLC&関連機器をご紹介しておきます。
◆PLC
◆拡張ボード
◆シリアル-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関数でサムチェックコードを計算 PLCout = SumCheck(PLCcmd) '↓↓そしてこの様な形でPLCへコマンド送信する ec.AsciiLine = Chr$(&H5) & PLCout ’↓↓サムチェック計算用 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の読出し・書込みに関する記事は以下に書いています。
受信したデータでON/OFFを確認したり、送信したコマンドが正常か否かを
戻りのACKで確認するのですが、そのまま受信しただけではACKの様な制御文字は
文字化けして確認出来ないと思います。
そこの処理に関しては、私もこちらのサイトを参考にさせていただいてますので、
同様のコードで対処出来ると思います。
(制御文字の可視化については同サイト内のこちらにもサンプルコードがあります)
以上がEasyCommを使ったPLCとの送受信になります。
出来ることなら、このままずっとEasyComm使っていきたいなぁと思うRyoでした。
何かのご参考になれば幸いです。
Ryo