もうちょっと使えそうなサンプルプログラム(笑)
RelayTestは、あまりにも本質のみに絞ったので、分かりやすいものの使い道がない(笑)。ということで、もう少し発展させたプログラムも併せて掲載しておこう。
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を使っている方は……。ヘッダファイルを見れば戸惑うこともないだろう。別に説明が面倒ってワケじゃない! 本当だぞ!(笑)
この連載の記事
-
第8回
ゲーム・ホビー
あの電池実験はこうやった! リレーユニットの製作を全公開! -
第7回
ゲーム・ホビー
電池を越えた電池! 電池と言えない電池を発見! -
第6回
ゲーム・ホビー
大電流で電池も加熱! ミニ四駆で無茶してみた~コンビニPB軍団×100円ショップ帝国 -
第5回
ゲーム・ホビー
大電流で電池も加熱! ミニ四駆で無茶してみた~有名メーカー編 -
第4回
ゲーム・ホビー
コンビニPB連合 VS 100円ショップ帝国勝負! 連続使用決戦! -
第3回
ゲーム・ホビー
有名メーカー電池ガチンコ勝負! 連続使用決戦! -
第2回
ゲーム・ホビー
12時間電池耐久レースはコンビニ&100円ショップ対決に! -
第1回
ゲーム・ホビー
有名メーカー対抗! 12時間耐久電池間欠使用レース! -
ゲーム・ホビー
驚愕の結果! アルカリ乾電池性能比較実験! - この連載の一覧へ