プロが教える店舗&オフィスのセキュリティ対策術

コンテックさんの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;
}

A 回答 (2件)

全部ちゃんと見てません


とりあえず真っ先に目に付いた突っ込みどころが一つ
>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の方が上のはず(実情困ったことは無い)
    • good
    • 0
この回答へのお礼

ありがとうございました!!

Ret = SmcWSetPulseType( Id , 1, PulseMode , DirTimer );
Ret = SmcWSetInitParam( Id , 1);

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

お礼日時:2010/01/18 11:08

追加~ #1に書いたのは原点だし(原点復帰処理イメージ)


初期化後に特定位置に動かすなどのときは以下みたいな感じ
(各関数は書いた順に使ってます)

SmcWSetAccelTime  ---- 無くても動くはず
SmcWSetDecelTime  ---- 無くても動くはず
SmcWSetStartSpeed  ---- 無くても動くはず
SmcWSetTargetSpeed  ---- 無くても動くはず
SmcWSetStopPosition  --位置設定
SmcWSetReady      --動作モード設定
SmcWMotionStart    --動作開始

#1では
SmcWSetHoldOff関数の前に書いた
SmcWSetStartSpeed
SmcWSetTargetSpeed
は要らなかった(その後同じ関数書いてる)
    • good
    • 0

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