PLC使用の真空管特性計測システム

投稿日 2016/10/21

真空管の静特性を計測するための真空管特性計測システムは以前から活用してきました(参考: 真空管試験システムの構成)が、今回コントローラをPLC(Programable Logic Controller)に置き換えてみました。

 

計測器をGP-IBでつないだ計測システムであることに変わりはないのですが、これまではWindowsPCを使用していたコントローラをPLCに置き換え、下図のような構成にしました。

PLC_真空管特性計測システム1.jpg

PLC使用の真空管特性計測システム構成図

これまでWindowsPCでGPIBの制御を行っていたが、PLCに置き換えた

Windows PCはEXCEL VBAのモニタ・制御画面に使用

WindowsPCからLAN経由のパソコンリンクコマンドで指令を出し、

PLC CPU内のGPIB制御ラダープログラムで計測器や電源を制御している

 

PLCに置き換えることのメリット

 

PLCは小型軽量で、GPIBモジュールの他にLAN, PID, AD, DA, DIOなど多様で高信頼のモジュールが用意されています。LAN経由で簡単に制御やモニタリングが可能です。

 

モジュールを増設していけば、多様な構成に対応可能です。たとえばDAモジュールで電圧制御電源装置を制御したり、PIDモジュールで恒温槽の温度管理をしたりと、さまざまな用途のシステムが簡単に構築できます。

PLC_真空管特性計測システム2.jpg

PLC使用の真空管特性計測システム

LAN経由で制御するのでLANがつながればどこからでも制御できる

下段はヒータ、C電源用のプログラマブル電源装置

上段にプレート電流等を計測するDMM

最上段に真空管試験器とPLC(裏面)

 

今回は以下のような構成で使用しました。

 

WindowsPC(EXCEL) <-> PLC(LAN) <-> PLC(GPIB) <-> 計測器、電源装置

 

WindowsPCでエクセルを使用したコンソール画面を作ります。プログラムはVBAです。

 

WindowsPCからパソコンリンクコマンドで、PLC CPU内のレジスタにアクセスし、さまざまな設定や制御を行います。

 

PLCのCPUではGPIBモジュールから計測器を制御するラダー言語のプログラムを走らせます。

 

これらが連携して、真空管特性計測システムとなっています。

PLC_真空管特性計測システム3.jpg

FA-M3 PLC

左から電源、CPU, LAN, GPIBモジュール

すでに古い機種ばかり

計装エンジニアリング会社を経営する友人からの借用品

 

これまでのWindowsPC使用の場合は、PCIバスのGP-IBコントローラを使用し、GP-IBハンドラは、easyGPIBを使用していました。easyGPIBは無償ソフトですがサポートしているGPIBボードが限定されているし、しばらく前からサポート停止で、供給もされなくなっています。

 

今回easyGPIBとは見切りをつけ、VISA-COMに移行しました。

 

VISA-COMのIOライブラリはKeysight(HP, Agirent)が無償提供してくれています。

VISA-COMはGPIBのほか、USBやLAN、RS232Cインターフェースもサポートしており、統一されたプログラミングでそれらを使用することができます。

 

ちなみに、今回PLCに移行する前に、WinodwsPCのままハードは変更せず、easyGPIBだけをVISA-COM IOライブラリに置き換え、少しプログラムを書き換えるだけで動きました。

 

さて、PLCを使用するにあたって最大の難関はラダー言語でプログラミングが必要なことです。やることは単純で、GPIBの基本的な設定と、メッセージの送受信をPLCのCPUレジスタとの間で行うだけです。しかし慣れない言語はやはり疲れます。

 

ラダープログラムは簡単なもので、CPUのレジスタを監視し、指示によってGPIBのIFC, DCL, RENを創出できるようにしています。また、CPUから指定されたデバイスメッセージの送出や、トーカからのメッセージを受信し、CPUの特定のレジスタに読み込みます。

 

WindowsPC上のエクセル VBAで書いたコンソール・プログラム(真空管の各種設定や電圧、電流の計測とそのグラフ表示など)とPLC CPUの間は「パソコンリンクコマンド」を使います。これはPLCのLANコントローラにインプリメントされている機能で、簡単なコマンドでCPU内のリレーやレジスタにアクセスすることができるようになっています。モードはASCIIとBINARYがありますが、今回はASCIIモードを使用しました。数値のやり取りはすべて16進の文字列で行います。このためASCIIモードでは、レジスタ1ワード分は4文字で表現されます。

PLC_真空管特性計測システム4.jpg

EXCEL VBAの真空管特性計測制御画面

12BH7Aを計測中

各部電圧の設定を行ったあとは、自動で計測しながらグラフ表示する

 

 

今回VBAで用意したルーチン(sub)は、大まかには以下の3つです。

 

send_command(コマンド)

send_message(リスナ・アドレス, コマンド)

recv_message()

 

send_command()は、IFC, DCL,RENなどのユニライン・メッセージを送出します。

 

send_message()は、リスナを特定したマルチライン・メッセージを送出します。

 

リスナ・アドレス 23のDMM HP3478Aを直流電圧30Vレンジに設定する場合、

 

send_message(23, "F1 R1")

 

となります。

 

recv_message()は直前のリスナをトーカとして、メッセージを読み込みます。

 

DMM HP3478Aを直流電圧30Vレンジに設定した後、計測した電圧値を読込む場合は、

 

send_messgae(23, "F1 R1")

data = recv_message() '戻り値はString

 

とします。これでDMMをトーカとして計測値を読み込みます。

 

GPIBの制御部分のみを以下に示します。

 

 

EXCEL VBA プログラム(GPIBに関連する部分のみ)

 

HP6632B プログラマブル電源(アドレス 7)でDC 12.6Vを出力させるプログラム部分

こんな感じという程度でご覧ください。

 

VISA-COM IOライブラリをインストールし、EXCELの参照設定を行っておく必要があります。

 

Const IFC As Integer = 1
Const DCL As Integer = 2
Const REN As Integer = 4
Const SND As Integer = 10
Const RCV As Integer = 20

Dim RM As New VisaComLib.ResourceManager
Dim PLC As New VisaComLib.FormattedIO488

Set PLC.IO = RM.Open("TCPIP0::192.168.x.xx::12289::SOCKET")
    
PLC.IO.TerminationCharacter = 10
PLC.IO.TerminationCharacterEnabled = True
PLC.IO.SendEndEnabled = True
...


Call send_command(IFC)
Call send_command(DCL)
Call send_command(REN)

...

 

Call send_message(7, "ISET 1.0") '電流設定 1A

Call send_message(7, VSET 12.6") '電圧設定 12.6V

Call send_message(7, OUT 1") '出力ON

...

 

Call send_message(7, "IOUT?") '出力電流要求

cells(1, 1).value = recv_message() 'セルに電流値を読み込む

...

 

以下は、パソコンリンクコマンドでPLCとやりとりするための関数

 

Function formatI2H(ByVal digit As Integer, ByVal command As Integer) As String
    
    formatI2H = Right(String(digit, "0") & Hex(command), digit)

End Function

Function formatI2D(ByVal digit As Integer, ByVal command As Integer) As String
    
    formatI2D = Right(String(digit, "0") & command, digit)

End Function

Function recv_message() As Single

    Dim str As String
    Dim rcv_str As String
    Dim i As Integer
    Dim val_str As String
    Dim data As Single
    Dim msg_length As Integer
    Dim data_length As Integer
    Dim out_str As String
    Dim tmp As Integer
    
    Call send_command(RCV)
    
    Call Sleep(1000)
    
    str = "01WRDD00600,40"
        
    PLC.WriteString str + vbCr
    
    Call Sleep(100)
    
    rcv_str = PLC.ReadString
    
    msg_length = Len(rcv_str)
    
    'data_length = Val(Mid(rcv_str, 5, 2)) + Val(Mid(rcv_str, 7, 2))
    data_length = CInt("&H" & Mid(rcv_str, 5, 2)) + CInt("&H" & Mid(rcv_str, 7, 2))
    
    val_str = Mid(rcv_str, 9, data_length * 4 - 1)
    
    For i = 1 To Len(val_str) Step 2
        tmp = Val("&H" & Mid(val_str, i, 2))
        out_str = out_str & Chr(tmp)
    Next
    
    data = CSng(out_str)
    
    recv_message = data
    
End Function

 

Public Sub send_message(ByVal address As Integer, ByVal message As String)
    
    Dim i As Integer
    Dim length As Integer
    Dim str As String
    Dim num As Integer
    
    length = Len(message)
    
    If length Mod 2 = 0 Then
        num = 2 + Int(length / 2)
    Else
        num = 2 + Int(length / 2) + 1
    End If
    
    str = "01WWRD00501,"
    
    str = str + formatI2D(2, num) + ","
    
    str = str + formatI2H(4, address)
        
    str = str + formatI2H(4, length)
    
    For i = 1 To length
        str = str + CStr(Hex(Asc(Mid(message, i, 1))))
    Next
    If length Mod 2 = 1 Then str = str + "20"
    
    PLC.WriteString str + vbCr
    
    Call Sleep(10)
    
    PLC.ReadString
    
    Call send_command(SND)
                    
    Call Sleep(10)
    
End Sub


Public Sub send_command(ByVal command As Integer)
    Dim str As String

    str = str + "01WWRD00500,01,"
    
    str = str + CStr(formatI2H(4, command))
    
    PLC.WriteString str + vbCr
    
    Call Sleep(10)
    
    PLC.ReadString

End Sub

 

 

開発環境

Windows7 EXCEL VBA

Keysight VISA-COM IO Library

YOKOGAWA WideField3

 

 

 

 

(JF1VRR)