1. 充電器購入 (SF-14845A)
1.1 購入経緯
SF-14845A
2025年5月に購入したBDZ60A(16,600円)の冷却ファン電源異常と思われるファン動作不良が発生しました。
装置の内部温度が60℃異常になったので、仮に外部に排気ファンをつけました。
ちょうど購入から1年経過し保証なども無いため、違う充電器ですが、購入しました。
しかし故障した装置の価格17,000円は約1年分の太陽光発電装置での発電電力なのでなんとも悔しい! いつかは自作して10年は故障しないものを作りたい!、今回の故障は新しいものと交換してから回路も含め調査したいと思います。
SOLAFANS の SF-14845A と言う 太陽光パネル最大電圧150V、45AのMPPT充電器でRS485で通信ができるもので、アマゾンで17,999円でした。
装置の内部温度が60℃異常になったので、仮に外部に排気ファンをつけました。
ちょうど購入から1年経過し保証なども無いため、違う充電器ですが、購入しました。
しかし故障した装置の価格17,000円は約1年分の太陽光発電装置での発電電力なのでなんとも悔しい! いつかは自作して10年は故障しないものを作りたい!、今回の故障は新しいものと交換してから回路も含め調査したいと思います。
SOLAFANS の SF-14845A と言う 太陽光パネル最大電圧150V、45AのMPPT充電器でRS485で通信ができるもので、アマゾンで17,999円でした。
1.2 SF-14845A設定内容
充電に関係する設定内容は
| 項目 | 詳細 | 設定値 |
|---|---|---|
| Battery Type Setting | リチウム電池 | |
| Battery Rated Voltage | 24V | |
| Charg Voltage Setting | Floating Charge | 27.60V |
| Charg Current Setting | Maximum Value | 45.00A |
| Set Limit Vaiue | 45.00A | |
| Discharge Limit Vol.Set | UV Recovery | 24.80V |
| UV Protection | 21.60V | |
| OV Recovery | 28.40V | |
| OV Protection | 30.00V |
1.3 設置とモニター
(1)従来の装置内に無事組み込むことができました。
スマートで無いのが恥ずかしい!

(2)モニターも若干プログラムの変更をしましたが動作させることができました。

スマートで無いのが恥ずかしい!

(2)モニターも若干プログラムの変更をしましたが動作させることができました。

2 SF-14845Aとの通信方法
2.1 説明書に通信方法がなかった
商品が届き説明書を確認したが、通信方法が不明だったので、販売者へ下記連絡を行いました。
>I purchased a SOLAFANS 48V 45A MPPT.
>
>I would like to integrate this controller into my own system.Could you
>please send the MODBUS register map (protocol specification PDF) for
>RS485 communication to this email address?
>Model: SOLAFANS 48V 45A
>MPPT Order ID : [****************]
>
>Thank you for your support.
>
>I would like to integrate this controller into my own system.Could you
>please send the MODBUS register map (protocol specification PDF) for
>RS485 communication to this email address?
>Model: SOLAFANS 48V 45A
>MPPT Order ID : [****************]
>
>Thank you for your support.
2.2 届いた protocol.pdf
30分後
連絡があり、 MPPT remote communication protocol.pdf が 届きました。
大変早い対応で驚きました。
連絡があり、 MPPT remote communication protocol.pdf が 届きました。
大変早い対応で驚きました。
通信プロトコルはMODBUSかと思っていましたが SOLAFANS 社独自のものでした。
添付していた PDF は大変解りやすく助かりました。2.3 情報取得のプロトコル
ここでは電圧や電流などの状態変化を読み込むためのプロコトルを説明します。
a.マスター側
ByteNo 1 はファンクションですが、MODBUSとは違います。
ここで紹介のコード 0xB3 以外は下記項目『c.指示タイプ』を参照下さい。
ByteNo 2 コントロールコードという MODBUS には無いコードですが、0x01 を記入することになっています。
ByteMp 7 はcheck Code で ByteNo 0〜6 の合計で下位 8bit の値です。 MODBUS の CRC と違います。
b.スレーブ側
ただしデータの並びを説明するため『ByteMo』という 1 Byte の番号 1 つに 1 Byte のデータが対応している。
c.指示タイプ
a.マスター側
Byte数は 8 Byteで MODBUS に似ていますが、下表の通り
このデータを送信することにより、該当する DeviceAddress 番号から 37 Byteのデータが返される。
つまり、MODBUS では無いことが判ったが、DeviceAddressさえMODBUSの機器と違った番号をつければ、同じBUS上にスレーブ機器を接続できることが判り、一安心しました。
ByteNo 0 はMODBUSと同じ様ですが、0 はブロードキャストではなさそうです。このデータを送信することにより、該当する DeviceAddress 番号から 37 Byteのデータが返される。
つまり、MODBUS では無いことが判ったが、DeviceAddressさえMODBUSの機器と違った番号をつければ、同じBUS上にスレーブ機器を接続できることが判り、一安心しました。
| ByteNo | 項目名 | 内容 | 備考 |
|---|---|---|---|
| 0 | DeviceAddress | 0x01 | 範囲 0x01~0xF0 最初は0x01 |
| 1 | 指示タイプ | 0xB3 | |
| 2 | コントロールコード | 0x01 | |
| 3 | data 1 | 0x00 | |
| 4 | data 2 | 0x00 | |
| 5 | data 3 | 0x00 | |
| 6 | data 4 | 0x00 | |
| 7 | check Code | 0xB5 | sum(0~6) 下位8bit |
ByteNo 1 はファンクションですが、MODBUSとは違います。
ここで紹介のコード 0xB3 以外は下記項目『c.指示タイプ』を参照下さい。
ByteNo 2 コントロールコードという MODBUS には無いコードですが、0x01 を記入することになっています。
ByteMp 7 はcheck Code で ByteNo 0〜6 の合計で下位 8bit の値です。 MODBUS の CRC と違います。
b.スレーブ側
マスターからの要求によりスレーブから 37 Byteのデータが返されます。
MODBUSと違い『データアドレス』はありません。| ByteNo | 項目名 | 内容 | 備考 |
|---|---|---|---|
| 0 | DeviceAddress | 0x01 | 範囲 0x01~0xF0 最初は0x01 |
| 1 | 指示タイプ | 0xB3 | |
| 2 | コントロールコード | 0x01 | |
| 3 | operating status | 0xXX | |
| 4 | charging status | 0xXX | |
| 5 | Control status | 0xXX | |
| 6 | PV電圧(V=x /10) | 0xXX | high byte |
| 7 | 0xXX | low byte | |
| 8 | battery voltage(V=x /100) | 0xXX | high byte |
| 9 | 0xXX | low byte | |
| 10 | charging current(I=x /100) | 0xXX | high byte |
| 11 | 0xXX | low byte | |
| 12 | 内部温度 e1(V=x /10) | 0xXX | high byte |
| 13 | 0xXX | low byte | |
| 14 | 内部温度 e2(V=x /10) | 0x00 | 実際には温度表示はなかった。 |
| 15 | 0x00 | ||
| 16 | 外部温度 e1(V=x /10) | 0xXX | high byte |
| 17 | 0xXX | low byte | |
| 18 | Spare | 0x00 | |
| 19 | Spare | 0x00 | |
| 20 | 日発電電力量 | 0xXX | 合計電力データを追加しました(4バイト、上位バイトが先)。単位はワット時です。表示ボードがない場合、このデータは無効です。 |
| 21 | 0xXX | ||
| 22 | 0xXX | ||
| 23 | 0xXX | ||
| 24 | 全発電電力量 | 0xXX | 同上 |
| 25 | 0xXX | ||
| 26 | 0xXX | ||
| 27 | 0xXX | ||
| 28 | Spare | 0x00 | |
| 29 | Spare | 0x00 | |
| 30 | Spare | 0x00 | |
| 31 | Spare | 0x00 | |
| 32 | Spare | 0x00 | |
| 33 | Spare | 0x00 | |
| 34 | Spare | 0x00 | |
| 35 | Spare | 0x00 | |
| 36 | check Code | 0xXX | sum(0~35) 下位8bit |
ただしデータの並びを説明するため『ByteMo』という 1 Byte の番号 1 つに 1 Byte のデータが対応している。
c.指示タイプ
その他 指示タイプ として
0xB2:バッテリータイプや電圧、電流などの設定情報
0xB1:B3とB2が合わさなった情報
0xC0:6種類の制御
0xD0:20種類の設定入力
0xEE:スレーブからエラー応答
0xDE:ボーレートの設定
0xDF:リアルタイムの設定
となっているようです。
詳細はPDFを確認下さい。
時間に余裕が出れば、表形式で記載したいと思います。
0xB2:バッテリータイプや電圧、電流などの設定情報
0xB1:B3とB2が合わさなった情報
0xC0:6種類の制御
0xD0:20種類の設定入力
0xEE:スレーブからエラー応答
0xDE:ボーレートの設定
0xDF:リアルタイムの設定
となっているようです。
詳細はPDFを確認下さい。
時間に余裕が出れば、表形式で記載したいと思います。
3. プログラム内容
3.1 Pythonによる例
指示コード 0xB3 による状態データの取得プログラムの例を下記に示します。
