このページの本文へ

前へ 1 2 3 4 5 6 7 8 次へ

驚愕の結果! アルカリ乾電池性能比較実験! 第9回

電池実験装置の全貌公開! リレーユニットの製作【ソフト編】

2009年09月29日 20時00分更新

文● 藤山哲人

  • この記事をはてなブックマークに追加
  • 本文印刷

もうちょっと使えそうなサンプルプログラム(笑)

 RelayTestは、あまりにも本質のみに絞ったので、分かりやすいものの使い道がない(笑)。ということで、もう少し発展させたプログラムも併せて掲載しておこう。

こんな感じのExcelシートを作ってほしい

 Excelを起動したら「タイマー予約」というシートを作成して、画面のような表を作ってほしい。今回のサンプルプログラムは、この一覧のデータに基づいて、リレーの状態を変化させるものだ。

 A列の時刻には、リレーの状態を変える時刻を秒も含めて記述、B~I列のch1~8にはリレーの状態を1か0で指定する。1はリレーがONになり、0はリレーがOFFになる。

 タイマー予約はシートの2行目~101行目に記述し、最大100件を登録できる。ただし、その範囲内の時刻セルが空白になっている場合、それ以降の予約は無視されるので注意してほしい。A列の空白を持って予約一覧の終了とみなしているためだ。

 プログラムの記述方法は、RelayTestと同じ要領だ。ただし名前を「タイマー予約」なとどしてRelayTestと別名にすること。

 また、先の手順(4)でコピー&ペーストしたプログラムも同様にしてほしい。プログラムの実態は、次のようになる。

Option Explicit


 'VB6用直接I/O制御関数群
Public Declare Function InpB Lib "VBIOSCM_DLL.DLL" Alias "_InpB@4" (ByVal Port As Integer) As Integer
Public Declare Function InpW Lib "VBIOSCM_DLL.DLL" Alias "_InpW@4" (ByVal Port As Integer) As Integer
Public Declare Function InpD Lib "VBIOSCM_DLL.DLL" Alias "_InpD@4" (ByVal Port As Integer) As Long
Public Declare Sub OutB Lib "VBIOSCM_DLL.DLL" Alias "_OutB@8" (ByVal Port As Integer, ByVal dat As Integer)
Public Declare Sub OutW Lib "VBIOSCM_DLL.DLL" Alias "_OutW@8" (ByVal Port As Integer, ByVal dat As Integer)
Public Declare Sub OutD Lib "VBIOSCM_DLL.DLL" Alias "_OutD@8" (ByVal Port As Integer, ByVal dat As Long)
'VB6用直接I/O制御関数開始/終了処理
Public Declare Function IOSCM_Start Lib "VBIOSCM_DLL.DLL" Alias "_IOSCM_Start@0" () As Integer
Public Declare Function IOSCM_Stop Lib "VBIOSCM_DLL.DLL" Alias "_IOSCM_Stop@0" () As Integer

Sub タイマー予約()

Dim y As Integer
Dim x As Integer
Dim Tm(99) As String
Dim Sw(99) As Integer
Dim i As Integer

' カレントをxlsファイルがあるフォルダに移動
' そのフォルダに
ChDir ThisWorkbook.Path
ChDrive ThisWorkbook.Path

' タイマー予約時刻の読み取りとスイッチ状態の取得
Sheets("タイマー予約").Select
For y = 0 + 2 To 99 + 2
Tm(i) = Cells(y, 1).Text
If Tm(i) = "" Then
Exit For
End If

' スイッチの状態取得と出力データの計算(左端が1ch、右端が8ch)
For x = 0 To 7
Sw(i) = Sw(i) + 2 ^ x * Cells(y, 2 + x).Value
Next x
i = i + 1
Next y

' タイマー予約が1件もない場合は終了
If i = 0 Then
MsgBox ("予約時刻が設定されていないので処理を終了します")
Exit Sub
End If


' 予約時刻の監視(無限ループ)
Do While (1)
For y = 0 To i
' 予約時刻になったらパラレルポートにデータ出力
If Format(Tm(y), "hh:mm:ss") = Format(Time, "hh:mm:ss") Then
Call OutB(&H378, Sw(y))
End If
DoEvents ' Windowsにいったん制御を渡す
Next y
Application.StatusBar = "時刻 " & Time
Loop

End Sub


 「タイマー予約」シートに時刻とリレーの状態を入力したら、xlsファイルをいったん保存して、そのフォルダに「ioscm.sys」と「vbioscm_DLL.dll」をコピーするのも忘れないように。

 プログラムを実行すると、Excelの画面左下にあるステータスバーに現在時刻が表示される。この時刻と一覧の時刻が一致すると、リレーの状態が変化するようになっている。

ウィンドウの左下に時刻が表示されているときは、プログラム実行中でタイマー予約一覧と現在時刻を監視している

 プログラムは[Ctrl]+[Break]キーを押すと終了する。

同様にしてVisual Basicからもリレーユニットを制御

 ここまでExcel VBAを使って制御をしてきたが、Visual Basicでもほとんど同じプログラムで動作する。ただVisual Basicにはワークシートがないので、タイマー予約一覧のインターフェイスなどを変更する必要があるが……。

 mag44氏のWebページにある、LPTCheckはVisual Basic 6.0で書かれたプログラムのソースコードも添付されているので、こちらも参照して各自オリジナルのプログラムを作ってほしい。

 また「Excel VBAがイマイチよく分からないなぁ」という人には、こんな本がオススメだ。

■Amazon.co.jpで購入
■Amazon.co.jpで購入

 アスキー・メディアワークスの本じゃないので声を大きくすることはできないが、筆者の書いた本(笑)。そこそこ評判がいいらしいぞ!

 Visual Cを使っている方は……。ヘッダファイルを見れば戸惑うこともないだろう。別に説明が面倒ってワケじゃない! 本当だぞ!(笑)

■関連サイト

前へ 1 2 3 4 5 6 7 8 次へ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

最新記事

ASCII.jpメール アキバマガジン

クルマ情報byASCII

ピックアップ