Format Parser
TWELITE PAL の親機出力形式を解釈するコードです。
TWELITE PAL 親機の書式フォーマット (ASCII形式のみ) を解釈しています。多くはその定義に従います。
Version 1.0 では書式フォーマットの解釈を VB.NET にて実装していましたが、v1.2 では C# による実装となりました。
当アプリのビルドでは PAL_PARSER プロジェクト(ターゲットフレームワーク .NET Framework 4, クラスライブラリ)が該当し、VB.NET 側の PAL_VIEWER プロジェクトから参照関係になっています。
本書では VB からの呼び出し例として記載します。

関連ソースファイル

以下のソースコードにより PAL 親機より出力されるデータを解釈します。
ファイル名
内容
ITweDataPresentation.cs
UART 電文のエンコード(ASCII 書式)を解釈する。解釈ができれば、ITweDataFormat による解釈も行う。
ClsDataPresentationAscii.cs
ASCII書式 :800...<CR><LF> の解釈。
ITweDataFormat.cs
上記 ASCII 書式で解釈されたデータ書式を表現する(アドレス情報など共通情報や、データ書式内のデータ構造など)。また書式を解釈後、ITweDataPayloadを生成する。
ClsDataFormatPAL.cs
PAL のデータ書式を解釈する。
ITweDataPayload.cs
センサー情報など各データを表現する。
ClsDataPayloadPalSensors.cs
SENSE PAL の個別センサーの集約データ型。
ClsDataPalSenseElement.cs
SENSE PAL の単独センサーのデータ型。
MUtils.cs
ITWE??? 抽象型より、適切なクラスの生成を行うジェネレータや、諸ユーティリティ。

読み出し方法

TWELITE PAL Viewer では、SerialPort1.DataRecievedイベントを起点として、書式の解釈が行われます。
以下のコード例では、CSnsDataクラスにデータをコピーしています。
1
' event handler when got data from serial port
2
Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
3
Dim strDataReceived As String
4
Dim bFlag As Boolean = True
5
6
While SerialPort1.BytesToRead > 0
7
Try
8
strDataReceived = SerialPort1.ReadLine
9
Catch ex As Exception
10
strDataReceived = ex.Message
11
bFlag = False
12
End Try
13
14
If bFlag Then
15
Try
16
'' PAL 標準フォーマットを解釈する
17
Dim b() As Byte = System.Text.Encoding.ASCII.GetBytes(strDataReceived)
18
Dim dataArrival = PAL_Utils.genDataPresentation(b)
19
20
Dim dataFmt As ClsDataFormatPalApp = dataArrival.objFormat 'データ形式、無線ノードの情報
21
Dim dataPay As ClsDataPayloadPalSensors = dataFmt.objPayload '各種センサー情報
22
23
'' CSnsData 形式に変換
24
Dim snsdt As CSnsData = New CSnsData
25
snsdt.bStored = True
26
' LQI
27
snsdt.iLQI = dataFmt.BLQI : snsdt.bLQI = True
28
' 続き番号
29
snsdt.iSeq = dataFmt.UsDataSer
30
' 名前ラベル
31
Dim iPalPcb_CD As UInteger = (dataFmt.BPalPcb And &HF)
32
Dim sPalPcb_Name As String
33
Select Case iPalPcb_CD
34
Case 0
35
sPalPcb_Name = "nc"
36
Case 1
37
sPalPcb_Name = "OnC"
38
Case 2
39
sPalPcb_Name = "AMB"
40
Case 6
41
sPalPcb_Name = "ARI"
42
Case Else
43
sPalPcb_Name = "UNK"
44
End Select
45
snsdt.sID = sPalPcb_Name + dataFmt.BSrcAddr.ToString("_00")
46
' 電圧
47
Dim l = dataPay.SensorCode(ClsDataPalSenseElement.E_SNSCD.VOLT)
48
For Each m In l
49
If m.Ex = ClsDataPalSenseElement.E_EXCD_VOLT.POWER Then
50
snsdt.iVolt = l(0).Data(0) : snsdt.bVolt = True
51
End If
52
Next
53
' OpnCls状態
54
l = dataPay.SensorCode(ClsDataPalSenseElement.E_SNSCD.HALL)
55
If l.Count > 0 Then
56
snsdt.iPC = (l(0).Data(0) And &H7F) : snsdt.bPC = True
57
End If
58
59
' TEMP
60
l = dataPay.SensorCode(ClsDataPalSenseElement.E_SNSCD.TEMP)
61
If l.Count > 0 Then
62
Try
63
snsdt.fTemp = CSng(l(0).Data(0)) / 100.0
64
snsdt.bTemp = True
65
Catch ex As Exception
66
snsdt.bTemp = False
67
End Try
68
End If
69
70
' HUMD
71
l = dataPay.SensorCode(ClsDataPalSenseElement.E_SNSCD.HUMD)
72
If l.Count > 0 Then
73
Try
74
snsdt.fHumid = CSng(l(0).Data(0)) / 100.0
75
snsdt.bHumid = True
76
Catch ex As Exception
77
snsdt.bHumid = False
78
End Try
79
End If
80
81
' LIGHT
82
l = dataPay.SensorCode(ClsDataPalSenseElement.E_SNSCD.LUMI)
83
If l.Count > 0 Then
84
Try
85
snsdt.iLight = CInt(l(0).Data(0))
86
snsdt.bLight = True
87
Catch ex As Exception
88
snsdt.bHumid = False
89
End Try
90
End If
91
92
' データ
93
snsObjs.AddEntryTemporary(snsdt, thetime)
94
snsObjsLong.AddEntryTemporary(snsdt, thetime)
95
SaveRawLog(snsdt)
96
97
Catch ex As Exception
98
bFlag = False
99
End Try
100
101
102
End If
103
104
End While
105
106
End Sub
Copied!
まず、解釈のために文字列をバイト列に変換して、genDataPresentation() により、データ解釈を行います。実行後、解釈済みのClsDataPresentationAsciiオブジェクトが生成されます。
1
Dim b() As Byte = System.Text.Encoding.ASCII.GetBytes(strDataReceived)
2
Dim dataArrival = PAL_Utils.genDataPresentation(b)
Copied!
続いて、データ書式、センサー情報を取り出します。dataFmt はデータ書式で、アドレス情報などを得ることができます。dataPayはセンサー情報で複数のセンサーの情報をひとまとめにしています。
1
Dim dataFmt As ClsDataFormatPalApp = dataArrival.objFormat 'データ形式、無線ノードの情報
2
Dim dataPay As ClsDataPayloadPalSensors = dataFmt.objPayload '各種センサー情報
Copied!
データ書式(ClsDataFormatPalApp)で得られる情報を列挙します。
名前
内容
BLQI
Byte
LQI(受信感度相当)情報
UsDataSer
UShort
続き番号
BBalPCB
Byte
SENSE PAL 種別識別子
BSrcAddr
Byte
SENSE PAL の論理ID
UiSrcAddr
UInteger
SENSE PAL のアドレス
UiRepeater
UInteger
配送経路(&H80000000UI なら直接、それ以外の場は最後に配送した中継器のアドレス)
※ PAL アプリの設定によって中継器のアドレスの定義は変化します。
次にセンサーの情報を得ます。dataPay.SensoerCode() により、センサーの種別を指定して情報を得ることができます。戻り型はList(Of ClsDataPalSenseElement)で、0個以上の要素が格納されます(Nothingにはならない)。ここでは電圧関連(ClsDataPalSenseElement.E_SNSCD.VOLT)のリストを探索します。
1
Dim l = dataPay.SensorCode(ClsDataPalSenseElement.E_SNSCD.VOLT)
Copied!
ここでは、電源電圧(ClsDataPalSenseElement.E_EXCD_VOLT.POWER)の情報が欲しいので、リストの中にあるか探索します。
1
For Each m In l
2
If m.Ex = ClsDataPalSenseElement.E_EXCD_VOLT.POWER Then
3
snsdt.iVolt = m.Data(0) : snsdt.bVolt = True
4
End If
5
Next
Copied!

ClsDataPalSenseElement クラス

このクラスは、各センサーの単一のデータを表現します。以下にデータの取り出しのためのプロパテを列挙します。
名前
内容
IsError
Boolean
データエラーの場合は True となる。
ErrorCode
Byte
エラーコードが入ります。
Data
Object
センサーのデータを格納します。エラーなどで Nothing になる場合があります。データについては要素数が1つであっても配列型となります。 例えば Byte型のデータが一つだけ含まれる場合であっても Byte(0) で宣言された配列オブジェクトとなります。
SensorCode
Byte
センサー種別が入ります。
Ex
Byte
拡張データが入ります。主に電圧情報など、センサー種別が同じでも、複数ある場合に使われます。
センサーの種別を調べるための列挙型ClsDataPalSenseElement.E_SNDCDの定義は以下です。
名前
内容
HALL
開閉磁気センサー
TEMP
温度センサー
HUMD
湿度センサー
LUMI
照度センサー
VOLT
電圧
電圧センサーの種別を特定するための列挙型ClsDataPalSenseElement.E_EXCD_VOLTは以下です。
名前
内容
POWER
電源電圧
ADC1
ADC1
最終更新 1mo ago