那些關於我開發碳排放量計算系統的經驗談

2024/09/21 PyCon 2024

photo credit: PyCon TW

Slide

關於我

  • Peter, GitHub

  • 活躍的開源專案貢獻者

  • 也是一位講者

    • COSCUP、MOPCON......

  • 也是一位工程師

    • DevOps

    • 後端開發;PHP、Python與JavaScript

    • 軟體工程、系統架構設計與分析

    • 網頁應用程式安全

  • 財團法人工業技術研究院

    • 應用資通訊技術至研究智慧電網領域 (2017~2021)

  • 財團法人資訊工業策進會

    • 醫資、健康照護應用服務與碳排放等領域 (2021~迄今)

大綱

  • 什麼是碳排放量?碳排放量是怎麼來的?

  • 各類的製造業出口產品到歐洲遇到了什麼問題?

  • CBAM是什麼?為什麼歐盟想提出這個出來?

  • 淺談ISO-14064與ISO-14067;和CBAM的關係以及各個標準目前與未來發展的情況

  • 透過標準,碳排放量該如何進行計算與量化?

  • 碳排放量計算管理系統架構介紹

  • 應用案例#1~#3

  • 結論

什麼是碳排放量?碳排放量是怎麼來的?

  • 溫室效應

    • 溫室效應是指行星的大氣層因為吸收輻射能量,使得行星表面升溫的效應

  • 溫室氣體

    • 水蒸氣(H2O)、臭氧(O3)、二氧化碳(CO2)、氧化亞氮(N2O)、甲烷(CH4)、氫氟氯碳化物類(CFCs,HFCs,HCFCs)、全氟碳化物(PFCs)及六氟化硫(SF6)

  • 為了要量化碳排放,因此需要有公式進行二氧化碳當量之計算

    • ​使用特定溫室氣體質量乘以全球暖化潛勢計算而得

  • 全球暖化潛勢值(IPCC)

    • 是衡量溫室氣體對全球暖化影響的一種手段

    • 是將特定氣體和相同質量二氧化碳比較之下,造成全球暖化的相對能力。

  •  碳排放量如何計算? 

    • 例如:排放係數法,將能源使用量,乘上相對應的溫室氣體排放係數

製造業出口到歐洲遇到了什麼問題?

  • 歐盟國家在境內幾乎都沒有製造業

  • 大部分製造產品都是從歐盟以外國家進口

  • 歐盟國家努力推行減緩溫室效應,但發現會有「碳洩漏」的問題

    • 為了要解決上述的問題,歐盟進而推行CBAM;即歐盟碳邊境調整機制

photo credit: 高雄市政府環保局

CBAM是什麼?

  • Carbon Border Adjustment Mechanism

  • 歐盟碳邊境調整機制

    • 歐盟碳邊境調整機制是種環保關稅

    • 2023年5月17日生效,預備於2026年開始實施

      • 但相關進口者自2023年8月即須開始報告與註冊

    • 針對輸入歐盟的鋼鐵、水泥和某些電力等碳密集型產品予以徵收​

      • 附件一,將要徵收邊境碳稅的商品列出,包括水泥、電力、化學肥料(如硝酸、氨、鉀)、鋼鐵(包括罐、桶、貨櫃)、金屬製品和鋁等

      • 附件三列出計算生產過程中的隱含溫室氣體排放量的方法

淺談ISO-14064與ISO-14067;和CBAM的關係

  • ISO-14064-1:2018

    • 是一個國際標準,為目前最新版標準

      • 對應到中華民國國家標準,CNS 14064-1:2021

      • 要求組織進行溫室氣體清單的編制和審核,並進行溫室氣體排放的監測和報告

      • ​組織型盤查

      • 邊、源、算、報、查

photo credit: TUV

淺談ISO-14064與ISO-14067;和CBAM的關係

  • ISO 14067:2018

    • 是一個國際標準,為目前最新版標準

      • 包括產品的原材料獲取、製造、使用和處理等階段

        • 產品碳足跡盤查

        • 搖籃到墳墓

        • 搖籃到大門

photo credit: SGS

photo credit: 公視新聞網

淺談ISO-14064與ISO-14067;和CBAM的比較表

標準名稱 類型 目前最新版本
ISO-14064-1:2018 組織型 版本為2018最新
ISO-14067:2018 產品生命週期、產品碳足跡 版本為2018最新
CBAM 產品在生產過程中所產生之隱含碳排放量 為一種機制,非標準

透過標準,碳排放量該如何進行計算與量化?

  • ISO 14064-1:2018

    • ​直接監測法

      • ​直接監測排氣濃度和流率量測溫室氣體排放量,準確度高但少見

    • 質量平衡法

      • ​化學平衡法;質量守恆定律

      • 舉例化學式:C+O2→CO2

        • 燃燒1莫耳的碳會產生1莫耳之二氧化碳

        • 燃燒1公斤的碳產生44/12 = 3.67 kg之二氧化碳(排放係數)

    • 排放係數法

      • ​排放量 = 活動數據 * 排放係數 * GWP(全球排放潛勢)

透過標準,碳排放量該如何進行計算與量化?

  • ISO 14067:2018

    • ​同ISO 146064:2018標準提到的方法

    • 但是是以產品為主的方式進行相關方法的計算出產品生命週期碳排放量

  • CBAM

    • ​簡單產品
      • 產品製造過程需要使用的外部原料不含任何隱含排放;e.g. 黏土
      • 產品隱含碳排放量 = 生產過程排放 / 生產產品數量

    • 複雜產品
      • 非簡單產品,其餘都是複雜產品,e.g. 金屬製品

      • (生產過程排放 + 所使用原料之含量) / 生產產品數量

碳排放量計算管理系統架構介紹

碳排放量計算管理系統架構介紹

  • 在系統架構設計上,我們依照CBAM的要求

    • 發展出以「以產線追溯」為基礎的碳排放量系統

    • 將產品以製程為出發點,分成下列三類

      • ​產品製程所產生的碳排放量

        • 可由MES製造執行系統取得而來

      • 原料及其他碳排放量填入

        • ​可由ERP企業資源規劃系統取得材料清單而來

碳排放量計算管理系統架構介紹

碳排放量計算管理系統架構介紹-產品製程設定

碳排放量計算管理系統架構介紹-原料與其他碳排資訊填入

碳排放量計算管理系統架構介紹-產品碳排計算

碳排放量計算管理系統架構介紹-產品碳排計算

碳排放量計算管理系統架構介紹-產品碳排計算

碳排放量計算管理系統架構介紹-產品碳排計算

碳排放量計算管理系統架構介紹

  • 所使用到的技術如下所示

    • 前端

      • React.js框架與Reactstrap進行樣板設計

    • 後端

      • Python並搭配FastAPI框架

    • 資料庫

      • PostgreSQL儲存帳號、產品製程、碳排放係數等相關資訊

      • ClickHouse儲存時序特性的感測器所產生的感測資料

如何利用Python介接所需要的感測資料

  • 在不同的工廠因有不同的性質與情況

    • 進而發展出不同的方式進行所需要的感測資料進行收集

    • 以合作的不同的三家廠商為例

      • ​金屬製品產業,水龍頭製造廠商​

      • ​​金屬製品產業,手工具製造廠商

      • 紡織纖維廠,單絲纖維製造廠商

如何利用Python介接所需要的感測資料

  • ​金屬製品產業,水龍頭製造廠商​

    • 因與其他單位合作,合作的單位使用PLC進行感測器裝置資料收集

    • 透過佈置在工廠內的閘道器進行資料之收集,以OPC UA通訊協定進行

    • 收集的感測資料包含重力鑄造、機加工以及周遭設備之環境感測資料

      • ​例如,爐溫、電流、環境溫度、環境濕度與CO2濃度等

  • ​​金屬製品產業,手工具製造廠商

    • ​與工廠合作的資訊系統廠商合作,請資訊系統廠商將資料交換至資料庫

    • 收集資料以用電度數為主

  • 紡織纖維廠,單絲纖維製造廠商

    • 與工廠合作的資訊系統廠商合作,透過API將需要的感測資料從EMS取得

    • 或是以工廠內的閘道器進行溝通進行資料之收集,以Modbus通訊協定進行

    • 收集的資料以用電度數為主

如何利用Python介接所需要的感測資料

如何利用Python介接所需要的感測資料

  • OPC UA協定串接資料範例

import asyncio
import logging
from asyncua import Client, Node, ua


type_maps = {
    '0': 'Null', '1': 'Boolean', '2': 'SByte', '3': 'Byte', '4': 'Int16',
    '5': 'UInt16', '6': 'Int32', '7': 'UInt32', '8': 'Int64', '9': 'UInt64',
    '10': 'Float', '11': 'Double', '12': 'String', '13': 'DateTime', '14': 'Guid',
    '15': 'ByteString', '16': 'XmlElement', '17': 'NodeId', '18': 'ExpandedNodeId',
    '19': 'StatusCode', '20': 'QualifiedName', '21': 'LocalizedText',
    '22': 'ExtensionObject', '23': 'DataValue', '24': 'Variant', '25': 'DiagnosticInfo',
}


client = Client(url=url, timeout=timeout)
machine_str = ''
machine_str = 'node_id,display_name,value,data_type,source_timestamp,status_code\n'

async with client:
for node_str in node_maps:
	try:
    	node = client.get_node(node_str)
        data_value_obj = await node.read_data_value()
        var_type = (await node.read_data_type_as_variant_type()).value
        display_name = (await node.read_display_name()).Text
        re_pattern = re.compile(u'[^\u0000-\uD7FF\uE000-\uFFFF]', re.UNICODE)
        display_name = re_pattern.sub(u'\uFFFD', display_name)
        display_name = display_name.replace('\x00', '')

        node_id = node.nodeid.to_string()
        value = await node.read_value()
        data_type = type_maps[str(var_type)]
        source_timestamp = str(data_value_obj.SourceTimestamp)
        status_code = data_value_obj.StatusCode_.value
        csv_row = '%s,%s,%s,%s,%s,%s\n' % (
        	node_id,
            display_name,
            value,
            data_type,
            source_timestamp,
            status_code,
		)
        csv_row = csv_row.replace('\x00', '')
        machine_str += csv_row
	except Exception as e:
    	print(e)
        print('Reading the NodeId' + node_str + ' is failed.')

如何利用Python介接所需要的感測資料

  • Modbus TCP協定串接資料範例

from pyModbusTCP.client import ModbusClient
import time


SERVER_HOST = "192.168.35.53"
SERVER_PORT = 502

c = ModbusClient()

# uncomment this line to see debug message
#c.debug(True)

# define modbus server host, port
c.host(SERVER_HOST)
c.port(SERVER_PORT)

while True:
    # open or reconnect TCP to server
    if not c.is_open():
        if not c.open():
            print("unable to connect to " + SERVER_HOST + ":" + str(SERVER_PORT))

    # if open() is ok, read register (modbus function 0x03)
    if c.is_open():
        # read 10 registers at address 0, store result in regs list
        regs = c.read_holding_registers(0, 10)
        # if success display registers
        if regs:
            print("reg ad #0 to 9: " + str(regs))

    # sleep 2s before next polling
    time.sleep(2)

如何利用Python介接所需要的係數資料

  • 使用到的Python函式庫

    • requests與BeautifulSoup4

    • 使用pdftotext進行PDF檔案解析

  • 標的網站

    • 能源署,電力碳排放係數

    • IPCC溫室氣體潛勢值

    • 產品碳足跡資訊網

如何利用Python介接所需要的係數資料

如何利用Python介接所需要的係數資料

  • 標的網站

    • 能源署,電力碳排放係數PDF檔案內容

如何利用Python介接所需要的係數資料

如何利用Python介接所需要的係數資料

如何利用Python介接所需要的係數資料

如何利用Python介接所需要的係數資料

係數琳瑯滿目,懶得收集怎麼辦?

別擔心,開源專案已經準備好了
https://github.com/peter279k/gwp-factors

需要計算的係數已經有既有的資料集

gwp-factors專案之未來工作

讓專案的datasets目錄中的係數檔案自動化收集

質量平衡法不太會?

可參考https://github.com/bjodah/chempy協助化學平衡

應用案例甘苦談

理想很豐滿,現實很骨感

應用案例甘苦談1:導入水五金廠商A

  • 水龍頭母體,只關注重力鑄造與機加工關鍵製程

  • 資料收集與串接

    • 感測資料收集

    • 所需的ERP與MES資料收集

  • 產線追溯系統開發

應用案例甘苦談1:導入水五金廠商A

  • 資料收集與串接

    • 感測資料收集

    • 所需的ERP與MES資料收集

  • 產線追溯系統開發

應用案例甘苦談1:導入水五金廠商A

  • 感測資料收集

    • 因為裝置佈置是由另外合作單位A負責

      • 負責的單位對於網路概念也不是很熟...

        • 我人不在工廠內,卻要我連工廠端的192.168.1.222?

        • 兩台PLC之網路設定都一樣,但是一個可以通,一個不行?

    • 工廠廠區防火牆等網路設定是工廠既有的系統整合廠商負責

    • 這樣在接資料的時候,就需要進行三方溝通

應用案例甘苦談1:導入水五金廠商A

  • 資料收集與串接

    • 感測資料收集

    • 所需的ERP與MES資料收集

  • 產線追溯系統開發

應用案例甘苦談1:導入水五金廠商A

  • 所需的ERP與MES資料收集

    • 負責ERP與MES等系統是工廠既有委託的系統整合廠商

    • 在進行資料串接上有一定的難度

    • 工廠認為這些資料是機密,不想要提供與進行串接

    • 因此相關的資料都是以CSV或是EXCEL檔案進行提供

應用案例甘苦談1:導入水五金廠商A

  • 資料收集與串接

    • 感測資料收集

    • 所需的ERP與MES資料收集

  • 產線追溯系統開發

應用案例甘苦談1:導入水五金廠商A

  • 產線追溯系統開發

    • ​因應上述的議題,在自動化串接與收集上顯得綁手綁腳

    • 耗費心力在有關於感測資料串接上,甚至是需要跳下去幫忙實作

    • 在ERP與MES資料串接上,變成手動輸入與匯入檔案

    • 產品是購買雛形再進行製造加工,加上製程僅有2個關鍵製程

      • 導致在計算出的結果呈現上會與預期有所出入

應用案例甘苦談1:導入水五金廠商A

應用案例甘苦談1:導入水五金廠商A

  • 為何在傳輸感測資料時不使用MQTT等協定進行?

    • 現實面的考量

      • ​防火牆與網路設定的問題

      • PLC(OPC UA server)的設定議題

應用案例甘苦談2:導入手工具廠商B

  • 產品以鋼鍛造剝線鉗之製程為主

  • 資料收集與串接

    • 感測資料收集

    • 所需的ERP與MES資料收集

  • 產線追溯系統開發

應用案例甘苦談2:導入手工具廠商B

  • 資料收集與串接

    • 感測資料收集

    • 所需的ERP與MES資料收集

  • 產線追溯系統開發

  • 感測資料收集

    • ​雖然工廠有配合的資訊系統廠商配合布置各式機台感測裝置

    • 資訊系統廠商只以資料庫形式進行資料交換

    • 讓你的PostgreSQL吃不消,每次都有idle connection

      • 最後讓你的PostgreSQL server掛點

應用案例甘苦談2:導入手工具廠商B

  • 所需的ERP與MES資料收集

    • 負責ERP與MES等系統是工廠既有委託的系統整合廠商

    • 在進行資料串接上有一定的難度

    • 工廠認為這些資料是機密,不想要提供資料與進行串接

    • 最後相關的資料都是以CSV或是EXCEL檔案進行提供進行手動匯入

應用案例甘苦談2:導入手工具廠商B

應用案例甘苦談2:導入手工具廠商B

  • 資料收集與串接

    • 感測資料收集

    • 所需的ERP與MES資料收集

  • 產線追溯系統開發

  • 產線追溯系統開發

    • ​因應上述的議題,在自動化串接與收集上顯得綁手綁腳

    • 在前端畫面呈現上顯得有需多的要求,例如:Dashboard之感覺

    • 慶幸的是,提供的ERP與MES資料都是正確的

      • ​剛好該間手工具廠商是真的有銷往歐洲國家,未來會被列管

    • 因此在計算出的結果與實際外部稽核與手動驗算結果沒差多少

應用案例甘苦談2:導入手工具廠商B

應用案例甘苦談3:導入紡織纖維廠商C

  • 針對產品為魔鬼氈與PET管套用線為主

  • 資料收集與串接

    • 感測資料收集

    • 所需的ERP與MES資料收集

  • 產線追溯系統開發

應用案例甘苦談3:導入紡織纖維廠商C

  • 資料收集與串接

    • 感測資料收集

    • 所需的ERP與MES資料收集

  • 產線追溯系統開發

應用案例甘苦談3:導入紡織纖維廠商C

  • 感測資料收集

    • 收集感測資料透過能源管理系統所提供的API進行取得

    • ​但是協助工廠佈置裝置的資訊系統廠商所使用的能源管理系統是技轉來的

    • 能源管理系統之顧問窗口協助到一半就離職了.....

    • 留下詭異的收集感測資料行為

      • 感測資料是每分鐘的瞬時功率

      • ​感測資料會自動補值,機台沒有在動的時候,還有數值?

      • 計算電力度數之議題,把隔天的00:00算進去

應用案例甘苦談3:導入紡織纖維廠商C

  • 資料收集與串接

    • 感測資料收集

    • 所需的ERP與MES資料收集

  • 產線追溯系統開發

應用案例甘苦談3:導入紡織纖維廠商C

  • 所需的ERP與MES資料收集

    • 工廠在發現使用能源管理系統之後,才發現廠區每個月用電度數都偏高

    • 導入到工廠的能源管理系統功能有些還沒完備

      • 變成工廠希望看到的資訊能夠在我們系統內呈現

    • 至於ERP與MES資料,對工廠來說計算產線碳排不是當務之急

    • 因此這部分因應交付,還是以模擬的ERP與MES資料進行設計與匯入

應用案例甘苦談3:導入紡織纖維廠商C

  • 資料收集與串接

    • 感測資料收集

    • 所需的ERP與MES資料收集

  • 產線追溯系統開發

應用案例甘苦談3:導入紡織纖維廠商C

  • 產線追溯系統開發

    • ​因應上述的議題,在功能上只好加上能源管理系統缺少的功能

      • ​例如,某指定的機台裝置在某個時間區間下之用電度數與碳排

    • 最後就是把產線追溯碳排系統變成機台裝置碳排系統

應用案例甘苦談3:導入紡織纖維廠商C

應用案例甘苦談3:導入紡織纖維廠商C

結論

  • 一開始系統在情境與流程的設計上想得很美好

    • 不可抗力的因素比預期的多

    • 導致實際在執行上是發現不是這麼回事

    • 最後還是從自動化變成手動,有的甚至還要自己先模擬資料

  • 因為執行計畫緣故,合作單位與對象無法自行選擇

    • 要做好萬一合作對象不行的話,要有親自下去協助的準備

Next Big Thing: ESG報告書

  • 環境、社會和公司治理

    • 環境保護;Environment

    • 社會責任;Social

    • 公司治理;Governance

  • CSR 是「永續經營」的概念、ESG 是實踐CSR 原則

    • 企業社會責任,​Corporate Social Responsibility

  • 在ESG報告書中,有部分章節與ISO-14064等標準所產生的報告有關

延伸閱讀(1/4)

延伸閱讀(2/4)

延伸閱讀(3/4)

延伸閱讀(4/4)

Q&A

Thank you!