logo90x30

ここではOSR-CDIとホスト機器の接続に使われる通信仕様について記載しています。
Versionは1.5.0ですが、それ以前のVersionも通信プロトコル部分はほぼ同じです。

1.HID接続情報
2.パケットのフォーマット
3.OSR-CDIとやり取りするデータ
_3-1.点火時期情報
_3-2.PV制御情報
_3-3.設定値情報
_3-4.リアルタイム情報
4.各コマンド詳細
_4-1.CMD_GET_DATA(0x90)
_ 4-1-1.送信パケットフォーマット
_ 4-1-2.受信パケットフォーマット
_4-2.CMD_SET_DATA(0x92)
_ 4-2-1.送信パケットフォーマット
_ 4-2-2.受信パケットフォーマット
_ 4-2-3.点火時期情報
_ 4-2-4.PV制御情報
_ 4-2-5.設定値情報
_4-3.CMD_GET_STATUS(0x93)
_ 4-3-1.送信パケットフォーマット
_ 4-3-2.受信パケットフォーマット
5.Appendix
_5-1.点火時期の計算方法
_5-2.マップ情報とページ番号

1.HID接続情報

OSR-CDIはUSB2.0のHID(Human Interface Device)として認識されます。
このため、WindowsやAndroid端末では、特にドライバー等必要なく認識され、アプリ側とHIDプロトコルで通信が可能となっています。
詳細は、OSR-CDIのファームウェアソースコードの内usbinterface.c、Windows側ソフトWinCDIの内HidDvice.cppを参照してください。

HID接続に必要な情報は以下の通りです。

ID Value
Vendor ID 0x04D8
Product ID 0x003C
USB Spec Number0x0200
Class Code0x00
Subclass code0x00

ホスト側はVendrIDとProductIDによってOSR-CDIデバイスを特定します。
Classコードは00です。
これらはMicrochip社のUSBコードサンプルの値です。

接続に成功した後は、コマンドを投げる、返答を得る形でOSR-CDIとの通信を行います。
OSR-CDIからホスト側に能動的にデータを送ってくる事はありません。
NOTE:基本的にエンジン始動中にUSBからFlashメモリの読み書きを行うと、USB接続が失敗する事がありますので注意が必要です。これはUSBの動作よりも点火動作を優先する為です。
マップ書き込み中によからぬタイミングで点火動作を行うこともある可能性もあります。

2.パケットのフォーマット

OSR-CDIとのやり取りは送信受信を含めて全て64バイトの固定長です。
必ず64バイトを送信し、64バイトを受信しなければなりません。

64バイトの中でOSR-CDIは頭の4バイトをヘッダー情報、残り60バイトをデータ情報として扱っています。
パケット内容の詳細は、コマンド毎の詳細を参照してください。

3.OSR-CDIとやり取りするデータ

OSR-CDIは、点火時期やPV(排気デバイス)のマッピング情報、設定値情報を入出力できます。
それに加え、リアルタイム情報の取得が出来ます。

項目 詳細
点火時期情報0〜1590rpmまで100rpm刻みの情報。合計160点x4、320バイトx4
PV制御情報0〜1590rpmまで100rpm刻みの情報。合計160点x4、160バイトx4
設定値情報動作に必要な各種設定値。
リアルタイム情報OSR-CDIの各種リアルタイム情報。合計1点、64バイト

これらのデータはPIC16F145xのフラッシュメモリ上のProgram Memory領域にアドレス固定で格納されています。
USBを通してのやり取りをする際、データの指定はアドレスで指定するのではなく、論理的なページ番号で指定する仕様としています。

3-1.点火時期情報

OSR-CDIはTPS(スロットルポジションセンサー)の入力によって、4枚のマップを切り替える事ができます。
1枚のマップには0rpmから15900rpmまで100rpm刻みでデータを投入する事が出来ます。
OSR-CDIのマイコン内部での計算量を削減する為に、あらかじめホスト側で点火時期の遅延量をマイコンで即時利用できるよう変換し、マイコンのFlashメモリ上に書き込みます。
取り出す場合もホスト側で変換が必要となります。
変換方法はAppendixにします。

3-2.PV制御情報

PVとはPower Valveの略で、排気デバイスの事を指します。
OSR-CDIが対応する排気デバイスは可変抵抗を具備している想定です。
ヤマハのYPVS、スズキのAETC等は可変抵抗によって排気デバイスの開度を調整しています。
OSR-CDIは、この可変抵抗に5Vを印加し、可変抵抗によって分圧された電圧から、排気デバイスの現在の開度を認識します。
0V〜5Vまでを、マイコンのADC(アナログデジタルコンバータ)によって0〜255までに変換し、モーターを動作させるフィードバック制御を行っています。
マップデータには、このADC変換された値をそのまま利用します。
NOTE:実測でスズキのAETCは90で全閉、170で全開、ヤマハのYPVSは55で全閉、123で全開でした。個体差や、ワイヤーの張り具合で値は変わりますが、純正のコントローラは固定値なので、一旦この値で設定し、設定後は排気デバイスの位置が確実にマニュアル通りになっているかを確認する必要があります。

3-3.設定値情報

OSR-CDIは多様な車種に対応する為、動作に必要な設定値を必要とします。
容量は2ページ64バイト分を確保していますが、現時点では1ページのみ使っています。

3-4.リアルタイム情報

OSR-CDIが認識している各種情報を取り出すことができます。
詳細はGET_STATUSコマンドの章を参照してください。


4.各コマンド詳細

OSR-CDIに64バイトのコマンドパケットを投げる事によって、64バイトのレスポンスパケットが返却されます。
Version1.5系からマップ数が2chから4chに増加し、マイコン内部のメモリマップが変更になったので、コマンドはOSR-CDIのVersion1.5系では0x90〜、それ以前のVersion1.4や1.3は0x80〜を使っています。
以下はVersion1.5系について記載しています。

4-1.CMD_GET_DATA(0x90)

OSR-CDIから、点火時期、PV制御のマッピング情報、設定値情報を取り出します。
Flashメモリを読み書きしますので、エンジン始動中にこのコマンドを投げないでください。
読み書きに失敗しUSB接続が中断する可能性があります。
OSR-CDI Ver1.4以前はコマンド番号は0x80でした。

4-1-1.送信パケットフォーマット

番号 説明
0 0x90 GET_DATAコマンド
1 ページ番号 点火時期やPV制御のデータが入ったページ番号
2~63未定義
ページ番号についてはAppendixを参照してください。

4-1-2.受信パケットフォーマット

64バイトのパケット中に4バイトのヘッダ情報に続いて、60バイトの情報が格納されています。
CMD_GET_DATAコマンドを送信後、OSR-CDIから返却される情報は以下の通りです。
(CMD_SET_DATAコマンドでの返却されるものも、全く同じ内容になります)
  1. 点火時期情報
  2. PV制御情報
  3. 設定値情報

番号説明
0成功:0x00
失敗:0以外
0x00が入っている場合は以下のデータが正しく入って返却されている
10x00-0xFF読み出し先頭アドレスの上位バイト(デバッグ用です)
20x00-0xFF読み出し先頭アドレスの下位バイト(デバッグ用です)
3未定義
4data01読み出しデータの1バイト目
63data64読み出しデータの64バイト目

読み出しデータは16ビット幅のものは、2バイトに渡りLoバイト、Hiバイトの順番で入ります。(リトルエンディアン方式)
例えば16ビット値のデータ0x00FF、0xFF00の4バイトを送受信する場合、データの並びは以下の様になります。
1:0xFF
2:0x00
3:0x00
4:0xFF

4-1-3.点火時期情報

以下は16ビット幅の点火時期上オフを読みだした場合のデータ配置です。
一度に16個のデータが得られます。
番号説明
0成功:0x00
失敗:0以外
0x00が入っている場合は以下のデータが正しく入って返却されている
10x00-0xFF読み出し先頭アドレスの上位バイト(デバッグ用です)
20x00-0xFF読み出し先頭アドレスの下位バイト(デバッグ用です)
3未定義
4data01-L1番目の読み出しデータのLoバイト
5data01-H1番目の読み出しデータのHiバイト
6data02-L2番目の読み出しデータのLoバイト
7data03-H2番目の読み出しデータのHiバイト

36data16-L16番目の読み出しデータのLoバイト
37data16-H16番目の読み出しデータのHiバイト
38〜64未定義

4-1-4.PV制御情報

以下は8ビット幅のPV制御情報を読みだした場合のデータ配置です。
1度に32個の情報が得られます。
番号説明
0成功:0x00
失敗:0以外
0x00が入っている場合は以下のデータが正しく入って返却されている
10x00-0xFF読み出し先頭アドレスの上位バイト(デバッグ用です)
20x00-0xFF読み出し先頭アドレスの下位バイト(デバッグ用です)
3未定義
4data011番目の読み出しデータ
36data3232番目の読み出しデータ
37〜64未定義

4-1-5.設定値情報

以下は設定値情報を読みだした場合のデータ配列です。
番号説明デフォルト値
0成功:0x00
失敗:0以外
0x00が入っている場合は以下のデータが正しく入って返却されている
10x00-0xFF読み出し先頭アドレスの上位バイト(デバッグ用です)
20x00-0xFF読み出し先頭アドレスの下位バイト(デバッグ用です)
3未定義
40x00-0xFFOSR-CDIファームウェアのメジャーバージョン
例えばVersionが1.5.3の場合は1
1
50x00-0xFFOSR-CDIファームウェアのマイナーバージョン
例えばVersionが1.5.3の場合は53
50
60-159QSが有効となる回転数
OSR-CDIはサポートする回転数が15900rpmなので、159が上限値。
150
70x00-0xFFQSスイッチが入ってからカットに至るまでの時間(クランク回転数)0
80x00-0xFFQSで点火カットを行う時間(クランク回転数)24
90x00-0xFFQSで点火カット後のスイッチ無効時間(クランク回転数)180
100:QSとして動作
1:KSとして動作
QSスイッチをKS(キルスイッチ)に代替するか否かを指定する0
110:導通でオン
1:開放でオン
QSスイッチが導通でオンなのか、開放でオンなのかを指定する
0
120-159レブリミット回転数
120
130x00-0xFF予約領域(未定義)0
14-150x00-0xFFFFエンジン回転数を割り出す為の固定値
クランク1回転に付きピックアップ信号が2回来る車種(RZやTZR等)は18,750
同、1回来る車種(DTやSDR等)は37,500
18750
160x00-0xFFクランク1回転に付きピックアップ信号が2回来る車種(RZやTZR等)は2
同、1回来る車種(DTやSDR等)は1
2
170x00-0xFFピックアップ位置(Degree)
RZ250は33、TZR250やRZRは36、SDRは72、DTは69等
36
180x00-0xFFエンジン始動時にアナログ点火を行う回数10
19〜31予約領域

4-2.CMD_SET_DATA(0x92)

OSR-CDIへ、点火時期情報やPV制御情報のマッピング情報を投入します。
Flashメモリを読み書きしますので、エンジン始動中にこのコマンドをなるべく投げないでください。
エンジン始動中かどうかは、リアルタイム情報を読み込むことによって判定できます。
読み書きに失敗する可能性があります。またよからぬタイミングで点火してしまう可能性があります。
OSR-CDI Ver1.4以前はコマンド番号は0x82でした。

4-2-1.送信パケットフォーマット

番号説明
00x92SET_DATAコマンド
1ページ番号点火時期やPV制御値の番号
2未定義
3未定義
4~63
data書き込みデータ
内容は送信するデータにより変わります。

点火時期情報、PV制御情報、設定値情報のデータは5バイト目から投入します。
5バイト目以降の各種データの配置は、GET_CMD_DATAで返却されるものと同じですので、詳細はそちらを参照ください。

4-2-2.受信パケットフォーマット

CMD_SET_DATAコマンドを送信後、OSR-CDIから返却される情報は、書き込みを行った情報と同じものが返却されます。
5バイト目以降を比較する事によって送信したデータと実際にFlashメモリに書き込まれた情報が一致するかを確認する事が出来ます。
(Flashメモリ書き込み後、OSR-CDIはGET_DATAと同じ処理をしていますので、内容も同じになります)
例えば、点火時期データを送信すると、書き込みされた点火時期データが以下の様に返却されます。
フォーマットはGET_DATAと同じです。

番号説明
0成功:0x00
失敗:0以外
0x00が入っている場合は以下のデータが正しく入って返却されている
10x00-0xFF書き込み先頭アドレスの上位バイト(デバッグ用です)
20x00-0xFF書き込み先頭アドレスの下位バイト(デバッグ用です)
3未定義
4data01-L1番目の書き込みデータのLoバイト
5data01-H1番目の書き込みデータのHiバイト
6data02-L2番目の書き込みデータのLoバイト
7data03-H2番目の書き込みデータのHiバイト

36data16-L16番目の書き込みデータのLoバイト
37data16-H16番目の書き込みデータのHiバイト
38〜64未定義
CMD_GET_DATAを送信した時の受信パケットと内容は同じです。
OSR-CDIはSET_DATAによって送られてきたデータをFlashメモリに書き込んだ後、Flashメモリから読みだした内容を送り返してきます。
このため送信したデータ、受信したデータを比較すれば、正しくマイコンに書き込まれたかを確認する事が出来ます。

4-3.CMD_GET_STATUS(0x93)

OSR-CDIから、リアルタイム情報を取り出します。
OSR-CDI Ver1.4以前はコマンド番号は0x83でした。

4-3-1.送信パケットフォーマット

番号説明
00x93GET_STATUSコマンド
1〜64未定義

4-3-2.受信パケットフォーマット

1バイト目から全てデータが詰め込まれています。
OSR-CDIのプロトコル上に、エラーコード等はありません。
番号情報内容
0エンジン回転数の下位バイトエンジンの回転数(r.p.m.)を100で割った値
1エンジン回転数の上位バイト過去エンジン回転数を16ビットでやり取りしていた頃の名残で、現在は使われていない
2現在選択されているマップマップスイッチやTPSによって設定されているマップ番号で0〜3の値
3エンジン始動状態エンジン停止中の場合は0、動作中の場合は1
4PV現在値PVから読み取った位置情報で0〜255の値
5PV目標値マップから読み取ったPVの目標値
6PVモードPVの制御モード。
0:PVがエンジン始動中に回転数に従い動作するモード
1:初期動作でPVを全開中。全開になるとモード2に移行する
2:初期動作でPVを全閉中。全閉になるとモード3に移行する
3:初期動作でPVを全開中。全開になるとエンジン始動まで待機する
モード3にてエンジン始動を感知するとモード3から0に移行する
モード0にてエンジン停止を感知するとモード0から1に移行する
7PVモーター制御状態PVの制御状態
0:PVを開いている
1:PVを閉じている
2:PVを弱めに停止している(使われていません)
3:PVを強めに停止している
8-9点火時期設定値現在の回転数で指定された点火時期マップの値
デバッグ用で、ホスト機器側でこの情報を取る事に大きな意味はありません
10QS信号状態クイックシフター(QS)のオンオフスイッチの状態
QSスイッチの動作確認用に使えます
QSスイッチが値が1から0になった時に、QSは動作を開始します
12QS制御状態QSの制御状態(ステートマシン)
0:QSスイッチのオン待機状態(QS信号は1の状態)
1:QSスイッチが入った後の待機状態(QS信号が1から0になった際に遷移)
2:エンジンカット中
3:エンジンカット後のスイッチ無効状態
4:QSスイッチのオフ待機状態
QSの状態は0から順番に4まで遷移した後、0に戻ります
設定されたエンジン回転数がカウントアップした後、次の状態に遷移します
13TPS情報TPSから読み取った位置情報で0〜255の値
14~63未定義

5.Appendix

5-1.点火時期の計算方法

ホスト機器で設定した点火時期は、マイコン側での計算を省略する為にあらかじめホスト側で都合の良い形に変換してから設定しています。
ピックアップ信号を感知してから、ある一定の時間が経過した後、点火信号を発生させる必要があります。これにPICマイコンのTimer2を利用しています。
PICマイコンのTimer2は8ビットタイマーですが、PrescalerとPostscalerによって実質16ビット長のタイマーとして利用できます。
Timer2の8ビット時代との互換性を担保する為、この様な仕様になっていますので、やや複雑です。

timer2module
Timer2のPrescalerとPostscalerは以下の様に設定されます。
timer2module-t2con


PICマイコンのTimer2の詳細はこちらを参照してください。
https://ww1.microchip.com/downloads/en/devicedoc/40001639b.pdf

この仕組みに合致させるために、マイコン内部で毎回計算をすると、計算時間が大きくなり、また大きな揺れが発生します。
その為、Timer2に合うようホスト側で事前に計算し、マイコン側で即時利用できる様に整えてから、マップ情報としてFlashメモリ上に書き込む手法を取っています。

計算方法に必要な要素は以下の通りです。
  1. マップ情報(BTDC何度で点火信号を送るのか)
  2. ピックアップ信号位置
  3. マイコン側での処理に必要なロス時間
以下に角度からタイマー値へ変換するC言語によるコードを記します。
コメントを追記しておきました。
実際に動作する詳細なコードはWincdiのHidDevice.cppを参照してください。

// ---------------------------------------------------------------------------
// deg2time
// ---------------------------------------------------------------------------
uint16_t HidDevice::deg2time( double deg, uint16_t rpm ) {
	double pre_degree, pre_count;
	uint16_t prescaler, pre, postscaler;
	uint16_t pr2, t2con;
	uint16_t result, ii;

	if (0 == deg || 0 == rpm) {
		return 0;
	}

	// 角度の精度を小数点1桁に揃える
	deg *=10;
	deg = (int)deg;
	deg /= 10;

	// ピックアップ角度から点火したい角度を引いて、遅延させる角度を出す
	pre_degree = cfg.sys_pickup_degree - deg;

	// 遅延させる角度から、マイコン側の必要なタイマー値を算出する
	// 1000rpmでエンジンが回っている状態で、タイマーがカウントアップする数は
	// count_of_1deg_at_1000rpm = 666.666667
	// となる。
	// このサンプルでは変数rpmに100分の1の値が入ってくる。例えば1000rpmの場合、
	// 10が入っている。
	// # 基準のカウント値を1000rpm(=10)にしているので、*10が入っている。
	// # また精度を出すために掛け算を先に行い、割り算を最後に行っている。
	pre_count = ((pre_degree * count_of_1deg_at_1000rpm * 10) / rpm);

	// count_of_tuneはマイコンの動作時間で、1回転あたりのピックアップ信号が
	// 1の時(DTやSDR)、610(step)
	// 2の時(RZやTZR)、570(step)
	// の値を実測から投入している。
	if (pre_count > count_of_tune) {
		pre_count -= count_of_tune;
	} else {
		pre_count = 0;
	}

	// 以上で、マイコン側で必要なカウント値が算出された。
	// 次に、PIC16F145xのTimer2カウント値に変換する。
	// Timer2 = Prescaler * PR2 * Postscaler 
	// PR2:        {0 ... 255}
	// Prescaler:  {1:1/1:4/1:16/1:64}
	// Postscaler: {1:1 ... 1:64}

	// 最初に最もおおざっぱなprescaler値を計算する
	ii = (uint16_t)(pre_count/256);
	if     ((ii/ 1) < 16) {prescaler = 1; pre = 0;}
	else if((ii/ 4) < 16) {prescaler = 4; pre = 1;}
	else if((ii/16) < 16) {prescaler = 16;pre = 2;}
	else if((ii/64) < 16) {prescaler = 64;pre = 3;}
	else {
		// カウント値が長すぎてオーバーフローした場合0を返す。
		return 0;
	}

	// 次にpostscalerを計算する
	postscaler = (uint16_t)(pre_count/256/prescaler + 1);

	// 最後にpr2を算出する
	pr2 = (uint16_t)(pre_count / prescaler / postscaler);

	// t2conはPIC16F145xnT2CONレジスタに入れる8ビット幅のデータ。
	// +4はTMR2ONの3ビット目TMR2ONビットをセットする為に入れている。
	t2con = ((postscaler-1) << 3) + 4  + pre;
	
	// 上位をPrescalerとPostscalerで埋めて、下位をpr2で埋めて返却する
	result = (t2con<<8) + pr2;
	return result;
}
反対にマイコン内部のデータから角度を計算する関数は以下の通りです。
基本的に逆の事を行っているだけです。

// ---------------------------------------------------------------------------
// time2deg
// ---------------------------------------------------------------------------
double HidDevice::time2deg( uint16_t src, uint16_t rpm ) {
	uint8_t t2outps, t2ckps, pre, post, pr2;
	uint32_t count;
	double deg;

	if (0 == src) {
		return 0;
	}

	pr2 = src & 0xff;			// 下位1バイトの取り出し
	t2outps = src >> 11 & 15;	// ポストスケーラーの取り出し
	t2ckps = (src >> 8) & 3;	// プリスケーラーの取り出し

	post = t2outps + 1;
	switch( t2ckps ) {
	case 0:	pre = 1;	break;
	case 1: pre = 4;	break;
	case 2: pre = 16;	break;
	case 3: pre = 64;	break;
	default: pre = 64;	 break;// Never in
	}

	deg = cfg.sys_pickup_degree - (((count*rpm) / 10) / count_of_1deg_at_1000rpm);

	// 桁数揃え
	deg *=10;
	deg = (int)deg;
	deg /= 10;

	return  deg;
}

5-2.マップ情報とページ番号

OSR-CDIとのやり取りはページ番号を指定する事によって行われます。
通常マイコン側のアドレスを意識する必要はありません。
点火時期情報は1点につき16ビット長2バイトなので、1ページに16点情報が入っています。
PV情報は1点につき8ビット長1バイトなので、1ページに32点情報が入っています。
設定値情報は予約分も含め64バイトあり、32バイト毎に2ページに渡って情報が入っています。
実際、OSR-CDIからデータを読み込む時は、点火マップ情報、PVマップ情報、設定値情報を一気に読み込む、一気に書き込むことになります。

Version1.5系で各ページに入っている情報は以下の通りです。
(Version1.4以下とはデータの位置が異なります)
詳細はOSR-CDIファームウェアのconstant.hに記述がありますので、参考にしてください。

pagemapAddress備考
0IG011840-185F0~1500rpm
1IG011860-187F1600~3100rpm
2IG011880-189F3200~4700rpm
3IG0118A0-18BF4800~6300rpm
4IG0118C0-18DF6400~7900rpm
5IG0118E0-18FF8000~9500rpm
6IG011900-191F9600~11100rpm
7IG011920-193F11200~12700rpm
8IG011940-195F12800~14300rpm
9IG011960-197F14400~15900rpm
10IG021980-199F0~1500rpm
11IG0219A0-19BF1600~3100rpm
12IG0219C0-19DF3200~4700rpm
13IG0219E0-19FF4800~6300rpm
14IG021A00-1A1F6400~7900rpm
15IG021A20-1A3F8000~9500rpm
16IG021A40-1A5F9600~11100rpm
17IG021A60-1A7F11200~12700rpm
18IG021A80-1A9F12800~14300rpm
19IG021AA0-1ABF14400~15900rpm
20IG031AC0-1ADF0~1500rpm
21IG031AE0-1AFF1600~3100rpm
22IG031B00-1B1F3200~4700rpm
23IG031B20-1B3F4800~6300rpm
24IG031B40-1B5F6400~7900rpm
25IG031B60-1B7F8000~9500rpm
26IG031B80-1B9F9600~11100rpm
27IG031BA0-1BBF11200~12700rpm
28IG031BC0-1BDF12800~14300rpm
29IG031BE0-1BFF14400~15900rpm
30IG041C00-1C1F0~1500rpm
31IG041C20-1C3F1600~3100rpm
32IG041C40-1C5F3200~4700rpm
33IG041C60-1C7F4800~6300rpm
34IG041C80-1C9F6400~7900rpm
35IG041CA0-1CBF8000~9500rpm
36IG041CC0-1CDF9600~11100rpm
37IG041CE0-1CFF11200~12700rpm
38IG041D00-1D1F12800~14300rpm
39IG041D20-1D3F14400~15900rpm
40PV011D40-1D5F0~3100rpm
41PV011D60-1D7F3200~4700rpm
42PV011D80-1D9F6400~7900rpm
43PV011DA0-1DBF9600~11100rpm
44PV011DC0-1DDF12800~14300rpm
45PV021DE0-1DFF0~3100rpm
46PV021E00-1E1F3200~4700rpm
47PV021E20-1E3F6400~7900rpm
48PV021E40-1E5F9600~11100rpm
49PV021E60-1E7F12800~14300rpm
50PV031E80-1E9F0~3100rpm
51PV031EA0-1EBF3200~4700rpm
52PV031EC0-1EDF6400~7900rpm
53PV031EE0-1EFF9600~11100rpm
54PV031F00-1F1F12800~14300rpm
55PV041F20-1F3F0~3100rpm
56PV041F40-1F5F3200~4700rpm
57PV041F60-1F7F6400~7900rpm
58PV041F80-1F9F9600~11100rpm
59PV041FA0-1FBF12800~14300rpm
60CFG11FC0-1FDF~
61CFG21FE0-1FFF~

以上