ダウンロードされるデータのヘッダ定義について


ヘッダの定義
ターゲットにダウンロードされるモジュール(データ)には、必ず同じ形式のヘッダが付きます。
モジュールの種別にはPOUコード、リソースコンフィギュレーションテーブルなどがあります。通常、これらは個々のスペースまたはマルチスペース(ターゲットのシステムレイヤの用語です)に相当します。

以下のCのstrRdccModulId構造体( "dsys0df2.h" で定義されています)が、このヘッダに相当します。

typedef struct {  
char psTgtName[16], /* ターゲット名。ヌルターミネートした文字列。 */
uint32 luRdccVers, /* フォーマットのバージョン。現在の番号=4 */
uint32 luRDtaBaseCrc, /* モジュールが所属するリソースのCRC。リソースを一意に識別するためのものです */
uint32 luModulCrc, /* モジュールのCRC演算結果。内容のの整合性を確認するために使用します */
uint32 luParam, /* 追加のパラメータ 以下のように使用します。
    • POUモジュールの場合、POUの数。オンライン修正用のコードのスペース(モジュール)の場合、パラメータ luParamは最後に修正されたリソースのCRC情報を含みます。(luRDtaBaseCrc の方はオリジナルのCRCのままです。)これはVer.4.10から追加された仕様です。*/
uint32 luModulSize, /* モジュールの合計サイズ(ヘッダ部分を含む) */
uint32 luDataSize, /* モジュールのサイズ(ヘッダ部分を含まない) */
uint32 luPCRNameOfs, /* プロジェクト名/コンフィギュレーション名/リソース名の格納位置で、モジュールの先頭からのオフセットです。
    これはワークベンチでつけた名前に対応します。モジュールがコンフィギュレーション、またはプロジェクトを参照している場合は、プロジェクト/コンフィギュレーション名またはプロジェクト名のみが格納されています。
*/
uint32 luModNameOfs, /* モジュール名の格納位置で、モジュールの先頭からのオフセットです。
    例:リソースコンフィギュレーションテーブルモジュールの RESCONF_MODULE
    他のモジュール名に関しては、ワークベンチのインタフェースリファレンス(ProTic.doc)を参照して下さい。 */
uint32 luDataOfs, /* モジュールを構成するデータのの格納位置。モジュールの先頭からのオフセットです。 */
uint32 luModulCmpDate, /* モジュールのコンパイル日時。Ver.4.10では未実装です。 */
uint32 luModulCmpVers, /* モジュールのコンパイルバージョン。Ver.4.10では未実装です。 */
uint32 luModulUsVers /* ユーザ定義バージョン番号。Ver.4.10では未実装です。 */
} strRdccModulId;  


CRCの演算は、下記のアルゴリズムにて行います。

/****************************************************************************
function : resCrcCalculate
description : crc計算の実行
warning :
****************************************************************************/
uint32 resCrcCalculate
(
void* pvDataAdd, /* In: CRC計算対象データの先頭アドレス */
uint32 luDataSze /* In: データサイズ */
) /* Returns: 計算したCRC */
{
uint32 luCrc;
uint32 luMem1;
uint32 luCnt1, luCnt2;

luCrc = 0xffffffffUL;

for (luCnt1=0; luCnt1<luDataSze; luCnt1++)
{
luCrc ^= (uint32)(((uchar*)pvDataAdd)[luCnt1]);
for (luCnt2=1; luCnt2<=8; luCnt2++)
{
luMem1 = luCrc;
luCrc /= 2;
if (luMem1 & 1) luCrc ^= 0xa000a001;
}
}

return (luCrc);
}

サンプルプログラム
下記はモジュールデータの整合性をチェックするプログラムの一例です。
モジュールの先頭のアドレスを void* pvModulAdd
モジュールの合計サイズを uint32 luModulSz とします。

pModulId = (strRdccModulId*)pvModulAdd;
if ( (luModulSz < sizeof(strRdccModulId)) | |
(luModulSz < pModulId->luModulSize) | |
(luModulSz < pModulId->luDataSize) | |
(luModulSz < pModulId->luPCRNameOfs) | |
(luModulSz < pModulId->luModNameOfs) | |
(luModulSz < pModulId->luDataOfs) )
{
/* データのサイズが不一致 */
}
pvModDtaAdd = (uchar*)pvModulAdd + pModulId->luDataOfs;
luModDtaSze = pModulId->luDataSize;
if ( resCrcCalculate(pvModDtaAdd, luModDtaSze) != pModulId->luModulCrc )
{
/* データのCRCが不一致 */
}
最終更新:
2008-08-01 13:55
改訂:
1.0
評価点数:0 (0 件の投票)
Chuck Norris has counted to infinity. Twice.

最も人気の FAQ RSS

  1. SFC要素の「ステップ」と「トランジション」の意味と役割を教えてください。 (46563 回の閲覧)
  2. LD言語で、ある接点がFALSEの場合、それ以降のファンクションブロックを実行しないように出来るか? (46381 回の閲覧)
  3. ISaGRAF WorkbenchをWindows 7で使用するにはどうしたらよいでしょうか? (43798 回の閲覧)
  4. PLCプログラムをより早く動かすにはどうすればよいですか? (40875 回の閲覧)
  5. ISaGRAFはIEC1131-3のシステム定義に準拠しているか? (40656 回の閲覧)
  6. LD言語で、立ち上がり・立ち下がりの出力はあるか? (38735 回の閲覧)
  7. VxWorksターゲットにおける変数管理の留意点について (38221 回の閲覧)
  8. 日立製作所製SHマイコン用コンパイラ使用時の注意事項 (38054 回の閲覧)
  9. Cファンクション/ファンクションブロックの"Hidden" パラメータとはどのようなものか (37685 回の閲覧)
  10. FBD/LD言語で同じ行に複数の演算がある場合の実行順序は? (35301 回の閲覧)

最近の FAQ RSS

  1. ファンクションブロックはネストできますか。 (2016-08-05 15:07)
  2. Cファンクション/ファンクションブロックの"Hidden" パラメータとはどのようなものか (2015-01-30 14:24)
  3. 前のISaGRAFで作成したプロジェクトをインポートしたら、コメントが文字化けを起こしています。 (2014-05-07 06:52)
  4. 前のバージョンで作成したプロジェクトは読み込めますか。 (2014-03-07 07:46)
  5. ISaGRAFでコンフィグレーション、リソースそれにPOUはそれぞれいくつ作成できますか。 (2014-03-07 02:06)