• 締切済み

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