仮想通貨100種類以上の特徴を紹介!だけど雑記ブログw

EasyCommのVBAサンプル(エクセルやアクセスでEasyCommを使ってみたけど動かないって人へ)

最近、Googleのサーチコンソールを見ていたら、そこそこ多くの方がEasyCommのサンプルコードを求めてこのサイトに来られているということに気が付いた。

ご愁傷様。

残念ながら、このサイトにはEasyCommのサンプルコードはなかった。というか、そもそもが接続する機器次第でデータのフォーマットもバラバラなワケで。何にでも使えるコードを書くのは無理なのではないか。可能だったとしても、そんなコードを作るより、機器に合わせてコードを書く方が遥かに現実的に思える。

……とまぁ、グチグチと書いてしまったが、サンプルコードも含めて、EasyCommが上手く動かない人向けの記事を書いてみようかと思う。

コード以外の問題が多い

一応書いておくと、僕は本職のプログラマーではない。中小企業の雑用係的な位置づけだ。なので、あまりきれいなコードにこだわる方ではないと思う。

とはいっても、EasyCommとはそこそこ縁があり、重量計4種類・バーコードリーダーとして機能するカメラとの接続をするプログラムを作成してきた。どれも社内向けではあるが、日常的に業務にしようしており、大きな不具合は起きていない。それなりにこなれてはいる。

さて、いくつかのEasyCommを利用したシステムを作成した中で、自分も何度かドハマりした点について書く。

EasyCommを使用したプログラムを実行してみると、エラーが起こったり、何も起こらず、動いているのか止まっているのかさえよく分からないなんてことがよくある。僕の経験的に言うと、多くの場合はコード以外に問題があった。

なので、うまく動かなくて困っている方は、まずはコードを見直す前に、下記の点を確認していただきたい。

  • 接続ケーブルが合っているか
  • ポートが合っているか
  • 64bit問題は対策済みか

接続ケーブルがあっているか

いわゆるRS232Cのケーブルはストレートとクロスのの2種類があり、はた目には違いがない。どちらのケーブルが必要なのか、取扱説明書には載っていることが多いので、まずはそれを確認し、正しいケーブルを準備してください。

(取扱説明書がない場合、そのメーカーに問い合わせると、説明書の上位版や開発者向けの説明書なんてのが出てくることもあります)

また、それぞれのケーブルにそれぞれ、オス-オス、オス-メス、メス-メスの3通りがあるので、購入する際はそちらも気にしてください。

ポートが合っているか

一昔前のパソコンだと、RS232Cの接続は大体COM1だったような気がします。実際、普通に端子が1つだけ付いていて、それが1番に対応しているという当然すぎる状態ですよね。

しかし、最近のパソコンにはそもそもRS232C用の端子がついていないケースが増えてきました。そうすると、後付けの特注品になったりするわけですね……。で、昔の名残でCOM1に設定してあるため、後付けの部分はCOM3あたりに設定してあったりするわけです。

接続確認をしよう

さて、ここまで来て、ケーブルに問題なし。ポートも間違いなし。となったら、一度、接続確認をしてみましょう。一番手っ取り早いのはコマンドプロンプトを使う方法でしょうか。

やり方はいたって簡単、まずは接続機器からのデータの受け取り方法をなるべく垂れ流しに近い状態に設定します。(沢山データが来る方が確認しやすいため)

コマンドプロンプトを開き、「type COM1」と叩きます。

データがどんどん表示されていけば、ここまでの接続は完璧です。文字化けなどは問題ありません。文字の調整はコード側で調整する問題です。

確認ができたら「Ctrl+c」で停止させましょう。

これ以外の確認方法として、RS232Cの中身を確認できるフリーソフトなどを活用するのもありだと思います。僕もVectorで拾ってきたシリアルデバッグツール2とかいうのをたまに使っています。

64bit問題は対策済みか

さて最後。64bit問題についてですが、これについてはこちらの記事をご確認ください(⇒easycommを64bitのOfficeで動かす方法

サンプルコード

さて、ここまで出来たら、次はいよいよコードを少し挙げてみます。

機器の接続と切断

まず、重要なのは機器と接続を開始する部分です。

ec.COMn = 1

ec.Setting = “9600,n,8,1”

ec.HandShaking = ec.HANDSHAKEs.No

ec.Delimiter = ec.DELIMs.ETX

ec.OutBuffer = 100& * 1024&

一行目の「ec.COMn = 1」でCOMポートを指定し、機器との接続を開始しています。このコードは機器がCOM1に接続してある場合のコードです。COM3を使用している場合は「ec.COMn = 3」となり、COM4を使用している場合は「ec.COMn = 4」となります。ちなみに「ec.COMn = -1」と書けば切断することができます。

二行目からで細かい設定をします。このあたり、機器のマニュアルを見ながら合わせていく感じになります。僕自身は三行目の「ec.HandShaking = ec.HANDSHAKEs.No」とご行目の「ec.OutBuffer = 100& * 1024&」はいじったことがありません。簡単な機器であれば、二行目・四行目をいじるだけで良いのではないかと思います。

逆に二行目と四行目はいじらずに済むことはほとんどないです(^^;

二行目で(ボーレート,パリティビット数,データビット数,ストップビット数)を一気に設定しています。ここが正しく設定できないと、データを正しく受け取ることができません。文字化けしたような状態でデータを受け取ってしまうことになります。

四行目はデータの切れ目を指定する部分です。機器からのデータの受け取り方によるのですが、垂れ流し状態のデータを受け取る場合には、データが絶えず送られてきます。どこで切って一つのデータと見るのかを確定するためにここの設定が重要となります。

上のデータの場合にはデータの間に必ずETXというコードが入る場合の設定です。改行コードCRLFが入る場合には「ec.Delimiter = ec.DELIMs.CrLf」となります。これも機器のマニュアルに書いてあるはずなので、読みながら設定してください。

次に接続を終了する部分です。

ec.COMn = -1

こちらはこれだけです。簡単ですね。

機器の接続と切断をどこに書く?

さて、接続切断のコード自体はいたって簡単です。この後、実際にデータを取得するコードを書きますが、コードの内容以上にそれをどこに書くかが重要だと思っています。

データを取得するためのアクションが機器側にあるのか、PC側(エクセルやアクセス)にあるのかで書き方が変わってきます。経験的に言って、アクションがPC側にある場合は機器の接続・機器からのデータ取得・機器の切断を一つのプロシージャに書いてしまっても十分使えるものができます。

簡単に書くとこんな感じでしょうか。

Dim data As String

ec.COMn = 1

ec.Setting = “9600,n,8,1”

ec.HandShaking = ec.HANDSHAKEs.No

ec.Delimiter = ec.DELIMs.ETX

ec.OutBuffer = 100& * 1024&

data = ec.AsciiLine

ec.COMn = -1

問題はアクションが機器側にある場合です。

アクセスの場合は、フォームを利用して作るのが無難だと思います。

トコトン自動化したいのであれば、開くとき・読み込み時・アクティブ時などに接続のコードを書き、閉じる時・非アクティブ時などに切断のコードを書きます。

そこまで、自動化にこだわらないのであれば、機器との接続開始ボタンや切断ボタンを作って管理するのが無難に思います。

そして、データの取得についてはタイマー時に書き、接続のためのコードの最後に「Me.TimerInterval = 500」のように書き、タイマー間隔を指定してやります。

これで、接続開始とともに機器からのデータを受け取り始めるようになります。

また、切断のコードの最初に「Me.TimerInterval = 0」と書き加えておけば、切断時にエラーが起こることもありません。

エクセルの場合はもっと工夫が必要ですが、僕自身エクセルでこういったものを作る時は簡易版と割り切ることが多いので、あまり大きな負荷がかかりそうなものは作ったことがありません。

なので、ちょっと無茶なコードになってしまいますが、Workbookのアクティブ時に接続を開始するコードとデータ取得のコードをDo~Loopの中に入れて書いてしまいます。

Dim data As String

ec.COMn = 1

ec.Setting = “9600,n,8,1”

ec.HandShaking = ec.HANDSHAKEs.No

ec.Delimiter = ec.DELIMs.ETX

ec.OutBuffer = 100& * 1024&

Do Until Len(data) > 0

data = ec.AsciiLine

Loop

ec.COMn = -1

エクセル関数などと併用するとフリーズすることもありますが、すべてVBAに頼ってしまうと、これでも十分動きます。EasyComm自体にDoEventsが書かれているので、エクセルの操作もとりあえずは支障なくできます。(たまにリボンが固まったりしますがCtrl+sで保存したりCtrl+wで閉じたり、タスクバーを右クリックして閉じたりでだましだまし使っていますw)

で、非アクティブ時に閉じるコードを書けばとりあえず完成です。

データ取得のコードをもうちょっと詳しく

さて、上では手抜きに「data = ec.AsciiLine」なんて書いてしまいましたが、実際に文字列で取得したデータをそのまま使えることもなく……。大体の場合、MidとかLeftとかRightとかInStrとか駆使して文字列を切り取り、ValやらCIntやらCDblやらCLngやら使って数値にして……てな作業が必要になります。

また、LenやらLenBやら使って、正しくデータが取れたことを確認する必要もあります。

凄く簡単なサンプルにはなりますが、最低限下記のような書き方になるかと思います。「Len(s) = 15」や「Mid」の部分は取得するデータの長さや形に合わせて書く必要があります。

Dim r As Double
r = 0
Dim s As String
s = ec.AsciiLine

If Len(s) = 15 Then
r = Val(Mid(s, 4, 9))
End If

さて、こんなところでしょうか。

それでも動かせないとかあれば、コメントを頂ければわかる範囲で回答いたします。「どうにも分からんから手伝いに来い!」って方が入れば、日曜か平日の深夜で良ければ、お手伝いに行きますよ♪(費用応相談w)その場合もとりあえずはコメント下さいな(^^b

参考までに……

僕はこのあたりの重量計を良く使っていたりします。

SNSでフォローする

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です