• 締切済み

SMC-4DL-PCIボードでのプログラム

コンテックさんのSMC-4DL-PCIボードを使用してアクチュエータを動かそうとしています(動かしたいのはオリエンタルモーターさんのELC)。 VC6.0を使用してプログラミングを行い、ビルドして.exeを実行すると何も起きません。 ボードに付属のサンプルプログラムではアクチュエータが動くので、配線ミスということは無いと思います。 おそらく組んだプログラムのどこかがおかしいのだとは思うのですが、恥ずかしながらプログラミング自体初めてなうえ、サンプルプログラムが難しすぎて解読が全く出来ないのでどうしたらいいか困っています。 卒論で使用するのでとにかく早く作り上げなければなりません。 足りない部分、間違いなどあればご指摘お願いします。 (ちゃんとライブラリファイルも追加してあります) #include "stdafx.h" #include "CSmc.h" #include "CSmcdef.h" int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { long Ret; char *DeviceName ="SMC000" ; short Id ; Ret = SmcWInit( DeviceName , &Id ); short PulseMode ; short DirTimer ; PulseMode = 5; DirTimer = 1; Ret = SmcWSetPulseType( Id , 1, PulseMode , DirTimer ); Ret = SmcWSetInitParam( Id , 1); short MotionType ; short StartDir ; MotionType = 2; StartDir = 0; Ret = SmcWSetReady( Id , 1, MotionType , StartDir ); short Coodinate ; short StopPosition ; Coodinate = 1; StopPosition = 1000; Ret = SmcWSetStopPosition( Id , 1, Coodinate , StopPosition ) ; Ret = SmcWMotionStart( Id , 1); Ret = SmcWExit( Id ); return 0; }

みんなの回答

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.2

追加~ #1に書いたのは原点だし(原点復帰処理イメージ) 初期化後に特定位置に動かすなどのときは以下みたいな感じ (各関数は書いた順に使ってます) SmcWSetAccelTime  ---- 無くても動くはず SmcWSetDecelTime  ---- 無くても動くはず SmcWSetStartSpeed  ---- 無くても動くはず SmcWSetTargetSpeed  ---- 無くても動くはず SmcWSetStopPosition  --位置設定 SmcWSetReady      --動作モード設定 SmcWMotionStart    --動作開始 #1では SmcWSetHoldOff関数の前に書いた SmcWSetStartSpeed SmcWSetTargetSpeed は要らなかった(その後同じ関数書いてる)

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.1

全部ちゃんと見てません とりあえず真っ先に目に付いた突っ込みどころが一つ >Ret = SmcWMotionStart( Id , 1); >Ret = SmcWExit( Id ); 動かし始めて直ぐ止めて(終了して)ますので見た目動かないはずです とりあえずその間に Sleep(10000) などと書いてみてください 他にざっと見て >Ret = SmcWSetPulseType( Id , 1, PulseMode , DirTimer ); >Ret = SmcWSetInitParam( Id , 1); ここも順番が逆かな 後モータ使用によるけど励磁ONになってないんじゃないかな    SmcWSetHoldOff関数 動作マスクも設定しないとちゃんと動きません    SmcWSetCtrlTypeOut関数 (リミットセンサなどの有効無効設定  これはお使いのハードに従って設定してください) Contecサンプルプログラムのソースファイルも入ってるはずですが それ見ても分かりませんか? 以下私が行ってるのは以下のような感じです ※ パラメータなどは一部省略 SmcWInit SmcWSetInitParam SmcWSetCtrlInOutLog SmcWSetOrgLog SmcWSetCtrlTypeOut SmcWSetOrgMode SmcWSetStartSpeed SmcWSetTargetSpeed SmcWSetHoldOff SmcWSetAccelTime SmcWSetDecelTime SmcWSetStartSpeed SmcWSetTargetSpeed SmcWSetReady SmcWMotionStart 速度関係の関数は設定しなくてもドライバ設定の初期値で動くはずです 動かないなら各関数のリターンコードをチェックして どの関数でエラーを起こしているか確認しエラーコードの内容を ヘルプで調べてそれなりの対処するかこちらへの補足をどうぞ (私は常にここを見ているわけではないので反応速度は保障できません) 個人的に言わせてもらえば WDMドライバより98/NTドライバ使ったほうがプログラム的には 楽のような気がします(※ 個人的な慣れかもしれません) 機能はWDMの方が上のはず(実情困ったことは無い)

ayame183
質問者

お礼

ありがとうございました!! Ret = SmcWSetPulseType( Id , 1, PulseMode , DirTimer ); Ret = SmcWSetInitParam( Id , 1); を入れ替え、Sleepを追加したら無事に動いてくれました。 卒論の追い込み時期なので、koi1234さんには感謝してもしきれません! 本当にありがとうございました・・・!!!

関連するQ&A

  • SMC-4DL-PCIボードでの制御プログラム

    コンテックさんのSMC-4DL-PCIボードを使用してアクチュエータを動かそうとしています(動かしたいのはオリエンタルモーターさんのELC)。 VC6.0を使用してプログラミングを行い、ビルドして.exeを実行すると何も起きません。 ボードに付属のサンプルプログラムではアクチュエータが動くので、配線ミスということは無いと思います。 おそらく組んだプログラムのどこかがおかしいのだとは思うのですが、恥ずかしながらプログラミング自体初めてなうえ、サンプルプログラムが難しすぎて解読が全く出来ないのでどうしたらいいか困っています。 卒論で使用するのでとにかく早く作り上げなければなりません。 足りない部分、間違いなどあればご指摘お願いします。 (ちゃんとライブラリファイルも追加してあります) #include "stdafx.h" #include "CSmc.h" #include "CSmcdef.h" int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { long Ret; char *DeviceName ="SMC000" ; short Id ; Ret = SmcWInit( DeviceName , &Id ); short PulseMode ; short DirTimer ; PulseMode = 5; DirTimer = 1; Ret = SmcWSetPulseType( Id , 1, PulseMode , DirTimer ); Ret = SmcWSetInitParam( Id , 1); short MotionType ; short StartDir ; MotionType = 2; StartDir = 0; Ret = SmcWSetReady( Id , 1, MotionType , StartDir ); short Coodinate ; short StopPosition ; Coodinate = 1; StopPosition = 1000; Ret = SmcWSetStopPosition( Id , 1, Coodinate , StopPosition ) ; Ret = SmcWMotionStart( Id , 1); Ret = SmcWExit( Id ); return 0; }

  • CONTEC SMC-4DL-PE プログラム

    CONTECのボード:SMC-4DL-PE、三菱電機のサーボアンプ:MR-J4-70Aとモータ:HG-KR73Bを接続し、モータを動かすプログラムを作成しております(言語はC#です)。 ボードとアンプの配線は以下のURLを参考に行いました。 URL:http://www.contec-kb.com/848/ プログラム作成の参考として、まず、ボード付属のサンプルプログラムBaseMove等を使用して、モータが動くかどうか確認したのですが、モータが動かなくて困っております(動作時、エラーはありませんでした)。 三菱電機のソフトMR Configrator2を使用したテスト運転では、モータが動作することを確認できましたので、アンプとモータの配線は大丈夫だと考えております。 原因として、以下の項目が挙げられると思っています。 [1] ボードとアンプの結線のミス [2] ボードのSmcWSetPulseType関数等の各種初期設定内容が、相手機器(アンプ)の仕様に準じていない [3] ボードのパルス出力部の不良 個人的には2番目ではないかと、疑っているのですが、(ボード側およびアンプ側の)どの初期設定を変更すれば、モータが動作するようになるかわからず、困っております。 この問題および使用機器等について詳しい方、ご教示いただけますと幸いです。 よろしくお願いいたします。

  • windowsプログラム、文字化けする

    windowsプログラム、文字化けする 最近になってwindowsプログラムに興味を持ってやってみようと思い サイトでいざ勉強しようと思ったんですが、サンプルコードをVC++2008で コンパイル実行してみると、すべて文字化けしています。なぜでしょう ちなみにOSはXP、サンプルコードてのが #include <windows.h> int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MessageBox(NULL, "Hello World!", "メッセージ", MB_OK); return 0; } メッセージボックスでの文字表示のサンプルみたいですがどうもうまくいきません もう1つ このサンプルをソースファイルの拡張子cppでやるとエラーがでるんですがcだと警告が出るだけなんですが これはいったいなんででしょうか。 すみません、最近こういう勉強を始めたばかりなので。

  • spawnl

    #include "stdafx.h" #include <process.h> int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // TODO: この位置にコードを記述してください。 _spawnl(_P_WAIT, "chkbook.exe",...); return 0; } 上のようにして、MFCサンプルの ckhbook.exe  (引数はありません。) を呼び出そうとしましたが、上手く動きません。  どのように修正すれば良いのでしょうか?  コンソールプログラムの場合は、 簡単に呼び出せます。  よろしくお願いいたします。

  • C言語:アウトプット引数のキャストについて

    以下のサンプルソースのように、(1)の場合、出力結果が24にならないのはなぜでしょうか?基礎的な質問だと思いますがよろしくお願いします。 --------------------------------------- サンプルソース #include <stdio.h> int getValue(unsigned short* us){ *us = 24; } main(){ int ret = 0; int intVal = 0; unsigned short usVal = 0; /* (1)int型のintValをunsigned short型にキャストした場合 */ ret = getValue((unsigned short*)&intVal); printf("%d\n", intVal); /* (2)unsigned short型のusValをそのまま引数に渡した場合 */ ret = getValue(&usVal); printf("%d\n", usVal); } ---------------------------------- 出力結果 1572864 ←(1)の結果 24 ←(2)の結果 -----------------------------------

  • Windowsゲームプログラミングを始めたのですが

    最近ゲームのプログラムを始めた者です。 C言語でWindowsプログラムを書き始めたのですが、最初の宣言を行った時点でコンパイル時に大量のエラーが出てしまいました。 ↓が内容です。 #include<windows.h> #include<stdio.h> #include<stdlib.h> int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){ } 使用OSはVistaです。 急いではいないので、どなたか解決法を知っている方、ご指導お願いします。

  • WINDOWSプログラミングをしている方へ質問

    WINDOWSプログラミングしている方へ質問です。 DOSプログラム #include <stdio.h> int main(void) { ・・・・・・・   return 0; } までの文+基本的な関数を覚えているプログラマが大半(ほぼ全員)だと思いますが WINDOWSプログラム #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); char szClassNme[] = "任意の文字"; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, LPSTR lpszCmdLine, int nCmdShow) { ・・・・・・ return (0L); } までの文+基本的な関数をWINDOWSプログラマは覚えているのでしょうか? それともCの基本的な事が分かるうえで必要に応じて関数や決まり事 を確認(本やサイト等)しながらプログラミングを しているのでしょうか? 両方のの経験者の方、暇な時にでも回答お願いします

  • F-BASICを使用して、コンテックのデジタル入出力ボードを制御する方法は?

    F-BASICで、コンテック製のデジタル入出力ボード(PIO-16/16L(LPCI)H)を制御したいのですが、制御できません。 付属のCD-ROMのサンプルプログラムやテクニカルリファレンスを読みましたが、ぜんぜん参考になりません。 制御(入出力プログラム)を御教えください。御願いします。  OSは、WIN2000です。

  • ShellExecuteをつかって・・・

    もしかしたら非常に簡単な問題かもしれないんですけど、 SDIベースでShellExecuteをつかって以下のような関数を作ってコンパイルすると、 ”error C2065: 'm_hWnd' : 定義されていない識別子です。” がでます。 前に別プロジェクトでやったときは特に定義せず使えたような気がするのですが、 何か使い方が間違っているのでしょうか? #include "stdafx.h" #include "FCwin.h" #include "MainFrm.h" #include "FCwinDoc.h" #include "FCwinView.h" ・・・中略・・・ int CFCwinApp::DosFcExe() { HINSTANCE ret = ShellExecute(m_hWnd,"open","command.com",NULL,"c:\\",SW_SHOW); if((int)ret <= 32 ){AfxMessageBox("DOS窓開けません",MB_OK);return 1;} return 0; }

  • C++BuilderでHelloWorld

     『プログラミングWindows』に載っている以下のコードをC++Builder6で実行するにはどうすればいいですか? #include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MessageBox(NULL, TEXT("Hello, Windows 98!"), TEXT("HelloMsg"), 0); return 0; }