プログラム制御に関する質問

このQ&Aのポイント
  • プログラム制御についての質問です。既存のプログラムを解読していますが、理解できない箇所があります。具体的には、LOAD・STORE・-・/・*・+などのコードがありますが、それぞれが何を意味しているのかわかりません。
  • 質問文章には、プログラム制御に関連したコードが含まれています。特に、LOAD A・B・DやSTORE C・F・G・H、そして-・/・*・+などの演算子が使われています。これらのコードは、モータのPID制御を行うためのものでしょうか?また、一次方程式を形成しているのか、変動割合を導出しているのかも知りたいです。
  • この質問文章は、既存のプログラムの解読に関する質問です。具体的には、LOAD・STORE・-・/・*・+などのコードが使われていますが、その意味や目的が理解できません。また、このプログラムはモータのPID制御を行うためのものなのでしょうか?それとも、一次方程式を形成して変動割合を求めるためのものなのでしょうか?
回答を見る
  • 締切済み

プログラム制御

既存のプログラムが有り解読を行っていますが理解不明です。ご教示を宜しくお願いします。コード内容は、 LOAD A (=6000) - B (=1500) STORE C (A-B→C) LOAD D (=350) - E (=10) STORE F (D-E→F) / C STORE G (F/C→G) * B + D STORE H ((G*B)+D→H) 本プログラムはモータのPID制御を行っており、その一部のコードです。 内容としては、一次方程式を形成し変動割合を導出しているのかと考えましたが一次方程式では+Dのコードが+Eであると思われます。 何を形成しているのでしょうか。

noname#230358
noname#230358

みんなの回答

noname#230359
noname#230359
回答No.3

A-B=C D-E=F F/C=G ((G*B)+D=H) (((D-E)/(A-B))*B)+D=H と、成りますが  問題は Aは何? <速度指令? Bは何? <速度フィードバック? >本プログラムはモータのPID制御を行っており、その一部のコードです。 なので 恐らく結果的には http://www.picfun.com/motor05.html // ΔMVn = Kp(en-en-1) + Ki en + Kd((en-en-1) - (en-1-en-2)) // MVn、MVn-1:今回、前回操作量  ΔMVn:今回操作量差分 // en,en-1,en-2:今回、前回、前々回の偏差 このような式に収束すると思います A,B,C,D全部が定数なら >A,Dは最大値、B,Eは最小値と思われます。 これから、ただ単にスケーリングパラメータと憶測できる >Hは、”H-(F(=D-E)/C(=A-B))*回転数データ”として使用され、 DA変換出力ユニットに渡す値とも憶測できる それなら2047か4095になりそうなものだが? AD入力ユニットから来たデータと DA出力ユニットへ渡すデータと それらから追跡するのが順当な分析手順ではあるが それらは既に分析出来ているのでしょうか? 例えば本質問の計算はハンチング発生検出とか 加速度異常検出とかの異常検出プログラムとも憶測できる 通常では異常検出は入出力ルーチンから分離して、制御ループとは別に作られる 制御ループを追跡してたつもりが、実は異常検出ルーチンにハマっていたとか?

noname#230358
質問者

補足

ご回答頂きありがとうございます。 A,B等については定数が設定されているだけで不明です。但し、ozuさんの補足にも記載しましたがA=6000,B=1500,D=350,E=10で算出された値を後にE及び、Dと大小比較している事からもA,Dは最大値、B,Eは最小値と思われます。 最大値から勘案すると回転数-周波数特性が想像出来ますが質問プログラムより一致するのかが納得いっていない次第です。

noname#230359
noname#230359
回答No.2

回答ではなくて、申し訳ありませんけど、、、 提示されている限りでは、 ABDEを読み込んで、CFGHを吐き出していることしかわかりません。 > 内容としては、一次方程式を形成し変動割合を導出しているのかと考えましたが > 一次方程式では+Dのコードが+Eであると思われます。 ここの意味が今ひとつわかりかねます。 1次方程式であれば、ゼロを放り込んで、y切片を確定しないといけないと思いますが。 ABDEの意味の説明とか、(時間差で追記がありますね。) Hの使われ方を提示されると専門の方の有効な回答が得られると思います。

noname#230358
質問者

補足

アドバイスありがとうございます。 >ゼロを放り込んで、y切片を確定しないといけない と有りますがy=ax+bのxに0を入れてy=bに意味でしょうか。 だとした場合、質問プログラム中のEが方程式のbに相当し+Dならば方程式と判断できるが+Eでは何になるのかの問いでした。 また、ABCDについては数値をデータメモリに転送しているだけで判断出来ません。Hは、”H-(F(=D-E)/C(=A-B))*回転数データ”として使用され、その解をEと比較しE(最小値?)<解の場合はDとの大小比較に、 E>解の場合はEの値を有効にすると続きます。

noname#230359
noname#230359
回答No.1

心得のある人には説明不要なのかもしれませんが、プログラム言語が何で あるかを説明した方がよさそうに感じます。 また、記載なさったコードの前後にもプログラムがあると想像しますが、 すっぱり割り切れるものでしょうか? さらに、モーターのPID制御とのことですが、制御の対象は回転数、トルク 或いはもっと別のパラメータでしょうか?

noname#230358
質問者

補足

ご連絡、ありがとう御座います。 プログラム言語はプロセス制御用のシーケンスプログラムです。 制御はモータ回転数です。 前後プログラムについては前段は各データレジスタへの定数設定、後段は別項目のPID制御プラグラムに関するパラメータの設定です。質問対象のプログラムに設定されている項目(A,B,C・・・)はアナログ出力データ関連のパラメータの様です。質問はあくまで記入したプログラムより数学的にどの様な物に相当するかを知りたかった為に省略しました。上記がヒントになりますでしょうか。

関連するQ&A

  • 円周率を求めるC言語のプログラム

    int a=10000,b,c=8400,d,e,f[8401],g;main(){for(;b-c;)f[b++]=a/5;for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b); というのが本(「π魅惑の数」)に載っていたので #include <stdio.h> int main(void){ int a=10000,b,c=8400,d,e,f[8401],g; for(;b-c;)f[b++]=a/5; for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a) for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b); return 0; } としたのですが 円周率を表示してくれません。 (b=0にすると一応は出てくるのですが微妙に間違ってます(よく分からないですけどそのくらいの誤差のあるプログラムなのでしょうか?))

  • ニュートン法をC言語でプログラム

    方程式 cos^2x-0.5=0 (0<x<π) の解をニュートン法で求める という問題をC言語のプログラムを作り計算したいのですが分かりません。 自分で考えてみたプログラムは以下の通りです。 #include <stdio.h> #include <math.h> #define f1(x) cos(x)*cos(x)-0.5 #define f2(x) sin(2*x) /* ニュートン法による方程式の解 */ main() { double x0,x1,a,b,c,d,g,n; a=1; x0=0.7; n=0; while(a>0.0001){ b=x0; d=f1(b); g=f2(b); x1=x0-d/g; c=x1; a=f1(c); n=n+1; printf(" n= %f x1=%f x0=%f\n",n,x1,x0); printf(" a= %f → 解 x= %f \n", a,x1); x0=x1; } } 自分としてはこれが精一杯で、何故間違ってるのか、何をどうすればいいのか、さっぱり分かりません。どういったところが間違ってるのか可能性だけでも示して頂ければ幸いです。 参考として、ニュートン法によるプログラム例として書かれていたものを上げさせて頂きます。 例: e^x-3=0 の解をニュートン法により計算する。 #include <stdio.h> #include <math.h> #define f1(x) exp(x)-3 #define f2(x) exp(x) /* ニュートン法による方程式の解 */ main() { double x0,x1,e,a,b,c,d,g,n; a=1; x0=3; n=0; while(a>0.0001){ b=x0; d=f1(b); g=f2(b); x1=x0-d/g; c=x1; a=f1(c); n=n+1; printf(" n= %f x1=%f x0=%f\n",n,x1,x0); printf(" a= %f → 解  x= %f \n", a,x1); x0=x1; } }

  • アセンブリプログラムの問題です。

    アセンブリプログラムの勉強をしているのですが、以下の問題がわかりません。 (1) 変数f, g, h, i, j はCのプログラム内で32ビットの整数として宣言されているものとする。 以下のCのステートメントをMIPSのアセンブリコードで表せ。 また、f, g, h, i, j の値がそれぞれ1, 2, 3, 4, 5 であるならば最終的なfの値はいくつか。 a. f = g + f + i ; b. f = g + (h + 2); (2) 変数f, g, h, i, jはそれぞれ$s0, $s1, $s2, $s3, $s4に割り当てるられているものとする。また、配列AとBのベースアドレスは、それぞれレジスタ$s6 と$s7 に割り当てられているものとする。 次のCのステートメントをMIPSのアセンブリコードで表せ。 a. f = g + h + B[4] ; b. f = g - A[ B[4] ] ; c. f = -g + h + B[1] ; d. f = A[ B[g] + 1 ] ; (3) (2)の設定において、次のMIPSのステートメントをCのステートメントで表せ。 また、可能ならばこのMIPSアセンブリコードを同じ機能を果たしながらMIPS命令の数が最小になるように書き直せ。 a. add $s0, $s0, $s1 add $s0, $s0, $s2 add $s0, $s0, $s3 add $s0, $s0, $s4 b. lw $s0, 4($s6) 以上です。わかるものだけでも良いので教えてもらえますでしょうか?

  • 配列の要素を任意の数で割って、割り振る方法

    $abc = array("A", "B", "C", "D", "E", "F", "G", "H", "I"); 上記のような配列があったとします。 これを任意の数で割って、割り振っていきたいのですが、例えば7で割ったとしたら、 1. A, B 2. C, D 3. E 4. F 5. G 6. H 7. I という風に、割り振りたいのですが、どのようにすれば、こういったことがPHPのプログラムで実現できるか教えてください。 もしくは、 1. A, H 2. B, I 3. C 4. D 5. E 6. F 7. G という割り振り方でも大丈夫です。

    • ベストアンサー
    • PHP
  • セルの交換について

    今このようなデータがあったとします。   A B C D E F G H   ------------------ ~ 7|    a   - - - - 8|    b   1 - - - 9|    c   2 4 - - 10|    d   3 5 6 - セルを交換していって作りたいと考えております。 4×4の場合ですと上の状態だと 手順としては (1)E7とH10を交換 (2)E8とG10を交換 (3)E9とF10を交換 (4)E10とE10を交換 (5)F7とH9を交換 (6)F8とG9を交換 (7)F9とF9を交換 (8)G7とH8を交換 (9)G8とG8を交換 (10)H7とH7を交換 で下のような図になると思います。   A B C D E F G H   ------------------ ~ 7|    a   - - - - 8|    b   6 - - - 9|    c   5 4 - - 10|    d   3 2 1 - 頂いたデータはすべて4×4ではないのでこれをnという一般のときでもできるようにしたいのですが、わからないのでコードを教えていただけますでしょうか?nはC7から最終行でいいかと思います。 とりあえず思いついた方法なのでこの方法以外でも出来るというのであれば教えていただきたいです。

  • プログラムがうまく実行できません。

    下にソースを載せたのですが、このプログラムがうまく実行できません。 OSはWin XPでコンパイラはボーランドのフリーコンパイラを利用しています。 #include<stdio.h> #include<math.h> int main() { double a,b,c,d,e,p; a=-1.43; b=1.43; c=-4.29; d=1.72; e=2.43; fot (p=0; p<1; p=p+0.0001){ printf("(%1.5f*pow(p,2)+%1.5f)/(%1.5%f*pow(p,2)+%1.5f*p+%1.5f,\n",a,b,c,d,e); } return 0; } (変えたい内容) pの値が0<p<1の範囲で、0.0001から0.0001ずつ増して行き、0.9999まで繰り返し処理して、1回ずつの値を出力したいのですが、うまくいきません。

  • 地層の順番

    次の写真のアルファベットの形成を並び替える問題です。 答えはD→C→F→E→G→H→I→B→J→Aです。 ここで質問です。IとBはどちらが先でも後でも良いように感じる(D→C→F→E→G→H→B→I→J→A)のですが、なぜIが先となるのでしょう? よろしくおねがいします。

  • エクセル 3列おきに列を挿入したい

    いつもお世話になります。 1行目に営業所コードがあり、そのコードを3列おきに表示するにはどうしたらいいでしょうか。   A  B  C  D  E  F  G  H  I  J   2   3   4   5   7   8  11  12  14  15              ↓   A  B  C  D  E  F  G  H  I  J   2          3         4         5 営業所コードは2~150の数字で、100ほどの営業所コードが存在します。 よろしくお願いします。

  • 次のように表される対称行列の名前は?

    以下のように表される対称行列に固有の名前はありますでしょうか? 2次の場合 | a b | | b a | 4次の場合 | a b c d | | b a d c | | c d a b | | d c b a | 8次の場合 | a b c d e f g h | | b a d c f e h g | | c d a b g h e f | | d c b a h g f e | | e f g h a b c d | | f e h g b a d c | | g h e f c d a b | | h g f e d c b a | Bisymmetric matrixの一種だと思うのですが,4次および8次の場合には 2次の区分行列に分割した場合,各区分行列においても対称性が現れています. もしご存知の方がいらっしゃいましたらご教授頂けると助かります.

  • mathmaticaで連立方程式を解く

    mathmaticaで次のような連立方程式をSolventを用いて解こうとしたのですがうまくいきませんでした。どうすればうまくいきますか? -0.82a+b+f+0.8g=0, a-b+c=0,b-c+d=0, c-d+e=0, d-e+f=0, e-f+a=0, 0.8a-0.82g=0, a^2+b^2+c^2+d^2+e^2+f^2+g^2=1