アプリ版:「スタンプのみでお礼する」機能のリリースについて

初歩的な質問で申し訳ありません。
教えて頂きたいです。

100回中10回NGになった場合にエラー発報するプログラムを作りたいです。
1回毎にOK又はNGを見ていきます。

私が考えられるレベルでは
①100個の配列を作成し、
 1回ごとに箱をずらし
 中にOKなら1、NGなら0を加算していくイメージです。

②また100回終わった箱からは、
 順次配列の中身を
 if(10 <= data_buf[i]){
  program_err;
 }
のように確認していく必要があります。

①、②を同時に行う必要があるかと思いますが、
具体的にプログラムに落とし込む事ができません。

お詳しい方がいらっしゃいましたら
恐れ入りますがご教示頂けたらと思います。

A 回答 (3件)

いかのような処理になるかと思います。


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
//下記を共通領域に確保
int keisoku_count; //計測カウント
int error_tbl[100]; //エラーテーブル 0:OK 1:NG
int ix; //エラーテーブル設定時の添え字
int ng_count; //過去100回のNGの件数
int sw; //100計測を行った場合、1が設定される


//発報判定ルーチン
//flag 0:OK 1:NG
//戻り値 0:発報なし 1:発報あり
int judge(int flag){
keisoku_count++; //計測カウントアップ
if (keisoku_count >= 100) sw = 1; //100以上なら1にセット
ng_count = ng_count - error_tbl[ix] + flag; //ng_count更新
error_tbl[ix] = flag; //テーブルへOK/NGを設定
ix++; //添え字更新
if (ix > 99) ix = 0; //99オーバーなら元に戻す
if (sw == 0) return 0; //計測が100回未満なら発報なし
if (ng_count < 10) return 0; //過去100回のNG件数が10未満なら発報なし
return 1; //発報あり
}

int main(void)
{
//初期設定開始
int i;
int flag;
keisoku_count = 0; //計測カウントクリア
ng_count = 0; //NGカウントクリア
sw = 0;
//エラーテーブルクリア
for (i = 0; i < 100;i++){
error_tbl[i] = 0;
}
ix = 0; //エラーテーブルの添え字を先頭にする
//初期設定終了

while(1){
//OK,NGのデータを取得
//OKならflagへ0を設定、NGならflagへ1を設定
if (judge(flag) == 1){
program_err(); //発報処理
}
//スリープ処理
}
}
--------------------------------------
不明点は補足ください。
    • good
    • 0
この回答へのお礼

@tatsu99様
本当にありがとうございました。
まだご記入頂いたコードのペーパーデバッグで確認した程度ですが、
動かしたい動作になっていると思います。

私自身もしっかり勉強しようと思います。
改めて本当にありがとうございました。

お礼日時:2017/09/26 17:22

以下のケースの場合、


1回目 NG
2回目 NG
3回目 NG
4回目 NG
5回目 NG
6回目 NG
7回目 NG
8回目 NG
9回目 NG
10回目 NG   発報する
11回目 OK   発報する?しない?
12回目 NG   発報する

発報するのは10回目と12回目でしょうか?(11回目も100回中10回NGにはなってますが、これはどうしますか)
    • good
    • 0
この回答へのお礼

早速の返信大変感謝致します。

また少し私の説明不足でした。
申し訳ありません。

ここで@tatsu99様の例で話しますと、

仮に、1時間監視する、1回の動作0.5msだった場合、
7200回動作する事になります。

(過去100回のNG回数 / 動作数)
※動作数100回に達するまでは判定しない。

~動作開始~
1回目 NG
2回目 NG
3回目 NG
4回目 NG
5回目 NG
6回目 NG
7回目 NG
8回目 NG
9回目 NG
10回目 NG   発報しない(10 / 10)
11回目 OK   発報しない(10 / 11)
12回目 NG   発報しない(11 / 12)

・(この間全てOK)

99回目  NG 発砲しない(12 / 99)
100回目 OK 発砲する(12 / 1~100回)
101回目 OK 発砲する(11 / 2~101回)
102回目 OK 発砲する(10 / 3~102回)
103回目 NG 発砲する(10 / 4~103回)
104回目 OK 発砲しない(9 / 5~104回)
105回目 OK 発砲しない(8 / 6~105回)

具体的にこういった動きになります。
最初の99回は総動作100回に達していないので、
エラー発砲しないです。

説明がうまくいかず申し訳ありません。
以上、宜しくお願い致します。

お礼日時:2017/09/26 13:17

>100回中10回NGになった場合にエラー発報するプログラムを作りたいです。


なにが100回中10回NGになった場合なのでしょうか?

C言語以前に、まず日本語として、どのようなプログラムをつくりたいのかをきちんと説明してください。
もし、これが、なにかの課題なら、その課題の文章を提示してください。
    • good
    • 0
この回答へのお礼

説明不足で申し訳ございません。

■動作1回毎に変動する電圧を出力する装置があり、
 マイコンで動作1回毎に出力電圧を監視している。

■出力電圧を取得後に以下の判定を行う
 電圧閾値>①出力電圧だった場合 OK
 電圧閾値≦①出力電圧だった場合 NG

■動作累計100回動作の内、NGが10回以上だった場合にエラー発報

■過去100回の判定方法を随時監視しエラー発報を行う
 →100回毎にエラー判定するのでは無く、
  過去100回なので1回毎にエラー判定するイメージです。

以上、宜しくお願い致します。

お礼日時:2017/09/26 11:02

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