三菱電機PLC(Q02H)のSORT命令の使い方と問題点

このQ&Aのポイント
  • 三菱電機PLC(Q02H)を使って回路を作っていますが、SORT命令の使い方に問題があります。
  • プログラミングマニュアルのプログラム例を実行すると、数の並び替えはうまくいくが、使用できるデバイスが限られているため問題が発生します。
  • SORT回路を実行すると、値の大きい順に並べ替えてデバイスの一番上まで送ってくれますが、値が小さい順に並べ替えると一番上まで値を移動させず、問題が発生します。
回答を見る
  • 締切済み

三菱電機 Q02H SORT命令

教えて下さい。三菱電機PLC(Q02H)を使い回路を作っているのですが、今回、SORT命令を使うことになりました。非常に便利なのですがイマイチ上手くいきません。シュミレータにてプログラミングマニュアルに書いてあるプログラム例を実行すると、格納されている数を上手く並べ替えてくれるのですが、現在、使用しているPLC(Q02H)を使う為、プログラム例にあるデバイスは使用できません。空きデバイスを確認し使用していないデバイスで試すのですがダメです。状態としては回路にてSM703をONしたのち、SORT回路を実行すると格納されている数を値の大きい順に並べ替えてデバイスの一番上まで送ってくれるのですが、SM703をOFFした状態でSORT回路を実行すると値が小さい順に並べ替えてくれるのですが、一番上まで値を移動してくれず、一番小さい値の格納デバイスからスタートしてしまいます。どこがいけないのでしょうか。 プログラミングマニュアルに書いてあるプログラム例 0  LD X0 1  OUT SM703 2  LD x10 3  SORT D0 K4 K1 M0 D10 4  END 私が実行したプログラム 0  LD X0 1  OUT SM703 2  LD X10 3  SORT D151 K11 K1 M1010 D430 4  END

みんなの回答

  • ymdgmc
  • ベストアンサー率63% (33/52)
回答No.3

回答2です。 補足いただいたことでようやく意味が分かりました。すみません。 SORTでは 0 は 0という数値として認識しますので、(数値が 無い という認識ではない) 補足の例でD151~D157が0になるのは正常です。 繰り上げ回路は別に作らないとダメ、でしょうね。

6yuuyu9
質問者

お礼

そうでしたか。 0を数値として認識するんですね。 大変、お騒がせしました。 繰り上げ回路を別に作りたいと思います。 ありがとうございました。 感謝いたします。

  • ymdgmc
  • ベストアンサー率63% (33/52)
回答No.2

回答1の方と同様なのですが、 X10のオン時間が不十分で、ソートが完了していないのではないかと思います。 並び替えに失敗するとき、M1010はオンしますか? オンするなら別の要因、 オンしないのであればおそらくスキャン回数の問題なので、 SORT D151 K11 K55 M1010 D430 で試してみてください。 これですと1回のスキャンでソート完了するので 並び替えが不十分となることは無いはずです。

6yuuyu9
質問者

補足

SORT D151 K11 K55 M1010 D430 確認してみました。 結果として値の小さい順に並べ替えはしてくれるのですが、 D151まで値を繰り上げてくれません。 例えばD151~D161までの中に値を4つ入れたとします。 D158が値の先頭でD158~D161までは値が入りますが、 D151~D157は0の状態です。 D158で止まっている値を、D151まで繰り上げてはくれないのでしょうか? 繰り上げ回路は別に作らないとダメなのでしょうか? ご教示頂けると幸いです。

  • lumiheart
  • ベストアンサー率47% (1096/2285)
回答No.1

https://www.mitsubishielectric.co.jp/fa/download/search.do?mode=manual&kisyu=/plcq MELSEC-Q/L プログラミングマニュアル(共通命令編)sh080804ab 447/1072ページ > SORT D151 K11 K1 M1010 D430 を SORT D151 K11 K10 M1010 D430 に変えても結果は変わりませんか?

6yuuyu9
質問者

補足

ご教示ありがとうございます。 プログラムを変更しトライしてみたのですが、 状態に変化ありませんでした。

関連するQ&A

  • 三菱PLCの命令語、ワードデバイスの操作について

    D100:00003131 D1000:30300000 D0:30303131 D100の下位8ビットと、D1000の上位8ビットを、上記のようにD0へ格納したいのですが。 考えられる方法、ズバリの命令語があれば教えて下さい。 k1、k2、k3、k4を使用して出来ると思いましたが、ワードデバイス同士では出来ませんでした。 宜しくお願い致します。

  • ソートについて(その他質問あります)

    こんにちわ。Cプログラム初心者の学生です。 友達のプログラムについての質問なので詳しくは説明できませんが、よろしくお願いします。 ソートのプログラム(いろいろなソート)を作ったのですが、ソートする範囲を6万以上(0~59999)にすると必ずエラーが出てプログラムが終了してしまいます。 最終的には10万以上の値をソートしたいのですが、エラーが出て困っています。 値の生成についてはランダムで、配列に格納してやるという形にしています。 やはり、配列数が0万以上はサポートしていないのか、メモリの問題でしょうか? これは私の質問ですが、処理の高速化についてアドバイスいただきたいです。私が知ってるのは、掛け算割り算はあまり使わない、なるべく値の受け渡しはポインタを使った方がいい・・・という程度です。 あとこれから初心者Cプログラマとしてステップアップしていくために重要なこととかあれば教えて下さい。 ちなみに今はMFCについて少し勉強しています。 まとまりの無い文になってしまいましたが、よろしくお願いします。

  • ソートプログラムについて

    ソートプログラムとして以下のように作成しました。 int main( ) { int i, j, temp; int ten[10] = { 98,34,67,89,99,23,54,21,10,65 }; for (i=0; i< 9; i++) { for(j=i+1; j<10; j++) { if (ten[i] < ten[j]) { temp = ten[i]; ten[i] = ten[j]; ten[j] = temp; } } } for (i = 0; i < 10; i++) { printf("SORT[%d] = %d\n",i,ten[i]); } } このプログラムを昇順で同じ数字が入力された場合、出力表示として 例: SORT[1]=99 SORT[2]=98 SORT[2]=98 SORT[3]=89 SORT[4]=70 というようにしたいのですが、プログラムをどのように 書いていけば良いのかわかりません。 例のような出力にするにはどのようにすればいいのでしょうか 教えて下さい。

  • ソート

    読み込むファイル(sample.txt)は、 2,jirou 5,gorou 4,shirou 1,tarou 6,mutsuo 3,saburou 下記の処理をします。 #include<stdio.h> #include<string.h> #define N 6 int sort1[N]; char sort2[N][30]; int BubbleSort(int data[N]) { int i,j,flag; do{ flag=0; for(i=0;i<N-1;i++) { if(data[i]>data[i+1]) { flag=1; j=data[i]; data[i]=data[i+1]; data[i+1]=j; } } } while(flag==1); return 0; } int main(void) { FILE *fpin; int id,h,k; printf("\n"); fpin=fopen("sample.txt","r"); if(fpin==NULL){ printf("ファイルをオープンできず!\n"); return 1; } for(k=0;k<N;k++) { h=fscanf(fpin,"%d,%s",&sort1[k],sort2[k]); if(h==EOF) break; printf("%d %s\n",sort1[k],sort2[k]); } printf("\n"); BubbleSort(sort1); for(k=0;k<N;k++) printf("%d %s\n",sort1[k],sort2[k]); return 0; } 実行結果は、 2 jirou 5 gorou 4 shirou 1 tarou 6 mutsuo 3 saburou 1 jirou 2 gorou 3 shirou 4 tarou 5 mutsuo 6 saburou 名前(sort2)もソートさせるには、どうすればいいか手ほどきをお願いします…

  • Sortメソッドが上手くいかない

    Option Explicit '単価で並べ替える Sub SortUnitPrice() Range("B:G").Sort _ key1:=Range("D3"), _ key2:=Range("E3"), _ Header:=xlYes End Sub D3とE3はヘッダーにしてD4とE4の値で並び替えをしようとしたのですが上手くいきません。 このコードを実行すると「実行エラー」Rangeクラスのsortメソッドが失敗しました。と出ます、なぜでしょうか。

  • マージソート

    マージソートの実行時間を測定するプログラムを書いています。 コンパイルの時にはエラーが出ないのですが、実行するとコマンドプロンプトが強制終了されます。 どこが悪いか、どう直せばいいのか指摘していただけないでしょうか? よろしくお願いします。 ~qtime.c~ //マージソート実行用プログラム //bcc32 mtime.c merge.c m1.c sfmt.c #include <stdio.h> #include <stdlib.h> #include <time.h> #include "sfmt.h" #define MAX 5000 void merge_sort(int a[], int start, int end); main() { int i , x[MAX] , n; time_t start , end ; int sn; printf("適当な数字の入力 : "); scanf("%d", sn); init_gen_rand(sn); for(i=0; i<MAX; i++) x[i]= (gen_rand32()% MAX);; n=MAX; start = clock(); //測定対象プログラム merge_sort(x, 0, n-1); end = clock(); printf("sort\n"); for(i =0 ; i < n ; i++ ) if ( i == i/100*100) printf("%d\n" , x[i]); printf ("実行時間: %f sec\n" , (double)(end-start) /CLOCKS_PER_SEC); return 0; } ~merge.c~ int b[100]; void merge_array(int x[], int start, int end) { int mid, i, j, k; mid = (start + end) /2; i = start; j = mid + 1; for(k = start; k <= end; k++){ if(x[i] > x[j] && j <= end || i > mid){ b[k] = x[j]; j++; } else{ b[k] = x[i]; i++; } } for(k = start; k <= end; k++){ x[k] = b[k]; } } ~m1.c~ void merge_array(int x[], int start, int end); void merge_sort(int a[], int start, int end); void merge_sort(int a[], int start, int end) { int mid; if(start >= end) return; mid = (start + end) / 2; merge_sort(a, start, mid); merge_sort(a, mid + 1, end); merge_array(a, start, end); }

  • ソート中に生じる変数の値の変化

    C言語でソートを用いるプログラムを作成しているのですが,ソートを行った前後で,一部の変数の中身が勝手に書き換えられてしまっています. 例えば,int型で宣言されたix,iy,izという変数の中に格納された値は,ソートには何の関連性をもっていないにも関わらず,ソート後には全て同じ無茶苦茶な値に書き直されます.しかも,何故かこれ等の変数をグローバル変数にした途端に改善されました. ●何故この様な現象が生じてしまったのでしょうか? 加えて,少し類似した症状が,ソートの対象とする構造体にも観察されます.構造体のソートに使う変数自体に変化は見られず,ソート自体も正常に機能していることが確認されているのですが,構造体の他の一部の変数(double型)の値の一部分が0と1072693248に書き換えられます. ●この症状は一体何が原因で,どう改善すれば良いでしょうか? 幾分全く原因が分からない為,質問文自体もかなり曖昧になっていますが,宜しくお願いします.

  • 複数の変数を持つ値のsort

    下記のようにx(\d+)y(\d+)z(\d)形式で構成されている値をもつリストがあった時に、期待値のように z x y の優先順でsortしたいのですが、よろしくお願いします。 @list = qw( x2048y2z3 x1024y2z5 x1024y4z2 x1024y4z3 x1024y2z2 ) ; 期待値の順 x1024y2z2 x1024y4z2 x1024y4z3 x2048y2z3 x1024y2z5

    • ベストアンサー
    • Perl
  • エクセルマクロ(大量データでのソート)

    以下のような表形式(300列×500行)のデータをソートしなくてはならず、エクセルマクロでやろうと思うのですが、 初心者のためできず困っています。助けて頂けませんでしょうか。 アクセスなどほかのアプリで簡単にできるようであれば、別の方法でも構いません。 [入力例]値なし=0     X1  X2  X3  X4 … X299  X300    ---------------------------------------- Y1 |  3  101    89         2 Y2 |       143  9 Y3 | Y4 |                5   1 : | Y499|  5  2  10 Y500|          10 [出力例] Yxについてそれぞれ上位10位までの結果を出力。括弧内に値を出力。 ※値が同じものについては順不問。 Y1  X200(120)  X2(101)  X145(83)  X99(20) … X65(2)  X1(3) Y2  X3(143)   X4(9)   X1(0)    X2(0) …  X9(0)  X10(0) : Y500  X4(10)  X31(8)   X11(7)   X31(7) … X1(0)   X2(0) 宜しくお願いします。

  • クイックソート

    クイックソートのプログラムを作ったのですがうまくいきません 汗 コンパイル時に sample1.c: In function ‘quicksort’: sample1.c:31: error: expected expression before ‘]’ token sample1.c:32: error: expected expression before ‘]’ token sample1.c:32: error: too few arguments to function ‘quicksort’ とでます。 まだアルゴリズムやCは勉強始めたばかりで基本的なところでつまって いるかもしれません。ご教授おねがいします。 /*クイックソート*/ #include<stdio.h> #define MAXDATA 10 #define swap(type,a,b) {type m; m = a; a = b; b = m;} void quicksort(int a[],int left ,int right) { int i,j,pivot; pivot = a[left]; i = left + 1; j = right; while(i <= j){ while(a[i]<pivot) i++; while(a[j]>pivot) j--; if(i<j){ swap(int,a[i],a[j]); i++; j--; } } swap(int,a[left],a[j]); quicksort(a[],left,j-1); quicksort(a[],j+1,right); } int main(void) { int k,j,sort[MAXDATA]; for(k=0;k < MAXDATA;k++) {printf("sort[%d]:",k); scanf("%d",&sort[k]);} for(k=0;k < MAXDATA;k++) printf("%3d",sort[k]); puts("ソートしますか? Yes:1 No:0 ///"); scanf("%d",&j); if(j==1){ quicksort(sort,0,MAXDATA-1); for(k=0;k < MAXDATA;k++) printf("%3d",sort[k]); } putchar('\n'); return(0); }