更新日2004年11月24日

アプリケーション作成マニュアル

    以下に、本アプリケーションを使用した開発手順を記します。 

目 次

 第1章 プロジェクト作成 1.1 ディレクトリ作成 1.2 プロジェクト管理ファイル作成(prjfile.txt) 1.3 スクリプトファイル作成(*.pkt) 第2章 アプリケーションプロジェクト作成 2.1 初期処理 2.2 スクリプト処理実行 第3章 アプリケーションソースファイル作成 3.1 ソースファイル追加  3.1.1 ヘッダファイル  3.1.2 ソースファイル 3.2 ソースファイル修正  3.2.1 関数の記述  3.2.2 関数の移動  3.2.3 関数の削除  3.2.4 関数名の変更  3.2.5 開発時処理  3.2.6 その他 第4章 関数説明 4.1 タイマーの使い方@ 4.2 タイマーの使い方A 4.3 繰り返しタイマーの使い方 4.4 独立してスレッドの中で使用するタイマー 4.5 待機状態のパケットを取得する 第5章 トラブルシューティング トラブルシューティング 第6章 デバッグツール デバッグツール 第7章 コンパイラの設定 コンパイラの設定 
第1章 プロジェクト作成
1.1 ディレクトリ作成目次 | 次の項目
任意のディレクトリを作成します。
作成例:プロジェクトに2つのアプリケーションがある場合

 
 
 
 

 

ディレクトリ 格納内容
d:\MyPrj\Apl01 アプリケーション1用ソース格納ディレクトリ
d:\MyPrj\Apl02 アプリケーション2用ソース格納ディレクトリ
d:\MyPrj\AplExe アプリケーション実行モジュール格納ディレクトリ
d:\MyPrj\Script

 

スクリプト処理モジュール・プロジェクトファイル・各スクリプトファイル・ライブラリファイル格納ディレクトリ

1.2 プロジェクト管理ファイル作成(prjfile.txt)

前の項目 | 目次 | 次の項目
プロジェクト管理ファイルを作成します。
下記の5セクションについて記述して下さい。

 
 
 
 
 
 
 

 

@[ThreadId]
 
スレッドに関する設定
[名称・識別ID・ソース出力パス]
A[WindowId]
 
ウィンドウに関する設定
[名称・識別ID・ソース出力パス]
B[PacketId]
 
パケットに関する設定
[名称・識別ID]
C[DllPath]

 

実行環境ディレクトリのパス
実行モジュール・パケット管理DLL格納ディレクトリのパス
D[ScriptPath] スクリプトファイル格納ディレクトリのパス
(※詳細は、「外部仕様」を参照して下さい。)
 
※プロジェクト管理ファイルとは、本システムのスクリプト処理を管理するファイ 
 ルを指し、次章で表すプロジェクトファイルとは、コンパイラのプロジェクトフ 
 ァイルの事を表します。

1.3 スクリプトファイル作成(*.pkt)

前の項目 | 目次 | 次の項目
スクリプトファイルを作成します。
 
スクリプトファイルには、該当アプリケーションで使用する、変数と処理手順を記述
します。
次章で示すスクリプト処理モジュールは、その手順を元に、アプリケーションの構造
を構築し、必要なコードをソースファイルに出力します。
(※詳細は、「外部仕様」を参照して下さい。)
 
ShmPkt.lib、PktCtrl.libをprjfile.txtの[ScriptPath]で指定したディレクトリに格
納し、C++Builderプロジェクトに上記2つのlibファイルを追加して下さい。
  
第2章 アプリケーションプロジェクト作成
2.1 初期処理前の項目 | 目次 | 次の項目
各アプリケーションのプロジェクトファイルを作成し、ソースディレクトリに
PktCtrl.h、MemDll.hを格納して下さい。
(※アプリケーションのプロジェクトファイルについてはコンパイラのマニュアルを
 参照して下さい。)
 
プロジェクトオプションで実行モジュールの出力パスを設定して下さい。
(prjfile.txtの[DllPath]で指定したディレクトリ)
また、当該ディレクトリにShmPkt.dll、DbgFrm.exeをコピーして下さい。

2.2 スクリプト処理実行

前の項目 | 目次 | 次の項目
CvScript.exeを実行して作成される各スレッドのソースファイル(*.cpp)と
ShmPkt.lib、PktCtrl.lib、pkttbl.cpp、prjfile.txtをプロジェクトに追加して
下さい。
各スレッドのヘッダファイル・ソースファイルは、prjfile.txtで指定したディレク
トリに作成されます。
 
CvScript.exe実行時に当該プロジェクトで使用する関数の一覧が作成・表示されま
す。(名称:funclist.txt)これにより下記に示す項目が確認できます。
@関数番号・・・ソースでの定義順
(-1:スクリプトに記述されているが使用していない関数)
A関数名
B実行タイプ・・・S:同期実行、A:非同期実行、T:関数起動、W:待機
C識別マーク・・・*:CreatePKT・PassTo関数
D引数1のパケット名
E引数2のパケット名・・・引数として2種類のパケットを取得する関数の場合
F使用状況・・USED:スクリプト・ソースの両方で使用
       NOTUSED:ソースには存在するがスクリプトでは使用していない
       NEW:スクリプトに追加された
       ----:Wait関数(ソースには生成されない)
関数一覧を表示しているnotepad.exe を閉じます。
ファイルに出力しますか?と聞いてくるので(y)を選択するとファイルが生成されます。


CvScript.exe を実行する前に必ずエディタ又はC++Builderで編集したソースファイル
を保存したことを確認下さい。保存せずに実行するとCvScriptは古いソースファイル
を読み込み、ファイルを生成するのでソースファイルからユーザの編集内容が消えてし
まいます。また、CvScript.exe 実行時に prjfile.txt に定義されているパスが間違って
いると、間違ったディレクトリのソースを読み込みマージされてしまうことがあるので注
意願います。(パケット名が同じ場合)
CvScript.exe の実行環境としては、Windows98 より DOSプロンプトに表示できる行
数が多い Windows 2000, Windows XP が適しています。CvScript.exeを実行する
DOSプロンプトウィンドウは実行終了後すぐにウィンドウを閉じる設定で使用すると
エラーメッセージを読み取れないので、実行終了後もウィンドウを開いた状態で
使用願います。


第3章 アプリケーションソースファイル作成
本機能を使用するにあたり、下記の項目を手動にて追加して下さい。

3.1 ソースファイル追加

前の項目 | 目次 | 次の項目
アプリケーションのメインウィンドウに下記の項目を追加します。
@スレッドの開始
A終了処理、
Bウィンドウのメッセージハンドラ
 
※以下の例では「//addの行」が追加した行を表します。
 
なお、本マニュアルでは、記述例として下記の項目を使用します。
@ウィンドウにアタッチする場合の例 :ctlWviewer
Aスレッドとしして動作させる場合の例:ctlThostCom

3.1.1 ヘッダファイル

前の項目 | 目次 | 次の項目
class TFrmView : public TForm
{
private: // ユーザー宣言
void __fastcall CmPacketMsg(TMessage & Message); //add
BEGIN_MESSAGE_MAP //add
MESSAGE_HANDLER(WM_PACKETMSG, TMessage, CmPacketMsg) //add
MESSAGE_HANDLER(WM_PKTNOTIFY, TMessage, CmPacketMsg) //add
MESSAGE_HANDLER(WM_TIMER, TMessage, CmPacketMsg) //add
END_MESSAGE_MAP(TForm) //add

3.1.2 ソースファイル

前の項目 | 目次 | 次の項目

@インクルードファイル指定

 
#include "PktCtrl.h" //add (MemDll.hより先に記述して下さい。)
#include "MemDll.h" //add
#include "FrmView.h"
 
#include "Wviewer.h" //add(アプリケーション固有)
#include "ThostCom.h" //add(アプリケーション固有)
 
Aアプリケーション開始時処理
 
void __fastcall TFrmView::FormCreate(TObject *Sender)
{
ctlThostCom.BeginThread(0); //add
ctlWviewer.AttachForm(this); //add
}
 
Bメッセージ応答処理
void __fastcall TFrmView::CmPacketMsg(TMessage & Message) //add
{ //add
if(Message.Msg == WM_PKTNOTIFY && Message.WParam == WPARA_APPEND)
Close();
else
ctlWviewer.OnPktMessage(Message);  //add
} //add
 
C終了時処理
void __fastcall TForm01::BtnExitClick(TObject *Sender)
{
ctlThostCom.ExitThread(this); //add
ctlWviewer.DetachForm(this); //add
}
 
Dパケット生成処理
パケットを生成するモジュールのソースファイル(*.cpp)には以下のインクル
 ードを追加し、生成箇所に下記関数を記述して下さい。
 
#include "MemDll.h" //add
CreatePacket(PhostCom, WcpuEmu); //add(生成する行に追加)
 
※Bにおいて「WM_PKTNOTIFY」のWParamが「WPARA_APPEND」のメッセージは下記の手
 順で処理されます。
@同一プロセス内の最後のスレッドによりC終了時処理が呼び出される。
A終了時処理が完了後、ExitThread()、DetachForm()の引数で指定したフォーム
 へ送られます。
 
 この例ではCvScript.exeにより生成されたパケット処理クラスを、アプリケーショ
 ンのメインウィンドウにアタッチしていますが、メインウィンドウ以外のフォーム
 にアタッチしている場合もExitThread()、DetachForm()の引数はメインウィンドウ
 を指定してください。
 また、メインウィンドウにはWM_PKTNOTIFYのハンドラとClose()処理が常に必要で
 す。

3.2 ソースファイル修正

前の項目 | 目次 | 次の項目
CvScript.exeは、プロジェクト管理ファイル・スクリプトファイルの内容に沿って
自動的にヘッダファイル・ソースファイルを出力します。よって、修正する場合は、
下記の点に注意して下さい。

3.2.1 関数の記述

前の項目 | 目次 | 次の項目
関数は、下記に示す範囲に記述します。
//{{FUNC_DEF1 **************〜
関数名自動生成部分
//}}FUNC_DEF1
この部分に固有のコードを記述して下さい。
//{{FUNC_DEF2
自動生成部分
//}}FUNC_DEF2
この部分に固有のコードを記述して下さい。
//{{FUNC_DEF3
自動生成部分
//}}FUNC_DEF3

3.2.2 関数の移動

前の項目 | 目次 | 次の項目
関数を移動する場合は、//{{FUNC_DEF1〜//}}FUNC_DEF3の部分をブロック単位で移動
して下さい。

3.2.3 関数の削除

前の項目 | 目次 | 次の項目
関数を削除する場合は、//{{FUNC_DEF1〜//}}FUNC_DEF3の部分をブロック単位で削除
して下さい。

3.2.4 関数名の変更

前の項目 | 目次 | 次の項目
スクリプトファイルの関数名を変更した場合は、新しい名前の関数が自動的に生成さ
れます。元の関数記述部分から処理内容部分をコピーして下さい。
その後、元の関数を前項の手順で削除して下さい。
 
※関数名変更後は、CvScript.exeを再度実行し、コンパイラにてアプリケーションを
 再構築して下さい。

3.2.5 開発時処理

前の項目 | 目次 | 次の項目
開発途中でプロジェクト管理ファイル・スクリプトファイルを修正した場合は、再度、
CvScript.exeを実行し、コンパイラにてアプリケーションを再構築する必要がありま
す。
ソースの修正のみの場合は、コンパイラにてアプリケーションを再構築して下さい。

3.2.6 その他

前の項目 | 目次 | 次の項目
ソースファイルの//{{PKT_INC, //{{FUNC_CALLの範囲はCvScript.exe実行により自動
的に更新されます。
インクルードファイルの//{{THR_CLASS1,//{{THR_CLASS2の部分も自動更新されます。
ソースファイル上で関数定義の順番を変更する場合は//{{FUNC_DEF1〜//}}FUNC_DEF3
のブロック単位で入れ替えて下さい。
ソースファイル上で関数の削除、関数の移動を行なった直後には、 //{{FUNC_CALLの
部分や、ヘッダとの間で整合が取れていない状態になっているので CvScript.exex を
実行してからコンパイルして下さい。
パケット名を変更したい場合は以下の手順で行なって下さい。
@prjfile.txtの中のパケット名を修正
A*.pkt, *.h, *.cppの中で使用されているパケット名を一括置換
  <パケット名>TBL, <パケット名>DATA の文字列も<パケット名>の部分を置換
B<パケット名>.pkt のファイル名を変更
CCvScript.exe 実行
 
第4章 関数説明
関数使用方法について説明します。
関数のインターフェイスについては外部仕様を参照下さい。

4.1 タイマーの使い方@

前の項目 | 目次 | 次の項目
パケットから起動してタイムアップ後自分(パケット)自身に通知する場合の例:
以下の例では最初の呼び出しでタイマーをセットした後に0を復帰してタイムアップ
を待ちます。
なお、DO_WAIT(待機モード)で関数が呼び出されたとき最初の呼び出しで復帰値1を返
すと、パケットは待機状態に入らずすぐに次の命令に移ります。
 
SetPktTimer()の第1パラメータに、自分のパケットデータへのポインタdtを渡して
いるのでタイムアップイベントを受け取るのは自分のみ(SerialNoの一致する
PKT_KensaDATAのみ)です。タイムアップ後には再びMySleepW()関数が呼び出されま
す。以下の例ではタイムアップ前に他のパケット等からStatusChanged()関数により通
知された中止イベントも受け取って処理しています。
 
//{{FUNC_DEF1 ******************************************************
int CWIN_Disp::MySleepW(PKT_KensaDATA *dt, long lparam)
{
//}}FUNC_DEF1
if(lparam == LPARAM_1STCALL) {
SetPktTimer(dt, dt->interval, ONESHOT_TIMER); // 1:oneshot
return 0;
}
else if(lparam == LPARAM_TEMPOVER) // 温度異常通知有り
return -2;
else if(lparam == LPARAM_STOPPUSH) // 中断通知有り
return -1;
return 1; // タイムアップ:lparam==LPARAM_TIMER
//{{FUNC_DEF3
}
//}}FUNC_DEF3

4.2 タイマーの使い方A

前の項目 | 目次 | 次の項目
パケットから起動してタイムアップ後同じスレッドでDO_WAIT呼出し後待機している
全てのパケットに通知する場合、SetPktTimer()の第1パラメータにNULLを指定しま
す。

4.3 繰り返しタイマーの使い方

前の項目 | 目次 | 次の項目
SetPktTimer()の第3パラメータにCYCLIC_TIMERを指定します。タイムアップイベン
トが繰り返し発生します。タイマーはイベントを受け取る待機パケットが無くなった
ら停止します。(タイマーを停止する関数は現状ではありません。)

4.4 独立してスレッドの中で使用するタイマー

前の項目 | 目次 | 次の項目
SetThreadTimer()関数を使用します。停止するにはSetThreadTimer()が返すタイマー
IDを引数にして KillThreadTimer()を呼び出します。
タイムアップするとOnThreadTimer()関数が呼び出されるので、本関数をオーバーラ
イドして必要な処理を記述してください。

4.5 待機状態のパケットを取得する

前の項目 | 目次 | 次の項目
同じスレッドでDO_WAIT呼び出しにより待機状態となっているパケットのデータへの
ポインタを取得することができます。EnumWaitingPacket()関数がありますが、型チ
ェックもしてくれるマクロENUM_WAITINGPKTを使用してください。
以下に使用例を記述します。型チェックで、引数と復帰値に不一致があるとコンパ
イルエラーとなります。
 
int count = 0;
double sum = 0.0;
int i = 0;
PKT_KensaDATA *knsDt;
while((knsDt = ENUM_WAITINGPKT(PKT_Kensa, &i)) != NULL) {
count++;
sum += knsDt->ondo;
}
if(count)
sum /= count;
 
第5章 トラブルシューティング
トラブルシューティングについて説明します。

トラブルシューティング

前の項目 | 目次 | 次の項目
下記に、本機能における、トラブルシューティングについて記します。
 
アプリケーション実行時に、DLL関連のエラーが発生する場合等で動作が異常な
場合は次の点を確認して下さい。
(下記の記述は、Borland社 C++Builderをターゲットとしたものです。)
 
@C++Builderのプロジェクト-オプションでダイアログを開きディレクトリ/条件タ
ブの「出力パス」が実行モジュールを作成したいディレクトリになっているか?
また、プロジェクトファイルの[DllPath]と同じになっているか?
 
Aプロジェクトマネージャに登録されているShmPkt.lib のパスが正しいか?
違った場所にあるものを指している場合はプロジェクトマネージャのウィンドウで右ク
リックし、違っているものをプロジェクトから削除し、再度[プロジェクト][プロジェクトに
追加]の操作で正しい場所のファイルを追加します。
 
B同じくプロジェクトマネージャのcppファイルを選択して、+マークをクリックすると
インクルードしているファイルとそのパスが表示されます。これが違っている場合は
  Aと同様に修正して下さい。直らない場合は、プロジェクトを閉じて開きなおすか、
C++Builderを再起動して下さい。
 
Cpktcode.dat が正しい場所に作成されているか?
DLLはこのファイルを読み込みしてパケットを作成しますが、pkttbl.hで定義されて
いるパケットの構造体と不一致があると正しく動作しません。pkttbl.h のパスを確
認して下さい。
 
Dディレクトリを変更した後、または他のディレクトリで動いていたプロジェクトを
コピーして、別のディレクトリで新しいプロジェクトを作成した場合に以上のような現象
が発生する可能性があります。
 
E実行時のエラーメッセージ
「pkttbl.hとpktcode.datの作成時刻が違います。」と言う内容のダイアログボックスが
表示された場合は、CvScript.exeを再度実行し、コンパイラにてアプリケーションを再
構築して下さい。または、prjfile.txtに定義されているパスを確認して下さい。

F[リンカ エラー]
外部シンボル '_tbl_createtime' が未解決、または'_pkt_id_size' が未解決と表示され
たら pkttbl.cpp がコンパイラのプロジェクトファイルに追加されているか確認して下さ
い。
複数のプロセスを順にメイク中に外部シンボル '_CG_DESC' が未解決と表示される
ときがあります。このようなときはプロジェクトを再構築するか、または pkttbl.obj を
削除してメイクを実行するとリンクできます。

G二重起動
本開発ツールではスレッドIDを固定的に割り当てているため、二重起動すると動作し
ません。誤って二重起動させた場合は全てのアプリケーション及びデバッグツールを
停止してからもう一度起動して下さい。
 


第6章 デバッグツール
デバッグツールについて説明します。

デバッグツール  Dbug_Win.exe

前の項目 | 目次 | 次の項目
スクリプト単体のテストにはステップ実行によるテストが効率的です。また、スクリプト
相互間の時系列的な関係を把握するにはTrace文をスレッドのソースに埋め込んで
ツールのMESSAGEウィンドウに表示される内容を確認することができます。デバッグ
ツールはC++Builderのデバッガを起動した状態でも使用することができます。これに
より、スクリプトをデバッグツールで確認しながら、スクリプトから関数の中に入ったら
C++Builderのデバッガで確認するといったことができます。ただし、デバッグツールで
ステップ実行しているパケット以外は停止せず処理が進行します。
  
@ファイルを開くスピードバーでパケットを選択します。続いて表示されるファイル
選択ダイアログでパケットのスクリプトファイルを選択します。
(ディレクトリに注意)
 
Aデバックするアプリケーションを走らせて、パケットを生成すると、最初の行で一旦
停止します。停止している行は赤で表示されます。ステップ実行ボタンを押すと1ステ
ップづつ実行して行きます。三角のRun ボタンを押すと連続して実行します。ソースリ
ストのチェックボックスをマウスでクリックしてチェック状態にしておくと、そこで停止し
ます。本機能は特定の1つのパケットを対象としたデバッグに使用します。
 
BVariableリストボックス
停止中は、パケットのシステム変数とスクリプトファイルで定義したパケット変数の内
容が表示されます。(下記参照)
システム変数の一部とスクリプトファイルで定義した変数は、変更できます。
変更したいデータ欄をマウスでクリックし、入力モードに移行して、変更して下さい。
 
 システム変数
 @serialNo  :パケット識別番号。システム全体でユニークな0以外の値。
        (変更不可)
 AparentNo  :CreatePKTにより生成された場合生成元のパケット識別番号。
        その他は0です。(変更不可)
 BcurrentStep :実行中の命令アドレス。(変更不可)
 CcurrentThread :現在パケットを占有しているスレッドのID。(変更不可)
 Dpriority :未使用
 EerrorNo :システムエラー※の番号を表します。
 FerrorThread :システムエラー※が発生したスレッドIDを表します。
 Gtimeout :未使用
 H******以降はスクリプトファイルで定義された変数です。
     ・
     ・
※ :システムエラーはパケット処理プログラムで発生するエラーを指します。現在は
パケットのPostに失敗した場合のみです。
 
CMEAASEウィンドウ
スレッドの関数の中でvoid CPacketCtrl::Trace(char *msg);を呼び出すと、行頭に時
刻を付加して本ウィンドウに表示します。
 記述例
int CTHR_00::DispS(PKT_e10DATA *in)
{
Trace("メッセージ");
}
 なお、Trace()はCPacketCtrlのメンバ関数です。
 
DINFOウィンドウ
a.SHARED MEM.
  共有メモリのAllocate 情報を表示します。
  パケットが無い状態でも内部の管理用としてある程度のメモリが割り当てられてい
  ます。
b.PACKET INFO.
  Wait状態のパケットがある場合は表示されます。処理が終わって廃棄されると何も
  表示されません。
c.THREAD INFO.
  ユーザがprjfile.txtで定義したID、ウィンドウのハンドル又はウィンドウズが管理して
  いるスレッドIDを表示します。

E共有メモリ割り当て可能サイズの変更  (V1.01での追加機能)
allocate可能なサイズはデフォルトでは256kBとなっています。デバッグツールの[CNF]
ボタンによりこのサイズを256kB〜4096kBの範囲で設定することが出来ます。設定を
変更した後は共有メモリを使うアプリケーションとデバッグツールを一旦全て終了して
下さい。
 



第7章 コンパイラの設定 

コンパイラの設定

前の項目 | 目次
本開発ツールを使うためにC++Builder のプロジェクトオプションのコンパイラやリンカの
設定を特に変更する必要はありません。
コンパイラ(詳細)タブの「データの配置境界」(8バイト)は変更しないで下さい。また、
#pragma pack(n) 指令は使わないで下さい。
 

以 上


 → 戻る