1.概要 ----------------------------------------------------------------- 1
2.C++言語ソースファイル
2.1 派生クラス宣言ファイル (mfdb_cls.h) ---------------------- 2
2.2 メンバ関数定義ファイル (mfdb .cpp) -------------------- 5
2.3 シンボル定義ファイル (mfdb_def.h) ---------------------- 26
2.4 将来の拡張用関数定義ファイル (mfdb_ft .cpp) -------------------- 30
3.その他のファイル
3.1 実行形式定義ファイル (mfdb.def) ------------------------ 31
3.2 リソース定義ファイル (mrdb.rc )-------------------------- 31
4.データファイル (failures.txt) -------------------- 32
参考文献 ----------------------------------------------------------------- 35
MIRS障害データベースは、1994年度の卒業研究1)〜2)において、BORLAND 社の Turbo C++ for Windows ver 3.13)〜5) で作成された。
この「MIRS障害データベースのソースファイル」は、以下の各ファイルを収録する。
MIRS障害データベースを構築するには、上のファイルのほかに、
これらのファイルは、3月22日現在、以下のディレクトリに収められている。
sun:/home3/sawa/project/grd_rep/list/mfdb/
moon:/mirs/mirs94/vpro94/tp/mfdb/
// mfdb_cls.h MIRS障害データベース 派生クラス宣言ファイル // Mar. 22, 1995 #ifndef __MFDB_CLASS_H # define __MFDB_CLASS_H #pragma hdrfile "mfdb.sym" #include#include #include #include #pragma hdrstop #include "mfdb_def.h" // 派生クラスの宣言 class MfdbBaseWindow : public TWindow /* メインウィンドウ1 */ { public: int BaseMax; /* メインウィンドウで 選べる項目の数 */ BOOL NoneData; /* 何も表示するべきものがないことを示すフラグ */ MfdbBaseWindow(PTWindowsObject , LPSTR) ; ~MfdbBaseWindow(); private: virtual LPSTR GetClassName(); /* オーバーロードした仮想関数 */ virtual void Paint(HDC,PAINTSTRUCT&) ; int GetCircuitName() ; /* 回路・ボード名を配列に格納する */ int y_Circuit(int); /* マウスのクリック位置から、選択された項目の番号を計算する */ virtual void WMLButtonDown(RTMessage Msg) = [WM_FIRST + WM_LBUTTONDOWN]; /* マウスをクリックした時呼び出される関数 */ virtual void EndButtonDown(RTMessage Msg) = [ID_FIRST + BaseBtn + EndButton]; /* 終了 ボタンを押した時 呼び出される関数 */ } ; class MfdbSel1Window : public TWindow /* 選択ウィンドウ1 */ { public: int Sel1Max; /* 選択ウィンドウ1で 選べる項目の数 */ BOOL NoneData; /* 何も表示するべきものがないことを示すフラグ */ MfdbSel1Window(PTWindowsObject , LPSTR) ; ~MfdbSel1Window() ; private: virtual LPSTR GetClassName(); /* オーバーロードした仮想関数 */ virtual BOOL CanClose(); virtual void CloseWindow(); virtual void Paint(HDC,PAINTSTRUCT&) ; int GetPartName(); /* 部分名を配列に格納する */ int y_Part(int); /* マウスのクリック位置から、選択された項目の番号を計算する */ virtual void WMLButtonDown(RTMessage Msg) = [WM_FIRST + WM_LBUTTONDOWN]; /* マウスをクリックした時呼び出される関数 */ virtual void Sel1Close(RTMessage Msg) = [ID_FIRST + Sel1Btn + EndButton]; /* 戻る ボタンを押した時 呼び出される関数 */ } ; class MfdbSel2Window : public TWindow /* 選択ウィンドウ2 */ { public: MfdbSel2Window(PTWindowsObject , LPSTR) ; ~MfdbSel2Window() ; private: int Sel2Max; /* 選択ウィンドウ2で 選べる項目の数 */ BOOL NoneData; /* 何も表示するべきものがないことを示すフラグ */ virtual LPSTR GetClassName(); /* オーバーロードした仮想関数 */ virtual BOOL CanClose(); virtual void CloseWindow(); virtual void Paint(HDC,PAINTSTRUCT&); int GetFailureName(); /* 症状名を配列に格納する */ int y_Failure(int); /* マウスのクリック位置から、選択された項目の番号を計算する */ virtual void AllButtonDown(RTMessage Msg) = [ID_FIRST + Sel2Btn + AllButton]; /* 全部表示ボタンを押した時 呼び出される関数 */ virtual void WMLButtonDown(RTMessage Msg) = [WM_FIRST + WM_LBUTTONDOWN]; /* マウスをクリックした時 呼び出される関数 */ virtual void Sel2Close(RTMessage Msg) = [ID_FIRST + Sel2Btn + EndButton]; /* 戻る ボタンを押した時 呼び出される関数 */ } ; class MfdbDispWindow : public TWindow /* 説明ウィンドウ */ { public: int DispMax; /* 通常表示で 表示する行の数 */ MfdbDispWindow(PTWindowsObject , LPSTR) ; ~MfdbDispWindow() ; private: int CheckDispText(); /* 表示するテキストの行数を数える */ virtual LPSTR GetClassName(); /* オーバーロードした仮想関数 */ virtual BOOL CanClose(); virtual void CloseWindow(); virtual void Paint(HDC,PAINTSTRUCT&); virtual void DispClose(RTMessage Msg) = [ID_FIRST + DispBtn + EndButton]; /* 戻る ボタンを押した時 呼び出される関数 */ } ; class PushButton : public TButton /* 押しボタン */ { public: PushButton(PTWindowsObject, int, LPSTR, int, int, int, int, BOOL, PTModule) ; } ; class MfdbApply : public TApplication /* アプリケーションモジュール */ { public: MfdbApply(LPSTR , HINSTANCE , HINSTANCE , LPSTR , int) ; private: virtual void InitApplication(); /* オーバーロードした仮想関数 */ virtual void InitInstance(); virtual void InitMainWindow(); virtual BOOL CanClose(); } ; #endif /* __MFDB_CLASS_H */
// mfdb.cpp MIRS障害データベース メインプログラム // Mar. 22, 1995 #pragma hdrfile "mfdb.sym" #include#include #include #include #pragma hdrstop #include "mfdb_def.h" #include "mfdb_cls.h" // グローバル変数の定義 int Circuit, /* 現在注目しているボード・回路の番号 */ Part, /* 現在注目している 部分 の番号 */ Failure; /* 現在注目している 症状 の番号 */ /* ウィンドウを指すポインタ */ MfdbSel1Window *Sel1Win; MfdbSel2Window *Sel2Win; MfdbDispWindow *DispWin; /* アプリケーションモジュールを指すポインタ */ PTApplication Sel1Apply, Sel2Apply, DispApply; /* ウィンドウの存在を示すフラグ */ BOOL BeSel1Win = FALSE, /* 選択ウィンドウ1 */ BeSel2Win = FALSE, /* 選択ウィンドウ2 */ BeDispWin = FALSE; /* 説明ウィンドウ */ char ModulePath[MoPathLen]; /* MFDBの実行形式のパス */ ifstream fpFail; /* 症状データファイルの ストリーム */ char DispFlg = dNormal; /* 表示状態を表すフラグ */ BOOL DispAll = FALSE; /* 全部表示ボタンが押されたか */ BOOL NowBasic = TRUE; /* 最初の注意を表示しているか */ /* データ格納用の配列 */ char CircuitName[cFirstCirct+ CircMax][CiNameLen], /* 回路・ボード名 */ PartName[PartMax][PaNameLen], /* 部分名 */ FailureName[FailMax][FaNameLen], /* 症状名 */ DispText[DispTextLen]; /* 説明文1行 */ /* ファイルポインタの登録のための配列 */ long FPCircuit[CircMax], /* 回路・ボード */ FPPart[PartMax], /* 部分 */ FPFailure[FailMax]; /* 症状 */ // コンストラクタ と デストラクタ の定義 MfdbBaseWindow:: MfdbBaseWindow(PTWindowsObject agParent , LPSTR agTitle) : TWindow(agParent , agTitle) { /* ウィンドウの位置・大きさ */ Attr.X = Base_X ; Attr.Y = Base_Y ; Attr.W = Base_W ; Attr.H = Base_H ; /* まだ下位のウィンドウは存在しない */ BeSel1Win = FALSE ; BeSel2Win = FALSE ; BeDispWin = FALSE ; /* 最初に基本的な注意を表示する */ Circuit = cFirstMsg; NowBasic = TRUE; /* 終了ボタンの構築 */ new PushButton(this, BaseBtn + EndButton, "終了", EndButton_X, EndButton_Y, EndButton_W, EndButton_H, FALSE,NULL ); /* 選択ウィンドウ1の構築 */ Sel1Win = new MfdbSel1Window(this, "MFDB − 選択1"); Sel1Apply = GetApplication(); Sel1Apply-> MakeWindow(Sel1Win); BaseMax = GetCircuitName(); /* 回路・ボード名を配列に格納 */ /* 選択ウィンドウ1を最前面に出す */ SetWindowPos(Sel1Win -> HWindow, HWND_TOPMOST, FALSE, FALSE, FALSE, FALSE, SWP_SHOWWINDOW ); } MfdbBaseWindow::~MfdbBaseWindow() { fpFail.close(); } MfdbSel1Window:: MfdbSel1Window(PTWindowsObject agParent , LPSTR agTitle) : TWindow(agParent , agTitle) { BeSel1Win = TRUE; Attr.X = Sel1_X ; Attr.Y = Sel1_Y ; Attr.W = Sel1_W ; Attr.H = Sel1_H ; Attr.Style = WS_OVERLAPPEDWINDOW | WS_VISIBLE ; /* 終了ボタンの構築 */ new PushButton(this, Sel1Btn + EndButton, EndBtnTxt, EndButton_X, EndButton_Y, EndButton_W, EndButton_H, FALSE,NULL); Sel1Max = GetPartName(); /* 部分名を配列に格納 */ } MfdbSel1Window::~MfdbSel1Window() { if(NowBasic) NowBasic = FALSE; BeSel1Win = FALSE; } MfdbSel2Window:: MfdbSel2Window(PTWindowsObject agParent , LPSTR agTitle) : TWindow(agParent , agTitle) { BringWindowToTop(HWindow); /* このウィンドウを1番前に持ってくる */ BeSel2Win = TRUE; Attr.X = Sel2_X ; Attr.Y = Sel2_Y ; Attr.W = Sel2_W ; Attr.H = Sel2_H ; Attr.Style = WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL; /* 全部表示ボタンの構築 */ new PushButton(this, Sel2Btn + AllButton, AllBtnTxt, AllButton_X, AllButton_Y, AllButton_W, AllButton_H, FALSE,NULL); /* 終了ボタンの構築 */ new PushButton(this, Sel2Btn + EndButton, EndBtnTxt, EndButton_X, EndButton_Y, EndButton_W, EndButton_H, FALSE,NULL); Sel2Max = GetFailureName(); /* 症状名を配列に格納 */ } MfdbSel2Window::~MfdbSel2Window() { BeSel2Win = FALSE; } MfdbDispWindow:: MfdbDispWindow(PTWindowsObject agParent , LPSTR agTitle) : TWindow(agParent , agTitle) { BringWindowToTop(HWindow); /* このウィンドウを1番前に持ってくる */ BeDispWin = TRUE; Attr.X = Disp_X ; Attr.Y = Disp_Y ; Attr.W = Disp_W ; Attr.H = Disp_H ; Attr.Style = WS_OVERLAPPED | WS_THICKFRAME | WS_SYSMENU | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_VISIBLE | WS_VSCROLL ; /* 縦方向のスクロールバー */ Scroller = new TScroller(this, 0, ScrollUnit_Y, 0, ScrollRange_Y0 ); Scroller->AutoMode = FALSE; /* 終了ボタンの構築 */ new PushButton(this, DispBtn + EndButton, EndBtnTxt, EndButton_X, EndButton_Y, EndButton_W, EndButton_H, FALSE,NULL); if (DispAll) /* 表示フラグのセット */ DispFlg = dAll; else DispFlg = dNormal; DispMax = CheckDispText(); /* 症状の説明の行数を獲得 */ if (DispMax == 0) DispFlg = dNone; } MfdbDispWindow::~MfdbDispWindow() { BeDispWin = FALSE; DispFlg = dNormal; /* フラグを既定値に戻しておく */ if (DispAll) DispAll = FALSE; } PushButton:: PushButton(PTWindowsObject AParent , int AnId , LPSTR AText , int X, int Y, int W, int H, BOOL IsDefault , PTModule AModule) : TButton(AParent , AnId , AText , X , Y , W , H , IsDefault , AModule) { } MfdbApply:: MfdbApply(LPSTR agName, HINSTANCE aghInst, HINSTANCE aghPrevInst, LPSTR aglpCmd, int agnCmdShow) : TApplication(agName , aghInst , aghPrevInst , aglpCmd , agnCmdShow) { } // メンバ関数の定義 /* クラス MfdbBaseWindow のメンバ関数 */ LPSTR MfdbBaseWindow::GetClassName() { return "MfdbBaseWindow" ; } void MfdbBaseWindow::Paint(HDC PaintDC,PAINTSTRUCT&) { POINT point[tKind] = { /* 文字の表示座標 */ {Base_W /2 , Title_Y }, /* タイトルの (x , y) 座標 */ { Msg_X , Msg_Y } /* メッセージの (x , y) 座標 */ }; RECT TitleRect; /* タイトルを書く長方形 */ int Sel, SelY; HGDIOBJ hbr, hbrOld; /* 変更するブラシ,元のブラシ */ int BkModOld; /* 元の背景モード */ /* タイトルの描画 */ GetClientRect(HWindow, &TitleRect); /* 現在のウィンドウの幅を獲得 */ TitleRect.top = point[tTitle].y ; DrawText(PaintDC, WelcomMsg, strlen(WelcomMsg), &TitleRect, DT_CENTER ); /* メッセージの描画 */ SetTextAlign(PaintDC, TA_LEFT); TextOut(PaintDC, point[tMsg].x, point[tMsg].y, SelectMsg, strlen(SelectMsg) ); /* ボタンの描画 */ SetTextAlign(PaintDC, TA_LEFT); hbr = GetStockObject(LTGRAY_BRUSH); hbrOld = SelectObject(PaintDC, hbr); BkModOld = SetBkMode(PaintDC, TRANSPARENT); /* 背景を透過モードにする */ for ( Sel= cFirstMsg; Sel < BaseMax; Sel++){ SelY = BaseBtn_Y0+(BaseButton_H + Button_spc)*Sel; Rectangle( PaintDC, BaseButton_X, SelY , BaseButton_X + BaseButton_W, SelY + BaseButton_H ); TextOut(PaintDC, BaseButton_X+8, SelY + 2, CircuitName[Sel], strlen(CircuitName[Sel]) ); } SelectObject(PaintDC, hbrOld); DeleteObject(hbr); SetBkMode(PaintDC,BkModOld); } int MfdbBaseWindow::GetCircuitName() /* ボード・回路名を配列に格納 */ { int No; /* ボード・回路の数 */ char CiName[DispTextLen]; BOOL SearchEnd = FALSE; /* ボード・回路名の検索を終わるか */ fpFail.seekg(0); /* ファイルポインタを先頭に移動 */ No = cFirstCirct; while(!SearchEnd){ if (No >= CircMax){ MessageBox(NULL, CountOver, DataReading CannotRun, MB_ICONSTOP); exit(1); } fpFail.getline(CiName,DispTextLen); switch(*CiName){ case FstAttBegin: /* 最初の注意 表示のための準備 */ strcpy(CircuitName[cFirstMsg], CiName); FPFailure[cFirstMsg] = fpFail.tellg(); break; case FileEnd: SearchEnd = TRUE; break; case CiBrac: strcpy(CircuitName[No],CiName); FPCircuit[No] = fpFail.tellg(); No++; break; default: break; } } return No; } void MfdbBaseWindow::WMLButtonDown(RTMessage Msg) { int xPos = Msg.LP.Lo, /* マウスのボタンが押された座標 */ yPos = Msg.LP.Hi; if( !BeSel1Win){ if( BaseButton_X <= xPos && xPos <= BaseButton_X + BaseButton_W){ Circuit = y_Circuit(yPos); if( cFirstMsg <= Circuit && Circuit < BaseMax){ if (Circuit == cFirstMsg) NowBasic = TRUE; Sel1Win = new MfdbSel1Window(this, "MFDB − 選択1"); Sel1Apply = GetApplication(); Sel1Apply-> MakeWindow(Sel1Win); } } } else { SetWindowPos(HWindow, Sel1Win ->HWindow, FALSE, FALSE, FALSE, FALSE, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE ); MessageBeep(-1); } } int MfdbBaseWindow::y_Circuit(int yPos) { int CirNo; if ( yPos > BaseBtn_Y0){ CirNo = (yPos - BaseBtn_Y0) / (BaseButton_H + Button_spc); if ( (yPos- BaseBtn_Y0) % (BaseButton_H + Button_spc) > BaseButton_H ) CirNo = -1; } else{ CirNo = -1; } return CirNo; } void MfdbBaseWindow::EndButtonDown(RTMessage) { if(BeSel1Win) SetWindowPos(Sel1Win->HWindow, HWND_NOTOPMOST, FALSE, FALSE, FALSE, FALSE, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE ); CloseWindow(); } /* クラス MfdbSel1Window のメンバ関数 */ LPSTR MfdbSel1Window::GetClassName() { return "MfdbSel1Window" ; } BOOL MfdbSel1Window::CanClose() { return TRUE; } void MfdbSel1Window::CloseWindow() { SetWindowPos(Parent ->HWindow, HWND_TOP, FALSE, FALSE, FALSE, FALSE, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE ); TWindowsObject::CloseWindow(); } void MfdbSel1Window::Sel1Close(RTMessage) { CloseWindow(); } void MfdbSel1Window::Paint(HDC PaintDC,PAINTSTRUCT&) { POINT point[tKind] = { /* 文字の表示座標 */ {Sel1_W /2 , Title_Y }, /* タイトルの (x , y) 座標 */ { Msg_X , Msg_Y }, /* メッセージの (x , y) 座標 */ }; RECT TitleRect; /* タイトルを書く長方形 */ int Sel, SelY; HGDIOBJ hbr, hbrOld; /* 変更するブラシ,元のブラシ */ int BkModOld; /* 元の背景モード */ if (NoneData){ MessageBox(HWindow,NoExplain,"警告",MB_ICONEXCLAMATION); CloseWindow(); } /* タイトルの描画 */ GetClientRect(HWindow, &TitleRect); /* 現在のウィンドウの幅を獲得 */ TitleRect.top = point[tTitle].y ; DrawText(PaintDC, CircuitName[Circuit], strlen(CircuitName[Circuit]), &TitleRect, DT_CENTER ); /* メッセージの描画 */ SetTextAlign(PaintDC, TA_LEFT); if (Circuit == cFirstMsg){ TextOut(PaintDC, point[tMsg].x , point[tMsg].y, FirstMsg1, strlen(FirstMsg1) ); TextOut(PaintDC, point[tMsg].x + 70, point[tMsg].y + 22, FirstMsg2, strlen(FirstMsg2) ); } else TextOut(PaintDC, point[tMsg].x, point[tMsg].y, SelectMsg, strlen(SelectMsg) ); /* ボタンの描画 */ SetTextAlign(PaintDC, TA_LEFT); hbr = GetStockObject(LTGRAY_BRUSH); hbrOld = SelectObject(PaintDC, hbr); BkModOld = SetBkMode(PaintDC, TRANSPARENT); /* 背景を透過モードにする */ for ( Sel= 0; Sel < Sel1Max; Sel++){ SelY = SelBtn_Y0+(SelButton_H + Button_spc)*Sel; Rectangle( PaintDC, SelButton_X, SelY , SelButton_X + Sel1Button_W, SelY + SelButton_H ); TextOut(PaintDC, SelButton_X+8, SelY + 2, PartName[Sel], strlen(PartName[Sel]) ); } if(Sel1Max == 0){ Rectangle( PaintDC, SelButton_X, SelBtn_Y0 , SelButton_X + Sel1Button_W, SelBtn_Y0 + SelButton_H ); TextOut(PaintDC, SelButton_X+8, SelBtn_Y0 + 2, GoToSel2Msg, strlen(GoToSel2Msg) ); } SelectObject(PaintDC, hbrOld); DeleteObject(hbr); SetBkMode(PaintDC,BkModOld); } int MfdbSel1Window::GetPartName() /* 部分名を配列に格納 */ { int PartCt; /* 部分の数 */ char PartText[DispTextLen]; BOOL SearchEnd = FALSE; /* 部分名の検索を終わるか */ BOOL BePaBrac = FALSE , /* 部分名 が存在するかどうかのフラグ */ BeFaBrac = FALSE , /* 症状名 が存在するかどうかのフラグ */ BeDisp = FALSE; /* 説明文 が存在するかどうかのフラグ */ fpFail.seekg(FPCircuit[Circuit]); NoneData = FALSE; PartCt = 0; while(!SearchEnd){ if (PartCt >= PartMax){ MessageBox(NULL, CountOver, DataReading CannotRun, MB_ICONSTOP); exit(1); } fpFail.getline(PartText, DispTextLen); switch(*PartText){ case Comnt: case FstAttBegin: break; case CiBrac: case FstAttEnd: case CiEnd: case FileEnd: SearchEnd = TRUE; break; case PaBrac: strcpy(PartName[PartCt], PartText); FPPart[PartCt] = fpFail.tellg(); PartCt++; BePaBrac = TRUE; break; case FaBrac: BeFaBrac=TRUE; break; default: BeDisp = TRUE; break; } } if(!BePaBrac){ FPPart[0] = FPCircuit[Circuit]; if(!BeFaBrac){ FPFailure[0] = FPCircuit[Circuit]; if(!BeDisp){ NoneData = TRUE; } } } return PartCt; } void MfdbSel1Window::WMLButtonDown(RTMessage Msg) { int xPos = Msg.LP.Lo, /* マウスのボタンが押された座標 */ yPos = Msg.LP.Hi; if( (!BeSel2Win) && (!BeDispWin) ){ if( SelButton_X <= xPos && xPos <= SelButton_X + Sel1Button_W){ /* 何番目の項目を選択したのかを y 座標より計算 */ Part = y_Part(yPos); if ( ( (Sel1Max == 0) && (Part == 0 ) ) || ( 0 <= Part && Part < Sel1Max ) ){ SetWindowPos(HWindow, HWND_NOTOPMOST, FALSE, FALSE, FALSE, FALSE, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE ); SetWindowPos(Parent ->HWindow, HWindow, FALSE, FALSE, FALSE, FALSE, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE ); if(NowBasic){ /* 説明ウィンドウの構築 */ DispWin = new MfdbDispWindow(this, "MFDB − 説明"); DispApply = GetApplication(); DispApply-> MakeWindow(DispWin); } else { /* 選択ウィンドウ2の構築 */ Sel2Win = new MfdbSel2Window(this,"MFDB − 選択2"); Sel2Apply = GetApplication(); Sel2Apply-> MakeWindow(Sel2Win); } } } } else { MessageBeep(-1); } } int MfdbSel1Window::y_Part(int yPos) { int SelNo; if ( (yPos - SelBtn_Y0) < 0) SelNo = -1; else{ SelNo = (yPos- SelBtn_Y0) / (SelButton_H + Button_spc); if ( (yPos- SelBtn_Y0) % (SelButton_H +Button_spc) > SelButton_H ) SelNo = -1; } return SelNo ; } /* クラス MfdbSel2Window のメンバ関数 */ LPSTR MfdbSel2Window::GetClassName() { return "MfdbSel2Window" ; } BOOL MfdbSel2Window::CanClose() { return TRUE; } void MfdbSel2Window::CloseWindow() { SetWindowPos(Parent ->HWindow, HWND_TOP, FALSE, FALSE, FALSE, FALSE, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE ); TWindowsObject::CloseWindow(); } void MfdbSel2Window::Sel2Close(RTMessage) { CloseWindow(); } void MfdbSel2Window::Paint(HDC PaintDC,PAINTSTRUCT&) { POINT point[tKind] = { /* 文字の表示座標 */ {Sel2_W /2 , Title_Y }, /* タイトルの (x , y) 座標 */ { Msg_X , Msg_Y }, /* メッセージの (x , y) 座標 */ }; RECT TitleRect; /* タイトルを書く長方形 */ char TitleText[NameLenMax]; /* タイトル文字列 */ int Sel,SelY; HGDIOBJ hbr, hbrOld; /* 変更するブラシ,元のブラシ */ int BkModOld; /* 元の背景モード */ if (NoneData){ CloseWindow(); MessageBox(HWindow,NoExplain,"警告",MB_ICONEXCLAMATION); } /* タイトルの描画 */ GetClientRect(HWindow, &TitleRect); /* 現在のウィンドウの幅を獲得 */ TitleRect.top = point[tTitle].y ; if( (Part ==0) && (Sel1Win ->Sel1Max == 0) ) strcpy(TitleText, CircuitName[Circuit]); else strcpy(TitleText, PartName[Part]); DrawText(PaintDC, TitleText, strlen(TitleText), &TitleRect, DT_CENTER ); /* メッセージの描画 */ SetTextAlign(PaintDC, TA_LEFT); TextOut(PaintDC, point[tMsg].x, point[tMsg].y, SelectMsg, strlen(SelectMsg) ); /* ボタンの描画 */ SetTextAlign(PaintDC, TA_LEFT); for ( Sel= 0; Sel < Sel2Max; Sel++){ SelY = SelBtn_Y0+(SelButton_H + Button_spc)*Sel; hbr = GetStockObject(LTGRAY_BRUSH); hbrOld = SelectObject(PaintDC, hbr); BkModOld = SetBkMode(PaintDC, TRANSPARENT); /* 背景を透過モードにする */ Rectangle( PaintDC, SelButton_X, SelY , SelButton_X + Sel2Button_W, SelY + SelButton_H ); TextOut(PaintDC, SelButton_X+8, SelY + 2, FailureName[Sel], strlen(FailureName[Sel]) ); SelectObject(PaintDC, hbrOld); DeleteObject(hbr); SetBkMode(PaintDC,BkModOld); } } int MfdbSel2Window::GetFailureName() /* 症状名を配列に格納 */ { int FailCt; char FailText[DispTextLen]; BOOL SearchEnd = FALSE; /* 症状名の検索を終わるか */ BOOL BeFaBrac = FALSE , /* 症状名 が存在するかどうかのフラグ */ BeDisp = FALSE; /* 説明文 が存在するかどうかのフラグ */ fpFail.seekg(FPPart[Part]); NoneData = FALSE; FailCt = 0; while(!SearchEnd){ if (FailCt >= FailMax){ MessageBox(NULL, CountOver, DataReading CannotRun, MB_ICONSTOP); exit(1); } fpFail.getline(FailText, DispTextLen); switch(*FailText){ case Comnt: case FstAttBegin: break; case CiBrac: case PaBrac: case FstAttEnd: case CiEnd: case FileEnd: SearchEnd = TRUE; break; case FaBrac: strcpy(FailureName[FailCt], FailText); FPFailure[FailCt] = fpFail.tellg(); FailCt++; BeFaBrac = TRUE; break; default: BeDisp = TRUE; break; } } if (!BeFaBrac){ FPFailure[0] = FPPart[Part]; if(!BeDisp) NoneData = TRUE; } return FailCt; } void MfdbSel2Window::AllButtonDown(RTMessage) /* 全部表示ボタンが押された */ { if( !BeDispWin){ DispAll = TRUE; /* 説明ウィンドウの構築 */ DispWin = new MfdbDispWindow(this, "MFDB − 説明"); DispApply = GetApplication(); DispApply-> MakeWindow(DispWin); } else { MessageBeep(-1); } } void MfdbSel2Window::WMLButtonDown(RTMessage Msg) { int xPos = Msg.LP.Lo, /* マウスのボタンが押された座標 */ yPos = Msg.LP.Hi; if( !BeDispWin){ if( SelButton_X <= xPos && xPos <= SelButton_X + Sel2Button_W){ /* 何番目の項目を選択したのかを y 座標より計算 */ Failure = y_Failure(yPos); if ( 0 <= Failure && Failure < Sel2Max){ /* 説明ウィンドウの構築 */ DispWin = new MfdbDispWindow(this,"MFDB − 説明"); DispApply = GetApplication(); DispApply-> MakeWindow(DispWin); } } } else { MessageBeep(-1); } } int MfdbSel2Window::y_Failure(int yPos) { int SelNo; if ( (yPos - SelBtn_Y0) < 0) SelNo = -1; else{ SelNo = (yPos- SelBtn_Y0) / (SelButton_H + Button_spc); if ( (yPos- SelBtn_Y0) % (SelButton_H + Button_spc) > SelButton_H ) SelNo = -1; } return SelNo ; } /* クラス MfdbDispWindow のメンバ関数 */ LPSTR MfdbDispWindow::GetClassName() { return "MfdbDispWindow" ; } BOOL MfdbDispWindow::CanClose() { return TRUE; } void MfdbDispWindow::CloseWindow() { SetWindowPos(Parent ->HWindow, HWND_TOP, FALSE, FALSE, FALSE, FALSE, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE ); TWindowsObject::CloseWindow(); } void MfdbDispWindow::DispClose(RTMessage) { CloseWindow(); } void MfdbDispWindow::Paint(HDC PaintDC,PAINTSTRUCT&) { char TitleText[NameLenMax]; /* タイトル文字列 */ POINT point[tKind] = { /* 文字の表示座標 */ {Disp_W /2 , Title_Y }, /* タイトルの (x , y) 座標 */ { Msg_X , Msg_Y } /* メッセージの (x , y) 座標 */ }; RECT DispRect; /* タイトル、説明文を書く長方形 */ int DiLen,DiHi; /* 説明文の長さ、高さ */ int DiDTRet; /* DrawText() からの戻り値(テキストの高さ) */ UINT DiStyle; /* DrawText() のためのスタイル */ BOOL DispEnd = FALSE; /* 表示が終わりかどうか示すフラグ */ BOOL DispOn = TRUE; /* 表示するかどうか示すフラグ */ long ScBottom, ScRangeY ; /* スクロールバーの調節用 */ /* タイトルの表示とファイルポインタの設定 */ if(DispFlg == dAll){ strcpy(TitleText, DispAllMsg); /* 全部表示ならファイルポインタの設定をやり直す。 */ fpFail.seekg(FPPart[Part]); } else { if(NowBasic) strcpy(TitleText, PartName[Part] ); else strcpy(TitleText, FailureName[Failure] ); if(Circuit == cFirstMsg) fpFail.seekg(FPPart[Part]); else fpFail.seekg(FPFailure[Failure]); } /* タイトルの表示 */ GetClientRect(HWindow, &DispRect); /* 現在のウィンドウの 幅 と 高さ を獲得 */ DispRect.top = point[tTitle].y ; DrawText(PaintDC, TitleText, strlen(TitleText), &DispRect, DT_CENTER ); DispEnd = FALSE; /* 説明文の表示 */ switch(DispFlg){ case dNone: MessageBox(HWindow,NoExplain,"警告",MB_ICONEXCLAMATION); CloseWindow(); break; case dAll: case dNormal: DispRect.top = DispTx_Y0; /* 説明文の1行目の y 座標 */ while(!DispEnd){ fpFail.getline(DispText, DispTextLen); switch(*DispText){ case Comnt: case FstAttBegin: DispOn = FALSE; break; case CiBrac: case FstAttEnd: case CiEnd: case FileEnd: DispEnd = TRUE; break; case PaBrac: if ( (DispFlg == dAll) && (NowBasic) ){ /* 最初の注意で、 全部 表示なら、<> も表示する */ DispOn = TRUE; DispRect.top += 10; } else DispEnd = TRUE; break; case FaBrac: if ( (DispFlg == dAll) || (NowBasic) ){ /* 最初の注意か、全部 表示なら、() も表示する */ DispOn = TRUE; DispRect.top += 10; } else /* そうでなければ、次の症状の前でストップ */ DispEnd = TRUE; break; default: DispOn =TRUE; break; } if(DispOn && !DispEnd){ /* 文字列の長さ(ピクセル) */ DiLen = fpFail.gcount() * (int)(Font_W *1.2 /2 ); DiHi = (DiLen / DispRect.right +1) * (DispTx_H); DispRect.bottom = DispRect.top + DiHi; /* DrawText() のためのスタイル */ DiStyle = ( DT_EXTERNALLEADING | DT_LEFT | DT_NOPREFIX | DT_EXPANDTABS | DT_WORDBREAK ); DiDTRet = DrawText(PaintDC, DispText, strlen(DispText), &DispRect, DiStyle ); if (DiDTRet != NULL) DispRect.top += DiDTRet; else{ MessageBox (NULL, DataError , DataReading CannotRun ,MB_ICONSTOP); exit(1); } } } /* スクロールバーの調節 */ ScBottom = DispRect.top; /* 描画範囲の下端 の座標 */ /* 現在のウィンドウの 幅 と 高さ を獲得 */ GetClientRect(HWindow, &DispRect); /* y 方向 のスクロール範囲 (ユニット) */ ScRangeY = (ScBottom - DispRect.bottom) / ScrollUnit_Y; if (ScRangeY >0) ScRangeY++; Scroller -> SetRange( 0, ScRangeY ); /* 値を設定する */ Scroller -> SetSBarRange(); /* スクロールバーを設定に同期させる */ break; default : break; } } int MfdbDispWindow::CheckDispText() /* 説明文の行数を調べる */ { int Lines; /* 行数 */ BOOL SearchEnd = FALSE; /* 説明文の検索を終わるかを示すフラグ */ if(NowBasic || (DispFlg == dAll) ) fpFail.seekg(FPPart[Part]); else fpFail.seekg(FPFailure[Failure]); Lines = 0; while(!SearchEnd){ fpFail.getline(DispText, DispTextLen); switch(*DispText){ case Comnt: case FstAttBegin: break; case CiBrac: case PaBrac: case FstAttEnd: case CiEnd: case FileEnd: SearchEnd = TRUE; break; case FaBrac: if (DispFlg != dAll) SearchEnd = TRUE; break; default: Lines++; } } return Lines; } /* クラス MfdbApply のメンバ関数 */ void MfdbApply::InitApplication() { char *p; char InitMsg[200]; /* データファイルがオープンできるか判定 */ strcpy(InitMsg,"データファイルとして、\n "); if( fpFail.open(DataFileName, ios::in | ios::nocreate ), fpFail != NULL){ strcat(InitMsg,"カレントディレクトリの " DataFileName); } else { /* 実行ファイルのあるディレクトリの中を探す */ p = ModulePath + sizeof(ModulePath); for (;*p!='\\';p--) ; p++; *p=NULL; strcat(ModulePath,DataFileName); if ( fpFail.open(ModulePath, ios::in | ios::nocreate ), fpFail != NULL){ strcat(InitMsg,ModulePath ); } else { strcpy(InitMsg, FileNotExist "\nデータファイル "DataFileName \ " を " ProgramName".EXEと同じディレクトリに置いてください。"); MessageBox( NULL, InitMsg, "エラー " CannotRun, MB_ICONSTOP ); exit(1); } } strcat(InitMsg, " \nを使用します。"); MessageBox( NULL, InitMsg, "続行", MB_ICONINFORMATION ); } void MfdbApply::InitInstance() { if ( hPrevInstance == NULL){ TApplication::InitInstance(); } else { MessageBox(NULL, AlreadyRun, "起動済み!!", MB_ICONEXCLAMATION ); exit(1); } } void MfdbApply::InitMainWindow() { /* メインウィンドウの構築 */ MainWindow = new MfdbBaseWindow(NULL , BaseCaption) ; } BOOL MfdbApply::CanClose() { return ( MessageBox(MainWindow-> HWindow, "MFDBを終了します。", "MFDBの終了", MB_OKCANCEL | MB_ICONINFORMATION) == IDOK ) ; } // Windowsアプリケーションのmain関数 int PASCAL WinMain(HINSTANCE aghInst, HINSTANCE aghPrevInst, LPSTR aglpCmdLine, int agnCmdShow) { /* 実行ファイルのパス名の取得 */ GetModuleFileName(aghInst,ModulePath,sizeof(ModulePath) ); /* クラス MfdbApply のオブジェクトの作成 */ MfdbApply MfdbApp(ProgramName , aghInst , aghPrevInst , aglpCmdLine , agnCmdShow) ; MfdbApp.Run() ; /* メッセージループを実行 */ return MfdbApp.Status ; /* Windowsに 状態を返す */ }
/* mfdb_def.h MIRS障害データベース 定数定義 ファイル */
// Mar. 22, 1995
#ifndef __MFDB_DEF_H
# define __MFDB_DEF_H
/* ファイル名に関係する設定 */
#define ProgramName "MFDB" /* Windows に渡すプログラム名 */
#define DataFileName "FAILURES.TXT" /* データファイルのパス名 */
#define MoPathLen 120 /* データファイルのパス名の長さの上限 */
/* メインウィンドウのキャプション */
#define BaseCaption "MIRS障害データベース (MFDB)"
/* ウィンドウの位置・大きさの設定 (左端
上端
幅
高さ の順) */
/* メインウィンドウ */
#define Base_X 100
#define Base_Y 100
#define Base_W (BaseButton_W + SelButton_X *2)
#define Base_H 460
/* 選択ウィンドウ1 */
#define Sel1_X (Base_X + EndButton_X + EndButton_W + 5)
#define Sel1_Y (Base_Y - 40)
#define Sel1_W (Sel1Button_W + SelButton_X *2 + ScrBar_W)
#define Sel1_H (Base_H + 100)
/* 選択ウィンドウ2 */
#define Sel2_X (Sel1_X + 40)
#define Sel2_Y (Sel1_Y + 40)
#define Sel2_W (Sel2Button_W + SelButton_X *2 + ScrBar_W)
#define Sel2_H Sel1_H
/* 説明ウィンドウ */
#define Disp_X (Sel2_X + 50)
#define Disp_Y (Sel2_Y + 40)
#define Disp_W (560 + ScrBar_W)
#define Disp_H (Base_H + 100)
/* スクロールバー関係の設定 */
#define ScrollUnit_Y (int)(DispTx_H * 2 / 3) /* スクロールユニット(y 方向) */
#define ScrollRange_Y0 30 /* スクロールボタンが押せる回数の初期値 */
#define ScrBar_W 22 /* スクロールバーの幅 */
/* 文字の表示位置 */
#define Title_Y 3 /* タイトルの y 座標 */
#define Msg_X 2 /* メッセージの x 座標 */
#define Msg_Y (Title_Y + EndButton_H + Button_spc + 32) /* メッセージの y 座標 */
#define DispTx_X 10 /* 説明文の x 座標 */
#define DispTx_Y0 (Msg_Y + DispTx_H) /* 説明文の1行目の y 座標 */
#define DispTx_H (int)(Font_H * 3 / 2) /* 説明文の1行の高さ */
/* フォント(全角)のサイズ (ピクセル単位) */
#define Font_W 16 /* フォントの幅 */
#define Font_H 16 /* フォントの高さ */
/* ボタン関係の設定 */
#define Button_spc 6
#define BaseButton_X 10
#define BaseButton_W 280
#define BaseButton_H 24
#define BaseBtn_Y0 (Msg_Y + DispTx_H) /* 1番目のボタンの y 座標 */
#define SelButton_X 10
#define Sel1Button_W (int)(PaNameLen /2 * Font_W)
#define Sel2Button_W (int)(FaNameLen /2 * Font_W)
#define SelButton_H BaseButton_H
#define SelBtn_Y0 (AllButton_Y + AllButton_H +Button_spc) /* 1番目のボタンの y 座標 */
#define EndButton_X 3
#define EndButton_Y (3 + EndButton_H)
#define EndButton_W 70
#define EndButton_H 25
#define EndBtnTxt "←戻る"
#define AllButton_X (Msg_X + 200)
#define AllButton_Y (EndButton_Y + EndButton_H + AllButton_H + Button_spc)
#define AllButton_W 100
#define AllButton_H EndButton_H
#define AllBtnTxt "全部 表示"
/* ボタンのディスパッチインデックスの割り付け */
#define BaseBtn 0 /* ベースウィンドウのボタン */
#define Sel1Btn 100 /* 選択ウィンドウ1のボタン */
#define Sel2Btn 200 /* 選択ウィンドウ2のボタン */
#define DispBtn 300 /* 説明ウィンドウ のボタン */
#define EndButton 1 /* 終了ボタン */
#define AllButton 2 /* 全部表示ボタン */
/* 各項目の最大数 */
#define CircMax 30 /* ボード・回路の数の上限 */
#define PartMax 10 /* 1つのボード・回路の中の項目の最大数 */
#define FailMax 15 /* 1つの部分における症状の最大数 */
/* 文字列の長さの上限 (半角単位で 最後の NULL を含む ) */
#define NameLenMax 43 /* タイトルに使う文字列の長さ */
#define CiNameLen NameLenMax /* ボード・回路名 の長さ */
#define PaNameLen NameLenMax /* 部分名 の長さ */
#define FaNameLen NameLenMax /* 症状名 の長さ */
#define DispTextLen 601 /* データファイルの1行の長さ */
/* 回路の種類 の 順番付け */
enum E_Circuit{
cFirstMsg =0, /* 最初に表示される注意 */
cFirstCirct /* 最初の回路 */
};
/* ウィンドウ内の表示の順番 */
enum E_TextOrder {
tTitle, /* タイトル */
tMsg /* メッセージ */
};
#define tKind (tMsg + 1) /* 表示座標の配列の添え字 */
/* 表示フラグの状態 */
enum E_dState{
dNone =0, /* 表示するものがない */
dAll, /* 全部表示 */
dNormal /* 通常表示 */
};
/* データファイルの中で使われる記号 */
#define Comnt ';' /* 1行コメントにするために行頭に置く記号 */
#define FstAttBegin ':' /* 最初の注意の始まり */
#define FstAttEnd '*' /* 最初の注意の終わり */
#define CiBrac '[' /* ボード・回路名が 入るカッコ */
#define PaBrac '<' /* 部分名が 入るカッコ */
#define FaBrac '(' /* 症状名が 入るカッコ */
#define CiEnd '?' /* ボード・回路 の終わり */
#define FileEnd '@' /* データファイルの終わり */
/* メッセージ */
#define WelcomMsg "MFDBへようこそ。"
#define FirstMsg1 "※ 以下の事項についてもう一度"
#define FirstMsg2 "確認してください。"
#define SelectMsg "項目を選んでください。"
#define DispAllMsg "すべての項目について表示します。"
#define GoToSel2Msg "次の 選択2 に進む"
/* エラーメッセージ */
#define AlreadyRun "MIRS障害データベースは既に起動されています。"
#define FileNotExist " ファイル が存在しません。"
#define CountOver " データファイルの項目数が既定の最大値を超えました。"
#define NoExplain " この項目については、データファイルの中に記述がありません。"
#define DataError "データの記述に誤りがあります。\n定められた書式にしたがってください。"
#define CannotRun " − 続行不能"
#define DataReading "データ読み込み中"
/* その他の設定 */
#define Version 1 /* (現在使われていません。)*/
/* グローバル変数の定義 */
/*
ヘッダで宣言するとエラーになるので、 mfdb.cpp に移しました。
*/
#endif /* __MFDB_DEF_H */
// mfdb_ft.cpp MIRS障害データベース 将来の拡張のための C++関数ファイル // Mar. 22, 1995 #pragma hdrfile "mfdb.sym" #include#include #include #include #pragma hdrstop #include "mfdb_def.h" #include "mfdb_cls.h" extern char CircuitName[cFirstCirct+ CircMax][CiNameLen]; /* メッセージ応答関数の例 */ /* void MfdbBaseWindow::FT1ButtonMsg(RTMessage) { if(!BeSel1Win){ MessageBox(HWindow,"このボタンは将来の拡張用です。", CircuitName[FT1], MB_OK); } } */ /* 機能拡張については、 マニュアル( NCT−電子制御−9404−1−3 MIRS障害データベースの使い方 )の、 3.2 機能の拡張 を参照してください。 */
NAME MFDB
EXETYPE WINDOWS
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE MULTIPLE
HEAPSIZE 3000
STACKSIZE 5120
ICON_1 ICON "mfdb.ico"
;falures.txt
; 作成日 1995年 3月16日
;
; 変更
; 年 月 日
;
; MIRS障害データベース(MFDB) 症状ファイル
;
; !!!! データファイルの変更は、MFDBを実行していない状態で行うこと。 !!!!
;
; 改行だけの行は作らないでください。全部表示ボタンの動作に支障があります。
; (空行を表示したい時は、半角スペースを1つ入れておいてください。)
;
; ; で始まる行は コメントになります。
;
;書式について:
;
; 1.すべての行を、左端(前の行の改行直後)から書き始めてください。
;
; :: 最初に表示される注意のタイトルが入ります。
; * 最初に表示される注意は、 * (半角) で終わります。
;
; [] の中には、ボード名または回路名が入ります。
; <> の中には、部分の名前が入ります。
; () の中には、症状が入ります。
;
; 現在、これらのカッコの中に入るのは、全角で20文字です。
; ヘッダファイル mfdb_def.h の NameLenMax で定めています。
;
; ? ボード・回路が変わる時には、 ? (半角) を書くこと。
; @ 症状ファイルの終わりには、 @ (半角) を書くこと。
;
; 2.1行(改行なしで続く文字列)の長さを300文字(全角)以下にしてください。
;
; 実際の書き方については、次の例と、下の各データを参考にしてください。
;
;
;
;例
;[ボード名1]
;<部分1>
;(症状1)
;説明1
; :
;
;<部分2>
;(症状2)
;説明2
; :
;(症状3)
;説明3
; :
;?
;;
;[ボード名2]
;(症状1)
;(症状2)
;(症状3)
;?
;@
;
;最初に表示される注意
:基本的な注意:
<VMEラック>
・VMEラックに電源(±5V,±12V,GND)が供給されているか。
・ターゲットボードはしっかり接続されているか。
・VMEラックのバックプレーンのジャンパの接続はできているか
(ボードが挿入されていないスロットについては、IACK、BG0〜BG3の計5つの信号(10端子)をジャンパでショートする必要がある)
<VSBC−1>
・ジャンパが正しく設定されているか確認してください。
(NCT−電子制御−9404-1「自律知能ロボット用制御システムの開発
(その1 システム概要とテストプログラム)」第2章 参照。)
・ICEとの接続に使用している68ピンコネクタのピンが折れ曲がっていないか確認してください。
<VIPC310>
・ジャンパが正しく設定されているか確認してください。
(NCT−電子制御−9404-1「自律知能ロボット用制御システムの開発
(その1 システム概要とテストプログラム)」第2章 参照。)
<IP−Digital48>
・ジャンパが正しく設定されているか確認してください。
(NCT−電子制御−9404-1「自律知能ロボット用制御システムの開発
(その1 システム概要とテストプログラム)」第2章 参照。)
<ロジックアナライザ>
・プローブが断線していないか確認してください。
<個別保守診断プログラム>
・RS−232CケーブルがVSBC−1のCH0に接続されているか確認してください。
・RS−232Cケーブルが断線していないか確認してください。
・PC−98端末はターミナルモードに移行してください。
(NCT−電子制御−9404-1-2「個別保守診断プログラムの使い方」参照。)
<全ボード,回路に共通のこと>
・ボード/回路のVCCとGNDは短絡していないか確認してください。
・ジャンパ線は正しく接続されているか、または断線していないか確認してください。
*
;
;[Man-Machine インタフェース・ボード]
[Man-Machine インタフェース・ボード]
<LED>
(LEDが点灯しない)
LEDの極性が逆になっていないか、確認してください。
(7seg−LEDの点灯が異常)
配線が、セグメント違いになっていたり、隣のセグメントと短絡したりすると、7セグメントLEDに正しい数字が表示されません。
<スイッチ>
(割り込みが何回も入る)
スイッチ割込み処理ルーチンにおいて、命令 outportb(PSR0,0x08); によって H4ステータスビットがクリアされないと、割込みが入りっぱなしになります。
?
;
;[ロータリ・エンコーダ/タッチセンサ・ボード]
[ロータリ・エンコーダ/タッチセンサ・ボード]
<ロータリ・エンコーダ>
(動作しない)
ロータリ・エンコーダが壊れていないか確認してください。
(I/Oにアクセスできない)
I/Oボード(VIPC310)のジャンパが正しく設定されているか確認してください。
<タッチセンサ>
(試験中に暴走する)
割込みベクタ番号設定用のディップスイッチの設定が間違った状態で割込みがかかると暴走します。
(リセットすると割り込みが入る)
初期化を行う前に、命令 MOVE #$2000,SR によって割込み許可状態にすると割り込みが入ります。
(割り込みを許可するとすぐ割り込みが入る)
初期化を行う前に、命令 MOVE #$2000,SR によって割込み許可状態にすると割り込みが入ります。
?
;
[PWM信号回路]
(LowLevelで細かいパルスが出る)
ICのGNDが接触不良だと細かいパルスがでます。
?
;
;
[赤外線センサ回路]
(スイッチを読み取れない)
I/Oボード(VIPC310)のジャンパが正しく設定されているか確認してください。
(パルスが出ない)
・ボードにクロックが入っているか確認してください。
・フリップ・フロップが壊れていないか確認してください。
?
;
;
[超音波センサ回路]
(回り込み波が除去不能)
増幅率が大きすぎると回り込み波が除去できなくなります。
(割り込みが何回も入る)
ポートの設定が間違っていないか確認してください。
(割り込みを許可するとすぐ割り込みが入る)
・ソフトに原因がある場合
回り込み波に対応するための割り込み処理がされていない
これについては、
NCT−電子制御−9404-1-5「個別保守診断プログラムのソースリスト」の
sss.c
を参考にしてください。
・ハードに原因がある場合
(現在のところそのような原因は登録されていません。)
(PLDの接触不良)
PLDをしっかりセットしてください。
(PLDに書き込めない)
PLDが故障していないか確認してください。
(アンダーフローしない)
・増幅率が大きすぎると、アンダーフローしません。増幅率を下げてください。
・タイマ・モードがデバイスウォッチドッグ・モードになっているか確認してください。
(割り込み試験でアンダーフローしてしまう)
増幅率が小さすぎると、アンダーフローします。増幅率を上げてください。
?
;
;
[電源/勝敗判定装置]
(LEDの異常点灯)
接触不良でないか確認してください。
?
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;FT1
[将来の拡張1]
(将来の拡張1 の1)
MFDBは、表示される説明を簡単に追加できます。
現在登録されていない症状を見つけたら、ぜひ登録してください
(登録は、MFDBを終了してから行うこと)。
登録のしかたについては、
マニュアル( NCT−電子制御−9404-1-3
「MIRS障害データベースの使い方」 )の、
3.1 表示項目と説明の追加/変更
と、
データファイル failures.txt の中のコメント
を参照してください。
?
;
;FT2
[将来の拡張2]
(将来の拡張2 の1)
MFDBを改造し、機能を拡張する場合は、
マニュアル( NCT−電子制御−9404-1-3
「MIRS障害データベースの使い方」 )の、
3.2 機能の拡張
を参照してください。
?
;
;
@
;
;症状ファイルの終わり
;
1) NCT−電子制御−9404-1 自律知能ロボット用制御システムの開発(その1) ,1995
2) NCT−電子制御−9404-1-3 MIRS障害データベースの使い方 ,1995
3) TURBO C++3.0 FOR WINDOWS PROGRAMMER'S GUIDE, BORLAND, 1992
4) OBJECTWINDOWS FOR C++ USER'S GUIDE , BORLAND, 1992
5) Windows/C++ 基本プログラム集, 横井与次郎, 工学図書株式会社, 1993