このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
CANフレーム構造、バイト順序、ビットカウント
このページでは、CAN フレーム構造に関する AUTOSAR と Vehicle Network Toolbox™ の動作について説明します。具体的な項目については AUTOSAR CP システム テンプレート R23-11 を参照しますが、これらの概念は一般的なものであり、標準の他のバージョンにも当てはまります。
バイトオーダー(エンディアン)とビットカウント
バイト順序 (またはエンディアン) とは、バイトがデジタル ワードに格納される順序を指します。「ビッグ エンディアン」(Motorola® バイト順) という用語は、最も重要なバイトが最初に格納されることを指します。逆に、「リトルエンディアン」(Intel® バイト順)は、最下位バイトが最初に格納されることを意味します。
ビット カウントとは、特定のバイト レイアウト内での 2 進数のビットの順序付けられたシーケンスを指します。「最上位ビットが先」(MSb ファースト) または「最下位ビットが先」(LSb ファースト) という用語は、ビット シーケンスの開始ビットがそれぞれ MSb または LSb であることを意味します。ビット番号はバイト順序とは独立して指定できます。
Vehicle Network Toolboxコンベンション
信号をパックおよびアンパックするブロックでは、Vehicle Network Toolbox は、バイト順序に関係なく、通常、「LSb ファースト」のビット カウントを使用します。たとえば、2 バイトのワードを考えます。ワード内のビットとバイトは次のように番号が付けられます。
10 ビットの数値は、ワード内にいくつかの異なる方法で格納できます。リトルエンディアン バイト順で数値を保存する 1 つの方法は次のとおりです。
ここで、開始ビットはビット 2 (LSb) で、最後のビットはビット 11 (MSb) です。バイト順序はリトルエンディアンなので、最下位バイトが最初に(バイト 0 に)格納されることに注意してください。
同じ数値をビッグ エンディアン ビット順序で保存する別の方法は次のとおりです。
ここで、開始ビットはビット 11 (LSb) で、最後のビットはビット 4 (MSb) です。バイト順序はビッグ エンディアンなので、最上位バイトが最初に (バイト 0 に) 格納されることに注意してください。
AUTOSARコンベンション
AUTOSAR 標準では、バイト順序ごとに異なるビット カウントを使用することが規定されています。特に、リトルエンディアン バイト順序を選択した場合、ビット カウントは LSb が先になります。代わりにビッグエンディアン バイト順序が使用される場合、ビット カウントは MSb が先になります。
この規則は、リトルエンディアン バイト順序が使用される場合、開始ビットが Vehicle Network Toolbox と AUTOSAR (つまり、LSb) で実質的に同じであることを意味します。
代わりにビッグエンディアンが使用される場合、スタートビットは異なります。上記のビッグ エンディアンの例では、AUTOSAR は開始ビットをビット 4 (MSb)、最後のビットをビット 11 (LSb) と見なします。
AUTOSARとDBCにおけるCANフレームの構造
AUTOSAR 規格では、自動車ネットワーク、特に CAN バスの記述においてプロトコル データ ユニット (PDU) の概念を活用します。
AUTOSAR の説明によると、CAN フレームは、プロトコルに応じて指定された最大長 (通常の CAN の場合は 8 バイト、CAN FD の場合は 64 バイト) を持つバイト配列です。この規格では、CAN フレームに単一の PDU を含めることができます。最も一般的なタイプの PDU は、1 つ以上の ISignal を伝送する PDU である ISignalIPdu です。(他の PDU タイプはコンテキストに応じて使用されます。注目すべき例としては、他の PDU を伝送できる PDU である ContainerIPdu が挙げられます。これは通常、CAN FD フレームでフレーム内の複数の ISignalIPdu を送信するために使用されます。)
ISignal は、バスを介して送信される信号のバイナリ値を表すビットのシーケンスです。
したがって、信号をフレームに直接マッピングする CAN データベース (DBC ファイル) 内の CAN フレームの一般的な定義とは異なり、AUTOSAR はより柔軟性を提供します。AUTOSAR では、まず ISignal を ISignalIPdus にマッピングし、次に ISignalIPdus をフレームにマッピングする必要があります。これら 2 つの連続するステップは、バイト順序とビット カウントの選択によって影響を受けます。
PDUにおけるAUTOSAR信号のレイアウト
AUTOSAR エンティティ ISignalToIPduMapping は、ISignal が ISignalIPdu 内に配置される方法を指定します。この点において、ISignalToIPduMapping の主な属性は次のとおりです。
対応する ISignal は、信号の長さ (他のパラメータの中でも) を定義する別の AUTOSAR エンティティです。
値は「mostSignificantByteLast」(リトルエンディアン)、「mostSignificantByteFirst」(ビッグエンディアン)および「Opaque」(Vehicle Network Toolbox ではサポートされていません)になります。
startPosition は、PDU 内の信号の開始ビット位置です。つまり、リトルエンディアン バイト オーダーの場合は LSb、ビッグエンディアン バイト オーダーの場合は MSb です。
例として、長さ 2 バイトの ISignalIPdu に対応する次のビット レイアウトを考えます。
この場合、AUTOSAR 規則に従った関連パラメータは次のとおりです。
ISignal.length = 10
ISignalIPduMapping.packingByteOrder = mostSignificantByteFirst (ビッグエンディアン)
ISignalIPduMapping.startPosition = 5 (MSb)
フレーム内のAUTOSAR PDUのレイアウト
AUTOSAR エンティティ PduToFrameMapping は、PDU がフレーム内に配置される方法を指定します。この点で、PduToFrameMapping の主な属性は次のとおりです。
値は「mostSignificantByteLast」(つまり、リトルエンディアン)または「mostSignificantByteFirst」(つまり、ビッグエンディアン)になります。
startPosition は、ISignalIPdu の開始ビット位置です。つまり、リトルエンディアン バイト オーダーの場合は LSb、ビッグエンディアン バイト オーダーの場合は MSb です。
これら 2 つのパラメータは ISignalToIPduMapping と同じ名前ですが、信号のバイト順序とビット位置ではなく、PDU のバイト順序とビット位置を参照します。
さらに、PDU はフレーム内でバイト整列されている必要があることに注意してください。したがって、バイト順序がリトルエンディアンの場合、startPosition に許可される値は 0、8、16、... となり、バイト順序がビッグエンディアンの場合、startPosition に許可される値は 7、15、23、... となります。
例として、4 バイト長のフレームに格納された次の 2 バイト長の ISignalIPdu を考えます。
AUTOSAR 規則によれば、パラメータは次のようになります。
PduToFrameMapping.packingByteOrder = mostSignificantByteFirst (ビッグエンディアン)
PduToFrameMapping.startPosition = 15 (MSb)
信号をフレームにマッピングする:AUTOSAR vs Vehicle Network Toolbox
ISignalIPdus とフレーム間、および ISignals と ISignalIPdus 間の中間マッピングにより、AUTOSAR とは異なり、Vehicle Network Toolbox でスタート ビットが計算される方法を理解するのが直感的ではありません。次の 4 つの例は、考えられる状況の代表例です。
リトルエンディアンバイトオーダーのPDU リトルエンディアンバイトオーダーの信号を伝送
4 バイト長のフレームに格納されている次の 2 バイト長の ISignalIPdu を考えてみましょう。バイト順序はリトルエンディアンで、開始ビットはビット 8 (LSb)、最後のビットはビット 23 (MSb) です。この PDU は ISignal を伝送します。ISignal 自体はリトルエンディアン バイト順で格納され、その開始ビット (PDU を基準として) はビット 2、ビット長は 10 ビットです。
Vehicle Network Toolbox は、信号のバイト順序に関係なく、信号開始ビットをフレームに対する信号の LSb と見なします。(これは、たとえば CAN Pack ブロック マスクや CAN Unpack ブロック マスクにおけるスタート ビットの解釈です。)
ビットカウントに関する限り、この場合、信号のバイト順序はリトルエンディアンであるため、AUTOSAR の信号の開始ビットの定義は Vehicle Network Toolbox の定義と同等になります。ただし、AUTOSAR では、信号の開始ビットは PDU の開始ビットを基準として指定され、PDU 自体はリトルエンディアン バイト順で格納されるため、その開始ビットは PDU の LSb になります。したがって、スタート ビットは Vehicle Network Toolbox によって次のように計算されます (疑似コード)。
if PduToFrameMapping.byteOrder == mostSignificantByteLast && ISignalIPduMapping.byteOrder == mostSignificantByteLast startBit = PduToFrameMapping.startPosition + ISignalIPduMapping.startPosition end
この例では、図に示すように、Vehicle Network Toolbox では信号の開始ビットはビット 10 です。
リトルエンディアンバイトオーダーのPDUがビッグエンディアンバイトオーダーの信号を伝送
4 バイト長のフレームに格納されている次の 2 バイト長の ISignalIPdu を考えてみましょう。バイト順序はリトルエンディアンで、開始ビットはビット 8 (LSb)、最後のビットはビット 23 (MSb) です。この PDU は、ビッグ エンディアン バイト順序で格納され、その開始ビット (PDU を基準として) がビット 4、ビット長が 10 ビットである ISignal を伝送します。
この場合、信号のバイト順序はビッグ エンディアンであり、ビット カウント規則は AUTOSAR と Vehicle Network Toolbox 間で異なります。ただし、PDU のバイト順序はリトルエンディアンであるため、その startPosition を信号の MSb の startPosition に追加して、フレームに対する MSb を決定できます。
最後のステップは、MSb (フレームに対して相対的) が与えられたときに LSb (フレームに対して相対的) を決定することです。これは、次の標準アルゴリズム (疑似コード) で実現できます。
function LSb = computeLSbGivenMSb(MSb, bitLength, frameLength) i = rem(MSb, 8); j = fix(MSb/8); MSb_aux = 8*(frameLength - j - 1) + i; LSb_aux = MSb_aux - bitLength + 1; ii = rem(LSb_aux, 8); jj = frameLength - fix(LSb_aux/8) - 1; LSb = ii + 8*jj; end
このアルゴリズムは、ビット 19 の値を LSb として与えます。これは、Vehicle Network Toolbox の規則に従って信号の開始ビットに対応します。
ビッグエンディアンバイトオーダーのPDUがリトルエンディアンバイトオーダーの信号を伝送
4 バイト長のフレームに格納されている次の 2 バイト長の ISignalIPdu を考えてみましょう。バイト順序はビッグ エンディアンで、図に示すように、開始ビットはビット 15 (MSb)、最後のビットはビット 16 (LSb) です。この PDU は、リトルエンディアン バイト順序で格納され、その開始ビット (PDU を基準として) がビット 2、ビット長が 10 ビットである ISignal を伝送します。
PDU メタデータは PDU に属するバイトを定義することに注意してください。また、バイト順序(信号と PDU の両方)は、フレームの絶対バイト位置を基準にして指定されることにも注意してください。メタデータが与えられれば、次のように Vehicle Network Toolbox 規則に従って信号の開始ビットを決定することができます (疑似コード)。
startBit = PduToFrameMapping.startPosition - 7 + ISignalToIPduMapping.startPosition
ビッグエンディアンバイトオーダーのPDU ビッグエンディアンバイトオーダーの信号を伝送
4 バイト長のフレームに格納されている次の 2 バイト長の ISignalIPdu を考えてみましょう。バイト順序はビッグ エンディアンで、図に示すように、開始ビットはビット 15 (MSb)、最後のビットはビット 16 (LSb) です。この PDU は、ビッグ エンディアン バイト順序で格納された ISignal を伝送します。PDU に対するその開始ビットはビット 4 (MSb) であり、ビット長は 10 ビットです。
この場合、次のようにしてフレームに対する信号の MSb を決定することができます。
MSb = PduToFrameMapping.startPosition - 7 + ISignalToIPduMapping.startPosition;
MSb からは、関数 computeLSbGivenMSb
で前に示したように、信号ビット長とフレーム長に基づいて LSb を計算することができます。