読者です 読者をやめる 読者になる 読者になる

suzukiyou blog

建築設計とかpythonとかその辺をとりあえずする

電気設備の計算をpythonでやる(2)-動力用変圧器容量の算定

電気設備計算withPython

動力用変圧器容量の算定

だいたい第一回電気設備の計算をpythonでやる(1)-電灯コンセント用変圧器容量の算定 - suzukiyou blogと流れが一緒です。

  1. 負荷を突っ込んで、出力kWから入力を換算して入力kVAを出す。
  2. 動力のタイプから需要率DFを出す。
  3. 入力と需要率から最大需要電力kVAを出す。
  4. 負荷を遮断器に突っ込んでいく。(動力盤に入ってる遮断器をイメージする)
  5. 更に遮断器を遮断器に突っ込んでいく。(動力盤の主遮断器とかのイメージ)
  6. トランス直近に遮断器があることにして、全部の負荷を突っ込む。
  7. 仮想的なトランス直近遮断器と将来需要電力を入れて、トランスを選定する。

前回との違いは、盤らしき変数を作らずに全部遮断器でやる、ということと、仮想的なトランス直近遮断器を作った事となります。
前者は「盤とかクラス増えてややしこいし、結局盤にも主遮断機あるんやろ」という考えによります。
後者に関してですが、実際の施工においてだいたいはトランス直近のキュービクル内に遮断器があって、そっから各盤まで配線を伸ばしているというふうになるのでこんな遮断器は普通存在しないなぁと思いながら作りました。しかし各負荷を足して最大需要電力を出すのを今後遮断器においてもやっていくだろうこと、トランスと遮断器の療法で同じような作業をするのが気に喰わないことなどからそうしました。

プログラミング上の工夫

前回の反省:
ちゃんとコメント書かなアカンなと思ってかいた。
出力もちゃんとしないとわかんねーなと思って書くことにした。

その他:
Mydictはどうせ今後も書くのでimportすることとし、また今回から、数値型の判定を関数化しました。
Re:数値型判定はどうしたらいいのだろう? - 銀月の符号
これの2番を使わせてもらいました。

コード

#sample150125.py
#coding:utf-8

from Mydict import Mydict
from is_numeric import is_numeric

class PowerLoad(Mydict):
  pass

def createPowerLoad(ElectricLoadType,LoadkW,LoadType,LoadSeason,translateinput=None,DF=None):
  #ElectricLoadTypeは"電動機or電熱器orインバータor多極電動機",
  #"電動機"の場合はその相も含む。で、ElectricLoadTypeList中から選ぶ
  #ElectricLoadTypeDictよりkWをkVAに換算するための掛率TranselateLoadConstを選ぶ。
  #LoadkWは負荷(kW)
  ElectricLoadTypeDict={"motor1phi":1.33,\
  "motor3phi":1.25,\
  "motorhighVoltage":1.176,\
  "heater":1.0,\
  "inverter":1.4,\
  "machine":None}
  assert ElectricLoadType in ElectricLoadTypeDict.keys()
  assert is_numeric(LoadkW)

  #LoadTypeは需要率DF決定のための機器種類でその中から選ぶ、汚水ポンプとかエアコンとか
  #LoadTypeDictは機器種類とその需要率DF(%)
  LoadTypeDict={"Heater":100,\
  "LiftingPump":30,\
  "SanitaryPump":30,\
  "PoolPump":100,\
  "HotWaterBoiler":30,\
  "HotWaterPump":30,\
  "SepticTank":30,\
  "SepticBlower":100,\
  "SpringWaterPump":0,\
  "VentilateFan":100,\
  "Refrigerator":80,\
  "Chiller":80,\
  "PACFan":100,\
  "AHU":100,\
  "PAC":80,\
  "RoomAirCon":85,\
  "CoolWaterCirculationPump":100,\
  "CoolingTower":100,\
  "SupplyPump":10,\
  "ElectricPrecipitator":50,\
  "Boiler":0,\
  "HotWaterCirculationPump":0,\
  "FirePump":0,\
  "Exhauster":0,\
  "Shutter":0,\
  "Elevator":80,\
  "Lift":40,\
  "Escalator":90,\
  "MultistoryParkingLift":60,\
  "machine":None}
  """
  LoadTypeDict={"Heater":100,\ #電気温水器とか
          "LiftingPump":30,\ #揚水ポンプ
  "SanitaryPump":30,\ #汚水雑排水ポンプ
  "PoolPump":100,\ #プール濾過用ポンプ
  "HotWaterBoiler":30,\ #給湯ボイラー
  "HotWaterPump":30,\ #給湯ポンプ
  "SepticTank":30,\ #浄化槽
  "SepticBlower":100,\ #浄化槽ブロア
  "SpringWaterPump":0,\ #湧水ポンプ
  "VentilateFan":100,\ #換気ファン
  "Refrigerator":80,\ #冷凍機
  "Chiller":80,\ #冷温水発生機
  "PACFan":100,\ #パッケージファン
  "AHU":100,\ #エアハンドリングユニット
  "PAC":80,\ #設備用・業務用・ビル用マルチエアコン
  "RoomAirCon":85,\ #ルームエアコン
  "CoolWaterCirculationPump":100,\ #冷水・冷温水循環ポンプ
  "CoolingTower":100,\ #冷却塔
  "SupplyPump":10,\ #補給水ポンプ
  "ElectricPrecipitator":50,\ #電気集じん機
  "Boiler":0,\ #ボイラー(空調用)
  "HotWaterCirculationPump":0,\ #温水循環ポンプ
  "FirePump":0,\ #消火ポンプ
  "Exhauster":0,\ #排煙ファン
  "Shutter":0,\ #シャッター
  "Elevator":80,\ #エレベーター
  "Lift":40,\ #小荷物専用昇降機
  "Escalator"90,\ #エスカレーター
  "MultistoryParkingLift":60,\ #立体駐車場機械
  "machine":None}#工作機械
  """
  assert LoadType in LoadTypeDict.keys()
  
  #負荷使用期間LoadSeasonは次のLoadSeasonListから選ぶ。
  LoadSeasonList=["summer","winter","annual"]
  assert LoadSeason in LoadSeason
  
  #PowerLoadインスタンスを生成して、これに入力を突っ込んで返す。
  #PowerLoadはMCCBLoadに突っ込んでいくので、とりあえず最大需要電力MaxDemandkVAがわかればよろしい。
  #kW→kVA換算を無効にして直接kVAを突っ込んでくるように拡張する可能性があるかも知んない。
  a=PowerLoad()
  a["ElectricLoadType"]=ElectricLoadType
  a["LoadkW"]=LoadkW
  #練習問題見てたらあった。引数としてtranslateinputがある場合はそれを優先する。
  if translateinput==None:
    a["TranslateLoadConst"]=ElectricLoadTypeDict[ElectricLoadType]
    assert a["TranslateLoadConst"] != None
  elif is_numeric(translateinput):
    a["TranslateLoadConst"]=translateinput
  else:
    raise  
  a["TranselateVA"]=LoadkW*a["TranslateLoadConst"]
  
  a["LoadType"]=LoadType
  a["LoadSeason"]=LoadSeason
  #引数としてDFが突っ込まれた時はDFを優先する。工作機械とか標準DFがないものもある。
  if DF==None:
    a["DF"]=LoadTypeDict[LoadType]
    assert a["DF"] != None
  elif is_numeric(DF):
    a["DF"]=DF
  else:
    raise
  a["MaxDemandkVA"]=a["TranselateVA"]*a["DF"]/100.0
  
  return a


class MCCBLoad(Mydict):
  pass
  
def createMCCBLoad(LoadList):
  #MCCBLoadインスタンスを生成する。
  #MCCBが受け持つLoadListをつくる。あくまでPowerLoadであってMCCBLoadではない。
  a=MCCBLoad()
  a["LoadList"]=[]
  a["SummerDemandVA"]=0.0
  a["WinterDemandVA"]=0.0
  
  #LoadListは負荷のリスト,もしくは負荷単体
  #LoadListあるいは要素がPowerLoadクラス、MCCBLoadクラスであることを確認する。
  #それぞれの場合で負荷をPowerLoadに帰着してPowerLoadcalに突っ込んで最大需要電力VAを計算する。
  #summer,winter両方で計算して大きい方をMCCBの使用期間、最大需要電力とする。
  if type(LoadList)==PowerLoad:
    PL=LoadList
    a=PowerLoadcal(a,PL)
  elif type(LoadList)==MCCBLoad:
    ML=LoadList
    for i in ML["LoadList"]:
      a=PowerLoadcal(a,i)
  elif type(LoadList)==list:
    for i in LoadList:
      if type(i)==PowerLoad:
        a=PowerLoadcal(a,i)
      elif type(i)==MCCBLoad:
        ML=i
        for j in ML["LoadList"]:
          a=PowerLoadcal(a,j)
  else:
    raise
  return a

def PowerLoadcal(MCCB,Load):
  #負荷使用期間リスト
  LoadSeasonList=["summer","annual","winter"]
  a=MCCB
  l=Load
  a["LoadList"].append(l)

  if not l["LoadSeason"] in LoadSeasonList:
    raise
  if l["LoadSeason"] in LoadSeasonList[0:2]:
    a["SummerDemandVA"]+=l["MaxDemandkVA"]
  if l["LoadSeason"] in LoadSeasonList[1:3]:
    a["WinterDemandVA"]+=l["MaxDemandkVA"]
  if a["SummerDemandVA"]>a["WinterDemandVA"]:
    a["MaxDemandkVA"]=a["SummerDemandVA"]
    a["LoadSeason"]=LoadSeasonList[0]
  elif a["SummerDemandVA"]==a["WinterDemandVA"]:
    a["MaxDemandkVA"]=a["WinterDemandVA"]
    a["LoadSeason"]=LoadSeasonList[1]
  elif a["SummerDemandVA"]<a["WinterDemandVA"]:
    a["MaxDemandkVA"]=a["WinterDemandVA"]
    a["LoadSeason"]=LoadSeasonList[2]
  else:
    raise
  return a  

class Transe(Mydict):
  pass
  
def createTranse(MCCB,futureLoad=0.0):
  #今回はとりあえずトランス直近に主幹のMCCBがあることにして突っ込む。
  #TranseSize選定のためのリスト
  TranseSizeList=[30,50,75,100,150,200,300]
  
  #Transeインスタンスを作って直近MCCBと将来用需要電力を突っ込む。
  a=Transe()
  a["MaxDemandkVA"]=MCCB["MaxDemandkVA"]
  a["FutureDemandkVA"]=futureLoad
  a["MaxDemandkVA"]+=futureLoad
  
  #TranseSizeを選定する
  a["TranseSize"]=None  
  for i in TranseSizeList:
    if a["MaxDemandkVA"]<i:
      a["TranseSize"]=i
      break
  assert a["TranseSize"]!=None
  return a    
if __name__=="__main__":
  #負荷リスト、遮断機リストをつくる
  LoadList=[]
  MCCBList=[]
  #負荷を突っ込む
  LoadList.append(createPowerLoad("motor3phi",7.5,"PAC","summer"))
  LoadList.append(createPowerLoad("motor3phi",2.2,"PACFan","annual"))
  LoadList.append(createPowerLoad("motor3phi",2.2,"CoolWaterCirculationPump","summer"))
  LoadList.append(createPowerLoad("motor3phi",1.5,"CoolingTower","summer"))
  LoadList.append(createPowerLoad("heater",2.0,"Boiler","winter"))
  LoadList.append(createPowerLoad("motor3phi",2.2,"HotWaterCirculationPump","winter"))
  LoadList.append(createPowerLoad("motor3phi",3.7,"FirePump","annual"))
  LoadList.append(createPowerLoad("motor3phi",7.4,"LiftingPump","annual"))
  LoadList.append(createPowerLoad("machine",9.5,"Elevator","annual",10.0/9.5))
  LoadList.append(createPowerLoad("machine",19.0,"machine","annual",1.25,40))
  #負荷を遮断機に突っ込む
  MCCBList.append(createMCCBLoad(LoadList[0]))
  MCCBList.append(createMCCBLoad(LoadList[1]))
  MCCBList.append(createMCCBLoad(LoadList[2]))
  MCCBList.append(createMCCBLoad(LoadList[3]))
  MCCBList.append(createMCCBLoad(LoadList[4]))
  MCCBList.append(createMCCBLoad(LoadList[5]))
  MCCBList.append(createMCCBLoad(LoadList[6]))
  MCCBList.append(createMCCBLoad(LoadList[7]))
  MCCBList.append(createMCCBLoad(LoadList[8]))
  MCCBList.append(createMCCBLoad(LoadList[9]))
  MCCBList.append(createMCCBLoad(MCCBList[0:4]))
  MCCBList.append(createMCCBLoad(MCCBList[4:6]))
  MCCBList.append(createMCCBLoad(MCCBList[6:7]))
  MCCBList.append(createMCCBLoad(MCCBList[7:8]))
  MCCBList.append(createMCCBLoad(MCCBList[8:9]))
  MCCBList.append(createMCCBLoad(MCCBList[9:10]))
  #MCCBList[16]はトランス直近にMCCBを仮想的に置いたものとして与える。
  MCCBList.append(createMCCBLoad(MCCBList[10:16]))
  #負荷すべてとトランス点での最大需要電力を表示する
  tMCB=MCCBList[16]
  count=0
  for i in tMCB["LoadList"]:
    print count,"\n",i["ElectricLoadType"],"kW",i["LoadkW"],"\n",\
    u"入力換算率",i["TranslateLoadConst"],u"入力",i["TranselateVA"],"\n",\
    u"DF",i["DF"],u"最大需要電力",i["MaxDemandkVA"],u" kW","\n"
    count+=1
  del count
  print u"トランス点最大需要電力",tMCB["MaxDemandkVA"]," kVA"
  #トランスを選定して出力する
  t=createTranse(tMCB,0.0)
  print u"トランスサイズ ",t["TranseSize"]," kVA"

出力

>ipython sample150125.py
0
motor3phi kW 7.5
入力換算率 1.25 入力 9.375
DF 80 最大需要電力 7.5  kW

1
motor3phi kW 2.2
入力換算率 1.25 入力 2.75
DF 100 最大需要電力 2.75  kW

2
motor3phi kW 2.2
入力換算率 1.25 入力 2.75
DF 100 最大需要電力 2.75  kW

3
motor3phi kW 1.5
入力換算率 1.25 入力 1.875
DF 100 最大需要電力 1.875  kW

4
heater kW 2.0
入力換算率 1.0 入力 2.0
DF 0 最大需要電力 0.0  kW

5
motor3phi kW 2.2
入力換算率 1.25 入力 2.75
DF 0 最大需要電力 0.0  kW

6
motor3phi kW 3.7
入力換算率 1.25 入力 4.625
DF 0 最大需要電力 0.0  kW

7
motor3phi kW 7.4
入力換算率 1.25 入力 9.25
DF 30 最大需要電力 2.775  kW

8
machine kW 9.5
入力換算率 1.05263157895 入力 10.0
DF 80 最大需要電力 8.0  kW

9
machine kW 19.0
入力換算率 1.25 入力 23.75
DF 40 最大需要電力 9.5  kW

トランス点最大需要電力 35.15  kVA
トランスサイズ 50  kVA