こんにちは、Ryoです。
以前の記事「VBAでEasyCommを使用した三菱MELSEC-FXとのシリアル通信」でVBAとPLC
(シーケンサー)の通信について触れていますが、送受信の完了確認を行う上で必要となる
制御文字の可視化についてはあまり書いていませんでしたので、今回はその部分のサンプル
コードを踏まえて解説したいと思います。
1.制御文字とは?
文字コードの規格で定義される文字のうち、「ディスプレイ・プリンター・通信装置」などに対して、特別な動作(制御)をさせるために使う文字のことを指します。
「文字」という名前であるものの、ディスプレイやプリンターには表示されませんので、
「非表示文字」とも言います。
【ASCIIコード表(抜粋)】参照元はこちら
・ASCIIでは0から31および127が制御文字に割り当てられています。
PLCとの送受信に於いて使用頻度が高いのは「ACK」「NAK」ですが、非表示文字なだけに
普通に受信しただけでは表示されず、可視化しない状態でVBAのInStrなどで読もうとしても
読めませんので処理が必要になります。
2.サンプルコード
◆PLCとの通信サンプルコード
Sub PLC_Sample() Dim cmd, A As String ec.COMn = 3 '//ボーレート9600、パリティなし、データビット8、ストップビット1// ec.Setting = "9600,n,8,1" ec.WAITmS = 500 '//CR/LFをデリミタに設定(AsciiLineプロパティに文字列代入時、設定したデリミタ文字が末尾に付加// ec.Delimiter = "CRLF" ec.AsciiLineTimeOut = 1500 '//例:PLCへM350をONする命令を送信// ec.AsciiLine = Chr$(&H5) & "00FFBW0M03500115C" ec.WAITmS = 300 '//受信、データの制御コードをFunctionコード変換()にて可視化// A$ = ec.AsciiLine cmd = コード変換(A) '//セルA1に受信データを表示/ Cells(1, 1) = cmd ec.COMn = -1 End Sub
PLCとの通信はEasyCommを使って行います。
本サンプルの接続に使用しているPLCは「三菱電機 FX3S-30MT/DS シーケンサ本体 (入力点数: 16点) 」になります。
そのPLCコマンドに従ってM350をONするコマンドを送信し、受信データの制御文字を
「Function コード変換()」(制御文字を可視化する関数)にて読めるようにします。
ちなみに可視化する関数を使わないとこのサンプルでの受信データは「・00FF」となり
「ACK」が表示される部分が「・」になります。
◆制御文字可視化の関数
Function コード変換(A) '参照元:http://thom.hateblo.jp/entry/2015/11/14/002537 '//PLCからの受信データACK/NAK等を可視化する// Dim ret As String Dim 制御コード() As String '******************************************************* '制御コード:動的配列宣言しSplit関数にて配列の中身を作成 '******************************************************* 制御コード = Split("vbNullChar SOH STX ETX EOT ENQ ACK BEL vbBack vbTab" & _ "DC4 NAK SYN ETB CAN EM SUB ESC FS GS " & _ "RS US", " ") '********************************** '受信テキストの制御文字を可視化する '********************************** Dim 文字コード As Long Dim i As Long '//受信文字列の長さ分繰り返し処理を行う// For i = 1 To Len(A) '//文字列をMidで一文字ずつ切り出し、その文字をAsc関数でInteger型の文字コードに変換// 文字コード = Asc(Mid(A, i, 1)) If 0 <= 文字コード And 文字コード <= UBound(制御コード) Then '//一文字ずつ取得した文字コードが0~制御コードの個数に収まっていれば '制御コード配列から該当文字列取り出し// ret = ret & "{" & 制御コード(文字コード) & "}" Else '//違う場合はChr関数にて普通の文字に戻して表示する// ret = ret & Chr(文字コード) End If Next コード変換 = ret End Function
サンプルコード内にも記載していますが、こちらのサイトで紹介されているものをそのまま
使わせていただいています。
ec.AsciiLineで受信したデータを可視化する関数に渡し、制御文字に置換することで見える
状態になります。
先程のサンプルコードを実行すれば受信データは「{ACK}00FF」となります。
読込データであれば、送信コマンドを仮にM330のON/OFFを読むとすると、
ec.AsciiLine = Chr$(&H5) & “00FFBRAM03300135”
このコマンドになりますので、送信⇒受信すると「{STX}00FF1{ETX}20」となります。
以上がPLCとのシリアル通信で制御文字を可視化する内容になります。
VBAとEasyComm、そしてPLCを使って通信を検討されてましたら何かと有用では無いかと
思います。
何かのご参考になれば幸いです。
Ryo