人気マンガがだれでも無料♪電子コミック読み放題!!

プログラムの作成について、お伺いします。

私は、今までPCIにI/Oを接続し、そこからモータを駆動させるプログラムを作っていました。
今までは、用意された関数(受注した会社の関数)を用いて、プログラムを書いていました。(IO_open()やDA_put()など)

今回は以下のものを利用して モータを駆動させたいのですが。 全くやり方がわかりません。

http://www.skcj.co.jp/plexmotion/products/csa-up/

USBを用いたこともなく、プログラムでUSBをOpenさせる方法とかも全くわかりません。
上の会社の物だと、アプリケーションがすでにあり、関数とかも用意されていないみたいで、手のつけどころがわかりません。

上記で示したモータを制御するプログラムを作るには、何から始めればよいのでしょうか?

詳しく解説をお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

「USB 秋月電子 書籍」でぐぐって出てくる本を書店で手にしてみると良いかも。

    • good
    • 0

該当機使ったことないので詳細は分かりませんがPCとの接続は


RS485になるような記載があるのでそれでやり取りできるんではないかと思います
要はRS232C通信と同じ制御ではないかと(USBとか意識しなくていいのではないかと思います)
ある程度の設定が標準アプリでできてそれを通信で
書き込む(制御する)方式なのではないでしょうか

実際自分のプログラムからどの程度の制御ができるのかは実物見ないとよくわかりません
    • good
    • 0

そもそもこの製品とPCとをどうやって接続するかわからんです。


- USB接続なんですか?
- 付属のアプリを使わずに制御したいんですけど、ライブラリありますか?
など、シナノケンシに訊いてみました?
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QUSB機器からのデータ受信による割り込み処理について

お世話になります、fujitomoです。
まだ実際にプログラムのコードを開発しているわけではないので、漠然としたイメージでの質問となるのですが、質問させて頂く内容は
USB機器で取得した測定データを、USB機器からアプリケーション(C++ MFCにて開発)に送信し、受信時に割り込み受信の処理をし、そのUSB機器から送信されたデータをリストやダイアログ上に表示させたいと思ってるのですが、その実際の実装方法の流れを教えていただければと思い、質問いたしました。
シリアル通信と同様にUSB用の割り込み受信関数といったようなものがあるのでしょうか?

全体の流れのイメージが掴めず、どこから着手していいか分からないため、ご存知の方がいらっしゃいましたら、ご回答宜しくお願い致します。

Aベストアンサー

Windowsと仮定しますが、Windowsではアプリケーションが直接USB機器にアクセスする事は出来ません。

USB(と言うか、正確には「Windowsのカーネルシステムが認識しているUSBポート」ですが)は、Windowsのカーネルシステムが占有しています。

特定のアプリが特定のUSB機器を制御するには「その機器専用のデバイスドライバ」を介して行う事になります。

「Windowsのカーネルシステムが認識しているUSBポート」に「USB機器」が接続されると、Windowsのカーネルシステムは「お前は誰だ?」と、機器に問い合わせを行います(Inquiryコマンドの発行と機器問い合わせ)

そして、問い合わせた結果「お前を制御するデバイスドライバがインストールされてない」と判ると、デバイスドライバのインストールを要求して来ます。

なお、デバイスドライバがインストール済みであれば、認識後の初期化処理をデバイスドライバに行わせ、それ以降の機器アクセスはデバイスドライバに一任します。

で、無事にデバイスドライバがインストールされ、機器の初期化と認識が終わると、デバイスドライバは、アプリケーションで使用可能な「アプリ用のソフトウェア的なインターフェース」を提供します。

つまり「アプリがデバイスドライバを利用可能になる」わけです。

「アプリ用のソフトウェア的なインターフェース」が「その機器専用の物」なのであれば「デバイスドライバを作った人が勝手に決めて良い」ので、アプリからして見れば「デバイスドライバの仕様書の通りに、決められた通りにインターフェースを行う」しかありません。

「アプリ用のソフトウェア的なインターフェース」が「USBメモリのような、標準的な外部記憶装置としてのインターフェース」であれば、アプリケーションは「普通のファイルにアクセスするように、そのドライブ装置にアクセスするしかない」ので、悩む余地はありません。

そういう訳で、アプリを書くのは、そんなに大変ではありません。

問題なのは「その機器専用のデバイスドライバ」です。

BIOSを介して、または、Windowsのカーネルルーチンの呼び出しを駆使して、機器をコントロールしなければなりません。送信タイムアウトとか、受信タイムアウトとか、データのバッファリングとか、コマンドの強制中断とか、ユーザーによる機器の取り外し要求に対するデバドラの終了処理とか、機器に対するリセット指示とか、機器が応答しない処理とか、あらゆる場合についての機器の制御が要求されます。

それと同時に、アプリ側とのインターフェースも行わないとなりません。機器の機能を過不足なくユーザーに提供する為の、考えられる限りのインターフェースをアプリに提供しなければなりません。「この機器の、この機能は、パソコンと接続した場合は、デバイスドライバで未サポートなので使えません」じゃ困りますからね。

また「その機器が繋がっているUSBポートには、USBハブを介して、別のUSB機器が繋がっている」ので、例え割り込みで「受信したぞ~」って言われても、勝手にUSBポートにアクセスしに行ってはいけません。その割り込みは「他の機器が発した、他のデバイスドライバに対する割り込みで、自分宛じゃない」のかも知れませんから。

そんな訳で「もし、デバイスドライバの開発をする部署なのであれば、即死できる」と思います。デバドラの開発は「簡単に死ねるほど複雑」ですから。

とは言え「コード書いた人間に、デバドラのコードを書かせたりはしない筈」なので、ま「1年半は勉強のつもりで下積み」をやらされるでしょう。

大変でしょうが、がんばってくださいね。

Windowsと仮定しますが、Windowsではアプリケーションが直接USB機器にアクセスする事は出来ません。

USB(と言うか、正確には「Windowsのカーネルシステムが認識しているUSBポート」ですが)は、Windowsのカーネルシステムが占有しています。

特定のアプリが特定のUSB機器を制御するには「その機器専用のデバイスドライバ」を介して行う事になります。

「Windowsのカーネルシステムが認識しているUSBポート」に「USB機器」が接続されると、Windowsのカーネルシステムは「お前は誰だ?...続きを読む

QVC++でUSB通信がしたいのですが

VCで作ったアプリケーションでデータ通信をしています。
今まではRS232Cを使っていて、これをUSB通信にしたいと思っているのですが、
なかなか参考になる資料が見つからなくて困っています。
なるべく簡単に出来る方法があったら教えてください。
あんまり難しいようなら諦めます。

Aベストアンサー

実際に使ったことはないのですが、フリー(らしい)ライブラリがありました。

後、自分で使った経験はないのですが、知り合いが仕事で使ったライブラリ
(こっちは有料)も紹介しておきます。

参考URL:http://www.otto.to/~kasiwano/toppage12.htm, http://www.bsquare.co.jp/products/winrtusb/winrtusb.htm

QCOMポート 名前を取得する方法

VC++2008Express Win32Api
COMポートの名前Portnameを調べて
Listboxに表示させたいと思います。

以下のようにレジストリからフレンドリーネームとかは
取得できるようになったのですが
レジストリのフォルダのVIDとかなんちゃらの部分の値は取得できるのですが
その1階層下のParameterの中にあるPortNameを取得したいです。
要するにCOM6などの部分だけが欲しいです。
どなたか、ご教示ください。よろしくお願いします。

BYTE Buffer[256];
DWORD Length = 0;

SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};

HDEVINFO hDevInfo = SetupDiGetClassDevs(&GUID_DEVINTERFACE_COMPORT,
NULL,
NULL,
(DIGCF_PRESENT | DIGCF_DEVICEINTERFACE));

int ret = SetupDiEnumDeviceInfo( hDevInfo, 0, &DeviceInfoData );

SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC,
NULL, Buffer,sizeof(Buffer),&Length );


MessageBox( NULL,(LPCWSTR)Buffer , 0 , MB_OK );

SetupDiDestroyDeviceInfoList(hDevInfo);

VC++2008Express Win32Api
COMポートの名前Portnameを調べて
Listboxに表示させたいと思います。

以下のようにレジストリからフレンドリーネームとかは
取得できるようになったのですが
レジストリのフォルダのVIDとかなんちゃらの部分の値は取得できるのですが
その1階層下のParameterの中にあるPortNameを取得したいです。
要するにCOM6などの部分だけが欲しいです。
どなたか、ご教示ください。よろしくお願いします。

BYTE Buffer[256];
DWORD Length = 0;

SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_D...続きを読む

Aベストアンサー

このページの情報ではいかがでしょうか。
http://ttssh2.sourceforge.jp/manual/ja/reference/sourcecode.html#serial

Qwsprintf( ポインタ , "%d" , "123" );

char str[100];
char *ptr;

wsprintf(str, "%d", "1234567");

wsprintf(ptr, "%d", "1234567");
について、
TextOut(hDC,0,10,str,lstrlen(str));
TextOut(hDC,0,30,ptr,lstrlen(ptr));
で出力したいんだけど、str ならできたけど、
ptr の方が文字化けしていました。

lstrlen(ptr); がいけないのかと思って、
その値を調べたら 0 でした。

strlen( ) はポインタに対応していると思いました。

#include <iostream.h>
main(){
char *p = "あいう";
cout << strlen(p);
}

で 6 だったから。
Win32 の lstrlen( ) はポインタに対応していないんですか?

Aベストアンサー

> new char[100];
この場合、char 型で、100個分確保して、そのポインタが返ります
new int[50] だったら int 型50個分
もちろん、型だけでなく、クラスも指定出来ます。
new string[50]

> 0065FE08, 0065FE0C, 0065FE10
> で、&ptr が 0065FE00 だったとすると、
> (ptr+2) = "aaa";
*(ptr+2) = "aaa"; の間違いですよね^^;

> としたら、sonota[] の値が変更されてしまうしいうことですね?
変更されますが、変更される値は"aaa"のポインタが、sonata[0]以降に格納されます。

書き換える先が、システムの領域だったら、「不正なアクセス」が起きて、プログラムが落ちます。Linuxだと「Segmentation fault」です。

後、配列とポインタは同じものと思っておいても通常差しつかえありません。array[a] は *(array + a) の様に解釈されます。そのため

int array[3] = { 1,2,3 };
printf("%d, %8x\n", array[0], &array[0]);
printf("%d, %8x\n", 0[array], &0[array]);
printf("%d, %8x\n", array[1], &array[1]);
printf("%d, %8x\n", 1[array], &1[array]);
printf("%d, %8x\n", array[2], &array[2]);
printf("%d, %8x\n", 2[array], &2[array]);

を実行してみてください。ただし、わかりにくくなるトリッキーな書き方なので、使わないのが普通です。

> new char[100];
この場合、char 型で、100個分確保して、そのポインタが返ります
new int[50] だったら int 型50個分
もちろん、型だけでなく、クラスも指定出来ます。
new string[50]

> 0065FE08, 0065FE0C, 0065FE10
> で、&ptr が 0065FE00 だったとすると、
> (ptr+2) = "aaa";
*(ptr+2) = "aaa"; の間違いですよね^^;

> としたら、sonota[] の値が変更されてしまうしいうことですね?
変更されますが、変更される値は"aaa"のポインタが、sonata[0]以降に格納されます。

書き換える先...続きを読む

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

QEXCELのセルが動かないです

普通は、矢印キーを押すと、セルが動きますよね。

今日、仕事中
矢印キーほ押してもセルが動かなくなりました。
画面は動きますがセルがついて来ないのです。
そのPCで使う場合どのエクセルも同様の動きです。

ツールバーあたりを設定する必要がありますかね。

Aベストアンサー

そのPCのScroll Lock (Scr Lk)キーが押されていませんか?

QC# シリアル通信でデータ受信時の欠損について

Visualstudio 2013 を使用して C# で開発を行っています。

SerialPort Classを使用してデータの送受信をするプログラムを作成しているのですが、
非同期でデータを受信する際にどうしてもうまくデータを取得出来ません。

5Byteのデータは正常に取得できるのですが、
その直後にくる40Byteのデータは、真ん中あたりの10数Byteや最後の10数Byteしか取れません。


serialPort.DataReceived に登録したイベント関数の中身です。

--------------------------------------------------------------------------------------
private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
bytesRead = 0;
// Initialize a buffer to hold the received data
byte[] buffer = new byte[this.serialPort.ReadBufferSize];

try
{
bytesRead = this.serialPort.Read(buffer, 0, buffer.Length);
if (true == serialPort.IsOpen)
{
serialPort.DiscardInBuffer();//受信バッファをクリアする
}

}
catch (Exception ex)
{
DataLog.Exception(ex);
}

//派生クラス用の処理
DeviceClassEventArgs _DeviceClassEventArgs = new DeviceClassEventArgs(buffer, bytesRead);
DeviceClassEvent(this, _DeviceClassEventArgs);
}
--------------------------------------------------------------------------------------

ネットの情報を参考に、
ReceivedBytesThreshold の値を期待するデータ量に逐一変えることで
とりあえず正常に取ることが出来たのですが、これでいいのでしょうか?
期待するデータ量がわからなかった場合は使えないのかなとも思います。

データが欠損してしまう理由、
上記の対処法以外の一般的な対処法など有りましたら教えて下さい。

その他参考になるページ等ありましたら教えていただけると大変助かります。

Visualstudio 2013 を使用して C# で開発を行っています。

SerialPort Classを使用してデータの送受信をするプログラムを作成しているのですが、
非同期でデータを受信する際にどうしてもうまくデータを取得出来ません。

5Byteのデータは正常に取得できるのですが、
その直後にくる40Byteのデータは、真ん中あたりの10数Byteや最後の10数Byteしか取れません。


serialPort.DataReceived に登録したイベント関数の中身です。

-------------------------------------------------------------------------------...続きを読む

Aベストアンサー

DataReceivedイベントが発生したときでも、
シリアルポートへの受信はまだ継続している可能性があるので
不用意にバッファクリアしてはいけない。
非同期の受信処理は、何かと難しいのです。

private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
  bytesRead = 0;
  // Initialize a buffer to hold the received data
  byte[] buffer = new byte[this.serialPort.ReadBufferSize];

  try
  {
    //bytesRead = this.serialPort.Read(buffer, 0, buffer.Length);
    //if (true == serialPort.IsOpen)
    //{
    // serialPort.DiscardInBuffer();//受信バッファをクリアする
    //}

    // 受信バッファにデータがなくなるまで繰り返し読込む
    while (true)
    {
      if (0 == serialPort.BytesToRead)
      {
        break;
      }
      buffer[bytesRead] = (byte)serialPort.ReadByte();
      bytesRead++;
      System.Threading.Thread.Sleep(0);

      // シリアルポートの受信バッファには、
      // ・必要なブロックの途中から受信している。
      // ・次のブロックの先頭部分も受信されている。
      // 可能性があるので、ここで必要なブロックだけRead()できたことを確認する。
      if (必要なブロックが正常に読めたか確認する関数())
      {
        break;
      }
    }
  }
  catch (Exception ex)
  {
    DataLog.Exception(ex);
  }

  //派生クラス用の処理
  DeviceClassEventArgs _DeviceClassEventArgs = new DeviceClassEventArgs(buffer, bytesRead);
  DeviceClassEvent(this, _DeviceClassEventArgs);
}

DataReceivedイベントが発生したときでも、
シリアルポートへの受信はまだ継続している可能性があるので
不用意にバッファクリアしてはいけない。
非同期の受信処理は、何かと難しいのです。

private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
  bytesRead = 0;
  // Initialize a buffer to hold the received data
  byte[] buffer = new byte[this.serialPort.ReadBufferSize];

  try
  {
    //bytesRead = this.serialPort.Read(buffer, 0, buffer.Le...続きを読む

Qシリアル通信プログラム(受信)について

現在、シリアル通信をする(受信のみ)プログラムを作成しています。
接続先は1秒ごとに10バイトのデータを自動で送信してきます。
現段階でPC側でデータを受信できることは確認できました。
しかし、受信データが文字化け(出力結果が{や■などがでています)しており、その原因がわかりません。
どこが問題なのか教えていただけないでしょうか?

また、接続先からは10バイトのうち最初の2バイトは固定の値(0x2b,0x22)がでてくるはずなのですが、それもでてきていません。これも文字化けで見えていないだけでしょうか?
文字化けしても周期的に固定の値に対応した文字がでてくるものだと思ったのですが、でてきていません。
(ソースで50バイトまでみているのはこの周期性を確認するためです)

シリアル通信を初めてさわるので、考え方自体間違っているかもしれませんが
配列pszBufに1つずつ、受信された1バイトのデータが格納されていると思っています。
個人的にはprintfでの表記(%cがいけない?)に間違いがあるかと疑っています。

ご回答よろしくお願いいたします。

(環境)
Visual C++ 2008 (C/C++)

(シリアルポート設定)
ボーレート 9600bps
パリティ   なし
ストップビット 1
データビット 8

(ソース) ※ポートの設定は省略。受信部のみ記述
HANDLE hComm;
DWORD dwErrors;
COMSTAT ComStat;
char pszBuf[1024];
DWORD dwRead;

ClearCommError(hComm, &dwErrors, &ComStat);
ReadFile(hComm, pszBuf, 50, &dwRead, NULL);  //50バイトまでデータを取得

for(int i=0;i<50;i++){
printf("%c\n",pszBuf[i]);
}

(参考URL)
http://www.geocities.jp/terukat/_geo_contents_/win/comm.html

現在、シリアル通信をする(受信のみ)プログラムを作成しています。
接続先は1秒ごとに10バイトのデータを自動で送信してきます。
現段階でPC側でデータを受信できることは確認できました。
しかし、受信データが文字化け(出力結果が{や■などがでています)しており、その原因がわかりません。
どこが問題なのか教えていただけないでしょうか?

また、接続先からは10バイトのうち最初の2バイトは固定の値(0x2b,0x22)がでてくるはずなのですが、それもでてきていません。これも文字化けで見えていない...続きを読む

Aベストアンサー

>一応、ReadFileをおわったあとにdwReadを確認したのですが、50になっていました。

であれば、ReadFile()が失敗したとかはなさそうですね。
# ReadFile()の戻り値を確認していないのであればdwReadはReadFile()コール前にクリアしておいた方がいいかと思いますが。

>なんらかの失敗といわれるとどういった失敗がありえるのでしょうか?

タイムアウトがないのであれば…基本的には失敗はない…でしょうね。
コネクタ類が接触不良でデータが化けるとか、XON/XOFFフロー制御している…とかでなければ。

>(ボーレートの設定がおかしければデータがかわることはあるでしょうが・・・)

ボーレート以外の設定が異なっていた場合も化けると思われます。

>接続先がデータを送らなくとも、ReadFileがデータを格納することがあるのでしょうか?

受信バッファに残っていた場合は読み出す…でしょうね。

CreateFile()でシリアルポートを開く処理、シリアルポートの設定を行っている部分も掲示された方がいいかも知れません。
# が、私自身はAPI叩いてシリアルポート操作したことは無かったりします。

WindowsAPIのパターンとして…構造体は0x00でクリアして必要な部分だけ設定する。
という方法を採らないと妙な挙動することもありますので、その辺りは確認された方がいいでしょう。
APIに構造体のアドレスを渡して、情報を取得(上書きされる)から…ということで、未初期化の構造体渡したらエラーで何も設定してくれなかった。
なんて場合もあります。
# 構造体のメンバに「構造体のサイズ」を格納する場合、その構造体のサイズで対応バージョンを判別する。
# なんて挙動をしている場合もありますので。

>一応、ReadFileをおわったあとにdwReadを確認したのですが、50になっていました。

であれば、ReadFile()が失敗したとかはなさそうですね。
# ReadFile()の戻り値を確認していないのであればdwReadはReadFile()コール前にクリアしておいた方がいいかと思いますが。

>なんらかの失敗といわれるとどういった失敗がありえるのでしょうか?

タイムアウトがないのであれば…基本的には失敗はない…でしょうね。
コネクタ類が接触不良でデータが化けるとか、XON/XOFFフロー制御している…とかでなければ。

>(ボーレ...続きを読む


人気Q&Aランキング