"Eco C-stem"의 두 판 사이의 차이

env wiki
이동: 둘러보기, 검색
(경제성)
(경제성)
278번째 줄: 278번째 줄:
 
[[파일:유연탄 사용으로 인한 지출 비용.jpg]]<br>
 
[[파일:유연탄 사용으로 인한 지출 비용.jpg]]<br>
 
따라서 총 비용을 정리한 결과는 다음의 표와 같다.<br>
 
따라서 총 비용을 정리한 결과는 다음의 표와 같다.<br>
[[파일:2050 총비용.jpg]]<br>
+
[[파일:2050 총비용.jpg]]<br><br>
  
 
*'''2) 편익'''<br>
 
*'''2) 편익'''<br>
284번째 줄: 284번째 줄:
 
(1)의 화석연료 지출 감소에 의한 이득은 2022년 유연탄 가격 349.57USD/ton, 유연탄 사용량 1,026 천 톤, 온실가스 배출량 2,504 천 톤을 기준으로 한다. 2022년 기준을 시작으로 2023년부터 2050년까지 전년도 대비 감축할 수 유연탄에 의한 비용 및 이득을 정리한다.<br>
 
(1)의 화석연료 지출 감소에 의한 이득은 2022년 유연탄 가격 349.57USD/ton, 유연탄 사용량 1,026 천 톤, 온실가스 배출량 2,504 천 톤을 기준으로 한다. 2022년 기준을 시작으로 2023년부터 2050년까지 전년도 대비 감축할 수 유연탄에 의한 비용 및 이득을 정리한다.<br>
 
[[파일:2050 유연탄 절감 비용 및 펴익.jpg]]<br>
 
[[파일:2050 유연탄 절감 비용 및 펴익.jpg]]<br>
(2)의 폐기물 처리 비용 수익은 폐기물 처리 업체에서 시멘트 업체 측으로 재활용이 불가능한 폐기물을 납품할 때 시멘트 업체가 받는 수수료이다. 이는 평균 40,000원/ton ~ 80,000원/ton에서 거래되고 있으며 이의 중간값인 60,000원/ton을 단가로 계산한다.<br>
+
(2)의 폐기물 처리 비용 수익은 폐기물 처리 업체에서 시멘트 업체 측으로 재활용이 불가능한 폐기물을 납품할 때 시멘트 업체가 받는 수수료이다. 이는 평균 40,000원/ton ~ 80,000원/ton에서 거래되고 있으며 이의 중간값인 60,000원/ton을 단가로 계산한다.<br>
 
(3)의 온실가스 감축 편익은 온실가스 배출권 할당 업체에 해당되는 쌍용 C&E의 배출권 할당량 및 온실가스 배출량을 토대로 하여 계산하므로, 앞선 3.2.2에서 고정연소 할당량에 의한 온실가스 잉여배출량 계산값을 토대로 단가를 곱한다. 정리한 결과는 다음과 같다.<br>
 
(3)의 온실가스 감축 편익은 온실가스 배출권 할당 업체에 해당되는 쌍용 C&E의 배출권 할당량 및 온실가스 배출량을 토대로 하여 계산하므로, 앞선 3.2.2에서 고정연소 할당량에 의한 온실가스 잉여배출량 계산값을 토대로 단가를 곱한다. 정리한 결과는 다음과 같다.<br>
 
[[파일:2050 온실가스 잉여배출량에 의한 판매수익.jpg]]<br>
 
[[파일:2050 온실가스 잉여배출량에 의한 판매수익.jpg]]<br>

2022년 12월 8일 (목) 04:33 판

프로젝트 개요

기술개발 과제

국문 : 시멘트 소성로 투입 폐기물 연료화 개선을 위한 Uniform Waste Maker 개발

영문 : Development of Uniform Waste Maker for Improvement of Waste Fuel for Cement Kiln

과제 팀명

Eco C-stem

지도교수

서명원 교수님

개발기간

2022년 9월 ~ 2022년 12월 (총 4개월)

구성원 소개

서울시립대학교 환경공학부 20**8900** 권**(팀장)

서울시립대학교 환경공학부 20**8900** 김**

서울시립대학교 환경공학부 20**8900** 유**

서론

개발 과제의 개요

개발 과제 요약

탄소배출과 폐기물 처리 문제 등으로 시멘트 업계에서는 순환자원으로 원료 및 연료를 일부 대체하고 있다. 하지만 우리나라의 대체연료 사용량은 2017년 기준 약 1,266톤으로, 2013년 사용량인 1,195 톤과 비교했을 때 크게 증가하지 않았다. 이는 전체 연료 사용량 대비 약 20% 가량의 비율로, 독일(65%) 등의 타 국가에 비하며 낮은 편이다(민태범 외, 2019). 따라서 국내 시멘트 업계의 대체연료 사용량을 늘릴 방안을 모색할 필요성이 있다. 순환자원은 유연탄에 비해 발열량과 염소함량의 편차가 큰 편이며, 이러한 요인들이 시멘트 제조공정의 불안정성을 불러올 수 있기 때문에 대체연료 사용량에 영향을 미치게 된다(최재원 외, 2021). 이에 따라 우리는 소성로에 투입되는 폐기물 연료의 품질수준 및 용량의 일관성을 위해 발열량과 염소함량에 대한 일정한 기준을 세워 이에 따라 폐기물을 분류, 투입하는 프로그램을 설계하고자 한다. 이를 통해 발열량과 염소 함량의 변동성을 일정 수준 이하로 유지함으로써 폐기물 연료의 약점을 보완하게 된다. 이는 결과적으로 시멘트 업계의 순환자원 사용량의 증가로 이어져 온실가스 감축과 폐기물 처리효과를 기대할 수 있다.

개발 과제의 배경

  • 1) 시멘트 산업의 탄소배출과 탄소중립
    시멘트 산업은 온실가스 배출량이 높은 업종에 속한다. 우리나라 2050 탄소중립 시나리오에 의하면 국내 산업 부문 중 업종별로 봤을 때, 철강(38.8%), 석유화학 및 정유(24.1%)에 이어 시멘트 산업은 온실가스 배출량 비중이 13.1%에 달하며 국내에서 세 번째로 많은 온실가스를 배출한다. 따라서 온실가스에 의한 지구 기온 상승을 막기 위해서는 시멘트 산업에서의 탄소배출량을 줄여야 할 필요성이 절실한 상황이다. 국내 시멘트 산업에서의 탄소중립은 온실가스의 발생원마다 해당되는 감축수단을 적용하고, 그러고 나서도 배출되는 부분에 대해서는 CCUS 기술을 적용함으로써 달성할 수 있다(이고은, 2022). 시멘트 산업의 이산화탄소 배출은 크게 직접배출, 간접배출, 공정배출로 나눌 수 있다. 직접배출은 연료의 사용에 의한 배출, 간접배출은 설비를 작동시키는 데 드는 전력 사용에 의한 것이고 공정배출은 시멘트의 원료인 석회석(CaCO3)의 탈탄산 과정에서 발생되는 이산화탄소를 말한다. 세 가지 배출경로 중에서 직접배출이 33.4%, 공정배출이 60.0% 정도로 차지하는 비중이 크므로 이와 관련해 연료 및 원료를 전환하는 것이 주요 감축수단에 해당한다(이고은, 2022). 이중 직접배출을 감축하는 주요 수단은 화석연료를 수소, 바이오매스 등의 신연료나 순환자원으로 전환하는 것이다. 시멘트산업은 탄소중립 목표로 2050년까지 유연탄 등의 고체 화석연료를 폐합성수지 60%, 바이오매스와 연동한 수소 열원 40%로 완전 대체할 것이라고 발표한 바 있다. 2019년 국내 시멘트산업의 직접배출 관련 에너지 소비 비중은 석탄류(56.2%)와 석유류(27.5%)가 전체의 80% 이상을 차지하고 있다(이고은, 2022). 따라서 탄소배출계수가 높은 석탄, 석유류의 연료를 탄소배출계수가 낮은 대체연료로 전환하여 탄소배출을 저감하고자 하는 것이다. 하지만 수소 열원의 경우 아직 연구단계가 초기에 머물러 있으므로, 적극적으로 연구개발을 진행할 시 2040년 이후에나 상용화가 가능할 것으로 예상된다. 따라서 우리는 순환자원 사용 확대에 초점을 맞추어 설계의 방향을 잡았다.


  • 2) 기존의 기술 제도상 문제
    폐타이어, 폐고무, 폐플라스틱 등의 순환자원은 많은 에너지를 포함하고 있어 대체연료로서 재활용이 가능하다. 하지만 이러한 순환자원들은 불순물의 성분에 따라 시멘트 제조공정과 품질에 영향을 줄 수 있다는 단점이 있다. 폐기물에 함유된 염소, 알칼리, 유황 등의 휘발성분은 킬른과 예열기 내에서 순환하며 농축되고, 이에 따라 녹는점이 낮은 화합물을 형성하여 킬른에 코팅으로 부착하게 된다(이승헌, 2001). 결과적으로 이러한 코팅은 킬른의 안정성을 떨어뜨려 시멘트 제조 공정의 불안정성을 높이게 된다. 특히 휘발성분 중에서도 예열기의 코팅 형성에 가장 큰 영향을 미치는 것은 염소농도의 변화이다(이승헌, 2001). 이를 해결하기 위해 시멘트 제조공장에서는 염소를 제거하기 위해 염소 바이패스 설비를 운영 중이다. 그런데 대체연료로 사용되는 폐기물은 한 종류만 사용되는 것이 아니라 폐타이어, 폐합성수지, 폐고무 등 다양한 종류가 사용되며, 이들 각각의 염소성분과 발열량 편차가 존재한다. 이러한 성분 편차 때문에 각 폐기물의 사용량에도 편차가 발생하게 되며, 이는 결과적으로 연료로 투입되는 폐기물의 총 염소함량 편차를 크게 만들어 염소 바이패스 설비의 효율에도 영향을 미치게 된다(최재원 외, 2021). 물론, 소성로에 투입되는 폐기물에는 법으로 정한 품질 기준이 존재한다. 폐기물관리법 시행규칙의 폐기물 재활용 기준에 따르면 폐기물을 시멘트 보조연료로 사용하는 것은 R-8-1 유형에 속한다. 폐기물을 해당 유형으로 재활용하려면 폐목재를 제외한 폐기물들은 저위발열량 4,500 kcal/kg 이상, 염소농도 2.0 wt.% 미만을 만족하여야 한다. 하지만 폐기물의 발열량과 염소함량은 법적 기준을 만족하는 범위 내에서도 상당한 편차를 보인다. 그럼에도 불구하고 실제 시멘트 제조 시에는 상기 법적 기준을 만족하는 것 외에, 추가로 변동성을 낮추기 위한 별도의 기준을 설정해 놓지 않은 상황이다.


  • 3) 개발 효과
    우리는 앞서 서술한 문제점을 해결하기 위해, 법적 기준과는 별도로 폐기물의 발열량과 염소함량에 대한 일정 기준을 세우고, 이 기준을 만족하도록 폐기물을 실시간으로 분류하고 혼합 투입하는 프로그램을 설계하고자 한다. 이때 새로이 설정하는 기준은 폐기물 관리법의 저위발열량 4,500 kcal/kg 이상, 염소농도 2.0 wt.%보다 강화된 것으로, 높은 발열량과 낮은 염소함량이라는 기준만으로도 시멘트 제조공정과 품질을 저해하지 않는 좋은 연료라는 지위를 얻을 수 있을 것이다. 또한, 염소함량 기준을 만족하도록 폐기물 비율을 실시간으로 계산하여 혼합 투입하므로 폐기물 연료 사용 시 발생하던 염소함량 변동성 문제를 해결하여 바이패스 설비로 염소를 제거할 때 그 제거 효율의 향상을 기대할 수 있다. 우리는 이와 같이 기존에 폐기물 연료의 한계점으로 고려되던 문제점들을 보완함으로써 순환자원 대체연료의 사용량이 증가하는 것을 기대한다. 그리고 이로써 국내 시멘트업계에서 발표한 2050 탄소중립의 목표를 달성하는 데 기여할 것을 기대한다.

관련 기술의 현황

시멘트산업에서의 순환자원 자원화 및 관련법규 히스토리

시멘트1-1.jpg
순환자원 재활용사업 경과(2021 쌍용C&E ESG보고서)

시멘트 업계는 다량의 탄소배출 특성을 가진 만큼 시멘트 사업을 지속하면서 환경에 미치는 영향을 최소화하기 위해 오랜 기간 다른 산업에서 발생한 부산물과 일반 폐기물들을 제조공정에 활용하는 기술 개발에 힘써왔다. 연료 분야에서는 1996년 폐타이어의 재활용이 정부 시범사업으로서 처음 시행되었고 그 이후로 폐합성수지, 재생연료유, 폐목재 등 다양한 순환자원의 사용이 개시되었으며 최근에는 2030 NDC(Nationally Determined Contributions) 달성과 2050 탄소중립 실현이라는 정부 목표에 맞춰 원료 및 연료 대체제로서 각종 산업부산물 및 생활폐기물과 같은 순환자원을 적극 활용하고 있다. 특히 간접적인 CO2 배출을 저감하는 중요한 기술 중 하나로 대체연료의 중요성이 더욱 부각되면서 순환연료 대체율이 해마다 가파르게 상승하고 있으며 2021년 쌍용C&E는 ESG 보고서에서 2030년에는 90% 연료 대체율을 달성하겠다는 목표를 밝혔다. 하지만 원료 및 연료의 대체제로 사용되는 폐기물은 NOx, 다이옥신과 같은 유해물질을 배출하거나 제조설비에 영향을 미치고 시멘트 품질까지 저하시킬 우려가 있다는 불안감을 가지고 있는 것이 사실이다. 폐타이어가 시멘트 열원으로 사용되기 시작한 이후부터 제정된 순환자원 관련법규는 순환자원 사용 확대에 맞추어 계속해서 추가 및 세분화되었으며, 2050 탄소중립 정책에 따라 순환연료의 사용량이 계속해서 증가한다면 환경기준 등 관련 법규가 다시 강화될 것으로 보인다. 실제로 지난 2022 국감 정책제안으로 소비자주권은 '폐기물 시멘트 환경기준 강화'를 촉구하고 나섰다. 순환자원의 대체연료 적용은 적용기술 뿐만 아니라 정부의 정책과 밀접한 관련이 있으므로 환경유해성에 대한 공감대 형성을 통해 순환자원을 안정적으로 사용할 수 있는 기반을 조성할 필요가 있다.
시멘트21.jpg

특허조사

① 가연성 고상 폐기물의 처리방법 (10-2000-0000140, 쌍용씨앤이 주식회사)
시멘트36.jpg

시멘트37.jpg
상기 특허는 폐합성고무, 폐합성수지, 폐합성섬유, 폐지 및 폐목재로 이루어진 군으로부터 적어도 둘 이상 선택된 가연성 고상 폐기물을 발열량 3000 kcal/kg 이상, 염소함량 2000 ppm 이하를 만족하도록 혼합, 파쇄하여 시멘트 소성용 보조연료로 사용하는 처리방법에 관한 것이다. 해당 특허에서는 그림 1과 같은 성분 및 연소특성을 갖는 각종 가연성 고형 폐기물을 각각 그림 2에 나타난 성분비율 및 조건을 만족하도록 하여 시멘트를 제조할 때의 보조연료로 사용하여 처리하였다. 이는 우리 설계 아이디어와 부분적으로 유사한 점이었으며, 우리는 이 특허에서 추가로 참고할 만한 점을 찾았다. 해당 특허에서는 소성로 투입 폐기물의 비율을 결정할 때 임의로 두 종의 폐기물을 선정해 적절한 비율을 미리 결정하였다. 두 종의 폐기물을 임의로 선정한다는 점에서 착안하여, 우리 설계에서도 소성로 투입 폐기물 비율을 계산할 때 모든 폐기물을 비율 계산에 반영하지 않고 몇 종의 폐기물만 뽑아서 계산에 이용하는 것으로 구체화하였다.


② 연속공정용 대용량 데이터를 실시간으로 처리하기 위한 스마트팩토리 플랫폼 (10-2016-0112865, 주식회사 포스코아이씨티)

시멘트38.jpg

연속공정 생산방식의 경우 데이터 수집 주기가 짧고 데이터의 양이 많아 각 데이터 간의 관계를 분석하기 어렵다. 상기 특허는 연속공정에서 발생하는 데이터를 분석 및 가공하여 각 공정별로 발생한 데이터들의 상관관계에 기초하여 연계 처리가 가능하도록 하는 것을 목적으로 한다. 우리는 이 특허를 참고하여 전처리되어 들어온 폐기물들을 소성로에 투입하기 전, 폐기물의 품질 데이터를 분석, 가공하여 소성로 투입 비율을 결정하는 부분에 적용할 수 있을 것이라 기대한다.

특허전략

기존 특허 ‘가연성 고상 폐기물의 처리방법’에서는, 혼합 비율을 구할 페기물들의 종류과 그 조합이 이미 정해져 있었다. 또한 혼합은 두 가지의 폐기물만으로 이루어졌으며, 그 비율 또한 사전에 정해진 것이었다. 여기에는 폐고무류, 폐타이어류, 폐합성수지류 등 각 폐기물류마다 초기에 조사한 발열량, 염소함량 값이 항상 동일하다는 가정이 포함되어야 한다. 하지만 우리가 쌍용C&E 동해공장의 순환자원 공개정보를 확인한 결과, 같은 폐기물류에 속한다고 해도, 업체에 따라 반입되는 폐기물의 발열량, 염소함량 값에 상당한 차이가 존재했다. 따라서 초기에 미리 구한 혼합 비율은 폐기물의 실제 성분 값을 제대로 반영하지 못한다고 볼 수 있다.

반면에 우리 설계에서는 세 종류의 폐기물을 섞어 혼합 비율을 구하며, 이때 비율 계산에 사용되는 폐기물들은 미리 정하는 것이 아니라 실시간으로, 임의로 선택된다. 선택되는 폐기물들은 9개의 저장소에 보관된 혼합폐기물들이며, 시멘트 공장으로 실시간으로 반입되는 새로운 폐기물들에 의해 각 저장소의 혼합폐기물들의 발열량과 염소함량 대푯값 또한 실시간으로 조금씩 변화한다. 즉, 현장에서 반입되는 폐기물들의 실제 발열량, 염소함량 등이 비율 계산에 확실히 반영된다. 실시간으로 변하는 혼합폐기물의 성분을 반영한다는 점 때문에, 이 혼합폐기물들을 골라 구하는 혼합 비율 또한 실시간으로 계산하여 구하게 된다. 정리하자면, 기존 특허와 구분되는 우리 설계만의 차별점은 바로 실시간으로 현장에 반입되는 다양한 실제 폐기물의 성분 값을 반영한다는 것과, 이에 따라 혼합 비율 또한 실시간으로 계산된다는 점이다. 시멘트5.jpg

관련 시장에 대한 분석

기존 방식 조사 및 비교

현재 우리가 고안한 소성로에 폐기물 연료를 투입하는 방식은 이에 관련된 기술 시장이 없기 때문에 기존 방식에 대한 비교 분석이 필요하다. 발열량 4500kcal/kg이상, 염소함량 2%이하의 법적 기준 외에 업체 측에서는 안정적인 사용을 위해 폐기물의 이물질 제거를 진행하고 있다. 폐기물의 투입은 폐합성수지, 폐타이어, 폐합성고무의 반입 성상 및 가공 방식에 따라 다르다. 연료로 사용되는 다음 세 종류의 폐기물의 반입 형태는 다음과 같다.
시멘트22.jpg
폐합성수지는 약 50mm로 분쇄되어 단독 투입된다. 이때 폐합성수지는 연질류와 경질류가 구분되지 않은 혼합 형태로 반입되고 사용된다. 폐타이어와 폐합성고무는 원형 또는 약 150mm로 파쇄된 chip 형태로 반입된다. Chip 형태의 폐타이어와 폐합성고무는 서로 혼합하여 별도로 투입된다. 폐합성고무는 전량을 chip으로 가공하지만 폐타이어는 일부를 chip으로 가공하여 폐타이어 원형 그대로의 폐기물 연료는 소성로에 단독으로 투입한다. 따라서 기존은 폐합성수지, 폐타이어, 폐합성고무를 전부 혼합하여 소성로에 투입하지 않는다. 이는 비교적 발열량과 염소함량 분포가 일정한 폐타이어, 폐합성고무와 달리 폐합성수지는 그 편차가 크기 때문에 단독으로 투입하고 있다. 폐기물 연료의 보관은 옥내에 전용 저장고를 구축하여 폐기물을 저장하고 있다. 작은 chip형태 또는 분쇄된 형태의 폐기물 연료들은 비산되어 주변에 오염을 일으킬 위험성이 있기 때문이다. 따라서 기존에 진행되고 있는 방식을 토대로 정리하면, 폐합성수지는 단독적으로 보관 및 투입되고 있으며 폐타이어와 폐합성고무 chip은 혼합되어 보관되고 폐합성수지와 별도로 투입된다. 가공하지 않은 원형은 폐타이어 또한 소성로에 단독 투입하는 방식으로 진행되고 있다.

마케팅 전략

시멘트23.jpg

강점: 연료의 발열량을 일정하게 유지할 수 있도록 폐기물을 공급해 대체연료 사용의 문제점을 줄인다. 대체연료의 연소로 인해 발생하는 폐기물의 오염물질 농도 편차를 줄여 처리가 쉽도록 한다. 수집한 폐기물 성분 데이터를 통해 주입해야 하는 공기비까지 계산해 기존의 폐기물 불완전한 파괴 문제도 해결해 오염물질 발생과 에너지 손실을 줄일 수 있다. 실시간 폐기물 데이터를 이용한 자동 투입비율 결정으로 공정을 자율화, 효율화 한다.

약점 & 위협: 현재 가동중인 시멘트 공장들은 대기오염물질 저감장치 설비를 제대로 갖추고 있지 않은데 저감장치와 새로운 제조공정까지 도입한다면 매우 큰 비용이 소요될 것이며 시멘트 가격도 상승할 것이다. 이로 인해 시멘트 업계에서 경제적으로 따져봤을 때 당장은 이득이라고 판단하기 어려울 수 있다. 시멘트 업계는 아무래도 이윤을 우선하기 때문에 환경문제까지 아울러 주기를 기대하기 어렵다. 환경면에서는 원료/연료 대체를 통해 자원 수입비용을 줄이고 쓰레기 매립지, 처리 문제 해결에 상당히 기여한다는 데에 그치고 있는 실정이다. 기술 도입을 위해서는 국가적인 지원과 인센티브 정책을 마련할 필요가 있다.

기회: 2050 탄소중립 계획으로 국내 시멘트 산업에서는 대체연료를 60%까지 대체하겠다고 발표했지만, 현재 연료의 23%까지 대체 확대되는 동안 많은 문제점들이 제기되었다. 따라서 새로이 개발한 공정을 도입하면 언급된 여러 문제들을 해결할 수 있고, 안전하게 연료 대체율을 증대하여 탄소중립 계획의 실현 가능성을 높일 디딤돌이 될 것이다. 또한 현재 IoT, AI 등의 기술을 통한 스마트팩토리 도입이 왕성하게 이루어지고 있는데 이를 우리 프로그램에도 적용한다면 한층 더 유기적이고 통합적인 제품 생산을 조성할 수 있을 것으로 기대된다.

시멘트24.jpg

개발과제의 기대효과

기술적 기대효과

Uni waste maker 공정은 공정에 투입되는 폐기물의 성분 데이터를 수집한다. 그 후 투입되는 연료의 발열량이 소성로의 온도를 1500도씨 이상으로 올릴 수 있도록 하면서 염소 농도의 편차는 일정치 이하가 되도록 계산하여 자동 투입한다. 또한 연료의 성분 데이터로부터 필요한 산소량을 계산해 자동 주입한다. 이를 통해 대체 연료 사용으로 인한 발열량 편차 문제를 해결하고, 시멘트 품질을 저하시키고 제조 설비의 막힘, 부식 문제를 일으키는 염소를 수월하게 제거할 수 있으며 폐기물의 불완전한 파괴로 인한 대기오염물질 발생 문제, 에너지 손실 문제를 함께 해결할 수 있다. 또한 소성로의 온도, 배가스의 오염물질 농도 등과 같은 공정의 데이터도 실시간으로 수집하여 계산한다.

경제적 및 사회적 파급효과

우선 Uni는 폐기물 데이터를 체계적으로 보관, 관리하고 연료 투입 비율을 자동 결정할 수 있는 플랫폼이므로 Uni의 적용 가정으로 인해 증가하는 비용은 기계 설비 추가 설치비, 추가 운영비용이며, 기대할 수 있는 공정 효과로는 다음과 같다.

시멘트24.jpg

① 킬른 공정에 미치는 영향 감소는 적절한 Cl이 포함된 순환자원 투입, 적정량 투입으로 킬른 운전성 저해 요소 삭제를 통해 이룰 수 있으며 이는 킬른 운영 및 유지 보수비용 감소 효과, 생산성 증가 이득효과를 가져온다. ② 클링커 품질에 미치는 영향 감소는 균일 연소특성, 정량투입, 폐기물 연소로 킬른 내 전열형태 변화 감소한다. 클링커링 반응 저해 감소로 품질적 이득을 가져온다. ③ 대표적인 시멘트 생산 업체인 쌍용C&E는 2015년에 온실가스 배출권 할당 업체로 지정되었다. 이는 이산화탄소를 배출하는 업체로서 할당된 배출권 이상 온실가스를 배출할 경우 배출권을 구입해야 한다. 따라서 이산화탄소 배출 감소를 통해 온실가스 배출권 구입 비용 감소 혹은 배출권 판매 비용의 이득을 기대할 수 있다.

시멘트25.jpg

④ 위의 표는 쌍용 C&E의 2019년, 2020년, 2021년 순환자원 연료 사용 비율이다. 우리의 목표로 2050년까지 uni를 적용하여 대체연료 사용량 60%까지의 증가로 한다면 유연탄 대신 폐기물중간처리업체로부터 폐기물 연료를 수거하는 면에서 비용적 이득을 얻을 수 있다. ⑤ 대체연료 사용 증가로 폐기물 소각 및 매립지 감소로 인한 경제적 이득 또한 기대할 수 있다.

구성원 및 추진체계

권규영 개발 과제 제안, 개념설계안 제시 및 상세설계 과정 기획, Uni 코드 개발, 결과 및 평가항목 작성
김신희 순환자원 및 관련법규 조사, 개발과제 제안, 마케팅 전략 기획, Uni 코드 개발
유지원 데이터 분석 및 정리, 관련 특허 조사, 폐기물 분류기준 및 소성로 투입기준 관련 조사 및 계산 수행

설계

설계사양

요구사항은 크게 제품 요구사항과 기초 요구사항으로 나누었다. 제품 요구사항에는 제품이 필요로 하는 요구사항을 정리하였고, 기초 요구사항에는 제품을 사용하는 데 있어 제품 외적으로 필요한 배경과 기반이 되는 요구사항을 정리하였다.

시멘트26.jpg

먼저 제품 요구사항으로는 폐기물 데이터베이스 확보, 폐기물의 적절한 분류, 데이터 처리 능력이 있다. 폐기물처리업체에서 시멘트 공장으로 폐기물이 반입될 때에는 업체와 시멘트 공장 측에서 각각 고형연료 품질 조사항목에 따라 중금속과 발열량, 염소함량을 조사하여 소성로 대체연료의 법적 기준에 부합하는 것만 계약하여 들여온다. 우리 설계에서는 이 검사항목들 중 발열량과 염소함량 값을 뽑아 사용하기 때문에, 입력된 값들 중 우리가 필요로 하는 발열량과 염소함량 값만 자동으로 추출하여 uni에 필요한 데이터베이스를 확보하는 것이 필요하다. 이러한 데이터베이스는 uni 프로그램 설계에 있어 필수적인 부분이며, 따라서 중요도를 ‘상’으로 결정하였다. 또한, 폐기물 데이터로 폐기물의 적절한 분류 기준을 세우는 것은 uni가 작동하는 기본 원리를 설정하는 것이므로 마찬가지로 중요도 ‘상’에 해당한다. 데이터 처리능력은 위의 분류기준을 근거로 삼아 소성로로 투입되는 폐기물들의 비율과 양을 계산하는 것으로, uni의 핵심 기능이기 때문에 마찬가지로 중요도를 ‘상’으로 분류하였다.

기초 요구사항으로는 폐기물 혼합, 폐기물의 분류를 위한 공간 확보, 합리적 비용의 세 가지가 있다. 폐기물 혼합은 분류기준에 따라 같은 범주로 묶인 폐기물들을 혼합하여 균일하게 하는 과정을 말한다. 이 과정을 거침으로써 한 범주로 묶인 여러 폐기물을 혼합하여 만들어진 혼합폐기물의 품질 기준항목 대푯값을 결정할 수 있게 된다. 이 또한 설계에 필요한 부분이지만, 처음 분류기준을 세울 때부터 발열량과 염소함량이 비슷한 값들끼리 모일 수 있도록 하기 때문에 같은 범주 내의 폐기물들이 100% 완벽히 혼합되지 않아도 혼합폐기물의 발열량과 염소함량 대푯값을 정하는 데에는 큰 문제가 없을 것이라 판단해 중요도 ‘중’으로 결정하였다. 폐기물의 분류를 위한 공간 확보는 폐기물 보관장소의 확보를 말한다. 기존에 폐기물들을 성분 함량에 따라 세부적으로 구분하지 않고 폐타이어, 폐합성수지류, 폐고무류와 같이 큰 분류로 묶어 보관했다면, 우리는 염소와 발열량을 세분화하여 따로 보관하기 때문에 다종의 폐기물을 구분하여 보관할 방법과 장소가 필요하다. 이는 uni가 계산한 비율대로 소성로에 폐기물을 투입할 때 반드시 전제되어야 하는 사항이기 때문에 중요도를 ‘상’으로 판단하였다. 마지막으로, uni를 설계하고 실제 작동시키기까지는 앞서 언급한 폐기물 혼합 문제와 보관장소 확보, 기타 등의 문제로 관련 설비나 부지 등에 투자해야 하는 경우가 발생하게 된다. 우리는 이러한 투자비와 설계 결과로 얻게 되는 경제적 이익, 장기적으로 바라봤을 때 얻을 수 있는 효과 등을 모두 고려하여 시멘트 공장의 수익성을 해치지 않고 합리적인 수준의 비용을 지출해야 한다.

D와 W의 분류 기준은 설계가 진행됨에 있어서 반드시 필요할 요소인지에 따라 구분했다. 1, 2, 3, 4, 5번의 경우는 이 요구사항이 존재해야 제품 설계 및 공정 구성이 가능한다. 반면에 6번 같은 경우는 설계 진행 후 적용사항에 따라 생각할 수 있는 문제이므로 D가 아닌 W로 적용하였다.

폐기물 데이터 베이스 확보

데이터 베이스의 확보를 위해서 순환자원 납품업체로부터 데이터를 제공받는다. 우리 설계의 모델로 삼은 쌍용 C&E에서는 현재 모든 순환자원 도입 계약 전에 시료분석 및 현장테스트를 실시하고 있으며 계약 체결 후 반입과 사용 단계에서도 시료분석을 통해 품질을 지속적으로 모니터링 하고 있다. 따라서 폐기물 성분 분석 데이터의 확보는 어렵지 않을 것으로 보인다. 우리 설계에서는 쌍용C&E에서 제공하는 순환자원 정보공개 데이터를 이용할 것이며 필요에 따라 이 데이터를 바탕으로 가상의 데이터도 제작할 수 있다.

아래 사진와 같이 여러 정보가 함께 들어있는 데이터 중에서 우리 설계에 필요한 반입량, 염소함량, 발열량과 같은 항목만 추출하여 새로운 데이터 베이스를 생성한다.
시멘트6.jpg

데이터 처리 능력

폐기물 데이터를 기본으로 하여 적절한 분류를 통해 최종적으로 기준에 따라 데이터를 처리하고 소성로에 보내는 것이 목적이다. 따라서 데이터 처리 능력은 제품의 중요한 요구사항 중 하나이며 이를 위한 설계사양은 컴퓨터 언어를 이용한 명령 체계와 입력값 설정, 기준에 따른 적절한 조건문 설정을 통해 원하는 결과값을 얻고 실행할 수 있을 것이다.

우선 우리 설계에서는 프로그래밍에 python 언어를 사용한다. 폐기물 데이터가 엑셀파일로 들어오면 이를 프로그램과 연동하여 데이터 저장 후 설정한 조건에 따라 데이터 반복 처리를 실행한다. 각 폐기물 데이터가 들어오면 전역 영역 처리 부분에서 소스코드 전반에 작용할 내용을 적는다. 즉, 변수들이 주로 들어가고 변수는 변하는 값을 담을 그릇을 설정하는데 이것이 폐기물 정보들이다.

목적계통도

a. 소성로의 설비, 유지보수비를 절감할 것
b. 염소투입량이 균일할 것
c. 발열량이 균일할 것
d. 화석연료를 대체할 순환자원연료를 늘릴 것
e. 염소 바이패스 설비에서 염소 제거 효율을 높일 것
f. 투입 공정 자동화로 공정 효율을 높일 것
g. 오염물질 배출을 최소화 할 것
h. 일정한 공기비를 만들 것
i. 이산화탄소 저감을 할 것
j. 시멘트 공장의 수익성을 해치지 않을 것
k. 요구 성능을 만족할 것
l. 시멘트 품질을 저하시키지 않을 것

위에서 나열한 설계목적 리스트를 토대로 하여 만든 목적계통도는 다음과 같다.
시멘트40.jpg

개념설계안

  • 1) 기존과 차이점이 있는 기준을 세운다

우리 설계에서는 기존에는 없던 두 가지 기준을 세워 폐기물을 분류, 소성로에 투입한다. 현행 방식에서는 폐기물의 재활용 유형 R-8-1에 따른 소성로 투입 폐기물에 대한 기준(발열량 4,500 kcal/kg 이상, 염소함량 2.0 wt.% 이하)을 만족시키는 것 외에 별도의 투입 기준이 따로 정해져 있지 않다. 우리는 법으로 정해진 최소한의 기준에서 더 나아가, 좀 더 세분화된 기준을 세움으로써 각 폐기물들의 성분 편차를 고려하고 변동성을 낮춘다.
대체연료로 사용되는 폐기물의 발열량과 염소함량 변동성을 낮추기 위해 설정하는 것이 바로 소성로 투입 폐기물의 기준(기준 2)이다. 현행법상에서 이미 소성로 투입 폐기물의 기준(폐기물 재활용 유형 R-8-1)을 정해 놓기는 하였지만 대체연료로 사용되는 폐기물들은 단일 종류가 아니며, 폐합성고무나 폐합성수지 등 여러 종류가 사용되고 있다. 또한, 폐기물 분류가 다른 경우에 폐기물 특성이 다른 것은 당연하지만, 같은 분류 내에서도 발열량과 염소함량에 상당한 편차가 존재하는 것을 실제 쌍용C&E 동해공장의 순환자원 사용자료를 통해 확인하였다. 특히 반입량과 반입 업체가 많은 폐합성수지의 경우 이러한 점이 도드라졌다. 따라서 우리 설계에서는 법적 기준을 만족하는 범위 내에서 새로운 소성로 투입 기준을 설정하여, 이를 만족하도록 폐기물을 혼합하여 소각하도록 한다.
위에서 설명한대로 우리 설계에서는 소성로 투입 기준을 새로 설정하고, 이를 만족하도록 폐기물 혼합 비율을 계산하여 혼합한다. 이때 폐기물 혼합 비율은 혼합하기로 한 폐기물들의 발열량과 염소함량, 질량을 고려하여 계산한다. 그런데 폐기물 업체마다 시멘트 공장에 반입하는 폐기물들은 모두 다른 발열량과 염소함량을 가지며, 반입량 또한 업체마다 상이하다. 22년 상반기 기준, 쌍용C&E 동해공장에 대체연료 폐기물을 반입하는 업체는 97 곳에 달한다. 우리는 소성로 투입 비율과 양을 계산하려고 약 100개에 달하는 반입 업체마다 폐기물들을 따로 보관하는 것은 매우 비효율적이며, 현실적으로도 불가능하다고 판단하였다. 따라서 비슷한 발열량과 염소함량을 가지는 폐기물들을 분류하여 저장하는 데 사용할 기준(기준1)을 새로 설정하였다. 이 기준에 따라 수십 업체에서 각각 반입되는 폐기물들을 성분이 비슷한 것끼리 분류하며, 분류된 것들은 혼합하여 저장한다. 즉, 공장으로 반입되는 폐기물들을 기준 1에 따라 9개로 분류하기로 하고, 이에 따라 9종의 혼합폐기물이 만들어진다. 그러면 기준 2를 만족하고자 소성로 투입 비율을 계산할 때는 이러한 9종 혼합폐기물의 발열량과 염소함량만 고려하면 된다.

  • 2) 분류한 장소에서 3개 보관함을 뽑는다

기준 2를 만족하기 위해 소성로에 투입할 폐기물들의 혼합 비율을 구하기 이전에, 우선 9곳의 저장소 중 어느 곳의 폐기물들을 투입할지가 먼저 고려되어야 한다. 우리는 소성로에 연료를 한 번 투입할 때마다 저장소 9곳에서 각각 조금씩 꺼내 쓰는 것은 비효율적이라고 판단하였다. 따라서 소성로에 투입할 혼합폐기물을 선택할 때, 저장소 몇 곳을 선택할지 그 수를 미리 정하기로 결정하였다.
소성로 투입 기준인 기준 2는 투입 폐기물의 발열량, 염소함량, 투입질량을 정한 것이다. 우리는 여기에서 착안해, 소성로에 투입할 폐기물을 저장소 3곳에서 선택하기로 결정하였다. 혼합 비율을 계산할 때에는 기준 2의 발열량, 염소함량, 투입질량에 따라 3개의 식이 세워진다. 그런데 저장소를 4곳 이상 선택할 경우, 미지수가 4개 발생하는데 반해 식은 3개밖에 존재하지 않으므로 3차 연립방정식의 해를 구할 수 없게 된다. 따라서 만들어지는 식의 개수에 맞춰 3곳의 저장소를 선택하도록 하는 것이 적절하다고 판단하였다.
아래는 해당 개념설계안의 이해를 돕기 위한 예시이다. 예를 들어 기준 2의 발열량, 염소함량, 투입질량이 각각 5500 kcal/kg, 0.8 %, 1000 ton 이라고 가정한다. 그리고 임의로 선택한 3곳 저장소의 발열량과 염소함량 데이터는 다음 표와 같이 가정한다. 이때 우리가 구해야 하는 연립방정식의 해에 해당하는 각 저장소 별 투입 질량은 각각 a, b, c 라고 설정하였다.

시멘트27.jpg
예시로 든 이 정보들을 적용하여 아래와 같이 혼합 비율 계산식을 세웠다.
(6200×a/(a+b+c))+(5800×b/(a+b+c))+(4900×c/(a+b+c))=5500 kcal⁄kg
(0.3×a/(a+b+c))+(5800×b/(a+b+c))+(4900×c/(a+b+c))=1.0 %
a+b+c=1000 ton

이와 같이, 저장소 3곳을 선정할 경우 미지수 3개에 더하여 발열량, 염소함량, 투입질량에 대한 식 3개가 세워진다. 저장소 4곳을 선택할 경우, 네 번째 저장소에 대한 미지수 d가 새로 생성되는데 반해 식은 그대로 3개만 만들어지므로 해를 구할 수 없게 된다.

  • 3) 실시간으로 계산한다

시멘트 소성공정은 연속공정이기 때문에 우리 설계에 따르면 소성로 투입 폐기물의 혼합 비율을 계속해서 구해야 한다. 그리고 이 혼합 비율은 앞서 설명한 바와 같이 9곳의 저장소에서 3곳을 선택한 후, 선택된 각 저장소 내 혼합폐기물의 발열량, 염소함량, 보관량 데이터를 고려해 계산된다. 그런데 시멘트 공장으로 반입되는 폐기물들은 실시간으로 들어오며, 따라서 각 저장소의 혼합폐기물 데이터도 실시간으로 변화한다. 따라서 우리 설계에 포함된 모든 계산은 실시간으로 이루어질 수밖에 없으며, 우리의 설계 작품인 Uni 프로그램은 이러한 실시간 계산이 가능하도록 구현할 계획이다.

  • 4) 종합 개념도

시멘트41.jpg
앞선 세 가지 개념설계안을 모두 반영한 우리의 설계 개념도는 위와 같다. 시멘트 공장으로 폐기물이 반입될 때마다 반입된 폐기물에 대한 발열량, 염소함량 등의 성분분석 결과와 질량에 대한 정보가 업데이트 된다. 이러한 각 폐기물 업체별 순환자원 정보를 Uni가 분류기준, 즉 기준1에 따라 9개로 나눈 저장고에 보관한다. 각 저장고로 분류된 폐기물들은 균일 혼합을 가정하며, 생성된 각 저장고별 혼합 폐기물의 발열량과 염소함량 대푯값을 Uni가 새로운 데이터로 산출한다. 이러한 분류와 혼합 및 계산 과정은 폐기물이 반입될 때마다 실시간으로 이루어진다. 생성된 혼합폐기물의 발열량, 염소함량, 보관량에 대한 데이터는 이후 기준2에 따라 소성로에 순환자원을 투입할 때 그 투입량과 비율을 결정하는 데에 사용된다. 이 과정에서 Uni는 총 9개의 저장소 중 랜덤으로 3개를 선정한 후, 선정된 폐기물로 기준2를 만족할 수 있도록 각 투입량을 계산한다. 해당 계산과정 또한 실시간으로 이루어져 저장소에 보관된 혼합 폐기물의 정보를 항상 파악할 수 있도록 한다.

상세설계안

기준1

분류기준, 즉 기준 1을 세우는 데에는 ‘자원의 절약과 재활용 촉진에 관한 법률’ 제25조의5제7항에서 환경부령으로 정한 품질등급 구분기준 [별표 7의2]를 참고하였다. 고형연료제품(SRF) 품질평가항목으로는 (저위)발열량, 수은, 염소, 황분의 4가지 항목이 있으며, 아래 표는 그중 발열량과 염소함량의 등급 판정기준을 가져온 것이다.
시멘트28.jpg
‘자원의 절약과 재활용촉진에 관한 법률’ 제25조의2제1항 별표7에 따르면 일반 고형연료제품(SRF)는 제조 고형연료제품의 저위발열량 3,500 kcal/kg 이상, 염소 2.0 wt% 이하를 만족해야 한다. 하지만 ‘폐기물관리법 시행규칙’ 제14조의3제1항의 [별표 5의3]의 폐기물 재활용 기준에 따르면 폐기물을 시멘트 보조연료로 사용하는 것은 ‘에너지를 직접 회수하거나 회수할 수 있는 상태로 만드는 유형’ 중 R-8-1 유형에 속한다. 이에 따르면 시멘트 소성로에서 보조연료로 재활용하는 폐기물은 폐목재를 제외하면 저위발열량 4,500 kcal/kg 이상, 염소농도 2.0 wt% 미만을 만족하여야 한다. 따라서 우리 설계에서는 발열량 기준을 아래와 같이 설정하였다.
시멘트29.jpg
위와 같이 발열량에 따라 폐기물들을 A, B, C 세 개 등급으로 분류한 후, 각 등급에 해당하는 폐기물의 양과 염소함량 편차를 고려하여 염소함량 기준을 나누어 적용한다.
염소함량은 2018년부터 2022년 상반기까지의 쌍용C&E 동해공장의 순환자원 공개자료를 분석하여 각 범위마다 비슷한 양의 폐기물이 분류되도록 기준을 정하였다. 그 결과, 염소함량 0.3 %와 0.7 %를 경계로 기준을 세우게 되었다.
시멘트30.jpg

기준2

  • 1) 소성로 투입 발열량 기준

소성로에 투입하는 총 연료는 소성로의 가스온도 2,000˚C 및 원료온도 1,450 ˚C를 만족할 수 있도록 발열량과 투입량을 고려해야 한다. 시멘트 클링커 1kg을 생산하는 데 투입해야 하는 열량을 구한 뒤 여기에 클링커 생산량을 곱하면 클링커 생산에 투입해야 하는 총 열량을 구할 수 있다. 이 총 열량 중에서 폐기물 연료가 차지하는 열량, 즉 순환자원 대체열량을 구하고 순환자원 투입량으로 나누어 구한 평균 발열량을 투입 발열량 기준으로 정하기로 하였다.

클링커 생산에 투입하는 열량(kcal)=클링커 1kg 생산 당 필요 열량(kcal⁄(kg))×클링커 생산량(ton)
클링커 생산에 투입하는 열량(kcal)=화석연료 열량(kcal)+순환자원 대체열량(kcal)
순환자원 대체열량(kcal)= ∑▒〖(업체 반입량 (ton))×(업체 발열량 (kcal⁄(kg)))〗
순환자원 대체열량(kcal)=순환자원 평균 발열량(기준)(kcal⁄(kg))×순환자원 투입량(ton)

먼저 계산을 위해 포틀랜드 시멘트 클링커 생성반응의 열분해 수지 표를 참고하였다. 아래의 표는 포틀랜드 시멘트 1kg를 생산하는 데 필요한 이론적 열량을 계산한 것이다. 하지만 이론이 아닌 실제 시멘트 제조과정에서는 배출가스의 열손실과 킬른에서의 방열 등을 고려해야 하기 때문에 이론값 420 kcal/kg·clinker 보다 높은 값을 가진다. 성신양회 홈페이지에 공개된 정보에 따르면 클링커 1톤을 제조하는 데는 약 80만 kcal에 이르는 열량이 필요하다. 또한, ‘몰리브덴 선광광미를 이용한 포틀랜드 시멘트 제조방법 및 이를 통해 제조된 포틀랜드 시멘트’ 특허에 의하면, 현재의 NSP 킬른의 경우 열원단위를 약 700 kcal/kg·clinker 정도까지 낮추고 있다. 우리는 이 값들을 고려하여 포틀랜드 시멘트 클링커 1kg 생산에 드는 열량이 750 kcal/kg·clinker라고 가정하였으며, 여기에서 이론적 열량 420 kcal/kg·clinker을 빼어 열손실량 등을 330 kcal/kg·clinker로 계산하였다.

클링커 1kg 생산당 열손실량(kcal⁄(kg∙clinker))=실제 열량-이론적 열량=750(kcal⁄(kg∙clinker))-420(kcal⁄(kg∙clinker))=330 (kcal⁄(kg∙clinker))

시멘트42.jpg
앞의 열손실량 계산 과정에서 언급한 ‘클링커 1kg 생산에 드는 열량’은, 정확히는 클링커 생산 전 과정의 열량을 뜻하는 것으로, 소성과정 이후 클링커를 냉각시키는 등의 과정이 포함되어 있다. 하지만 우리는 소성과정에서 연료 소각으로 얻는 열량을 알고자 하므로 위의 표에서 ‘발열’에 해당하는 열량은 고려하지 않는다. 표에서 흡열 반응에 필요한 총 열량은 1,030 kcal/kg·clinker이다. 여기에 앞서 열손실량으로 계산한 330 kcal/kg·clinker를 더하여 클링커 1kg 생산에 투입되는 열량 1,360 kcal/kg·clinker을 계산하였다.

클링커 1kg 생산에 투입되는 열량(kcal⁄(kg∙clinker))=1030(kcal⁄(kg∙clinker))+330(kcal⁄(kg∙clinker))=1360(kcal⁄(kg∙clinker))

이후 클링커 생산량과 전체 필요 열량은 모두 1달을 기준으로 계산하였다. 2021년 시멘트 협회에서 발표한 시멘트산업 통계에 따르면 쌍용C&E 동해공장의 21년 1월 클링커 생산량은 796,102 ton이다. 여기에 클링커 1kg 생산에 필요한 열량 1,360 kcal/kg·clinker을 곱하여 21년 1월 클링커 생산에 투입한 총 열량을 구한다.

21년 1월 클링커 생산에 투입한 열량 (kcal)=1360 kcal⁄kg·clinker×(1000 kg)/(1 ton)×796,102 ton clinker=1,082,698,720,000 kcal

총 열량 계산에 21년 1월 자료를 사용하였으므로 순환자원 대체열량을 계산할 때에도 21년 1월 자료를 사용하는 것이 옳다. 하지만 21년의 순환자원 사용 정보는 공개된 것이 없어 부득이하게 22년 상반기 쌍용C&E 동해공장 순환자원 공개자료를 계산에 사용하였다. 해당 자료에서 각 업체별 1월의 순환자원 반입량을 각 업체별 발열량으로 곱한 것의 총 합을 구하여 22년 1월의 순환자원 대체열량을 구하였다.

22년 1월순환자원 대체열량(kcal)= ∑▒〖(업체 반입량 (ton))×(업체 발열량 (kcal⁄(kg))=357,787,249,000 kcal〗

동일 년도의 자료를 사용한 것이 아니므로 이렇게 구한 열량을 기준 설정에 사용해도 될지 검토하기 위해 21년 쌍용C&E ESG 경영 보고서를 참고하였다. 해당 보고서에서는 21년의 순환자원 열량대체율이 38.8 %라고 공개하였다. 우리가 계산한 1월의 열량대체율은 33.0 %이며, 같은 방식으로 2월부터 6월까지도 계산한 후, 상반기의 평균 열량대체율을 구했더니 34.9 %라는 값을 얻을 수 있었다. 따라서 공개된 21년의 열량대체율 38.8 %와 큰 차이가 나지 않다고 판단하여 이대로 계산을 진행하기로 결정하였다.
시멘트31.jpg
소성로 투입 발열량 기준은 순환자원의 평균 발열량 값을 사용하였다. 앞서 구한 22년 1월의 순환자원 대체열량을 22년 1월의 총 폐기물 반입량 70,541 ton으로 나누어 1월의 순환자원 평균 발열량 5072.0 kcal/kg을 구하였다.

22년 1월 순환자원 평균 발열량(기준)(kcal⁄(kg))=(순환자원 대체열량(kcal))/(순환자원 투입량(ton) )=(357,787,249,000 kcal)/(70541 ton)=5072.0 kcal/kg

같은 방식으로 2월부터 6월까지도 계산한 후, 상반기의 순환자원 평균 발열량을 구한 결과는 5062.3 kcal/kg이다. 따라서 계산의 편의성과 오차를 고려하여 5,000 kcal/kg을 소성로 투입 발열량 기준으로 정하였다.
시멘트32.jpg

소프트웨어 설계

우선 소프트웨어 설계에 앞서, 실제 시멘트 공장의 운영방식에 대한 정보 수집의 어려움으로 인해 앞서 언급한 것과 같이 몇 가지 임의로 가정한 사항들이 있으며 본 설계는 이를 바탕으로 진행되었음을 알린다. 또한 편의를 위해 폐기물 반입, 연료 투입 주기 등은 일정하게 설정했다. 클링커 생산량으로부터 구한 하루 투입 연료의 질량은 2332 ton가량이지만 시각적 편의를 위해 2,400 ton으로 가정해 연료 투입 주기와 더불어 1시간 당 100 ton씩 투입된다고 가정했다. 그리고 사용한 만큼의 폐기물이 다시 들어와야 하므로 하루에 2,400 ton이 반입된다고 가정했으며, 시멘트 공장에서 사용하는 순환자원의 반입 주기가 실제로는 일정하지 않지만 계산상의 편의를 위해 1시간마다 한 업체에서 100 ton씩 반입된다고 가정했다. 설계에 사용된 폐기물 연료 정보는 2022년 상반기 쌍용 C&E 동해공장 순환자원 정보를 바탕으로 재구성되었다.
시멘트43.jpg
시멘트44.jpg
프로그램 설계에는 python 언어를 사용했다. “동해공장 저장소 A1.xlsx”부터 “동해공장 저장소 C3.xlsx”까지의 파일에는 임의의 업체들로부터 반입된 폐기물 정보들의 한 달치 목록이 저장되어 있다. pandas 모듈을 사용해 이들을 읽은 뒤, openpyxl 모듈을 사용해 각각의 저장소 데이터 마다 총 저장량, 평균 발열량, 평균 염소함량을 계산한 데이터만 입력된 “혼합 A1.xlsx”부터 “혼합 C3.xlsx”까지의 파일을 새로 생성하여 저장한다. 이때 각 저장소에 보관중인 폐기물은 완전히 균일하게 혼합되어 계산상의 평균값이 실제 값을 충분히 대표할 수 있다고 가정한다.
24시간동안 폐기물 연료의 투입량이 어떻게 계산되는지 시연하기 위해 24번의 반복문을 작성했다. 이를 위해 임의의 24개의 반입 폐기물 데이터를 실제 폐기물 정보를 바탕으로 생성했다. 각각의 반입 데이터는 pandas 모듈을 통해 읽히고, 발열량과 염소함량 기준(2.3.1 참고)에 따라 A1~C3 저장소에 지정되어 기존 저장소 데이터를 업데이트하게 된다. 예를 들어, 반입 데이터 X가 발열량 6,100kcal/kg, 염소함량 1.1%일 경우 A1 저장소로 지정되어 분류된 뒤 혼합될 것이고, A1 저장소의 “혼합 A1.xlsx” 파일은 반입 데이터 X까지 포함한 저장량, 평균 발열량, 평균 염소함량으로 업데이트된다.
시멘트45.jpg
그 다음은 폐기물을 꺼낼 세 가지 저장소의 선정이다. 모든 폐기물이 골고루 사용되도록 하기 위해 저장소의 선정은 random 모듈을 사용해 랜덤으로 진행되지만, 실제 순환자원 데이터를 우리가 설정한 A1~C3의 기준으로 나눠 보았을 때, A2, B2, C2 저장소에 보관된 폐기물의 양이 항상 많으므로 A2, B2, C3 저장소 중 한 가지는 꼭 선택되도록 하며, 발열량의 조절이 용이하도록 A, B, C가 꼭 하나씩 선택되는 동시에 염소함량의 조절 또한 용이하도록 1, 2, 3도 꼭 하나씩 선택되도록 프로그래밍 했다.
시멘트47.jpg
그 후 선정된 저장소의 데이터를 읽어 각각의 저장량, 평균 발열량, 평균 염소함량을 변수로 지정하고 numpy 모듈을 사용해 연립방정식의 해를 계산한다. 이 해가 각각의 저장소에서 추출해 소성로로 투입해야 할 연료의 질량에 해당한다. 이는 result라는 이름의 리스트로 지정되는데, 질량은 음수가 될 수 없으므로 각각의 항이 모두 양수가 나오지 않으면 저장소의 선정부터 다시 진행되도록 반복시킨다. 모두 양수가 나왔을 경우 아래와 같이 결과가 도출된다.
시멘트46.jpg
리스트 result의 모든 항이 양수일 경우 폐기물이 정상적으로 사용되었음을 의미하므로, 저장소 데이터 중 저장량은 사용된 질량만큼 감한 값으로 업데이트되도록 하며, 이에 따라 평균 발열량과 평균 염소함량도 수정된 값으로 업데이트된다. 이와 같은 프로그램을 적용함으로써 균일한 품질의 대체연료를 연속적으로 공급할 수 있다.

결과 및 평가

완료 작품의 소개

프로토타입 사진

다음의 사진은 프로그램 실행 후 각 저장고의 발열량, 염소함량, 반입량 값이 계속해서 업데이트 되는 정도와 선정된 저장고의 종류, 저장고에서 소성로에 투입되는 양을 프로그램이 계산하여 나타낸 것이다.

프로토타입결과산출예시.jpg

데이터프레임으로 정리된A1부터 C3저장소의 데이터 값은 24번의 반복마다 변화량 값이 적용되어 df_cal_cl_avg_data.xlsx 파일로 저장된다. 따라서 변화량을 실시간으로 파일로 확인할 수 있으며, 그 예시는 다음과 같다.

저장소엑셀데이터예시.jpg

포스터

시멘트18.jpg

평가

평가는 다음의 다섯 가지 항목을 통해 진행한다. 그 내용과 실행 여부는 다음과 같다.
평가항목 및 내용.jpg
A: 기대 수준을 만족했고, 결점 혹은 약점이 없음.
B: 기대 수준을 만족했고, 결점이 있으나 추후 보완 가능
C: 기대 수준의 일부만을 만족했음

실현가능성

첫 번째로 평가할 항목은 이 기술이 실현 가능한가이다. 우리의 설계에서 가장 중요한 가정은 폐기물의 혼합 및 폐기물 데이터의 신뢰성이었다. 반입되는 폐기물 데이터를 기반으로 분류 및 저장 후 소성로 투입을 위해 일정한 발열량과 염소함량, 투입량을 계산하는 프로그램을 실현했지만 이것이 실제로 업체에 적용 가능성에서 중요한 부분은 혼합의 문제에 있다. 폐기물 데이터는 반입되는 폐합성수지의 경우 공급업체별로 시료 확보 및 데이터 분석을 주간으로 시행한다.

혼합 방식은 기존에는 폐합성수지 저장고 중 천정크레인이 설치된 곳에서는 반입시 혼합하여 투입하고, 크레인이 없는 곳은 투입시 로더 장비로 혼합하여 투입한다. 하루에 투입하는 폐합성수지의 양이 2000ton/day를 넘기 때문에 모든 시료를 혼합하는 혼합설비 운영은 어렵지만, 이를 9등분하여 저장고를 마련하여 각 크레인을 이용하여 혼합한다면 전부를 혼합해야 하는 기존 방식과는 달리 설치 비용은 더 들지만 혼합 문제를 어느정도 해결할 수 있다. 또한 원래 고안했던 방식인 계산한 데이터를 즉시 크레인과 연동하여 구현하는 목적은 달성하지 못했다는 결점이 있지만 이는 추후 프로그램과 기계를 연동하는 시스템을 구축하면 달성할 수 있기에 추후 보완 가능하다는 평가를 내렸다.

환경성

환경성은 최종적인 유연탄 사용 감소 예측을 통한 온실가스 배출권 할당량에 대한 추정으로 평가를 진행했다. 시멘트 제조 공정에 있어서 온실가스의 주된 배출은 직접 배출과 간접 배출로 나눌 수 있다. 직접 배출원은 공정 배출, 고정 및 이동 연소가 있으며 간접 배출원인은 전력 사용과 같다. 고정연소는 소성로와 보일러와 같은 고정된 장비에서 연료 연소에 의해서 배출되며, 공정배출은 소성로에서 제품 제조 시 석회석의 탈탄산 과정에 의한 이산화탄소의 배출이다. 이동 연소는 물건을 운송하는 차량과 같은 수송 장비에서 연료 연소에 의해 배출되는 것이다. 그 비율은 다음과 같다.

효율성

효율성은 uni 프로그램을 의용하여 폐기물을 균일하게 투입했을 때 클링커 제조 공정에서 처리속도 및 생산된 제품의 품질 향상에 대한 것이다. 처리속도는 반입되는 데이터를 토대로 Uni 프로그램이 즉시 분류하고 계산하므로 빠르지만, 염소 처리를 위한 바이패스의 효율은 기존과 달리 일정하게 염소 함량을 투입하므로 처리에 있어서 안정성을 기대할 수 있지만, 이에 대한 실제 실험이나 데이터를 얻을 수가 없었기 때문에 이론상 기대가 가능한 부분으로 미흡 평가를 내렸다.

독창성

기존에 유사하게 소성로에 투입하는 폐기물 연료 개선을 위해 투입 폐기물의 종류과 조합 비율을 산정한 방식이 존재한다. 이는 앞선 1.2.3에서 기존 특허 방식과의 차이점을 나타냈듯이 기존 방식은 고정된 두 가지 종류의 폐기물을 고정될 비율로 혼합하여 투입한다. 그러나 우리는 이 방식과 달리 고정된 값, 종류, 데이터를 기본으로 하는 것이 아닌 실시간으로 반입이 될 때의 데이터까지 포함하여 특정한 폐기물만을 조합하여 투입하는 방식에 있어서 차이점이 있다. 또한 기존은 일정 기준치 이하만 만족하도록 투입하는 시스템이었다면 이 방식은 특정 기준치를 만족하도록 계산하고 투입치를 산출한다는 점에서 독창성이 있다.

경제성

경제성평가는 장기적으로 봤을 때 드는 비용과 편익을 산정하여 계산한다. 편익 분석을 위한 기본적인 가정 및 비용 계산에 드는 인자 값은 다음과 같다. 2050년까지의 탄소 감축 목표를 최종으로 하여 2023년부터 2030년, 2040년, 2050년의 비용과 편익을 산정했고 2030년부터 2050년까지 연속적으로 책정하지 않은 이유는 업체측의 2030년 순환자원 대체율 목표와 2050년 목표가 동일했기 때문이다. 이러한 과정에 필요한 가정은 다음과 같다.

가정1) 클링커 생산량은 동일하다.
가정2) 폐기물 연료의 사용량은 증가하지만 그 비율은 동일하다.
가정3) 고정 연소에서 화석연료는 유연탄(연료탄)만 사용한다.
가정4) 물가상승률은 동일하다.

  • 1) 비용

2050 비용 항목 및 단가.jpg
(1)의 저장고 설치 비용 및 부지 매매 비용은 최종 목표인 2050년의 2,240,000 ton의 순환자원 연료 보관을 목표로 한다. 폐기물관리법상 반입된 폐기물은 10일 이내에 사용하는 것이 원칙이므로, 추가 여유분을 설정하여 15일치의 폐기물 사용을 적용했을 때 저장고는 2,240,000/(365*15) = 92,054 ton의 혼합폐기물 연료를 수용한다. 방치폐기물 처리이행보증 업무처리지침에서 소각목적 혼합폐기물의 비중은 0.6 ton/m3이므로 고용노동부의 건설공사 표준 단가(철근콘크리트 저장고)를 참고로 하여 높이 15m의 저장고를 지을 시 필요한 설치 비용 및 부지 매매 비용을 계산했다. 허난 크레인사의 오버헤드 오렌지 필 크레인의 9대 설치 비용과 전력비 또한 책정했다.
(4)의 오염물질 배출에 의한 기본부과금은 대기환경보전법 시행령 제23조 제1항에 따라 황산화물, 먼지, 그리고 질소산화물에 대해서 부과한다. 쌍용C&E의 2020년도 지속가능보고서에 따르면 시멘트 소성로는 클링커의 주원료인 석회석 분말에 의해 황산화물이 자연적으로 제거되는 것을 인정받았기 때문에 한국환경공단에서 실시하고 있는 굴뚝자동측정기기의 측정항목 중 먼지와 질소산화물에 대해서만 기본부과금을 계산한다. 따라서 한국환경공단에서 제공하는 굴뚝자동측정기기의 측정결과를 조회하여 쌍용C&E의 동해공장의 연간 질소산화물과 먼지 배출량 자료를 토대로 대기환경보전법 제35조 제4항에 의한 기본부과금(기본부과금=배출 허용 기준 이하로 배출하는 오염물질배출량*오염물질1kg당 부과금액*연도별 부과금 산정지수*지역별 부과계수*농도별 부과계수)을 책정했다.
(5)는 소성로에 투입되는 유연탄의 사용 비용을 계산한다. 이를 위한 유연탄 가격은 KOMIS 한국자원정보서비스를 참고로 하며 과거 1987년부터 2030년까지의 유연탄 가격 예측은 다음과 같다.
유연탄 가격 예측.jpg
주목해야 할 점은 2022년의 러시아-우크라이나 전쟁으로 인해 유연탄의 가격이 폭등했기에 2050년까지의 예측을 위한 추세선은 비교적 가격이 안정된 2025년부터 2030년까지의 가격을 토대로 했다. 3.2.2에서 구한 2025년, 2030년, 2050년의 유연탄 사용량을 토대로 하여 2023년부터 2040년까지의 사용량 또한 계산했으며 이를 바탕으로 현재 시점의 환율을 적용한 유연탄 사용 비용 총합은 다음과 같다.
유연탄 사용으로 인한 지출 비용.jpg
따라서 총 비용을 정리한 결과는 다음의 표와 같다.
2050 총비용.jpg

  • 2) 편익

2050 편익 항목 및 단가.jpg
(1)의 화석연료 지출 감소에 의한 이득은 2022년 유연탄 가격 349.57USD/ton, 유연탄 사용량 1,026 천 톤, 온실가스 배출량 2,504 천 톤을 기준으로 한다. 2022년 기준을 시작으로 2023년부터 2050년까지 전년도 대비 감축할 수 유연탄에 의한 비용 및 이득을 정리한다.
2050 유연탄 절감 비용 및 펴익.jpg
(2)의 폐기물 처리 비용 수익은 폐기물 처리 업체에서 시멘트 업체 측으로 재활용이 불가능한 폐기물을 납품할 때 시멘트 업체가 받는 수수료이다. 이는 평균 40,000원/ton ~ 80,000원/ton에서 거래되고 있으며 이의 중간값인 60,000원/ton을 단가로 계산한다.
(3)의 온실가스 감축 편익은 온실가스 배출권 할당 업체에 해당되는 쌍용 C&E의 배출권 할당량 및 온실가스 배출량을 토대로 하여 계산하므로, 앞선 3.2.2에서 고정연소 할당량에 의한 온실가스 잉여배출량 계산값을 토대로 단가를 곱한다. 정리한 결과는 다음과 같다.
2050 온실가스 잉여배출량에 의한 판매수익.jpg
따라서 2050년까지의 절감할 수 있는 유연탄의 양으로 인한 절감 이득, 폐기물 연료 사용 ton당 업체측에서 받을 수 있는 수수료 이득, 온실가스 배출 감소로 인한 할당량에서의 수익을 정리한 결과는 다음과 같다.
2050까지의 총 편익.jpg
따라서 B/C = 1.25로 2050년까지 경제적 이득을 가져올 수 있을 것으로 기대한다.

향후평가

현재 우리가 고안한 폐기물 균일 혼합 및 소성로 투입 시스템은 반입되는 이론상 균일한 발열량과 염소함량의 폐기물을 소성로에 투입한다. 또한 이에 대한 계산은 실시간으로 이루어지며 계산을 통한 투입은 자동으로 이루어진다. 이에 대해서 고려해야 할 점은 균일한 발열량과 염소함량의 투입으로 인한 실제 공정에 미치는 영향과 이득에 대한 실험과 연구이다. 실제 산업 현장을 대상으로 설계를 진행하면서 데이터 접근이 어려웠고 이를 실제로 적용했을 때 나타날 수 있는 결과에 대한 간략한 실험 또한 진행할 수 없었다. 또한 프로그램이 계산한 결과를 즉시 크레인이 소성로에 투입하는 방식으로 실시간 데이터 수집을 통해 기계에 적용하는 IoT 방식을 바탕으로 진행했지만 이 또한 실제로 구현할 수 없었던 미흡한 점이 존재했다. 이론적으로는 폐기물의 균일 투입으로 화석연료를 100% 대체할 수 있었지만 재활용을 할 수 없는 소각 폐기물, 특히 폐합성수지를 확보하기 위한 소각업체와의 분쟁이나 폐기물 업체에서 폐기물 연료를 공급하는 양 또한 무한하지 않다는 점이 고려사항이다. 이러한 부분들에 대한 실제적인 평가나 실험 및 구현이 진행된다면 순환자원 연료 사용량 증가 및 온실가스 배출 저감을 현실적으로 기대할 수 있을 것이다.

부록

참고문헌 및 참고사이트

1) 2021년 배출권시장 운영리포트, 파생상품시장본부 일반상품시장부, 2022.4.
2) 2021년 한국의 시멘트산업 통계, 한국 시멘트협회, 2022.
3) EG-TIPS 에너지온실가스 종합정보 플랫폼 https://tips.energy.or.kr/popup/toe.do#
4) ETRS 배출권등록부시스템, https://etrs.gir.go.kr/etrs/
5) Henan Hengyuan Crane Machinery Group Co., Ltd., https://korean.overheadcranemachine.com/
6)http://www.cement.or.kr/mater_down/2021%20%ED%95%9C%EA%B5%AD%EC%9D%98%20%EC%8B%9C%EB%A9%98%ED%8A%B8%EC%82%B0%EC%97%85%20%ED%86%B5%EA%B3%84.pdf
7) https://www.ssangyongcne.co.kr/business/environment/disclosure.do
8) KOMIS 한국자원정보서비스, https://www.komis.or.kr/komis/main/userMain/main.do
9) 건설공사의 용도별, 구조별 표준 단가
10) 고용노동부국가법령정보센터
11) 권우택, 김영희, 김수룡. "시멘트산업에서의 녹색기술." 세라미스트 14.2 (2011): 41-57. Web.
12) 김낙현, 시멘트 산업의 이산화탄소 배출현황 및 환경부하 저감형 재생시멘트 제안, Current State of Carbon Dioxide Emission in Cement Industry and Proposal for the Environment Load Reducing Cement used Inorganic Construction Wastes, 한양대학교 친환경건축기술연구소, 2019.03.30.
13) 김형석, 전호석. “몰리브덴 선광광미를 이용한 포틀랜드 시멘트 제조방법 및 이를 통해 제조된 포틀랜드 시멘트”. 10-2009-0109997. 한국지질자원연구원. 2009년 11월 13일.
14) 방치폐기물 처리이행보증 업무처리지침 별표1 폐기물 종류별 비중 예시
15) 시멘트 제조공정, 성신양회 홈페이지 http://www.sungshincement.co.kr/popup/cement03.asp
16) 쌍용C&E 2021 지속가능경영보고서
17) 쌍용C&E 동해공장 순환자원 정보 공개 자료(2022년 상반기)
18) 쌍용C&E 동해공장 순환자원 정보 제공 자료(2018년~2021년)
19) 쌍용씨앤이 주식회사, 가연성 고상 폐기물의 처리방법. 10-2000-0000140, 2000.01.04., 2002.06.21. 온실가스 배출권 할당량 2015~2020, 환경부
20) 이고은, 2022. 국내 시멘트산업의 탄소중립 추진 전략과 정책과제. 세종특별자치시:산업연구원
21) 이승헌. "시멘트 플랜트(Plant)에 의한 폐기물 처리 - 염소 바이패스 설비 -." 시멘트 155.- (2001): 37-43.
22) 주식회사 포스코아이씨티, “연속공정용 대용량 데이터를 실시간으로 처리하기 위한 스마트팩토리 플랫폼”. 10-2016-0112865, 2016.09.01., 2018.08.21.
23) 최재원, 구경모, 유병노, 차완호, 강봉희. "시멘트 클링커 소성공정 대체연료 사용량과 시멘트 품질간 상관관계 연구." Journal of the Korean Recycled Construction Resources Institute 9.1 (2021): 75-84. Web.

프로그램 코드

from google.colab import drive drive.mount('/content/drive')

import os os.chdir(r"/content/drive/MyDrive/Colab Notebooks/환경종합설계")

import pandas as pd

df1 = pd.read_excel("동해공장 저장소 A1.xlsx") df2 = pd.read_excel("동해공장 저장소 A2.xlsx") df3 = pd.read_excel("동해공장 저장소 A3.xlsx") df4 = pd.read_excel("동해공장 저장소 B1.xlsx") df5 = pd.read_excel("동해공장 저장소 B2.xlsx") df6 = pd.read_excel("동해공장 저장소 B3.xlsx") df7 = pd.read_excel("동해공장 저장소 C1.xlsx") df8 = pd.read_excel("동해공장 저장소 C2.xlsx") df9 = pd.read_excel("동해공장 저장소 C3.xlsx")

n=1  for n in range(24):         

    if (n<25):          n+=1         import os          os.chdir(r"/content/drive/MyDrive/Colab Notebooks/환경종합설계/시연(24개)")         import numpy as np         new = pd.read_excel("업체{}.xlsx".format(n)) 

        if 6000<=new.loc[0,'발열량'] and 1<=new.loc[0,'염소함량']:             A = df1.append(new)             A.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df11.xlsx")             df2.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df22.xlsx")             df3.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df33.xlsx")             df4.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df44.xlsx")             df5.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df55.xlsx")             df6.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df66.xlsx")             df7.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df77.xlsx")             df8.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df88.xlsx")             df9.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df99.xlsx")         elif 6000<=new.loc[0,'발열량'] and 0.5<=new.loc[0,'염소함량']<1:               AA = df2.append(new)               AA.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df22.xlsx")               df1.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df11.xlsx")               df3.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df33.xlsx")               df4.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df44.xlsx")               df5.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df55.xlsx")               df6.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df66.xlsx")               df7.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df77.xlsx")               df8.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df88.xlsx")               df9.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df99.xlsx")         elif 6000<=new.loc[0,'발열량'] and 0.1<=new.loc[0,'염소함량']<0.5:               AAA = df3.append(new)               AAA.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df33.xlsx")               df1.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df11.xlsx")               df2.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df22.xlsx")               df4.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df44.xlsx")               df5.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df55.xlsx")               df6.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df66.xlsx")               df7.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df77.xlsx")               df8.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df88.xlsx")               df9.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df99.xlsx")         elif 5000<=new.loc[0,'발열량']<6000 and 1<=new.loc[0,'염소함량']:               B = df4.append(new)               B.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df44.xlsx")               df1.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df11.xlsx")               df3.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df33.xlsx")               df2.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df22.xlsx")               df5.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df55.xlsx")               df6.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df66.xlsx")               df7.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df77.xlsx")               df8.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df88.xlsx")               df9.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df99.xlsx")         elif 5000<=new.loc[0,'발열량']<6000 and 0.5<=new.loc[0,'염소함량']<1:               BB = df5.append(new)               BB.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df55.xlsx")               df1.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df11.xlsx")               df3.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df33.xlsx")               df4.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df44.xlsx")               df2.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df22.xlsx")               df6.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df66.xlsx")               df7.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df77.xlsx")               df8.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df88.xlsx")               df9.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df99.xlsx")         elif 5000<=new.loc[0,'발열량']<6000 and 0.1<=new.loc[0,'염소함량']<0.5:               BBB = df6.append(new)               BBB.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df66.xlsx")               df1.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df11.xlsx")               df3.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df33.xlsx")               df4.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df44.xlsx")               df5.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df55.xlsx")               df2.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df22.xlsx")               df7.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df77.xlsx")               df8.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df88.xlsx")               df9.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df99.xlsx")         elif 4500<=new.loc[0,'발열량']<5000 and 1<=new.loc[0,'염소함량'] :               C = df7.append(new)               C.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df77.xlsx")               df1.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df11.xlsx")               df3.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df33.xlsx")               df4.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df44.xlsx")               df5.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df55.xlsx")               df6.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df66.xlsx")               df2.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df22.xlsx")               df8.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df88.xlsx")               df9.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df99.xlsx")         elif 4500<=new.loc[0,'발열량']<5000 and 0.5<=new.loc[0,'염소함량']<1:               CC = df8.append(new)               CC.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df88.xlsx")               df1.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df11.xlsx")               df3.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df33.xlsx")               df4.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df44.xlsx")               df5.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df55.xlsx")               df6.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df66.xlsx")               df7.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df77.xlsx")               df2.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df22.xlsx")               df9.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df99.xlsx")         else:               CCC = df9.append(new)               CCC.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df99.xlsx")               df1.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df11.xlsx")               df3.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df33.xlsx")               df4.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df44.xlsx")               df5.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df55.xlsx")               df6.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df66.xlsx")               df7.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df77.xlsx")               df8.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df88.xlsx")               df2.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df22.xlsx")         from google.colab import drive     drive.mount('/content/drive')

    import os     os.chdir(r"/content/drive/MyDrive/Colab Notebooks/환경종합설계")

    import pandas as pd     df11 = pd.read_excel("df11.xlsx")     df22 = pd.read_excel("df22.xlsx")     df33 = pd.read_excel("df33.xlsx")     df44 = pd.read_excel("df44.xlsx")     df55 = pd.read_excel("df55.xlsx")     df66 = pd.read_excel("df66.xlsx")     df77 = pd.read_excel("df77.xlsx")     df88 = pd.read_excel("df88.xlsx")     df99 = pd.read_excel("df99.xlsx")

    df11_ton=df11'반입량'     df11_ton.columns=['1']     df11_ton.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df11_ton.xlsx")     df11_cal=df11'발열량'     df11_cal.columns=['1']     df11_cal.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df11_cal.xlsx")     df11_cl=df11'염소함량'     df11_cl.columns=['1']     df11_cl.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df11_cl.xlsx")     df22_ton=df22'반입량'     df22_ton.columns=['1']     df22_ton.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df22_ton.xlsx")     df22_cal=df22'발열량'     df22_cal.columns=['1']     df22_cal.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df22_cal.xlsx")     df22_cl=df22'염소함량'     df22_cl.columns=['1']     df22_cl.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df22_cl.xlsx")     df33_ton=df33'반입량'     df33_ton.columns=['1']     df33_ton.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df33_ton.xlsx")     df33_cal=df33'발열량'     df33_cal.columns=['1']     df33_cal.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df33_cal.xlsx")     df33_cl=df33'염소함량'     df33_cl.columns=['1']     df33_cl.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df33_cl.xlsx")     df44_ton=df44'반입량'     df44_ton.columns=['1']     df44_ton.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df44_ton.xlsx")     df44_cal=df44'발열량'     df44_cal.columns=['1']     df44_cal.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df44_cal.xlsx")     df44_cl=df44'염소함량'     df44_cl.columns=['1']     df44_cl.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df44_cl.xlsx")     df55_ton=df55'반입량'     df55_ton.columns=['1']     df55_ton.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df55_ton.xlsx")     df55_cal=df55'발열량'     df55_cal.columns=['1']     df55_cal.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df55_cal.xlsx")     df55_cl=df55'염소함량'     df55_cl.columns=['1']     df55_cl.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df55_cl.xlsx")     df66_ton=df66'반입량'     df66_ton.columns=['1']     df66_ton.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df66_ton.xlsx")     df66_cal=df66'발열량'     df66_cal.columns=['1']     df66_cal.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df66_cal.xlsx")     df66_cl=df66'염소함량'     df66_cl.columns=['1']     df66_cl.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df66_cl.xlsx")     df77_ton=df77'반입량'     df77_ton.columns=['1']     df77_ton.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df77_ton.xlsx")     df77_cal=df77'발열량'     df77_cal.columns=['1']     df77_cal.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df77_cal.xlsx")     df77_cl=df77'염소함량'     df77_cl.columns=['1']     df77_cl.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df77_cl.xlsx")     df88_ton=df88'반입량'     df88_ton.columns=['1']     df88_ton.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df88_ton.xlsx")     df88_cal=df88'발열량'     df88_cal.columns=['1']     df88_cal.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df88_cal.xlsx")     df88_cl=df88'염소함량'     df88_cl.columns=['1']     df88_cl.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df88_cl.xlsx")     df99_ton=df99'반입량'     df99_ton.columns=['1']     df99_ton.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df99_ton.xlsx")     df99_cal=df99'발열량'     df99_cal.columns=['1']     df99_cal.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df99_cal.xlsx")     df99_cl=df99'염소함량'     df99_cl.columns=['1']     df99_cl.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df99_cl.xlsx")

    df11_ton['1'].sum()     df11_ton_sum = df11_ton['1'].sum()  

    df11_toncal=df11_ton.mul(df11_cal)     df11_toncal['1'].sum()     df11_cal_avg=(df11_toncal['1'].sum()/df11_ton['1'].sum())     df11_toncl=df11_ton.mul(df11_cl)

    df11_cl['1'].sum()     df11_toncl['1'].sum()     df11_cl_avg=(df11_toncl['1'].sum()/df11_ton['1'].sum())   

    df22_toncal = df22_ton.mul(df22_cal)     df22_ton['1'].sum()     df22_ton_sum = df22_ton['1'].sum()

    df22_toncal['1'].sum()     df22_cal_avg=(df22_toncal['1'].sum()/df22_ton['1'].sum())     df22_toncl=df22_ton.mul(df22_cl)     df22_cl['1'].sum()     df22_toncl['1'].sum()     df22_cl_avg=(df22_toncl['1'].sum()/df22_ton['1'].sum())

    df33_toncal=df33_ton.mul(df33_cal)     df33_ton['1'].sum()     df33_ton_sum = df33_ton['1'].sum()

    df33_toncal['1'].sum()     df33_cal_avg=(df33_toncal['1'].sum()/df33_ton['1'].sum())     df33_toncl=df33_ton.mul(df33_cl)     df33_cl['1'].sum()     df33_toncl['1'].sum()     df33_cl_avg=(df33_toncl['1'].sum()/df33_ton['1'].sum())

    df44_toncal=df44_ton.mul(df44_cal)     df44_ton['1'].sum()     df44_ton_sum = df44_ton['1'].sum()  

    df44_toncal['1'].sum()     df44_cal_avg=(df44_toncal['1'].sum()/df44_ton['1'].sum())     df44_toncl=df44_ton.mul(df44_cl)     df44_cl['1'].sum()     df44_toncl['1'].sum()     df44_cl_avg=(df44_toncl['1'].sum()/df44_ton['1'].sum())

    df55_toncal=df55_ton.mul(df55_cal)     df55_ton['1'].sum()     df55_ton_sum = df55_ton['1'].sum()  

    df55_toncal['1'].sum()     df55_cal_avg=(df55_toncal['1'].sum()/df55_ton['1'].sum())     df55_toncl=df55_ton.mul(df55_cl)     df55_cl['1'].sum()     df55_toncl['1'].sum()     df55_cl_avg=(df55_toncl['1'].sum()/df55_ton['1'].sum())

    df66_toncal=df66_ton.mul(df66_cal)     df66_ton['1'].sum()     df66_ton_sum = df66_ton['1'].sum()  

    df66_toncal['1'].sum()     df66_cal_avg=(df66_toncal['1'].sum()/df66_ton['1'].sum())     df66_toncl=df66_ton.mul(df66_cl)     df66_cl['1'].sum()     df66_toncl['1'].sum()     df66_cl_avg=(df66_toncl['1'].sum()/df66_ton['1'].sum())

    df77_toncal=df77_ton.mul(df77_cal)     df77_ton['1'].sum()     df77_ton_sum = df77_ton['1'].sum()

                                   df77_toncal['1'].sum()     df77_cal_avg=(df77_toncal['1'].sum()/df77_ton['1'].sum())     df77_toncl=df77_ton.mul(df77_cl)     df77_cl['1'].sum()     df77_toncl['1'].sum()     df77_cl_avg=(df77_toncl['1'].sum()/df77_ton['1'].sum())

    df88_toncal=df88_ton.mul(df88_cal)     df88_ton['1'].sum()     df88_ton_sum = df88_ton['1'].sum()

    df88_toncal['1'].sum()     df88_cal_avg=(df88_toncal['1'].sum()/df88_ton['1'].sum())     df88_toncl=df88_ton.mul(df88_cl)     df88_cl['1'].sum()     df88_toncl['1'].sum()     df88_cl_avg=(df88_toncl['1'].sum()/df88_ton['1'].sum())

    df99_toncal=df99_ton.mul(df99_cal)     df99_ton['1'].sum()     df99_ton_sum = df99_ton['1'].sum()

    df99_toncal['1'].sum()     df99_cal_avg=(df99_toncal['1'].sum()/df99_ton['1'].sum())     df99_toncl=df99_ton.mul(df99_cl)     df99_cl['1'].sum()     df99_toncl['1'].sum()     df99_cl_avg=(df99_toncl['1'].sum()/df99_ton['1'].sum())

    cal_cl_avg_data=[[df11_cal_avg, df22_cal_avg, df33_cal_avg, df44_cal_avg, df55_cal_avg, df66_cal_avg, df77_cal_avg, df88_cal_avg, df99_cal_avg],                     [df11_cl_avg, df22_cl_avg, df33_cl_avg, df44_cl_avg, df55_cl_avg, df66_cl_avg, df77_cl_avg, df88_cl_avg, df99_cl_avg],                     [df11_ton['1'].sum(), df22_ton['1'].sum(), df33_ton['1'].sum(), df44_ton['1'].sum(), df55_ton['1'].sum(), df66_ton['1'].sum(), df77_ton['1'].sum(), df88_ton['1'].sum(), df99_ton['1'].sum()]]     df_cal_cl_avg_data=pd.DataFrame(cal_cl_avg_data,index=['발열량평균','염소함량평균','반입량총합'],columns=['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3'])     print(df_cal_cl_avg_data)     df_cal_cl_avg_data.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/df_cal_cl_avg_data.xlsx")

    ######print(df1_ton['1'].sum(),df2_ton['1'].sum(),df3_ton['1'].sum(),df4_ton['1'].sum(),df5_ton['1'].sum(),df6_ton['1'].sum(),df7_ton['1'].sum(),df8_ton['1'].sum(),df9_ton['1'].sum())

    i = 0     while i <7:       i+=1       from numpy.core.shape_base import atleast_1d       import random       keep_heat = ['A1','A2','A3','B1','B2','B3','C1','C2','C3']       keep_cl = ['A1','B1','C1','A2','B2','C2','A3','B3','C3']       number1 = [0,1,2]       number2 = [3,4,5]       number3 = [6,7,8]       kiln_1=[random.choice(number1) for i in range(2)]       kiln_2=[random.choice(number2) for i in range(2)]       kiln_3=[random.choice(number3) for i in range(2)]

      cl=[keep_cl[kiln_1[1]], keep_cl[kiln_2[1]],keep_cl[kiln_3[1]]]

    

      heat1= keep_heat[kiln_1[0]]       cl1= random.choice(cl)       cl.remove(cl1)

      heat2= keep_heat[kiln_2[0]]       cl2 = random.choice(cl)       cl.remove(cl2)

      heat3 = keep_heat[kiln_3[0]]       cl3 = random.choice(cl)                                if (heat1 == 'A1' or heat1 == 'A2' or heat1 == 'A3') and (cl1 == 'A1' or cl1 == 'B1' or cl1 == 'C1'):         choice1 = 'A1'       elif (heat1 == 'A1' or heat1 == 'A2' or heat1 == 'A3') and (cl1 == 'A2' or cl1 == 'B2' or cl1 == 'C2'):         choice1 = 'A2'       elif (heat1 == 'A1' or heat1 == 'A2' or heat1 == 'A3') and (cl1 == 'A3' or cl1 == 'B3' or cl1 == 'C3'):         choice1 = 'A3'              if (heat2 == 'B1' or heat2 == 'B2' or heat2 == 'B3') and (cl2 == 'A1' or cl2 == 'B1' or cl2 == 'C1'):         choice2 = 'B1'       elif (heat2 == 'B1' or heat2 == 'B2' or heat2 == 'B3') and (cl2 == 'A2' or cl2 == 'B2' or cl2 == 'C2'):         choice2 = 'B2'       elif (heat2 == 'B1' or heat2 == 'B2' or heat2 == 'B3') and (cl2 == 'A3' or cl2 == 'B3' or cl2 == 'C3'):         choice2 = 'B3'              if (heat3 == 'C1' or heat3 == 'C2' or heat3 == 'C3') and (cl3 == 'A1' or cl3 == 'B1' or cl3 == 'C1'):         choice3 = 'C1'       elif (heat3 == 'C1' or heat3 == 'C2' or heat3 == 'C3') and (cl3 == 'A2' or cl3 == 'B2' or cl3 == 'C2'):         choice3 = 'C2'       elif (heat3 == 'C1' or heat3 == 'C2' or heat3 == 'C3') and (cl3 == 'A3' or cl3 == 'B3' or cl3 == 'C3'):         choice3 = 'C3'                    

      if choice1 == 'A1' and choice2 == 'B2' and choice3 == 'C3':         cal1 = df11_cal_avg         cl1 = df11_cl_avg         cal2 = df55_cal_avg         cl2 = df55_cal_avg         cal3 = df99_cal_avg         cl3 = df99_cl_avg       elif choice1 == 'A1' and choice2 == 'B3' and choice3 == 'C2':         cal1 = df11_cal_avg         cl1 = df11_cl_avg         cal2 = df66_cal_avg         cl2 = df66_cal_avg         cal3 = df88_cal_avg         cl3 = df88_cl_avg       elif choice1 == 'A2' and choice2 == 'B1' and choice3 == 'C3':         cal1 = df22_cal_avg         cl1 = df22_cl_avg         cal2 = df44_cal_avg         cl2 = df44_cal_avg         cal3 = df99_cal_avg         cl3 = df99_cl_avg       elif choice1 == 'A2' and choice2 == 'B3' and choice3 == 'C1':         cal1 = df22_cal_avg         cl1 = df22_cl_avg         cal2 = df66_cal_avg         cl2 = df66_cal_avg         cal3 = df77_cal_avg         cl3 = df77_cl_avg       elif choice1 == 'A3' and choice2 == 'B1' and choice3 == 'C2':         cal1 = df33_cal_avg         cl1 = df33_cl_avg         cal2 = df44_cal_avg         cl2 = df44_cal_avg         cal3 = df88_cal_avg         cl3 = df88_cl_avg       elif choice1 == 'A3' and choice2 == 'B2' and choice3 == 'C1':         cal1 = df33_cal_avg         cl1 = df33_cl_avg         cal2 = df55_cal_avg         cl2 = df55_cal_avg         cal3 = df77_cal_avg         cl3 = df77_cl_avg

      import numpy as np       c=[[cal1,cal2,cal3],[cl1,cl2,cl3],[1,1,1]]       d=[500000,70,100]       result=np.linalg.solve(c,d)       i += 1       if result[0]>0 and result[1]>0 and result[2]>0:           print('\n저장소1 = ',choice1)           print('저장소2 = ',choice2)           print('저장소3 = ',choice3)           in_result=pd.DataFrame(result, index=[choice1, choice2, choice3], columns=['소성로투입량'])           print(in_result)           in_choice1=in_result.locchoice1           in_choice1.columns=['1']           in_choice1.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/in_choice1.xlsx")           in_choice2=in_result.locchoice2           in_choice2.columns=['1']           in_choice2.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/in_choice2.xlsx")           in_choice3=in_result.locchoice3           in_choice3.columns=['1']           in_choice3.to_excel("/content/drive/MyDrive/Colab Notebooks/환경종합설계/in_choice3.xlsx")

          if choice1 == 'A1' and choice2 == 'B2' and choice3 == 'C3':            df11_ton_after = df11_ton['1'].sum() - in_choice1['1'].sum()            df55_ton_after = df55_ton['1'].sum() - in_choice2['1'].sum()            df99_ton_after = df99_ton['1'].sum() - in_choice3['1'].sum()

           df11_after = pd.DataFrame({'업체':[1, 1, 1], '반입량':[df11_ton_after, 0, 0], '발열량':[df11_cal_avg, 0, 0], '염소함량':[df11_cl_avg, 0, 0]})            df1.update(df11_after, overwrite=True)            df55_after = pd.DataFrame({'업체':[1, 1, 1],'반입량':[df55_ton_after,0, 0], '발열량':[df55_cal_avg,0, 0], '염소함량':[df55_cl_avg,0, 0]})            df5.update(df55_after, overwrite=True)            df99_after = pd.DataFrame({'업체':[1, 1, 1],'반입량':[df99_ton_after,0, 0], '발열량':[df99_cal_avg,0, 0], '염소함량':[df99_cl_avg,0, 0]})            df9.update(df99_after, overwrite=True)            

          elif choice1 == 'A1' and choice2 == 'B3' and choice3 == 'C2':            df11_ton_after = df11_ton['1'].sum() - in_choice1['1'].sum()            df66_ton_after = df66_ton['1'].sum() - in_choice2['1'].sum()            df88_ton_after = df88_ton['1'].sum() - in_choice3['1'].sum()

           df11_after = pd.DataFrame({'업체':[1, 1, 1],'반입량':[df11_ton_after,0, 0], '발열량':[df11_cal_avg,0, 0], '염소함량':[df11_cl_avg,0, 0]})            df1.update(df11_after, overwrite=True)            df66_after = pd.DataFrame({'업체':[1, 1, 1],'반입량':[df66_ton_after,0, 0], '발열량':[df66_cal_avg,0, 0], '염소함량':[df66_cl_avg,0, 0]})            df6.update(df55_after, overwrite=True)            df88_after = pd.DataFrame({'업체':[1, 1, 1],'반입량':[df88_ton_after,0, 0], '발열량':[df88_cal_avg,0, 0], '염소함량':[df88_cl_avg,0, 0]})            df8.update(df88_after, overwrite=True)                       elif choice1 == 'A2' and choice2 == 'B1' and choice3 == 'C3':            df22_ton_after = df22_ton['1'].sum() - in_choice1['1'].sum()            df44_ton_after = df44_ton['1'].sum() - in_choice2['1'].sum()            df99_ton_after = df99_ton['1'].sum() - in_choice3['1'].sum()

           df22_after = pd.DataFrame({'업체':[1, 1, 1],'반입량':[df22_ton_after,0, 0], '발열량':[df22_cal_avg,0, 0], '염소함량':[df22_cl_avg,0, 0]})            df2.update(df22_after, overwrite=True)            df44_after = pd.DataFrame({'업체':[1, 1, 1],'반입량':[df44_ton_after,0, 0], '발열량':[df44_cal_avg,0, 0], '염소함량':[df44_cl_avg,0, 0]})            df4.update(df44_after, overwrite=True)            df99_after = pd.DataFrame({'업체':[1, 1, 1],'반입량':[df99_ton_after,0, 0], '발열량':[df99_cal_avg,0, 0], '염소함량':[df99_cl_avg,0, 0]})            df9.update(df99_after, overwrite=True)                      elif choice1 == 'A2' and choice2 == 'B3' and choice3 == 'C1':            df22_ton_after = df22_ton['1'].sum() - in_choice1['1'].sum()            df66_ton_after = df66_ton['1'].sum() - in_choice2['1'].sum()            df77_ton_after = df77_ton['1'].sum() - in_choice3['1'].sum()

           df22_after = pd.DataFrame({'업체':[1, 1, 1],'반입량':[df22_ton_after,0, 0], '발열량':[df22_cal_avg,0, 0], '염소함량':[df22_cl_avg,0, 0]})            df2.update(df22_after, overwrite=True)            df66_after = pd.DataFrame({'업체':[1, 1, 1],'반입량':[df66_ton_after,0, 0], '발열량':[df66_cal_avg,0, 0], '염소함량':[df66_cl_avg,0, 0]})            df6.update(df66_after, overwrite=True)            df77_after = pd.DataFrame({'업체':[1, 1, 1],'반입량':[df77_ton_after,0, 0], '발열량':[df77_cal_avg,0, 0], '염소함량':[df77_cl_avg,0, 0]})            df7.update(df77_after, overwrite=True)

          elif choice1 == 'A3' and choice2 == 'B1' and choice3 == 'C2':            df33_ton_after = df33_ton['1'].sum() - in_choice1['1'].sum()            df44_ton_after = df44_ton['1'].sum() - in_choice2['1'].sum()            df88_ton_after = df88_ton['1'].sum() - in_choice3['1'].sum()

           df33_after = pd.DataFrame({'업체':[1, 1, 1],'반입량':[df33_ton_after,0, 0], '발열량':[df33_cal_avg,0, 0], '염소함량':[df33_cl_avg,0, 0]})            df3.update(df33_after, overwrite=True)            df44_after = pd.DataFrame({'업체':[1, 1, 1],'반입량':[df44_ton_after,0, 0], '발열량':[df44_cal_avg,0, 0], '염소함량':[df44_cl_avg,0, 0]})            df4.update(df44_after, overwrite=True)            df88_after = pd.DataFrame({'업체':[1, 1, 1],'반입량':[df88_ton_after,0, 0], '발열량':[df88_cal_avg,0, 0], '염소함량':[df88_cl_avg,0, 0]})            df8.update(df88_after, overwrite=True)            

          elif choice1 == 'A3' and choice2 == 'B2' and choice3 == 'C1':            df33_ton_after = df33_ton['1'].sum() - in_choice1['1'].sum()            df55_ton_after = df55_ton['1'].sum() - in_choice2['1'].sum()            df77_ton_after = df77_ton['1'].sum() - in_choice3['1'].sum()

           df33_after = pd.DataFrame({'업체':[1, 1, 1],'반입량':[df33_ton_after,0, 0], '발열량':[df33_cal_avg,0, 0], '염소함량':[df33_cl_avg,0, 0]})            df3.update(df33_after, overwrite=True)            df55_after = pd.DataFrame({'업체':[1, 1, 1],'반입량':[df55_ton_after,0, 0], '발열량':[df55_cal_avg,0, 0], '염소함량':[df55_cl_avg,0, 0]})            df5.update(df55_after, overwrite=True)            df77_after = pd.DataFrame({'업체':[1, 1, 1],'반입량':[df77_ton_after,0, 0], '발열량':[df77_cal_avg,0, 0], '염소함량':[df77_cl_avg,0, 0]})            df7.update(df77_after, overwrite=True)             break