PR

【VBA】PLCとのシリアル通信で制御文字を可視化する

PC関連
記事内に広告が含まれています。

こんにちは、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

タイトルとURLをコピーしました