設 計 力 でカイゼン Before/After ソースコードの 迷 宮 作 りこんでいませんか? 1 2008/1/23 Copyright BACKSLASH DESIGN Co., Ltd. 1
本 講 座 の 概 要 ハードウェアの 制 御 仕 様 そのままに 作 成 した 実 験 用 プログラミングコード どのように 製 品 開 発 として 利 用 しますか? 作 られたモジュールを 改 変 する 際 コードだけを 見 て 手 を 入 れるよりも 設 計 図 を 書 いて 機 能 の 本 質 を 見 極 めながら 改 変 することで 品 質 効 率 両 面 での 改 善 が 図 れます 本 セッションでは 実 際 のコードを 用 いて 設 計 によるカイゼンの 例 をご 紹 介 します void main(void) { motor_tus = READY; start_timer(); while (1) { readd = NOTHING; switch (motor_status) { case STARTUP: motor_atus = READY; break; break; default: 開 始 開 始 スイッチが 押 された NO YES モータ 回 転 を 徐 々に 上 げる 停 止 スイッチが 押 された NO モータ 回 転 一 定 速 Before YES モータ 回 転 を 徐 々に 下 げる 操 作 指 令 を 取 得 する モーター 制 御 システム 指 令 に 合 わ せ モーター 稼 動 2008/1/23 Copyright BACKSLASH DESIGN Co., Ltd. 2 開 始 指 令 停 止 指 令 スイッチ 入 力 スイッチ 動 作 状 態 After モーターを スタートする 開 始 指 令 停 止 指 令 一 定 速 で 回 転 保 持 モーター 制 御 信 号 モータ ー モーターを ストップす る
Before/Afterコード 開 発 環 境 ターゲットボード 日 経 エレクトロニクス オリジナル 組 込 みシステム 入 門 付 録 ボード CPU:16ビット マイコンR8C/25 (エミュレータ 付 き) 開 発 環 境 ソフトウェア ルネサス 社 製 統 合 開 発 環 境 統 合 開 発 環 境 HEW コンパイラ NC30 USBケーブル 接 続 (minib 端 子 ) 2008/1/23 Copyright BACKSLASH DESIGN Co., Ltd. 3
Before/After サンプル システム 仕 様 モーターを 制 御 して ファンの 回 転 を 制 御 する ファンの 制 御 方 法 駆 動 にはDCモーターを 使 用 起 動 停 止 時 は 徐 々にモータ 回 転 を 加 速 / 減 速 する モーターへのPWM 信 号 のデューティ 変 化 で モータ 回 転 速 度 を 制 御 する 加 速 減 速 は 台 形 駆 動 でUP/DOWN 起 動 指 令 停 止 指 令 は 同 一 スイッチで 入 力 トグル 制 御 OFF ON OFF ファン 回 転 制 御 指 令 開 始 停 止 2008/1/23 Copyright BACKSLASH DESIGN Co., Ltd. 4
Beforeコード 解 説 仕 様 書 に 示 された 制 御 手 順 でプログラム 作 成 モーター 制 御 手 順 開 始 プログラムコード 開 始 操 作 停 止 操 作 開 始 スイッチ (SW1) が 押 された YES モーター 制 御 処 理 NO 回 転 速 度 モータ 回 転 を 徐 々に 上 げる 定 速 運 転 コーディング 時 間 停 止 スイッチ (SW1) が 押 された NO YES Duty UP のPWM 波 形 Duty UP のPWM 波 形 モータ 回 転 一 定 速 モータ 回 転 を 徐 々に 下 げる 2008/1/23 Copyright BACKSLASH DESIGN Co., Ltd. 5
ここで ちょっと 仕 様 変 更 不 具 合 の 修 正 1. モーター 加 速 中 は 停 止 指 令 が 受 け 付 けられない 仕 様 追 加 2. 緊 急 停 止 ボタンが 押 されたら 即 座 にモーター 停 止 (スイープ 停 止 ではなく 瞬 断 停 止 ) その 後 はエラーランプを 点 灯 し 電 源 再 投 入 するまで 開 始 指 令 は 無 効 とする 2008/1/23 Copyright BACKSLASH DESIGN Co., Ltd. 6
Beforeコードの 修 正 /* モータ 駆 動 信 号 を 出 力 する */ void motor_control(void) { unsigned char pwm_step, hold_count; /* 回 転 をを 徐 々に 上 げる */ for (pwm_step = 0; pwm_step < PWM_FULL_RANGE; pwm_step++) { MOTOR_OUT_PORT = ON; for (hold_count = 0; hold_count < pwm_step; hold_count++) { wait_5us(); 複 数 の 条 件 文 の 追 加 が 必 要 MOTOR_OUT_PORT = OFF; for (hold_count = 0; hold_count < ~pwm_step; hold_count++) { wait_5us(); STOP 操 作 のbreakが 必 要 /* 停 止 指 令 があるまで 定 速 回 転 を 保 つ */ for ( ;; ) { MOTOR_OUT_PORT = ON; if (get_switch(sw1_status) == SW_PUSHED) { break; /* 回 転 をを 徐 々に 下 げる */ for (pwm_step = PWM_FULL_RANGE; pwm_step > 0; pw MOTOR_OUT_PORT = ON; for (hold_count = 0; hold_count < pwm_step; hold_cou wait_5us(); MOTOR_OUT_PORT = OFF; for (hold_count = 0; hold_count < ~pwm_step; hold_co wait_5us(); /* 指 定 のスイッチ 状 態 を 取 得 する */ unsigned char get_switch(unsigned char sw_status) { if (sw_status == 1) { return SW1_IN_PORT; else if (sw_status == 2) { return SW2_IN_PORT; return SW_FREE; 緊 急 停 止 操 作 のチェックを 各 ループに 追 加 緊 急 停 止 操 作 の 対 応 追 加 2008/1/23 Copyright BACKSLASH DESIGN Co., Ltd. 7
設 計 図 を 作 りましょう! コードだけを 見 た 修 正 視 野 が 狭 く 局 所 的 な 変 更 に 陥 りがち 修 正 を 重 ねるうちに スパゲティ 化 の 恐 れも コードを 俯 瞰 した 図 = 設 計 図 を 作 りましょう 例 :モジュール 構 造 図 を 作 る コードの 各 部 分 の 意 味 合 いがハッキリ 仕 様 変 更 の 影 響 範 囲 もクッキリ 他 者 が 見 てもわかりやすい = 保 守 向 上 テストもしやすい = 品 質 も 向 上 2008/1/23 Copyright BACKSLASH DESIGN Co., Ltd. 8
設 計 図 の 紹 介 フローチャート 問 題 の 定 義 分 析 または 解 放 の 図 的 表 現 であって データ 流 れ 図 プログラム 流 れ 図 及 びシス テム 流 れ 図 とする プログラム 流 れ 図 プログラム 中 における 一 連 の 演 算 を 表 わす プログラムの 流 れを 理 解 し かつ 作 成 するのに 便 宜 を 図 る 特 殊 記 号 JISX0121より 構 造 図 (ストラクチャーチャート) プログラムの 階 層 構 造 を 表 した 図 ソフトウェアモジュールやデータ そ れらの 呼 び 出 し 関 係 情 報 のやり 取 りを 示 す ソフトウェア 設 計 の 全 体 像 や モジ ュールの 依 存 関 係 を 表 す 開 始 指 令 停 止 指 令 操 作 指 令 を 取 得 する スイッチ 入 力 スイッチ 呼 び 出 し 関 係 モーター 制 御 システム 動 作 状 態 情 報 の やり 取 り モーターを スタートする 開 始 指 令 停 止 指 令 モジュール 指 令 に 合 わ せ モーター 稼 動 一 定 速 で 回 転 保 持 モーター 制 御 信 号 モーター モーターを ストップす る 2008/1/23 Copyright BACKSLASH DESIGN Co., Ltd. 9
Beforeコードをリバースする Beforeコードから 構 造 図 を 作 成 してみる 全 体 を 見 ると 何 のシステムか わからない ファン 制 御 システム 具 体 的 な 動 作 が 見 えない 複 数 階 層 から 呼 びだされている SW1 押 下 スイッチ 状 態 を 取 得 する SW1 押 下 モーターを 制 御 する モーター 制 御 信 号 仕 様 変 更 の 影 響 範 囲 は どこまで?? スイッチ 入 力 モーター スイッチ 2008/1/23 Copyright BACKSLASH DESIGN Co., Ltd. 10
リファクタリング Step1. 処 理 を 細 分 化 機 能 ごとにモジュール 再 分 割 ファン 制 御 システム SW1 押 下 指 令 に 合 わせ ファン 稼 動 スイッチ 状 態 を 取 得 する SW1 押 下 回 転 を スタートする 回 転 を ストップする 一 定 速 で 回 転 保 持 スイッチ 入 力 スイッチ 動 作 状 態 モータ 制 御 変 化 量 PWM 波 形 を 生 成 する モーター 制 御 信 号 モーター 2008/1/23 Copyright BACKSLASH DESIGN Co., Ltd. 11
リファクタリング Step2. 全 体 の 役 割 分 担 を 見 直 し モジュール 再 設 計 ファン 制 御 システム 開 始 指 令 停 止 指 令 入 力 側 出 力 側 それぞれ 役 割 を 明 確 に 開 始 指 令 停 止 指 令 操 作 指 令 を 取 得 する 回 転 を スタートする 指 令 に 合 わせ ファン 稼 動 回 転 を ストップする 一 定 速 で 回 転 保 持 モータ 制 御 変 化 量 スイッチ 入 力 スイッチ 動 作 状 態 PWM 波 形 を 生 成 する モーター 制 御 信 号 モーター 2008/1/23 Copyright BACKSLASH DESIGN Co., Ltd. 12
Afterコードの 解 説 入 力 側 出 力 側 モジュールの 役 割 を 明 確 に 入 力 部 :ユーザからの 操 作 入 力 出 力 部 :モーター 動 作 制 御 部 トップのモジュールが 入 出 力 全 体 を 統 括 モジュール 間 のインタフェースも 見 直 ファン 制 御 部 を 役 割 により 分 割 スタート 定 常 ストップ 処 理 を 分 離 イベントにより 各 モジュールは 起 動 される これらの 処 理 は 一 連 とは 限 らない 2008/1/23 Copyright BACKSLASH DESIGN Co., Ltd. 13
設 計 図 で 修 正 を 検 討 Step1 変 更 箇 所 と その 影 響 範 囲 を 見 極 める 開 始 指 令 停 止 指 令 ファン 制 御 システム 開 始 指 令 停 止 指 令 指 令 に 合 わせ ファン 稼 動 緊 急 停 止 は 重 要 な 役 割 だから 別 モジュールが 必 要 かな 操 作 指 令 を 取 得 する 回 転 を スタートする 回 転 を ストップする 一 定 速 で 回 転 保 持 スイッチ 入 力 スイッチ あらたな 指 令 が 増 えると ここで 対 処 できそう 動 作 状 態 モータ 制 御 変 化 量 PWM 波 形 を 生 成 する モーター 制 御 信 号 モーター 2008/1/23 Copyright BACKSLASH DESIGN Co., Ltd. 14
設 計 図 で 修 正 を 検 討 Step2 設 計 図 を 変 更 し 推 敲 検 証 する 開 始 指 令 停 止 指 令 緊 急 指 令 操 作 指 令 を 取 得 する ファン 制 御 システム 開 始 指 令 停 止 指 令 緊 急 指 令 回 転 を スタートする 指 令 に 合 わせ ファン 稼 動 回 転 を ストップする 即 停 止 するには 指 令 取 得 対 応 と モーター 制 御 は 並 行 する 必 要 がある 一 定 速 で 回 転 保 持 緊 急 停 止 する モータ 制 御 変 化 量 スイッチ1 入 力 スイッチ1 スイッチ2 入 力 スイッチ2 動 作 状 態 PWM 波 形 を 生 成 する モーター 制 御 信 号 モーター 2008/1/23 Copyright BACKSLASH DESIGN Co., Ltd. 15
Beforeコードを 振 り 返 る 良 い 点 コード 行 数 が 少 ない 言 われたままコードにしたので 早 くできた 悪 い 点 全 体 を 把 握 しにくい 変 更 の 都 度 コードを 解 読 する? 追 加 修 正 時 影 響 範 囲 が 特 定 しにくい 実 は 設 計 図 はコード 作 成 者 の 頭 の 中 だけにある 2008/1/23 Copyright BACKSLASH DESIGN Co., Ltd. 16
良 い 点 Afterコードを 振 り 返 る コードを 可 視 化 した 設 計 図 がある 広 い 範 囲 が 見 渡 せる 設 計 意 図 がコードにも 反 映 されている 変 更 拡 張 しやすい 悪 い 点 仕 様 変 更 時 の 影 響 箇 所 が 特 定 しやすい コードサイズが 大 きくなった 設 計 図 の 作 成 に 手 間 がかかる 設 計 者 以 外 にも 扱 いやすい コードに 2008/1/23 Copyright BACKSLASH DESIGN Co., Ltd. 17
本 当 に Afterコードが 良 いの? Before/After それぞれのコードで 次 の 仕 様 変 更 の 対 応 方 法 を 検 討 してみてください 更 なる 仕 様 変 更 1. イベント 入 力 の 変 更 START 操 作 複 数 系 統 (SW+ハードウェア 信 号 )に STOP 操 作 ハードウェアからの 信 号 2. タイプアップ 機 能 の 追 加 STARTから 一 定 時 間 経 過 したら 自 動 的 にSTOPする 2008/1/23 Copyright BACKSLASH DESIGN Co., Ltd. 18
最 後 のメッセージ 一 手 間 を 惜 しまないでください 設 計 図 の 作 成 で この 効 果 は 生 まれます 即 コード 修 正 と 熟 考 した 修 正 なが~い 目 で 見 て どちらを 選 択 しますか? 一 人 でコードと 睨 めっこするよりも 設 計 図 を 使 ってチームで 取 り 組 みましょう! 設 計 図 を 作 って ソフトウェア 開 発 を より 楽 しくしましょう Happy! 2008/1/23 Copyright BACKSLASH DESIGN Co., Ltd. 19
参 考 資 料 組 込 みソフトウェア 開 発 のための 構 造 化 モデリング SESSAME WG2 著 翔 泳 社 2006 年 CODE COMPLETE 第 2 版 ~ 完 全 なプログラミングを 目 指 して~ スティーブ マコルネ 著 クイープ 訳 日 経 BPソフトプレス 2005 年 組 込 みソフトウェア 開 発 のための リバースモデリング SESSAME WG2 著 翔 泳 社 2007 年 ソフトウェアの 複 合 / 構 造 化 設 計 Glenford J.Myers 著 國 友 義 久 伊 藤 武 夫 訳 近 代 科 学 社 1979 年 Structured Design: Fundamentals of a Discipline of Computer Program and Systems Design. Edward Yourdon, Larry L.Constantine Prentice-Hall 1979 年 The Practical Guide to Structured Systems Design. Page-Jones, M. YOURDON Press 1980 年