2014年5月31日土曜日

Excel VBA DoEvents で Do While Loop を抜ける

【プリント開始は】
Click -> Flag = True -> myPrint -> ループし続ける

【プリント停止は】
Click -> Flag = False -> End Sub -> DoeVents -> Loop -> While (False) -> ループ停止 ->End Sub
と処理される。ここでDoEventsがPrintの前にあれば False  を表示して停止し、後にあれば Trueのまま停止する。・・・どこまで処理してループを抜けるか。

【DoEvents が無いと】
無限ループとなってCtrl+ALT+Delete のお世話になる。

【ボタンを二つに】
ボタンを「開始」「停止」の二つにすれば、分かりやすくて柔軟性もあると思われる。ボタンの Visible を交互に切り替えて、見かけ一つに見えるように重ねてレイアウトする方法もある。 
----------------------------------------------------
Public Flag As Boolean

Private Sub CommandButton1_Click()
    If Flag = True Then
        Flag = False
    Else
        Flag = True
        Call myPrint         'クリックでプリント開始
    End If
End Sub

Public Sub myPrint()
    Dim Count As Integer
    Do While (Flag)
        DoEvents
        Count = Count + 1
        Debug.Print Count, Flag '再度押されるまでプリントし続ける
'       DoEvents
    Loop
End Sub
----------------------------------------------------



2014年5月13日火曜日

64bitOS(Windows8.1)で32bitアプリ(Excel VBA)を使おうとしたら(2)

先の(1)の問題と別物であると考えいたるまでしばらくかかった。

【症状】「デバイス名がない」というエラー(USBパラレルIOユニットが認識されない)

【原因1:ドライババージョンがWindows8 に対応していない】
【原因2:旧ドライバが正常に削除されていない】
  • インストールUSBドライバは正常に見つかる
  • サンプルプログラム(C)は問題なく動く
  • 最新バージョンをダウンロード
  • 何度インストールを繰り返しても「インストール済みです」になってしまう
----------
メーカサイト(CONTEC)に情報があった。使用製品はDIO-3232LX-USB 。
アンインストールが正常終了していないようだ。[表示]-[非表示デバイスの表示]した上で削除。
----------
今年になって購入したのに添付CDのバージョンが古いなんて・・・・
ただ添付の診断プログラムは有り難い。

64bitOS(Windows8.1)で32bitアプリ(Excel VBA)を使おうとしたら(1)


【症状:横河GS820用の tmctl.dll が見つからないというメッセージが出る】

【原因::EXCEL VBA が\Windows\System32 フォルダを参照できない】

【解決法:SysWOW64へ移動したらOKでした】

----------
  • Office2013 32bit バージョン
  • 横河電機のUSBドライバは正常
    (デバイスマネージャに「Yokogawa USB Device」が表示される)
  • Windows\System32 に解凍した dll をコピー・・・・Windowsが32bitの場合
----------
「C:\Windows\System32」フォルダにはアクセスできない仕組みのようで、「C:\Windows\System32」フォルダにアクセスできるように設定する方法があるようだが、「C:\Windows\SysWOW64」フォルダにdllを置く方を選んだ。

tmctl.dll: 横河電機 ソースメジャーユニット GS820 をUSBからコントロールするための関数ライブラリ

OS(Windows8 PIPC版)アップグレード、今年3.5回目


  1. Dynabook R632 Windows8 -> Windows8.1 無料アップデート
  2. EPSON ST110 WindowsXp -> Windows7 DSP版
  3. Dynabook B654/K Windows7(ダウングレード版で購入), Office2013立ち上げ
  4. 3 の PCを Windows7 -> Windows8(64bit) さらに->8.1へ, Office2013立ち上げとOffice2013(PIPC版)のインストール

以下は [4.] の件で、リカバリディスクを使って Windows8 64bit  版にするところからのメモ。

  1. PCに添付されていたDVDからリカバリを実行(クリーンインストール)
  2. Windowsアップデート実行(Windowsアップデートの自動更新以外はすべてのオプションをオフ)
  3. Microsoftアカウントを入力しメールで送られてきたコードを入力し使用可に
  4. Microsoftアカウントにログインアカウントが書き換わったので、「ローカルアカウントに切り替える」を選択し、Windows8のインストール時点の名前に戻った
  5. 「ストア」から Windows8 から8.1 への無料アップデートを実行
  6. Officeのプレインストール版(PIPC)製品インストールからOffice2013をインストール
  7. 最初にプロダクトキーの入力が必要(ここでもWindowsアップデートの自動更新以外はすべてのオプションをオフ)
  8. ここでもMicrosoftアカウントが必要
  9. 上と違ってOfficeのユーザー名は書き換わらず 4のまま
  10. VBAのバージョン確認 Retail 7.1.1043
  11. 何もしなかったので、Office2013 32bit 版のままとなってしまった

2014年5月8日木曜日

FETCh?, READ?, MEAS? の違い


横河GS820をEXCEL VBA で制御、数10msの高速測定が目標。GS820 ソース・メジャーユニットは、発生側と、測定側それぞれにタイミング設定ができるのでややこしい。
タイマを使ったトリガ設定から始めたが、ソースがオンになる時間が変動し、サンプリングエラーのランプが点灯する。
エラーが点灯しないようにするにはどうすべきか、いろいろやってみて、分かったような気がする。(以下、検査時間=ソースオン、ディレイ、測定、ソースオフまでの時間)

【測定時間】
  • 図にある積分時間を最小にする
  • オートゼロ機能が入ると測定時間は積分時間の倍に延びる
  • この測定時間よりトリガ周期が早いとエラー
  • オートレンジ機能は使わない
【サンプリングエラー】
  • 発生中に新たなソーストリガが発生すると、サンプリングエラー
  • 測定中に新たなメジャートリガが発生すると、サンプリングエラー
  • 検査時間の短縮の為、トリガに使用するタイマ周期を、単純に早くすると測定時間が間に合わずにエラーになる
【FETCh?】
  • 測定結果の問い合わせ
  • 実行時点の測定値を受け取るのでタイミングは任意
  • 制御プログラム側で時間管理が必要
  • 予め何らかの方法(タイマやコマンド)で測定が実行されていること
【READ?】
  • 測定結果クリア+測定結果の問い合わせ
  • 測定結果が得られるまでの時間、「ディレイ+測定時間」は固定
  • タイマトリガで使うと、その周期の間で検査時間が変動する
【MEAS?】
  • 測定結果クリア+トリガ発生+測定結果の問い合わせ
  • メジャートリガをIMMにし、MEAS->SOURの順に設定した後、MEAS?を使う
  • ソーストリガはEXT(外部トリガ):トリガ発生の*TRGコマンドを受け付ける
  • 実行時点から測定結果が得られるまでの検査時間はメジャーディレイに近づく
  • 繰り返し検査を実行してもほぼ一定(Windowsの変動有)
【タイマ】
  • ソーストリガの初期値が、タイマ1の50ms
  • CH1,CH2共通に使えることで、チャンネル間の同期がとれる
  • ディレイと混同しやすいが、コマンドとは関係なく独立して周期的に発生している
  • 例えば設定の50ms以内に二つの発生コマンドが来るとエラー
  • エラーでも動作するが波形は思った幅にはならない
  • メジャーアクション無しで、やってみるといい
【測定終了時( イミディエート)(Imm)】
ソースアクションの終了が次のソースアクションのトリガになります。最速で測定を繰り返すときなどに使用します。
の説明にもあるように、繰り返し(周期的に)測定することを前提にしているので「前回の測定の終わり」がある。説明文をわかりにくくしていることのひとつの原因。もう少し図解があれば助かる。

手作業のデータ取りのように、「ボタンを押している間計測器の表示を目視確認する」のような場合は、トリガをタイマにしてフリーで測定させて、ボタンオフのタイミングでFETCH?を使えばいい。

GS820は、レンジ切替、モード切替などコマンドによるセットアップが高速で、ゼロ発生モードに切り替えることで、出力のオンオフリレーを動作させずに使用できるのが特長のひとつ。下位機種のGS200も同時に扱ってみたが、こっちは細かく設定できなさすぎ、測定時間が1PLC以下が無い。


2017/02/26 追記 
Keysight のフォーラムから拾った情報
FETCH?、MEASure?、READ?、SENSe:DATA? の違いについて

1. ":FETCh?" command
最新の結果を返し、開始時には使用できません。
以前のデータはコマンドによって消去されません。

2. ":MEASure?" command
単一点測定を実行し、結果を返します。
開始時には使用できません。
以前のデータはコマンドによってクリアされます。

3. ":READ?" command
":INITiate"コマンドと ":FETCh:ARRay?"コマンドを実行します。 コマンドを連続して実行し、結果を返します。
開始時には使用できません。
以前のデータはコマンドによってクリアされます。

4. ":SENSe:DATA?" command
指定されたパラメータに基づいて最新の結果を返します。
それは開始時にも利用可能です。
以前のデータはコマンドによって消去されません。