• ベストアンサー

MATLABのtimer関数について

GPIBを用いて機器を制御しようとしています。 そこで質問なのですがtimer関数を用いて電圧をステップ的に落とすことが できるのでしょうか?? 僕はTimerFcnのところでfprintfを用いて機器にコマンドを送ろうと しているのですがうまくいきません(出力引数が多すぎるとのエラー) やはり、ハンドル関数などを使うのでしょうか??? 知識を貸してください。

質問者が選んだベストアンサー

  • ベストアンサー
  • sgwjn
  • ベストアンサー率70% (47/67)
回答No.3

#01です。 まずはお詫びを。 >t.TimerFcn = ['fprintf(', num2str(b), ','''volt 2''')'] シングルクォートが多かったですね。 以下、ご質問への回答です。 (1)TimerFcnが動作しつづけない まず、記述がおかしいです。 >t.TimerFcn='fprintf(h,''volt 5'')'; とありますが、これだとfprintf関数が実行されないと思います。 ここでの’h’は数値型の変数ですよね? だとすると、以下のように記述しなければならないはずです。 t.TimerFcn=['fprintf(', num2str(h, '%.15f'), ',''volt 5'')']; (2)fprintfのvolt 5のところに変数 上述した方法で大丈夫です。 具体的には、以下のようになります。 n=5; t.TimerFcn=['fprintf(', num2str(h, '%.15f'), ',''volt ', num2str(n), ''')']; (3)時間に比例して変化させる 秒単位であれば、工夫すればいけるような気がします。 ただ、1/100秒位の精度での制御は難しいかも知れませんね。

tasty_nuts
質問者

お礼

回答ありがとうございます!! おかげでうまく動作させることができました! うまく動作できたってのは,線形的に変化させることができたという意味です^^ 特にnum2strのところはコメントをもらわなかったらできていなかったです! また,知識を貸してもらうような機会があると重いますのでそのときにはまた,回答してくることを願います!

その他の回答 (2)

  • sgwjn
  • ベストアンサー率70% (47/67)
回答No.2

#01です。 >t.TimerFcn=fprintf(b,'volt 2') この行はおかしいと思います。 TimerFcnプロパティは、実行する関数を文字列で指定しなければならないと思います。 t.TimerFcn = ['fprintf(', num2str(b), ','''volt 2''')']

tasty_nuts
質問者

補足

ありがとうございます!! とりあえず、エラーなしで動かすことはできました!! ですが、やはり僕の思ってたステップ的には動作してくれません。。。 start(t);のあとにwait(t);を入れることで3秒後にタイマーはちゃんと動作してくれましたがそれから5秒間の間、TimerFcnが動作しつづけてくれません・・・。 Periodのプロパティを設定してみたのですがだめでした。 t=timer; set(t,'StartDelay',3,'Period',5) t.TimerFcn='fprintf(h,''volt 5'')'; start(t); wait(t); stop(t); delete(t); のような状態です。 これはstop(t);が近すぎて駄目だという感じなのかなとは自分では考えているのですか・・・。 あと、質問攻めですみませんが、将来的にはステップ的ではなく線形的に電圧を変化させたいと考えているのですがfprintfのvolt 5のところに変数はおけるものなんでしょうか? 置けたとしてもそこから時間に比例して変化させるのは厳しいのかなって自分的には考えています。

  • sgwjn
  • ベストアンサー率70% (47/67)
回答No.1

>僕はTimerFcnのところでfprintfを用いて機器にコマンドを送ろうとしているのですがうまくいきません(出力引数が多すぎるとのエラー) ソースコードやエラーメッセージも示さずに、何を回答しろと言うのでしょうか? ご質問からは、関数の戻り値の受け取りが不正なこと以外何も分かりません。

tasty_nuts
質問者

補足

b=gpib('ni',2,12); fopen(b) set(b,'EOSMode','read&write') set(b,'EOSCharCode','LF') fprintf(b,'volt 3') t=timer; set(t,'TimerFcn') t.TimerFcn=fprintf(b,'volt 2') start(t); stop(t); delete(t); fclose(b); delete(b) こんな感じに書いています。 エラーは ??? ==>icinterface.fprintf 出力引数が多すぎます エラー==>t.TimerFcn=fprintf(b,'volt 2') こんな感じです。 自分自身の考え方だとハンドル関数を使って何かしらするのかなとは 思うのですがMATLABマニュアルを見てもさっぱりわかりませんでした。