Hobby Lab 趣味のモノ作り実験のサイトです。
発電装置 電力監視装置 太陽光 ローカル1分周期プログラム
1.概要
 (1)目的
2.I/Oの変数
 (1)MODBUS
 (2)GPIO
 (3)I2C
3.MySQLの変数
 (1)概要
 (2)データベース内容
4.1分周期実行方法
 (1)概要
5.メインプログラムの概要
 (1)メインルーチン
 (2)サブルーチン一覧
6.サブルーチン内容
 (1)RaspberryPi I/O
 (1-1)init()
 (1-2)RxIo()
 (2)MODBUS
 (2-1)CrcGen()
 (2-2)class UART:共通
 (2-21)__init__
 (2-22)mb_rx() スレーブ受信
 (2-23)mb_rxrs() スレーブリセット受信
 (2-24)mb_tx() マスター送信
 (2-3)class UART:充電器
 (2-31)RBZ60A_rx() 情報取得
 (2-32)RBZ60A_reset_now()
 (2-33)RBZ60A_reset_all()
 (2-4)class UART:測定器
 (2-41)PZEM017c_rx()
 (2-42)PZEM017i_rx()
 (2-43)PZEM_reset()
 (2-5)class UART:負荷電力計
 (2-51)AC301_rx()
 (2-52)AC301_reset()
 (3)MySQL
 (3-1)1分更新DB
 (3-11)db_re 読込
 (3-12)db_in 追加
 (3-13)db_up 修正
 (3-14)db_de 削除
 (3-2)10分更新DB
 (3-21)db_m_re 読込
 (3-22)db_m_in 追加
 (3-23)db_m_up 修正
 (3-24)db_m_de 削除
 (3-3)1日更新DB
 (3-31)db_d_re 読込
 (3-32)db_d_in 追加
 (3-33)db_d_up 修正
 (3-34)db_d_de 削除
 (4)db_prs()

Pw:Monitor 太陽光監視
PwMn:全般
PwMn:ハード
 システム図
 ラズパイ周辺回路
PwMn:プログラム
 Local1分周期プログラム
 Local状態表示プログラム
 遠隔情報伝送プログラム
 遠隔状態表示プログラム
Pw:Solar 太陽光関係
PwS:装置
ソーラパネル
 ソーラーパネル
 ソーラーパネル用サーキットブレーカ
充電器
 充電器
 充電器用サーキットブレーカ
 充電器用電流計
蓄電池
 蓄電池用サーキットブレーカ
 蓄電池用電流計
 蓄電池
インバータ
 インバータ用サーキットブレーカ
 インバータ用電流計
 インバータ
PwS:保守
 パネルを洗う
PwS:旧品
 旧充電器
 旧充電器(ModBus)
Pw:MicroHydro 関係
PwMh:装置
Pw:Exciter 励磁器関係
PwEx:装置
 前置き
 自動電圧調整器概要1
 自動電圧調整器概要2
 ハードウェアー
 発電試験装置の製作試験
 サイリスタ制御他
 部品表
PwEx:プログラム
 プログラミング(準備)
 プログラミング(詳細)
 プログラム(ソース)

1.概要

 (1)目的

情報取得用ModBus関係のMppt充電器の取替えや直流電流、電圧検出の追加に伴いプログラムを見直しました。
このプログラムは太陽光発電装置の状態を取得して、データベースに記録するプログラムです。
このプログラムの周期は1分周期で実行されます。
この他に1分周期で実行するプログラムはインターネット上のレンタルサーバーへ情報を伝送するプログラムが有ります。
別のプログラムにしたのは、共に動作しなくなる事を防ぐためです。





2.I/Oの変数

 (1)Modbus

ModBusの共通情報
シリアル通信の使用方法
ModBusを使用しているものは2つ有り
a.充電器 DeviceAddress=0x01 FunctionNo=0x04
・太陽光パネルの発電出力とバッテリー入力の間に設置している充電器の各情報
 充電器ModBusデータ
新用途名アドレス変数名倍率単位データ型長さ・値旧用途名
ステータス0x0003fg1->cstts-----binary2フラグ1
太陽光パネル電圧0x000Bpvv->cpvv0.1Vdecimal4,1太陽光パネル電圧
母線電圧0x000Cbsv->cbsv0.1Vdecimal4,1母線電圧
出力電流0x000Dopc->copc0.1Adecimal4,1出力電流
蓄電池電圧0x000Exx2->cbtv0.1 ->Vdecimal5,1->4,1不明2
DC Load電流0x000Fot1->cldc1->0.1℃->Adecimal3,0->4,1屋外温度
装置温度0x0010ut1->cut11decimal3,0装置温度
総発電量0x0012,13opw->calwh0.1->0.001W->kWdecimal5,1->7,3出力有効電力
今日の発電量0x0014,15xx1->ctowh0.1->0.001->kWdecimal5,1->7,3不明1
xx30.1decimal5,1不明3
----fg2-----binary2フラグ2

ステータス 0x0003
用途bit変数名備考
内部温度が高すぎる b0000 0000 0000 0001$scstts_itr障害
バッテリーの温度が高すぎるb0000 0000 0000 0010$scstts_btr障害
DC出力過電流 b0000 0000 0000 0100$scstts_dcco障害
PV過電圧 b0000 0000 0000 1000$scstts_svo故障
PV電圧が低すぎる b0000 0000 0001 0000$scstts_svl障害
充電電圧が高すぎる b0000 0000 0010 0000$scstts_cvth故障
急速充電 b0000 0000 0100 0000$scstts_fsc状変変化
均等化 b0000 0000 1000 0000$scstts_eqc状態変化
フロートチャージ b0000 0001 0000 0000$scstts_flc状態変化
最大追跡力 b0000 0010 0000 0000$scstts_mppt状態変化
1-DC出力オン、0-オフ b0001 0000 0000 0000$scstts_dc状態変化
1-充電オン 0-充電オフ b0010 0000 0000 0000$scstts_ch状態変化
待機する b1000 0000 0000 0000$scstts_sb

b.電力計 DeviceAddress=0x02 FunctionNo=0x03
・太陽光発電装置に接続している交流電源の電力計
 電力計ModBusデータ
用途名アドレス変数名倍率単位データ型長さ・値
負荷電圧0x000Eldv0.1Vdecimal4,1
負荷電流0x000Fldc0.001Adecimal5,3
負荷有効電力0x0011ldw0.1Wdecimal5,1
負荷電力量0x0017ldwh0.001kWhdecimal5,3
動作時間0x0019opt->ldt1decimal5,0
室温0x001Aut2->ldlmt1decimal3,0
負荷力率0x001Dpf1->ldpf1%decimal3,0
周波数0x001Ef1->ldf0.1Hzdecimal4,1

c.電流・電圧検出器(充電器) DeviceAddress=0x12 FunctionNo=0x04
・充電器出力、インバータ入力の直流電流・電圧の検出
 pzem-017 Modbusデータ
用途名アドレス変数名倍率単位データ型長さ・値
母線電圧20x0000pbsv20.01Vdecimal4,2
充電器出力電流0x0001pcopc0.01Adecimal5,2
充電器出力電力0x0002,3pcopw0.1Wdecimal7,1
充電器出力電力量0x0004,5pcopwh1Whdecimal7,0

d.電流・電圧検出器(インバータ) DeviceAddress=0x13 FunctionNo=0x04
・充電器出力、インバータ入力の直流電流・電圧の検出
 pzem-017 Modbusデータ
用途名アドレス変数名倍率単位データ型長さ・値
母線電圧30x0000pbsv30.01Vdecimal4,2
インバータ入力電流0x0001pivinc0.01Adecimal5,2
インバータ入力電力0x0002,3pivinw0.1Wdecimal7,1
インバータ入力電力量0x0004,5pivinwh1Whdecimal7,0

 (2)GPIO

電力の切り替え信号を取得して
・電源切替器の状態をMySQLへ記録します。※
・交流電源の電力計の『電力量』、『動作時間』の値を読み込みMysqlに記録、値をリッセットします。
a.母線電圧電流計 ・外部I/Oにより、負荷電源供給箇所判定、インーバータ・電源切替器動作制御。
 GPIOの使用方法  Ryドライバー(2SC1815)の使用方法
出力:SW=OFFで商用
用途名個別変数名状態説明変数名データ型長さ・値
電源供給箇所fgi_pwl入力:R=L(Ω):V=H(V)で商用fgibinary1
電源供給切り替えfgo_pwswfgobinary1
インバータ電源fgo_invsw出力:SW=OFFで電源切りfgobinary1

 (3)I2C

a.蓄電池電圧電流計 ・シャントCTによる蓄電池の電流測定と電圧を測定します。
 I2C使用方法
 INA226
用途名変数名倍率単位データ型長さ・値
蓄電池電圧btv1Vdecimal5,3
蓄電池電流btc1Adecimal5,3
b.非接触直流電流計 ・非接触直流CTを使用し蓄電池の直流電流を測定する。
 非接触直流CT[ホール素子WCS]
 増幅回路[オペアンプ全般]
 I2C使用方法
 16bit A/D[ADS1115]
用途名変数名倍率単位データ型長さ・値
蓄電池1電流bt1c1Adecimal4,2
蓄電池2電流bt2c1Adecimal4,2
c.温度計 ・1-Wireによる蓄電池の温度測定。
 温度センサー 1-Wire[DS18B20]
 使用方法
用途名変数名倍率単位データ型長さ・値
蓄電池1温度bt1t1decimal3,0
蓄電池2温度bt2t1decimal3,0
インバータ温度ivt1decimal3,0
d.湿度、気圧計 ・湿度、気圧計
 温度センサー 1-Wire[DS18B20]
 使用方法
用途名変数名倍率単位データ型長さ・値
温度tmp1decimal3,0
湿度hum1%decimal3,0
気圧prs1hpadecimal4,0
e.照度計 ・照度計
 温度センサー 1-Wire[DS18B20]
 使用方法
用途名変数名倍率単位データ型長さ・値
照度lx11lxdecimal5,0





3.MySQLの変数

 (1)概要

MySQLでは太陽光発電に伴う記録を蓄積し、表示器へそのデータを渡すために使用する。
現在は太陽光発電の状態表示用としてのデータの受け渡しをしている。
記録の周期は現在は1分としているが、出来だけ早い変化を確認したいので10秒程度にならないか確認をしていく。

将来的には、各報告(日報・月報・年報)を行う。
データベース名:sumstm

 (2)データベース内容

テーブル  テーブル名: 1mincycl  カラム数:  45



4.1分周期実行方法

 (1)概要

時間周期的にプログラム実行する場合は cron と言う デーモンを使用する。
crontab ファイルに1分ごとに実行するプログラムのコマンドを記述する。
* * * * * /usr/bin/python3 /home/hobbylab/www/scpt/Local1MinuteCycleProgram.py

hobbylab@raspberrypi:~ $ crontab -e

GNU nano 5.4            /tmp/crontab.fBBlyh/crontab
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command

* * * * * /usr/bin/python3 /home/hobbylab/www/scpt/Local1MinuteCycleProgram.py

^G
^X
Help
Exit
^O
^R
Write Out
Read File
^W
^\
Where Is
Replace
^K
^U
Cut
Paste
^T
^J
Execute
Justify
^C
^_
Location
Go To Line
M-U
M-E
Undo
Redo
記載後、コントロール+Oで書き込み、コントール+Xでエディタを終了する。




5.メインプログラムの概要

 (1)メインルーチン

プログラムはPythonを使用します。

 (2)サブルーチン一覧

関係サブルーチン名No概要
I/Oinit()(1-1)RaspberryPi I/Oの初期化
RxIo()(1-2)電源切替器の状態取得
MODBUSCrcGen()(2-1)MODBUS crc生成
class
 UART
__init__()(2-21)RaspberryPiのMODBUS接続用シリアル通信の初期化
mb_rx() (2-22)スレーブデータ取得
mb_rxrs()(2-23)Whリセット後のスレーブデータ取得処理
mb_tx() (2-24)マスターからの信号を送信
RBZ60A_rx()(2-31)充電器情報を取得
RBZ60A_reset_now()(2-32)充電器今日の電力量リセット
RBZ60A_reset_all()(2-33)充電器総合電力量リセット
PZEM017c_rx()(2-41)母線情報を取得
PZEM017i_rx()(2-42)インバータ入力情報を取得
PZEM_reset()(2-43)母線及びインバータ入力電力量リセット
AC301_rx()(2-51)負荷の電力情報を取得
AC301_reset()(2-52)負荷の電力量のリセット
MySQLdb_re()(3-11)1分毎DBの最新情報取得
db_in()(3-12)1分毎DBへ情報追加
db_up()(3-13)1分毎DBへ情報更新
db_de()(3-14)1分毎DBの情報削除
db_m_re()(3-21)10分毎DBの最新情報取得
db_m_in()(3-22)10分毎DBへ情報追加
db_m_up()(3-23)10分毎DBへ情報更新
db_m_de()(3-24)10分毎DBの情報削除
db_d_re()(3-31)1日毎DBの最新情報取得
db_d_in()(3-32)1日毎DBへ情報追加
db_d_up()(3-33)1日毎DBへ情報更新
db_d_de()(3-34)1日毎DBの情報削除
alldb_prs()(4)時間処理





6.サブルーチン内容

 (1)RaspberryPi I/O

RaspberryPi I/O関係のサブルーチンです。

 (1-1)init()


 (1-2)RxIo()


 (2)MODBUS

MODBUS関係のサブルーチンです。

 (2-1)CrcGen()


 (2-2)class UART:共通

class UART:共通関係のサブルーチンです。

 (2-21)__init__()

timeout=2は .read() 及び .readline()に入って2秒以上受信がなければその関数に値が無くても抜ける。

 (2-22)mb_rx()

最初の2byteはマスター信号のオウム返し、3番めがデータの長さを示している。

 (2-23)mb_rxrs()

リセット信号を受信したスレーブ信号は全てがマスターのオウム返しとなるため、mb_rx()が使用できないので、このサブルーチンを設けた。
また、AC301の後にPZEMをリセットした場合、タイムアウトする事が有ったので、この処理(ここではタイムアウトで 1 を返す事にした)を追加した。

 (2-24)mb_tx()


 (2-3)class UART:充電器

class UART:充電器関係のサブルーチンです。

 (2-31)RBZ60A_rx()


 (2-32)RBZ60A_reset_now()

リセットの動作は出来ない。※ただし自動的に1日1回リセットされる。

 (2-33)RBZ60A_reset_all()


 (2-4)class UART:測定器

class UART:測定器関係のサブルーチンです。

 (2-41)PZEM017c_rx()


 (2-42)PZEM017i_rx()


2回もタイムアウトが出れば、errfile.log に記録する。

 (2-43)PZEM_reset()


 (2-5)class UART:負荷電力計

class UART:負荷電力計関係のサブルーチンです。

 (2-51)AC301_rx()


 (2-52)AC301_reset()

AC301のリセットが出来ないため、ロックしてソフトで対応することにした。

 (3)MySQL

MySQL関係のサブルーチンです。

 (3-1)1分更新DB

1分更新DB関係のサブルーチンです。

 (3-11)db_re()


 (3-12)db_in()


 (3-13)db_up()


 (3-14)db_de()


 (3-2)10分更新DB

10分更新DB関係のサブルーチンです。

 (3-21)db_m_re()


 (3-22)db_m_in()


 (3-23)db_m_up()


 (3-24)db_m_de()


 (3-3)1日更新DB

1日更新DB関係のサブルーチンです。

 (3-31)db_d_re()


 (3-32)db_d_in()


 (3-33)db_d_up()


 (3-34)db_d_de()


 (4)db_prs()






































更新日 2025/11/25 19:30  管理者 平林 剛Hirabayashi Takeshi