DshCommMonitor DSH GEM モニター ソフトウェア ユーザ プログラミング ガイド (UPRO) ( 暫定版 ) 2015 年 8 月 株式会社データマップ 文書番号 DshCommMonitor-15-30360-00
[ 取り扱い注意 ] この資料ならびにソフトウェアの一部または全部を無断で使用 複製することはできません 本説明書に記述されている内容は予告なしで変更される可能性があります Windows は米国 Microsoft Corporation の登録商標です ユーザーが本ソフトウェアの使用によって生じた遺失履歴 ( 株 ) データマップの予見の有無を問わず発生した特別損害 付随的損害 間接損害およびその他の拡大損害に対して責任を負いません 改訂履歴 番号 改訂日付 項目 概略 1. 2015 年 8 月 初版 DshCommMonitor-14-30300-00 2. 3. 4.
目次 1. はじめに...1 2. 開発環境と設定...2 3. ライブラリ プログラムとインタフェース概略...2 4.IPC 通信のためのプログラミング...3 4.1 IPC 通信で送信するデータの種類... 3 4.2 IPC 通信における処理の流れ... 4 4.3 classmonif クラスとユーザ プログラム間の通信データフォーマットと構造体... 5 4.3.1 COMM_MON_INFO 構造体... 5 4.4 IPC 通信のセットアップと使用するクラスとメソッド... 7 4.4.1 setup_comm_interface()... 7 4.5 IPC 通信を終了するためのクラスとメソッド... 8 4.5.1 terminate_comm_interface(... 8 4.6 IPC 通信で DCOM からのメッセージを受信するためのクラスとメソッド... 9 4.6.1 get_read_info()... 9 4.7 IPC 通信で得られたイベントの通知 Windows Message... 10 4.8 IPC 通信接続状態の取得... 12 4.8.1 dsh_get_ipc_state()... 12 5.SECS-II メッセージの処理プログラミング... 13 5.1 SECS-II メッセージの取り出し... 13 5.2 SECS-II メッセージの処理... 15 5.2.1 DshGemPro ライブラリとサンプル プログラム... 16 付録 A UproSample プログラムにおける処理ログ情報の表示... 17 付録 -B UproSample の S5F1, S6F11 のデコード結果表示例... 18
1. はじめに 本説明書は DshCommMonitor HSMS 通信モニター ( 以下 DSH モニターと呼ぶ ) と同じコンピュータ内に実装するユーザ プロセス プログラム ( 以下 UPRO と呼ぶ ) のプログラミングに必要な事項について説明します UPRO プログラム言語はマイクロソフト社の.Net 言語である C# または VB の使用を前提としています なお これから説明に現れるプログラムのサンプルの表現は C# 言語で行います DSH モニターの概要 機能などについては次のドキュメントを参照ください 文書番号 : DshCommMonitor-15-30300-00 DSHDSH モニター ソフトウェア ユーザーズ マニュアル DSH モニターのソフトウェア構成は 以下のようになります DSH モニター 装置 ホスト SECS-II msg 通信機能フ ロセス (DCOM) SECS-II msg ユーサ 処理フ ロセス (UPRO) 作表など 通信機能プロセス (DCOM) は 装置 ホストから送信される SECS-II 通信メッセージの中継器となります それとともに ユーザ処理プロセス (UPRO) に対して 受信した SECS-II 通信メッセージをプロセス間通信 (IPC 通信 ) を使って送信する役割を果たします UPRO は DCOM から IPC 通信で受信した SECS-II 通信メッセージの中から 処理したい対象メッセージを抽出し そのメッセージに対する望みの処理を行います 以下 下記項目について順に説明します (1) 開発環境と設定ファイル (2) 使用できるライブラリ プログラムとインタフェース (3)IPC 通信のためのプログラミング (4) サンプル プログラム UProSample の説明 (5) メッセージ処理に使用できる DshGemPro ライブラリプログラム DshCommMonitor 製品には UPRO プログラムのサンプルが同梱されています 実際のプログラミングについては 是非 UproSample プログラムのコーディングを参考にしてください UproSample は C#2008 言語で作成されています 1
2. 開発環境と設定 UPRO の開発環境は Microsoft Visual Studio で行います.Net 言語 C# または.NetVB で作成することを前提とします Microsoft Visual Studio 2008 FrameWork 3.5 以降の Visual Studio を推奨します VisualStudi による UPRO プログラムのプロパティのビルドの中のプラットフォームターゲットの設定は X86 にしてください (UPRO が使用し ユーザが独自に作成する DLL プログラムについても同様の設定をしてください ) 3. ライブラリ プログラムとインタフェース概略 DSH モニター製品には DshMonIFLIb.DLL (IPC インタフェース ライブラリ ) が提供されます DshMonIFLib.dll には DCOM と UPRO との間のプロセス通信のインタフェースとして使用されるクラスとメソッドが含まれています UPRO が使用するメソッドは static メソッド ( 関数 ) です classmonif クラスの中で UPRO が使用するメソッドは次表のとおりです メソッド名 用途 1 setup_comm_interface() IPC 通信の接続処理を行う 2 terminate_comm_interface() IPC 通信の切断処理を行う 3 dsh_get_ipc_state() IPC の接続状態を取得する 4 get_hsms_connect_state() 装置 ホストの HSMS 接続状態を取得する 5 get_read_info() DCOM から IPC を通して受信したテ ータを取得する 6 DshMemCopy() IntPtr で指定されたハ イトテ ータを別の IntPtr で指定されたメモリ にコヒ ーする classmonif クラスについては 4. で詳しく説明します 2
4.IPC 通信のためのプログラミング IPC 通信のための UPRO のプログラミングについては 製品に付属する UproSample のサンプルプログラムを 参照しながら作業されることをお勧めします IPC 通信の主な目的は 装置あるいはホストから送信される SECS-II メッセージを DCOM から IPC 通信を介して UPRO に渡すことです UPRO は 基本的に以下の処理を行う (1) 初期化処理 - IPC 通信のセットアップ (2) 終了処理 - IPC 通信の終了処理 (3) メッセージ受信処理 (4) ユーザによるメッセージ処理 これら 4 つの中で (1) (2) (3) は IPC 通信に関る処理であり (4) がユーザ自身による作成される処理です そして (1) (2) (3) の処理は 基本的に DSH 製品に含まれる DLL プログラムが行ってくれます ユーザは それに関連する classmonif クラス (DLL に含まれる関数群 ) のメソッドを呼び出すだけでそれらの処理をさせることができます 4.1 IPC 通信で送信するデータの種類 DCOM と UPRO の間で IPC 通信を使ってデータ通信を行いますが やり取りするデータの種類には 以下のように 3 種類あります 1 SECS-II メッセージの通信 ( DCOM --> UPRO ) 2 装置 ホストの通信接続状態情報 (DCOM --> UPRO) 3 DCOM と UPRO 間の接続状態の確認 ( DCOM <--> UPRO ) (--> は データの送信の方向です ) 3
4.2 IPC 通信における処理の流れ DCOM からの IPC 通信データは 構造体の中に渡される この構造体は classmonif クラス内で定義されているものです (4.3.1 参照 ) UPRO は DCOM から IPC の受信データを取得する方法は classmonif クラスの get_read_info() メソッドを使って 受信したデータがあれば それを取得するように 一定周期でポーリングする方法をとります 受信 SECS-II メッセージデータの流れは 以下のようになります UPRO 装置 1 通信機能フ ロセス (DCOM) 2 classmonif 受信処理 3 get_read_info() 4 4 MSG 処理クラス (User 作成 ) MSG キュー MSG 1 装置が SECS-IIMSG を送信し それを DCOM が受信する 2 DCOM が受信した MSG を UPRO に送信する 3 classmonif クラスがそのメッセーシ を受信し MSG キューに保存する 4 MSG 処理クラスが MSG キューから得たメッセーシ を処理する 4
4.3 classmonif クラスとユーザ プログラム間の通信データフォーマットと構造体 4.3.1 COMM_MON_INFO 構造体 IPC 通信で得られたメッセージ情報は classmonif がユーザ プログラムに渡す際 以下に示す COMM_MON_INFO 構造体を使用します public struct COMM_MON_INFO public int command; public int eqid; public int trid; public int w_bit; public int stream; public int function; public int sybt; public int length; public IntPtr text_ptr; public int year; public int month; public int day; public int hour; public int minute; public int second; public IntPtr rsrvd_1; }; // command code -- TCMD_xxxx // 0=HOST, 1=EQ // dshdr2 が発行した transaction ID // W-bit // stream // function // system bytes // text length // text( SECS-2 msg) // DCOM が取り込んだ時刻 // 予備 (1)command コマンド 4.1 で述べたように通信データには 3 種類あります その種類を識別するためのコードです コマント 名 コマント コート コマント の意味 DCMD_HOST_Connected 0x11 HOST と TCP/IP 接続した DCMD_HOST_Disconnected 0x12 HOST と TCP/IP 切断した DCMD_HOST_Selected 0x13 HOST と Selection 確立した DCMD_HOST_Deselected 0x14 HOST と Selection 解除した DCMD_EQ_Connected 0x21 EQ と TCP/IP 接続した DCMD_EQ_Disconnected 0x22 EQ と TCP/IP 切断した DCMD_EQ_Selected 0x23 EQ と Selection 確立した DCMD_EQ_Deselected 0x24 EQ と Selection 解除した DCMD_HOST_SECS2Msg 0x40 HOST からの SECS-II メッセーシ DCMD_EQ_SECS2Msg 0x41 EQ からの SECS-II メッセーシ DCMD_LinktestReq 0x2003 リンク確認要求 DCMD_LinktestRsp 0x2004 リンク確認応答 5
(2) その他の構造体メンバー メンハ ー名 コマント の意味 eqid 対象になった装置 ( 装置 =0 ホスト =1) trid DSHDR2HSMS ト ライハ ーが発行したトランサ クション ID ( ユニークな番号 ) w_bit SECS メッセーシ のヘタ ーの中の w-bit stream stream function function sybt systembytes length Text のハ イト長 text_ptr Text テ ータが格納されている領域のホ インタ year DCOM が送信テ ータを作成した年 month 月 day 日 hour 時 minute 分 second 秒 rsrvd_1 ( 予備 ) SECS-II メッセージの場合 その後の処理は DSHDR2 通信ドライバーが使用する DSHMSG 構造体の中に内容をセットして メッセージのデコードを行うことになる ( sybt と trid の設定は必要ありません ) DSHMSHG 構造体は以下の通り [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct DSHMSG public int stream; // stream id public int function; // function id public int wbit; // wait bit public int length; // msg length public IntPtr buffer; // msg buffer public int error; // error public int next; // next item public int txtp; // ( 内部処理用 ) public int txtc; // ( " ) public int work1; public int work2; public UInt32 sybt; // system bytes public int device; // device no. public int trid; // transaction ID 2015.3.6 add } 6
4.4 IPC 通信のセットアップと使用するクラスとメソッド 対 DCOM 通信のための IPC 通信セットアップは UPRO の処理を開始する際に行います 具体的には classmonif クラスの setup_comm_interface() メソッドを実行することによって行います 4.4.1 setup_comm_interface() [ 書式 ] public static int setup_comm_interface( string ConfigFile, IntPtr h_caller, int wm_log, int wm_state, int wm_link, int wm_rstt, int wm_count ) [ 機能 ] DCOM との IPC 通信を行うための準備を行う 本メソッドを呼び出すと classmonif が IPC 通信に必要なすべての処理を行います [ 引数 ] ConfigFIle IPC 通信で使用する IPC ファイル名などの情報が設定されている設定ファイルの名前です h_caller UPRO の Form のハンドルを指定します 必要がなければ IntPtr.Zero を指定してください wm_log UPRO の LOG 画面にメッセージを表示出力するためのものあり UPRO の Form に送信したい Windows Message の値を設定します 必要がなければ IntPtr.Zero を指定してください wm_state DCOM と UPRO の間に IPC 通信接続が行われているかどうかの状態を UPRO の Form に知らせるための Windows Message を指定します 必要がなければ IntPtr.Zero を指定してください wm_link UPRO が DCOM に Linktest_req コマンドメッセージを送信し Linktest_rsp を受信できたことを UPRO の Form に知らせるための Windows Message を指定します 必要がなければ IntPtr.Zero を指定してください wm_rstt DCOM が IPC 通信を停止した あるいは Linktest_req に対する Linktest_rsp の応答が一定時間内に届かなかった場合に その旨を UPRO に知らせるための Windows Message を設定します このための処理は UPRO が再接続し 継続的に IPC 通信を続けるためのメッセージです この win_rstt を必ず指定してください wm_count IPC を通して DCOMl から受信したメッセージ数を UPRO の Form に知らせるためのメッセージです 必要がなければ IntPtr.Zero を指定してください [ 戻り値 ] 返却値 = 0 で正常にセットアップを開始した 返却値 = (-1) で セットアップに失敗した 7
4.5 IPC 通信を終了するためのクラスとメソッド UPRO の処理を終了する際 IPC 通信を終了させるために classmonif クラスの terminate_comm_interface() メソッドを使用します 4.5.1 terminate_comm_interface( [ 書式 ] public static void terminate_comm_interface() [ 機能 ] DCOM との IPC 通信を終了します [ 引数 ] ありません [ 戻り値 ] ありません 8
4.6 IPC 通信で DCOM からのメッセージを受信するためのクラスとメソッド DCOM から送信されてくるメッセージを受信するときに使用するクラスとメソッドについて説明します DCOM からのメッセージは 4.2 で示した流れで UPRO に送信され UPRO はキューを通してそのメッセージを取得します キューに取り込まれるまでの一切の処理は classmonif クラスの内部で行われます メッセージは classmonif クラスの get_read_info() メソッドを使って取り込みます 4.6.1 get_read_info() [ 書式 ] public static int get_read_info(ref COMM_MON_INFO msg_info) [ 機能 ] IPC 通信で受信したメッセージを取得する [ 引数 ] msg_info COMM_MON_INFO 構造体 (4.3.1 で記述 ) のポインタです もし 受信データがあれば それが msg_info 内に格納されます [ 戻り値 ] 返却値 = 0 で受信メッセージが無かった 返却値 >0 で受信データがあった 9
4.7 IPC 通信で得られたイベントの通知 Windows Message classmonif クラスは IPC 通信で得られた以下の通信イベントを UPRO の指定された Form に対し Windows Message をポストすることによって通知します 装置 DSH モニター UPRO プロセス ホスト 通信機能フ ロセス (DCOM) SECS-II msg TCP/IP 接続 classmonif クラス (DshMonIFLib.dll) ユーサ 処理フ ロセス (UPRO) HSMS 通信確立 Linktest SendMessage() WndProc() Windows メッセーシ 処理 停止 終了 通知する Windows Message は 4.4 の setup_comm_interface() メソッドの引数に指定されたものが使用されます イベント Windows Message wparam lparam 1 HSMS プロトコルの Selection 確立と未確立 wm_state 0=HOST 1= 装置 0 = 未確立 1 = 確立 2 IPC 通信 Linktest が正常にできた wm_link - - (Linktest_rsp 受信時 ) 3 DCOM が停止あるいは終了 wm_rstt - - 4 受信した SECS-II メッセーシ の累計値 ( テスト用 ) wm_count カウント値 - なお Windows Message の宛先は setup_comm_interface() の t_caller で指定されたハンドルを有するオブジェクトになります UproSample プログラムでは formmain の Form がオブジェクトになります 10
Windows Message を受けて処理する方法については UproSample プログラムの formmain.cs の中の WndProc() を参照してください 一部を下に示します [WndProc() formmain.cs] [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")] protected override void WndProc(ref Message m) switch (m.msg) case wm_msg.wm_queryendsession: Close(); // Close X (Exit) break; case wm_msg.wm_log: //----- formlog に表示出力する LOG メッセーシ ----- IntPtr p = (IntPtr)m.WParam; string str = Marshal.PtrToStringAnsi(p); OutLog(str); break; case wm_msg.wm_hsms_state: if ((int)m.wparam == 0) host_comm_state = (int)m.lparam; } else } 11
4.8 IPC 通信接続状態の取得 DCOM UPRO 間の IPC 通信状態情報の取得は classmonif クラスの dsh_get_ipc_state() メソッドを使用します IPC 通信には 下図のように 2 本の通信経路があります DCOM フ ロセス DshCommMonitor.exe UPRO が受信する IPC UPRO DshMonIFLib.dll UPRO ユーサ 作成部分 classmonif クラス dsh_get_ipc_state() 状態取得 DCOM が受信する IPC UproSample では formmain の中で timer_status タイマーを使って 接続状態を示すランプ On/Off 表示を行っています 4.8.1 dsh_get_ipc_state() [ 書式 ] public static int dsh_get_ipc_state(int ipc_flag) [ 機能 ] ipc_flag で指定された IPC 接続状態を返却する [ 引数 ] ipc_flag 0 = UPRO の受信用 IPC を指定 1 = UPRO の送信用 IPC を指定 [ 戻り値 ] 返却値 = 0 で未接続返却値 = 1 で接続中 12
5.SECS-II メッセージの処理プログラミング 5.1 SECS-II メッセージの取り出し UPRO は 装置 ホストからの HSMS 通信メッセージは DCOM を通して IPC 通信で取得します メッセージ取得には 4.6.1 で説明した classmonif クラス get_read_info() メソッドを使用します get_read_info() は 取得したメッセージ情報を 4.3.1 で説明した classmonif.comm_mon_info 構造体内に受信したメッセージの情報を設定して渡します 構造体の中の command メンバーの情報を DSHMSG 構造体内に取り込みます public struct COMM_MON_INFO public int command; public int eqid; public int trid; public int w_bit; public int stream; public int function; public int sybt; public int length; public IntPtr text_ptr; public int year; public int month; public int day; public int hour; public int minute; public int second; public IntPtr rsrvd_1; }; // command code -- TCMD_xxxx // 0=HOST, 1=EQ // dshdr2 が発行した transaction ID // W-bit // stream // function // system bytes // text length // text( SECS-2 msg) // DCOM が取り込んだ時刻 // 予備 public struct DSHMSG public int stream; // stream id public int function; // function id public int wbit; // wait bit public int length; // msg length public IntPtr buffer; // msg buffer public int error; // error public int next; // next item public int txtp; // ( 内部処理用 ) public int txtc; // ( " ) public int work1; public int work2; public UInt32 sybt; // system bytes public int device; // device no. public int trid; // transaction ID 2015.3.6 add } 13
COMM_MON_INFO 構造体の内容を DSHMSG 構造体に取り込む処理のコーディングは UproSample プログラムの中の classmsgpro.cs ファイルの中に public static void MsgProThread() 関数があります それを参照してください MsgProThread() は スレッドであり formmain などのプログラムとは独立して処理を行います ところで MsgProThread() は UproSample の中で UPRO が通信を開始する際に 次のようにスレッドとして生成されます formmain.cs の btnstart_click() 開始ボタンのクリックに対するハンドラーの中で classmsgpro.initmsgpro(); のように initmsgpro() を呼出します initmsgpro() は classmsgpro.cs の中にあります 次のようにスレッドの生成 開始を行っています public static void initmsgpro() classmsglog.start_thread(); stop_flag = 0; threadmsgpro = new Thread(new ThreadStart(MsgProThread)); threadmsgpro.start(); } 14
5.2 SECS-II メッセージの処理 SECS-II メッセージの処理については DSHDR2 が提供する DSHMSG 構造体に格納されているメッセージ内の個別のデータアイテムのコード ( テ ータフォーマット ) を取り出し そして データアイテムの値を取り出します データの取り出しには 2 つの方法があります (1)DSHDR2 HSMS 通信ドライバーが提供する関数を使って取り出す これは SEMI が定めるメッセージ データアイテムの定義に従って データアイテムを 1 個づつ取り出す方法です (2)DshGemPro メッセージ / エンコード / ライブラリパッケージ ( 弊社別売り製品 ) を使用する このライブラリ関数を使用すれば DSHMSG 内の stream, function に対応した関数が準備されています この関数は DSHDR2 内のテキストデータから そのメッセージ ID 用に定義された構造体にメッセージデコード結果を設定してしてくれます S6F11 の例では 以下のようになります 関数 : DSH_DecodeS6F11() 構造体 : TS6F11_CE_INFO //----- TS6F11_V_INFO public struct TS6F11_V_INFO public uint vid; public int format; public int asize; public IntPtr value; public IntPtr link; } //----- TS6F11_RP_INFO public struct TS6F11_RP_INFO public uint rpid; public int v_count; public IntPtr v_list; // ( TS6F11_V_INFO ** ) } //----- TS6F11_CE_INFO public struct TS6F11_CE_INFO public uint ceid; public int rp_count; public IntPtr rp_list; // ( TS6F11_RP_INFO ** ) } 15
5.2.1 DshGemPro ライブラリとサンプル プログラム DshGemPro ライブラリは SEMI が提唱する GEM 仕様に含まれ 通常使用される SECS-II メッセージのエンコードとデコードを行うためのプログラムです (DshGemPro 製品は DshCommMonitor 製品の中には含まれておりません 別売りになります ) 本 DSH モニターでは 基本的に 受信メッセージの処理を行いますので デコード機能だけを使用します DshGemPro ライブラリの詳細については DshGemPro の関連資料を参照ください UproSample プログラム内には DshGemPro の試用版を使った S6F11, S5F11 の処理例が含まれています 以下 UproSample プログラム内のサンプルの処理について記述します (1)DshGemPro の初期化処理 DSH_StartGemMsgPro() API 関数を実行します formmain.cs の開始ボタンのイベントハンドラーの先頭で実行しています ei = DshGemPro.API.DSH_StartGemMsgPro(DshGemPro.API.MSG_TEXT_ONLY); (2) 受信メッセージの処理 classmsgpro.cs 内の MsgProThread() 内で S6F11 を受信し class_user_processing.cs ファイル内の classusermsgproc クラス内の UserMsgProc() メソッドを呼び出します (3)classUserMsgPro クラス内では 与えられた DSHMSG 構造体内のメッセージ処理を行う メッセージ ID(stream, function ) 別に分岐して各メッセージの処理を行います サンプルプログラムでは S6F11 の処理を class_s6f11 クラス (s6f11_proc.cs) の s6f11_proc() で処理しています (4)s6f11_proc() メソッドでは DSH_DecodeS6F11() 関数を使って メッセージをデコードします デコードは TS6F11_CE_INFO 構造体の中にセットされ そのメッセージの内容を disp_s6f11() で画面に表示しています S6F11 のほかに S5F1 の例も UproSample に含まれています 16
付録 A UproSample プログラムにおける処理ログ情報の表示 UproSample プログラムでは formlog.cs ファイルの中に 画面上 (Form) に TextBox を設け UproSample を構成しているクラス DLL から任意にコメントやメッセージ文をログ表示できるように作成されています このログ表示機能は 特に 開発の段階のテストで プログラムの実行状況を把握するのに役立ちます UproSample では以下のように他の DLL などがログ表示できるようにします ログ出力は Form に対する WIndows Message (wm_log) を使用します (1)formMain の load イベント処理の中で formlog のインスタンスを作成し form を起動します 同時に WndProc() で他からの Log 表示出力のための Windows Message を受けることができるようにしておきます (2)formLog では Windows Message wm_log を WndProc() で受けることができるようにします Windows Message を受けたら メッセージの中に含まれているポインタが指す文字列を TextBox に表示します (3)formMain は 他のプログラムとして 独立した DLL に予め formmain の Form Handle h_caller と Log 出力用に使用する Windows Message wm_log の値を DLL の関数を使って与えておきます (4)DLL が formlog にログ出力する方法は 以下のようになります 例えば 文字列 Sample Message をログ出力際は 以下のようにします string str = Sample Message ; IntPtr ptr = Marshal.StringToCoTaskMemAnsi(str); WinAPI.SendMessage(h_caller_if, wm_log_if, ptr, 0); Marshal.FreeCoTaskMem(ptr); (5)formMain, formlog 内の WndProc() については UproSample の formmain.cs, formlog.cs 内のソースファイルを参照ください (6)SendMessage() は Windows の API 関数です [DllImport("USER32.dll")] public static extern IntPtr SendMessage(IntPtr hwnd, int msg, int wp, int lp); [DllImport("USER32.dll")] public static extern IntPtr SendMessage(IntPtr hwnd, int msg, IntPtr wp, int lp); [DllImport("USER32.dll")] public static extern IntPtr SendMessage(IntPtr hwnd, int msg, int wp, IntPtr lp); [DllImport("USER32.dll")] public static extern IntPtr SendMessage(IntPtr hwnd, int msg, IntPtr wp, IntPtr lp); [DllImport("kernel32.dll")] 17
付録 -B UproSample の S5F1, S6F11 のデコード結果表示例 2015-08-12 10:41:49.243 ----- S5F1 rcvd ----- 2015-08-12 10:41:49.243 alid = 4660 2015-08-12 10:41:49.243 alcd = 1 2015-08-12 10:41:49.243 altx = ALTX------123456789012345678901234567890 2015-08-12 10:41:49.243 on/off = 1 2015-08-12 10:41:49.274 S5F1 E<-H w=1 sybt=00000001 length=53 2015-08-12 10:41:49.820 S5F2 E->H w=0 sybt=00000001 length=3 2015-08-12 10:42:00.038 ----- S6F11 rcvd ----- 2015-08-12 10:42:00.053 ceid = 3000000 2015-08-12 10:42:00.053 rp count = 1 2015-08-12 10:42:00.053 rpid = 2011 2015-08-12 10:42:00.053 v count = 7 2015-08-12 10:42:00.069 1. MSGx------123456789012345678901234567890 2015-08-12 10:42:00.069 2. MSGx------123456789012345678901234567890 2015-08-12 10:42:00.069 3. MSGx------123456789012345678901234567890 2015-08-12 10:42:00.069 4. MSGx------123456789012345678901234567890 2015-08-12 10:42:00.069 5. MSGx------123456789012345678901234567890 2015-08-12 10:42:00.085 6. MSGx------123456789012345678901234567890 2015-08-12 10:42:00.085 7. 123456789 18