
PLC使用の真空管特性計測システム
投稿日 2016/10/21
真空管の静特性を計測するための真空管特性計測システムは以前から活用してきました(参考: 真空管試験システムの構成)が、今回コントローラをPLC(Programable Logic Controller)に置き換えてみました。
計測器をGP-IBでつないだ計測システムであることに変わりはないのですが、これまではWindowsPCを使用していたコントローラをPLCに置き換え、下図のような構成にしました。

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使用の真空管特性計測システム
LAN経由で制御するのでLANがつながればどこからでも制御できる
下段はヒータ、C電源用のプログラマブル電源装置
上段にプレート電流等を計測するDMM
最上段に真空管試験器とPLC(裏面)
今回は以下のような構成で使用しました。
WindowsPC(EXCEL) <-> PLC(LAN) <-> PLC(GPIB) <-> 計測器、電源装置
WindowsPCでエクセルを使用したコンソール画面を作ります。プログラムはVBAです。
WindowsPCからパソコンリンクコマンドで、PLC CPU内のレジスタにアクセスし、さまざまな設定や制御を行います。
PLCのCPUではGPIBモジュールから計測器を制御するラダー言語のプログラムを走らせます。
これらが連携して、真空管特性計測システムとなっています。

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文字で表現されます。

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)