CAN15765 および 1939 プロトコル

1. 15765 プロトコルの概要

簡単に言えば、15765 プロトコルは次のことを指します。

CAN2.0A/B プロトコル (ISO11898 プロトコルリンク層とも呼ばれます) に基づく

ハードウェアインターフェースのアプリケーション層通信プロトコル、

一般的な車両診断サービスを実装するために使用されます。

ISO11898プロトコルについては、以下の図を参照してください。

「CANバスプロトコル解説」ドキュメントを検索して参照してください

以下を指定します。

1. 120 オームの抵抗をバス CAN_H と CAN_L の間に接続する必要があります。

2. CAN バスがリセッシブの場合 (つまり、ロジック レベルが 1 の場合)、バスの電圧差は 0V です (図のデフォルト レベルは 2.5V)。

CAN バスが優勢な場合 (つまり、ロジック レベルが 0 の場合)、バス電圧の差は約 2.0 V です (表示されているレベルは 3.5 V と 1.5 V)。

3. バス通信速度は 125K ~ 1M ビットレート/秒です。

 

2. プロトコルデータユニット PDU

これはハードウェア レベルでのことです。

15765 の 1 PDU は CAN データの 1 フレームです。これには主に、フレーム ID と (最大 8) バイト データが含まれます。

フレームIDは29ビットの拡張フレームと11ビットの標準フレームに分かれます。

全体的なフォーマットは次の図に示されており、具体的な内容は CAN2.0 プロトコル (ISO11898) を参照する必要があります。

 

3. サービスデータユニット FDU

FDU は 1 ~複数の PDU で構成されており、その構成方法は単純に 15765 プロトコルとして理解できます。

PDU には 4 つのタイプがあります。

1) シングルフレーム

フレーム数は 1、つまりデータは 8 バイトを超えません。

最初のバイトは長さを示し、その後にデータが続きます。

02 3E 00 など //長さは 2、診断 ID は 0x3E、サブデータは 00

2) 複数フレームの最初のフレーム

フレーム数が 1 より大きい、つまりデータが 8 バイトを超えています。

最初のバイトの最初の 4 ビットは 1 で、それがマルチフレームの最初のフレームであることを示します。

最初のバイトは 8 ビット左にシフトされ、2 番目のバイトはデータ長を示すために追加されます。つまり、最大データ サイズは 4095 バイトです。

例: 10 08 01 02 03 04 05 06 //複数のフレームの最初のフレーム、データ長は 8、最後の 6 つは有効なデータ

3) マルチフレームデータフレーム

最初のバイトの最初の 4 ビットは 2 で、これがマルチフレームの最初のフレームであることを示します。

最初のバイトの最後の 4 ビットはシリアル番号を表し、最初のパケットは 1 から始まり、以降のパケットは順に増加し、増分が 15 を超えると 0 から始まります。

10 08 01 02 03 04 05 06 //最初のフレーム

30 00 00 00 00 00 00 00 //フロー制御フレーム

21 07 08 //データフレーム

4) マルチフレームフロー制御フレーム

最初のバイトの最初の 4 ビットは 3 で、マルチフレーム フロー制御フレームであることを示します。

最初のバイトの最後の 4 ビットは応答コードを表し、00 は正常を表し、データを継続的に送信できます。そうでない場合は、後続の送信を停止する必要があります。

3 バイト目は通常マルチフレームの送信遅延を示し、通常 00 は後続のマルチフレーム データ フレーム前の送信間隔が 0 であることを示し、1 は送信間隔が 1ms であることを示します。

他の場所では、さまざまなメーカーの定義が同じではなく、フロー制御フレームを使用していないところもあります。

4. 15765 のパッケージ化とアンパックの実装

4.1 環境を準備する

デバイスを 2 台用意し、CAN high と CAN low を接続します。デフォルトでは、CAN-1M ボーレート通信が設定され、有効になっています。

データを送信します (イニシエーター送信 ID は 18FFFFFF を使用します):

{
    "cmd":"get_vol",
    "from":"master",
    "to":"device"
}


压缩:

{"cmd":"get_vol","from":"master","to":"device"}

转Hex:7b22636d64223a226765745f766f6c222c2266726f6d223a226d6173746572222c22746f223a22646576696365227d

データ長は 47、つまり 0x2F です。

レスポンスデータ(受信側のレスポンスIDは18FFFFFEを使用):

{
    "cmd":"23.89v",
    "from":"device",
    "to":"master"
}


压缩:

{"cmd":"23.89v","from":"device","to":"master"}

16 進数に変換:

7b22636d64223a2232332e383976222c2266726f6d223a22646576696365222c22746f223a226d6173746572227d

データ長は 46、つまり 0x2E です。

4.2 パッケージ

送信データの長さが 8 を超えるため、グループ化にはマルチパケット モードが必要です。

最初のパッケージとデータ パッケージは次のように逆アセンブルできます。

发起端:
10 2F 7b 22 63 6d 64 22 //发送
30 00 00 00 00 00 00 00 //响应
21 3a 22 67 65 74 5f 76 //发送
22 6f 6c 22 2c 22 66 72
23 6f 6d 22 3a 22 6d 61
24 73 74 65 72 22 2c 22
25 74 6f 22 3a 22 64 65
26 76 69 63 65 22 7d 00 //空余1字节填充00

接收端:
10 2E 7b 22 63 6d 64 22 //发送
30 00 00 00 00 00 00 00 //响应
21 3a 22 32 33 2e 38 39 //发送
22 76 22 2c 22 66 72 6f
23 6d 22 3a 22 64 65 76
24 69 63 65 22 2c 22 74
25 6f 22 3a 22 6d 61 73
26 74 65 72 22 7d 00 00

イニシエータープロセス:

まず 10 フレームを送信し、30 フレームの応答を待ちます。

30 フレームの肯定応答を受信した後、21 から 26 までの合計 6 パケットのデータが順番に送信されます。

次に、ID を受信するまでさらに 10 フレーム待ちます。30 フレームを受信したらすぐに応答します。

次に、受信した 2x データ フレームを読み取るかキャッシュし、有効なデータを抽出して、Json API で解析します。

4.3 開梱

送信側のデータは、組み立てられたパッケージのデータのみが送信されます。

受信処理の際には一つ一つ判断する必要があります。

参照コードは次のとおりです。

int ISO15765CanFrameRxDeal(uint8_t data, uint32_t id)
{
	switch(data[0]&0xF0)
	{
		case 0x00://单帧
		//单帧可以当场处理掉
			break;
			
		case 0x10://首帧
		//1,提取要接收的长度
		//2,根据长度或这包数申请内存buf(或者创建/清空数据队列)
		//3,缓存第一包的6byte数据
		//4,发送30帧响应
			break;
			
		case 0x20://数据帧
		//根据包序号判断是否接收完毕
		//将数据缓存到buf(或者将数据写入队列)
			break;
			
		case 0x30://流控帧
		//发送完10帧后等待30帧,一般判断是不是30帧正响应即可
			break;
	}
}

5. J1939プロトコル

1939 と 15765 のハードウェア レベルは、1939 が 250K ボー レート通信を規定していることを除いて、まったく同じです。

商用車やトラック、バスのネットワーク通信に使用されており、ブロードキャストネットワーク形式であり、車両内での通信には一般に6/14ピン-250Kボーレートを使用することが規定されています。

商用車では下図のように、

メーター、エアコン、後処理装置、トラベルレコーダー、エンジン、ギアボックスなどは、必要なデータをブロードキャストの形式で CAN ネットワークに送信する必要があります。よく見かける自動車のインパネは、実はブロードキャストフレームIDデータを監視・解析しています(自動車の通信内容は容易に解読できます)。

 

異なるオンボードモジュールについて、異なるモジュールのデータを区別する方法、

1 つ目はフレーム ID と PGN です。

1939 年の PDU の場合、フレーム ID とデータ部分は次のように定義されています。

1) 1939 固定 250K 通信、フレーム ID は 29 ビット (4 バイト) を使用します。

2) フレームIDの先頭バイトの有効5ビットのうち、

最初の 3 ビットは P アービトレーション優先度として定義されます

4 ビット目と 5 ビット目は拡張データ ページとデータ ページとして定義されます。

3) フレーム ID の 2 バイト目は、PDU 形式である PF を示します。

PF 値の範囲が 0 ~ 239 (0x00 ~ 0xEF) の場合は PDU1 形式であることを示し、範囲が 240 ~ 255 (0xF0 ~ 0xFF) の場合は PDU2 形式であることを示します。

4) フレーム ID の 3 バイト目は PS、PDU 固有を示します。

PUD1 形式の場合、このフィールドはフレームの宛先アドレスを示し、PDU2 形式の場合、グループ拡張 GE を示します。

5) フレーム ID の 4 バイト目は SA、つまり送信元アドレスを示します。

送信元アドレスはどこから来たのかを示しており、契約では、00 はエンジン、3D は後処理、17/21 は計測器などと規定されています。

簡単に言えば、PGN はフレーム ID の 2/3 バイトである PF と PS で構成されます。(完全な PGN 定義はEDP+DP、PF、PS の3 バイトで構成されますが、EDP と DP は通常すべて 00 であるため、フレーム ID の最初のバイトは無視されます)

実際のアプリケーション シナリオでは、車のブロードキャスト ID を監視し、PGN ルールとプロトコルに従って対応するデータ フローまたは障害コード分析ルールを照合し、データを分析します。

たとえば、商用車には通常0x0CF00400 ブロードキャスト データがあり、その有効データは 8 バイトです。PGN の場合は00F004

IDで直接照合することも可能です。リトル エンディアン順で 4 番目と 5 番目のバイトを抽出し、80 で割って車のエンジンの速度値を取得します。

同様に、1939 プロトコルには複数のデータ フレームがあり、一般にその内容は障害コード データと複雑なデータまたは拡張データです。

PGN 00FECA 電流障害を示します

PGN 00FECB は歴史的な障害を示します

PGN 00FECC はクリア障害を意味します

車のマルチフレーム データは通常 2 つのフレーム ID で表され、1 つのフレーム ID は最初のフレームを表し、1 つのフレーム ID はデータ フレームを表します。

最初のフレームには有効なデータが含まれていません。最初のバイトは通常、さまざまなアドレッシング モードを示す 10 または 20、2/3 バイトは長さを示し、4 番目のバイトはパケット数を示します。5 バイトは埋められ、6/7/8 bytes PGN を設定します。

データフレームの最初のバイトはパケット数を示し、残りの 7 バイトは有効なデータです。

おすすめ

転載: blog.csdn.net/weixin_38743772/article/details/126494994